Merge "Fix padding between battery and system icons" into lmp-mr1-dev
diff --git a/Android.mk b/Android.mk
index 22cc27b..b77c2ed 100644
--- a/Android.mk
+++ b/Android.mk
@@ -737,7 +737,8 @@
-samplegroup Sensors \
-samplegroup Testing \
-samplegroup UI \
- -samplegroup Views
+ -samplegroup Views \
+ -samplegroup Wearable
## SDK version identifiers used in the published docs
# major[.minor] version for current SDK. (full releases only)
diff --git a/api/current.txt b/api/current.txt
index caf28cb..4b8d615 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -1002,6 +1002,7 @@
field public static final int requiredForAllUsers = 16843728; // 0x10103d0
field public static final int requiresFadingEdge = 16843685; // 0x10103a5
field public static final int requiresSmallestWidthDp = 16843620; // 0x1010364
+ field public static final int resizeClip = 16844033; // 0x1010501
field public static final int resizeMode = 16843619; // 0x1010363
field public static final int resizeable = 16843405; // 0x101028d
field public static final int resource = 16842789; // 0x1010025
@@ -3052,9 +3053,10 @@
method public android.graphics.Rect evaluate(float, android.graphics.Rect, android.graphics.Rect);
}
- public class StateListAnimator {
+ public class StateListAnimator implements java.lang.Cloneable {
ctor public StateListAnimator();
method public void addState(int[], android.animation.Animator);
+ method public android.animation.StateListAnimator clone();
method public void jumpToCurrentState();
}
@@ -4404,6 +4406,7 @@
method public boolean inKeyguardRestrictedInputMode();
method public boolean isKeyguardLocked();
method public boolean isKeyguardSecure();
+ method public boolean isKeyguardInTrustedState();
method public deprecated android.app.KeyguardManager.KeyguardLock newKeyguardLock(java.lang.String);
}
@@ -7432,6 +7435,7 @@
method public java.lang.Object clone();
method public android.content.Intent cloneFilter();
method public static android.content.Intent createChooser(android.content.Intent, java.lang.CharSequence);
+ method public static android.content.Intent createChooser(android.content.Intent, java.lang.CharSequence, android.content.IntentSender);
method public int describeContents();
method public int fillIn(android.content.Intent, int);
method public boolean filterEquals(android.content.Intent);
@@ -7707,6 +7711,8 @@
field public static final java.lang.String EXTRA_CHANGED_COMPONENT_NAME_LIST = "android.intent.extra.changed_component_name_list";
field public static final java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
field public static final java.lang.String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list";
+ field public static final java.lang.String EXTRA_CHOSEN_COMPONENT = "android.intent.extra.CHOSEN_COMPONENT";
+ field public static final java.lang.String EXTRA_CHOSEN_COMPONENT_INTENT_SENDER = "android.intent.extra.CHOSEN_COMPONENT_INTENT_SENDER";
field public static final java.lang.String EXTRA_DATA_REMOVED = "android.intent.extra.DATA_REMOVED";
field public static final java.lang.String EXTRA_DOCK_STATE = "android.intent.extra.DOCK_STATE";
field public static final int EXTRA_DOCK_STATE_CAR = 2; // 0x2
@@ -16543,15 +16549,21 @@
method public static java.lang.String[] decode(java.lang.String);
method public static java.lang.String encode(java.lang.String...);
field public static final java.lang.String ANIMAL_WILDLIFE = "ANIMAL_WILDLIFE";
+ field public static final java.lang.String ARTS = "ARTS";
field public static final java.lang.String COMEDY = "COMEDY";
field public static final java.lang.String DRAMA = "DRAMA";
field public static final java.lang.String EDUCATION = "EDUCATION";
+ field public static final java.lang.String ENTERTAINMENT = "ENTERTAINMENT";
field public static final java.lang.String FAMILY_KIDS = "FAMILY_KIDS";
field public static final java.lang.String GAMING = "GAMING";
+ field public static final java.lang.String LIFE_STYLE = "LIFE_STYLE";
field public static final java.lang.String MOVIES = "MOVIES";
+ field public static final java.lang.String MUSIC = "MUSIC";
field public static final java.lang.String NEWS = "NEWS";
+ field public static final java.lang.String PREMIER = "PREMIER";
field public static final java.lang.String SHOPPING = "SHOPPING";
field public static final java.lang.String SPORTS = "SPORTS";
+ field public static final java.lang.String TECH_SCIENCE = "TECH_SCIENCE";
field public static final java.lang.String TRAVEL = "TRAVEL";
}
@@ -17031,6 +17043,7 @@
}
public class Network implements android.os.Parcelable {
+ method public void bindSocket(java.net.DatagramSocket) throws java.io.IOException;
method public void bindSocket(java.net.Socket) throws java.io.IOException;
method public int describeContents();
method public java.net.InetAddress[] getAllByName(java.lang.String) throws java.net.UnknownHostException;
@@ -17150,7 +17163,7 @@
field public static final java.lang.String PROXY_CHANGE_ACTION = "android.intent.action.PROXY_CHANGE";
}
- public class ProxyInfo implements android.os.Parcelable {
+ public deprecated class ProxyInfo implements android.os.Parcelable {
method public static android.net.ProxyInfo buildDirectProxy(java.lang.String, int);
method public static android.net.ProxyInfo buildDirectProxy(java.lang.String, int, java.util.List<java.lang.String>);
method public static android.net.ProxyInfo buildPacProxy(android.net.Uri);
@@ -17197,7 +17210,7 @@
method public static javax.net.SocketFactory getDefault(int);
method public static javax.net.ssl.SSLSocketFactory getDefault(int, android.net.SSLSessionCache);
method public java.lang.String[] getDefaultCipherSuites();
- method public static org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache);
+ method public static deprecated org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache);
method public static javax.net.ssl.SSLSocketFactory getInsecure(int, android.net.SSLSessionCache);
method public byte[] getNpnSelectedProtocol(java.net.Socket);
method public java.lang.String[] getSupportedCipherSuites();
@@ -17415,7 +17428,7 @@
package android.net.http {
- public final class AndroidHttpClient implements org.apache.http.client.HttpClient {
+ public final deprecated class AndroidHttpClient implements org.apache.http.client.HttpClient {
method public void close();
method public void disableCurlLogging();
method public void enableCurlLogging(java.lang.String, int);
@@ -17433,8 +17446,8 @@
method public org.apache.http.params.HttpParams getParams();
method public static java.io.InputStream getUngzippedContent(org.apache.http.HttpEntity) throws java.io.IOException;
method public static void modifyRequestToAcceptGzipResponse(org.apache.http.HttpRequest);
- method public static android.net.http.AndroidHttpClient newInstance(java.lang.String, android.content.Context);
- method public static android.net.http.AndroidHttpClient newInstance(java.lang.String);
+ method public static deprecated android.net.http.AndroidHttpClient newInstance(java.lang.String, android.content.Context);
+ method public static deprecated android.net.http.AndroidHttpClient newInstance(java.lang.String);
method public static long parseDate(java.lang.String);
field public static long DEFAULT_SYNC_MIN_GZIP_BYTES;
}
@@ -21399,8 +21412,8 @@
field public static final int JELLY_BEAN_MR2 = 18; // 0x12
field public static final int KITKAT = 19; // 0x13
field public static final int KITKAT_WATCH = 20; // 0x14
- field public static final int L = 21; // 0x15
field public static final int LOLLIPOP = 21; // 0x15
+ field public static final int LOLLIPOP_MR1 = 22; // 0x16
}
public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable {
@@ -28114,6 +28127,7 @@
method public void onAbort();
method public void onAnswer();
method public void onAudioStateChanged(android.telecom.AudioState);
+ method public void onConferenceChanged();
method public void onDisconnect();
method public void onHold();
method public void onPlayDtmfTone(char);
@@ -28215,6 +28229,7 @@
method public android.telecom.PhoneAccountHandle getAccountHandle();
method public android.net.Uri getAddress();
method public int getCapabilities();
+ method public int getColor();
method public android.graphics.drawable.Drawable getIcon(android.content.Context);
method public int getIconResId();
method public java.lang.CharSequence getLabel();
@@ -28228,6 +28243,7 @@
field public static final int CAPABILITY_PLACE_EMERGENCY_CALLS = 16; // 0x10
field public static final int CAPABILITY_SIM_SUBSCRIPTION = 4; // 0x4
field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final int NO_COLOR = -1; // 0xffffffff
field public static final java.lang.String SCHEME_SIP = "sip";
field public static final java.lang.String SCHEME_TEL = "tel";
field public static final java.lang.String SCHEME_VOICEMAIL = "voicemail";
@@ -28239,6 +28255,7 @@
method public android.telecom.PhoneAccount build();
method public android.telecom.PhoneAccount.Builder setAddress(android.net.Uri);
method public android.telecom.PhoneAccount.Builder setCapabilities(int);
+ method public android.telecom.PhoneAccount.Builder setColor(int);
method public android.telecom.PhoneAccount.Builder setIconResId(int);
method public android.telecom.PhoneAccount.Builder setShortDescription(java.lang.CharSequence);
method public android.telecom.PhoneAccount.Builder setSubscriptionAddress(android.net.Uri);
@@ -28707,6 +28724,7 @@
method public void updateMmsSendStatus(android.content.Context, int, byte[], int, android.net.Uri);
method public void updateSmsSendStatus(int, boolean);
field public static final java.lang.String EXTRA_MMS_DATA = "android.telephony.extra.MMS_DATA";
+ field public static final java.lang.String EXTRA_MMS_HTTP_STATUS = "android.telephony.extra.MMS_HTTP_STATUS";
field public static final java.lang.String MMS_CONFIG_ALIAS_ENABLED = "aliasEnabled";
field public static final java.lang.String MMS_CONFIG_ALIAS_MAX_CHARS = "aliasMaxChars";
field public static final java.lang.String MMS_CONFIG_ALIAS_MIN_CHARS = "aliasMinChars";
@@ -28816,6 +28834,9 @@
ctor public SubInfoRecord();
ctor public SubInfoRecord(long, java.lang.String, int, java.lang.String, int, int, java.lang.String, int, int, int[], int, int);
method public int describeContents();
+ method public int getColor();
+ method public android.graphics.drawable.BitmapDrawable getIconDrawable();
+ method public java.lang.String getLabel();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
field public int color;
@@ -30326,7 +30347,7 @@
method public static java.lang.String formatShortFileSize(android.content.Context, long);
}
- public class Time {
+ public deprecated class Time {
ctor public Time(java.lang.String);
ctor public Time();
ctor public Time(android.text.format.Time);
@@ -31296,6 +31317,7 @@
ctor public ChangeBounds(android.content.Context, android.util.AttributeSet);
method public void captureEndValues(android.transition.TransitionValues);
method public void captureStartValues(android.transition.TransitionValues);
+ method public boolean getResizeClip();
method public deprecated void setReparent(boolean);
method public void setResizeClip(boolean);
}
@@ -31697,7 +31719,7 @@
field public final int mTag;
}
- public class FloatMath {
+ public deprecated class FloatMath {
method public static float ceil(float);
method public static float cos(float);
method public static float exp(float);
@@ -33369,6 +33391,7 @@
method public int describeContents();
method public boolean isValid();
method public android.graphics.Canvas lockCanvas(android.graphics.Rect) throws java.lang.IllegalArgumentException, android.view.Surface.OutOfResourcesException;
+ method public android.graphics.Canvas lockHardwareCanvas();
method public void readFromParcel(android.os.Parcel);
method public void release();
method public deprecated void unlockCanvas(android.graphics.Canvas);
@@ -34903,6 +34926,7 @@
field public static final int FLAG_HARDWARE_ACCELERATED = 16777216; // 0x1000000
field public static final int FLAG_IGNORE_CHEEK_PRESSES = 32768; // 0x8000
field public static final int FLAG_KEEP_SCREEN_ON = 128; // 0x80
+ field public static final int FLAG_LAYOUT_ATTACHED_IN_DECOR = 1073741824; // 0x40000000
field public static final int FLAG_LAYOUT_INSET_DECOR = 65536; // 0x10000
field public static final int FLAG_LAYOUT_IN_OVERSCAN = 33554432; // 0x2000000
field public static final int FLAG_LAYOUT_IN_SCREEN = 256; // 0x100
@@ -34952,6 +34976,7 @@
field public static final int SOFT_INPUT_STATE_UNSPECIFIED = 0; // 0x0
field public static final int SOFT_INPUT_STATE_VISIBLE = 4; // 0x4
field public static final int TITLE_CHANGED = 64; // 0x40
+ field public static final int TYPE_ACCESSIBILITY_OVERLAY = 2032; // 0x7f0
field public static final int TYPE_APPLICATION = 2; // 0x2
field public static final int TYPE_APPLICATION_ATTACHED_DIALOG = 1003; // 0x3eb
field public static final int TYPE_APPLICATION_MEDIA = 1001; // 0x3e9
@@ -35371,6 +35396,7 @@
method public void recycle();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
field public static final int TYPE_APPLICATION = 1; // 0x1
field public static final int TYPE_INPUT_METHOD = 2; // 0x2
field public static final int TYPE_SYSTEM = 3; // 0x3
@@ -35417,13 +35443,13 @@
package android.view.animation {
- public class AccelerateDecelerateInterpolator implements android.view.animation.Interpolator {
+ public class AccelerateDecelerateInterpolator extends android.view.animation.BaseInterpolator {
ctor public AccelerateDecelerateInterpolator();
ctor public AccelerateDecelerateInterpolator(android.content.Context, android.util.AttributeSet);
method public float getInterpolation(float);
}
- public class AccelerateInterpolator implements android.view.animation.Interpolator {
+ public class AccelerateInterpolator extends android.view.animation.BaseInterpolator {
ctor public AccelerateInterpolator();
ctor public AccelerateInterpolator(float);
ctor public AccelerateInterpolator(android.content.Context, android.util.AttributeSet);
@@ -35525,14 +35551,14 @@
method public static android.view.animation.Animation makeOutAnimation(android.content.Context, boolean);
}
- public class AnticipateInterpolator implements android.view.animation.Interpolator {
+ public class AnticipateInterpolator extends android.view.animation.BaseInterpolator {
ctor public AnticipateInterpolator();
ctor public AnticipateInterpolator(float);
ctor public AnticipateInterpolator(android.content.Context, android.util.AttributeSet);
method public float getInterpolation(float);
}
- public class AnticipateOvershootInterpolator implements android.view.animation.Interpolator {
+ public class AnticipateOvershootInterpolator extends android.view.animation.BaseInterpolator {
ctor public AnticipateOvershootInterpolator();
ctor public AnticipateOvershootInterpolator(float);
ctor public AnticipateOvershootInterpolator(float, float);
@@ -35540,19 +35566,23 @@
method public float getInterpolation(float);
}
- public class BounceInterpolator implements android.view.animation.Interpolator {
+ public abstract class BaseInterpolator implements android.view.animation.Interpolator {
+ ctor public BaseInterpolator();
+ }
+
+ public class BounceInterpolator extends android.view.animation.BaseInterpolator {
ctor public BounceInterpolator();
ctor public BounceInterpolator(android.content.Context, android.util.AttributeSet);
method public float getInterpolation(float);
}
- public class CycleInterpolator implements android.view.animation.Interpolator {
+ public class CycleInterpolator extends android.view.animation.BaseInterpolator {
ctor public CycleInterpolator(float);
ctor public CycleInterpolator(android.content.Context, android.util.AttributeSet);
method public float getInterpolation(float);
}
- public class DecelerateInterpolator implements android.view.animation.Interpolator {
+ public class DecelerateInterpolator extends android.view.animation.BaseInterpolator {
ctor public DecelerateInterpolator();
ctor public DecelerateInterpolator(float);
ctor public DecelerateInterpolator(android.content.Context, android.util.AttributeSet);
@@ -35627,20 +35657,20 @@
field public int index;
}
- public class LinearInterpolator implements android.view.animation.Interpolator {
+ public class LinearInterpolator extends android.view.animation.BaseInterpolator {
ctor public LinearInterpolator();
ctor public LinearInterpolator(android.content.Context, android.util.AttributeSet);
method public float getInterpolation(float);
}
- public class OvershootInterpolator implements android.view.animation.Interpolator {
+ public class OvershootInterpolator extends android.view.animation.BaseInterpolator {
ctor public OvershootInterpolator();
ctor public OvershootInterpolator(float);
ctor public OvershootInterpolator(android.content.Context, android.util.AttributeSet);
method public float getInterpolation(float);
}
- public class PathInterpolator implements android.view.animation.Interpolator {
+ public class PathInterpolator extends android.view.animation.BaseInterpolator {
ctor public PathInterpolator(android.graphics.Path);
ctor public PathInterpolator(float, float);
ctor public PathInterpolator(float, float, float, float);
@@ -38166,6 +38196,7 @@
method public int getSoftInputMode();
method public int getWidth();
method public boolean isAboveAnchor();
+ method public boolean isAttachedInDecor();
method public boolean isClippingEnabled();
method public boolean isFocusable();
method public boolean isOutsideTouchable();
@@ -38173,6 +38204,7 @@
method public boolean isSplitTouchEnabled();
method public boolean isTouchable();
method public void setAnimationStyle(int);
+ method public void setAttachedInDecor(boolean);
method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
method public void setClippingEnabled(boolean);
method public void setContentView(android.view.View);
@@ -54376,7 +54408,7 @@
package org.apache.commons.logging {
- public abstract interface Log {
+ public abstract deprecated interface Log {
method public abstract void debug(java.lang.Object);
method public abstract void debug(java.lang.Object, java.lang.Throwable);
method public abstract void error(java.lang.Object);
@@ -54401,26 +54433,26 @@
package org.apache.http {
- public class ConnectionClosedException extends java.io.IOException {
+ public deprecated class ConnectionClosedException extends java.io.IOException {
ctor public ConnectionClosedException(java.lang.String);
}
- public abstract interface ConnectionReuseStrategy {
+ public abstract deprecated interface ConnectionReuseStrategy {
method public abstract boolean keepAlive(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
}
- public abstract interface FormattedHeader implements org.apache.http.Header {
+ public abstract deprecated interface FormattedHeader implements org.apache.http.Header {
method public abstract org.apache.http.util.CharArrayBuffer getBuffer();
method public abstract int getValuePos();
}
- public abstract interface Header {
+ public abstract deprecated interface Header {
method public abstract org.apache.http.HeaderElement[] getElements() throws org.apache.http.ParseException;
method public abstract java.lang.String getName();
method public abstract java.lang.String getValue();
}
- public abstract interface HeaderElement {
+ public abstract deprecated interface HeaderElement {
method public abstract java.lang.String getName();
method public abstract org.apache.http.NameValuePair getParameter(int);
method public abstract org.apache.http.NameValuePair getParameterByName(java.lang.String);
@@ -54429,17 +54461,17 @@
method public abstract java.lang.String getValue();
}
- public abstract interface HeaderElementIterator implements java.util.Iterator {
+ public abstract deprecated interface HeaderElementIterator implements java.util.Iterator {
method public abstract boolean hasNext();
method public abstract org.apache.http.HeaderElement nextElement();
}
- public abstract interface HeaderIterator implements java.util.Iterator {
+ public abstract deprecated interface HeaderIterator implements java.util.Iterator {
method public abstract boolean hasNext();
method public abstract org.apache.http.Header nextHeader();
}
- public abstract interface HttpClientConnection implements org.apache.http.HttpConnection {
+ public abstract deprecated interface HttpClientConnection implements org.apache.http.HttpConnection {
method public abstract void flush() throws java.io.IOException;
method public abstract boolean isResponseAvailable(int) throws java.io.IOException;
method public abstract void receiveResponseEntity(org.apache.http.HttpResponse) throws org.apache.http.HttpException, java.io.IOException;
@@ -54448,7 +54480,7 @@
method public abstract void sendRequestHeader(org.apache.http.HttpRequest) throws org.apache.http.HttpException, java.io.IOException;
}
- public abstract interface HttpConnection {
+ public abstract deprecated interface HttpConnection {
method public abstract void close() throws java.io.IOException;
method public abstract org.apache.http.HttpConnectionMetrics getMetrics();
method public abstract int getSocketTimeout();
@@ -54458,7 +54490,7 @@
method public abstract void shutdown() throws java.io.IOException;
}
- public abstract interface HttpConnectionMetrics {
+ public abstract deprecated interface HttpConnectionMetrics {
method public abstract java.lang.Object getMetric(java.lang.String);
method public abstract long getReceivedBytesCount();
method public abstract long getRequestCount();
@@ -54467,7 +54499,7 @@
method public abstract void reset();
}
- public abstract interface HttpEntity {
+ public abstract deprecated interface HttpEntity {
method public abstract void consumeContent() throws java.io.IOException;
method public abstract java.io.InputStream getContent() throws java.io.IOException, java.lang.IllegalStateException;
method public abstract org.apache.http.Header getContentEncoding();
@@ -54479,19 +54511,19 @@
method public abstract void writeTo(java.io.OutputStream) throws java.io.IOException;
}
- public abstract interface HttpEntityEnclosingRequest implements org.apache.http.HttpRequest {
+ public abstract deprecated interface HttpEntityEnclosingRequest implements org.apache.http.HttpRequest {
method public abstract boolean expectContinue();
method public abstract org.apache.http.HttpEntity getEntity();
method public abstract void setEntity(org.apache.http.HttpEntity);
}
- public class HttpException extends java.lang.Exception {
+ public deprecated class HttpException extends java.lang.Exception {
ctor public HttpException();
ctor public HttpException(java.lang.String);
ctor public HttpException(java.lang.String, java.lang.Throwable);
}
- public final class HttpHost implements java.lang.Cloneable {
+ public final deprecated class HttpHost implements java.lang.Cloneable {
ctor public HttpHost(java.lang.String, int, java.lang.String);
ctor public HttpHost(java.lang.String, int);
ctor public HttpHost(java.lang.String);
@@ -54509,14 +54541,14 @@
field protected final java.lang.String schemeName;
}
- public abstract interface HttpInetConnection implements org.apache.http.HttpConnection {
+ public abstract deprecated interface HttpInetConnection implements org.apache.http.HttpConnection {
method public abstract java.net.InetAddress getLocalAddress();
method public abstract int getLocalPort();
method public abstract java.net.InetAddress getRemoteAddress();
method public abstract int getRemotePort();
}
- public abstract interface HttpMessage {
+ public abstract deprecated interface HttpMessage {
method public abstract void addHeader(org.apache.http.Header);
method public abstract void addHeader(java.lang.String, java.lang.String);
method public abstract boolean containsHeader(java.lang.String);
@@ -54536,20 +54568,20 @@
method public abstract void setParams(org.apache.http.params.HttpParams);
}
- public abstract interface HttpRequest implements org.apache.http.HttpMessage {
+ public abstract deprecated interface HttpRequest implements org.apache.http.HttpMessage {
method public abstract org.apache.http.RequestLine getRequestLine();
}
- public abstract interface HttpRequestFactory {
+ public abstract deprecated interface HttpRequestFactory {
method public abstract org.apache.http.HttpRequest newHttpRequest(org.apache.http.RequestLine) throws org.apache.http.MethodNotSupportedException;
method public abstract org.apache.http.HttpRequest newHttpRequest(java.lang.String, java.lang.String) throws org.apache.http.MethodNotSupportedException;
}
- public abstract interface HttpRequestInterceptor {
+ public abstract deprecated interface HttpRequestInterceptor {
method public abstract void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public abstract interface HttpResponse implements org.apache.http.HttpMessage {
+ public abstract deprecated interface HttpResponse implements org.apache.http.HttpMessage {
method public abstract org.apache.http.HttpEntity getEntity();
method public abstract java.util.Locale getLocale();
method public abstract org.apache.http.StatusLine getStatusLine();
@@ -54562,16 +54594,16 @@
method public abstract void setStatusLine(org.apache.http.ProtocolVersion, int, java.lang.String);
}
- public abstract interface HttpResponseFactory {
+ public abstract deprecated interface HttpResponseFactory {
method public abstract org.apache.http.HttpResponse newHttpResponse(org.apache.http.ProtocolVersion, int, org.apache.http.protocol.HttpContext);
method public abstract org.apache.http.HttpResponse newHttpResponse(org.apache.http.StatusLine, org.apache.http.protocol.HttpContext);
}
- public abstract interface HttpResponseInterceptor {
+ public abstract deprecated interface HttpResponseInterceptor {
method public abstract void process(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public abstract interface HttpServerConnection implements org.apache.http.HttpConnection {
+ public abstract deprecated interface HttpServerConnection implements org.apache.http.HttpConnection {
method public abstract void flush() throws java.io.IOException;
method public abstract void receiveRequestEntity(org.apache.http.HttpEntityEnclosingRequest) throws org.apache.http.HttpException, java.io.IOException;
method public abstract org.apache.http.HttpRequest receiveRequestHeader() throws org.apache.http.HttpException, java.io.IOException;
@@ -54579,7 +54611,7 @@
method public abstract void sendResponseHeader(org.apache.http.HttpResponse) throws org.apache.http.HttpException, java.io.IOException;
}
- public abstract interface HttpStatus {
+ public abstract deprecated interface HttpStatus {
field public static final int SC_ACCEPTED = 202; // 0xca
field public static final int SC_BAD_GATEWAY = 502; // 0x1f6
field public static final int SC_BAD_REQUEST = 400; // 0x190
@@ -54630,7 +54662,7 @@
field public static final int SC_USE_PROXY = 305; // 0x131
}
- public final class HttpVersion extends org.apache.http.ProtocolVersion implements java.io.Serializable {
+ public final deprecated class HttpVersion extends org.apache.http.ProtocolVersion implements java.io.Serializable {
ctor public HttpVersion(int, int);
field public static final java.lang.String HTTP = "HTTP";
field public static final org.apache.http.HttpVersion HTTP_0_9;
@@ -54638,37 +54670,37 @@
field public static final org.apache.http.HttpVersion HTTP_1_1;
}
- public class MalformedChunkCodingException extends java.io.IOException {
+ public deprecated class MalformedChunkCodingException extends java.io.IOException {
ctor public MalformedChunkCodingException();
ctor public MalformedChunkCodingException(java.lang.String);
}
- public class MethodNotSupportedException extends org.apache.http.HttpException {
+ public deprecated class MethodNotSupportedException extends org.apache.http.HttpException {
ctor public MethodNotSupportedException(java.lang.String);
ctor public MethodNotSupportedException(java.lang.String, java.lang.Throwable);
}
- public abstract interface NameValuePair {
+ public abstract deprecated interface NameValuePair {
method public abstract java.lang.String getName();
method public abstract java.lang.String getValue();
}
- public class NoHttpResponseException extends java.io.IOException {
+ public deprecated class NoHttpResponseException extends java.io.IOException {
ctor public NoHttpResponseException(java.lang.String);
}
- public class ParseException extends java.lang.RuntimeException {
+ public deprecated class ParseException extends java.lang.RuntimeException {
ctor public ParseException();
ctor public ParseException(java.lang.String);
}
- public class ProtocolException extends org.apache.http.HttpException {
+ public deprecated class ProtocolException extends org.apache.http.HttpException {
ctor public ProtocolException();
ctor public ProtocolException(java.lang.String);
ctor public ProtocolException(java.lang.String, java.lang.Throwable);
}
- public class ProtocolVersion implements java.lang.Cloneable java.io.Serializable {
+ public deprecated class ProtocolVersion implements java.lang.Cloneable java.io.Serializable {
ctor public ProtocolVersion(java.lang.String, int, int);
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
method public int compareToVersion(org.apache.http.ProtocolVersion);
@@ -54686,28 +54718,28 @@
field protected final java.lang.String protocol;
}
- public abstract interface ReasonPhraseCatalog {
+ public abstract deprecated interface ReasonPhraseCatalog {
method public abstract java.lang.String getReason(int, java.util.Locale);
}
- public abstract interface RequestLine {
+ public abstract deprecated interface RequestLine {
method public abstract java.lang.String getMethod();
method public abstract org.apache.http.ProtocolVersion getProtocolVersion();
method public abstract java.lang.String getUri();
}
- public abstract interface StatusLine {
+ public abstract deprecated interface StatusLine {
method public abstract org.apache.http.ProtocolVersion getProtocolVersion();
method public abstract java.lang.String getReasonPhrase();
method public abstract int getStatusCode();
}
- public abstract interface TokenIterator implements java.util.Iterator {
+ public abstract deprecated interface TokenIterator implements java.util.Iterator {
method public abstract boolean hasNext();
method public abstract java.lang.String nextToken();
}
- public class UnsupportedHttpVersionException extends org.apache.http.ProtocolException {
+ public deprecated class UnsupportedHttpVersionException extends org.apache.http.ProtocolException {
ctor public UnsupportedHttpVersionException();
ctor public UnsupportedHttpVersionException(java.lang.String);
}
@@ -54716,14 +54748,14 @@
package org.apache.http.auth {
- public final class AUTH {
+ public final deprecated class AUTH {
field public static final java.lang.String PROXY_AUTH = "Proxy-Authenticate";
field public static final java.lang.String PROXY_AUTH_RESP = "Proxy-Authorization";
field public static final java.lang.String WWW_AUTH = "WWW-Authenticate";
field public static final java.lang.String WWW_AUTH_RESP = "Authorization";
}
- public abstract interface AuthScheme {
+ public abstract deprecated interface AuthScheme {
method public abstract org.apache.http.Header authenticate(org.apache.http.auth.Credentials, org.apache.http.HttpRequest) throws org.apache.http.auth.AuthenticationException;
method public abstract java.lang.String getParameter(java.lang.String);
method public abstract java.lang.String getRealm();
@@ -54733,11 +54765,11 @@
method public abstract void processChallenge(org.apache.http.Header) throws org.apache.http.auth.MalformedChallengeException;
}
- public abstract interface AuthSchemeFactory {
+ public abstract deprecated interface AuthSchemeFactory {
method public abstract org.apache.http.auth.AuthScheme newInstance(org.apache.http.params.HttpParams);
}
- public final class AuthSchemeRegistry {
+ public final deprecated class AuthSchemeRegistry {
ctor public AuthSchemeRegistry();
method public synchronized org.apache.http.auth.AuthScheme getAuthScheme(java.lang.String, org.apache.http.params.HttpParams) throws java.lang.IllegalStateException;
method public synchronized java.util.List<java.lang.String> getSchemeNames();
@@ -54746,7 +54778,7 @@
method public synchronized void unregister(java.lang.String);
}
- public class AuthScope {
+ public deprecated class AuthScope {
ctor public AuthScope(java.lang.String, int, java.lang.String, java.lang.String);
ctor public AuthScope(java.lang.String, int, java.lang.String);
ctor public AuthScope(java.lang.String, int);
@@ -54763,7 +54795,7 @@
field public static final java.lang.String ANY_SCHEME;
}
- public class AuthState {
+ public deprecated class AuthState {
ctor public AuthState();
method public org.apache.http.auth.AuthScheme getAuthScheme();
method public org.apache.http.auth.AuthScope getAuthScope();
@@ -54775,35 +54807,35 @@
method public void setCredentials(org.apache.http.auth.Credentials);
}
- public class AuthenticationException extends org.apache.http.ProtocolException {
+ public deprecated class AuthenticationException extends org.apache.http.ProtocolException {
ctor public AuthenticationException();
ctor public AuthenticationException(java.lang.String);
ctor public AuthenticationException(java.lang.String, java.lang.Throwable);
}
- public final class BasicUserPrincipal implements java.security.Principal {
+ public final deprecated class BasicUserPrincipal implements java.security.Principal {
ctor public BasicUserPrincipal(java.lang.String);
method public java.lang.String getName();
}
- public abstract interface Credentials {
+ public abstract deprecated interface Credentials {
method public abstract java.lang.String getPassword();
method public abstract java.security.Principal getUserPrincipal();
}
- public class InvalidCredentialsException extends org.apache.http.auth.AuthenticationException {
+ public deprecated class InvalidCredentialsException extends org.apache.http.auth.AuthenticationException {
ctor public InvalidCredentialsException();
ctor public InvalidCredentialsException(java.lang.String);
ctor public InvalidCredentialsException(java.lang.String, java.lang.Throwable);
}
- public class MalformedChallengeException extends org.apache.http.ProtocolException {
+ public deprecated class MalformedChallengeException extends org.apache.http.ProtocolException {
ctor public MalformedChallengeException();
ctor public MalformedChallengeException(java.lang.String);
ctor public MalformedChallengeException(java.lang.String, java.lang.Throwable);
}
- public class NTCredentials implements org.apache.http.auth.Credentials {
+ public deprecated class NTCredentials implements org.apache.http.auth.Credentials {
ctor public NTCredentials(java.lang.String);
ctor public NTCredentials(java.lang.String, java.lang.String, java.lang.String, java.lang.String);
method public java.lang.String getDomain();
@@ -54813,14 +54845,14 @@
method public java.lang.String getWorkstation();
}
- public class NTUserPrincipal implements java.security.Principal {
+ public deprecated class NTUserPrincipal implements java.security.Principal {
ctor public NTUserPrincipal(java.lang.String, java.lang.String);
method public java.lang.String getDomain();
method public java.lang.String getName();
method public java.lang.String getUsername();
}
- public class UsernamePasswordCredentials implements org.apache.http.auth.Credentials {
+ public deprecated class UsernamePasswordCredentials implements org.apache.http.auth.Credentials {
ctor public UsernamePasswordCredentials(java.lang.String);
ctor public UsernamePasswordCredentials(java.lang.String, java.lang.String);
method public java.lang.String getPassword();
@@ -54832,16 +54864,16 @@
package org.apache.http.auth.params {
- public abstract interface AuthPNames {
+ public abstract deprecated interface AuthPNames {
field public static final java.lang.String CREDENTIAL_CHARSET = "http.auth.credential-charset";
}
- public class AuthParamBean extends org.apache.http.params.HttpAbstractParamBean {
+ public deprecated class AuthParamBean extends org.apache.http.params.HttpAbstractParamBean {
ctor public AuthParamBean(org.apache.http.params.HttpParams);
method public void setCredentialCharset(java.lang.String);
}
- public final class AuthParams {
+ public final deprecated class AuthParams {
method public static java.lang.String getCredentialCharset(org.apache.http.params.HttpParams);
method public static void setCredentialCharset(org.apache.http.params.HttpParams, java.lang.String);
}
@@ -54850,39 +54882,39 @@
package org.apache.http.client {
- public abstract interface AuthenticationHandler {
+ public abstract deprecated interface AuthenticationHandler {
method public abstract java.util.Map<java.lang.String, org.apache.http.Header> getChallenges(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.auth.MalformedChallengeException;
method public abstract boolean isAuthenticationRequested(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
method public abstract org.apache.http.auth.AuthScheme selectScheme(java.util.Map<java.lang.String, org.apache.http.Header>, org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.auth.AuthenticationException;
}
- public class CircularRedirectException extends org.apache.http.client.RedirectException {
+ public deprecated class CircularRedirectException extends org.apache.http.client.RedirectException {
ctor public CircularRedirectException();
ctor public CircularRedirectException(java.lang.String);
ctor public CircularRedirectException(java.lang.String, java.lang.Throwable);
}
- public class ClientProtocolException extends java.io.IOException {
+ public deprecated class ClientProtocolException extends java.io.IOException {
ctor public ClientProtocolException();
ctor public ClientProtocolException(java.lang.String);
ctor public ClientProtocolException(java.lang.Throwable);
ctor public ClientProtocolException(java.lang.String, java.lang.Throwable);
}
- public abstract interface CookieStore {
+ public abstract deprecated interface CookieStore {
method public abstract void addCookie(org.apache.http.cookie.Cookie);
method public abstract void clear();
method public abstract boolean clearExpired(java.util.Date);
method public abstract java.util.List<org.apache.http.cookie.Cookie> getCookies();
}
- public abstract interface CredentialsProvider {
+ public abstract deprecated interface CredentialsProvider {
method public abstract void clear();
method public abstract org.apache.http.auth.Credentials getCredentials(org.apache.http.auth.AuthScope);
method public abstract void setCredentials(org.apache.http.auth.AuthScope, org.apache.http.auth.Credentials);
}
- public abstract interface HttpClient {
+ public abstract deprecated interface HttpClient {
method public abstract org.apache.http.HttpResponse execute(org.apache.http.client.methods.HttpUriRequest) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
method public abstract org.apache.http.HttpResponse execute(org.apache.http.client.methods.HttpUriRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
method public abstract org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
@@ -54895,40 +54927,40 @@
method public abstract org.apache.http.params.HttpParams getParams();
}
- public abstract interface HttpRequestRetryHandler {
+ public abstract deprecated interface HttpRequestRetryHandler {
method public abstract boolean retryRequest(java.io.IOException, int, org.apache.http.protocol.HttpContext);
}
- public class HttpResponseException extends org.apache.http.client.ClientProtocolException {
+ public deprecated class HttpResponseException extends org.apache.http.client.ClientProtocolException {
ctor public HttpResponseException(int, java.lang.String);
method public int getStatusCode();
}
- public class NonRepeatableRequestException extends org.apache.http.ProtocolException {
+ public deprecated class NonRepeatableRequestException extends org.apache.http.ProtocolException {
ctor public NonRepeatableRequestException();
ctor public NonRepeatableRequestException(java.lang.String);
}
- public class RedirectException extends org.apache.http.ProtocolException {
+ public deprecated class RedirectException extends org.apache.http.ProtocolException {
ctor public RedirectException();
ctor public RedirectException(java.lang.String);
ctor public RedirectException(java.lang.String, java.lang.Throwable);
}
- public abstract interface RedirectHandler {
+ public abstract deprecated interface RedirectHandler {
method public abstract java.net.URI getLocationURI(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.ProtocolException;
method public abstract boolean isRedirectRequested(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
}
- public abstract interface RequestDirector {
+ public abstract deprecated interface RequestDirector {
method public abstract org.apache.http.HttpResponse execute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public abstract interface ResponseHandler {
+ public abstract deprecated interface ResponseHandler {
method public abstract T handleResponse(org.apache.http.HttpResponse) throws org.apache.http.client.ClientProtocolException, java.io.IOException;
}
- public abstract interface UserTokenHandler {
+ public abstract deprecated interface UserTokenHandler {
method public abstract java.lang.Object getUserToken(org.apache.http.protocol.HttpContext);
}
@@ -54936,7 +54968,7 @@
package org.apache.http.client.entity {
- public class UrlEncodedFormEntity extends org.apache.http.entity.StringEntity {
+ public deprecated class UrlEncodedFormEntity extends org.apache.http.entity.StringEntity {
ctor public UrlEncodedFormEntity(java.util.List<? extends org.apache.http.NameValuePair>, java.lang.String) throws java.io.UnsupportedEncodingException;
ctor public UrlEncodedFormEntity(java.util.List<? extends org.apache.http.NameValuePair>) throws java.io.UnsupportedEncodingException;
}
@@ -54945,13 +54977,13 @@
package org.apache.http.client.methods {
- public abstract interface AbortableHttpRequest {
+ public abstract deprecated interface AbortableHttpRequest {
method public abstract void abort();
method public abstract void setConnectionRequest(org.apache.http.conn.ClientConnectionRequest) throws java.io.IOException;
method public abstract void setReleaseTrigger(org.apache.http.conn.ConnectionReleaseTrigger) throws java.io.IOException;
}
- public class HttpDelete extends org.apache.http.client.methods.HttpRequestBase {
+ public deprecated class HttpDelete extends org.apache.http.client.methods.HttpRequestBase {
ctor public HttpDelete();
ctor public HttpDelete(java.net.URI);
ctor public HttpDelete(java.lang.String);
@@ -54959,14 +54991,14 @@
field public static final java.lang.String METHOD_NAME = "DELETE";
}
- public abstract class HttpEntityEnclosingRequestBase extends org.apache.http.client.methods.HttpRequestBase implements org.apache.http.HttpEntityEnclosingRequest {
+ public abstract deprecated class HttpEntityEnclosingRequestBase extends org.apache.http.client.methods.HttpRequestBase implements org.apache.http.HttpEntityEnclosingRequest {
ctor public HttpEntityEnclosingRequestBase();
method public boolean expectContinue();
method public org.apache.http.HttpEntity getEntity();
method public void setEntity(org.apache.http.HttpEntity);
}
- public class HttpGet extends org.apache.http.client.methods.HttpRequestBase {
+ public deprecated class HttpGet extends org.apache.http.client.methods.HttpRequestBase {
ctor public HttpGet();
ctor public HttpGet(java.net.URI);
ctor public HttpGet(java.lang.String);
@@ -54974,7 +55006,7 @@
field public static final java.lang.String METHOD_NAME = "GET";
}
- public class HttpHead extends org.apache.http.client.methods.HttpRequestBase {
+ public deprecated class HttpHead extends org.apache.http.client.methods.HttpRequestBase {
ctor public HttpHead();
ctor public HttpHead(java.net.URI);
ctor public HttpHead(java.lang.String);
@@ -54982,7 +55014,7 @@
field public static final java.lang.String METHOD_NAME = "HEAD";
}
- public class HttpOptions extends org.apache.http.client.methods.HttpRequestBase {
+ public deprecated class HttpOptions extends org.apache.http.client.methods.HttpRequestBase {
ctor public HttpOptions();
ctor public HttpOptions(java.net.URI);
ctor public HttpOptions(java.lang.String);
@@ -54991,7 +55023,7 @@
field public static final java.lang.String METHOD_NAME = "OPTIONS";
}
- public class HttpPost extends org.apache.http.client.methods.HttpEntityEnclosingRequestBase {
+ public deprecated class HttpPost extends org.apache.http.client.methods.HttpEntityEnclosingRequestBase {
ctor public HttpPost();
ctor public HttpPost(java.net.URI);
ctor public HttpPost(java.lang.String);
@@ -54999,7 +55031,7 @@
field public static final java.lang.String METHOD_NAME = "POST";
}
- public class HttpPut extends org.apache.http.client.methods.HttpEntityEnclosingRequestBase {
+ public deprecated class HttpPut extends org.apache.http.client.methods.HttpEntityEnclosingRequestBase {
ctor public HttpPut();
ctor public HttpPut(java.net.URI);
ctor public HttpPut(java.lang.String);
@@ -55007,7 +55039,7 @@
field public static final java.lang.String METHOD_NAME = "PUT";
}
- public abstract class HttpRequestBase extends org.apache.http.message.AbstractHttpMessage implements org.apache.http.client.methods.AbortableHttpRequest java.lang.Cloneable org.apache.http.client.methods.HttpUriRequest {
+ public abstract deprecated class HttpRequestBase extends org.apache.http.message.AbstractHttpMessage implements org.apache.http.client.methods.AbortableHttpRequest java.lang.Cloneable org.apache.http.client.methods.HttpUriRequest {
ctor public HttpRequestBase();
method public void abort();
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
@@ -55021,7 +55053,7 @@
method public void setURI(java.net.URI);
}
- public class HttpTrace extends org.apache.http.client.methods.HttpRequestBase {
+ public deprecated class HttpTrace extends org.apache.http.client.methods.HttpRequestBase {
ctor public HttpTrace();
ctor public HttpTrace(java.net.URI);
ctor public HttpTrace(java.lang.String);
@@ -55029,7 +55061,7 @@
field public static final java.lang.String METHOD_NAME = "TRACE";
}
- public abstract interface HttpUriRequest implements org.apache.http.HttpRequest {
+ public abstract deprecated interface HttpUriRequest implements org.apache.http.HttpRequest {
method public abstract void abort() throws java.lang.UnsupportedOperationException;
method public abstract java.lang.String getMethod();
method public abstract java.net.URI getURI();
@@ -55040,16 +55072,16 @@
package org.apache.http.client.params {
- public abstract interface AllClientPNames implements org.apache.http.auth.params.AuthPNames org.apache.http.client.params.ClientPNames org.apache.http.conn.params.ConnConnectionPNames org.apache.http.conn.params.ConnManagerPNames org.apache.http.conn.params.ConnRoutePNames org.apache.http.cookie.params.CookieSpecPNames org.apache.http.params.CoreConnectionPNames org.apache.http.params.CoreProtocolPNames {
+ public abstract deprecated interface AllClientPNames implements org.apache.http.auth.params.AuthPNames org.apache.http.client.params.ClientPNames org.apache.http.conn.params.ConnConnectionPNames org.apache.http.conn.params.ConnManagerPNames org.apache.http.conn.params.ConnRoutePNames org.apache.http.cookie.params.CookieSpecPNames org.apache.http.params.CoreConnectionPNames org.apache.http.params.CoreProtocolPNames {
}
- public final class AuthPolicy {
+ public final deprecated class AuthPolicy {
field public static final java.lang.String BASIC = "Basic";
field public static final java.lang.String DIGEST = "Digest";
field public static final java.lang.String NTLM = "NTLM";
}
- public abstract interface ClientPNames {
+ public abstract deprecated interface ClientPNames {
field public static final java.lang.String ALLOW_CIRCULAR_REDIRECTS = "http.protocol.allow-circular-redirects";
field public static final java.lang.String CONNECTION_MANAGER_FACTORY = "http.connection-manager.factory-object";
field public static final java.lang.String CONNECTION_MANAGER_FACTORY_CLASS_NAME = "http.connection-manager.factory-class-name";
@@ -55063,7 +55095,7 @@
field public static final java.lang.String VIRTUAL_HOST = "http.virtual-host";
}
- public class ClientParamBean extends org.apache.http.params.HttpAbstractParamBean {
+ public deprecated class ClientParamBean extends org.apache.http.params.HttpAbstractParamBean {
ctor public ClientParamBean(org.apache.http.params.HttpParams);
method public void setAllowCircularRedirects(boolean);
method public void setConnectionManagerFactory(org.apache.http.conn.ClientConnectionManagerFactory);
@@ -55078,7 +55110,7 @@
method public void setVirtualHost(org.apache.http.HttpHost);
}
- public final class CookiePolicy {
+ public final deprecated class CookiePolicy {
field public static final java.lang.String BEST_MATCH = "best-match";
field public static final java.lang.String BROWSER_COMPATIBILITY = "compatibility";
field public static final java.lang.String NETSCAPE = "netscape";
@@ -55086,7 +55118,7 @@
field public static final java.lang.String RFC_2965 = "rfc2965";
}
- public class HttpClientParams {
+ public deprecated class HttpClientParams {
method public static java.lang.String getCookiePolicy(org.apache.http.params.HttpParams);
method public static boolean isAuthenticating(org.apache.http.params.HttpParams);
method public static boolean isRedirecting(org.apache.http.params.HttpParams);
@@ -55099,7 +55131,7 @@
package org.apache.http.client.protocol {
- public abstract interface ClientContext {
+ public abstract deprecated interface ClientContext {
field public static final java.lang.String AUTHSCHEME_REGISTRY = "http.authscheme-registry";
field public static final java.lang.String AUTH_SCHEME_PREF = "http.auth.scheme-pref";
field public static final java.lang.String COOKIESPEC_REGISTRY = "http.cookiespec-registry";
@@ -55112,7 +55144,7 @@
field public static final java.lang.String USER_TOKEN = "http.user-token";
}
- public class ClientContextConfigurer implements org.apache.http.client.protocol.ClientContext {
+ public deprecated class ClientContextConfigurer implements org.apache.http.client.protocol.ClientContext {
ctor public ClientContextConfigurer(org.apache.http.protocol.HttpContext);
method public void setAuthSchemePref(java.util.List<java.lang.String>);
method public void setAuthSchemeRegistry(org.apache.http.auth.AuthSchemeRegistry);
@@ -55121,27 +55153,27 @@
method public void setCredentialsProvider(org.apache.http.client.CredentialsProvider);
}
- public class RequestAddCookies implements org.apache.http.HttpRequestInterceptor {
+ public deprecated class RequestAddCookies implements org.apache.http.HttpRequestInterceptor {
ctor public RequestAddCookies();
method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public class RequestDefaultHeaders implements org.apache.http.HttpRequestInterceptor {
+ public deprecated class RequestDefaultHeaders implements org.apache.http.HttpRequestInterceptor {
ctor public RequestDefaultHeaders();
method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public class RequestProxyAuthentication implements org.apache.http.HttpRequestInterceptor {
+ public deprecated class RequestProxyAuthentication implements org.apache.http.HttpRequestInterceptor {
ctor public RequestProxyAuthentication();
method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public class RequestTargetAuthentication implements org.apache.http.HttpRequestInterceptor {
+ public deprecated class RequestTargetAuthentication implements org.apache.http.HttpRequestInterceptor {
ctor public RequestTargetAuthentication();
method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public class ResponseProcessCookies implements org.apache.http.HttpResponseInterceptor {
+ public deprecated class ResponseProcessCookies implements org.apache.http.HttpResponseInterceptor {
ctor public ResponseProcessCookies();
method public void process(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
@@ -55150,11 +55182,11 @@
package org.apache.http.client.utils {
- public class CloneUtils {
+ public deprecated class CloneUtils {
method public static java.lang.Object clone(java.lang.Object) throws java.lang.CloneNotSupportedException;
}
- public class URIUtils {
+ public deprecated class URIUtils {
method public static java.net.URI createURI(java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String) throws java.net.URISyntaxException;
method public static java.net.URI resolve(java.net.URI, java.lang.String);
method public static java.net.URI resolve(java.net.URI, java.net.URI);
@@ -55162,7 +55194,7 @@
method public static java.net.URI rewriteURI(java.net.URI, org.apache.http.HttpHost) throws java.net.URISyntaxException;
}
- public class URLEncodedUtils {
+ public deprecated class URLEncodedUtils {
ctor public URLEncodedUtils();
method public static java.lang.String format(java.util.List<? extends org.apache.http.NameValuePair>, java.lang.String);
method public static boolean isEncoded(org.apache.http.HttpEntity);
@@ -55176,7 +55208,7 @@
package org.apache.http.conn {
- public class BasicEofSensorWatcher implements org.apache.http.conn.EofSensorWatcher {
+ public deprecated class BasicEofSensorWatcher implements org.apache.http.conn.EofSensorWatcher {
ctor public BasicEofSensorWatcher(org.apache.http.conn.ManagedClientConnection, boolean);
method public boolean eofDetected(java.io.InputStream) throws java.io.IOException;
method public boolean streamAbort(java.io.InputStream) throws java.io.IOException;
@@ -55185,7 +55217,7 @@
field protected org.apache.http.conn.ManagedClientConnection managedConn;
}
- public class BasicManagedEntity extends org.apache.http.entity.HttpEntityWrapper implements org.apache.http.conn.ConnectionReleaseTrigger org.apache.http.conn.EofSensorWatcher {
+ public deprecated class BasicManagedEntity extends org.apache.http.entity.HttpEntityWrapper implements org.apache.http.conn.ConnectionReleaseTrigger org.apache.http.conn.EofSensorWatcher {
ctor public BasicManagedEntity(org.apache.http.HttpEntity, org.apache.http.conn.ManagedClientConnection, boolean);
method public void abortConnection() throws java.io.IOException;
method public boolean eofDetected(java.io.InputStream) throws java.io.IOException;
@@ -55197,7 +55229,7 @@
field protected org.apache.http.conn.ManagedClientConnection managedConn;
}
- public abstract interface ClientConnectionManager {
+ public abstract deprecated interface ClientConnectionManager {
method public abstract void closeExpiredConnections();
method public abstract void closeIdleConnections(long, java.util.concurrent.TimeUnit);
method public abstract org.apache.http.conn.scheme.SchemeRegistry getSchemeRegistry();
@@ -55206,41 +55238,41 @@
method public abstract void shutdown();
}
- public abstract interface ClientConnectionManagerFactory {
+ public abstract deprecated interface ClientConnectionManagerFactory {
method public abstract org.apache.http.conn.ClientConnectionManager newInstance(org.apache.http.params.HttpParams, org.apache.http.conn.scheme.SchemeRegistry);
}
- public abstract interface ClientConnectionOperator {
+ public abstract deprecated interface ClientConnectionOperator {
method public abstract org.apache.http.conn.OperatedClientConnection createConnection();
method public abstract void openConnection(org.apache.http.conn.OperatedClientConnection, org.apache.http.HttpHost, java.net.InetAddress, org.apache.http.protocol.HttpContext, org.apache.http.params.HttpParams) throws java.io.IOException;
method public abstract void updateSecureConnection(org.apache.http.conn.OperatedClientConnection, org.apache.http.HttpHost, org.apache.http.protocol.HttpContext, org.apache.http.params.HttpParams) throws java.io.IOException;
}
- public abstract interface ClientConnectionRequest {
+ public abstract deprecated interface ClientConnectionRequest {
method public abstract void abortRequest();
method public abstract org.apache.http.conn.ManagedClientConnection getConnection(long, java.util.concurrent.TimeUnit) throws org.apache.http.conn.ConnectionPoolTimeoutException, java.lang.InterruptedException;
}
- public class ConnectTimeoutException extends java.io.InterruptedIOException {
+ public deprecated class ConnectTimeoutException extends java.io.InterruptedIOException {
ctor public ConnectTimeoutException();
ctor public ConnectTimeoutException(java.lang.String);
}
- public abstract interface ConnectionKeepAliveStrategy {
+ public abstract deprecated interface ConnectionKeepAliveStrategy {
method public abstract long getKeepAliveDuration(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
}
- public class ConnectionPoolTimeoutException extends org.apache.http.conn.ConnectTimeoutException {
+ public deprecated class ConnectionPoolTimeoutException extends org.apache.http.conn.ConnectTimeoutException {
ctor public ConnectionPoolTimeoutException();
ctor public ConnectionPoolTimeoutException(java.lang.String);
}
- public abstract interface ConnectionReleaseTrigger {
+ public abstract deprecated interface ConnectionReleaseTrigger {
method public abstract void abortConnection() throws java.io.IOException;
method public abstract void releaseConnection() throws java.io.IOException;
}
- public class EofSensorInputStream extends java.io.InputStream implements org.apache.http.conn.ConnectionReleaseTrigger {
+ public deprecated class EofSensorInputStream extends java.io.InputStream implements org.apache.http.conn.ConnectionReleaseTrigger {
ctor public EofSensorInputStream(java.io.InputStream, org.apache.http.conn.EofSensorWatcher);
method public void abortConnection() throws java.io.IOException;
method protected void checkAbort() throws java.io.IOException;
@@ -55252,18 +55284,18 @@
field protected java.io.InputStream wrappedStream;
}
- public abstract interface EofSensorWatcher {
+ public abstract deprecated interface EofSensorWatcher {
method public abstract boolean eofDetected(java.io.InputStream) throws java.io.IOException;
method public abstract boolean streamAbort(java.io.InputStream) throws java.io.IOException;
method public abstract boolean streamClosed(java.io.InputStream) throws java.io.IOException;
}
- public class HttpHostConnectException extends java.net.ConnectException {
+ public deprecated class HttpHostConnectException extends java.net.ConnectException {
ctor public HttpHostConnectException(org.apache.http.HttpHost, java.net.ConnectException);
method public org.apache.http.HttpHost getHost();
}
- public abstract interface ManagedClientConnection implements org.apache.http.conn.ConnectionReleaseTrigger org.apache.http.HttpClientConnection org.apache.http.HttpInetConnection {
+ public abstract deprecated interface ManagedClientConnection implements org.apache.http.conn.ConnectionReleaseTrigger org.apache.http.HttpClientConnection org.apache.http.HttpInetConnection {
method public abstract org.apache.http.conn.routing.HttpRoute getRoute();
method public abstract javax.net.ssl.SSLSession getSSLSession();
method public abstract java.lang.Object getState();
@@ -55279,14 +55311,14 @@
method public abstract void unmarkReusable();
}
- public final class MultihomePlainSocketFactory implements org.apache.http.conn.scheme.SocketFactory {
+ public final deprecated class MultihomePlainSocketFactory implements org.apache.http.conn.scheme.SocketFactory {
method public java.net.Socket connectSocket(java.net.Socket, java.lang.String, int, java.net.InetAddress, int, org.apache.http.params.HttpParams) throws java.io.IOException;
method public java.net.Socket createSocket();
method public static org.apache.http.conn.MultihomePlainSocketFactory getSocketFactory();
method public final boolean isSecure(java.net.Socket) throws java.lang.IllegalArgumentException;
}
- public abstract interface OperatedClientConnection implements org.apache.http.HttpClientConnection org.apache.http.HttpInetConnection {
+ public abstract deprecated interface OperatedClientConnection implements org.apache.http.HttpClientConnection org.apache.http.HttpInetConnection {
method public abstract java.net.Socket getSocket();
method public abstract org.apache.http.HttpHost getTargetHost();
method public abstract boolean isSecure();
@@ -55299,29 +55331,29 @@
package org.apache.http.conn.params {
- public abstract interface ConnConnectionPNames {
+ public abstract deprecated interface ConnConnectionPNames {
field public static final java.lang.String MAX_STATUS_LINE_GARBAGE = "http.connection.max-status-line-garbage";
}
- public class ConnConnectionParamBean extends org.apache.http.params.HttpAbstractParamBean {
+ public deprecated class ConnConnectionParamBean extends org.apache.http.params.HttpAbstractParamBean {
ctor public ConnConnectionParamBean(org.apache.http.params.HttpParams);
method public void setMaxStatusLineGarbage(int);
}
- public abstract interface ConnManagerPNames {
+ public abstract deprecated interface ConnManagerPNames {
field public static final java.lang.String MAX_CONNECTIONS_PER_ROUTE = "http.conn-manager.max-per-route";
field public static final java.lang.String MAX_TOTAL_CONNECTIONS = "http.conn-manager.max-total";
field public static final java.lang.String TIMEOUT = "http.conn-manager.timeout";
}
- public class ConnManagerParamBean extends org.apache.http.params.HttpAbstractParamBean {
+ public deprecated class ConnManagerParamBean extends org.apache.http.params.HttpAbstractParamBean {
ctor public ConnManagerParamBean(org.apache.http.params.HttpParams);
method public void setConnectionsPerRoute(org.apache.http.conn.params.ConnPerRouteBean);
method public void setMaxTotalConnections(int);
method public void setTimeout(long);
}
- public final class ConnManagerParams implements org.apache.http.conn.params.ConnManagerPNames {
+ public final deprecated class ConnManagerParams implements org.apache.http.conn.params.ConnManagerPNames {
ctor public ConnManagerParams();
method public static org.apache.http.conn.params.ConnPerRoute getMaxConnectionsPerRoute(org.apache.http.params.HttpParams);
method public static int getMaxTotalConnections(org.apache.http.params.HttpParams);
@@ -55332,11 +55364,11 @@
field public static final int DEFAULT_MAX_TOTAL_CONNECTIONS = 20; // 0x14
}
- public abstract interface ConnPerRoute {
+ public abstract deprecated interface ConnPerRoute {
method public abstract int getMaxForRoute(org.apache.http.conn.routing.HttpRoute);
}
- public final class ConnPerRouteBean implements org.apache.http.conn.params.ConnPerRoute {
+ public final deprecated class ConnPerRouteBean implements org.apache.http.conn.params.ConnPerRoute {
ctor public ConnPerRouteBean(int);
ctor public ConnPerRouteBean();
method public int getDefaultMax();
@@ -55347,20 +55379,20 @@
field public static final int DEFAULT_MAX_CONNECTIONS_PER_ROUTE = 2; // 0x2
}
- public abstract interface ConnRoutePNames {
+ public abstract deprecated interface ConnRoutePNames {
field public static final java.lang.String DEFAULT_PROXY = "http.route.default-proxy";
field public static final java.lang.String FORCED_ROUTE = "http.route.forced-route";
field public static final java.lang.String LOCAL_ADDRESS = "http.route.local-address";
}
- public class ConnRouteParamBean extends org.apache.http.params.HttpAbstractParamBean {
+ public deprecated class ConnRouteParamBean extends org.apache.http.params.HttpAbstractParamBean {
ctor public ConnRouteParamBean(org.apache.http.params.HttpParams);
method public void setDefaultProxy(org.apache.http.HttpHost);
method public void setForcedRoute(org.apache.http.conn.routing.HttpRoute);
method public void setLocalAddress(java.net.InetAddress);
}
- public class ConnRouteParams implements org.apache.http.conn.params.ConnRoutePNames {
+ public deprecated class ConnRouteParams implements org.apache.http.conn.params.ConnRoutePNames {
method public static org.apache.http.HttpHost getDefaultProxy(org.apache.http.params.HttpParams);
method public static org.apache.http.conn.routing.HttpRoute getForcedRoute(org.apache.http.params.HttpParams);
method public static java.net.InetAddress getLocalAddress(org.apache.http.params.HttpParams);
@@ -55375,7 +55407,7 @@
package org.apache.http.conn.routing {
- public class BasicRouteDirector implements org.apache.http.conn.routing.HttpRouteDirector {
+ public deprecated class BasicRouteDirector implements org.apache.http.conn.routing.HttpRouteDirector {
ctor public BasicRouteDirector();
method protected int directStep(org.apache.http.conn.routing.RouteInfo, org.apache.http.conn.routing.RouteInfo);
method protected int firstStep(org.apache.http.conn.routing.RouteInfo);
@@ -55383,7 +55415,7 @@
method protected int proxiedStep(org.apache.http.conn.routing.RouteInfo, org.apache.http.conn.routing.RouteInfo);
}
- public final class HttpRoute implements java.lang.Cloneable org.apache.http.conn.routing.RouteInfo {
+ public final deprecated class HttpRoute implements java.lang.Cloneable org.apache.http.conn.routing.RouteInfo {
ctor public HttpRoute(org.apache.http.HttpHost, java.net.InetAddress, org.apache.http.HttpHost[], boolean, org.apache.http.conn.routing.RouteInfo.TunnelType, org.apache.http.conn.routing.RouteInfo.LayerType);
ctor public HttpRoute(org.apache.http.HttpHost, java.net.InetAddress, org.apache.http.HttpHost, boolean, org.apache.http.conn.routing.RouteInfo.TunnelType, org.apache.http.conn.routing.RouteInfo.LayerType);
ctor public HttpRoute(org.apache.http.HttpHost, java.net.InetAddress, boolean);
@@ -55405,7 +55437,7 @@
method public final java.lang.String toString();
}
- public abstract interface HttpRouteDirector {
+ public abstract deprecated interface HttpRouteDirector {
method public abstract int nextStep(org.apache.http.conn.routing.RouteInfo, org.apache.http.conn.routing.RouteInfo);
field public static final int COMPLETE = 0; // 0x0
field public static final int CONNECT_PROXY = 2; // 0x2
@@ -55416,11 +55448,11 @@
field public static final int UNREACHABLE = -1; // 0xffffffff
}
- public abstract interface HttpRoutePlanner {
+ public abstract deprecated interface HttpRoutePlanner {
method public abstract org.apache.http.conn.routing.HttpRoute determineRoute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException;
}
- public abstract interface RouteInfo {
+ public abstract deprecated interface RouteInfo {
method public abstract int getHopCount();
method public abstract org.apache.http.HttpHost getHopTarget(int);
method public abstract org.apache.http.conn.routing.RouteInfo.LayerType getLayerType();
@@ -55447,7 +55479,7 @@
enum_constant public static final org.apache.http.conn.routing.RouteInfo.TunnelType TUNNELLED;
}
- public final class RouteTracker implements java.lang.Cloneable org.apache.http.conn.routing.RouteInfo {
+ public final deprecated class RouteTracker implements java.lang.Cloneable org.apache.http.conn.routing.RouteInfo {
ctor public RouteTracker(org.apache.http.HttpHost, java.net.InetAddress);
ctor public RouteTracker(org.apache.http.conn.routing.HttpRoute);
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
@@ -55477,15 +55509,15 @@
package org.apache.http.conn.scheme {
- public abstract interface HostNameResolver {
+ public abstract deprecated interface HostNameResolver {
method public abstract java.net.InetAddress resolve(java.lang.String) throws java.io.IOException;
}
- public abstract interface LayeredSocketFactory implements org.apache.http.conn.scheme.SocketFactory {
+ public abstract deprecated interface LayeredSocketFactory implements org.apache.http.conn.scheme.SocketFactory {
method public abstract java.net.Socket createSocket(java.net.Socket, java.lang.String, int, boolean) throws java.io.IOException, java.net.UnknownHostException;
}
- public final class PlainSocketFactory implements org.apache.http.conn.scheme.SocketFactory {
+ public final deprecated class PlainSocketFactory implements org.apache.http.conn.scheme.SocketFactory {
ctor public PlainSocketFactory(org.apache.http.conn.scheme.HostNameResolver);
ctor public PlainSocketFactory();
method public java.net.Socket connectSocket(java.net.Socket, java.lang.String, int, java.net.InetAddress, int, org.apache.http.params.HttpParams) throws java.io.IOException;
@@ -55494,7 +55526,7 @@
method public final boolean isSecure(java.net.Socket) throws java.lang.IllegalArgumentException;
}
- public final class Scheme {
+ public final deprecated class Scheme {
ctor public Scheme(java.lang.String, org.apache.http.conn.scheme.SocketFactory, int);
method public final boolean equals(java.lang.Object);
method public final int getDefaultPort();
@@ -55505,7 +55537,7 @@
method public final java.lang.String toString();
}
- public final class SchemeRegistry {
+ public final deprecated class SchemeRegistry {
ctor public SchemeRegistry();
method public final synchronized org.apache.http.conn.scheme.Scheme get(java.lang.String);
method public final synchronized org.apache.http.conn.scheme.Scheme getScheme(java.lang.String);
@@ -55516,7 +55548,7 @@
method public final synchronized org.apache.http.conn.scheme.Scheme unregister(java.lang.String);
}
- public abstract interface SocketFactory {
+ public abstract deprecated interface SocketFactory {
method public abstract java.net.Socket connectSocket(java.net.Socket, java.lang.String, int, java.net.InetAddress, int, org.apache.http.params.HttpParams) throws org.apache.http.conn.ConnectTimeoutException, java.io.IOException, java.net.UnknownHostException;
method public abstract java.net.Socket createSocket() throws java.io.IOException;
method public abstract boolean isSecure(java.net.Socket) throws java.lang.IllegalArgumentException;
@@ -55526,7 +55558,7 @@
package org.apache.http.conn.ssl {
- public abstract class AbstractVerifier implements org.apache.http.conn.ssl.X509HostnameVerifier {
+ public abstract deprecated class AbstractVerifier implements org.apache.http.conn.ssl.X509HostnameVerifier {
ctor public AbstractVerifier();
method public static boolean acceptableCountryWildcard(java.lang.String);
method public static int countDots(java.lang.String);
@@ -55538,19 +55570,19 @@
method public final void verify(java.lang.String, java.lang.String[], java.lang.String[], boolean) throws javax.net.ssl.SSLException;
}
- public class AllowAllHostnameVerifier extends org.apache.http.conn.ssl.AbstractVerifier {
+ public deprecated class AllowAllHostnameVerifier extends org.apache.http.conn.ssl.AbstractVerifier {
ctor public AllowAllHostnameVerifier();
method public final java.lang.String toString();
method public final void verify(java.lang.String, java.lang.String[], java.lang.String[]);
}
- public class BrowserCompatHostnameVerifier extends org.apache.http.conn.ssl.AbstractVerifier {
+ public deprecated class BrowserCompatHostnameVerifier extends org.apache.http.conn.ssl.AbstractVerifier {
ctor public BrowserCompatHostnameVerifier();
method public final java.lang.String toString();
method public final void verify(java.lang.String, java.lang.String[], java.lang.String[]) throws javax.net.ssl.SSLException;
}
- public class SSLSocketFactory implements org.apache.http.conn.scheme.LayeredSocketFactory {
+ public deprecated class SSLSocketFactory implements org.apache.http.conn.scheme.LayeredSocketFactory {
ctor public SSLSocketFactory(java.lang.String, java.security.KeyStore, java.lang.String, java.security.KeyStore, java.security.SecureRandom, org.apache.http.conn.scheme.HostNameResolver) throws java.security.KeyManagementException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
ctor public SSLSocketFactory(java.security.KeyStore, java.lang.String, java.security.KeyStore) throws java.security.KeyManagementException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
ctor public SSLSocketFactory(java.security.KeyStore, java.lang.String) throws java.security.KeyManagementException, java.security.KeyStoreException, java.security.NoSuchAlgorithmException, java.security.UnrecoverableKeyException;
@@ -55570,13 +55602,13 @@
field public static final java.lang.String TLS = "TLS";
}
- public class StrictHostnameVerifier extends org.apache.http.conn.ssl.AbstractVerifier {
+ public deprecated class StrictHostnameVerifier extends org.apache.http.conn.ssl.AbstractVerifier {
ctor public StrictHostnameVerifier();
method public final java.lang.String toString();
method public final void verify(java.lang.String, java.lang.String[], java.lang.String[]) throws javax.net.ssl.SSLException;
}
- public abstract interface X509HostnameVerifier implements javax.net.ssl.HostnameVerifier {
+ public abstract deprecated interface X509HostnameVerifier implements javax.net.ssl.HostnameVerifier {
method public abstract boolean verify(java.lang.String, javax.net.ssl.SSLSession);
method public abstract void verify(java.lang.String, javax.net.ssl.SSLSocket) throws java.io.IOException;
method public abstract void verify(java.lang.String, java.security.cert.X509Certificate) throws javax.net.ssl.SSLException;
@@ -55587,7 +55619,7 @@
package org.apache.http.conn.util {
- public class InetAddressUtils {
+ public deprecated class InetAddressUtils {
method public static boolean isIPv4Address(java.lang.String);
method public static boolean isIPv6Address(java.lang.String);
method public static boolean isIPv6HexCompressedAddress(java.lang.String);
@@ -55598,7 +55630,7 @@
package org.apache.http.cookie {
- public abstract interface ClientCookie implements org.apache.http.cookie.Cookie {
+ public abstract deprecated interface ClientCookie implements org.apache.http.cookie.Cookie {
method public abstract boolean containsAttribute(java.lang.String);
method public abstract java.lang.String getAttribute(java.lang.String);
field public static final java.lang.String COMMENTURL_ATTR = "commenturl";
@@ -55613,7 +55645,7 @@
field public static final java.lang.String VERSION_ATTR = "version";
}
- public abstract interface Cookie {
+ public abstract deprecated interface Cookie {
method public abstract java.lang.String getComment();
method public abstract java.lang.String getCommentURL();
method public abstract java.lang.String getDomain();
@@ -55628,18 +55660,18 @@
method public abstract boolean isSecure();
}
- public abstract interface CookieAttributeHandler {
+ public abstract deprecated interface CookieAttributeHandler {
method public abstract boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
method public abstract void parse(org.apache.http.cookie.SetCookie, java.lang.String) throws org.apache.http.cookie.MalformedCookieException;
method public abstract void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
}
- public class CookieIdentityComparator implements java.util.Comparator java.io.Serializable {
+ public deprecated class CookieIdentityComparator implements java.util.Comparator java.io.Serializable {
ctor public CookieIdentityComparator();
method public int compare(org.apache.http.cookie.Cookie, org.apache.http.cookie.Cookie);
}
- public final class CookieOrigin {
+ public final deprecated class CookieOrigin {
ctor public CookieOrigin(java.lang.String, int, java.lang.String, boolean);
method public java.lang.String getHost();
method public java.lang.String getPath();
@@ -55647,12 +55679,12 @@
method public boolean isSecure();
}
- public class CookiePathComparator implements java.util.Comparator java.io.Serializable {
+ public deprecated class CookiePathComparator implements java.util.Comparator java.io.Serializable {
ctor public CookiePathComparator();
method public int compare(org.apache.http.cookie.Cookie, org.apache.http.cookie.Cookie);
}
- public abstract interface CookieSpec {
+ public abstract deprecated interface CookieSpec {
method public abstract java.util.List<org.apache.http.Header> formatCookies(java.util.List<org.apache.http.cookie.Cookie>);
method public abstract int getVersion();
method public abstract org.apache.http.Header getVersionHeader();
@@ -55661,11 +55693,11 @@
method public abstract void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
}
- public abstract interface CookieSpecFactory {
+ public abstract deprecated interface CookieSpecFactory {
method public abstract org.apache.http.cookie.CookieSpec newInstance(org.apache.http.params.HttpParams);
}
- public final class CookieSpecRegistry {
+ public final deprecated class CookieSpecRegistry {
ctor public CookieSpecRegistry();
method public synchronized org.apache.http.cookie.CookieSpec getCookieSpec(java.lang.String, org.apache.http.params.HttpParams) throws java.lang.IllegalStateException;
method public synchronized org.apache.http.cookie.CookieSpec getCookieSpec(java.lang.String) throws java.lang.IllegalStateException;
@@ -55675,20 +55707,20 @@
method public synchronized void unregister(java.lang.String);
}
- public class MalformedCookieException extends org.apache.http.ProtocolException {
+ public deprecated class MalformedCookieException extends org.apache.http.ProtocolException {
ctor public MalformedCookieException();
ctor public MalformedCookieException(java.lang.String);
ctor public MalformedCookieException(java.lang.String, java.lang.Throwable);
}
- public abstract interface SM {
+ public abstract deprecated interface SM {
field public static final java.lang.String COOKIE = "Cookie";
field public static final java.lang.String COOKIE2 = "Cookie2";
field public static final java.lang.String SET_COOKIE = "Set-Cookie";
field public static final java.lang.String SET_COOKIE2 = "Set-Cookie2";
}
- public abstract interface SetCookie implements org.apache.http.cookie.Cookie {
+ public abstract deprecated interface SetCookie implements org.apache.http.cookie.Cookie {
method public abstract void setComment(java.lang.String);
method public abstract void setDomain(java.lang.String);
method public abstract void setExpiryDate(java.util.Date);
@@ -55698,7 +55730,7 @@
method public abstract void setVersion(int);
}
- public abstract interface SetCookie2 implements org.apache.http.cookie.SetCookie {
+ public abstract deprecated interface SetCookie2 implements org.apache.http.cookie.SetCookie {
method public abstract void setCommentURL(java.lang.String);
method public abstract void setDiscard(boolean);
method public abstract void setPorts(int[]);
@@ -55708,12 +55740,12 @@
package org.apache.http.cookie.params {
- public abstract interface CookieSpecPNames {
+ public abstract deprecated interface CookieSpecPNames {
field public static final java.lang.String DATE_PATTERNS = "http.protocol.cookie-datepatterns";
field public static final java.lang.String SINGLE_COOKIE_HEADER = "http.protocol.single-cookie-header";
}
- public class CookieSpecParamBean extends org.apache.http.params.HttpAbstractParamBean {
+ public deprecated class CookieSpecParamBean extends org.apache.http.params.HttpAbstractParamBean {
ctor public CookieSpecParamBean(org.apache.http.params.HttpParams);
method public void setDatePatterns(java.util.Collection<java.lang.String>);
method public void setSingleHeader(boolean);
@@ -55723,7 +55755,7 @@
package org.apache.http.entity {
- public abstract class AbstractHttpEntity implements org.apache.http.HttpEntity {
+ public abstract deprecated class AbstractHttpEntity implements org.apache.http.HttpEntity {
ctor protected AbstractHttpEntity();
method public void consumeContent() throws java.io.IOException, java.lang.UnsupportedOperationException;
method public org.apache.http.Header getContentEncoding();
@@ -55739,7 +55771,7 @@
field protected org.apache.http.Header contentType;
}
- public class BasicHttpEntity extends org.apache.http.entity.AbstractHttpEntity {
+ public deprecated class BasicHttpEntity extends org.apache.http.entity.AbstractHttpEntity {
ctor public BasicHttpEntity();
method public java.io.InputStream getContent() throws java.lang.IllegalStateException;
method public long getContentLength();
@@ -55750,11 +55782,11 @@
method public void writeTo(java.io.OutputStream) throws java.io.IOException;
}
- public class BufferedHttpEntity extends org.apache.http.entity.HttpEntityWrapper {
+ public deprecated class BufferedHttpEntity extends org.apache.http.entity.HttpEntityWrapper {
ctor public BufferedHttpEntity(org.apache.http.HttpEntity) throws java.io.IOException;
}
- public class ByteArrayEntity extends org.apache.http.entity.AbstractHttpEntity implements java.lang.Cloneable {
+ public deprecated class ByteArrayEntity extends org.apache.http.entity.AbstractHttpEntity implements java.lang.Cloneable {
ctor public ByteArrayEntity(byte[]);
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
method public java.io.InputStream getContent();
@@ -55765,17 +55797,17 @@
field protected final byte[] content;
}
- public abstract interface ContentLengthStrategy {
+ public abstract deprecated interface ContentLengthStrategy {
method public abstract long determineLength(org.apache.http.HttpMessage) throws org.apache.http.HttpException;
field public static final int CHUNKED = -2; // 0xfffffffe
field public static final int IDENTITY = -1; // 0xffffffff
}
- public abstract interface ContentProducer {
+ public abstract deprecated interface ContentProducer {
method public abstract void writeTo(java.io.OutputStream) throws java.io.IOException;
}
- public class EntityTemplate extends org.apache.http.entity.AbstractHttpEntity {
+ public deprecated class EntityTemplate extends org.apache.http.entity.AbstractHttpEntity {
ctor public EntityTemplate(org.apache.http.entity.ContentProducer);
method public java.io.InputStream getContent();
method public long getContentLength();
@@ -55784,7 +55816,7 @@
method public void writeTo(java.io.OutputStream) throws java.io.IOException;
}
- public class FileEntity extends org.apache.http.entity.AbstractHttpEntity implements java.lang.Cloneable {
+ public deprecated class FileEntity extends org.apache.http.entity.AbstractHttpEntity implements java.lang.Cloneable {
ctor public FileEntity(java.io.File, java.lang.String);
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
method public java.io.InputStream getContent() throws java.io.IOException;
@@ -55795,7 +55827,7 @@
field protected final java.io.File file;
}
- public class HttpEntityWrapper implements org.apache.http.HttpEntity {
+ public deprecated class HttpEntityWrapper implements org.apache.http.HttpEntity {
ctor public HttpEntityWrapper(org.apache.http.HttpEntity);
method public void consumeContent() throws java.io.IOException;
method public java.io.InputStream getContent() throws java.io.IOException;
@@ -55809,7 +55841,7 @@
field protected org.apache.http.HttpEntity wrappedEntity;
}
- public class InputStreamEntity extends org.apache.http.entity.AbstractHttpEntity {
+ public deprecated class InputStreamEntity extends org.apache.http.entity.AbstractHttpEntity {
ctor public InputStreamEntity(java.io.InputStream, long);
method public java.io.InputStream getContent() throws java.io.IOException;
method public long getContentLength();
@@ -55818,7 +55850,7 @@
method public void writeTo(java.io.OutputStream) throws java.io.IOException;
}
- public class SerializableEntity extends org.apache.http.entity.AbstractHttpEntity {
+ public deprecated class SerializableEntity extends org.apache.http.entity.AbstractHttpEntity {
ctor public SerializableEntity(java.io.Serializable, boolean) throws java.io.IOException;
method public java.io.InputStream getContent() throws java.io.IOException, java.lang.IllegalStateException;
method public long getContentLength();
@@ -55827,7 +55859,7 @@
method public void writeTo(java.io.OutputStream) throws java.io.IOException;
}
- public class StringEntity extends org.apache.http.entity.AbstractHttpEntity implements java.lang.Cloneable {
+ public deprecated class StringEntity extends org.apache.http.entity.AbstractHttpEntity implements java.lang.Cloneable {
ctor public StringEntity(java.lang.String, java.lang.String) throws java.io.UnsupportedEncodingException;
ctor public StringEntity(java.lang.String) throws java.io.UnsupportedEncodingException;
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
@@ -55843,7 +55875,7 @@
package org.apache.http.impl {
- public abstract class AbstractHttpClientConnection implements org.apache.http.HttpClientConnection {
+ public abstract deprecated class AbstractHttpClientConnection implements org.apache.http.HttpClientConnection {
ctor public AbstractHttpClientConnection();
method protected abstract void assertOpen() throws java.lang.IllegalStateException;
method protected org.apache.http.impl.entity.EntityDeserializer createEntityDeserializer();
@@ -55863,7 +55895,7 @@
method public void sendRequestHeader(org.apache.http.HttpRequest) throws org.apache.http.HttpException, java.io.IOException;
}
- public abstract class AbstractHttpServerConnection implements org.apache.http.HttpServerConnection {
+ public abstract deprecated class AbstractHttpServerConnection implements org.apache.http.HttpServerConnection {
ctor public AbstractHttpServerConnection();
method protected abstract void assertOpen() throws java.lang.IllegalStateException;
method protected org.apache.http.impl.entity.EntityDeserializer createEntityDeserializer();
@@ -55882,24 +55914,24 @@
method public void sendResponseHeader(org.apache.http.HttpResponse) throws org.apache.http.HttpException, java.io.IOException;
}
- public class DefaultConnectionReuseStrategy implements org.apache.http.ConnectionReuseStrategy {
+ public deprecated class DefaultConnectionReuseStrategy implements org.apache.http.ConnectionReuseStrategy {
ctor public DefaultConnectionReuseStrategy();
method protected org.apache.http.TokenIterator createTokenIterator(org.apache.http.HeaderIterator);
method public boolean keepAlive(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
}
- public class DefaultHttpClientConnection extends org.apache.http.impl.SocketHttpClientConnection {
+ public deprecated class DefaultHttpClientConnection extends org.apache.http.impl.SocketHttpClientConnection {
ctor public DefaultHttpClientConnection();
method public void bind(java.net.Socket, org.apache.http.params.HttpParams) throws java.io.IOException;
}
- public class DefaultHttpRequestFactory implements org.apache.http.HttpRequestFactory {
+ public deprecated class DefaultHttpRequestFactory implements org.apache.http.HttpRequestFactory {
ctor public DefaultHttpRequestFactory();
method public org.apache.http.HttpRequest newHttpRequest(org.apache.http.RequestLine) throws org.apache.http.MethodNotSupportedException;
method public org.apache.http.HttpRequest newHttpRequest(java.lang.String, java.lang.String) throws org.apache.http.MethodNotSupportedException;
}
- public class DefaultHttpResponseFactory implements org.apache.http.HttpResponseFactory {
+ public deprecated class DefaultHttpResponseFactory implements org.apache.http.HttpResponseFactory {
ctor public DefaultHttpResponseFactory(org.apache.http.ReasonPhraseCatalog);
ctor public DefaultHttpResponseFactory();
method protected java.util.Locale determineLocale(org.apache.http.protocol.HttpContext);
@@ -55908,18 +55940,18 @@
field protected final org.apache.http.ReasonPhraseCatalog reasonCatalog;
}
- public class DefaultHttpServerConnection extends org.apache.http.impl.SocketHttpServerConnection {
+ public deprecated class DefaultHttpServerConnection extends org.apache.http.impl.SocketHttpServerConnection {
ctor public DefaultHttpServerConnection();
method public void bind(java.net.Socket, org.apache.http.params.HttpParams) throws java.io.IOException;
}
- public class EnglishReasonPhraseCatalog implements org.apache.http.ReasonPhraseCatalog {
+ public deprecated class EnglishReasonPhraseCatalog implements org.apache.http.ReasonPhraseCatalog {
ctor protected EnglishReasonPhraseCatalog();
method public java.lang.String getReason(int, java.util.Locale);
field public static final org.apache.http.impl.EnglishReasonPhraseCatalog INSTANCE;
}
- public class HttpConnectionMetricsImpl implements org.apache.http.HttpConnectionMetrics {
+ public deprecated class HttpConnectionMetricsImpl implements org.apache.http.HttpConnectionMetrics {
ctor public HttpConnectionMetricsImpl(org.apache.http.io.HttpTransportMetrics, org.apache.http.io.HttpTransportMetrics);
method public java.lang.Object getMetric(java.lang.String);
method public long getReceivedBytesCount();
@@ -55936,12 +55968,12 @@
field public static final java.lang.String SENT_BYTES_COUNT = "http.sent-bytes-count";
}
- public class NoConnectionReuseStrategy implements org.apache.http.ConnectionReuseStrategy {
+ public deprecated class NoConnectionReuseStrategy implements org.apache.http.ConnectionReuseStrategy {
ctor public NoConnectionReuseStrategy();
method public boolean keepAlive(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
}
- public class SocketHttpClientConnection extends org.apache.http.impl.AbstractHttpClientConnection implements org.apache.http.HttpInetConnection {
+ public deprecated class SocketHttpClientConnection extends org.apache.http.impl.AbstractHttpClientConnection implements org.apache.http.HttpInetConnection {
ctor public SocketHttpClientConnection();
method protected void assertNotOpen();
method protected void assertOpen();
@@ -55960,7 +55992,7 @@
method public void shutdown() throws java.io.IOException;
}
- public class SocketHttpServerConnection extends org.apache.http.impl.AbstractHttpServerConnection implements org.apache.http.HttpInetConnection {
+ public deprecated class SocketHttpServerConnection extends org.apache.http.impl.AbstractHttpServerConnection implements org.apache.http.HttpInetConnection {
ctor public SocketHttpServerConnection();
method protected void assertNotOpen();
method protected void assertOpen();
@@ -55983,14 +56015,14 @@
package org.apache.http.impl.auth {
- public abstract class AuthSchemeBase implements org.apache.http.auth.AuthScheme {
+ public abstract deprecated class AuthSchemeBase implements org.apache.http.auth.AuthScheme {
ctor public AuthSchemeBase();
method public boolean isProxy();
method protected abstract void parseChallenge(org.apache.http.util.CharArrayBuffer, int, int) throws org.apache.http.auth.MalformedChallengeException;
method public void processChallenge(org.apache.http.Header) throws org.apache.http.auth.MalformedChallengeException;
}
- public class BasicScheme extends org.apache.http.impl.auth.RFC2617Scheme {
+ public deprecated class BasicScheme extends org.apache.http.impl.auth.RFC2617Scheme {
ctor public BasicScheme();
method public org.apache.http.Header authenticate(org.apache.http.auth.Credentials, org.apache.http.HttpRequest) throws org.apache.http.auth.AuthenticationException;
method public static org.apache.http.Header authenticate(org.apache.http.auth.Credentials, java.lang.String, boolean);
@@ -55999,12 +56031,12 @@
method public boolean isConnectionBased();
}
- public class BasicSchemeFactory implements org.apache.http.auth.AuthSchemeFactory {
+ public deprecated class BasicSchemeFactory implements org.apache.http.auth.AuthSchemeFactory {
ctor public BasicSchemeFactory();
method public org.apache.http.auth.AuthScheme newInstance(org.apache.http.params.HttpParams);
}
- public class DigestScheme extends org.apache.http.impl.auth.RFC2617Scheme {
+ public deprecated class DigestScheme extends org.apache.http.impl.auth.RFC2617Scheme {
ctor public DigestScheme();
method public org.apache.http.Header authenticate(org.apache.http.auth.Credentials, org.apache.http.HttpRequest) throws org.apache.http.auth.AuthenticationException;
method public static java.lang.String createCnonce();
@@ -56014,23 +56046,23 @@
method public void overrideParamter(java.lang.String, java.lang.String);
}
- public class DigestSchemeFactory implements org.apache.http.auth.AuthSchemeFactory {
+ public deprecated class DigestSchemeFactory implements org.apache.http.auth.AuthSchemeFactory {
ctor public DigestSchemeFactory();
method public org.apache.http.auth.AuthScheme newInstance(org.apache.http.params.HttpParams);
}
- public abstract interface NTLMEngine {
+ public abstract deprecated interface NTLMEngine {
method public abstract java.lang.String generateType1Msg(java.lang.String, java.lang.String) throws org.apache.http.impl.auth.NTLMEngineException;
method public abstract java.lang.String generateType3Msg(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws org.apache.http.impl.auth.NTLMEngineException;
}
- public class NTLMEngineException extends org.apache.http.auth.AuthenticationException {
+ public deprecated class NTLMEngineException extends org.apache.http.auth.AuthenticationException {
ctor public NTLMEngineException();
ctor public NTLMEngineException(java.lang.String);
ctor public NTLMEngineException(java.lang.String, java.lang.Throwable);
}
- public class NTLMScheme extends org.apache.http.impl.auth.AuthSchemeBase {
+ public deprecated class NTLMScheme extends org.apache.http.impl.auth.AuthSchemeBase {
ctor public NTLMScheme(org.apache.http.impl.auth.NTLMEngine);
method public org.apache.http.Header authenticate(org.apache.http.auth.Credentials, org.apache.http.HttpRequest) throws org.apache.http.auth.AuthenticationException;
method public java.lang.String getParameter(java.lang.String);
@@ -56041,7 +56073,7 @@
method protected void parseChallenge(org.apache.http.util.CharArrayBuffer, int, int) throws org.apache.http.auth.MalformedChallengeException;
}
- public abstract class RFC2617Scheme extends org.apache.http.impl.auth.AuthSchemeBase {
+ public abstract deprecated class RFC2617Scheme extends org.apache.http.impl.auth.AuthSchemeBase {
ctor public RFC2617Scheme();
method public java.lang.String getParameter(java.lang.String);
method protected java.util.Map<java.lang.String, java.lang.String> getParameters();
@@ -56049,7 +56081,7 @@
method protected void parseChallenge(org.apache.http.util.CharArrayBuffer, int, int) throws org.apache.http.auth.MalformedChallengeException;
}
- public class UnsupportedDigestAlgorithmException extends java.lang.RuntimeException {
+ public deprecated class UnsupportedDigestAlgorithmException extends java.lang.RuntimeException {
ctor public UnsupportedDigestAlgorithmException();
ctor public UnsupportedDigestAlgorithmException(java.lang.String);
ctor public UnsupportedDigestAlgorithmException(java.lang.String, java.lang.Throwable);
@@ -56059,14 +56091,14 @@
package org.apache.http.impl.client {
- public abstract class AbstractAuthenticationHandler implements org.apache.http.client.AuthenticationHandler {
+ public abstract deprecated class AbstractAuthenticationHandler implements org.apache.http.client.AuthenticationHandler {
ctor public AbstractAuthenticationHandler();
method protected java.util.List<java.lang.String> getAuthPreferences();
method protected java.util.Map<java.lang.String, org.apache.http.Header> parseChallenges(org.apache.http.Header[]) throws org.apache.http.auth.MalformedChallengeException;
method public org.apache.http.auth.AuthScheme selectScheme(java.util.Map<java.lang.String, org.apache.http.Header>, org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.auth.AuthenticationException;
}
- public abstract class AbstractHttpClient implements org.apache.http.client.HttpClient {
+ public abstract deprecated class AbstractHttpClient implements org.apache.http.client.HttpClient {
ctor protected AbstractHttpClient(org.apache.http.conn.ClientConnectionManager, org.apache.http.params.HttpParams);
method public synchronized void addRequestInterceptor(org.apache.http.HttpRequestInterceptor);
method public synchronized void addRequestInterceptor(org.apache.http.HttpRequestInterceptor, int);
@@ -56138,7 +56170,7 @@
method public synchronized void setUserTokenHandler(org.apache.http.client.UserTokenHandler);
}
- public class BasicCookieStore implements org.apache.http.client.CookieStore {
+ public deprecated class BasicCookieStore implements org.apache.http.client.CookieStore {
ctor public BasicCookieStore();
method public synchronized void addCookie(org.apache.http.cookie.Cookie);
method public synchronized void addCookies(org.apache.http.cookie.Cookie[]);
@@ -56147,19 +56179,19 @@
method public synchronized java.util.List<org.apache.http.cookie.Cookie> getCookies();
}
- public class BasicCredentialsProvider implements org.apache.http.client.CredentialsProvider {
+ public deprecated class BasicCredentialsProvider implements org.apache.http.client.CredentialsProvider {
ctor public BasicCredentialsProvider();
method public synchronized void clear();
method public synchronized org.apache.http.auth.Credentials getCredentials(org.apache.http.auth.AuthScope);
method public synchronized void setCredentials(org.apache.http.auth.AuthScope, org.apache.http.auth.Credentials);
}
- public class BasicResponseHandler implements org.apache.http.client.ResponseHandler {
+ public deprecated class BasicResponseHandler implements org.apache.http.client.ResponseHandler {
ctor public BasicResponseHandler();
method public java.lang.String handleResponse(org.apache.http.HttpResponse) throws org.apache.http.client.HttpResponseException, java.io.IOException;
}
- public class ClientParamsStack extends org.apache.http.params.AbstractHttpParams {
+ public deprecated class ClientParamsStack extends org.apache.http.params.AbstractHttpParams {
ctor public ClientParamsStack(org.apache.http.params.HttpParams, org.apache.http.params.HttpParams, org.apache.http.params.HttpParams, org.apache.http.params.HttpParams);
ctor public ClientParamsStack(org.apache.http.impl.client.ClientParamsStack);
ctor public ClientParamsStack(org.apache.http.impl.client.ClientParamsStack, org.apache.http.params.HttpParams, org.apache.http.params.HttpParams, org.apache.http.params.HttpParams, org.apache.http.params.HttpParams);
@@ -56177,12 +56209,12 @@
field protected final org.apache.http.params.HttpParams requestParams;
}
- public class DefaultConnectionKeepAliveStrategy implements org.apache.http.conn.ConnectionKeepAliveStrategy {
+ public deprecated class DefaultConnectionKeepAliveStrategy implements org.apache.http.conn.ConnectionKeepAliveStrategy {
ctor public DefaultConnectionKeepAliveStrategy();
method public long getKeepAliveDuration(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
}
- public class DefaultHttpClient extends org.apache.http.impl.client.AbstractHttpClient {
+ public deprecated class DefaultHttpClient extends org.apache.http.impl.client.AbstractHttpClient {
ctor public DefaultHttpClient(org.apache.http.conn.ClientConnectionManager, org.apache.http.params.HttpParams);
ctor public DefaultHttpClient(org.apache.http.params.HttpParams);
ctor public DefaultHttpClient();
@@ -56205,7 +56237,7 @@
method protected org.apache.http.client.UserTokenHandler createUserTokenHandler();
}
- public class DefaultHttpRequestRetryHandler implements org.apache.http.client.HttpRequestRetryHandler {
+ public deprecated class DefaultHttpRequestRetryHandler implements org.apache.http.client.HttpRequestRetryHandler {
ctor public DefaultHttpRequestRetryHandler(int, boolean);
ctor public DefaultHttpRequestRetryHandler();
method public int getRetryCount();
@@ -56213,19 +56245,19 @@
method public boolean retryRequest(java.io.IOException, int, org.apache.http.protocol.HttpContext);
}
- public class DefaultProxyAuthenticationHandler extends org.apache.http.impl.client.AbstractAuthenticationHandler {
+ public deprecated class DefaultProxyAuthenticationHandler extends org.apache.http.impl.client.AbstractAuthenticationHandler {
ctor public DefaultProxyAuthenticationHandler();
method public java.util.Map<java.lang.String, org.apache.http.Header> getChallenges(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.auth.MalformedChallengeException;
method public boolean isAuthenticationRequested(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
}
- public class DefaultRedirectHandler implements org.apache.http.client.RedirectHandler {
+ public deprecated class DefaultRedirectHandler implements org.apache.http.client.RedirectHandler {
ctor public DefaultRedirectHandler();
method public java.net.URI getLocationURI(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.ProtocolException;
method public boolean isRedirectRequested(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
}
- public class DefaultRequestDirector implements org.apache.http.client.RequestDirector {
+ public deprecated class DefaultRequestDirector implements org.apache.http.client.RequestDirector {
ctor public DefaultRequestDirector(org.apache.http.protocol.HttpRequestExecutor, org.apache.http.conn.ClientConnectionManager, org.apache.http.ConnectionReuseStrategy, org.apache.http.conn.ConnectionKeepAliveStrategy, org.apache.http.conn.routing.HttpRoutePlanner, org.apache.http.protocol.HttpProcessor, org.apache.http.client.HttpRequestRetryHandler, org.apache.http.client.RedirectHandler, org.apache.http.client.AuthenticationHandler, org.apache.http.client.AuthenticationHandler, org.apache.http.client.UserTokenHandler, org.apache.http.params.HttpParams);
method protected org.apache.http.HttpRequest createConnectRequest(org.apache.http.conn.routing.HttpRoute, org.apache.http.protocol.HttpContext);
method protected boolean createTunnelToProxy(org.apache.http.conn.routing.HttpRoute, int, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
@@ -56248,32 +56280,32 @@
field protected final org.apache.http.conn.routing.HttpRoutePlanner routePlanner;
}
- public class DefaultTargetAuthenticationHandler extends org.apache.http.impl.client.AbstractAuthenticationHandler {
+ public deprecated class DefaultTargetAuthenticationHandler extends org.apache.http.impl.client.AbstractAuthenticationHandler {
ctor public DefaultTargetAuthenticationHandler();
method public java.util.Map<java.lang.String, org.apache.http.Header> getChallenges(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.auth.MalformedChallengeException;
method public boolean isAuthenticationRequested(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext);
}
- public class DefaultUserTokenHandler implements org.apache.http.client.UserTokenHandler {
+ public deprecated class DefaultUserTokenHandler implements org.apache.http.client.UserTokenHandler {
ctor public DefaultUserTokenHandler();
method public java.lang.Object getUserToken(org.apache.http.protocol.HttpContext);
}
- public class EntityEnclosingRequestWrapper extends org.apache.http.impl.client.RequestWrapper implements org.apache.http.HttpEntityEnclosingRequest {
+ public deprecated class EntityEnclosingRequestWrapper extends org.apache.http.impl.client.RequestWrapper implements org.apache.http.HttpEntityEnclosingRequest {
ctor public EntityEnclosingRequestWrapper(org.apache.http.HttpEntityEnclosingRequest) throws org.apache.http.ProtocolException;
method public boolean expectContinue();
method public org.apache.http.HttpEntity getEntity();
method public void setEntity(org.apache.http.HttpEntity);
}
- public class RedirectLocations {
+ public deprecated class RedirectLocations {
ctor public RedirectLocations();
method public void add(java.net.URI);
method public boolean contains(java.net.URI);
method public boolean remove(java.net.URI);
}
- public class RequestWrapper extends org.apache.http.message.AbstractHttpMessage implements org.apache.http.client.methods.HttpUriRequest {
+ public deprecated class RequestWrapper extends org.apache.http.message.AbstractHttpMessage implements org.apache.http.client.methods.HttpUriRequest {
ctor public RequestWrapper(org.apache.http.HttpRequest) throws org.apache.http.ProtocolException;
method public void abort() throws java.lang.UnsupportedOperationException;
method public int getExecCount();
@@ -56291,7 +56323,7 @@
method public void setURI(java.net.URI);
}
- public class RoutedRequest {
+ public deprecated class RoutedRequest {
ctor public RoutedRequest(org.apache.http.impl.client.RequestWrapper, org.apache.http.conn.routing.HttpRoute);
method public final org.apache.http.impl.client.RequestWrapper getRequest();
method public final org.apache.http.conn.routing.HttpRoute getRoute();
@@ -56299,7 +56331,7 @@
field protected final org.apache.http.conn.routing.HttpRoute route;
}
- public class TunnelRefusedException extends org.apache.http.HttpException {
+ public deprecated class TunnelRefusedException extends org.apache.http.HttpException {
ctor public TunnelRefusedException(java.lang.String, org.apache.http.HttpResponse);
method public org.apache.http.HttpResponse getResponse();
}
@@ -56308,7 +56340,7 @@
package org.apache.http.impl.conn {
- public abstract class AbstractClientConnAdapter implements org.apache.http.conn.ManagedClientConnection {
+ public abstract deprecated class AbstractClientConnAdapter implements org.apache.http.conn.ManagedClientConnection {
ctor protected AbstractClientConnAdapter(org.apache.http.conn.ClientConnectionManager, org.apache.http.conn.OperatedClientConnection);
method public void abortConnection();
method protected final void assertNotAborted() throws java.io.InterruptedIOException;
@@ -56340,7 +56372,7 @@
method public void unmarkReusable();
}
- public abstract class AbstractPoolEntry {
+ public abstract deprecated class AbstractPoolEntry {
ctor protected AbstractPoolEntry(org.apache.http.conn.ClientConnectionOperator, org.apache.http.conn.routing.HttpRoute);
method public java.lang.Object getState();
method public void layerProtocol(org.apache.http.protocol.HttpContext, org.apache.http.params.HttpParams) throws java.io.IOException;
@@ -56356,7 +56388,7 @@
field protected volatile org.apache.http.conn.routing.RouteTracker tracker;
}
- public abstract class AbstractPooledConnAdapter extends org.apache.http.impl.conn.AbstractClientConnAdapter {
+ public abstract deprecated class AbstractPooledConnAdapter extends org.apache.http.impl.conn.AbstractClientConnAdapter {
ctor protected AbstractPooledConnAdapter(org.apache.http.conn.ClientConnectionManager, org.apache.http.impl.conn.AbstractPoolEntry);
method protected final void assertAttached();
method public void close() throws java.io.IOException;
@@ -56371,7 +56403,7 @@
field protected volatile org.apache.http.impl.conn.AbstractPoolEntry poolEntry;
}
- public class DefaultClientConnection extends org.apache.http.impl.SocketHttpClientConnection implements org.apache.http.conn.OperatedClientConnection {
+ public deprecated class DefaultClientConnection extends org.apache.http.impl.SocketHttpClientConnection implements org.apache.http.conn.OperatedClientConnection {
ctor public DefaultClientConnection();
method public final java.net.Socket getSocket();
method public final org.apache.http.HttpHost getTargetHost();
@@ -56381,7 +56413,7 @@
method public void update(java.net.Socket, org.apache.http.HttpHost, boolean, org.apache.http.params.HttpParams) throws java.io.IOException;
}
- public class DefaultClientConnectionOperator implements org.apache.http.conn.ClientConnectionOperator {
+ public deprecated class DefaultClientConnectionOperator implements org.apache.http.conn.ClientConnectionOperator {
ctor public DefaultClientConnectionOperator(org.apache.http.conn.scheme.SchemeRegistry);
method public org.apache.http.conn.OperatedClientConnection createConnection();
method public void openConnection(org.apache.http.conn.OperatedClientConnection, org.apache.http.HttpHost, java.net.InetAddress, org.apache.http.protocol.HttpContext, org.apache.http.params.HttpParams) throws java.io.IOException;
@@ -56390,18 +56422,18 @@
field protected org.apache.http.conn.scheme.SchemeRegistry schemeRegistry;
}
- public class DefaultHttpRoutePlanner implements org.apache.http.conn.routing.HttpRoutePlanner {
+ public deprecated class DefaultHttpRoutePlanner implements org.apache.http.conn.routing.HttpRoutePlanner {
ctor public DefaultHttpRoutePlanner(org.apache.http.conn.scheme.SchemeRegistry);
method public org.apache.http.conn.routing.HttpRoute determineRoute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException;
field protected org.apache.http.conn.scheme.SchemeRegistry schemeRegistry;
}
- public class DefaultResponseParser extends org.apache.http.impl.io.AbstractMessageParser {
+ public deprecated class DefaultResponseParser extends org.apache.http.impl.io.AbstractMessageParser {
ctor public DefaultResponseParser(org.apache.http.io.SessionInputBuffer, org.apache.http.message.LineParser, org.apache.http.HttpResponseFactory, org.apache.http.params.HttpParams);
method protected org.apache.http.HttpMessage parseHead(org.apache.http.io.SessionInputBuffer) throws org.apache.http.HttpException, java.io.IOException;
}
- public class IdleConnectionHandler {
+ public deprecated class IdleConnectionHandler {
ctor public IdleConnectionHandler();
method public void add(org.apache.http.HttpConnection, long, java.util.concurrent.TimeUnit);
method public void closeExpiredConnections();
@@ -56410,7 +56442,7 @@
method public void removeAll();
}
- public class LoggingSessionInputBuffer implements org.apache.http.io.SessionInputBuffer {
+ public deprecated class LoggingSessionInputBuffer implements org.apache.http.io.SessionInputBuffer {
ctor public LoggingSessionInputBuffer(org.apache.http.io.SessionInputBuffer, org.apache.http.impl.conn.Wire);
method public org.apache.http.io.HttpTransportMetrics getMetrics();
method public boolean isDataAvailable(int) throws java.io.IOException;
@@ -56421,7 +56453,7 @@
method public int readLine(org.apache.http.util.CharArrayBuffer) throws java.io.IOException;
}
- public class LoggingSessionOutputBuffer implements org.apache.http.io.SessionOutputBuffer {
+ public deprecated class LoggingSessionOutputBuffer implements org.apache.http.io.SessionOutputBuffer {
ctor public LoggingSessionOutputBuffer(org.apache.http.io.SessionOutputBuffer, org.apache.http.impl.conn.Wire);
method public void flush() throws java.io.IOException;
method public org.apache.http.io.HttpTransportMetrics getMetrics();
@@ -56432,7 +56464,7 @@
method public void writeLine(java.lang.String) throws java.io.IOException;
}
- public class ProxySelectorRoutePlanner implements org.apache.http.conn.routing.HttpRoutePlanner {
+ public deprecated class ProxySelectorRoutePlanner implements org.apache.http.conn.routing.HttpRoutePlanner {
ctor public ProxySelectorRoutePlanner(org.apache.http.conn.scheme.SchemeRegistry, java.net.ProxySelector);
method protected java.net.Proxy chooseProxy(java.util.List<java.net.Proxy>, org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext);
method protected org.apache.http.HttpHost determineProxy(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException;
@@ -56444,7 +56476,7 @@
field protected org.apache.http.conn.scheme.SchemeRegistry schemeRegistry;
}
- public class SingleClientConnManager implements org.apache.http.conn.ClientConnectionManager {
+ public deprecated class SingleClientConnManager implements org.apache.http.conn.ClientConnectionManager {
ctor public SingleClientConnManager(org.apache.http.params.HttpParams, org.apache.http.conn.scheme.SchemeRegistry);
method protected final void assertStillUp() throws java.lang.IllegalStateException;
method public void closeExpiredConnections();
@@ -56477,7 +56509,7 @@
method protected void shutdown() throws java.io.IOException;
}
- public class Wire {
+ public deprecated class Wire {
ctor public Wire(org.apache.commons.logging.Log);
method public boolean enabled();
method public void input(java.io.InputStream) throws java.io.IOException;
@@ -56496,7 +56528,7 @@
package org.apache.http.impl.conn.tsccm {
- public abstract class AbstractConnPool implements org.apache.http.impl.conn.tsccm.RefQueueHandler {
+ public abstract deprecated class AbstractConnPool implements org.apache.http.impl.conn.tsccm.RefQueueHandler {
ctor protected AbstractConnPool();
method protected void closeConnection(org.apache.http.conn.OperatedClientConnection);
method public void closeExpiredConnections();
@@ -56517,24 +56549,24 @@
field protected java.lang.ref.ReferenceQueue refQueue;
}
- public class BasicPoolEntry extends org.apache.http.impl.conn.AbstractPoolEntry {
+ public deprecated class BasicPoolEntry extends org.apache.http.impl.conn.AbstractPoolEntry {
ctor public BasicPoolEntry(org.apache.http.conn.ClientConnectionOperator, org.apache.http.conn.routing.HttpRoute, java.lang.ref.ReferenceQueue<java.lang.Object>);
method protected final org.apache.http.conn.OperatedClientConnection getConnection();
method protected final org.apache.http.conn.routing.HttpRoute getPlannedRoute();
method protected final org.apache.http.impl.conn.tsccm.BasicPoolEntryRef getWeakRef();
}
- public class BasicPoolEntryRef extends java.lang.ref.WeakReference {
+ public deprecated class BasicPoolEntryRef extends java.lang.ref.WeakReference {
ctor public BasicPoolEntryRef(org.apache.http.impl.conn.tsccm.BasicPoolEntry, java.lang.ref.ReferenceQueue<java.lang.Object>);
method public final org.apache.http.conn.routing.HttpRoute getRoute();
}
- public class BasicPooledConnAdapter extends org.apache.http.impl.conn.AbstractPooledConnAdapter {
+ public deprecated class BasicPooledConnAdapter extends org.apache.http.impl.conn.AbstractPooledConnAdapter {
ctor protected BasicPooledConnAdapter(org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager, org.apache.http.impl.conn.AbstractPoolEntry);
method protected org.apache.http.impl.conn.AbstractPoolEntry getPoolEntry();
}
- public class ConnPoolByRoute extends org.apache.http.impl.conn.tsccm.AbstractConnPool {
+ public deprecated class ConnPoolByRoute extends org.apache.http.impl.conn.tsccm.AbstractConnPool {
ctor public ConnPoolByRoute(org.apache.http.conn.ClientConnectionOperator, org.apache.http.params.HttpParams);
method protected org.apache.http.impl.conn.tsccm.BasicPoolEntry createEntry(org.apache.http.impl.conn.tsccm.RouteSpecificPool, org.apache.http.conn.ClientConnectionOperator);
method protected java.util.Queue<org.apache.http.impl.conn.tsccm.BasicPoolEntry> createFreeConnQueue();
@@ -56560,16 +56592,16 @@
field protected java.util.Queue waitingThreads;
}
- public abstract interface PoolEntryRequest {
+ public abstract deprecated interface PoolEntryRequest {
method public abstract void abortRequest();
method public abstract org.apache.http.impl.conn.tsccm.BasicPoolEntry getPoolEntry(long, java.util.concurrent.TimeUnit) throws org.apache.http.conn.ConnectionPoolTimeoutException, java.lang.InterruptedException;
}
- public abstract interface RefQueueHandler {
+ public abstract deprecated interface RefQueueHandler {
method public abstract void handleReference(java.lang.ref.Reference<?>);
}
- public class RefQueueWorker implements java.lang.Runnable {
+ public deprecated class RefQueueWorker implements java.lang.Runnable {
ctor public RefQueueWorker(java.lang.ref.ReferenceQueue<?>, org.apache.http.impl.conn.tsccm.RefQueueHandler);
method public void run();
method public void shutdown();
@@ -56578,7 +56610,7 @@
field protected volatile java.lang.Thread workerThread;
}
- public class RouteSpecificPool {
+ public deprecated class RouteSpecificPool {
ctor public RouteSpecificPool(org.apache.http.conn.routing.HttpRoute, int);
method public org.apache.http.impl.conn.tsccm.BasicPoolEntry allocEntry(java.lang.Object);
method public void createdEntry(org.apache.http.impl.conn.tsccm.BasicPoolEntry);
@@ -56601,7 +56633,7 @@
field protected final java.util.Queue waitingThreads;
}
- public class ThreadSafeClientConnManager implements org.apache.http.conn.ClientConnectionManager {
+ public deprecated class ThreadSafeClientConnManager implements org.apache.http.conn.ClientConnectionManager {
ctor public ThreadSafeClientConnManager(org.apache.http.params.HttpParams, org.apache.http.conn.scheme.SchemeRegistry);
method public void closeExpiredConnections();
method public void closeIdleConnections(long, java.util.concurrent.TimeUnit);
@@ -56618,7 +56650,7 @@
field protected org.apache.http.conn.scheme.SchemeRegistry schemeRegistry;
}
- public class WaitingThread {
+ public deprecated class WaitingThread {
ctor public WaitingThread(java.util.concurrent.locks.Condition, org.apache.http.impl.conn.tsccm.RouteSpecificPool);
method public boolean await(java.util.Date) throws java.lang.InterruptedException;
method public final java.util.concurrent.locks.Condition getCondition();
@@ -56628,7 +56660,7 @@
method public void wakeup();
}
- public class WaitingThreadAborter {
+ public deprecated class WaitingThreadAborter {
ctor public WaitingThreadAborter();
method public void abort();
method public void setWaitingThread(org.apache.http.impl.conn.tsccm.WaitingThread);
@@ -56638,13 +56670,13 @@
package org.apache.http.impl.cookie {
- public abstract class AbstractCookieAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
+ public abstract deprecated class AbstractCookieAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
ctor public AbstractCookieAttributeHandler();
method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
}
- public abstract class AbstractCookieSpec implements org.apache.http.cookie.CookieSpec {
+ public abstract deprecated class AbstractCookieSpec implements org.apache.http.cookie.CookieSpec {
ctor public AbstractCookieSpec();
method protected org.apache.http.cookie.CookieAttributeHandler findAttribHandler(java.lang.String);
method protected org.apache.http.cookie.CookieAttributeHandler getAttribHandler(java.lang.String);
@@ -56652,7 +56684,7 @@
method public void registerAttribHandler(java.lang.String, org.apache.http.cookie.CookieAttributeHandler);
}
- public class BasicClientCookie implements org.apache.http.cookie.ClientCookie java.lang.Cloneable org.apache.http.cookie.SetCookie {
+ public deprecated class BasicClientCookie implements org.apache.http.cookie.ClientCookie java.lang.Cloneable org.apache.http.cookie.SetCookie {
ctor public BasicClientCookie(java.lang.String, java.lang.String);
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
method public boolean containsAttribute(java.lang.String);
@@ -56679,48 +56711,48 @@
method public void setVersion(int);
}
- public class BasicClientCookie2 extends org.apache.http.impl.cookie.BasicClientCookie implements org.apache.http.cookie.SetCookie2 {
+ public deprecated class BasicClientCookie2 extends org.apache.http.impl.cookie.BasicClientCookie implements org.apache.http.cookie.SetCookie2 {
ctor public BasicClientCookie2(java.lang.String, java.lang.String);
method public void setCommentURL(java.lang.String);
method public void setDiscard(boolean);
method public void setPorts(int[]);
}
- public class BasicCommentHandler extends org.apache.http.impl.cookie.AbstractCookieAttributeHandler {
+ public deprecated class BasicCommentHandler extends org.apache.http.impl.cookie.AbstractCookieAttributeHandler {
ctor public BasicCommentHandler();
method public void parse(org.apache.http.cookie.SetCookie, java.lang.String) throws org.apache.http.cookie.MalformedCookieException;
}
- public class BasicDomainHandler implements org.apache.http.cookie.CookieAttributeHandler {
+ public deprecated class BasicDomainHandler implements org.apache.http.cookie.CookieAttributeHandler {
ctor public BasicDomainHandler();
method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
method public void parse(org.apache.http.cookie.SetCookie, java.lang.String) throws org.apache.http.cookie.MalformedCookieException;
method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
}
- public class BasicExpiresHandler extends org.apache.http.impl.cookie.AbstractCookieAttributeHandler {
+ public deprecated class BasicExpiresHandler extends org.apache.http.impl.cookie.AbstractCookieAttributeHandler {
ctor public BasicExpiresHandler(java.lang.String[]);
method public void parse(org.apache.http.cookie.SetCookie, java.lang.String) throws org.apache.http.cookie.MalformedCookieException;
}
- public class BasicMaxAgeHandler extends org.apache.http.impl.cookie.AbstractCookieAttributeHandler {
+ public deprecated class BasicMaxAgeHandler extends org.apache.http.impl.cookie.AbstractCookieAttributeHandler {
ctor public BasicMaxAgeHandler();
method public void parse(org.apache.http.cookie.SetCookie, java.lang.String) throws org.apache.http.cookie.MalformedCookieException;
}
- public class BasicPathHandler implements org.apache.http.cookie.CookieAttributeHandler {
+ public deprecated class BasicPathHandler implements org.apache.http.cookie.CookieAttributeHandler {
ctor public BasicPathHandler();
method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
method public void parse(org.apache.http.cookie.SetCookie, java.lang.String) throws org.apache.http.cookie.MalformedCookieException;
method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
}
- public class BasicSecureHandler extends org.apache.http.impl.cookie.AbstractCookieAttributeHandler {
+ public deprecated class BasicSecureHandler extends org.apache.http.impl.cookie.AbstractCookieAttributeHandler {
ctor public BasicSecureHandler();
method public void parse(org.apache.http.cookie.SetCookie, java.lang.String) throws org.apache.http.cookie.MalformedCookieException;
}
- public class BestMatchSpec implements org.apache.http.cookie.CookieSpec {
+ public deprecated class BestMatchSpec implements org.apache.http.cookie.CookieSpec {
ctor public BestMatchSpec(java.lang.String[], boolean);
ctor public BestMatchSpec();
method public java.util.List<org.apache.http.Header> formatCookies(java.util.List<org.apache.http.cookie.Cookie>);
@@ -56731,12 +56763,12 @@
method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
}
- public class BestMatchSpecFactory implements org.apache.http.cookie.CookieSpecFactory {
+ public deprecated class BestMatchSpecFactory implements org.apache.http.cookie.CookieSpecFactory {
ctor public BestMatchSpecFactory();
method public org.apache.http.cookie.CookieSpec newInstance(org.apache.http.params.HttpParams);
}
- public class BrowserCompatSpec extends org.apache.http.impl.cookie.CookieSpecBase {
+ public deprecated class BrowserCompatSpec extends org.apache.http.impl.cookie.CookieSpecBase {
ctor public BrowserCompatSpec(java.lang.String[]);
ctor public BrowserCompatSpec();
method public java.util.List<org.apache.http.Header> formatCookies(java.util.List<org.apache.http.cookie.Cookie>);
@@ -56746,12 +56778,12 @@
field protected static final java.lang.String[] DATE_PATTERNS;
}
- public class BrowserCompatSpecFactory implements org.apache.http.cookie.CookieSpecFactory {
+ public deprecated class BrowserCompatSpecFactory implements org.apache.http.cookie.CookieSpecFactory {
ctor public BrowserCompatSpecFactory();
method public org.apache.http.cookie.CookieSpec newInstance(org.apache.http.params.HttpParams);
}
- public abstract class CookieSpecBase extends org.apache.http.impl.cookie.AbstractCookieSpec {
+ public abstract deprecated class CookieSpecBase extends org.apache.http.impl.cookie.AbstractCookieSpec {
ctor public CookieSpecBase();
method protected static java.lang.String getDefaultDomain(org.apache.http.cookie.CookieOrigin);
method protected static java.lang.String getDefaultPath(org.apache.http.cookie.CookieOrigin);
@@ -56760,12 +56792,12 @@
method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
}
- public class DateParseException extends java.lang.Exception {
+ public deprecated class DateParseException extends java.lang.Exception {
ctor public DateParseException();
ctor public DateParseException(java.lang.String);
}
- public final class DateUtils {
+ public final deprecated class DateUtils {
method public static java.lang.String formatDate(java.util.Date);
method public static java.lang.String formatDate(java.util.Date, java.lang.String);
method public static java.util.Date parseDate(java.lang.String) throws org.apache.http.impl.cookie.DateParseException;
@@ -56777,17 +56809,17 @@
field public static final java.lang.String PATTERN_RFC1123 = "EEE, dd MMM yyyy HH:mm:ss zzz";
}
- public class NetscapeDomainHandler extends org.apache.http.impl.cookie.BasicDomainHandler {
+ public deprecated class NetscapeDomainHandler extends org.apache.http.impl.cookie.BasicDomainHandler {
ctor public NetscapeDomainHandler();
}
- public class NetscapeDraftHeaderParser {
+ public deprecated class NetscapeDraftHeaderParser {
ctor public NetscapeDraftHeaderParser();
method public org.apache.http.HeaderElement parseHeader(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
field public static final org.apache.http.impl.cookie.NetscapeDraftHeaderParser DEFAULT;
}
- public class NetscapeDraftSpec extends org.apache.http.impl.cookie.CookieSpecBase {
+ public deprecated class NetscapeDraftSpec extends org.apache.http.impl.cookie.CookieSpecBase {
ctor public NetscapeDraftSpec(java.lang.String[]);
ctor public NetscapeDraftSpec();
method public java.util.List<org.apache.http.Header> formatCookies(java.util.List<org.apache.http.cookie.Cookie>);
@@ -56797,19 +56829,19 @@
field protected static final java.lang.String EXPIRES_PATTERN = "EEE, dd-MMM-yyyy HH:mm:ss z";
}
- public class NetscapeDraftSpecFactory implements org.apache.http.cookie.CookieSpecFactory {
+ public deprecated class NetscapeDraftSpecFactory implements org.apache.http.cookie.CookieSpecFactory {
ctor public NetscapeDraftSpecFactory();
method public org.apache.http.cookie.CookieSpec newInstance(org.apache.http.params.HttpParams);
}
- public class RFC2109DomainHandler implements org.apache.http.cookie.CookieAttributeHandler {
+ public deprecated class RFC2109DomainHandler implements org.apache.http.cookie.CookieAttributeHandler {
ctor public RFC2109DomainHandler();
method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
method public void parse(org.apache.http.cookie.SetCookie, java.lang.String) throws org.apache.http.cookie.MalformedCookieException;
method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
}
- public class RFC2109Spec extends org.apache.http.impl.cookie.CookieSpecBase {
+ public deprecated class RFC2109Spec extends org.apache.http.impl.cookie.CookieSpecBase {
ctor public RFC2109Spec(java.lang.String[], boolean);
ctor public RFC2109Spec();
method protected void formatCookieAsVer(org.apache.http.util.CharArrayBuffer, org.apache.http.cookie.Cookie, int);
@@ -56820,31 +56852,31 @@
method public java.util.List<org.apache.http.cookie.Cookie> parse(org.apache.http.Header, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
}
- public class RFC2109SpecFactory implements org.apache.http.cookie.CookieSpecFactory {
+ public deprecated class RFC2109SpecFactory implements org.apache.http.cookie.CookieSpecFactory {
ctor public RFC2109SpecFactory();
method public org.apache.http.cookie.CookieSpec newInstance(org.apache.http.params.HttpParams);
}
- public class RFC2109VersionHandler extends org.apache.http.impl.cookie.AbstractCookieAttributeHandler {
+ public deprecated class RFC2109VersionHandler extends org.apache.http.impl.cookie.AbstractCookieAttributeHandler {
ctor public RFC2109VersionHandler();
method public void parse(org.apache.http.cookie.SetCookie, java.lang.String) throws org.apache.http.cookie.MalformedCookieException;
}
- public class RFC2965CommentUrlAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
+ public deprecated class RFC2965CommentUrlAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
ctor public RFC2965CommentUrlAttributeHandler();
method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
method public void parse(org.apache.http.cookie.SetCookie, java.lang.String) throws org.apache.http.cookie.MalformedCookieException;
method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
}
- public class RFC2965DiscardAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
+ public deprecated class RFC2965DiscardAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
ctor public RFC2965DiscardAttributeHandler();
method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
method public void parse(org.apache.http.cookie.SetCookie, java.lang.String) throws org.apache.http.cookie.MalformedCookieException;
method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
}
- public class RFC2965DomainAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
+ public deprecated class RFC2965DomainAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
ctor public RFC2965DomainAttributeHandler();
method public boolean domainMatch(java.lang.String, java.lang.String);
method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
@@ -56852,24 +56884,24 @@
method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
}
- public class RFC2965PortAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
+ public deprecated class RFC2965PortAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
ctor public RFC2965PortAttributeHandler();
method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
method public void parse(org.apache.http.cookie.SetCookie, java.lang.String) throws org.apache.http.cookie.MalformedCookieException;
method public void validate(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin) throws org.apache.http.cookie.MalformedCookieException;
}
- public class RFC2965Spec extends org.apache.http.impl.cookie.RFC2109Spec {
+ public deprecated class RFC2965Spec extends org.apache.http.impl.cookie.RFC2109Spec {
ctor public RFC2965Spec();
ctor public RFC2965Spec(java.lang.String[], boolean);
}
- public class RFC2965SpecFactory implements org.apache.http.cookie.CookieSpecFactory {
+ public deprecated class RFC2965SpecFactory implements org.apache.http.cookie.CookieSpecFactory {
ctor public RFC2965SpecFactory();
method public org.apache.http.cookie.CookieSpec newInstance(org.apache.http.params.HttpParams);
}
- public class RFC2965VersionAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
+ public deprecated class RFC2965VersionAttributeHandler implements org.apache.http.cookie.CookieAttributeHandler {
ctor public RFC2965VersionAttributeHandler();
method public boolean match(org.apache.http.cookie.Cookie, org.apache.http.cookie.CookieOrigin);
method public void parse(org.apache.http.cookie.SetCookie, java.lang.String) throws org.apache.http.cookie.MalformedCookieException;
@@ -56880,24 +56912,24 @@
package org.apache.http.impl.entity {
- public class EntityDeserializer {
+ public deprecated class EntityDeserializer {
ctor public EntityDeserializer(org.apache.http.entity.ContentLengthStrategy);
method public org.apache.http.HttpEntity deserialize(org.apache.http.io.SessionInputBuffer, org.apache.http.HttpMessage) throws org.apache.http.HttpException, java.io.IOException;
method protected org.apache.http.entity.BasicHttpEntity doDeserialize(org.apache.http.io.SessionInputBuffer, org.apache.http.HttpMessage) throws org.apache.http.HttpException, java.io.IOException;
}
- public class EntitySerializer {
+ public deprecated class EntitySerializer {
ctor public EntitySerializer(org.apache.http.entity.ContentLengthStrategy);
method protected java.io.OutputStream doSerialize(org.apache.http.io.SessionOutputBuffer, org.apache.http.HttpMessage) throws org.apache.http.HttpException, java.io.IOException;
method public void serialize(org.apache.http.io.SessionOutputBuffer, org.apache.http.HttpMessage, org.apache.http.HttpEntity) throws org.apache.http.HttpException, java.io.IOException;
}
- public class LaxContentLengthStrategy implements org.apache.http.entity.ContentLengthStrategy {
+ public deprecated class LaxContentLengthStrategy implements org.apache.http.entity.ContentLengthStrategy {
ctor public LaxContentLengthStrategy();
method public long determineLength(org.apache.http.HttpMessage) throws org.apache.http.HttpException;
}
- public class StrictContentLengthStrategy implements org.apache.http.entity.ContentLengthStrategy {
+ public deprecated class StrictContentLengthStrategy implements org.apache.http.entity.ContentLengthStrategy {
ctor public StrictContentLengthStrategy();
method public long determineLength(org.apache.http.HttpMessage) throws org.apache.http.HttpException;
}
@@ -56906,7 +56938,7 @@
package org.apache.http.impl.io {
- public abstract class AbstractMessageParser implements org.apache.http.io.HttpMessageParser {
+ public abstract deprecated class AbstractMessageParser implements org.apache.http.io.HttpMessageParser {
ctor public AbstractMessageParser(org.apache.http.io.SessionInputBuffer, org.apache.http.message.LineParser, org.apache.http.params.HttpParams);
method public org.apache.http.HttpMessage parse() throws org.apache.http.HttpException, java.io.IOException;
method protected abstract org.apache.http.HttpMessage parseHead(org.apache.http.io.SessionInputBuffer) throws org.apache.http.HttpException, java.io.IOException, org.apache.http.ParseException;
@@ -56914,7 +56946,7 @@
field protected final org.apache.http.message.LineParser lineParser;
}
- public abstract class AbstractMessageWriter implements org.apache.http.io.HttpMessageWriter {
+ public abstract deprecated class AbstractMessageWriter implements org.apache.http.io.HttpMessageWriter {
ctor public AbstractMessageWriter(org.apache.http.io.SessionOutputBuffer, org.apache.http.message.LineFormatter, org.apache.http.params.HttpParams);
method public void write(org.apache.http.HttpMessage) throws org.apache.http.HttpException, java.io.IOException;
method protected abstract void writeHeadLine(org.apache.http.HttpMessage) throws java.io.IOException;
@@ -56923,7 +56955,7 @@
field protected final org.apache.http.io.SessionOutputBuffer sessionBuffer;
}
- public abstract class AbstractSessionInputBuffer implements org.apache.http.io.SessionInputBuffer {
+ public abstract deprecated class AbstractSessionInputBuffer implements org.apache.http.io.SessionInputBuffer {
ctor public AbstractSessionInputBuffer();
method protected int fillBuffer() throws java.io.IOException;
method public org.apache.http.io.HttpTransportMetrics getMetrics();
@@ -56936,7 +56968,7 @@
method public java.lang.String readLine() throws java.io.IOException;
}
- public abstract class AbstractSessionOutputBuffer implements org.apache.http.io.SessionOutputBuffer {
+ public abstract deprecated class AbstractSessionOutputBuffer implements org.apache.http.io.SessionOutputBuffer {
ctor public AbstractSessionOutputBuffer();
method public void flush() throws java.io.IOException;
method protected void flushBuffer() throws java.io.IOException;
@@ -56949,13 +56981,13 @@
method public void writeLine(org.apache.http.util.CharArrayBuffer) throws java.io.IOException;
}
- public class ChunkedInputStream extends java.io.InputStream {
+ public deprecated class ChunkedInputStream extends java.io.InputStream {
ctor public ChunkedInputStream(org.apache.http.io.SessionInputBuffer);
method public org.apache.http.Header[] getFooters();
method public int read() throws java.io.IOException;
}
- public class ChunkedOutputStream extends java.io.OutputStream {
+ public deprecated class ChunkedOutputStream extends java.io.OutputStream {
ctor public ChunkedOutputStream(org.apache.http.io.SessionOutputBuffer, int) throws java.io.IOException;
ctor public ChunkedOutputStream(org.apache.http.io.SessionOutputBuffer) throws java.io.IOException;
method public void finish() throws java.io.IOException;
@@ -56965,37 +56997,37 @@
method protected void writeClosingChunk() throws java.io.IOException;
}
- public class ContentLengthInputStream extends java.io.InputStream {
+ public deprecated class ContentLengthInputStream extends java.io.InputStream {
ctor public ContentLengthInputStream(org.apache.http.io.SessionInputBuffer, long);
method public int read() throws java.io.IOException;
}
- public class ContentLengthOutputStream extends java.io.OutputStream {
+ public deprecated class ContentLengthOutputStream extends java.io.OutputStream {
ctor public ContentLengthOutputStream(org.apache.http.io.SessionOutputBuffer, long);
method public void write(int) throws java.io.IOException;
}
- public class HttpRequestParser extends org.apache.http.impl.io.AbstractMessageParser {
+ public deprecated class HttpRequestParser extends org.apache.http.impl.io.AbstractMessageParser {
ctor public HttpRequestParser(org.apache.http.io.SessionInputBuffer, org.apache.http.message.LineParser, org.apache.http.HttpRequestFactory, org.apache.http.params.HttpParams);
method protected org.apache.http.HttpMessage parseHead(org.apache.http.io.SessionInputBuffer) throws org.apache.http.HttpException, java.io.IOException, org.apache.http.ParseException;
}
- public class HttpRequestWriter extends org.apache.http.impl.io.AbstractMessageWriter {
+ public deprecated class HttpRequestWriter extends org.apache.http.impl.io.AbstractMessageWriter {
ctor public HttpRequestWriter(org.apache.http.io.SessionOutputBuffer, org.apache.http.message.LineFormatter, org.apache.http.params.HttpParams);
method protected void writeHeadLine(org.apache.http.HttpMessage) throws java.io.IOException;
}
- public class HttpResponseParser extends org.apache.http.impl.io.AbstractMessageParser {
+ public deprecated class HttpResponseParser extends org.apache.http.impl.io.AbstractMessageParser {
ctor public HttpResponseParser(org.apache.http.io.SessionInputBuffer, org.apache.http.message.LineParser, org.apache.http.HttpResponseFactory, org.apache.http.params.HttpParams);
method protected org.apache.http.HttpMessage parseHead(org.apache.http.io.SessionInputBuffer) throws org.apache.http.HttpException, java.io.IOException, org.apache.http.ParseException;
}
- public class HttpResponseWriter extends org.apache.http.impl.io.AbstractMessageWriter {
+ public deprecated class HttpResponseWriter extends org.apache.http.impl.io.AbstractMessageWriter {
ctor public HttpResponseWriter(org.apache.http.io.SessionOutputBuffer, org.apache.http.message.LineFormatter, org.apache.http.params.HttpParams);
method protected void writeHeadLine(org.apache.http.HttpMessage) throws java.io.IOException;
}
- public class HttpTransportMetricsImpl implements org.apache.http.io.HttpTransportMetrics {
+ public deprecated class HttpTransportMetricsImpl implements org.apache.http.io.HttpTransportMetrics {
ctor public HttpTransportMetricsImpl();
method public long getBytesTransferred();
method public void incrementBytesTransferred(long);
@@ -57003,22 +57035,22 @@
method public void setBytesTransferred(long);
}
- public class IdentityInputStream extends java.io.InputStream {
+ public deprecated class IdentityInputStream extends java.io.InputStream {
ctor public IdentityInputStream(org.apache.http.io.SessionInputBuffer);
method public int read() throws java.io.IOException;
}
- public class IdentityOutputStream extends java.io.OutputStream {
+ public deprecated class IdentityOutputStream extends java.io.OutputStream {
ctor public IdentityOutputStream(org.apache.http.io.SessionOutputBuffer);
method public void write(int) throws java.io.IOException;
}
- public class SocketInputBuffer extends org.apache.http.impl.io.AbstractSessionInputBuffer {
+ public deprecated class SocketInputBuffer extends org.apache.http.impl.io.AbstractSessionInputBuffer {
ctor public SocketInputBuffer(java.net.Socket, int, org.apache.http.params.HttpParams) throws java.io.IOException;
method public boolean isDataAvailable(int) throws java.io.IOException;
}
- public class SocketOutputBuffer extends org.apache.http.impl.io.AbstractSessionOutputBuffer {
+ public deprecated class SocketOutputBuffer extends org.apache.http.impl.io.AbstractSessionOutputBuffer {
ctor public SocketOutputBuffer(java.net.Socket, int, org.apache.http.params.HttpParams) throws java.io.IOException;
}
@@ -57026,20 +57058,20 @@
package org.apache.http.io {
- public abstract interface HttpMessageParser {
+ public abstract deprecated interface HttpMessageParser {
method public abstract org.apache.http.HttpMessage parse() throws org.apache.http.HttpException, java.io.IOException;
}
- public abstract interface HttpMessageWriter {
+ public abstract deprecated interface HttpMessageWriter {
method public abstract void write(org.apache.http.HttpMessage) throws org.apache.http.HttpException, java.io.IOException;
}
- public abstract interface HttpTransportMetrics {
+ public abstract deprecated interface HttpTransportMetrics {
method public abstract long getBytesTransferred();
method public abstract void reset();
}
- public abstract interface SessionInputBuffer {
+ public abstract deprecated interface SessionInputBuffer {
method public abstract org.apache.http.io.HttpTransportMetrics getMetrics();
method public abstract boolean isDataAvailable(int) throws java.io.IOException;
method public abstract int read(byte[], int, int) throws java.io.IOException;
@@ -57049,7 +57081,7 @@
method public abstract java.lang.String readLine() throws java.io.IOException;
}
- public abstract interface SessionOutputBuffer {
+ public abstract deprecated interface SessionOutputBuffer {
method public abstract void flush() throws java.io.IOException;
method public abstract org.apache.http.io.HttpTransportMetrics getMetrics();
method public abstract void write(byte[], int, int) throws java.io.IOException;
@@ -57063,7 +57095,7 @@
package org.apache.http.message {
- public abstract class AbstractHttpMessage implements org.apache.http.HttpMessage {
+ public abstract deprecated class AbstractHttpMessage implements org.apache.http.HttpMessage {
ctor protected AbstractHttpMessage(org.apache.http.params.HttpParams);
ctor protected AbstractHttpMessage();
method public void addHeader(org.apache.http.Header);
@@ -57086,7 +57118,7 @@
field protected org.apache.http.params.HttpParams params;
}
- public class BasicHeader implements java.lang.Cloneable org.apache.http.Header {
+ public deprecated class BasicHeader implements java.lang.Cloneable org.apache.http.Header {
ctor public BasicHeader(java.lang.String, java.lang.String);
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
method public org.apache.http.HeaderElement[] getElements() throws org.apache.http.ParseException;
@@ -57094,7 +57126,7 @@
method public java.lang.String getValue();
}
- public class BasicHeaderElement implements java.lang.Cloneable org.apache.http.HeaderElement {
+ public deprecated class BasicHeaderElement implements java.lang.Cloneable org.apache.http.HeaderElement {
ctor public BasicHeaderElement(java.lang.String, java.lang.String, org.apache.http.NameValuePair[]);
ctor public BasicHeaderElement(java.lang.String, java.lang.String);
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
@@ -57106,7 +57138,7 @@
method public java.lang.String getValue();
}
- public class BasicHeaderElementIterator implements org.apache.http.HeaderElementIterator {
+ public deprecated class BasicHeaderElementIterator implements org.apache.http.HeaderElementIterator {
ctor public BasicHeaderElementIterator(org.apache.http.HeaderIterator, org.apache.http.message.HeaderValueParser);
ctor public BasicHeaderElementIterator(org.apache.http.HeaderIterator);
method public boolean hasNext();
@@ -57115,7 +57147,7 @@
method public void remove() throws java.lang.UnsupportedOperationException;
}
- public class BasicHeaderIterator implements org.apache.http.HeaderIterator {
+ public deprecated class BasicHeaderIterator implements org.apache.http.HeaderIterator {
ctor public BasicHeaderIterator(org.apache.http.Header[], java.lang.String);
method protected boolean filterHeader(int);
method protected int findNext(int);
@@ -57128,7 +57160,7 @@
field protected java.lang.String headerName;
}
- public class BasicHeaderValueFormatter implements org.apache.http.message.HeaderValueFormatter {
+ public deprecated class BasicHeaderValueFormatter implements org.apache.http.message.HeaderValueFormatter {
ctor public BasicHeaderValueFormatter();
method protected void doFormatValue(org.apache.http.util.CharArrayBuffer, java.lang.String, boolean);
method protected int estimateElementsLen(org.apache.http.HeaderElement[]);
@@ -57150,7 +57182,7 @@
field public static final java.lang.String UNSAFE_CHARS = "\"\\";
}
- public class BasicHeaderValueParser implements org.apache.http.message.HeaderValueParser {
+ public deprecated class BasicHeaderValueParser implements org.apache.http.message.HeaderValueParser {
ctor public BasicHeaderValueParser();
method protected org.apache.http.HeaderElement createHeaderElement(java.lang.String, java.lang.String, org.apache.http.NameValuePair[]);
method protected org.apache.http.NameValuePair createNameValuePair(java.lang.String, java.lang.String);
@@ -57166,7 +57198,7 @@
field public static final org.apache.http.message.BasicHeaderValueParser DEFAULT;
}
- public class BasicHttpEntityEnclosingRequest extends org.apache.http.message.BasicHttpRequest implements org.apache.http.HttpEntityEnclosingRequest {
+ public deprecated class BasicHttpEntityEnclosingRequest extends org.apache.http.message.BasicHttpRequest implements org.apache.http.HttpEntityEnclosingRequest {
ctor public BasicHttpEntityEnclosingRequest(java.lang.String, java.lang.String);
ctor public BasicHttpEntityEnclosingRequest(java.lang.String, java.lang.String, org.apache.http.ProtocolVersion);
ctor public BasicHttpEntityEnclosingRequest(org.apache.http.RequestLine);
@@ -57175,7 +57207,7 @@
method public void setEntity(org.apache.http.HttpEntity);
}
- public class BasicHttpRequest extends org.apache.http.message.AbstractHttpMessage implements org.apache.http.HttpRequest {
+ public deprecated class BasicHttpRequest extends org.apache.http.message.AbstractHttpMessage implements org.apache.http.HttpRequest {
ctor public BasicHttpRequest(java.lang.String, java.lang.String);
ctor public BasicHttpRequest(java.lang.String, java.lang.String, org.apache.http.ProtocolVersion);
ctor public BasicHttpRequest(org.apache.http.RequestLine);
@@ -57183,7 +57215,7 @@
method public org.apache.http.RequestLine getRequestLine();
}
- public class BasicHttpResponse extends org.apache.http.message.AbstractHttpMessage implements org.apache.http.HttpResponse {
+ public deprecated class BasicHttpResponse extends org.apache.http.message.AbstractHttpMessage implements org.apache.http.HttpResponse {
ctor public BasicHttpResponse(org.apache.http.StatusLine, org.apache.http.ReasonPhraseCatalog, java.util.Locale);
ctor public BasicHttpResponse(org.apache.http.StatusLine);
ctor public BasicHttpResponse(org.apache.http.ProtocolVersion, int, java.lang.String);
@@ -57201,7 +57233,7 @@
method public void setStatusLine(org.apache.http.ProtocolVersion, int, java.lang.String);
}
- public class BasicLineFormatter implements org.apache.http.message.LineFormatter {
+ public deprecated class BasicLineFormatter implements org.apache.http.message.LineFormatter {
ctor public BasicLineFormatter();
method public org.apache.http.util.CharArrayBuffer appendProtocolVersion(org.apache.http.util.CharArrayBuffer, org.apache.http.ProtocolVersion);
method protected void doFormatHeader(org.apache.http.util.CharArrayBuffer, org.apache.http.Header);
@@ -57219,7 +57251,7 @@
field public static final org.apache.http.message.BasicLineFormatter DEFAULT;
}
- public class BasicLineParser implements org.apache.http.message.LineParser {
+ public deprecated class BasicLineParser implements org.apache.http.message.LineParser {
ctor public BasicLineParser(org.apache.http.ProtocolVersion);
ctor public BasicLineParser();
method protected org.apache.http.ProtocolVersion createProtocolVersion(int, int);
@@ -57239,7 +57271,7 @@
field protected final org.apache.http.ProtocolVersion protocol;
}
- public class BasicListHeaderIterator implements org.apache.http.HeaderIterator {
+ public deprecated class BasicListHeaderIterator implements org.apache.http.HeaderIterator {
ctor public BasicListHeaderIterator(java.util.List, java.lang.String);
method protected boolean filterHeader(int);
method protected int findNext(int);
@@ -57253,14 +57285,14 @@
field protected int lastIndex;
}
- public class BasicNameValuePair implements java.lang.Cloneable org.apache.http.NameValuePair {
+ public deprecated class BasicNameValuePair implements java.lang.Cloneable org.apache.http.NameValuePair {
ctor public BasicNameValuePair(java.lang.String, java.lang.String);
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
method public java.lang.String getName();
method public java.lang.String getValue();
}
- public class BasicRequestLine implements java.lang.Cloneable org.apache.http.RequestLine {
+ public deprecated class BasicRequestLine implements java.lang.Cloneable org.apache.http.RequestLine {
ctor public BasicRequestLine(java.lang.String, java.lang.String, org.apache.http.ProtocolVersion);
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
method public java.lang.String getMethod();
@@ -57268,7 +57300,7 @@
method public java.lang.String getUri();
}
- public class BasicStatusLine implements java.lang.Cloneable org.apache.http.StatusLine {
+ public deprecated class BasicStatusLine implements java.lang.Cloneable org.apache.http.StatusLine {
ctor public BasicStatusLine(org.apache.http.ProtocolVersion, int, java.lang.String);
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
method public org.apache.http.ProtocolVersion getProtocolVersion();
@@ -57276,7 +57308,7 @@
method public int getStatusCode();
}
- public class BasicTokenIterator implements org.apache.http.TokenIterator {
+ public deprecated class BasicTokenIterator implements org.apache.http.TokenIterator {
ctor public BasicTokenIterator(org.apache.http.HeaderIterator);
method protected java.lang.String createToken(java.lang.String, int, int);
method protected int findNext(int) throws org.apache.http.ParseException;
@@ -57298,7 +57330,7 @@
field protected int searchPos;
}
- public class BufferedHeader implements java.lang.Cloneable org.apache.http.FormattedHeader {
+ public deprecated class BufferedHeader implements java.lang.Cloneable org.apache.http.FormattedHeader {
ctor public BufferedHeader(org.apache.http.util.CharArrayBuffer) throws org.apache.http.ParseException;
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
method public org.apache.http.util.CharArrayBuffer getBuffer();
@@ -57308,7 +57340,7 @@
method public int getValuePos();
}
- public class HeaderGroup implements java.lang.Cloneable {
+ public deprecated class HeaderGroup implements java.lang.Cloneable {
ctor public HeaderGroup();
method public void addHeader(org.apache.http.Header);
method public void clear();
@@ -57327,28 +57359,28 @@
method public void updateHeader(org.apache.http.Header);
}
- public abstract interface HeaderValueFormatter {
+ public abstract deprecated interface HeaderValueFormatter {
method public abstract org.apache.http.util.CharArrayBuffer formatElements(org.apache.http.util.CharArrayBuffer, org.apache.http.HeaderElement[], boolean);
method public abstract org.apache.http.util.CharArrayBuffer formatHeaderElement(org.apache.http.util.CharArrayBuffer, org.apache.http.HeaderElement, boolean);
method public abstract org.apache.http.util.CharArrayBuffer formatNameValuePair(org.apache.http.util.CharArrayBuffer, org.apache.http.NameValuePair, boolean);
method public abstract org.apache.http.util.CharArrayBuffer formatParameters(org.apache.http.util.CharArrayBuffer, org.apache.http.NameValuePair[], boolean);
}
- public abstract interface HeaderValueParser {
+ public abstract deprecated interface HeaderValueParser {
method public abstract org.apache.http.HeaderElement[] parseElements(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
method public abstract org.apache.http.HeaderElement parseHeaderElement(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
method public abstract org.apache.http.NameValuePair parseNameValuePair(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
method public abstract org.apache.http.NameValuePair[] parseParameters(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
}
- public abstract interface LineFormatter {
+ public abstract deprecated interface LineFormatter {
method public abstract org.apache.http.util.CharArrayBuffer appendProtocolVersion(org.apache.http.util.CharArrayBuffer, org.apache.http.ProtocolVersion);
method public abstract org.apache.http.util.CharArrayBuffer formatHeader(org.apache.http.util.CharArrayBuffer, org.apache.http.Header);
method public abstract org.apache.http.util.CharArrayBuffer formatRequestLine(org.apache.http.util.CharArrayBuffer, org.apache.http.RequestLine);
method public abstract org.apache.http.util.CharArrayBuffer formatStatusLine(org.apache.http.util.CharArrayBuffer, org.apache.http.StatusLine);
}
- public abstract interface LineParser {
+ public abstract deprecated interface LineParser {
method public abstract boolean hasProtocolVersion(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor);
method public abstract org.apache.http.Header parseHeader(org.apache.http.util.CharArrayBuffer) throws org.apache.http.ParseException;
method public abstract org.apache.http.ProtocolVersion parseProtocolVersion(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
@@ -57356,7 +57388,7 @@
method public abstract org.apache.http.StatusLine parseStatusLine(org.apache.http.util.CharArrayBuffer, org.apache.http.message.ParserCursor) throws org.apache.http.ParseException;
}
- public class ParserCursor {
+ public deprecated class ParserCursor {
ctor public ParserCursor(int, int);
method public boolean atEnd();
method public int getLowerBound();
@@ -57369,7 +57401,7 @@
package org.apache.http.params {
- public abstract class AbstractHttpParams implements org.apache.http.params.HttpParams {
+ public abstract deprecated class AbstractHttpParams implements org.apache.http.params.HttpParams {
ctor protected AbstractHttpParams();
method public boolean getBooleanParameter(java.lang.String, boolean);
method public double getDoubleParameter(java.lang.String, double);
@@ -57383,7 +57415,7 @@
method public org.apache.http.params.HttpParams setLongParameter(java.lang.String, long);
}
- public final class BasicHttpParams extends org.apache.http.params.AbstractHttpParams implements java.lang.Cloneable java.io.Serializable {
+ public final deprecated class BasicHttpParams extends org.apache.http.params.AbstractHttpParams implements java.lang.Cloneable java.io.Serializable {
ctor public BasicHttpParams();
method public void clear();
method public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
@@ -57397,7 +57429,7 @@
method public void setParameters(java.lang.String[], java.lang.Object);
}
- public abstract interface CoreConnectionPNames {
+ public abstract deprecated interface CoreConnectionPNames {
field public static final java.lang.String CONNECTION_TIMEOUT = "http.connection.timeout";
field public static final java.lang.String MAX_HEADER_COUNT = "http.connection.max-header-count";
field public static final java.lang.String MAX_LINE_LENGTH = "http.connection.max-line-length";
@@ -57408,7 +57440,7 @@
field public static final java.lang.String TCP_NODELAY = "http.tcp.nodelay";
}
- public abstract interface CoreProtocolPNames {
+ public abstract deprecated interface CoreProtocolPNames {
field public static final java.lang.String HTTP_CONTENT_CHARSET = "http.protocol.content-charset";
field public static final java.lang.String HTTP_ELEMENT_CHARSET = "http.protocol.element-charset";
field public static final java.lang.String ORIGIN_SERVER = "http.origin-server";
@@ -57419,7 +57451,7 @@
field public static final java.lang.String WAIT_FOR_CONTINUE = "http.protocol.wait-for-continue";
}
- public final class DefaultedHttpParams extends org.apache.http.params.AbstractHttpParams {
+ public final deprecated class DefaultedHttpParams extends org.apache.http.params.AbstractHttpParams {
ctor public DefaultedHttpParams(org.apache.http.params.HttpParams, org.apache.http.params.HttpParams);
method public org.apache.http.params.HttpParams copy();
method public org.apache.http.params.HttpParams getDefaults();
@@ -57428,12 +57460,12 @@
method public org.apache.http.params.HttpParams setParameter(java.lang.String, java.lang.Object);
}
- public abstract class HttpAbstractParamBean {
+ public abstract deprecated class HttpAbstractParamBean {
ctor public HttpAbstractParamBean(org.apache.http.params.HttpParams);
field protected final org.apache.http.params.HttpParams params;
}
- public class HttpConnectionParamBean extends org.apache.http.params.HttpAbstractParamBean {
+ public deprecated class HttpConnectionParamBean extends org.apache.http.params.HttpAbstractParamBean {
ctor public HttpConnectionParamBean(org.apache.http.params.HttpParams);
method public void setConnectionTimeout(int);
method public void setLinger(int);
@@ -57443,7 +57475,7 @@
method public void setTcpNoDelay(boolean);
}
- public final class HttpConnectionParams implements org.apache.http.params.CoreConnectionPNames {
+ public final deprecated class HttpConnectionParams implements org.apache.http.params.CoreConnectionPNames {
method public static int getConnectionTimeout(org.apache.http.params.HttpParams);
method public static int getLinger(org.apache.http.params.HttpParams);
method public static int getSoTimeout(org.apache.http.params.HttpParams);
@@ -57458,7 +57490,7 @@
method public static void setTcpNoDelay(org.apache.http.params.HttpParams, boolean);
}
- public abstract interface HttpParams {
+ public abstract deprecated interface HttpParams {
method public abstract org.apache.http.params.HttpParams copy();
method public abstract boolean getBooleanParameter(java.lang.String, boolean);
method public abstract double getDoubleParameter(java.lang.String, double);
@@ -57475,7 +57507,7 @@
method public abstract org.apache.http.params.HttpParams setParameter(java.lang.String, java.lang.Object);
}
- public class HttpProtocolParamBean extends org.apache.http.params.HttpAbstractParamBean {
+ public deprecated class HttpProtocolParamBean extends org.apache.http.params.HttpAbstractParamBean {
ctor public HttpProtocolParamBean(org.apache.http.params.HttpParams);
method public void setContentCharset(java.lang.String);
method public void setHttpElementCharset(java.lang.String);
@@ -57484,7 +57516,7 @@
method public void setVersion(org.apache.http.HttpVersion);
}
- public final class HttpProtocolParams implements org.apache.http.params.CoreProtocolPNames {
+ public final deprecated class HttpProtocolParams implements org.apache.http.params.CoreProtocolPNames {
method public static java.lang.String getContentCharset(org.apache.http.params.HttpParams);
method public static java.lang.String getHttpElementCharset(org.apache.http.params.HttpParams);
method public static java.lang.String getUserAgent(org.apache.http.params.HttpParams);
@@ -57501,7 +57533,7 @@
package org.apache.http.protocol {
- public class BasicHttpContext implements org.apache.http.protocol.HttpContext {
+ public deprecated class BasicHttpContext implements org.apache.http.protocol.HttpContext {
ctor public BasicHttpContext();
ctor public BasicHttpContext(org.apache.http.protocol.HttpContext);
method public java.lang.Object getAttribute(java.lang.String);
@@ -57509,7 +57541,7 @@
method public void setAttribute(java.lang.String, java.lang.Object);
}
- public final class BasicHttpProcessor implements java.lang.Cloneable org.apache.http.protocol.HttpProcessor org.apache.http.protocol.HttpRequestInterceptorList org.apache.http.protocol.HttpResponseInterceptorList {
+ public final deprecated class BasicHttpProcessor implements java.lang.Cloneable org.apache.http.protocol.HttpProcessor org.apache.http.protocol.HttpRequestInterceptorList org.apache.http.protocol.HttpResponseInterceptorList {
ctor public BasicHttpProcessor();
method public final void addInterceptor(org.apache.http.HttpRequestInterceptor);
method public final void addInterceptor(org.apache.http.HttpRequestInterceptor, int);
@@ -57538,7 +57570,7 @@
field protected java.util.List responseInterceptors;
}
- public final class DefaultedHttpContext implements org.apache.http.protocol.HttpContext {
+ public final deprecated class DefaultedHttpContext implements org.apache.http.protocol.HttpContext {
ctor public DefaultedHttpContext(org.apache.http.protocol.HttpContext, org.apache.http.protocol.HttpContext);
method public java.lang.Object getAttribute(java.lang.String);
method public org.apache.http.protocol.HttpContext getDefaults();
@@ -57546,7 +57578,7 @@
method public void setAttribute(java.lang.String, java.lang.Object);
}
- public abstract interface ExecutionContext {
+ public abstract deprecated interface ExecutionContext {
field public static final java.lang.String HTTP_CONNECTION = "http.connection";
field public static final java.lang.String HTTP_PROXY_HOST = "http.proxy_host";
field public static final java.lang.String HTTP_REQUEST = "http.request";
@@ -57555,7 +57587,7 @@
field public static final java.lang.String HTTP_TARGET_HOST = "http.target_host";
}
- public final class HTTP {
+ public final deprecated class HTTP {
method public static boolean isWhitespace(char);
field public static final java.lang.String ASCII = "ASCII";
field public static final java.lang.String CHARSET_PARAM = "; charset=";
@@ -57589,28 +57621,28 @@
field public static final java.lang.String UTF_8 = "UTF-8";
}
- public abstract interface HttpContext {
+ public abstract deprecated interface HttpContext {
method public abstract java.lang.Object getAttribute(java.lang.String);
method public abstract java.lang.Object removeAttribute(java.lang.String);
method public abstract void setAttribute(java.lang.String, java.lang.Object);
field public static final java.lang.String RESERVED_PREFIX = "http.";
}
- public class HttpDateGenerator {
+ public deprecated class HttpDateGenerator {
ctor public HttpDateGenerator();
method public synchronized java.lang.String getCurrentDate();
field public static final java.util.TimeZone GMT;
field public static final java.lang.String PATTERN_RFC1123 = "EEE, dd MMM yyyy HH:mm:ss zzz";
}
- public abstract interface HttpExpectationVerifier {
+ public abstract deprecated interface HttpExpectationVerifier {
method public abstract void verify(org.apache.http.HttpRequest, org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException;
}
- public abstract interface HttpProcessor implements org.apache.http.HttpRequestInterceptor org.apache.http.HttpResponseInterceptor {
+ public abstract deprecated interface HttpProcessor implements org.apache.http.HttpRequestInterceptor org.apache.http.HttpResponseInterceptor {
}
- public class HttpRequestExecutor {
+ public deprecated class HttpRequestExecutor {
ctor public HttpRequestExecutor();
method protected boolean canResponseHaveBody(org.apache.http.HttpRequest, org.apache.http.HttpResponse);
method protected org.apache.http.HttpResponse doReceiveResponse(org.apache.http.HttpRequest, org.apache.http.HttpClientConnection, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
@@ -57620,11 +57652,11 @@
method public void preProcess(org.apache.http.HttpRequest, org.apache.http.protocol.HttpProcessor, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public abstract interface HttpRequestHandler {
+ public abstract deprecated interface HttpRequestHandler {
method public abstract void handle(org.apache.http.HttpRequest, org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public class HttpRequestHandlerRegistry implements org.apache.http.protocol.HttpRequestHandlerResolver {
+ public deprecated class HttpRequestHandlerRegistry implements org.apache.http.protocol.HttpRequestHandlerResolver {
ctor public HttpRequestHandlerRegistry();
method public org.apache.http.protocol.HttpRequestHandler lookup(java.lang.String);
method protected deprecated boolean matchUriRequestPattern(java.lang.String, java.lang.String);
@@ -57633,11 +57665,11 @@
method public void unregister(java.lang.String);
}
- public abstract interface HttpRequestHandlerResolver {
+ public abstract deprecated interface HttpRequestHandlerResolver {
method public abstract org.apache.http.protocol.HttpRequestHandler lookup(java.lang.String);
}
- public abstract interface HttpRequestInterceptorList {
+ public abstract deprecated interface HttpRequestInterceptorList {
method public abstract void addRequestInterceptor(org.apache.http.HttpRequestInterceptor);
method public abstract void addRequestInterceptor(org.apache.http.HttpRequestInterceptor, int);
method public abstract void clearRequestInterceptors();
@@ -57647,7 +57679,7 @@
method public abstract void setInterceptors(java.util.List);
}
- public abstract interface HttpResponseInterceptorList {
+ public abstract deprecated interface HttpResponseInterceptorList {
method public abstract void addResponseInterceptor(org.apache.http.HttpResponseInterceptor);
method public abstract void addResponseInterceptor(org.apache.http.HttpResponseInterceptor, int);
method public abstract void clearResponseInterceptors();
@@ -57657,7 +57689,7 @@
method public abstract void setInterceptors(java.util.List);
}
- public class HttpService {
+ public deprecated class HttpService {
ctor public HttpService(org.apache.http.protocol.HttpProcessor, org.apache.http.ConnectionReuseStrategy, org.apache.http.HttpResponseFactory);
method protected void doService(org.apache.http.HttpRequest, org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
method public org.apache.http.params.HttpParams getParams();
@@ -57671,61 +57703,61 @@
method public void setResponseFactory(org.apache.http.HttpResponseFactory);
}
- public class RequestConnControl implements org.apache.http.HttpRequestInterceptor {
+ public deprecated class RequestConnControl implements org.apache.http.HttpRequestInterceptor {
ctor public RequestConnControl();
method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public class RequestContent implements org.apache.http.HttpRequestInterceptor {
+ public deprecated class RequestContent implements org.apache.http.HttpRequestInterceptor {
ctor public RequestContent();
method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public class RequestDate implements org.apache.http.HttpRequestInterceptor {
+ public deprecated class RequestDate implements org.apache.http.HttpRequestInterceptor {
ctor public RequestDate();
method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public class RequestExpectContinue implements org.apache.http.HttpRequestInterceptor {
+ public deprecated class RequestExpectContinue implements org.apache.http.HttpRequestInterceptor {
ctor public RequestExpectContinue();
method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public class RequestTargetHost implements org.apache.http.HttpRequestInterceptor {
+ public deprecated class RequestTargetHost implements org.apache.http.HttpRequestInterceptor {
ctor public RequestTargetHost();
method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public class RequestUserAgent implements org.apache.http.HttpRequestInterceptor {
+ public deprecated class RequestUserAgent implements org.apache.http.HttpRequestInterceptor {
ctor public RequestUserAgent();
method public void process(org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public class ResponseConnControl implements org.apache.http.HttpResponseInterceptor {
+ public deprecated class ResponseConnControl implements org.apache.http.HttpResponseInterceptor {
ctor public ResponseConnControl();
method public void process(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public class ResponseContent implements org.apache.http.HttpResponseInterceptor {
+ public deprecated class ResponseContent implements org.apache.http.HttpResponseInterceptor {
ctor public ResponseContent();
method public void process(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public class ResponseDate implements org.apache.http.HttpResponseInterceptor {
+ public deprecated class ResponseDate implements org.apache.http.HttpResponseInterceptor {
ctor public ResponseDate();
method public void process(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public class ResponseServer implements org.apache.http.HttpResponseInterceptor {
+ public deprecated class ResponseServer implements org.apache.http.HttpResponseInterceptor {
ctor public ResponseServer();
method public void process(org.apache.http.HttpResponse, org.apache.http.protocol.HttpContext) throws org.apache.http.HttpException, java.io.IOException;
}
- public class SyncBasicHttpContext extends org.apache.http.protocol.BasicHttpContext {
+ public deprecated class SyncBasicHttpContext extends org.apache.http.protocol.BasicHttpContext {
ctor public SyncBasicHttpContext(org.apache.http.protocol.HttpContext);
}
- public class UriPatternMatcher {
+ public deprecated class UriPatternMatcher {
ctor public UriPatternMatcher();
method public java.lang.Object lookup(java.lang.String);
method protected boolean matchUriRequestPattern(java.lang.String, java.lang.String);
@@ -57738,7 +57770,7 @@
package org.apache.http.util {
- public final class ByteArrayBuffer {
+ public final deprecated class ByteArrayBuffer {
ctor public ByteArrayBuffer(int);
method public void append(byte[], int, int);
method public void append(int);
@@ -57755,7 +57787,7 @@
method public byte[] toByteArray();
}
- public final class CharArrayBuffer {
+ public final deprecated class CharArrayBuffer {
ctor public CharArrayBuffer(int);
method public void append(char[], int, int);
method public void append(java.lang.String);
@@ -57781,7 +57813,7 @@
method public char[] toCharArray();
}
- public final class EncodingUtils {
+ public final deprecated class EncodingUtils {
method public static byte[] getAsciiBytes(java.lang.String);
method public static java.lang.String getAsciiString(byte[], int, int);
method public static java.lang.String getAsciiString(byte[]);
@@ -57790,18 +57822,18 @@
method public static java.lang.String getString(byte[], java.lang.String);
}
- public final class EntityUtils {
+ public final deprecated class EntityUtils {
method public static java.lang.String getContentCharSet(org.apache.http.HttpEntity) throws org.apache.http.ParseException;
method public static byte[] toByteArray(org.apache.http.HttpEntity) throws java.io.IOException;
method public static java.lang.String toString(org.apache.http.HttpEntity, java.lang.String) throws java.io.IOException, org.apache.http.ParseException;
method public static java.lang.String toString(org.apache.http.HttpEntity) throws java.io.IOException, org.apache.http.ParseException;
}
- public final class ExceptionUtils {
+ public final deprecated class ExceptionUtils {
method public static void initCause(java.lang.Throwable, java.lang.Throwable);
}
- public final class LangUtils {
+ public final deprecated class LangUtils {
method public static boolean equals(java.lang.Object, java.lang.Object);
method public static boolean equals(java.lang.Object[], java.lang.Object[]);
method public static int hashCode(int, int);
@@ -57811,7 +57843,7 @@
field public static final int HASH_SEED = 17; // 0x11
}
- public class VersionInfo {
+ public deprecated class VersionInfo {
ctor protected VersionInfo(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
method protected static final org.apache.http.util.VersionInfo fromMap(java.lang.String, java.util.Map, java.lang.ClassLoader);
method public final java.lang.String getClassloader();
diff --git a/cmds/app_process/Android.mk b/cmds/app_process/Android.mk
index 74a2f7b..1ca14a6 100644
--- a/cmds/app_process/Android.mk
+++ b/cmds/app_process/Android.mk
@@ -2,10 +2,18 @@
include $(CLEAR_VARS)
+# TODO: Trying to link libsigchain as a static library prevents
+# static linker from exporting necessary symbols. So as a workaround
+# we use sigchain.o
LOCAL_SRC_FILES:= \
- app_main.cpp
+ app_main.cpp \
+ sigchain_proxy.cpp
+
+LOCAL_LDFLAGS := -Wl,--version-script,art/sigchainlib/version-script.txt -Wl,--export-dynamic
+LOCAL_CPPFLAGS := -std=c++11 -Iart
LOCAL_SHARED_LIBRARIES := \
+ libdl \
libcutils \
libutils \
liblog \
@@ -28,8 +36,10 @@
include $(CLEAR_VARS)
+# see comment above (~l5)
LOCAL_SRC_FILES:= \
- app_main.cpp
+ app_main.cpp \
+ sigchain_proxy.cpp
LOCAL_SHARED_LIBRARIES := \
libcutils \
@@ -38,6 +48,9 @@
libbinder \
libandroid_runtime
+LOCAL_LDFLAGS := -ldl -Wl,--version-script,art/sigchainlib/version-script.txt -Wl,--export-dynamic
+LOCAL_CPPFLAGS := -std=c++11 -Iart
+
LOCAL_MODULE := app_process__asan
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE_PATH := $(TARGET_OUT_EXECUTABLES)/asan
diff --git a/tools/layoutlib/bridge/src/android/graphics/Typeface_Accessor.java b/cmds/app_process/sigchain_proxy.cpp
similarity index 67%
rename from tools/layoutlib/bridge/src/android/graphics/Typeface_Accessor.java
rename to cmds/app_process/sigchain_proxy.cpp
index adad2ac..bb7a678 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Typeface_Accessor.java
+++ b/cmds/app_process/sigchain_proxy.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2014 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.
@@ -14,14 +14,4 @@
* limitations under the License.
*/
-package android.graphics;
-
-/**
- * Class allowing access to package-protected methods/fields.
- */
-public class Typeface_Accessor {
-
- public static void resetDefaults() {
- Typeface.sDefaults = null;
- }
-}
+#include "sigchainlib/sigchain.cc"
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index 13ceb4a..1e1b33f 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -24,13 +24,18 @@
import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
+import android.view.Display;
import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityInteractionClient;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityWindowInfo;
import com.android.internal.os.HandlerCaller;
+import com.android.internal.os.SomeArgs;
import java.util.List;
@@ -366,7 +371,7 @@
public void onAccessibilityEvent(AccessibilityEvent event);
public void onInterrupt();
public void onServiceConnected();
- public void onSetConnectionId(int connectionId);
+ public void init(int connectionId, IBinder windowToken);
public boolean onGesture(int gestureId);
public boolean onKeyEvent(KeyEvent event);
}
@@ -375,6 +380,10 @@
private AccessibilityServiceInfo mInfo;
+ private IBinder mWindowToken;
+
+ private WindowManager mWindowManager;
+
/**
* Callback for {@link android.view.accessibility.AccessibilityEvent}s.
*
@@ -611,6 +620,18 @@
}
}
+ @Override
+ public Object getSystemService(String name) {
+ if (Context.WINDOW_SERVICE.equals(name)) {
+ if (mWindowManager == null) {
+ WindowManager wrapped = (WindowManager) super.getSystemService(name);
+ mWindowManager = new LocalWindowManager(wrapped);
+ }
+ return mWindowManager;
+ }
+ return super.getSystemService(name);
+ }
+
/**
* Implement to return the implementation of the internal accessibility
* service interface.
@@ -634,8 +655,9 @@
}
@Override
- public void onSetConnectionId( int connectionId) {
+ public void init(int connectionId, IBinder windowToken) {
mConnectionId = connectionId;
+ mWindowToken = windowToken;
}
@Override
@@ -658,7 +680,7 @@
*/
public static class IAccessibilityServiceClientWrapper extends IAccessibilityServiceClient.Stub
implements HandlerCaller.Callback {
- private static final int DO_SET_SET_CONNECTION = 1;
+ private static final int DO_INIT = 1;
private static final int DO_ON_INTERRUPT = 2;
private static final int DO_ON_ACCESSIBILITY_EVENT = 3;
private static final int DO_ON_GESTURE = 4;
@@ -677,9 +699,10 @@
mCaller = new HandlerCaller(context, looper, this, true /*asyncHandler*/);
}
- public void setConnection(IAccessibilityServiceConnection connection, int connectionId) {
- Message message = mCaller.obtainMessageIO(DO_SET_SET_CONNECTION, connectionId,
- connection);
+ public void init(IAccessibilityServiceConnection connection, int connectionId,
+ IBinder windowToken) {
+ Message message = mCaller.obtainMessageIOO(DO_INIT, connectionId,
+ connection, windowToken);
mCaller.sendMessage(message);
}
@@ -730,20 +753,24 @@
mCallback.onInterrupt();
} return;
- case DO_SET_SET_CONNECTION: {
+ case DO_INIT: {
mConnectionId = message.arg1;
+ SomeArgs args = (SomeArgs) message.obj;
IAccessibilityServiceConnection connection =
- (IAccessibilityServiceConnection) message.obj;
+ (IAccessibilityServiceConnection) args.arg1;
+ IBinder windowToken = (IBinder) args.arg2;
+ args.recycle();
if (connection != null) {
AccessibilityInteractionClient.getInstance().addConnection(mConnectionId,
connection);
- mCallback.onSetConnectionId(mConnectionId);
+ mCallback.init(mConnectionId, windowToken);
mCallback.onServiceConnected();
} else {
AccessibilityInteractionClient.getInstance().removeConnection(
mConnectionId);
+ mConnectionId = AccessibilityInteractionClient.NO_ID;
AccessibilityInteractionClient.getInstance().clearCache();
- mCallback.onSetConnectionId(AccessibilityInteractionClient.NO_ID);
+ mCallback.init(AccessibilityInteractionClient.NO_ID, null);
}
} return;
@@ -785,4 +812,53 @@
}
}
}
+
+ private class LocalWindowManager implements WindowManager {
+ private final WindowManager mImpl;
+
+ private LocalWindowManager(WindowManager impl) {
+ mImpl = impl;
+ }
+
+ @Override
+ public Display getDefaultDisplay() {
+ return mImpl.getDefaultDisplay();
+ }
+
+ @Override
+ public void addView(View view, ViewGroup.LayoutParams params) {
+ if (!(params instanceof WindowManager.LayoutParams)) {
+ throw new IllegalArgumentException("Params must be WindowManager.LayoutParams");
+ }
+ WindowManager.LayoutParams windowParams = (WindowManager.LayoutParams) params;
+ if (windowParams.type == LayoutParams.TYPE_ACCESSIBILITY_OVERLAY
+ && windowParams.token == null) {
+ windowParams.token = mWindowToken;
+ }
+ mImpl.addView(view, params);
+ }
+
+ @Override
+ public void updateViewLayout(View view, ViewGroup.LayoutParams params) {
+ if (!(params instanceof WindowManager.LayoutParams)) {
+ throw new IllegalArgumentException("Params must be WindowManager.LayoutParams");
+ }
+ WindowManager.LayoutParams windowParams = (WindowManager.LayoutParams) params;
+ if (windowParams.type == LayoutParams.TYPE_ACCESSIBILITY_OVERLAY
+ && windowParams.token == null) {
+ windowParams.token = mWindowToken;
+ }
+ mImpl.updateViewLayout(view, params);
+ }
+
+ @Override
+ public void removeViewImmediate(View view) {
+ mImpl.removeViewImmediate(view);
+ }
+
+ @Override
+ public void removeView(View view) {
+ mImpl.removeView(view);
+ }
+ }
}
diff --git a/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl b/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl
index 6ce0219..8b503dd 100644
--- a/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl
+++ b/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl
@@ -28,7 +28,7 @@
*/
oneway interface IAccessibilityServiceClient {
- void setConnection(in IAccessibilityServiceConnection connection, int connectionId);
+ void init(in IAccessibilityServiceConnection connection, int connectionId, IBinder windowToken);
void onAccessibilityEvent(in AccessibilityEvent event);
diff --git a/core/java/android/animation/Animator.java b/core/java/android/animation/Animator.java
index 3720c81..da48709 100644
--- a/core/java/android/animation/Animator.java
+++ b/core/java/android/animation/Animator.java
@@ -16,6 +16,8 @@
package android.animation;
+import android.content.res.ConstantState;
+
import java.util.ArrayList;
/**
@@ -41,6 +43,18 @@
boolean mPaused = false;
/**
+ * A set of flags which identify the type of configuration changes that can affect this
+ * Animator. Used by the Animator cache.
+ */
+ int mChangingConfigurations = 0;
+
+ /**
+ * If this animator is inflated from a constant state, keep a reference to it so that
+ * ConstantState will not be garbage collected until this animator is collected
+ */
+ private AnimatorConstantState mConstantState;
+
+ /**
* Starts this animation. If the animation has a nonzero startDelay, the animation will start
* running after that delay elapses. A non-delayed animation will have its initial
* value(s) set immediately, followed by calls to
@@ -295,25 +309,71 @@
}
}
+ /**
+ * Return a mask of the configuration parameters for which this animator may change, requiring
+ * that it should be re-created from Resources. The default implementation returns whatever
+ * value was provided through setChangingConfigurations(int) or 0 by default.
+ *
+ * @return Returns a mask of the changing configuration parameters, as defined by
+ * {@link android.content.pm.ActivityInfo}.
+ * @see android.content.pm.ActivityInfo
+ * @hide
+ */
+ public int getChangingConfigurations() {
+ return mChangingConfigurations;
+ }
+
+ /**
+ * Set a mask of the configuration parameters for which this animator may change, requiring
+ * that it be re-created from resource.
+ *
+ * @param configs A mask of the changing configuration parameters, as
+ * defined by {@link android.content.pm.ActivityInfo}.
+ *
+ * @see android.content.pm.ActivityInfo
+ * @hide
+ */
+ public void setChangingConfigurations(int configs) {
+ mChangingConfigurations = configs;
+ }
+
+ /**
+ * Sets the changing configurations value to the union of the current changing configurations
+ * and the provided configs.
+ * This method is called while loading the animator.
+ * @hide
+ */
+ public void appendChangingConfigurations(int configs) {
+ mChangingConfigurations |= configs;
+ }
+
+ /**
+ * Return a {@link android.content.res.ConstantState} instance that holds the shared state of
+ * this Animator.
+ * <p>
+ * This constant state is used to create new instances of this animator when needed, instead
+ * of re-loading it from resources. Default implementation creates a new
+ * {@link AnimatorConstantState}. You can override this method to provide your custom logic or
+ * return null if you don't want this animator to be cached.
+ *
+ * @return The ConfigurationBoundResourceCache.BaseConstantState associated to this Animator.
+ * @see android.content.res.ConstantState
+ * @see #clone()
+ * @hide
+ */
+ public ConstantState<Animator> createConstantState() {
+ return new AnimatorConstantState(this);
+ }
+
@Override
public Animator clone() {
try {
final Animator anim = (Animator) super.clone();
if (mListeners != null) {
- ArrayList<AnimatorListener> oldListeners = mListeners;
- anim.mListeners = new ArrayList<AnimatorListener>();
- int numListeners = oldListeners.size();
- for (int i = 0; i < numListeners; ++i) {
- anim.mListeners.add(oldListeners.get(i));
- }
+ anim.mListeners = new ArrayList<AnimatorListener>(mListeners);
}
if (mPauseListeners != null) {
- ArrayList<AnimatorPauseListener> oldListeners = mPauseListeners;
- anim.mPauseListeners = new ArrayList<AnimatorPauseListener>();
- int numListeners = oldListeners.size();
- for (int i = 0; i < numListeners; ++i) {
- anim.mPauseListeners.add(oldListeners.get(i));
- }
+ anim.mPauseListeners = new ArrayList<AnimatorPauseListener>(mPauseListeners);
}
return anim;
} catch (CloneNotSupportedException e) {
@@ -469,4 +529,35 @@
public void setAllowRunningAsynchronously(boolean mayRunAsync) {
// It is up to subclasses to support this, if they can.
}
+
+ /**
+ * Creates a {@link ConstantState} which holds changing configurations information associated
+ * with the given Animator.
+ * <p>
+ * When {@link #newInstance()} is called, default implementation clones the Animator.
+ */
+ private static class AnimatorConstantState extends ConstantState<Animator> {
+
+ final Animator mAnimator;
+ int mChangingConf;
+
+ public AnimatorConstantState(Animator animator) {
+ mAnimator = animator;
+ // ensure a reference back to here so that constante state is not gc'ed.
+ mAnimator.mConstantState = this;
+ mChangingConf = mAnimator.getChangingConfigurations();
+ }
+
+ @Override
+ public int getChangingConfigurations() {
+ return mChangingConf;
+ }
+
+ @Override
+ public Animator newInstance() {
+ final Animator clone = mAnimator.clone();
+ clone.mConstantState = this;
+ return clone;
+ }
+ }
}
diff --git a/core/java/android/animation/AnimatorInflater.java b/core/java/android/animation/AnimatorInflater.java
index 25417ed..688d7e4 100644
--- a/core/java/android/animation/AnimatorInflater.java
+++ b/core/java/android/animation/AnimatorInflater.java
@@ -16,6 +16,8 @@
package android.animation;
import android.content.Context;
+import android.content.res.ConfigurationBoundResourceCache;
+import android.content.res.ConstantState;
import android.content.res.Resources;
import android.content.res.Resources.NotFoundException;
import android.content.res.Resources.Theme;
@@ -30,6 +32,8 @@
import android.util.Xml;
import android.view.InflateException;
import android.view.animation.AnimationUtils;
+import android.view.animation.BaseInterpolator;
+import android.view.animation.Interpolator;
import com.android.internal.R;
@@ -67,6 +71,9 @@
private static final boolean DBG_ANIMATOR_INFLATER = false;
+ // used to calculate changing configs for resource references
+ private static final TypedValue sTmpTypedValue = new TypedValue();
+
/**
* Loads an {@link Animator} object from a resource
*
@@ -98,11 +105,34 @@
/** @hide */
public static Animator loadAnimator(Resources resources, Theme theme, int id,
float pathErrorScale) throws NotFoundException {
-
+ final ConfigurationBoundResourceCache<Animator> animatorCache = resources
+ .getAnimatorCache();
+ Animator animator = animatorCache.get(id, theme);
+ if (animator != null) {
+ if (DBG_ANIMATOR_INFLATER) {
+ Log.d(TAG, "loaded animator from cache, " + resources.getResourceName(id));
+ }
+ return animator;
+ } else if (DBG_ANIMATOR_INFLATER) {
+ Log.d(TAG, "cache miss for animator " + resources.getResourceName(id));
+ }
XmlResourceParser parser = null;
try {
parser = resources.getAnimation(id);
- return createAnimatorFromXml(resources, theme, parser, pathErrorScale);
+ animator = createAnimatorFromXml(resources, theme, parser, pathErrorScale);
+ if (animator != null) {
+ animator.appendChangingConfigurations(getChangingConfigs(resources, id));
+ final ConstantState<Animator> constantState = animator.createConstantState();
+ if (constantState != null) {
+ if (DBG_ANIMATOR_INFLATER) {
+ Log.d(TAG, "caching animator for res " + resources.getResourceName(id));
+ }
+ animatorCache.put(id, theme, constantState);
+ // create a new animator so that cached version is never used by the user
+ animator = constantState.newInstance(resources, theme);
+ }
+ }
+ return animator;
} catch (XmlPullParserException ex) {
Resources.NotFoundException rnf =
new Resources.NotFoundException("Can't load animation resource ID #0x" +
@@ -122,10 +152,29 @@
public static StateListAnimator loadStateListAnimator(Context context, int id)
throws NotFoundException {
+ final Resources resources = context.getResources();
+ final ConfigurationBoundResourceCache<StateListAnimator> cache = resources
+ .getStateListAnimatorCache();
+ final Theme theme = context.getTheme();
+ StateListAnimator animator = cache.get(id, theme);
+ if (animator != null) {
+ return animator;
+ }
XmlResourceParser parser = null;
try {
- parser = context.getResources().getAnimation(id);
- return createStateListAnimatorFromXml(context, parser, Xml.asAttributeSet(parser));
+ parser = resources.getAnimation(id);
+ animator = createStateListAnimatorFromXml(context, parser, Xml.asAttributeSet(parser));
+ if (animator != null) {
+ animator.appendChangingConfigurations(getChangingConfigs(resources, id));
+ final ConstantState<StateListAnimator> constantState = animator
+ .createConstantState();
+ if (constantState != null) {
+ cache.put(id, theme, constantState);
+ // return a clone so that the animator in constant state is never used.
+ animator = constantState.newInstance(resources, theme);
+ }
+ }
+ return animator;
} catch (XmlPullParserException ex) {
Resources.NotFoundException rnf =
new Resources.NotFoundException(
@@ -172,14 +221,13 @@
for (int i = 0; i < attributeCount; i++) {
int attrName = attributeSet.getAttributeNameResource(i);
if (attrName == R.attr.animation) {
- animator = loadAnimator(context,
- attributeSet.getAttributeResourceValue(i, 0));
+ final int animId = attributeSet.getAttributeResourceValue(i, 0);
+ animator = loadAnimator(context, animId);
} else {
states[stateIndex++] =
attributeSet.getAttributeBooleanValue(i, false) ?
attrName : -attrName;
}
-
}
if (animator == null) {
animator = createAnimatorFromXml(context.getResources(),
@@ -192,7 +240,6 @@
}
stateListAnimator
.addState(StateSet.trimStateSet(states, stateIndex), animator);
-
}
break;
}
@@ -508,7 +555,6 @@
private static Animator createAnimatorFromXml(Resources res, Theme theme, XmlPullParser parser,
AttributeSet attrs, AnimatorSet parent, int sequenceOrdering, float pixelSize)
throws XmlPullParserException, IOException {
-
Animator anim = null;
ArrayList<Animator> childAnims = null;
@@ -537,8 +583,8 @@
} else {
a = res.obtainAttributes(attrs, R.styleable.AnimatorSet);
}
- int ordering = a.getInt(R.styleable.AnimatorSet_ordering,
- TOGETHER);
+ anim.appendChangingConfigurations(a.getChangingConfigurations());
+ int ordering = a.getInt(R.styleable.AnimatorSet_ordering, TOGETHER);
createAnimatorFromXml(res, theme, parser, attrs, (AnimatorSet) anim, ordering,
pixelSize);
a.recycle();
@@ -565,7 +611,6 @@
parent.playSequentially(animsArray);
}
}
-
return anim;
}
@@ -591,7 +636,6 @@
private static ValueAnimator loadAnimator(Resources res, Theme theme,
AttributeSet attrs, ValueAnimator anim, float pathErrorScale)
throws NotFoundException {
-
TypedArray arrayAnimator = null;
TypedArray arrayObjectAnimator = null;
@@ -609,25 +653,37 @@
} else {
arrayObjectAnimator = res.obtainAttributes(attrs, R.styleable.PropertyAnimator);
}
+ anim.appendChangingConfigurations(arrayObjectAnimator.getChangingConfigurations());
}
if (anim == null) {
anim = new ValueAnimator();
}
+ anim.appendChangingConfigurations(arrayAnimator.getChangingConfigurations());
parseAnimatorFromTypeArray(anim, arrayAnimator, arrayObjectAnimator, pathErrorScale);
- final int resID =
- arrayAnimator.getResourceId(R.styleable.Animator_interpolator, 0);
+ final int resID = arrayAnimator.getResourceId(R.styleable.Animator_interpolator, 0);
if (resID > 0) {
- anim.setInterpolator(AnimationUtils.loadInterpolator(res, theme, resID));
+ final Interpolator interpolator = AnimationUtils.loadInterpolator(res, theme, resID);
+ if (interpolator instanceof BaseInterpolator) {
+ anim.appendChangingConfigurations(
+ ((BaseInterpolator) interpolator).getChangingConfiguration());
+ }
+ anim.setInterpolator(interpolator);
}
arrayAnimator.recycle();
if (arrayObjectAnimator != null) {
arrayObjectAnimator.recycle();
}
-
return anim;
}
+
+ private static int getChangingConfigs(Resources resources, int id) {
+ synchronized (sTmpTypedValue) {
+ resources.getValue(id, sTmpTypedValue, true);
+ return sTmpTypedValue.changingConfigurations;
+ }
+ }
}
diff --git a/core/java/android/animation/AnimatorSet.java b/core/java/android/animation/AnimatorSet.java
index 0aa8fdd..92762c3 100644
--- a/core/java/android/animation/AnimatorSet.java
+++ b/core/java/android/animation/AnimatorSet.java
@@ -241,6 +241,19 @@
}
/**
+ * @hide
+ */
+ @Override
+ public int getChangingConfigurations() {
+ int conf = super.getChangingConfigurations();
+ final int nodeCount = mNodes.size();
+ for (int i = 0; i < nodeCount; i ++) {
+ conf |= mNodes.get(i).animation.getChangingConfigurations();
+ }
+ return conf;
+ }
+
+ /**
* Sets the TimeInterpolator for all current {@link #getChildAnimations() child animations}
* of this AnimatorSet. The default value is null, which means that no interpolator
* is set on this AnimatorSet. Setting the interpolator to any non-null value
@@ -628,23 +641,25 @@
* manually, as we clone each Node (and its animation). The clone will then be sorted,
* and will populate any appropriate lists, when it is started.
*/
+ final int nodeCount = mNodes.size();
anim.mNeedsSort = true;
anim.mTerminated = false;
anim.mStarted = false;
anim.mPlayingSet = new ArrayList<Animator>();
anim.mNodeMap = new HashMap<Animator, Node>();
- anim.mNodes = new ArrayList<Node>();
- anim.mSortedNodes = new ArrayList<Node>();
+ anim.mNodes = new ArrayList<Node>(nodeCount);
+ anim.mSortedNodes = new ArrayList<Node>(nodeCount);
anim.mReversible = mReversible;
anim.mSetListener = null;
// Walk through the old nodes list, cloning each node and adding it to the new nodemap.
// One problem is that the old node dependencies point to nodes in the old AnimatorSet.
// We need to track the old/new nodes in order to reconstruct the dependencies in the clone.
- HashMap<Node, Node> nodeCloneMap = new HashMap<Node, Node>(); // <old, new>
- for (Node node : mNodes) {
+
+ for (int n = 0; n < nodeCount; n++) {
+ final Node node = mNodes.get(n);
Node nodeClone = node.clone();
- nodeCloneMap.put(node, nodeClone);
+ node.mTmpClone = nodeClone;
anim.mNodes.add(nodeClone);
anim.mNodeMap.put(nodeClone.animation, nodeClone);
// Clear out the dependencies in the clone; we'll set these up manually later
@@ -652,40 +667,50 @@
nodeClone.tmpDependencies = null;
nodeClone.nodeDependents = null;
nodeClone.nodeDependencies = null;
+
// clear out any listeners that were set up by the AnimatorSet; these will
// be set up when the clone's nodes are sorted
- ArrayList<AnimatorListener> cloneListeners = nodeClone.animation.getListeners();
+ final ArrayList<AnimatorListener> cloneListeners = nodeClone.animation.getListeners();
if (cloneListeners != null) {
- ArrayList<AnimatorListener> listenersToRemove = null;
- for (AnimatorListener listener : cloneListeners) {
+ for (int i = cloneListeners.size() - 1; i >= 0; i--) {
+ final AnimatorListener listener = cloneListeners.get(i);
if (listener instanceof AnimatorSetListener) {
- if (listenersToRemove == null) {
- listenersToRemove = new ArrayList<AnimatorListener>();
- }
- listenersToRemove.add(listener);
- }
- }
- if (listenersToRemove != null) {
- for (AnimatorListener listener : listenersToRemove) {
- cloneListeners.remove(listener);
+ cloneListeners.remove(i);
}
}
}
}
// Now that we've cloned all of the nodes, we're ready to walk through their
// dependencies, mapping the old dependencies to the new nodes
- for (Node node : mNodes) {
- Node nodeClone = nodeCloneMap.get(node);
+ for (int n = 0; n < nodeCount; n++) {
+ final Node node = mNodes.get(n);
+ final Node clone = node.mTmpClone;
if (node.dependencies != null) {
- for (Dependency dependency : node.dependencies) {
- Node clonedDependencyNode = nodeCloneMap.get(dependency.node);
- Dependency cloneDependency = new Dependency(clonedDependencyNode,
+ clone.dependencies = new ArrayList<Dependency>(node.dependencies.size());
+ final int depSize = node.dependencies.size();
+ for (int i = 0; i < depSize; i ++) {
+ final Dependency dependency = node.dependencies.get(i);
+ Dependency cloneDependency = new Dependency(dependency.node.mTmpClone,
dependency.rule);
- nodeClone.addDependency(cloneDependency);
+ clone.dependencies.add(cloneDependency);
+ }
+ }
+ if (node.nodeDependents != null) {
+ clone.nodeDependents = new ArrayList<Node>(node.nodeDependents.size());
+ for (Node dep : node.nodeDependents) {
+ clone.nodeDependents.add(dep.mTmpClone);
+ }
+ }
+ if (node.nodeDependencies != null) {
+ clone.nodeDependencies = new ArrayList<Node>(node.nodeDependencies.size());
+ for (Node dep : node.nodeDependencies) {
+ clone.nodeDependencies.add(dep.mTmpClone);
}
}
}
-
+ for (int n = 0; n < nodeCount; n++) {
+ mNodes.get(n).mTmpClone = null;
+ }
return anim;
}
@@ -1017,6 +1042,11 @@
public boolean done = false;
/**
+ * Temporary field to hold the clone in AnimatorSet#clone. Cleaned after clone is complete
+ */
+ private Node mTmpClone = null;
+
+ /**
* Constructs the Node with the animation that it encapsulates. A Node has no
* dependencies by default; dependencies are added via the addDependency()
* method.
diff --git a/core/java/android/animation/FloatKeyframeSet.java b/core/java/android/animation/FloatKeyframeSet.java
index 12e5862..abac246 100644
--- a/core/java/android/animation/FloatKeyframeSet.java
+++ b/core/java/android/animation/FloatKeyframeSet.java
@@ -19,6 +19,7 @@
import android.animation.Keyframe.FloatKeyframe;
import java.util.ArrayList;
+import java.util.List;
/**
* This class holds a collection of FloatKeyframe objects and is called by ValueAnimator to calculate
@@ -47,8 +48,8 @@
@Override
public FloatKeyframeSet clone() {
- ArrayList<Keyframe> keyframes = mKeyframes;
- int numKeyframes = mKeyframes.size();
+ final List<Keyframe> keyframes = mKeyframes;
+ final int numKeyframes = mKeyframes.size();
FloatKeyframe[] newKeyframes = new FloatKeyframe[numKeyframes];
for (int i = 0; i < numKeyframes; ++i) {
newKeyframes[i] = (FloatKeyframe) keyframes.get(i).clone();
diff --git a/core/java/android/animation/IntKeyframeSet.java b/core/java/android/animation/IntKeyframeSet.java
index 7a5b0ec..0ec5138 100644
--- a/core/java/android/animation/IntKeyframeSet.java
+++ b/core/java/android/animation/IntKeyframeSet.java
@@ -19,6 +19,7 @@
import android.animation.Keyframe.IntKeyframe;
import java.util.ArrayList;
+import java.util.List;
/**
* This class holds a collection of IntKeyframe objects and is called by ValueAnimator to calculate
@@ -47,7 +48,7 @@
@Override
public IntKeyframeSet clone() {
- ArrayList<Keyframe> keyframes = mKeyframes;
+ List<Keyframe> keyframes = mKeyframes;
int numKeyframes = mKeyframes.size();
IntKeyframe[] newKeyframes = new IntKeyframe[numKeyframes];
for (int i = 0; i < numKeyframes; ++i) {
diff --git a/core/java/android/animation/KeyframeSet.java b/core/java/android/animation/KeyframeSet.java
index 8d15db2..0e99bff 100644
--- a/core/java/android/animation/KeyframeSet.java
+++ b/core/java/android/animation/KeyframeSet.java
@@ -18,6 +18,8 @@
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.List;
+
import android.animation.Keyframe.IntKeyframe;
import android.animation.Keyframe.FloatKeyframe;
import android.animation.Keyframe.ObjectKeyframe;
@@ -36,16 +38,16 @@
Keyframe mFirstKeyframe;
Keyframe mLastKeyframe;
TimeInterpolator mInterpolator; // only used in the 2-keyframe case
- ArrayList<Keyframe> mKeyframes; // only used when there are not 2 keyframes
+ List<Keyframe> mKeyframes; // only used when there are not 2 keyframes
TypeEvaluator mEvaluator;
public KeyframeSet(Keyframe... keyframes) {
mNumKeyframes = keyframes.length;
- mKeyframes = new ArrayList<Keyframe>();
- mKeyframes.addAll(Arrays.asList(keyframes));
- mFirstKeyframe = mKeyframes.get(0);
- mLastKeyframe = mKeyframes.get(mNumKeyframes - 1);
+ // immutable list
+ mKeyframes = Arrays.asList(keyframes);
+ mFirstKeyframe = keyframes[0];
+ mLastKeyframe = keyframes[mNumKeyframes - 1];
mInterpolator = mLastKeyframe.getInterpolator();
}
@@ -57,7 +59,7 @@
public void invalidateCache() {
}
- public ArrayList<Keyframe> getKeyframes() {
+ public List<Keyframe> getKeyframes() {
return mKeyframes;
}
@@ -177,9 +179,9 @@
@Override
public KeyframeSet clone() {
- ArrayList<Keyframe> keyframes = mKeyframes;
+ List<Keyframe> keyframes = mKeyframes;
int numKeyframes = mKeyframes.size();
- Keyframe[] newKeyframes = new Keyframe[numKeyframes];
+ final Keyframe[] newKeyframes = new Keyframe[numKeyframes];
for (int i = 0; i < numKeyframes; ++i) {
newKeyframes[i] = keyframes.get(i).clone();
}
diff --git a/core/java/android/animation/Keyframes.java b/core/java/android/animation/Keyframes.java
index 6611c6c..c921466 100644
--- a/core/java/android/animation/Keyframes.java
+++ b/core/java/android/animation/Keyframes.java
@@ -16,6 +16,7 @@
package android.animation;
import java.util.ArrayList;
+import java.util.List;
/**
* This interface abstracts a collection of Keyframe objects and is called by
@@ -62,7 +63,7 @@
* @return A list of all Keyframes contained by this. This may return null if this is
* not made up of Keyframes.
*/
- ArrayList<Keyframe> getKeyframes();
+ List<Keyframe> getKeyframes();
Keyframes clone();
diff --git a/core/java/android/animation/PropertyValuesHolder.java b/core/java/android/animation/PropertyValuesHolder.java
index d372933..97426c3 100644
--- a/core/java/android/animation/PropertyValuesHolder.java
+++ b/core/java/android/animation/PropertyValuesHolder.java
@@ -27,6 +27,7 @@
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
@@ -791,7 +792,7 @@
// check to make sure that mProperty is on the class of target
try {
Object testValue = null;
- ArrayList<Keyframe> keyframes = mKeyframes.getKeyframes();
+ List<Keyframe> keyframes = mKeyframes.getKeyframes();
int keyframeCount = keyframes == null ? 0 : keyframes.size();
for (int i = 0; i < keyframeCount; i++) {
Keyframe kf = keyframes.get(i);
@@ -814,7 +815,7 @@
if (mSetter == null) {
setupSetter(targetClass);
}
- ArrayList<Keyframe> keyframes = mKeyframes.getKeyframes();
+ List<Keyframe> keyframes = mKeyframes.getKeyframes();
int keyframeCount = keyframes == null ? 0 : keyframes.size();
for (int i = 0; i < keyframeCount; i++) {
Keyframe kf = keyframes.get(i);
@@ -890,7 +891,7 @@
* @param target The object which holds the start values that should be set.
*/
void setupStartValue(Object target) {
- ArrayList<Keyframe> keyframes = mKeyframes.getKeyframes();
+ List<Keyframe> keyframes = mKeyframes.getKeyframes();
if (!keyframes.isEmpty()) {
setupValue(target, keyframes.get(0));
}
@@ -905,7 +906,7 @@
* @param target The object which holds the start values that should be set.
*/
void setupEndValue(Object target) {
- ArrayList<Keyframe> keyframes = mKeyframes.getKeyframes();
+ List<Keyframe> keyframes = mKeyframes.getKeyframes();
if (!keyframes.isEmpty()) {
setupValue(target, keyframes.get(keyframes.size() - 1));
}
diff --git a/core/java/android/animation/StateListAnimator.java b/core/java/android/animation/StateListAnimator.java
index 7256a06..d49e914 100644
--- a/core/java/android/animation/StateListAnimator.java
+++ b/core/java/android/animation/StateListAnimator.java
@@ -16,6 +16,7 @@
package android.animation;
+import android.content.res.ConstantState;
import android.util.StateSet;
import android.view.View;
@@ -44,25 +45,31 @@
* @attr ref android.R.styleable#DrawableStates_state_pressed
* @attr ref android.R.styleable#StateListAnimatorItem_animation
*/
-public class StateListAnimator {
+public class StateListAnimator implements Cloneable {
- private final ArrayList<Tuple> mTuples = new ArrayList<Tuple>();
-
+ private ArrayList<Tuple> mTuples = new ArrayList<Tuple>();
private Tuple mLastMatch = null;
-
private Animator mRunningAnimator = null;
-
private WeakReference<View> mViewRef;
+ private StateListAnimatorConstantState mConstantState;
+ private AnimatorListenerAdapter mAnimatorListener;
+ private int mChangingConfigurations;
- private AnimatorListenerAdapter mAnimatorListener = new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- animation.setTarget(null);
- if (mRunningAnimator == animation) {
- mRunningAnimator = null;
+ public StateListAnimator() {
+ initAnimatorListener();
+ }
+
+ private void initAnimatorListener() {
+ mAnimatorListener = new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ animation.setTarget(null);
+ if (mRunningAnimator == animation) {
+ mRunningAnimator = null;
+ }
}
- }
- };
+ };
+ }
/**
* Associates the given animator with the provided drawable state specs so that it will be run
@@ -75,6 +82,7 @@
Tuple tuple = new Tuple(specs, animator);
tuple.mAnimator.addListener(mAnimatorListener);
mTuples.add(tuple);
+ mChangingConfigurations |= animator.getChangingConfigurations();
}
/**
@@ -118,12 +126,35 @@
for (int i = 0; i < size; i++) {
mTuples.get(i).mAnimator.setTarget(null);
}
-
mViewRef = null;
mLastMatch = null;
mRunningAnimator = null;
}
+ @Override
+ public StateListAnimator clone() {
+ try {
+ StateListAnimator clone = (StateListAnimator) super.clone();
+ clone.mTuples = new ArrayList<Tuple>(mTuples.size());
+ clone.mLastMatch = null;
+ clone.mRunningAnimator = null;
+ clone.mViewRef = null;
+ clone.mAnimatorListener = null;
+ clone.initAnimatorListener();
+ final int tupleSize = mTuples.size();
+ for (int i = 0; i < tupleSize; i++) {
+ final Tuple tuple = mTuples.get(i);
+ final Animator animatorClone = tuple.mAnimator.clone();
+ animatorClone.removeListener(mAnimatorListener);
+ clone.addState(tuple.mSpecs, animatorClone);
+ }
+ clone.setChangingConfigurations(getChangingConfigurations());
+ return clone;
+ } catch (CloneNotSupportedException e) {
+ throw new AssertionError("cannot clone state list animator", e);
+ }
+ }
+
/**
* Called by View
* @hide
@@ -182,6 +213,63 @@
}
/**
+ * Return a mask of the configuration parameters for which this animator may change, requiring
+ * that it be re-created. The default implementation returns whatever was provided through
+ * {@link #setChangingConfigurations(int)} or 0 by default.
+ *
+ * @return Returns a mask of the changing configuration parameters, as defined by
+ * {@link android.content.pm.ActivityInfo}.
+ *
+ * @see android.content.pm.ActivityInfo
+ * @hide
+ */
+ public int getChangingConfigurations() {
+ return mChangingConfigurations;
+ }
+
+ /**
+ * Set a mask of the configuration parameters for which this animator may change, requiring
+ * that it should be recreated from resources instead of being cloned.
+ *
+ * @param configs A mask of the changing configuration parameters, as
+ * defined by {@link android.content.pm.ActivityInfo}.
+ *
+ * @see android.content.pm.ActivityInfo
+ * @hide
+ */
+ public void setChangingConfigurations(int configs) {
+ mChangingConfigurations = configs;
+ }
+
+ /**
+ * Sets the changing configurations value to the union of the current changing configurations
+ * and the provided configs.
+ * This method is called while loading the animator.
+ * @hide
+ */
+ public void appendChangingConfigurations(int configs) {
+ mChangingConfigurations |= configs;
+ }
+
+ /**
+ * Return a {@link android.content.res.ConstantState} instance that holds the shared state of
+ * this Animator.
+ * <p>
+ * This constant state is used to create new instances of this animator when needed. Default
+ * implementation creates a new {@link StateListAnimatorConstantState}. You can override this
+ * method to provide your custom logic or return null if you don't want this animator to be
+ * cached.
+ *
+ * @return The {@link android.content.res.ConstantState} associated to this Animator.
+ * @see android.content.res.ConstantState
+ * @see #clone()
+ * @hide
+ */
+ public ConstantState<StateListAnimator> createConstantState() {
+ return new StateListAnimatorConstantState(this);
+ }
+
+ /**
* @hide
*/
public static class Tuple {
@@ -209,4 +297,36 @@
return mAnimator;
}
}
+
+ /**
+ * Creates a constant state which holds changing configurations information associated with the
+ * given Animator.
+ * <p>
+ * When new instance is called, default implementation clones the Animator.
+ */
+ private static class StateListAnimatorConstantState
+ extends ConstantState<StateListAnimator> {
+
+ final StateListAnimator mAnimator;
+
+ int mChangingConf;
+
+ public StateListAnimatorConstantState(StateListAnimator animator) {
+ mAnimator = animator;
+ mAnimator.mConstantState = this;
+ mChangingConf = mAnimator.getChangingConfigurations();
+ }
+
+ @Override
+ public int getChangingConfigurations() {
+ return mChangingConf;
+ }
+
+ @Override
+ public StateListAnimator newInstance() {
+ final StateListAnimator clone = mAnimator.clone();
+ clone.mConstantState = this;
+ return clone;
+ }
+ }
}
diff --git a/core/java/android/animation/ValueAnimator.java b/core/java/android/animation/ValueAnimator.java
index 0d17d67..07f79b8 100644
--- a/core/java/android/animation/ValueAnimator.java
+++ b/core/java/android/animation/ValueAnimator.java
@@ -16,6 +16,7 @@
package android.animation;
+import android.content.res.ConfigurationBoundResourceCache;
import android.os.Looper;
import android.os.Trace;
import android.util.AndroidRuntimeException;
@@ -1289,12 +1290,7 @@
public ValueAnimator clone() {
final ValueAnimator anim = (ValueAnimator) super.clone();
if (mUpdateListeners != null) {
- ArrayList<AnimatorUpdateListener> oldListeners = mUpdateListeners;
- anim.mUpdateListeners = new ArrayList<AnimatorUpdateListener>();
- int numListeners = oldListeners.size();
- for (int i = 0; i < numListeners; ++i) {
- anim.mUpdateListeners.add(oldListeners.get(i));
- }
+ anim.mUpdateListeners = new ArrayList<AnimatorUpdateListener>(mUpdateListeners);
}
anim.mSeekTime = -1;
anim.mPlayingBackwards = false;
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index dd49009..fa15ad7 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -2513,7 +2513,12 @@
}
public void handleInstallProvider(ProviderInfo info) {
- installContentProviders(mInitialApplication, Lists.newArrayList(info));
+ final StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
+ try {
+ installContentProviders(mInitialApplication, Lists.newArrayList(info));
+ } finally {
+ StrictMode.setThreadPolicy(oldPolicy);
+ }
}
private void handleEnterAnimationComplete(IBinder token) {
diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java
index add67f2..9bf8b3c 100644
--- a/core/java/android/app/EnterTransitionCoordinator.java
+++ b/core/java/android/app/EnterTransitionCoordinator.java
@@ -322,6 +322,7 @@
if (mListener != null) {
mListener.onRejectSharedElements(rejectedSnapshots);
}
+ removeNullViews(rejectedSnapshots);
startRejectedAnimations(rejectedSnapshots);
// Now start shared element transition
@@ -370,6 +371,16 @@
}
}
+ private static void removeNullViews(ArrayList<View> views) {
+ if (views != null) {
+ for (int i = views.size() - 1; i >= 0; i--) {
+ if (views.get(i) == null) {
+ views.remove(i);
+ }
+ }
+ }
+ }
+
private void onTakeSharedElements() {
if (!mIsReadyForTransition || mSharedElementsBundle == null) {
return;
diff --git a/core/java/android/app/KeyguardManager.java b/core/java/android/app/KeyguardManager.java
index cc9aed8..5038df9 100644
--- a/core/java/android/app/KeyguardManager.java
+++ b/core/java/android/app/KeyguardManager.java
@@ -16,10 +16,14 @@
package android.app;
+import android.app.trust.ITrustManager;
+import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.RemoteException;
import android.os.IBinder;
+import android.os.ServiceManager;
+import android.os.UserHandle;
import android.view.IWindowManager;
import android.view.IOnKeyguardExitResult;
import android.view.WindowManagerGlobal;
@@ -33,6 +37,7 @@
*/
public class KeyguardManager {
private IWindowManager mWM;
+ private ITrustManager mTrustManager;
/**
* Intent used to prompt user for device credentials.
@@ -151,6 +156,8 @@
KeyguardManager() {
mWM = WindowManagerGlobal.getWindowManagerService();
+ mTrustManager = ITrustManager.Stub.asInterface(
+ ServiceManager.getService(Context.TRUST_SERVICE));
}
/**
@@ -218,6 +225,34 @@
}
/**
+ * Return whether unlocking the device is currently not requiring a password
+ * because of a trust agent.
+ *
+ * @return true if the keyguard can currently be unlocked without entering credentials
+ * because the device is in a trusted environment.
+ */
+ public boolean isKeyguardInTrustedState() {
+ return isKeyguardInTrustedState(UserHandle.getCallingUserId());
+ }
+
+ /**
+ * Return whether unlocking the device is currently not requiring a password
+ * because of a trust agent.
+ *
+ * @param userId the user for which the trusted state should be reported.
+ * @return true if the keyguard can currently be unlocked without entering credentials
+ * because the device is in a trusted environment.
+ * @hide
+ */
+ public boolean isKeyguardInTrustedState(int userId) {
+ try {
+ return mTrustManager.isTrusted(userId);
+ } catch (RemoteException e) {
+ return false;
+ }
+ }
+
+ /**
* @deprecated Use {@link android.view.WindowManager.LayoutParams#FLAG_DISMISS_KEYGUARD}
* and/or {@link android.view.WindowManager.LayoutParams#FLAG_SHOW_WHEN_LOCKED}
* instead; this allows you to seamlessly hide the keyguard as your application
diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java
index 4aec9e0..b0dd70f 100644
--- a/core/java/android/app/UiAutomation.java
+++ b/core/java/android/app/UiAutomation.java
@@ -25,6 +25,7 @@
import android.graphics.Canvas;
import android.graphics.Point;
import android.hardware.display.DisplayManagerGlobal;
+import android.os.IBinder;
import android.os.Looper;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
@@ -919,7 +920,7 @@
public IAccessibilityServiceClientImpl(Looper looper) {
super(null, looper, new Callbacks() {
@Override
- public void onSetConnectionId(int connectionId) {
+ public void init(int connectionId, IBinder windowToken) {
synchronized (mLock) {
mConnectionId = connectionId;
mLock.notifyAll();
diff --git a/core/java/android/app/trust/ITrustManager.aidl b/core/java/android/app/trust/ITrustManager.aidl
index 6fbf87d..0193711 100644
--- a/core/java/android/app/trust/ITrustManager.aidl
+++ b/core/java/android/app/trust/ITrustManager.aidl
@@ -29,4 +29,5 @@
void reportRequireCredentialEntry(int userId);
void registerTrustListener(in ITrustListener trustListener);
void unregisterTrustListener(in ITrustListener trustListener);
+ boolean isTrusted(int userId);
}
diff --git a/core/java/android/bluetooth/le/BluetoothLeScanner.java b/core/java/android/bluetooth/le/BluetoothLeScanner.java
index a57c3ca..93ea299 100644
--- a/core/java/android/bluetooth/le/BluetoothLeScanner.java
+++ b/core/java/android/bluetooth/le/BluetoothLeScanner.java
@@ -51,6 +51,7 @@
private static final String TAG = "BluetoothLeScanner";
private static final boolean DBG = true;
+ private static final boolean VDBG = false;
private final IBluetoothManager mBluetoothManager;
private final Handler mHandler;
@@ -317,7 +318,7 @@
*/
@Override
public void onScanResult(final ScanResult scanResult) {
- if (DBG) Log.d(TAG, "onScanResult() - " + scanResult.toString());
+ if (VDBG) Log.d(TAG, "onScanResult() - " + scanResult.toString());
// Check null in case the scan has been stopped
synchronized (this) {
@@ -346,7 +347,7 @@
@Override
public void onFoundOrLost(final boolean onFound, final ScanResult scanResult) {
- if (DBG) {
+ if (VDBG) {
Log.d(TAG, "onFoundOrLost() - onFound = " + onFound +
" " + scanResult.toString());
}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index af6f181..7676e4b 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -876,12 +876,44 @@
* related methods.
*/
public static Intent createChooser(Intent target, CharSequence title) {
+ return createChooser(target, title, null);
+ }
+
+ /**
+ * Convenience function for creating a {@link #ACTION_CHOOSER} Intent.
+ *
+ * <p>Builds a new {@link #ACTION_CHOOSER} Intent that wraps the given
+ * target intent, also optionally supplying a title. If the target
+ * intent has specified {@link #FLAG_GRANT_READ_URI_PERMISSION} or
+ * {@link #FLAG_GRANT_WRITE_URI_PERMISSION}, then these flags will also be
+ * set in the returned chooser intent, with its ClipData set appropriately:
+ * either a direct reflection of {@link #getClipData()} if that is non-null,
+ * or a new ClipData built from {@link #getData()}.</p>
+ *
+ * <p>The caller may optionally supply an {@link IntentSender} to receive a callback
+ * when the user makes a choice. This can be useful if the calling application wants
+ * to remember the last chosen target and surface it as a more prominent or one-touch
+ * affordance elsewhere in the UI for next time.</p>
+ *
+ * @param target The Intent that the user will be selecting an activity
+ * to perform.
+ * @param title Optional title that will be displayed in the chooser.
+ * @param sender Optional IntentSender to be called when a choice is made.
+ * @return Return a new Intent object that you can hand to
+ * {@link Context#startActivity(Intent) Context.startActivity()} and
+ * related methods.
+ */
+ public static Intent createChooser(Intent target, CharSequence title, IntentSender sender) {
Intent intent = new Intent(ACTION_CHOOSER);
intent.putExtra(EXTRA_INTENT, target);
if (title != null) {
intent.putExtra(EXTRA_TITLE, title);
}
+ if (sender != null) {
+ intent.putExtra(EXTRA_CHOSEN_COMPONENT_INTENT_SENDER, sender);
+ }
+
// Migrate any clip data and flags from target.
int permFlags = target.getFlags() & (FLAG_GRANT_READ_URI_PERMISSION
| FLAG_GRANT_WRITE_URI_PERMISSION | FLAG_GRANT_PERSISTABLE_URI_PERMISSION
@@ -3140,6 +3172,26 @@
"android.intent.extra.REPLACEMENT_EXTRAS";
/**
+ * An {@link IntentSender} that will be notified if a user successfully chooses a target
+ * component to handle an action in an {@link #ACTION_CHOOSER} activity. The IntentSender
+ * will have the extra {@link #EXTRA_CHOSEN_COMPONENT} appended to it containing the
+ * {@link ComponentName} of the chosen component.
+ *
+ * <p>In some situations this callback may never come, for example if the user abandons
+ * the chooser, switches to another task or any number of other reasons. Apps should not
+ * be written assuming that this callback will always occur.</p>
+ */
+ public static final String EXTRA_CHOSEN_COMPONENT_INTENT_SENDER =
+ "android.intent.extra.CHOSEN_COMPONENT_INTENT_SENDER";
+
+ /**
+ * The {@link ComponentName} chosen by the user to complete an action.
+ *
+ * @see #EXTRA_CHOSEN_COMPONENT_INTENT_SENDER
+ */
+ public static final String EXTRA_CHOSEN_COMPONENT = "android.intent.extra.CHOSEN_COMPONENT";
+
+ /**
* A {@link android.view.KeyEvent} object containing the event that
* triggered the creation of the Intent it is in.
*/
diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java
index 27bbb24..acdd87e 100644
--- a/core/java/android/content/res/Configuration.java
+++ b/core/java/android/content/res/Configuration.java
@@ -1365,9 +1365,9 @@
ArrayList<String> parts = new ArrayList<String>();
if (config.mcc != 0) {
- parts.add(config.mcc + "mcc");
+ parts.add("mcc" + config.mcc);
if (config.mnc != 0) {
- parts.add(config.mnc + "mnc");
+ parts.add("mnc" + config.mnc);
}
}
diff --git a/core/java/android/content/res/ConfigurationBoundResourceCache.java b/core/java/android/content/res/ConfigurationBoundResourceCache.java
new file mode 100644
index 0000000..cde7e84
--- /dev/null
+++ b/core/java/android/content/res/ConfigurationBoundResourceCache.java
@@ -0,0 +1,138 @@
+/*
+* Copyright (C) 2014 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.content.res;
+
+import android.util.ArrayMap;
+import android.util.LongSparseArray;
+import java.lang.ref.WeakReference;
+
+/**
+ * A Cache class which can be used to cache resource objects that are easy to clone but more
+ * expensive to inflate.
+ * @hide
+ */
+public class ConfigurationBoundResourceCache<T> {
+
+ private final ArrayMap<String, LongSparseArray<WeakReference<ConstantState<T>>>> mCache =
+ new ArrayMap<String, LongSparseArray<WeakReference<ConstantState<T>>>>();
+
+ final Resources mResources;
+
+ /**
+ * Creates a Resource cache for the given Resources instance.
+ *
+ * @param resources The Resource which can be used when creating new instances.
+ */
+ public ConfigurationBoundResourceCache(Resources resources) {
+ mResources = resources;
+ }
+
+ /**
+ * Adds a new item to the cache.
+ *
+ * @param key A custom key that uniquely identifies the resource.
+ * @param theme The Theme instance where this resource was loaded.
+ * @param constantState The constant state that can create new instances of the resource.
+ *
+ */
+ public void put(long key, Resources.Theme theme, ConstantState<T> constantState) {
+ if (constantState == null) {
+ return;
+ }
+ final String themeKey = theme == null ? "" : theme.getKey();
+ LongSparseArray<WeakReference<ConstantState<T>>> themedCache;
+ synchronized (this) {
+ themedCache = mCache.get(themeKey);
+ if (themedCache == null) {
+ themedCache = new LongSparseArray<WeakReference<ConstantState<T>>>(1);
+ mCache.put(themeKey, themedCache);
+ }
+ themedCache.put(key, new WeakReference<ConstantState<T>>(constantState));
+ }
+ }
+
+ /**
+ * If the resource is cached, creates a new instance of it and returns.
+ *
+ * @param key The long key which can be used to uniquely identify the resource.
+ * @param theme The The Theme instance where we want to load this resource.
+ *
+ * @return If this resources was loaded before, returns a new instance of it. Otherwise, returns
+ * null.
+ */
+ public T get(long key, Resources.Theme theme) {
+ final String themeKey = theme != null ? theme.getKey() : "";
+ final LongSparseArray<WeakReference<ConstantState<T>>> themedCache;
+ final WeakReference<ConstantState<T>> wr;
+ synchronized (this) {
+ themedCache = mCache.get(themeKey);
+ if (themedCache == null) {
+ return null;
+ }
+ wr = themedCache.get(key);
+ }
+ if (wr == null) {
+ return null;
+ }
+ final ConstantState entry = wr.get();
+ if (entry != null) {
+ return (T) entry.newInstance(mResources, theme);
+ } else { // our entry has been purged
+ synchronized (this) {
+ // there is a potential race condition here where this entry may be put in
+ // another thread. But we prefer it to minimize lock duration
+ themedCache.delete(key);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Users of ConfigurationBoundResourceCache must call this method whenever a configuration
+ * change happens. On this callback, the cache invalidates all resources that are not valid
+ * anymore.
+ *
+ * @param configChanges The configuration changes
+ */
+ public void onConfigurationChange(final int configChanges) {
+ synchronized (this) {
+ final int size = mCache.size();
+ for (int i = size - 1; i >= 0; i--) {
+ final LongSparseArray<WeakReference<ConstantState<T>>>
+ themeCache = mCache.valueAt(i);
+ onConfigurationChangeInt(themeCache, configChanges);
+ if (themeCache.size() == 0) {
+ mCache.removeAt(i);
+ }
+ }
+ }
+ }
+
+ private void onConfigurationChangeInt(
+ final LongSparseArray<WeakReference<ConstantState<T>>> themeCache,
+ final int configChanges) {
+ final int size = themeCache.size();
+ for (int i = size - 1; i >= 0; i--) {
+ final WeakReference<ConstantState<T>> wr = themeCache.valueAt(i);
+ final ConstantState<T> constantState = wr.get();
+ if (constantState == null || Configuration.needNewResources(
+ configChanges, constantState.getChangingConfigurations())) {
+ themeCache.removeAt(i);
+ }
+ }
+ }
+
+}
diff --git a/core/java/android/content/res/ConstantState.java b/core/java/android/content/res/ConstantState.java
new file mode 100644
index 0000000..ee609df
--- /dev/null
+++ b/core/java/android/content/res/ConstantState.java
@@ -0,0 +1,61 @@
+/*
+* Copyright (C) 2014 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.content.res;
+
+/**
+ * A cache class that can provide new instances of a particular resource which may change
+ * depending on the current {@link Resources.Theme} or {@link Configuration}.
+ * <p>
+ * A constant state should be able to return a bitmask of changing configurations, which
+ * identifies the type of configuration changes that may invalidate this resource. These
+ * configuration changes can be obtained from {@link android.util.TypedValue}. Entities such as
+ * {@link android.animation.Animator} also provide a changing configuration method to include
+ * their dependencies (e.g. An AnimatorSet's changing configuration is the union of the
+ * changing configurations of each Animator in the set)
+ * @hide
+ */
+abstract public class ConstantState<T> {
+
+ /**
+ * Return a bit mask of configuration changes that will impact
+ * this resource (and thus require completely reloading it).
+ */
+ abstract public int getChangingConfigurations();
+
+ /**
+ * Create a new instance without supplying resources the caller
+ * is running in.
+ */
+ public abstract T newInstance();
+
+ /**
+ * Create a new instance from its constant state. This
+ * must be implemented for resources that change based on the target
+ * density of their caller (that is depending on whether it is
+ * in compatibility mode).
+ */
+ public T newInstance(Resources res) {
+ return newInstance();
+ }
+
+ /**
+ * Create a new instance from its constant state. This must be
+ * implemented for resources that can have a theme applied.
+ */
+ public T newInstance(Resources res, Resources.Theme theme) {
+ return newInstance(res);
+ }
+}
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index e34ce3e..6e9efe1 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -16,6 +16,8 @@
package android.content.res;
+import android.animation.Animator;
+import android.animation.StateListAnimator;
import android.util.Pools.SynchronizedPool;
import android.view.ViewDebug;
import com.android.internal.util.XmlUtils;
@@ -115,6 +117,10 @@
new ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>>();
private final LongSparseArray<WeakReference<ColorStateList>> mColorStateListCache =
new LongSparseArray<WeakReference<ColorStateList>>();
+ private final ConfigurationBoundResourceCache<Animator> mAnimatorCache =
+ new ConfigurationBoundResourceCache<Animator>(this);
+ private final ConfigurationBoundResourceCache<StateListAnimator> mStateListAnimatorCache =
+ new ConfigurationBoundResourceCache<StateListAnimator>(this);
private TypedValue mTmpValue = new TypedValue();
private boolean mPreloading;
@@ -183,6 +189,24 @@
}
/**
+ * Used by AnimatorInflater.
+ *
+ * @hide
+ */
+ public ConfigurationBoundResourceCache<Animator> getAnimatorCache() {
+ return mAnimatorCache;
+ }
+
+ /**
+ * Used by AnimatorInflater.
+ *
+ * @hide
+ */
+ public ConfigurationBoundResourceCache<StateListAnimator> getStateListAnimatorCache() {
+ return mStateListAnimatorCache;
+ }
+
+ /**
* This exception is thrown by the resource APIs when a requested resource
* can not be found.
*/
@@ -1761,23 +1785,7 @@
// the framework.
mCompatibilityInfo.applyToDisplayMetrics(mMetrics);
- int configChanges = 0xfffffff;
- if (config != null) {
- mTmpConfig.setTo(config);
- int density = config.densityDpi;
- if (density == Configuration.DENSITY_DPI_UNDEFINED) {
- density = mMetrics.noncompatDensityDpi;
- }
-
- mCompatibilityInfo.applyToConfiguration(density, mTmpConfig);
-
- if (mTmpConfig.locale == null) {
- mTmpConfig.locale = Locale.getDefault();
- mTmpConfig.setLayoutDirection(mTmpConfig.locale);
- }
- configChanges = mConfiguration.updateFrom(mTmpConfig);
- configChanges = ActivityInfo.activityInfoConfigToNative(configChanges);
- }
+ int configChanges = calcConfigChanges(config);
if (mConfiguration.locale == null) {
mConfiguration.locale = Locale.getDefault();
mConfiguration.setLayoutDirection(mConfiguration.locale);
@@ -1825,6 +1833,8 @@
clearDrawableCachesLocked(mDrawableCache, configChanges);
clearDrawableCachesLocked(mColorDrawableCache, configChanges);
+ mAnimatorCache.onConfigurationChange(configChanges);
+ mStateListAnimatorCache.onConfigurationChange(configChanges);
mColorStateListCache.clear();
@@ -1837,6 +1847,30 @@
}
}
+ /**
+ * Called by ConfigurationBoundResourceCacheTest via reflection.
+ */
+ private int calcConfigChanges(Configuration config) {
+ int configChanges = 0xfffffff;
+ if (config != null) {
+ mTmpConfig.setTo(config);
+ int density = config.densityDpi;
+ if (density == Configuration.DENSITY_DPI_UNDEFINED) {
+ density = mMetrics.noncompatDensityDpi;
+ }
+
+ mCompatibilityInfo.applyToConfiguration(density, mTmpConfig);
+
+ if (mTmpConfig.locale == null) {
+ mTmpConfig.locale = Locale.getDefault();
+ mTmpConfig.setLayoutDirection(mTmpConfig.locale);
+ }
+ configChanges = mConfiguration.updateFrom(mTmpConfig);
+ configChanges = ActivityInfo.activityInfoConfigToNative(configChanges);
+ }
+ return configChanges;
+ }
+
private void clearDrawableCachesLocked(
ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>> caches,
int configChanges) {
diff --git a/core/java/android/hardware/hdmi/HdmiClient.java b/core/java/android/hardware/hdmi/HdmiClient.java
index aba90e47..45a79e1 100644
--- a/core/java/android/hardware/hdmi/HdmiClient.java
+++ b/core/java/android/hardware/hdmi/HdmiClient.java
@@ -3,13 +3,12 @@
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.hardware.hdmi.HdmiControlManager.VendorCommandListener;
-import android.hardware.hdmi.IHdmiVendorCommandListener;
import android.os.RemoteException;
import android.util.Log;
/**
* Parent for classes of various HDMI-CEC device type used to access
- * {@link HdmiControlService}. Contains methods and data used in common.
+ * the HDMI control system service. Contains methods and data used in common.
*
* @hide
*/
@@ -17,11 +16,13 @@
public abstract class HdmiClient {
private static final String TAG = "HdmiClient";
- protected final IHdmiControlService mService;
+ /* package */ final IHdmiControlService mService;
- protected abstract int getDeviceType();
+ private IHdmiVendorCommandListener mIHdmiVendorCommandListener;
- public HdmiClient(IHdmiControlService service) {
+ /* package */ abstract int getDeviceType();
+
+ /* package */ HdmiClient(IHdmiControlService service) {
mService = service;
}
@@ -41,7 +42,7 @@
}
/**
- * Send a key event to other logical device.
+ * Sends a key event to other logical device.
*
* @param keyCode key code to send. Defined in {@link android.view.KeyEvent}.
* @param isPressed true if this is key press event
@@ -55,7 +56,7 @@
}
/**
- * Send vendor-specific command.
+ * Sends vendor-specific command.
*
* @param targetAddress address of the target device
* @param params vendor-specific parameter. For <Vendor Command With ID> do not
@@ -72,18 +73,23 @@
}
/**
- * Add a listener used to receive incoming vendor-specific command.
+ * Sets a listener used to receive incoming vendor-specific command.
*
* @param listener listener object
*/
- public void addVendorCommandListener(@NonNull VendorCommandListener listener) {
+ public void setVendorCommandListener(@NonNull VendorCommandListener listener) {
if (listener == null) {
throw new IllegalArgumentException("listener cannot be null");
}
+ if (mIHdmiVendorCommandListener != null) {
+ throw new IllegalStateException("listener was already set");
+ }
try {
- mService.addVendorCommandListener(getListenerWrapper(listener), getDeviceType());
+ IHdmiVendorCommandListener wrappedListener = getListenerWrapper(listener);
+ mService.addVendorCommandListener(wrappedListener, getDeviceType());
+ mIHdmiVendorCommandListener = wrappedListener;
} catch (RemoteException e) {
- Log.e(TAG, "failed to add vendor command listener: ", e);
+ Log.e(TAG, "failed to set vendor command listener: ", e);
}
}
@@ -91,8 +97,13 @@
final VendorCommandListener listener) {
return new IHdmiVendorCommandListener.Stub() {
@Override
- public void onReceived(int srcAddress, byte[] params, boolean hasVendorId) {
- listener.onReceived(srcAddress, params, hasVendorId);
+ public void onReceived(int srcAddress, int destAddress, byte[] params,
+ boolean hasVendorId) {
+ listener.onReceived(srcAddress, destAddress, params, hasVendorId);
+ }
+ @Override
+ public void onControlStateChanged(boolean enabled, int reason) {
+ listener.onControlStateChanged(enabled, reason);
}
};
}
diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java
index 30f3576..308a219 100644
--- a/core/java/android/hardware/hdmi/HdmiControlManager.java
+++ b/core/java/android/hardware/hdmi/HdmiControlManager.java
@@ -21,6 +21,8 @@
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemApi;
import android.os.RemoteException;
+import android.util.ArrayMap;
+import android.util.Log;
/**
* The {@link HdmiControlManager} class is used to send HDMI control messages
@@ -36,6 +38,8 @@
*/
@SystemApi
public final class HdmiControlManager {
+ private static final String TAG = "HdmiControlManager";
+
@Nullable private final IHdmiControlService mService;
/**
@@ -56,7 +60,7 @@
/**
* Message used by TV to receive volume status from Audio Receiver. It should check volume value
- * that is retrieved from extra value with the key {@link #EXTRA_MESSAGE_EXTRAM_PARAM1}. If the
+ * that is retrieved from extra value with the key {@link #EXTRA_MESSAGE_EXTRA_PARAM1}. If the
* value is in range of [0,100], it is current volume of Audio Receiver. And there is another
* value, {@link #AVR_VOLUME_MUTED}, which is used to inform volume mute.
*/
@@ -71,7 +75,7 @@
* Used as an extra field in the intent {@link #ACTION_OSD_MESSAGE}. Contains the extra value
* of the message.
*/
- public static final String EXTRA_MESSAGE_EXTRAM_PARAM1 =
+ public static final String EXTRA_MESSAGE_EXTRA_PARAM1 =
"android.hardware.hdmi.extra.MESSAGE_EXTRA_PARAM1";
/**
@@ -236,16 +240,24 @@
/** Clear timer error - CEC is disabled. */
public static final int CLEAR_TIMER_STATUS_CEC_DISABLE = 0xA2;
+ /** The HdmiControlService is started. */
+ public static final int CONTROL_STATE_CHANGED_REASON_START = 0;
+ /** The state of HdmiControlService is changed by changing of settings. */
+ public static final int CONTROL_STATE_CHANGED_REASON_SETTING = 1;
+ /** The HdmiControlService is enabled to wake up. */
+ public static final int CONTROL_STATE_CHANGED_REASON_WAKEUP = 2;
+ /** The HdmiControlService will be disabled to standby. */
+ public static final int CONTROL_STATE_CHANGED_REASON_STANDBY = 3;
+
// True if we have a logical device of type playback hosted in the system.
private final boolean mHasPlaybackDevice;
// True if we have a logical device of type TV hosted in the system.
private final boolean mHasTvDevice;
/**
- * @hide - hide this constructor because it has a parameter of type
- * IHdmiControlService, which is a system private class. The right way
- * to create an instance of this class is using the factory
- * Context.getSystemService.
+ * {@hide} - hide this constructor because it has a parameter of type IHdmiControlService,
+ * which is a system private class. The right way to create an instance of this class is
+ * using the factory Context.getSystemService.
*/
public HdmiControlManager(IHdmiControlService service) {
mService = service;
@@ -331,6 +343,9 @@
void onReceived(HdmiHotplugEvent event);
}
+ private final ArrayMap<HotplugEventListener, IHdmiHotplugEventListener>
+ mHotplugEventListeners = new ArrayMap<>();
+
/**
* Listener used to get vendor-specific commands.
*/
@@ -339,11 +354,29 @@
* Called when a vendor command is received.
*
* @param srcAddress source logical address
+ * @param destAddress destination logical address
* @param params vendor-specific parameters
* @param hasVendorId {@code true} if the command is <Vendor Command
* With ID>. The first 3 bytes of params is vendor id.
*/
- void onReceived(int srcAddress, byte[] params, boolean hasVendorId);
+ void onReceived(int srcAddress, int destAddress, byte[] params, boolean hasVendorId);
+
+ /**
+ * The callback is called:
+ * <ul>
+ * <li> before HdmiControlService is disabled.
+ * <li> after HdmiControlService is enabled and the local address is assigned.
+ * </ul>
+ * The client shouldn't hold the thread too long since this is a blocking call.
+ *
+ * @param enabled {@code true} if HdmiControlService is enabled.
+ * @param reason the reason code why the state of HdmiControlService is changed.
+ * @see #CONTROL_STATE_CHANGED_REASON_START
+ * @see #CONTROL_STATE_CHANGED_REASON_SETTING
+ * @see #CONTROL_STATE_CHANGED_REASON_WAKEUP
+ * @see #CONTROL_STATE_CHANGED_REASON_STANDBY
+ */
+ void onControlStateChanged(boolean enabled, int reason);
}
/**
@@ -357,12 +390,19 @@
*/
public void addHotplugEventListener(HotplugEventListener listener) {
if (mService == null) {
+ Log.e(TAG, "HdmiControlService is not available");
return;
}
+ if (mHotplugEventListeners.containsKey(listener)) {
+ Log.e(TAG, "listener is already registered");
+ return;
+ }
+ IHdmiHotplugEventListener wrappedListener = getHotplugEventListenerWrapper(listener);
+ mHotplugEventListeners.put(listener, wrappedListener);
try {
- mService.addHotplugEventListener(getHotplugEventListenerWrapper(listener));
+ mService.addHotplugEventListener(wrappedListener);
} catch (RemoteException e) {
- // Do nothing.
+ Log.e(TAG, "failed to add hotplug event listener: ", e);
}
}
@@ -373,12 +413,18 @@
*/
public void removeHotplugEventListener(HotplugEventListener listener) {
if (mService == null) {
+ Log.e(TAG, "HdmiControlService is not available");
+ return;
+ }
+ IHdmiHotplugEventListener wrappedListener = mHotplugEventListeners.remove(listener);
+ if (wrappedListener == null) {
+ Log.e(TAG, "tried to remove not-registered listener");
return;
}
try {
- mService.removeHotplugEventListener(getHotplugEventListenerWrapper(listener));
+ mService.removeHotplugEventListener(wrappedListener);
} catch (RemoteException e) {
- // Do nothing.
+ Log.e(TAG, "failed to remove hotplug event listener: ", e);
}
}
diff --git a/core/java/android/hardware/hdmi/HdmiDeviceInfo.java b/core/java/android/hardware/hdmi/HdmiDeviceInfo.java
index 7abea36..fe414e6 100644
--- a/core/java/android/hardware/hdmi/HdmiDeviceInfo.java
+++ b/core/java/android/hardware/hdmi/HdmiDeviceInfo.java
@@ -237,14 +237,14 @@
}
/**
- * Return the id of the device.
+ * Returns the id of the device.
*/
public int getId() {
return mId;
}
/**
- * Return the id to be used for CEC device.
+ * Returns the id to be used for CEC device.
*
* @param address logical address of CEC device
* @return id for CEC device
@@ -255,7 +255,7 @@
}
/**
- * Return the id to be used for MHL device.
+ * Returns the id to be used for MHL device.
*
* @param portId port which the MHL device is connected to
* @return id for MHL device
@@ -266,7 +266,7 @@
}
/**
- * Return the id to be used for hardware port.
+ * Returns the id to be used for hardware port.
*
* @param portId port id
* @return id for hardware port
@@ -276,28 +276,28 @@
}
/**
- * Return the CEC logical address of the device.
+ * Returns the CEC logical address of the device.
*/
public int getLogicalAddress() {
return mLogicalAddress;
}
/**
- * Return the physical address of the device.
+ * Returns the physical address of the device.
*/
public int getPhysicalAddress() {
return mPhysicalAddress;
}
/**
- * Return the port ID.
+ * Returns the port ID.
*/
public int getPortId() {
return mPortId;
}
/**
- * Return CEC type of the device. For more details, refer constants between {@link #DEVICE_TV}
+ * Returns CEC type of the device. For more details, refer constants between {@link #DEVICE_TV}
* and {@link #DEVICE_INACTIVE}.
*/
public int getDeviceType() {
@@ -305,7 +305,7 @@
}
/**
- * Return device's power status. It should be one of the following values.
+ * Returns device's power status. It should be one of the following values.
* <ul>
* <li>{@link HdmiControlManager#POWER_STATUS_ON}
* <li>{@link HdmiControlManager#POWER_STATUS_STANDBY}
@@ -319,21 +319,21 @@
}
/**
- * Return MHL device id. Return -1 for non-MHL device.
+ * Returns MHL device id. Return -1 for non-MHL device.
*/
public int getDeviceId() {
return mDeviceId;
}
/**
- * Return MHL adopter id. Return -1 for non-MHL device.
+ * Returns MHL adopter id. Return -1 for non-MHL device.
*/
public int getAdopterId() {
return mAdopterId;
}
/**
- * Return {@code true} if the device is of a type that can be an input source.
+ * Returns {@code true} if the device is of a type that can be an input source.
*/
public boolean isSourceType() {
return mDeviceType == DEVICE_PLAYBACK
@@ -342,7 +342,7 @@
}
/**
- * Return {@code true} if the device represents an HDMI-CEC device. {@code false} if the device
+ * Returns {@code true} if the device represents an HDMI-CEC device. {@code false} if the device
* is either MHL or other device.
*/
public boolean isCecDevice() {
@@ -350,7 +350,7 @@
}
/**
- * Return {@code true} if the device represents an MHL device. {@code false} if the device is
+ * Returns {@code true} if the device represents an MHL device. {@code false} if the device is
* either CEC or other device.
*/
public boolean isMhlDevice() {
@@ -358,14 +358,14 @@
}
/**
- * Return display (OSD) name of the device.
+ * Returns display (OSD) name of the device.
*/
public String getDisplayName() {
return mDisplayName;
}
/**
- * Return vendor id of the device. Vendor id is used to distinguish devices built by other
+ * Returns vendor id of the device. Vendor id is used to distinguish devices built by other
* manufactures. This is required for vendor-specific command on CEC standard.
*/
public int getVendorId() {
@@ -373,7 +373,7 @@
}
/**
- * Describe the kinds of special objects contained in this Parcelable's marshalled
+ * Describes the kinds of special objects contained in this Parcelable's marshalled
* representation.
*/
@Override
@@ -382,7 +382,7 @@
}
/**
- * Serialize this object into a {@link Parcel}.
+ * Serializes this object into a {@link Parcel}.
*
* @param dest The Parcel in which the object should be written.
* @param flags Additional flags about how the object should be written. May be 0 or
diff --git a/core/java/android/hardware/hdmi/HdmiHotplugEvent.java b/core/java/android/hardware/hdmi/HdmiHotplugEvent.java
index 7be4bc5..9476742 100644
--- a/core/java/android/hardware/hdmi/HdmiHotplugEvent.java
+++ b/core/java/android/hardware/hdmi/HdmiHotplugEvent.java
@@ -44,7 +44,7 @@
}
/**
- * Return the port number for which the event occurred.
+ * Returns the port number for which the event occurred.
*
* @return port number
*/
@@ -53,7 +53,7 @@
}
/**
- * Return the connection status associated with this event
+ * Returns the connection status associated with this event
*
* @return true if the device gets connected; otherwise false
*/
@@ -62,7 +62,7 @@
}
/**
- * Describe the kinds of special objects contained in this Parcelable's
+ * Describes the kinds of special objects contained in this Parcelable's
* marshalled representation.
*/
@Override
@@ -71,7 +71,7 @@
}
/**
- * Flatten this object in to a Parcel.
+ * Flattens this object in to a Parcel.
*
* @param dest The Parcel in which the object should be written.
* @param flags Additional flags about how the object should be written.
@@ -86,17 +86,19 @@
public static final Parcelable.Creator<HdmiHotplugEvent> CREATOR
= new Parcelable.Creator<HdmiHotplugEvent>() {
/**
- * Rebuild a {@link HdmiHotplugEvent} previously stored with
+ * Rebuilds a {@link HdmiHotplugEvent} previously stored with
* {@link Parcelable#writeToParcel(Parcel, int)}.
*
* @param p {@link HdmiHotplugEvent} object to read the Rating from
* @return a new {@link HdmiHotplugEvent} created from the data in the parcel
*/
+ @Override
public HdmiHotplugEvent createFromParcel(Parcel p) {
int port = p.readInt();
boolean connected = p.readByte() == 1;
return new HdmiHotplugEvent(port, connected);
}
+ @Override
public HdmiHotplugEvent[] newArray(int size) {
return new HdmiHotplugEvent[size];
}
diff --git a/core/java/android/hardware/hdmi/HdmiPlaybackClient.java b/core/java/android/hardware/hdmi/HdmiPlaybackClient.java
index 85ccb74..263d6b1 100644
--- a/core/java/android/hardware/hdmi/HdmiPlaybackClient.java
+++ b/core/java/android/hardware/hdmi/HdmiPlaybackClient.java
@@ -64,12 +64,12 @@
public void onComplete(int status);
}
- HdmiPlaybackClient(IHdmiControlService service) {
+ /* package */ HdmiPlaybackClient(IHdmiControlService service) {
super(service);
}
/**
- * Perform the feature 'one touch play' from playback device to turn on display
+ * Performs the feature 'one touch play' from playback device to turn on display
* and switch the input.
*
* @param callback {@link OneTouchPlayCallback} object to get informed
@@ -90,7 +90,7 @@
}
/**
- * Get the status of display device connected through HDMI bus.
+ * Gets the status of display device connected through HDMI bus.
*
* @param callback {@link DisplayStatusCallback} object to get informed
* of the result
diff --git a/core/java/android/hardware/hdmi/HdmiPortInfo.java b/core/java/android/hardware/hdmi/HdmiPortInfo.java
index 2ec6126..e52baed 100644
--- a/core/java/android/hardware/hdmi/HdmiPortInfo.java
+++ b/core/java/android/hardware/hdmi/HdmiPortInfo.java
@@ -114,7 +114,7 @@
}
/**
- * Describe the kinds of special objects contained in this Parcelable's
+ * Describes the kinds of special objects contained in this Parcelable's
* marshalled representation.
*/
@Override
@@ -146,7 +146,7 @@
};
/**
- * Serialize this object into a {@link Parcel}.
+ * Serializes this object into a {@link Parcel}.
*
* @param dest The Parcel in which the object should be written.
* @param flags Additional flags about how the object should be written.
diff --git a/core/java/android/hardware/hdmi/HdmiRecordListener.java b/core/java/android/hardware/hdmi/HdmiRecordListener.java
index f6a348a..29f6cfc 100644
--- a/core/java/android/hardware/hdmi/HdmiRecordListener.java
+++ b/core/java/android/hardware/hdmi/HdmiRecordListener.java
@@ -25,7 +25,7 @@
*/
@SystemApi
public abstract class HdmiRecordListener {
- protected HdmiRecordListener() {}
+ public HdmiRecordListener() {}
/**
* Called when TV received one touch record request from record device. The client of this
@@ -34,7 +34,7 @@
* @param recorderAddress
* @return record source to be used for recording. Null if no device is available.
*/
- public abstract RecordSource getOneTouchRecordSource(int recorderAddress);
+ public abstract RecordSource onOneTouchRecordSourceRequested(int recorderAddress);
/**
* Called when one touch record is started or failed during initialization.
diff --git a/core/java/android/hardware/hdmi/HdmiRecordSources.java b/core/java/android/hardware/hdmi/HdmiRecordSources.java
index c294f72..922b8e7 100644
--- a/core/java/android/hardware/hdmi/HdmiRecordSources.java
+++ b/core/java/android/hardware/hdmi/HdmiRecordSources.java
@@ -59,21 +59,21 @@
*/
@SystemApi
public static abstract class RecordSource {
- protected final int mSourceType;
- protected final int mExtraDataSize;
+ /* package */ final int mSourceType;
+ /* package */ final int mExtraDataSize;
- protected RecordSource(int sourceType, int extraDataSize) {
+ /* package */ RecordSource(int sourceType, int extraDataSize) {
mSourceType = sourceType;
mExtraDataSize = extraDataSize;
}
- abstract int extraParamToByteArray(byte[] data, int index);
+ /* package */ abstract int extraParamToByteArray(byte[] data, int index);
- final int getDataSize(boolean includeType) {
+ /* package */ final int getDataSize(boolean includeType) {
return includeType ? mExtraDataSize + 1 : mExtraDataSize;
}
- final int toByteArray(boolean includeType, byte[] data, int index) {
+ /* package */ final int toByteArray(boolean includeType, byte[] data, int index) {
if (includeType) {
// 1 to 8 bytes (depends on source).
// {[Record Source Type]} |
@@ -94,7 +94,7 @@
// ---- Own source -----------------------------------------------------------------------------
// ---------------------------------------------------------------------------------------------
/**
- * Create {@link OwnSource} of own source.
+ * Creates {@link OwnSource} of own source.
*/
public static OwnSource ofOwnSource() {
return new OwnSource();
@@ -311,7 +311,7 @@
*/
public static final class DigitalChannelData implements DigitalServiceIdentification {
/** Identifies the logical or virtual channel number of a service. */
- private ChannelIdentifier mChannelIdentifier;
+ private final ChannelIdentifier mChannelIdentifier;
public static DigitalChannelData ofTwoNumbers(int majorNumber, int minorNumber) {
return new DigitalChannelData(
@@ -338,7 +338,7 @@
}
/**
- * Create {@link DigitalServiceSource} with channel type.
+ * Creates {@link DigitalServiceSource} with channel type.
*
* @param broadcastSystem digital broadcast system. It should be one of
* <ul>
@@ -389,7 +389,7 @@
}
/**
- * Create {@link DigitalServiceSource} of ARIB type.
+ * Creates {@link DigitalServiceSource} of ARIB type.
*
* @param aribType ARIB type. It should be one of
* <ul>
@@ -420,7 +420,7 @@
}
/**
- * Create {@link DigitalServiceSource} of ATSC type.
+ * Creates {@link DigitalServiceSource} of ATSC type.
*
* @param atscType ATSC type. It should be one of
* <ul>
@@ -451,7 +451,7 @@
}
/**
- * Create {@link DigitalServiceSource} of ATSC type.
+ * Creates {@link DigitalServiceSource} of ATSC type.
*
* @param dvbType DVB type. It should be one of
* <ul>
@@ -572,7 +572,7 @@
public static final int BROADCAST_SYSTEM_PAL_OTHER_SYSTEM = 31;
/**
- * Create {@link AnalogueServiceSource} of analogue service.
+ * Creates {@link AnalogueServiceSource} of analogue service.
*
* @param broadcastType
* @param frequency
@@ -615,7 +615,7 @@
*/
@SystemApi
public static final class AnalogueServiceSource extends RecordSource {
- static final int EXTRA_DATA_SIZE = 4;
+ /* package */ static final int EXTRA_DATA_SIZE = 4;
/** Indicates the Analogue broadcast type. */
private final int mBroadcastType;
@@ -635,7 +635,7 @@
}
@Override
- protected int extraParamToByteArray(byte[] data, int index) {
+ /* package */ int extraParamToByteArray(byte[] data, int index) {
// [Analogue Broadcast Type] - 1 byte
data[index] = (byte) mBroadcastType;
// [Analogue Frequency] - 2 bytes
@@ -651,7 +651,7 @@
// ---- External plug data ---------------------------------------------------------------------
// ---------------------------------------------------------------------------------------------
/**
- * Create {@link ExternalPlugData} of external plug type.
+ * Creates {@link ExternalPlugData} of external plug type.
*
* @param plugNumber plug number. It should be in range of [1, 255]
* @hide
@@ -695,7 +695,7 @@
// ---- External physical address --------------------------------------------------------------
// ---------------------------------------------------------------------------------------------
/**
- * Create {@link ExternalPhysicalAddress} of external physical address.
+ * Creates {@link ExternalPhysicalAddress} of external physical address.
*
* @param physicalAddress
* @hide
@@ -754,7 +754,7 @@
}
/**
- * Check the byte array of record source.
+ * Checks the byte array of record source.
* @hide
*/
@SystemApi
diff --git a/core/java/android/hardware/hdmi/HdmiTimerRecordSources.java b/core/java/android/hardware/hdmi/HdmiTimerRecordSources.java
index 1780707..bf97375 100644
--- a/core/java/android/hardware/hdmi/HdmiTimerRecordSources.java
+++ b/core/java/android/hardware/hdmi/HdmiTimerRecordSources.java
@@ -67,7 +67,7 @@
private HdmiTimerRecordSources() {}
/**
- * Create {@link TimerRecordSource} for digital source which is used for <Set Digital
+ * Creates {@link TimerRecordSource} for digital source which is used for <Set Digital
* Timer>.
*
* @param timerInfo timer info used for timer recording
@@ -82,7 +82,7 @@
}
/**
- * Create {@link TimerRecordSource} for analogue source which is used for <Set Analogue
+ * Creates {@link TimerRecordSource} for analogue source which is used for <Set Analogue
* Timer>.
*
* @param timerInfo timer info used for timer recording
@@ -97,7 +97,7 @@
}
/**
- * Create {@link TimerRecordSource} for external plug which is used for <Set External
+ * Creates {@link TimerRecordSource} for external plug which is used for <Set External
* Timer>.
*
* @param timerInfo timer info used for timer recording
@@ -112,7 +112,7 @@
}
/**
- * Create {@link TimerRecordSource} for external physical address which is used for <Set
+ * Creates {@link TimerRecordSource} for external physical address which is used for <Set
* External Timer>.
*
* @param timerInfo timer info used for timer recording
@@ -140,7 +140,7 @@
}
/**
- * Create {@link Duration} for time value.
+ * Creates {@link Duration} for time value.
*
* @param hour hour in range of [0, 23]
* @param minute minute in range of [0, 60]
@@ -162,7 +162,7 @@
}
/**
- * Create {@link Duration} for duration value.
+ * Creates {@link Duration} for duration value.
*
* @param hour hour in range of [0, 99]
* @param minute minute in range of [0, 59]
@@ -184,21 +184,21 @@
}
private static class TimeUnit {
- protected final int mHour;
- protected final int mMinute;
+ /* package */ final int mHour;
+ /* package */ final int mMinute;
- protected TimeUnit(int hour, int minute) {
+ /* package */ TimeUnit(int hour, int minute) {
mHour = hour;
mMinute = minute;
}
- protected int toByteArray(byte[] data, int index) {
+ /* package */ int toByteArray(byte[] data, int index) {
data[index] = toBcdByte(mHour);
data[index + 1] = toBcdByte(mMinute);
return 2;
}
- protected static byte toBcdByte(int value) {
+ /* package */ static byte toBcdByte(int value) {
int digitOfTen = (value / 10) % 10;
int digitOfOne = value % 10;
return (byte) ((digitOfTen << 4) | digitOfOne);
@@ -247,7 +247,7 @@
RECORDING_SEQUENCE_REPEAT_SATUREDAY);
/**
- * Create {@link TimerInfo} with the given information.
+ * Creates {@link TimerInfo} with the given information.
*
* @param dayOfMonth day of month
* @param monthOfYear month of year
@@ -426,7 +426,7 @@
}
/**
- * Check the byte array of timer record source.
+ * Checks the byte array of timer record source.
* @param sourcetype
* @param recordSource
* @hide
diff --git a/core/java/android/hardware/hdmi/HdmiTvClient.java b/core/java/android/hardware/hdmi/HdmiTvClient.java
index 9d92fd9..dbfb4ef 100644
--- a/core/java/android/hardware/hdmi/HdmiTvClient.java
+++ b/core/java/android/hardware/hdmi/HdmiTvClient.java
@@ -24,6 +24,9 @@
import libcore.util.EmptyArray;
+import java.util.Collections;
+import java.util.List;
+
/**
* HdmiTvClient represents HDMI-CEC logical device of type TV in the Android system
* which acts as TV/Display. It provides with methods that manage, interact with other
@@ -40,13 +43,13 @@
*/
public static final int VENDOR_DATA_SIZE = 16;
- HdmiTvClient(IHdmiControlService service) {
+ /* package */ HdmiTvClient(IHdmiControlService service) {
super(service);
}
// Factory method for HdmiTvClient.
// Declared package-private. Accessed by HdmiControlManager only.
- static HdmiTvClient create(IHdmiControlService service) {
+ /* package */ static HdmiTvClient create(IHdmiControlService service) {
return new HdmiTvClient(service);
}
@@ -68,7 +71,7 @@
}
/**
- * Select a CEC logical device to be a new active source.
+ * Selects a CEC logical device to be a new active source.
*
* @param logicalAddress logical address of the device to select
* @param callback callback to get the result with
@@ -95,7 +98,7 @@
}
/**
- * Select a HDMI port to be a new route path.
+ * Selects a HDMI port to be a new route path.
*
* @param portId HDMI port to select
* @param callback callback to get the result with
@@ -125,7 +128,7 @@
}
/**
- * Set the listener used to get informed of the input change event.
+ * Sets the listener used to get informed of the input change event.
*
* @param listener listener object
*/
@@ -150,7 +153,22 @@
}
/**
- * Set system audio volume
+ * Returns all the CEC devices connected to TV.
+ *
+ * @return list of {@link HdmiDeviceInfo} for connected CEC devices.
+ * Empty list is returned if there is none.
+ */
+ public List<HdmiDeviceInfo> getDeviceList() {
+ try {
+ return mService.getDeviceList();
+ } catch (RemoteException e) {
+ Log.e("TAG", "Failed to call getDeviceList():", e);
+ return Collections.<HdmiDeviceInfo>emptyList();
+ }
+ }
+
+ /**
+ * Sets system audio volume
*
* @param oldIndex current volume index
* @param newIndex volume index to be set
@@ -165,7 +183,7 @@
}
/**
- * Set system audio mute status
+ * Sets system audio mute status
*
* @param mute {@code true} if muted; otherwise, {@code false}
*/
@@ -178,7 +196,7 @@
}
/**
- * Set record listener
+ * Sets record listener
*
* @param listener
*/
@@ -198,7 +216,7 @@
@Override
public byte[] getOneTouchRecordSource(int recorderAddress) {
HdmiRecordSources.RecordSource source =
- callback.getOneTouchRecordSource(recorderAddress);
+ callback.onOneTouchRecordSourceRequested(recorderAddress);
if (source == null) {
return EmptyArray.BYTE;
}
@@ -226,13 +244,13 @@
}
/**
- * Start one touch recording with the given recorder address and recorder source.
+ * Starts one touch recording with the given recorder address and recorder source.
* <p>
* Usage
* <pre>
* HdmiTvClient tvClient = ....;
* // for own source.
- * OwnSource ownSource = ownHdmiRecordSources.ownSource();
+ * OwnSource ownSource = HdmiRecordSources.ofOwnSource();
* tvClient.startOneTouchRecord(recorderAddress, ownSource);
* </pre>
*/
@@ -251,7 +269,7 @@
}
/**
- * Stop one touch record.
+ * Stops one touch record.
*
* @param recorderAddress recorder address where recoding will be stopped
*/
@@ -264,7 +282,7 @@
}
/**
- * Start timer recording with the given recoder address and recorder source.
+ * Starts timer recording with the given recoder address and recorder source.
* <p>
* Usage
* <pre>
@@ -313,7 +331,7 @@
}
/**
- * Clear timer recording with the given recorder address and recording source.
+ * Clears timer recording with the given recorder address and recording source.
* For more details, please refer {@link #startTimerRecording(int, int, TimerRecordSource)}.
*/
public void clearTimerRecording(int recorderAddress, int sourceType, TimerRecordSource source) {
@@ -339,7 +357,7 @@
}
/**
- * Set {@link HdmiMhlVendorCommandListener} to get incoming MHL vendor command.
+ * Sets {@link HdmiMhlVendorCommandListener} to get incoming MHL vendor command.
*
* @param listener to receive incoming MHL vendor command
*/
@@ -365,7 +383,7 @@
}
/**
- * Send MHL vendor command to the device connected to a port of the given portId.
+ * Sends MHL vendor command to the device connected to a port of the given portId.
*
* @param portId id of port to send MHL vendor command
* @param offset offset in the in given data
diff --git a/core/java/android/hardware/hdmi/IHdmiControlService.aidl b/core/java/android/hardware/hdmi/IHdmiControlService.aidl
index 4866a9a..c1e924e 100644
--- a/core/java/android/hardware/hdmi/IHdmiControlService.aidl
+++ b/core/java/android/hardware/hdmi/IHdmiControlService.aidl
@@ -59,6 +59,7 @@
void setSystemAudioMute(boolean mute);
void setInputChangeListener(IHdmiInputChangeListener listener);
List<HdmiDeviceInfo> getInputDevices();
+ List<HdmiDeviceInfo> getDeviceList();
void sendVendorCommand(int deviceType, int targetAddress, in byte[] params,
boolean hasVendorId);
void addVendorCommandListener(IHdmiVendorCommandListener listener, int deviceType);
diff --git a/core/java/android/hardware/hdmi/IHdmiVendorCommandListener.aidl b/core/java/android/hardware/hdmi/IHdmiVendorCommandListener.aidl
index 55cc925..a16e878 100644
--- a/core/java/android/hardware/hdmi/IHdmiVendorCommandListener.aidl
+++ b/core/java/android/hardware/hdmi/IHdmiVendorCommandListener.aidl
@@ -23,5 +23,6 @@
* @hide
*/
oneway interface IHdmiVendorCommandListener {
- void onReceived(int logicalAddress, in byte[] operands, boolean hasVendorId);
+ void onReceived(int logicalAddress, int destAddress, in byte[] operands, boolean hasVendorId);
+ void onControlStateChanged(boolean enabled, int reason);
}
diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java
index 58f0fc0..4fa0593 100644
--- a/core/java/android/net/Network.java
+++ b/core/java/android/net/Network.java
@@ -21,7 +21,9 @@
import android.os.Parcel;
import android.system.ErrnoException;
+import java.io.FileDescriptor;
import java.io.IOException;
+import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
@@ -264,18 +266,40 @@
}
/**
+ * Binds the specified {@link DatagramSocket} to this {@code Network}. All data traffic on the
+ * socket will be sent on this {@code Network}, irrespective of any process-wide network binding
+ * set by {@link ConnectivityManager#setProcessDefaultNetwork}. The socket must not be
+ * connected.
+ */
+ public void bindSocket(DatagramSocket socket) throws IOException {
+ // Apparently, the kernel doesn't update a connected UDP socket's routing upon mark changes.
+ if (socket.isConnected()) {
+ throw new SocketException("Socket is connected");
+ }
+ // Query a property of the underlying socket to ensure that the socket's file descriptor
+ // exists, is available to bind to a network and is not closed.
+ socket.getReuseAddress();
+ bindSocketFd(socket.getFileDescriptor$());
+ }
+
+ /**
* Binds the specified {@link Socket} to this {@code Network}. All data traffic on the socket
* will be sent on this {@code Network}, irrespective of any process-wide network binding set by
* {@link ConnectivityManager#setProcessDefaultNetwork}. The socket must not be connected.
*/
public void bindSocket(Socket socket) throws IOException {
+ // Apparently, the kernel doesn't update a connected TCP socket's routing upon mark changes.
if (socket.isConnected()) {
throw new SocketException("Socket is connected");
}
- // Query a property of the underlying socket to ensure the underlying
- // socket exists so a file descriptor is available to bind to a network.
+ // Query a property of the underlying socket to ensure that the socket's file descriptor
+ // exists, is available to bind to a network and is not closed.
socket.getReuseAddress();
- int err = NetworkUtils.bindSocketToNetwork(socket.getFileDescriptor$().getInt$(), netId);
+ bindSocketFd(socket.getFileDescriptor$());
+ }
+
+ private void bindSocketFd(FileDescriptor fd) throws IOException {
+ int err = NetworkUtils.bindSocketToNetwork(fd.getInt$(), netId);
if (err != 0) {
// bindSocketToNetwork returns negative errno.
throw new ErrnoException("Binding socket to network " + netId, -err)
diff --git a/core/java/android/net/Proxy.java b/core/java/android/net/Proxy.java
index 6a78c29..3477b02 100644
--- a/core/java/android/net/Proxy.java
+++ b/core/java/android/net/Proxy.java
@@ -19,17 +19,10 @@
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.content.Context;
-import android.net.ProxyInfo;
import android.text.TextUtils;
import android.util.Log;
-
import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.conn.routing.HttpRoute;
-import org.apache.http.conn.routing.HttpRoutePlanner;
-import org.apache.http.conn.scheme.SchemeRegistry;
-import org.apache.http.protocol.HttpContext;
import java.net.InetSocketAddress;
import java.net.ProxySelector;
@@ -212,6 +205,7 @@
* is no proxy.
* {@hide}
*/
+ // TODO: Get rid of this method. It's used only in tests.
public static final HttpHost getPreferredHttpHost(Context context,
String url) {
java.net.Proxy prefProxy = getProxy(context, url);
diff --git a/core/java/android/net/ProxyInfo.java b/core/java/android/net/ProxyInfo.java
index 1534e2c..7694420 100644
--- a/core/java/android/net/ProxyInfo.java
+++ b/core/java/android/net/ProxyInfo.java
@@ -36,7 +36,13 @@
*
* Other HTTP stacks will need to obtain the proxy info from
* {@link Proxy#PROXY_CHANGE_ACTION} broadcast as the extra {@link Proxy#EXTRA_PROXY_INFO}.
+ *
+ * @deprecated Please use {@link java.net.URL#openConnection}, {@link java.net.Proxy} and
+ * friends. The Apache HTTP client is no longer maintained and may be removed in a future
+ * release. Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
+ * for further details.
*/
+@Deprecated
public class ProxyInfo implements Parcelable {
private String mHost;
diff --git a/core/java/android/net/SSLCertificateSocketFactory.java b/core/java/android/net/SSLCertificateSocketFactory.java
index b0278d3..c15e6e5 100644
--- a/core/java/android/net/SSLCertificateSocketFactory.java
+++ b/core/java/android/net/SSLCertificateSocketFactory.java
@@ -154,7 +154,13 @@
* for none. The socket timeout is reset to 0 after the handshake.
* @param cache The {@link SSLSessionCache} to use, or null for no cache.
* @return a new SocketFactory with the specified parameters
+ *
+ * @deprecated Use {@link #getDefault()} along with a {@link javax.net.ssl.HttpsURLConnection}
+ * instead. The Apache HTTP client is no longer maintained and may be removed in a future
+ * release. Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
+ * for further details.
*/
+ @Deprecated
public static org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(
int handshakeTimeoutMillis, SSLSessionCache cache) {
return new org.apache.http.conn.ssl.SSLSocketFactory(
diff --git a/core/java/android/net/http/AndroidHttpClient.java b/core/java/android/net/http/AndroidHttpClient.java
index 04f3974..a262076 100644
--- a/core/java/android/net/http/AndroidHttpClient.java
+++ b/core/java/android/net/http/AndroidHttpClient.java
@@ -74,7 +74,13 @@
* To retain cookies, simply add a cookie store to the HttpContext:</p>
*
* <pre>context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);</pre>
+ *
+ * @deprecated Please use {@link java.net.URLConnection} and friends instead.
+ * The Apache HTTP client is no longer maintained and may be removed in a future
+ * release. Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
+ * for further details.
*/
+@Deprecated
public final class AndroidHttpClient implements HttpClient {
// Gzip of data shorter than this probably won't be worthwhile
@@ -108,7 +114,13 @@
* @param userAgent to report in your HTTP requests
* @param context to use for caching SSL sessions (may be null for no caching)
* @return AndroidHttpClient for you to use for all your requests.
+ *
+ * @deprecated Please use {@link java.net.URLConnection} and friends instead. See
+ * {@link android.net.SSLCertificateSocketFactory} for SSL cache support. If you'd
+ * like to set a custom useragent, please use {@link java.net.URLConnection#setRequestProperty(String, String)}
+ * with {@code field} set to {@code User-Agent}.
*/
+ @Deprecated
public static AndroidHttpClient newInstance(String userAgent, Context context) {
HttpParams params = new BasicHttpParams();
@@ -148,7 +160,13 @@
* Create a new HttpClient with reasonable defaults (which you can update).
* @param userAgent to report in your HTTP requests.
* @return AndroidHttpClient for you to use for all your requests.
+ *
+ * @deprecated Please use {@link java.net.URLConnection} and friends instead. See
+ * {@link android.net.SSLCertificateSocketFactory} for SSL cache support. If you'd
+ * like to set a custom useragent, please use {@link java.net.URLConnection#setRequestProperty(String, String)}
+ * with {@code field} set to {@code User-Agent}.
*/
+ @Deprecated
public static AndroidHttpClient newInstance(String userAgent) {
return newInstance(userAgent, null /* session cache */);
}
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index ee36012..f361695b 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -554,6 +554,7 @@
/**
* Temporary until we completely switch to {@link #LOLLIPOP}.
+ * @hide
*/
public static final int L = 21;
@@ -566,9 +567,32 @@
* <li> {@link android.content.Context#bindService Context.bindService} now
* requires an explicit Intent, and will throw an exception if given an implicit
* Intent.</li>
+ * <li> {@link android.app.Notification.Builder Notification.Builder} will
+ * not have the colors of their various notification elements adjusted to better
+ * match the new material design look.</li>
+ * <li> {@link android.os.Message} will validate that a message is not currently
+ * in use when it is recycled.</li>
+ * <li> Hardware accelerated drawing in windows will be enabled automatically
+ * in most places.</li>
+ * <li> {@link android.widget.Spinner} throws an exception if attaching an
+ * adapter with more than one item type.</li>
+ * <li> If the app is a launcher, the launcher will be available to the user
+ * even when they are using corporate profiles (which requires that the app
+ * use {@link android.content.pm.LauncherApps} to correctly populate its
+ * apps UI).</li>
+ * <li> Calling {@link android.app.Service#stopForeground Service.stopForeground}
+ * with removeNotification false will modify the still posted notification so that
+ * it is no longer forced to be ongoing.</li>
+ * <li> A {@link android.service.dreams.DreamService} must require the
+ * {@link android.Manifest.permission#BIND_DREAM_SERVICE} permission to be usable.</li>
* </ul>
*/
public static final int LOLLIPOP = 21;
+
+ /**
+ * Lollipop with an extra sugar coating on the outside!
+ */
+ public static final int LOLLIPOP_MR1 = 22;
}
/** The type of build, like "user" or "eng". */
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index 18730b6..084ca30 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -1093,7 +1093,15 @@
/** @hide */
public static final int MEMINFO_ZRAM_TOTAL = 8;
/** @hide */
- public static final int MEMINFO_COUNT = 9;
+ public static final int MEMINFO_MAPPED = 9;
+ /** @hide */
+ public static final int MEMINFO_VM_ALLOC_USED = 10;
+ /** @hide */
+ public static final int MEMINFO_PAGE_TABLES = 11;
+ /** @hide */
+ public static final int MEMINFO_KERNEL_STACK = 12;
+ /** @hide */
+ public static final int MEMINFO_COUNT = 13;
/**
* Retrieves /proc/meminfo. outSizes is filled with fields
diff --git a/core/java/android/preference/ListPreference.java b/core/java/android/preference/ListPreference.java
index 8081a54..9482a72 100644
--- a/core/java/android/preference/ListPreference.java
+++ b/core/java/android/preference/ListPreference.java
@@ -162,10 +162,10 @@
@Override
public CharSequence getSummary() {
final CharSequence entry = getEntry();
- if (mSummary == null || entry == null) {
+ if (mSummary == null) {
return super.getSummary();
} else {
- return String.format(mSummary, entry);
+ return String.format(mSummary, entry == null ? "" : entry);
}
}
diff --git a/core/java/android/preference/SeekBarVolumizer.java b/core/java/android/preference/SeekBarVolumizer.java
index a680b51..3130b64 100644
--- a/core/java/android/preference/SeekBarVolumizer.java
+++ b/core/java/android/preference/SeekBarVolumizer.java
@@ -130,6 +130,7 @@
}
private void postStartSample() {
+ if (mHandler == null) return;
mHandler.removeMessages(MSG_START_SAMPLE);
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_START_SAMPLE),
isSamplePlaying() ? CHECK_RINGTONE_PLAYBACK_DELAY_MS : 0);
@@ -150,7 +151,8 @@
}
}
- void postStopSample() {
+ private void postStopSample() {
+ if (mHandler == null) return;
// remove pending delayed start messages
mHandler.removeMessages(MSG_START_SAMPLE);
mHandler.removeMessages(MSG_STOP_SAMPLE);
@@ -200,7 +202,8 @@
postSetVolume(progress);
}
- void postSetVolume(int progress) {
+ private void postSetVolume(int progress) {
+ if (mHandler == null) return;
// Do the volume changing separately to give responsive UI
mLastProgress = progress;
mHandler.removeMessages(MSG_SET_STREAM_VOLUME);
diff --git a/core/java/android/preference/VolumePreference.java b/core/java/android/preference/VolumePreference.java
index 86d96f2..0d4c0b6 100644
--- a/core/java/android/preference/VolumePreference.java
+++ b/core/java/android/preference/VolumePreference.java
@@ -117,7 +117,7 @@
public void onActivityStop() {
if (mSeekBarVolumizer != null) {
- mSeekBarVolumizer.postStopSample();
+ mSeekBarVolumizer.stopSample();
}
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 75c435ea..98a1f05 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -5095,6 +5095,12 @@
public static final String AIRPLANE_MODE_ON = "airplane_mode_on";
/**
+ * Whether Theater Mode is on.
+ * {@hide}
+ */
+ public static final String THEATER_MODE_ON = "theater_mode_on";
+
+ /**
* Constant for use in AIRPLANE_MODE_RADIOS to specify Bluetooth radio.
*/
public static final String RADIO_BLUETOOTH = "bluetooth";
@@ -6593,7 +6599,7 @@
* Type: int (0 for false, 1 for true)
* @hide
*/
- public static final String VOLTE_VT_ENABLED = "volte_vt_enabled";
+ public static final String ENHANCED_4G_MODE_ENABLED = "volte_vt_enabled";
/**
* Settings to backup. This is here so that it's in the same place as the settings
diff --git a/core/java/android/text/format/Time.java b/core/java/android/text/format/Time.java
index aa6ad20..1e04eb4 100644
--- a/core/java/android/text/format/Time.java
+++ b/core/java/android/text/format/Time.java
@@ -48,7 +48,10 @@
* <li>Much of the formatting / parsing assumes ASCII text and is therefore not suitable for
* use with non-ASCII scripts.</li>
* </ul>
+ *
+ * @deprecated Use {@link java.util.GregorianCalendar} instead.
*/
+@Deprecated
public class Time {
private static final String Y_M_D_T_H_M_S_000 = "%Y-%m-%dT%H:%M:%S.000";
private static final String Y_M_D_T_H_M_S_000_Z = "%Y-%m-%dT%H:%M:%S.000Z";
diff --git a/core/java/android/transition/ChangeBounds.java b/core/java/android/transition/ChangeBounds.java
index 0da5fb6..c82587b 100644
--- a/core/java/android/transition/ChangeBounds.java
+++ b/core/java/android/transition/ChangeBounds.java
@@ -16,7 +16,9 @@
package android.transition;
+import android.animation.AnimatorSet;
import android.content.Context;
+import android.content.res.TypedArray;
import android.graphics.PointF;
import android.animation.Animator;
@@ -31,11 +33,12 @@
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
-import android.util.IntProperty;
import android.util.Property;
import android.view.View;
import android.view.ViewGroup;
+import com.android.internal.R;
+
import java.util.Map;
/**
@@ -43,17 +46,20 @@
* the scene change and animates those changes during the transition.
*
* <p>A ChangeBounds transition can be described in a resource file by using the
- * tag <code>changeBounds</code>, along with the other standard
+ * tag <code>changeBounds</code>, using its attributes of
+ * {@link android.R.styleable#ChangeBounds} along with the other standard
* attributes of {@link android.R.styleable#Transition}.</p>
*/
public class ChangeBounds extends Transition {
private static final String PROPNAME_BOUNDS = "android:changeBounds:bounds";
+ private static final String PROPNAME_CLIP = "android:changeBounds:clip";
private static final String PROPNAME_PARENT = "android:changeBounds:parent";
private static final String PROPNAME_WINDOW_X = "android:changeBounds:windowX";
private static final String PROPNAME_WINDOW_Y = "android:changeBounds:windowY";
private static final String[] sTransitionProperties = {
PROPNAME_BOUNDS,
+ PROPNAME_CLIP,
PROPNAME_PARENT,
PROPNAME_WINDOW_X,
PROPNAME_WINDOW_Y
@@ -77,6 +83,83 @@
}
};
+ private static final Property<ViewBounds, PointF> TOP_LEFT_PROPERTY =
+ new Property<ViewBounds, PointF>(PointF.class, "topLeft") {
+ @Override
+ public void set(ViewBounds viewBounds, PointF topLeft) {
+ viewBounds.setTopLeft(topLeft);
+ }
+
+ @Override
+ public PointF get(ViewBounds viewBounds) {
+ return null;
+ }
+ };
+
+ private static final Property<ViewBounds, PointF> BOTTOM_RIGHT_PROPERTY =
+ new Property<ViewBounds, PointF>(PointF.class, "bottomRight") {
+ @Override
+ public void set(ViewBounds viewBounds, PointF bottomRight) {
+ viewBounds.setBottomRight(bottomRight);
+ }
+
+ @Override
+ public PointF get(ViewBounds viewBounds) {
+ return null;
+ }
+ };
+
+ private static final Property<View, PointF> BOTTOM_RIGHT_ONLY_PROPERTY =
+ new Property<View, PointF>(PointF.class, "bottomRight") {
+ @Override
+ public void set(View view, PointF bottomRight) {
+ int left = view.getLeft();
+ int top = view.getTop();
+ int right = Math.round(bottomRight.x);
+ int bottom = Math.round(bottomRight.y);
+ view.setLeftTopRightBottom(left, top, right, bottom);
+ }
+
+ @Override
+ public PointF get(View view) {
+ return null;
+ }
+ };
+
+ private static final Property<View, PointF> TOP_LEFT_ONLY_PROPERTY =
+ new Property<View, PointF>(PointF.class, "topLeft") {
+ @Override
+ public void set(View view, PointF topLeft) {
+ int left = Math.round(topLeft.x);
+ int top = Math.round(topLeft.y);
+ int right = view.getRight();
+ int bottom = view.getBottom();
+ view.setLeftTopRightBottom(left, top, right, bottom);
+ }
+
+ @Override
+ public PointF get(View view) {
+ return null;
+ }
+ };
+
+ private static final Property<View, PointF> POSITION_PROPERTY =
+ new Property<View, PointF>(PointF.class, "position") {
+ @Override
+ public void set(View view, PointF topLeft) {
+ int left = Math.round(topLeft.x);
+ int top = Math.round(topLeft.y);
+ int right = left + view.getWidth();
+ int bottom = top + view.getHeight();
+ view.setLeftTopRightBottom(left, top, right, bottom);
+ }
+
+ @Override
+ public PointF get(View view) {
+ return null;
+ }
+ };
+
int[] tempLocation = new int[2];
boolean mResizeClip = false;
boolean mReparent = false;
@@ -88,6 +171,11 @@
public ChangeBounds(Context context, AttributeSet attrs) {
super(context, attrs);
+
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ChangeBounds);
+ boolean resizeClip = a.getBoolean(R.styleable.ChangeBounds_resizeClip, false);
+ a.recycle();
+ setResizeClip(resizeClip);
}
@Override
@@ -95,11 +183,37 @@
return sTransitionProperties;
}
+ /**
+ * When <code>resizeClip</code> is true, ChangeBounds resizes the view using the clipBounds
+ * instead of changing the dimensions of the view during the animation. When
+ * <code>resizeClip</code> is false, ChangeBounds resizes the View by changing its dimensions.
+ *
+ * <p>When resizeClip is set to true, the clip bounds is modified by ChangeBounds. Therefore,
+ * {@link android.transition.ChangeClipBounds} is not compatible with ChangeBounds
+ * in this mode.</p>
+ *
+ * @param resizeClip Used to indicate whether the view bounds should be modified or the
+ * clip bounds should be modified by ChangeBounds.
+ * @see android.view.View#setClipBounds(android.graphics.Rect)
+ * @attr ref android.R.styleable#ChangeBounds_resizeClip
+ */
public void setResizeClip(boolean resizeClip) {
mResizeClip = resizeClip;
}
/**
+ * Returns true when the ChangeBounds will resize by changing the clip bounds during the
+ * view animation or false when bounds are changed. The default value is false.
+ *
+ * @return true when the ChangeBounds will resize by changing the clip bounds during the
+ * view animation or false when bounds are changed. The default value is false.
+ * @attr ref android.R.styleable#ChangeBounds_resizeClip
+ */
+ public boolean getResizeClip() {
+ return mResizeClip;
+ }
+
+ /**
* Setting this flag tells ChangeBounds to track the before/after parent
* of every view using this transition. The flag is not enabled by
* default because it requires the parent instances to be the same
@@ -127,6 +241,9 @@
values.values.put(PROPNAME_WINDOW_X, tempLocation[0]);
values.values.put(PROPNAME_WINDOW_Y, tempLocation[1]);
}
+ if (mResizeClip) {
+ values.values.put(PROPNAME_CLIP, view.getClipBounds());
+ }
}
}
@@ -170,158 +287,149 @@
if (parentMatches(startParent, endParent)) {
Rect startBounds = (Rect) startValues.values.get(PROPNAME_BOUNDS);
Rect endBounds = (Rect) endValues.values.get(PROPNAME_BOUNDS);
- int startLeft = startBounds.left;
- int endLeft = endBounds.left;
- int startTop = startBounds.top;
- int endTop = endBounds.top;
- int startRight = startBounds.right;
- int endRight = endBounds.right;
- int startBottom = startBounds.bottom;
- int endBottom = endBounds.bottom;
- int startWidth = startRight - startLeft;
- int startHeight = startBottom - startTop;
- int endWidth = endRight - endLeft;
- int endHeight = endBottom - endTop;
+ final int startLeft = startBounds.left;
+ final int endLeft = endBounds.left;
+ final int startTop = startBounds.top;
+ final int endTop = endBounds.top;
+ final int startRight = startBounds.right;
+ final int endRight = endBounds.right;
+ final int startBottom = startBounds.bottom;
+ final int endBottom = endBounds.bottom;
+ final int startWidth = startRight - startLeft;
+ final int startHeight = startBottom - startTop;
+ final int endWidth = endRight - endLeft;
+ final int endHeight = endBottom - endTop;
+ Rect startClip = (Rect) startValues.values.get(PROPNAME_CLIP);
+ Rect endClip = (Rect) endValues.values.get(PROPNAME_CLIP);
int numChanges = 0;
if ((startWidth != 0 && startHeight != 0) || (endWidth != 0 && endHeight != 0)) {
if (startLeft != endLeft || startTop != endTop) ++numChanges;
if (startRight != endRight || startBottom != endBottom) ++numChanges;
}
+ if ((startClip != null && !startClip.equals(endClip)) ||
+ (startClip == null && endClip != null)) {
+ ++numChanges;
+ }
if (numChanges > 0) {
+ Animator anim;
if (!mResizeClip) {
- Animator anim;
- if (startWidth == endWidth && startHeight == endHeight) {
- view.offsetLeftAndRight(startLeft - view.getLeft());
- view.offsetTopAndBottom(startTop - view.getTop());
- Path positionPath = getPathMotion().getPath(0, 0, endLeft - startLeft,
- endTop - startTop);
- anim = ObjectAnimator.ofInt(view, new HorizontalOffsetProperty(),
- new VerticalOffsetProperty(), positionPath);
- } else {
- if (startLeft != endLeft) view.setLeft(startLeft);
- if (startTop != endTop) view.setTop(startTop);
- if (startRight != endRight) view.setRight(startRight);
- if (startBottom != endBottom) view.setBottom(startBottom);
- ObjectAnimator topLeftAnimator = null;
- if (startLeft != endLeft || startTop != endTop) {
+ view.setLeftTopRightBottom(startLeft, startTop, startRight, startBottom);
+ if (numChanges == 2) {
+ if (startWidth == endWidth && startHeight == endHeight) {
+ Path topLeftPath = getPathMotion().getPath(startLeft, startTop, endLeft,
+ endTop);
+ anim = ObjectAnimator.ofObject(view, POSITION_PROPERTY, null,
+ topLeftPath);
+ } else {
+ final ViewBounds viewBounds = new ViewBounds(view);
Path topLeftPath = getPathMotion().getPath(startLeft, startTop,
endLeft, endTop);
- topLeftAnimator = ObjectAnimator
- .ofInt(view, "left", "top", topLeftPath);
- }
- ObjectAnimator bottomRightAnimator = null;
- if (startRight != endRight || startBottom != endBottom) {
+ ObjectAnimator topLeftAnimator = ObjectAnimator
+ .ofObject(viewBounds, TOP_LEFT_PROPERTY, null, topLeftPath);
+
Path bottomRightPath = getPathMotion().getPath(startRight, startBottom,
endRight, endBottom);
- bottomRightAnimator = ObjectAnimator.ofInt(view, "right", "bottom",
- bottomRightPath);
+ ObjectAnimator bottomRightAnimator = ObjectAnimator.ofObject(viewBounds,
+ BOTTOM_RIGHT_PROPERTY, null, bottomRightPath);
+ AnimatorSet set = new AnimatorSet();
+ set.playTogether(topLeftAnimator, bottomRightAnimator);
+ anim = set;
+ set.addListener(new AnimatorListenerAdapter() {
+ // We need a strong reference to viewBounds until the
+ // animator ends.
+ private ViewBounds mViewBounds = viewBounds;
+ });
}
- anim = TransitionUtils.mergeAnimators(topLeftAnimator,
- bottomRightAnimator);
+ } else if (startLeft != endLeft || startTop != endTop) {
+ Path topLeftPath = getPathMotion().getPath(startLeft, startTop,
+ endLeft, endTop);
+ anim = ObjectAnimator.ofObject(view, TOP_LEFT_ONLY_PROPERTY, null,
+ topLeftPath);
+ } else {
+ Path bottomRight = getPathMotion().getPath(startRight, startBottom,
+ endRight, endBottom);
+ anim = ObjectAnimator.ofObject(view, BOTTOM_RIGHT_ONLY_PROPERTY, null,
+ bottomRight);
}
- if (view.getParent() instanceof ViewGroup) {
- final ViewGroup parent = (ViewGroup) view.getParent();
- parent.suppressLayout(true);
- TransitionListener transitionListener = new TransitionListenerAdapter() {
- boolean mCanceled = false;
-
- @Override
- public void onTransitionCancel(Transition transition) {
- parent.suppressLayout(false);
- mCanceled = true;
- }
-
- @Override
- public void onTransitionEnd(Transition transition) {
- if (!mCanceled) {
- parent.suppressLayout(false);
- }
- }
-
- @Override
- public void onTransitionPause(Transition transition) {
- parent.suppressLayout(false);
- }
-
- @Override
- public void onTransitionResume(Transition transition) {
- parent.suppressLayout(true);
- }
- };
- addListener(transitionListener);
- }
- return anim;
} else {
- if (startWidth != endWidth) view.setRight(endLeft +
- Math.max(startWidth, endWidth));
- if (startHeight != endHeight) view.setBottom(endTop +
- Math.max(startHeight, endHeight));
- // TODO: don't clobber TX/TY
- if (startLeft != endLeft) view.setTranslationX(startLeft - endLeft);
- if (startTop != endTop) view.setTranslationY(startTop - endTop);
- // Animate location with translationX/Y and size with clip bounds
- float transXDelta = endLeft - startLeft;
- float transYDelta = endTop - startTop;
- int widthDelta = endWidth - startWidth;
- int heightDelta = endHeight - startHeight;
- numChanges = 0;
- if (transXDelta != 0) numChanges++;
- if (transYDelta != 0) numChanges++;
- if (widthDelta != 0 || heightDelta != 0) numChanges++;
- ObjectAnimator translationAnimator = null;
- if (transXDelta != 0 || transYDelta != 0) {
- Path topLeftPath = getPathMotion().getPath(0, 0, transXDelta, transYDelta);
- translationAnimator = ObjectAnimator.ofFloat(view, View.TRANSLATION_X,
- View.TRANSLATION_Y, topLeftPath);
+ int maxWidth = Math.max(startWidth, endWidth);
+ int maxHeight = Math.max(startHeight, endHeight);
+
+ view.setLeftTopRightBottom(startLeft, startTop, startLeft + maxWidth,
+ startTop + maxHeight);
+
+ ObjectAnimator positionAnimator = null;
+ if (startLeft != endLeft || startTop != endTop) {
+ Path topLeftPath = getPathMotion().getPath(startLeft, startTop, endLeft,
+ endTop);
+ positionAnimator = ObjectAnimator.ofObject(view, POSITION_PROPERTY, null,
+ topLeftPath);
+ }
+ final Rect finalClip = endClip;
+ if (startClip == null) {
+ startClip = new Rect(0, 0, startWidth, startHeight);
+ }
+ if (endClip == null) {
+ endClip = new Rect(0, 0, endWidth, endHeight);
}
ObjectAnimator clipAnimator = null;
- if (widthDelta != 0 || heightDelta != 0) {
- Rect tempStartBounds = new Rect(0, 0, startWidth, startHeight);
- Rect tempEndBounds = new Rect(0, 0, endWidth, endHeight);
+ if (!startClip.equals(endClip)) {
+ view.setClipBounds(startClip);
clipAnimator = ObjectAnimator.ofObject(view, "clipBounds", sRectEvaluator,
- tempStartBounds, tempEndBounds);
- }
- Animator anim = TransitionUtils.mergeAnimators(translationAnimator,
- clipAnimator);
- if (view.getParent() instanceof ViewGroup) {
- final ViewGroup parent = (ViewGroup) view.getParent();
- parent.suppressLayout(true);
- TransitionListener transitionListener = new TransitionListenerAdapter() {
- boolean mCanceled = false;
+ startClip, endClip);
+ clipAnimator.addListener(new AnimatorListenerAdapter() {
+ private boolean mIsCanceled;
@Override
- public void onTransitionCancel(Transition transition) {
- parent.suppressLayout(false);
- mCanceled = true;
+ public void onAnimationCancel(Animator animation) {
+ mIsCanceled = true;
}
@Override
- public void onTransitionEnd(Transition transition) {
- if (!mCanceled) {
- parent.suppressLayout(false);
+ public void onAnimationEnd(Animator animation) {
+ if (!mIsCanceled) {
+ view.setClipBounds(finalClip);
+ view.setLeftTopRightBottom(endLeft, endTop, endRight,
+ endBottom);
}
}
+ });
+ }
+ anim = TransitionUtils.mergeAnimators(positionAnimator,
+ clipAnimator);
+ }
+ if (view.getParent() instanceof ViewGroup) {
+ final ViewGroup parent = (ViewGroup) view.getParent();
+ parent.suppressLayout(true);
+ TransitionListener transitionListener = new TransitionListenerAdapter() {
+ boolean mCanceled = false;
- @Override
- public void onTransitionPause(Transition transition) {
+ @Override
+ public void onTransitionCancel(Transition transition) {
+ parent.suppressLayout(false);
+ mCanceled = true;
+ }
+
+ @Override
+ public void onTransitionEnd(Transition transition) {
+ if (!mCanceled) {
parent.suppressLayout(false);
}
-
- @Override
- public void onTransitionResume(Transition transition) {
- parent.suppressLayout(true);
- }
- };
- addListener(transitionListener);
- }
- anim.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- view.setClipBounds(null);
}
- });
- return anim;
+
+ @Override
+ public void onTransitionPause(Transition transition) {
+ parent.suppressLayout(false);
+ }
+
+ @Override
+ public void onTransitionResume(Transition transition) {
+ parent.suppressLayout(true);
+ }
+ };
+ addListener(transitionListener);
}
+ return anim;
}
} else {
int startX = (Integer) startValues.values.get(PROPNAME_WINDOW_X);
@@ -357,47 +465,41 @@
return null;
}
- private abstract static class OffsetProperty extends IntProperty<View> {
- int mPreviousValue;
+ private static class ViewBounds {
+ private int mLeft;
+ private int mTop;
+ private int mRight;
+ private int mBottom;
+ private boolean mIsTopLeftSet;
+ private boolean mIsBottomRightSet;
+ private View mView;
- public OffsetProperty(String name) {
- super(name);
+ public ViewBounds(View view) {
+ mView = view;
}
- @Override
- public void setValue(View view, int value) {
- int offset = value - mPreviousValue;
- offsetBy(view, offset);
- mPreviousValue = value;
+ public void setTopLeft(PointF topLeft) {
+ mLeft = Math.round(topLeft.x);
+ mTop = Math.round(topLeft.y);
+ mIsTopLeftSet = true;
+ if (mIsBottomRightSet) {
+ setLeftTopRightBottom();
+ }
}
- @Override
- public Integer get(View object) {
- return null;
+ public void setBottomRight(PointF bottomRight) {
+ mRight = Math.round(bottomRight.x);
+ mBottom = Math.round(bottomRight.y);
+ mIsBottomRightSet = true;
+ if (mIsTopLeftSet) {
+ setLeftTopRightBottom();
+ }
}
- protected abstract void offsetBy(View view, int by);
- }
-
- private static class HorizontalOffsetProperty extends OffsetProperty {
- public HorizontalOffsetProperty() {
- super("offsetLeftAndRight");
- }
-
- @Override
- protected void offsetBy(View view, int by) {
- view.offsetLeftAndRight(by);
- }
- }
-
- private static class VerticalOffsetProperty extends OffsetProperty {
- public VerticalOffsetProperty() {
- super("offsetTopAndBottom");
- }
-
- @Override
- protected void offsetBy(View view, int by) {
- view.offsetTopAndBottom(by);
+ private void setLeftTopRightBottom() {
+ mView.setLeftTopRightBottom(mLeft, mTop, mRight, mBottom);
+ mIsTopLeftSet = false;
+ mIsBottomRightSet = false;
}
}
}
diff --git a/core/java/android/transition/Transition.java b/core/java/android/transition/Transition.java
index 6dede46..e99c2cf 100644
--- a/core/java/android/transition/Transition.java
+++ b/core/java/android/transition/Transition.java
@@ -1790,6 +1790,10 @@
private static boolean isValueChanged(TransitionValues oldValues, TransitionValues newValues,
String key) {
+ if (oldValues.values.containsKey(key) != newValues.values.containsKey(key)) {
+ // The transition didn't care about this particular value, so we don't care, either.
+ return false;
+ }
Object oldValue = oldValues.values.get(key);
Object newValue = newValues.values.get(key);
boolean changed;
diff --git a/core/java/android/transition/Visibility.java b/core/java/android/transition/Visibility.java
index f58291f..36bac31 100644
--- a/core/java/android/transition/Visibility.java
+++ b/core/java/android/transition/Visibility.java
@@ -484,12 +484,19 @@
@Override
boolean areValuesChanged(TransitionValues oldValues, TransitionValues newValues) {
- VisibilityInfo changeInfo = getVisibilityChangeInfo(oldValues, newValues);
if (oldValues == null && newValues == null) {
return false;
}
+ if (oldValues != null && newValues != null &&
+ newValues.values.containsKey(PROPNAME_VISIBILITY) !=
+ oldValues.values.containsKey(PROPNAME_VISIBILITY)) {
+ // The transition wasn't targeted in either the start or end, so it couldn't
+ // have changed.
+ return false;
+ }
+ VisibilityInfo changeInfo = getVisibilityChangeInfo(oldValues, newValues);
return changeInfo.visibilityChange && (changeInfo.startVisibility == View.VISIBLE ||
- changeInfo.endVisibility == View.VISIBLE);
+ changeInfo.endVisibility == View.VISIBLE);
}
/**
diff --git a/core/java/android/util/FloatMath.java b/core/java/android/util/FloatMath.java
index 0ffd5bd..bdcf5ca 100644
--- a/core/java/android/util/FloatMath.java
+++ b/core/java/android/util/FloatMath.java
@@ -21,7 +21,10 @@
* versions of Android with a JIT, these are significantly slower than
* the equivalent {@code Math} functions, which should be used in preference
* to these.
+ *
+ * @deprecated Use {@link java.lang.Math} instead.
*/
+@Deprecated
public class FloatMath {
/** Prevents instantiation. */
diff --git a/core/java/android/util/IntArray.java b/core/java/android/util/IntArray.java
new file mode 100644
index 0000000..e8d3947
--- /dev/null
+++ b/core/java/android/util/IntArray.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2014 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.util;
+
+import com.android.internal.util.ArrayUtils;
+
+import libcore.util.EmptyArray;
+
+/**
+ * Implements a growing array of int primitives.
+ *
+ * @hide
+ */
+public class IntArray implements Cloneable {
+ private static final int MIN_CAPACITY_INCREMENT = 12;
+
+ private int[] mValues;
+ private int mSize;
+
+ /**
+ * Creates an empty IntArray with the default initial capacity.
+ */
+ public IntArray() {
+ this(10);
+ }
+
+ /**
+ * Creates an empty IntArray with the specified initial capacity.
+ */
+ public IntArray(int initialCapacity) {
+ if (initialCapacity == 0) {
+ mValues = EmptyArray.INT;
+ } else {
+ mValues = ArrayUtils.newUnpaddedIntArray(initialCapacity);
+ }
+ mSize = 0;
+ }
+
+ /**
+ * Appends the specified value to the end of this array.
+ */
+ public void add(int value) {
+ add(mSize, value);
+ }
+
+ /**
+ * Inserts a value at the specified position in this array.
+ *
+ * @throws IndexOutOfBoundsException when index < 0 || index > size()
+ */
+ public void add(int index, int value) {
+ if (index < 0 || index > mSize) {
+ throw new IndexOutOfBoundsException();
+ }
+
+ ensureCapacity(1);
+
+ if (mSize - index != 0) {
+ System.arraycopy(mValues, index, mValues, index + 1, mSize - index);
+ }
+
+ mValues[index] = value;
+ mSize++;
+ }
+
+ /**
+ * Adds the values in the specified array to this array.
+ */
+ public void addAll(IntArray values) {
+ final int count = values.mSize;
+ ensureCapacity(count);
+
+ System.arraycopy(values.mValues, 0, mValues, mSize, count);
+ mSize += count;
+ }
+
+ /**
+ * Ensures capacity to append at least <code>count</code> values.
+ */
+ private void ensureCapacity(int count) {
+ final int currentSize = mSize;
+ final int minCapacity = currentSize + count;
+ if (minCapacity >= mValues.length) {
+ final int targetCap = currentSize + (currentSize < (MIN_CAPACITY_INCREMENT / 2) ?
+ MIN_CAPACITY_INCREMENT : currentSize >> 1);
+ final int newCapacity = targetCap > minCapacity ? targetCap : minCapacity;
+ final int[] newValues = ArrayUtils.newUnpaddedIntArray(newCapacity);
+ System.arraycopy(mValues, 0, newValues, 0, currentSize);
+ mValues = newValues;
+ }
+ }
+
+ /**
+ * Removes all values from this array.
+ */
+ public void clear() {
+ mSize = 0;
+ }
+
+ @Override
+ public IntArray clone() throws CloneNotSupportedException {
+ final IntArray clone = (IntArray) super.clone();
+ clone.mValues = mValues.clone();
+ return clone;
+ }
+
+ /**
+ * Returns the value at the specified position in this array.
+ */
+ public int get(int index) {
+ if (index >= mSize) {
+ throw new ArrayIndexOutOfBoundsException(mSize, index);
+ }
+ return mValues[index];
+ }
+
+ /**
+ * Returns the index of the first occurrence of the specified value in this
+ * array, or -1 if this array does not contain the value.
+ */
+ public int indexOf(int value) {
+ final int n = mSize;
+ for (int i = 0; i < n; i++) {
+ if (mValues[i] == value) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Removes the value at the specified index from this array.
+ */
+ public void remove(int index) {
+ if (index >= mSize) {
+ throw new ArrayIndexOutOfBoundsException(mSize, index);
+ }
+ System.arraycopy(mValues, index + 1, mValues, index, mSize - index - 1);
+ mSize--;
+ }
+
+ /**
+ * Returns the number of values in this array.
+ */
+ public int size() {
+ return mSize;
+ }
+}
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 3770b8a..562d138 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -87,6 +87,8 @@
// non compatibility mode.
private Matrix mCompatibleMatrix;
+ private HwuiContext mHwuiContext;
+
/** @hide */
@IntDef({ROTATION_0, ROTATION_90, ROTATION_180, ROTATION_270})
@Retention(RetentionPolicy.SOURCE)
@@ -171,6 +173,10 @@
nativeRelease(mNativeObject);
setNativeObjectLocked(0);
}
+ if (mHwuiContext != null) {
+ mHwuiContext.destroy();
+ mHwuiContext = null;
+ }
}
}
@@ -264,27 +270,63 @@
* @param canvas The canvas previously obtained from {@link #lockCanvas}.
*/
public void unlockCanvasAndPost(Canvas canvas) {
+ synchronized (mLock) {
+ checkNotReleasedLocked();
+
+ if (mHwuiContext != null) {
+ mHwuiContext.unlockAndPost(canvas);
+ } else {
+ unlockSwCanvasAndPost(canvas);
+ }
+ }
+ }
+
+ private void unlockSwCanvasAndPost(Canvas canvas) {
if (canvas != mCanvas) {
throw new IllegalArgumentException("canvas object must be the same instance that "
+ "was previously returned by lockCanvas");
}
+ if (mNativeObject != mLockedObject) {
+ Log.w(TAG, "WARNING: Surface's mNativeObject (0x" +
+ Long.toHexString(mNativeObject) + ") != mLockedObject (0x" +
+ Long.toHexString(mLockedObject) +")");
+ }
+ if (mLockedObject == 0) {
+ throw new IllegalStateException("Surface was not locked");
+ }
+ try {
+ nativeUnlockCanvasAndPost(mLockedObject, canvas);
+ } finally {
+ nativeRelease(mLockedObject);
+ mLockedObject = 0;
+ }
+ }
+ /**
+ * Gets a {@link Canvas} for drawing into this surface.
+ *
+ * After drawing into the provided {@link Canvas}, the caller must
+ * invoke {@link #unlockCanvasAndPost} to post the new contents to the surface.
+ *
+ * Unlike {@link #lockCanvas(Rect)} this will return a hardware-accelerated
+ * canvas. See the <a href="{@docRoot}guide/topics/graphics/hardware-accel.html#unsupported">
+ * unsupported drawing operations</a> for a list of what is and isn't
+ * supported in a hardware-accelerated canvas. It is also required to
+ * fully cover the surface every time {@link #lockHardwareCanvas()} is
+ * called as the buffer is not preserved between frames. Partial updates
+ * are not supported.
+ *
+ * @return A canvas for drawing into the surface.
+ *
+ * @throws IllegalStateException If the canvas cannot be locked.
+ */
+ public Canvas lockHardwareCanvas() {
synchronized (mLock) {
checkNotReleasedLocked();
- if (mNativeObject != mLockedObject) {
- Log.w(TAG, "WARNING: Surface's mNativeObject (0x" +
- Long.toHexString(mNativeObject) + ") != mLockedObject (0x" +
- Long.toHexString(mLockedObject) +")");
+ if (mHwuiContext == null) {
+ mHwuiContext = new HwuiContext();
}
- if (mLockedObject == 0) {
- throw new IllegalStateException("Surface was not locked");
- }
- try {
- nativeUnlockCanvasAndPost(mLockedObject, canvas);
- } finally {
- nativeRelease(mLockedObject);
- mLockedObject = 0;
- }
+ return mHwuiContext.lockCanvas();
}
}
@@ -415,6 +457,9 @@
}
mNativeObject = ptr;
mGenerationId += 1;
+ if (mHwuiContext != null) {
+ mHwuiContext.updateSurface();
+ }
}
}
@@ -518,4 +563,59 @@
mOrigMatrix.set(m);
}
}
+
+ private final class HwuiContext {
+ private final RenderNode mRenderNode;
+ private long mHwuiRenderer;
+ private HardwareCanvas mCanvas;
+
+ HwuiContext() {
+ mRenderNode = RenderNode.create("HwuiCanvas", null);
+ mRenderNode.setClipToBounds(false);
+ mHwuiRenderer = nHwuiCreate(mRenderNode.mNativeRenderNode, mNativeObject);
+ }
+
+ Canvas lockCanvas() {
+ if (mCanvas != null) {
+ throw new IllegalStateException("Surface was already locked!");
+ }
+ mCanvas = mRenderNode.start(0, 0);
+ return mCanvas;
+ }
+
+ void unlockAndPost(Canvas canvas) {
+ if (canvas != mCanvas) {
+ throw new IllegalArgumentException("canvas object must be the same instance that "
+ + "was previously returned by lockCanvas");
+ }
+ mRenderNode.end(mCanvas);
+ mCanvas = null;
+ nHwuiDraw(mHwuiRenderer);
+ }
+
+ void updateSurface() {
+ nHwuiSetSurface(mHwuiRenderer, mNativeObject);
+ }
+
+ void destroy() {
+ if (mHwuiRenderer != 0) {
+ nHwuiDestroy(mHwuiRenderer);
+ mHwuiRenderer = 0;
+ }
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ destroy();
+ } finally {
+ super.finalize();
+ }
+ }
+ }
+
+ private static native long nHwuiCreate(long rootNode, long surface);
+ private static native void nHwuiSetSurface(long renderer, long surface);
+ private static native void nHwuiDraw(long renderer);
+ private static native void nHwuiDestroy(long renderer);
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 8e58cd6..e7b98ca 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -5877,6 +5877,21 @@
return true;
}
+ /**
+ * Adds the clickable rectangles withing the bounds of this view. They
+ * may overlap. This method is intended for use only by the accessibility
+ * layer.
+ *
+ * @param outRects List to which to add clickable areas.
+ */
+ void addClickableRectsForAccessibility(List<RectF> outRects) {
+ if (isClickable() || isLongClickable()) {
+ RectF bounds = new RectF();
+ bounds.set(0, 0, getWidth(), getHeight());
+ outRects.add(bounds);
+ }
+ }
+
static void offsetRects(List<RectF> rects, float offsetX, float offsetY) {
final int rectCount = rects.size();
for (int i = 0; i < rectCount; i++) {
@@ -15676,7 +15691,7 @@
sizeChange(newWidth, newHeight, oldWidth, oldHeight);
}
- if ((mViewFlags & VISIBILITY_MASK) == VISIBLE) {
+ if ((mViewFlags & VISIBILITY_MASK) == VISIBLE || mGhostView != null) {
// If we are visible, force the DRAWN bit to on so that
// this invalidate will go through (at least to our parent).
// This is because someone may have invalidated this view
@@ -15699,6 +15714,14 @@
return changed;
}
+ /**
+ * Same as setFrame, but public and hidden. For use in {@link android.transition.ChangeBounds}.
+ * @hide
+ */
+ public void setLeftTopRightBottom(int left, int top, int right, int bottom) {
+ setFrame(left, top, right, bottom);
+ }
+
private void sizeChange(int newWidth, int newHeight, int oldWidth, int oldHeight) {
onSizeChanged(newWidth, newHeight, oldWidth, oldHeight);
if (mOverlay != null) {
diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java
index 12a49d5..50e64c6 100644
--- a/core/java/android/view/ViewDebug.java
+++ b/core/java/android/view/ViewDebug.java
@@ -1005,12 +1005,21 @@
return fields;
}
- final ArrayList<Field> foundFields = new ArrayList<Field>();
- fields = klass.getDeclaredFields();
+ final ArrayList<Field> declaredFields = new ArrayList();
+ klass.getDeclaredFieldsUnchecked(false, declaredFields);
- int count = fields.length;
+ final ArrayList<Field> foundFields = new ArrayList<Field>();
+ final int count = declaredFields.size();
for (int i = 0; i < count; i++) {
- final Field field = fields[i];
+ final Field field = declaredFields.get(i);
+
+ // Ensure the field type can be resolved.
+ try {
+ field.getType();
+ } catch (NoClassDefFoundError e) {
+ continue;
+ }
+
if (field.isAnnotationPresent(ExportedProperty.class)) {
field.setAccessible(true);
foundFields.add(field);
@@ -1039,12 +1048,22 @@
return methods;
}
- final ArrayList<Method> foundMethods = new ArrayList<Method>();
- methods = klass.getDeclaredMethods();
+ final ArrayList<Method> declaredMethods = new ArrayList();
+ klass.getDeclaredMethodsUnchecked(false, declaredMethods);
- int count = methods.length;
+ final ArrayList<Method> foundMethods = new ArrayList<Method>();
+ final int count = declaredMethods.size();
for (int i = 0; i < count; i++) {
- final Method method = methods[i];
+ final Method method = declaredMethods.get(i);
+
+ // Ensure the method return and parameter types can be resolved.
+ try {
+ method.getReturnType();
+ method.getParameterTypes();
+ } catch (NoClassDefFoundError e) {
+ continue;
+ }
+
if (method.getParameterTypes().length == 0 &&
method.isAnnotationPresent(ExportedProperty.class) &&
method.getReturnType() != Void.class) {
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 7538dff..7c7e3e7 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -51,8 +51,10 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.NoSuchElementException;
import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
@@ -468,6 +470,9 @@
@ViewDebug.ExportedProperty(category = "layout")
private int mChildCountWithTransientState = 0;
+ // Iterator over the children in decreasing Z order (top children first).
+ private OrderedChildIterator mOrderedChildIterator;
+
/**
* Currently registered axes for nested scrolling. Flag set consisting of
* {@link #SCROLL_AXIS_HORIZONTAL} {@link #SCROLL_AXIS_VERTICAL} or {@link #SCROLL_AXIS_NONE}
@@ -817,19 +822,9 @@
return false;
}
- // Check whether any clickable siblings cover the child
- // view and if so keep track of the intersections. Also
- // respect Z ordering when iterating over children.
- ArrayList<View> orderedList = buildOrderedChildList();
- final boolean useCustomOrder = orderedList == null
- && isChildrenDrawingOrderEnabled();
-
- final int childCount = mChildrenCount;
- for (int i = childCount - 1; i >= 0; i--) {
- final int childIndex = useCustomOrder
- ? getChildDrawingOrder(childCount, i) : i;
- final View sibling = (orderedList == null)
- ? mChildren[childIndex] : orderedList.get(childIndex);
+ Iterator<View> iterator = obtainOrderedChildIterator();
+ while (iterator.hasNext()) {
+ View sibling = iterator.next();
// We care only about siblings over the child.
if (sibling == child) {
@@ -837,12 +832,7 @@
}
// Ignore invisible views as they are not interactive.
- if (sibling.getVisibility() != View.VISIBLE) {
- continue;
- }
-
- // If sibling is not interactive we do not care.
- if (!sibling.isClickable() && !sibling.isLongClickable()) {
+ if (!isVisible(sibling)) {
continue;
}
@@ -850,29 +840,36 @@
RectF siblingBounds = mAttachInfo.mTmpTransformRect1;
siblingBounds.set(0, 0, sibling.getWidth(), sibling.getHeight());
- // Take into account the sibling transformation matrix.
- if (!sibling.hasIdentityMatrix()) {
- sibling.getMatrix().mapRect(siblingBounds);
- }
-
- // Offset the sibling to our coordinates.
- final int siblingDx = sibling.mLeft - mScrollX;
- final int siblingDy = sibling.mTop - mScrollY;
- siblingBounds.offset(siblingDx, siblingDy);
+ // Translate the sibling bounds to our coordinates.
+ offsetChildRectToMyCoords(siblingBounds, sibling);
// Compute the intersection between the child and the sibling.
if (siblingBounds.intersect(bounds)) {
- // If an interactive sibling completely covers the child, done.
- if (siblingBounds.equals(bounds)) {
- if (orderedList != null) orderedList.clear();
- return false;
+ List<RectF> clickableRects = new ArrayList<>();
+ sibling.addClickableRectsForAccessibility(clickableRects);
+
+ final int clickableRectCount = clickableRects.size();
+ for (int j = 0; j < clickableRectCount; j++) {
+ RectF clickableRect = clickableRects.get(j);
+
+ // Translate the clickable rect to our coordinates.
+ offsetChildRectToMyCoords(clickableRect, sibling);
+
+ // Compute the intersection between the child and the clickable rects.
+ if (clickableRect.intersect(bounds)) {
+ // If a clickable rect completely covers the child, done.
+ if (clickableRect.equals(bounds)) {
+ releaseOrderedChildIterator();
+ return false;
+ }
+ // Keep track of the intersection rectangle.
+ intersections.add(clickableRect);
+ }
}
- // Keep track of the intersection rectangle.
- RectF intersection = new RectF(siblingBounds);
- intersections.add(intersection);
}
}
- if (orderedList != null) orderedList.clear();
+
+ releaseOrderedChildIterator();
if (mParent instanceof ViewGroup) {
ViewGroup parentGroup = (ViewGroup) mParent;
@@ -883,6 +880,94 @@
return true;
}
+ @Override
+ void addClickableRectsForAccessibility(List<RectF> outRects) {
+ int sizeBefore = outRects.size();
+
+ super.addClickableRectsForAccessibility(outRects);
+
+ // If we added ourselves, then no need to visit children.
+ if (outRects.size() > sizeBefore) {
+ return;
+ }
+
+ Iterator<View> iterator = obtainOrderedChildIterator();
+ while (iterator.hasNext()) {
+ View child = iterator.next();
+
+ // Cannot click on an invisible view.
+ if (!isVisible(child)) {
+ continue;
+ }
+
+ sizeBefore = outRects.size();
+
+ // Add clickable rects in the child bounds.
+ child.addClickableRectsForAccessibility(outRects);
+
+ // Offset the clickable rects for out children to our coordinates.
+ final int sizeAfter = outRects.size();
+ for (int j = sizeBefore; j < sizeAfter; j++) {
+ RectF rect = outRects.get(j);
+
+ // Translate the clickable rect to our coordinates.
+ offsetChildRectToMyCoords(rect, child);
+
+ // If a clickable rect fills the parent, done.
+ if ((int) rect.left == 0 && (int) rect.top == 0
+ && (int) rect.right == mRight && (int) rect.bottom == mBottom) {
+ releaseOrderedChildIterator();
+ return;
+ }
+ }
+ }
+
+ releaseOrderedChildIterator();
+ }
+
+ private void offsetChildRectToMyCoords(RectF rect, View child) {
+ if (!child.hasIdentityMatrix()) {
+ child.getMatrix().mapRect(rect);
+ }
+ final int childDx = child.mLeft - mScrollX;
+ final int childDy = child.mTop - mScrollY;
+ rect.offset(childDx, childDy);
+ }
+
+ private static boolean isVisible(View view) {
+ return (view.getAlpha() > 0 && view.getTransitionAlpha() > 0 &&
+ view.getVisibility() == VISIBLE);
+ }
+
+ /**
+ * Obtains the iterator to traverse the children in a descending Z order.
+ * Only one party can use the iterator at any given time and you cannot
+ * modify the children while using this iterator. Acquisition if already
+ * obtained is an error.
+ *
+ * @return The child iterator.
+ */
+ OrderedChildIterator obtainOrderedChildIterator() {
+ if (mOrderedChildIterator == null) {
+ mOrderedChildIterator = new OrderedChildIterator();
+ } else if (mOrderedChildIterator.isInitialized()) {
+ throw new IllegalStateException("Already obtained");
+ }
+ mOrderedChildIterator.initialize();
+ return mOrderedChildIterator;
+ }
+
+ /**
+ * Releases the iterator to traverse the children in a descending Z order.
+ * Release if not obtained is an error.
+ */
+ void releaseOrderedChildIterator() {
+ if (mOrderedChildIterator == null || !mOrderedChildIterator.isInitialized()) {
+ throw new IllegalStateException("Not obtained");
+ }
+ mOrderedChildIterator.release();
+ }
+
/**
* Called when a child view has changed whether or not it is tracking transient state.
*/
@@ -4078,9 +4163,10 @@
* {@link #dispatchDraw(android.graphics.Canvas)} or any related method.</p>
*/
public void removeView(View view) {
- removeViewInternal(view);
- requestLayout();
- invalidate(true);
+ if (removeViewInternal(view)) {
+ requestLayout();
+ invalidate(true);
+ }
}
/**
@@ -4143,11 +4229,13 @@
invalidate(true);
}
- private void removeViewInternal(View view) {
+ private boolean removeViewInternal(View view) {
final int index = indexOfChild(view);
if (index >= 0) {
removeViewInternal(index, view);
+ return true;
}
+ return false;
}
private void removeViewInternal(int index, View view) {
@@ -7295,4 +7383,57 @@
canvas.drawLines(sDebugLines, paint);
}
+
+ private final class OrderedChildIterator implements Iterator<View> {
+ private List<View> mOrderedChildList;
+ private boolean mUseCustomOrder;
+ private int mCurrentIndex;
+ private boolean mInitialized;
+
+ public void initialize() {
+ mOrderedChildList = buildOrderedChildList();
+ mUseCustomOrder = (mOrderedChildList == null)
+ && isChildrenDrawingOrderEnabled();
+ mCurrentIndex = mChildrenCount - 1;
+ mInitialized = true;
+ }
+
+ public void release() {
+ if (mOrderedChildList != null) {
+ mOrderedChildList.clear();
+ }
+ mUseCustomOrder = false;
+ mCurrentIndex = 0;
+ mInitialized = false;
+ }
+
+ public boolean isInitialized() {
+ return mInitialized;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return (mCurrentIndex >= 0);
+ }
+
+ @Override
+ public View next() {
+ if (!hasNext()) {
+ throw new NoSuchElementException("No such element");
+ }
+ return getChild(mCurrentIndex--);
+ }
+
+ private View getChild(int index) {
+ final int childIndex = mUseCustomOrder
+ ? getChildDrawingOrder(mChildrenCount, index) : index;
+ return (mOrderedChildList == null)
+ ? mChildren[childIndex] : mOrderedChildList.get(childIndex);
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ }
}
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index 63ab7d2..ef073b5 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -24,7 +24,6 @@
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.media.session.MediaController;
-import android.media.session.MediaSession;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
@@ -801,9 +800,6 @@
public void setFlags(int flags, int mask) {
final WindowManager.LayoutParams attrs = getAttributes();
attrs.flags = (attrs.flags&~mask) | (flags&mask);
- if ((mask&WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY) != 0) {
- attrs.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SET_NEEDS_MENU_KEY;
- }
mForcedWindowFlags |= mask;
dispatchWindowAttributesChanged(attrs);
}
@@ -817,6 +813,15 @@
/**
* {@hide}
*/
+ protected void setNeedsMenuKey(int value) {
+ final WindowManager.LayoutParams attrs = getAttributes();
+ attrs.needsMenuKey = value;
+ dispatchWindowAttributesChanged(attrs);
+ }
+
+ /**
+ * {@hide}
+ */
protected void dispatchWindowAttributesChanged(WindowManager.LayoutParams attrs) {
if (mCallback != null) {
mCallback.onWindowAttributesChanged(attrs);
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 47ee52e..5b48c0d 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -523,15 +523,6 @@
public static final int TYPE_MAGNIFICATION_OVERLAY = FIRST_SYSTEM_WINDOW+27;
/**
- * Window type: Recents. Same layer as {@link #TYPE_SYSTEM_DIALOG} but only appears on
- * one user's screen.
- * In multiuser systems shows on all users' windows.
- * @hide
- */
- public static final int TYPE_RECENTS_OVERLAY = FIRST_SYSTEM_WINDOW+28;
-
-
- /**
* Window type: keyguard scrim window. Shows if keyguard needs to be restarted.
* In multiuser systems shows on all users' windows.
* @hide
@@ -551,6 +542,19 @@
public static final int TYPE_VOICE_INTERACTION = FIRST_SYSTEM_WINDOW+31;
/**
+ * Window type: Windows that are overlaid <em>only</em> by an {@link
+ * android.accessibilityservice.AccessibilityService} for interception of
+ * user interactions without changing the windows an accessibility service
+ * can introspect. In particular, an accessibility service can introspect
+ * only windows that a sighted user can interact with which is they can touch
+ * these windows or can type into these windows. For example, if there
+ * is a full screen accessibility overlay that is touchable, the windows
+ * below it will be introspectable by an accessibility service regardless
+ * they are covered by a touchable window.
+ */
+ public static final int TYPE_ACCESSIBILITY_OVERLAY = FIRST_SYSTEM_WINDOW+32;
+
+ /**
* End of types of system windows.
*/
public static final int LAST_SYSTEM_WINDOW = 2999;
@@ -887,9 +891,6 @@
*/
public static final int FLAG_TRANSLUCENT_NAVIGATION = 0x08000000;
- // ----- HIDDEN FLAGS.
- // These start at the high bit and go down.
-
/**
* Flag for a window in local focus mode.
* Window in local focus mode can control focus independent of window manager using
@@ -912,17 +913,12 @@
public static final int FLAG_SLIPPERY = 0x20000000;
/**
- * Flag for a window belonging to an activity that responds to {@link KeyEvent#KEYCODE_MENU}
- * and therefore needs a Menu key. For devices where Menu is a physical button this flag is
- * ignored, but on devices where the Menu key is drawn in software it may be hidden unless
- * this flag is set.
- *
- * (Note that Action Bars, when available, are the preferred way to offer additional
- * functions otherwise accessed via an options menu.)
- *
- * {@hide}
+ * Window flag: When requesting layout with an attached window, the attached window may
+ * overlap with the screen decorations of the parent window such as the navigation bar. By
+ * including this flag, the window manager will layout the attached window within the decor
+ * frame of the parent window such that it doesn't overlap with screen decorations.
*/
- public static final int FLAG_NEEDS_MENU_KEY = 0x40000000;
+ public static final int FLAG_LAYOUT_ATTACHED_IN_DECOR = 0x40000000;
/**
* Flag indicating that this Window is responsible for drawing the background for the
@@ -1065,16 +1061,6 @@
*/
public static final int PRIVATE_FLAG_WANTS_OFFSET_NOTIFICATIONS = 0x00000004;
- /**
- * This is set for a window that has explicitly specified its
- * FLAG_NEEDS_MENU_KEY, so we know the value on this window is the
- * appropriate one to use. If this is not set, we should look at
- * windows behind it to determine the appropriate value.
- *
- * @hide
- */
- public static final int PRIVATE_FLAG_SET_NEEDS_MENU_KEY = 0x00000008;
-
/** In a multiuser system if this flag is set and the owner is a system process then this
* window will appear on all user screens. This overrides the default behavior of window
* types that normally only appear on the owning user's screen. Refer to each window type
@@ -1122,6 +1108,45 @@
public int privateFlags;
/**
+ * Value for {@link #needsMenuKey} for a window that has not explicitly specified if it
+ * needs {@link #NEEDS_MENU_SET_TRUE} or doesn't need {@link #NEEDS_MENU_SET_FALSE} a menu
+ * key. For this case, we should look at windows behind it to determine the appropriate
+ * value.
+ *
+ * @hide
+ */
+ public static final int NEEDS_MENU_UNSET = 0;
+
+ /**
+ * Value for {@link #needsMenuKey} for a window that has explicitly specified it needs a
+ * menu key.
+ *
+ * @hide
+ */
+ public static final int NEEDS_MENU_SET_TRUE = 1;
+
+ /**
+ * Value for {@link #needsMenuKey} for a window that has explicitly specified it doesn't
+ * needs a menu key.
+ *
+ * @hide
+ */
+ public static final int NEEDS_MENU_SET_FALSE = 2;
+
+ /**
+ * State variable for a window belonging to an activity that responds to
+ * {@link KeyEvent#KEYCODE_MENU} and therefore needs a Menu key. For devices where Menu is a
+ * physical button this variable is ignored, but on devices where the Menu key is drawn in
+ * software it may be hidden unless this variable is set to {@link #NEEDS_MENU_SET_TRUE}.
+ *
+ * (Note that Action Bars, when available, are the preferred way to offer additional
+ * functions otherwise accessed via an options menu.)
+ *
+ * {@hide}
+ */
+ public int needsMenuKey = NEEDS_MENU_UNSET;
+
+ /**
* Given a particular set of window manager flags, determine whether
* such a window may be a target for an input method when it has
* focus. In particular, this checks the
@@ -1129,9 +1154,9 @@
* flags and returns true if the combination of the two corresponds
* to a window that needs to be behind the input method so that the
* user can type into it.
- *
+ *
* @param flags The current window manager flags.
- *
+ *
* @return Returns true if such a window should be behind/interact
* with an input method, false if not.
*/
@@ -1596,14 +1621,15 @@
out.writeInt(surfaceInsets.top);
out.writeInt(surfaceInsets.right);
out.writeInt(surfaceInsets.bottom);
+ out.writeInt(needsMenuKey);
}
-
+
public static final Parcelable.Creator<LayoutParams> CREATOR
= new Parcelable.Creator<LayoutParams>() {
public LayoutParams createFromParcel(Parcel in) {
return new LayoutParams(in);
}
-
+
public LayoutParams[] newArray(int size) {
return new LayoutParams[size];
}
@@ -1643,8 +1669,9 @@
surfaceInsets.top = in.readInt();
surfaceInsets.right = in.readInt();
surfaceInsets.bottom = in.readInt();
+ needsMenuKey = in.readInt();
}
-
+
@SuppressWarnings({"PointlessBitwiseExpression"})
public static final int LAYOUT_CHANGED = 1<<0;
public static final int TYPE_CHANGED = 1<<1;
@@ -1678,14 +1705,16 @@
/** {@hide} */
public static final int PREFERRED_REFRESH_RATE_CHANGED = 1 << 21;
/** {@hide} */
+ public static final int NEEDS_MENU_KEY_CHANGED = 1 << 22;
+ /** {@hide} */
public static final int EVERYTHING_CHANGED = 0xffffffff;
// internal buffer to backup/restore parameters under compatibility mode.
private int[] mCompatibilityParamsBackup = null;
-
+
public final int copyFrom(LayoutParams o) {
int changes = 0;
-
+
if (width != o.width) {
width = o.width;
changes |= LAYOUT_CHANGED;
@@ -1822,9 +1851,14 @@
changes |= SURFACE_INSETS_CHANGED;
}
+ if (needsMenuKey != o.needsMenuKey) {
+ needsMenuKey = o.needsMenuKey;
+ changes |= NEEDS_MENU_KEY_CHANGED;
+ }
+
return changes;
}
-
+
@Override
public String debug(String output) {
output += "Contents of " + this + ":";
@@ -1928,6 +1962,10 @@
if (!surfaceInsets.equals(Insets.NONE)) {
sb.append(" surfaceInsets=").append(surfaceInsets);
}
+ if (needsMenuKey != NEEDS_MENU_UNSET) {
+ sb.append(" needsMenuKey=");
+ sb.append(needsMenuKey);
+ }
sb.append('}');
return sb.toString();
}
diff --git a/core/java/android/view/WindowManagerInternal.java b/core/java/android/view/WindowManagerInternal.java
index 38e3723..f557b97 100644
--- a/core/java/android/view/WindowManagerInternal.java
+++ b/core/java/android/view/WindowManagerInternal.java
@@ -173,4 +173,20 @@
* redrawn.
*/
public abstract void waitForAllWindowsDrawn(Runnable callback, long timeout);
+
+ /**
+ * Adds a window token for a given window type.
+ *
+ * @param token The token to add.
+ * @param type The window type.
+ */
+ public abstract void addWindowToken(android.os.IBinder token, int type);
+
+ /**
+ * Removes a window token.
+ *
+ * @param token The toke to remove.
+ * @param removeWindows Whether to also remove the windows associated with the token.
+ */
+ public abstract void removeWindowToken(android.os.IBinder token, boolean removeWindows);
}
diff --git a/core/java/android/view/accessibility/AccessibilityWindowInfo.java b/core/java/android/view/accessibility/AccessibilityWindowInfo.java
index ad55f5f..e1942be 100644
--- a/core/java/android/view/accessibility/AccessibilityWindowInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityWindowInfo.java
@@ -51,11 +51,24 @@
*/
public static final int TYPE_SYSTEM = 3;
+ /**
+ * Window type: Windows that are overlaid <em>only</em> by an {@link
+ * android.accessibilityservice.AccessibilityService} for interception of
+ * user interactions without changing the windows an accessibility service
+ * can introspect. In particular, an accessibility service can introspect
+ * only windows that a sighted user can interact with which they can touch
+ * these windows or can type into these windows. For example, if there
+ * is a full screen accessibility overlay that is touchable, the windows
+ * below it will be introspectable by an accessibility service regardless
+ * they are covered by a touchable window.
+ */
+ public static final int TYPE_ACCESSIBILITY_OVERLAY = 4;
+
private static final int UNDEFINED = -1;
private static final int BOOLEAN_PROPERTY_ACTIVE = 1 << 0;
private static final int BOOLEAN_PROPERTY_FOCUSED = 1 << 1;
- private static final int BOOLEAN_PROPERTY_ACCESSIBLITY_FOCUSED = 1 << 2;
+ private static final int BOOLEAN_PROPERTY_ACCESSIBILITY_FOCUSED = 1 << 2;
// Housekeeping.
private static final int MAX_POOL_SIZE = 10;
@@ -85,6 +98,7 @@
* @see #TYPE_APPLICATION
* @see #TYPE_INPUT_METHOD
* @see #TYPE_SYSTEM
+ * @see #TYPE_ACCESSIBILITY_OVERLAY
*/
public int getType() {
return mType;
@@ -93,7 +107,7 @@
/**
* Sets the type of the window.
*
- * @param The type
+ * @param type The type
*
* @hide
*/
@@ -115,7 +129,7 @@
* Sets the layer which determines the Z-order of the window. Windows
* with greater layer appear on top of windows with lesser layer.
*
- * @param The window layer.
+ * @param layer The window layer.
*
* @hide
*/
@@ -174,7 +188,7 @@
/**
* Sets the unique window id.
*
- * @param windowId The window id.
+ * @param id The window id.
*
* @hide
*/
@@ -230,7 +244,7 @@
* the user is currently touching or the window has input focus
* and the user is not touching any window.
*
- * @param Whether this is the active window.
+ * @param active Whether this is the active window.
*
* @hide
*/
@@ -250,7 +264,7 @@
/**
* Sets if this window has input focus.
*
- * @param Whether has input focus.
+ * @param focused Whether has input focus.
*
* @hide
*/
@@ -264,18 +278,18 @@
* @return Whether has accessibility focus.
*/
public boolean isAccessibilityFocused() {
- return getBooleanProperty(BOOLEAN_PROPERTY_ACCESSIBLITY_FOCUSED);
+ return getBooleanProperty(BOOLEAN_PROPERTY_ACCESSIBILITY_FOCUSED);
}
/**
* Sets if this window has accessibility focus.
*
- * @param Whether has accessibility focus.
+ * @param focused Whether has accessibility focus.
*
* @hide
*/
public void setAccessibilityFocused(boolean focused) {
- setBooleanProperty(BOOLEAN_PROPERTY_ACCESSIBLITY_FOCUSED, focused);
+ setBooleanProperty(BOOLEAN_PROPERTY_ACCESSIBILITY_FOCUSED, focused);
}
/**
@@ -534,6 +548,9 @@
case TYPE_SYSTEM: {
return "TYPE_SYSTEM";
}
+ case TYPE_ACCESSIBILITY_OVERLAY: {
+ return "TYPE_ACCESSIBILITY_OVERLAY";
+ }
default:
return "<UNKNOWN>";
}
diff --git a/core/java/android/view/animation/AccelerateDecelerateInterpolator.java b/core/java/android/view/animation/AccelerateDecelerateInterpolator.java
index ed6949a..21d5a5b 100644
--- a/core/java/android/view/animation/AccelerateDecelerateInterpolator.java
+++ b/core/java/android/view/animation/AccelerateDecelerateInterpolator.java
@@ -26,17 +26,17 @@
/**
* An interpolator where the rate of change starts and ends slowly but
* accelerates through the middle.
- *
*/
@HasNativeInterpolator
-public class AccelerateDecelerateInterpolator implements Interpolator, NativeInterpolatorFactory {
+public class AccelerateDecelerateInterpolator extends BaseInterpolator
+ implements NativeInterpolatorFactory {
public AccelerateDecelerateInterpolator() {
}
-
+
@SuppressWarnings({"UnusedDeclaration"})
public AccelerateDecelerateInterpolator(Context context, AttributeSet attrs) {
}
-
+
public float getInterpolation(float input) {
return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
}
diff --git a/core/java/android/view/animation/AccelerateInterpolator.java b/core/java/android/view/animation/AccelerateInterpolator.java
index 1c75f16..6c8d7b1 100644
--- a/core/java/android/view/animation/AccelerateInterpolator.java
+++ b/core/java/android/view/animation/AccelerateInterpolator.java
@@ -33,7 +33,7 @@
*
*/
@HasNativeInterpolator
-public class AccelerateInterpolator implements Interpolator, NativeInterpolatorFactory {
+public class AccelerateInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
private final float mFactor;
private final double mDoubleFactor;
@@ -70,7 +70,7 @@
mFactor = a.getFloat(R.styleable.AccelerateInterpolator_factor, 1.0f);
mDoubleFactor = 2 * mFactor;
-
+ setChangingConfiguration(a.getChangingConfigurations());
a.recycle();
}
diff --git a/core/java/android/view/animation/AnimationUtils.java b/core/java/android/view/animation/AnimationUtils.java
index af4e04f..606c83e 100644
--- a/core/java/android/view/animation/AnimationUtils.java
+++ b/core/java/android/view/animation/AnimationUtils.java
@@ -321,7 +321,7 @@
private static Interpolator createInterpolatorFromXml(Resources res, Theme theme, XmlPullParser parser)
throws XmlPullParserException, IOException {
- Interpolator interpolator = null;
+ BaseInterpolator interpolator = null;
// Make sure we are on a start tag.
int type;
@@ -361,10 +361,7 @@
} else {
throw new RuntimeException("Unknown interpolator name: " + parser.getName());
}
-
}
-
return interpolator;
-
}
}
diff --git a/core/java/android/view/animation/AnticipateInterpolator.java b/core/java/android/view/animation/AnticipateInterpolator.java
index fe756bd..fb66c31 100644
--- a/core/java/android/view/animation/AnticipateInterpolator.java
+++ b/core/java/android/view/animation/AnticipateInterpolator.java
@@ -31,7 +31,7 @@
* An interpolator where the change starts backward then flings forward.
*/
@HasNativeInterpolator
-public class AnticipateInterpolator implements Interpolator, NativeInterpolatorFactory {
+public class AnticipateInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
private final float mTension;
public AnticipateInterpolator() {
@@ -60,9 +60,8 @@
a = res.obtainAttributes(attrs, R.styleable.AnticipateInterpolator);
}
- mTension =
- a.getFloat(R.styleable.AnticipateInterpolator_tension, 2.0f);
-
+ mTension = a.getFloat(R.styleable.AnticipateInterpolator_tension, 2.0f);
+ setChangingConfiguration(a.getChangingConfigurations());
a.recycle();
}
diff --git a/core/java/android/view/animation/AnticipateOvershootInterpolator.java b/core/java/android/view/animation/AnticipateOvershootInterpolator.java
index 78e5acf..1af72da 100644
--- a/core/java/android/view/animation/AnticipateOvershootInterpolator.java
+++ b/core/java/android/view/animation/AnticipateOvershootInterpolator.java
@@ -35,7 +35,8 @@
* the target value and finally goes back to the final value.
*/
@HasNativeInterpolator
-public class AnticipateOvershootInterpolator implements Interpolator, NativeInterpolatorFactory {
+public class AnticipateOvershootInterpolator extends BaseInterpolator
+ implements NativeInterpolatorFactory {
private final float mTension;
public AnticipateOvershootInterpolator() {
@@ -78,7 +79,7 @@
mTension = a.getFloat(AnticipateOvershootInterpolator_tension, 2.0f) *
a.getFloat(AnticipateOvershootInterpolator_extraTension, 1.5f);
-
+ setChangingConfiguration(a.getChangingConfigurations());
a.recycle();
}
diff --git a/core/java/android/view/animation/BaseInterpolator.java b/core/java/android/view/animation/BaseInterpolator.java
new file mode 100644
index 0000000..9c0014c
--- /dev/null
+++ b/core/java/android/view/animation/BaseInterpolator.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2014 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.view.animation;
+
+/**
+ * An abstract class which is extended by default interpolators.
+ */
+abstract public class BaseInterpolator implements Interpolator {
+ private int mChangingConfiguration;
+ /**
+ * @hide
+ */
+ public int getChangingConfiguration() {
+ return mChangingConfiguration;
+ }
+
+ /**
+ * @hide
+ */
+ void setChangingConfiguration(int changingConfiguration) {
+ mChangingConfiguration = changingConfiguration;
+ }
+}
diff --git a/core/java/android/view/animation/BounceInterpolator.java b/core/java/android/view/animation/BounceInterpolator.java
index 9d8ca90..909eaa4 100644
--- a/core/java/android/view/animation/BounceInterpolator.java
+++ b/core/java/android/view/animation/BounceInterpolator.java
@@ -27,7 +27,7 @@
* An interpolator where the change bounces at the end.
*/
@HasNativeInterpolator
-public class BounceInterpolator implements Interpolator, NativeInterpolatorFactory {
+public class BounceInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
public BounceInterpolator() {
}
diff --git a/core/java/android/view/animation/CycleInterpolator.java b/core/java/android/view/animation/CycleInterpolator.java
index 3114aa3..663c109 100644
--- a/core/java/android/view/animation/CycleInterpolator.java
+++ b/core/java/android/view/animation/CycleInterpolator.java
@@ -33,7 +33,7 @@
*
*/
@HasNativeInterpolator
-public class CycleInterpolator implements Interpolator, NativeInterpolatorFactory {
+public class CycleInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
public CycleInterpolator(float cycles) {
mCycles = cycles;
}
@@ -52,7 +52,7 @@
}
mCycles = a.getFloat(R.styleable.CycleInterpolator_cycles, 1.0f);
-
+ setChangingConfiguration(a.getChangingConfigurations());
a.recycle();
}
diff --git a/core/java/android/view/animation/DecelerateInterpolator.java b/core/java/android/view/animation/DecelerateInterpolator.java
index 674207c..f426f60 100644
--- a/core/java/android/view/animation/DecelerateInterpolator.java
+++ b/core/java/android/view/animation/DecelerateInterpolator.java
@@ -33,7 +33,7 @@
*
*/
@HasNativeInterpolator
-public class DecelerateInterpolator implements Interpolator, NativeInterpolatorFactory {
+public class DecelerateInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
public DecelerateInterpolator() {
}
@@ -62,7 +62,7 @@
}
mFactor = a.getFloat(R.styleable.DecelerateInterpolator_factor, 1.0f);
-
+ setChangingConfiguration(a.getChangingConfigurations());
a.recycle();
}
diff --git a/core/java/android/view/animation/LinearInterpolator.java b/core/java/android/view/animation/LinearInterpolator.java
index 552c611..2a047b4 100644
--- a/core/java/android/view/animation/LinearInterpolator.java
+++ b/core/java/android/view/animation/LinearInterpolator.java
@@ -25,17 +25,16 @@
/**
* An interpolator where the rate of change is constant
- *
*/
@HasNativeInterpolator
-public class LinearInterpolator implements Interpolator, NativeInterpolatorFactory {
+public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
public LinearInterpolator() {
}
-
+
public LinearInterpolator(Context context, AttributeSet attrs) {
}
-
+
public float getInterpolation(float input) {
return input;
}
diff --git a/core/java/android/view/animation/OvershootInterpolator.java b/core/java/android/view/animation/OvershootInterpolator.java
index d6c2808..306688a 100644
--- a/core/java/android/view/animation/OvershootInterpolator.java
+++ b/core/java/android/view/animation/OvershootInterpolator.java
@@ -32,7 +32,7 @@
* then comes back.
*/
@HasNativeInterpolator
-public class OvershootInterpolator implements Interpolator, NativeInterpolatorFactory {
+public class OvershootInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
private final float mTension;
public OvershootInterpolator() {
@@ -61,9 +61,8 @@
a = res.obtainAttributes(attrs, R.styleable.OvershootInterpolator);
}
- mTension =
- a.getFloat(R.styleable.OvershootInterpolator_tension, 2.0f);
-
+ mTension = a.getFloat(R.styleable.OvershootInterpolator_tension, 2.0f);
+ setChangingConfiguration(a.getChangingConfigurations());
a.recycle();
}
diff --git a/core/java/android/view/animation/PathInterpolator.java b/core/java/android/view/animation/PathInterpolator.java
index 945ecf0..eec5555 100644
--- a/core/java/android/view/animation/PathInterpolator.java
+++ b/core/java/android/view/animation/PathInterpolator.java
@@ -42,7 +42,7 @@
* path.lineTo(1f, 1f);
* </pre></blockquote></p>
*/
-public class PathInterpolator implements Interpolator {
+public class PathInterpolator extends BaseInterpolator {
// This governs how accurate the approximation of the Path is.
private static final float PRECISION = 0.002f;
@@ -98,7 +98,7 @@
a = res.obtainAttributes(attrs, R.styleable.PathInterpolator);
}
parseInterpolatorFromTypeArray(a);
-
+ setChangingConfiguration(a.getChangingConfigurations());
a.recycle();
}
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 0439168..4aebaae 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -4653,7 +4653,7 @@
if (mPositionScroller == null) {
mPositionScroller = createPositionScroller();
}
- mPositionScroller.startWithOffset(position, offset, offset);
+ mPositionScroller.startWithOffset(position, offset);
}
/**
diff --git a/core/java/android/widget/AdapterView.java b/core/java/android/widget/AdapterView.java
index b9f891c..5e2394c 100644
--- a/core/java/android/widget/AdapterView.java
+++ b/core/java/android/widget/AdapterView.java
@@ -215,7 +215,12 @@
private boolean mDesiredFocusableState;
private boolean mDesiredFocusableInTouchModeState;
+ /** Lazily-constructed runnable for dispatching selection events. */
private SelectionNotifier mSelectionNotifier;
+
+ /** Selection notifier that's waiting for the next layout pass. */
+ private SelectionNotifier mPendingSelectionNotifier;
+
/**
* When set to true, calls to requestLayout() will not propagate up the parent hierarchy.
* This is used to layout the children during a layout pass.
@@ -854,39 +859,51 @@
private class SelectionNotifier implements Runnable {
public void run() {
- if (mDataChanged) {
- // Data has changed between when this SelectionNotifier
- // was posted and now. We need to wait until the AdapterView
- // has been synched to the new data.
+ mPendingSelectionNotifier = null;
+
+ if (mDataChanged && getViewRootImpl() != null
+ && getViewRootImpl().isLayoutRequested()) {
+ // Data has changed between when this SelectionNotifier was
+ // posted and now. Postpone the notification until the next
+ // layout is complete and we run checkSelectionChanged().
if (getAdapter() != null) {
- post(this);
+ mPendingSelectionNotifier = this;
}
} else {
- fireOnSelected();
- performAccessibilityActionsOnSelected();
+ dispatchOnItemSelected();
}
}
}
void selectionChanged() {
+ // We're about to post or run the selection notifier, so we don't need
+ // a pending notifier.
+ mPendingSelectionNotifier = null;
+
if (mOnItemSelectedListener != null
|| AccessibilityManager.getInstance(mContext).isEnabled()) {
if (mInLayout || mBlockLayoutRequests) {
// If we are in a layout traversal, defer notification
// by posting. This ensures that the view tree is
- // in a consistent state and is able to accomodate
+ // in a consistent state and is able to accommodate
// new layout or invalidate requests.
if (mSelectionNotifier == null) {
mSelectionNotifier = new SelectionNotifier();
+ } else {
+ removeCallbacks(mSelectionNotifier);
}
post(mSelectionNotifier);
} else {
- fireOnSelected();
- performAccessibilityActionsOnSelected();
+ dispatchOnItemSelected();
}
}
}
+ private void dispatchOnItemSelected() {
+ fireOnSelected();
+ performAccessibilityActionsOnSelected();
+ }
+
private void fireOnSelected() {
if (mOnItemSelectedListener == null) {
return;
@@ -1042,12 +1059,22 @@
notifySubtreeAccessibilityStateChangedIfNeeded();
}
+ /**
+ * Called after layout to determine whether the selection position needs to
+ * be updated. Also used to fire any pending selection events.
+ */
void checkSelectionChanged() {
if ((mSelectedPosition != mOldSelectedPosition) || (mSelectedRowId != mOldSelectedRowId)) {
selectionChanged();
mOldSelectedPosition = mSelectedPosition;
mOldSelectedRowId = mSelectedRowId;
}
+
+ // If we have a pending selection notification -- and we won't if we
+ // just fired one in selectionChanged() -- run it now.
+ if (mPendingSelectionNotifier != null) {
+ mPendingSelectionNotifier.run();
+ }
}
/**
diff --git a/core/java/android/widget/CompoundButton.java b/core/java/android/widget/CompoundButton.java
index 2ccd18d..7d9d305 100644
--- a/core/java/android/widget/CompoundButton.java
+++ b/core/java/android/widget/CompoundButton.java
@@ -398,7 +398,15 @@
super.onDraw(canvas);
if (buttonDrawable != null) {
- buttonDrawable.draw(canvas);
+ final int scrollX = mScrollX;
+ final int scrollY = mScrollY;
+ if (scrollX == 0 && scrollY == 0) {
+ buttonDrawable.draw(canvas);
+ } else {
+ canvas.translate(scrollX, scrollY);
+ buttonDrawable.draw(canvas);
+ canvas.translate(-scrollX, -scrollY);
+ }
}
}
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index f90a9fe..75dfcca 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -1120,6 +1120,9 @@
/** @hide */
public void animateTransform(Matrix matrix) {
+ if (mDrawable == null) {
+ return;
+ }
if (matrix == null) {
mDrawable.setBounds(0, 0, getWidth(), getHeight());
} else {
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java
index 41d3e320..54a7940 100644
--- a/core/java/android/widget/PopupWindow.java
+++ b/core/java/android/widget/PopupWindow.java
@@ -97,9 +97,11 @@
private boolean mAllowScrollingAnchorParent = true;
private boolean mLayoutInsetDecor = false;
private boolean mNotTouchModal;
+ private boolean mAttachedInDecor = true;
+ private boolean mAttachedInDecorSet = false;
private OnTouchListener mTouchInterceptor;
-
+
private int mWidthMode;
private int mWidth;
private int mLastWidth;
@@ -316,6 +318,7 @@
mContext = contentView.getContext();
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
}
+
setContentView(contentView);
setWidth(width);
setHeight(height);
@@ -373,16 +376,16 @@
public int getAnimationStyle() {
return mAnimationStyle;
}
-
+
/**
- * Set the flag on popup to ignore cheek press eventt; by default this flag
+ * Set the flag on popup to ignore cheek press event; by default this flag
* is set to false
* which means the pop wont ignore cheek press dispatch events.
- *
+ *
* <p>If the popup is showing, calling this method will take effect only
* the next time the popup is shown or through a manual call to one of
* the {@link #update()} methods.</p>
- *
+ *
* @see #update()
*/
public void setIgnoreCheekPress() {
@@ -443,6 +446,19 @@
if (mWindowManager == null && mContentView != null) {
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
}
+
+ // Setting the default for attachedInDecor based on SDK version here
+ // instead of in the constructor since we might not have the context
+ // object in the constructor. We only want to set default here if the
+ // app hasn't already set the attachedInDecor.
+ if (mContext != null && !mAttachedInDecorSet) {
+ // Attach popup window in decor frame of parent window by default for
+ // {@link Build.VERSION_CODES.LOLLIPOP_MR1} or greater. Keep current
+ // behavior of not attaching to decor frame for older SDKs.
+ setAttachedInDecor(mContext.getApplicationInfo().targetSdkVersion
+ >= Build.VERSION_CODES.LOLLIPOP_MR1);
+ }
+
}
/**
@@ -452,7 +468,7 @@
public void setTouchInterceptor(OnTouchListener l) {
mTouchInterceptor = l;
}
-
+
/**
* <p>Indicate whether the popup window can grab the focus.</p>
*
@@ -702,6 +718,36 @@
}
/**
+ * <p>Indicates whether the popup window will be attached in the decor frame of its parent
+ * window.
+ *
+ * @return true if the window will be attached to the decor frame of its parent window.
+ *
+ * @see #setAttachedInDecor(boolean)
+ * @see WindowManager.LayoutParams#FLAG_LAYOUT_ATTACHED_IN_DECOR
+ */
+ public boolean isAttachedInDecor() {
+ return mAttachedInDecor;
+ }
+
+ /**
+ * <p>This will attach the popup window to the decor frame of the parent window to avoid
+ * overlaping with screen decorations like the navigation bar. Overrides the default behavior of
+ * the flag {@link WindowManager.LayoutParams#FLAG_LAYOUT_ATTACHED_IN_DECOR}.
+ *
+ * <p>By default the flag is set on SDK version {@link Build.VERSION_CODES#LOLLIPOP_MR1} or
+ * greater and cleared on lesser SDK versions.
+ *
+ * @param enabled true if the popup should be attached to the decor frame of its parent window.
+ *
+ * @see WindowManager.LayoutParams#FLAG_LAYOUT_ATTACHED_IN_DECOR
+ */
+ public void setAttachedInDecor(boolean enabled) {
+ mAttachedInDecor = enabled;
+ mAttachedInDecorSet = true;
+ }
+
+ /**
* Allows the popup window to force the flag
* {@link WindowManager.LayoutParams#FLAG_LAYOUT_INSET_DECOR}, overriding default behavior.
* This will cause the popup to inset its content to account for system windows overlaying
@@ -1140,9 +1186,12 @@
if (mNotTouchModal) {
curFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
}
+ if (mAttachedInDecor) {
+ curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_ATTACHED_IN_DECOR;
+ }
return curFlags;
}
-
+
private int computeAnimationResource() {
if (mAnimationStyle == -1) {
if (mIsDropdown) {
diff --git a/core/java/android/widget/RadialTimePickerView.java b/core/java/android/widget/RadialTimePickerView.java
index d15f2d6..24fc2bb 100644
--- a/core/java/android/widget/RadialTimePickerView.java
+++ b/core/java/android/widget/RadialTimePickerView.java
@@ -28,13 +28,13 @@
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
+import android.graphics.Rect;
import android.graphics.Typeface;
-import android.graphics.RectF;
import android.os.Bundle;
-import android.text.format.DateUtils;
-import android.text.format.Time;
import android.util.AttributeSet;
+import android.util.IntArray;
import android.util.Log;
+import android.util.MathUtils;
import android.util.TypedValue;
import android.view.HapticFeedbackConstants;
import android.view.MotionEvent;
@@ -42,8 +42,10 @@
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import com.android.internal.R;
+import com.android.internal.widget.ExploreByTouchHelper;
import java.util.ArrayList;
import java.util.Calendar;
@@ -97,6 +99,9 @@
private static int[] sSnapPrefer30sMap = new int[361];
+ private final InvalidateUpdateListener mInvalidateUpdateListener =
+ new InvalidateUpdateListener();
+
private final String[] mHours12Texts = new String[12];
private final String[] mOuterHours24Texts = new String[12];
private final String[] mInnerHours24Texts = new String[12];
@@ -115,7 +120,39 @@
private final Paint mPaintBackground = new Paint();
private final Paint mPaintDebug = new Paint();
- private Typeface mTypeface;
+ private final Typeface mTypeface;
+
+ private final float[] mCircleRadius = new float[3];
+
+ private final float[] mTextSize = new float[2];
+
+ private final float[][] mTextGridHeights = new float[2][7];
+ private final float[][] mTextGridWidths = new float[2][7];
+
+ private final float[] mInnerTextGridHeights = new float[7];
+ private final float[] mInnerTextGridWidths = new float[7];
+
+ private final float[] mCircleRadiusMultiplier = new float[2];
+ private final float[] mNumbersRadiusMultiplier = new float[3];
+
+ private final float[] mTextSizeMultiplier = new float[3];
+
+ private final float[] mAnimationRadiusMultiplier = new float[3];
+
+ private final float mTransitionMidRadiusMultiplier;
+ private final float mTransitionEndRadiusMultiplier;
+
+ private final int[] mLineLength = new int[3];
+ private final int[] mSelectionRadius = new int[3];
+ private final float mSelectionRadiusMultiplier;
+ private final int[] mSelectionDegrees = new int[3];
+
+ private final ArrayList<Animator> mHoursToMinutesAnims = new ArrayList<Animator>();
+ private final ArrayList<Animator> mMinuteToHoursAnims = new ArrayList<Animator>();
+
+ private final RadialPickerTouchHelper mTouchHelper;
+
+ private float mInnerTextSize;
private boolean mIs24HourMode;
private boolean mShowHours;
@@ -129,52 +166,21 @@
private int mXCenter;
private int mYCenter;
- private float[] mCircleRadius = new float[3];
-
private int mMinHypotenuseForInnerNumber;
private int mMaxHypotenuseForOuterNumber;
private int mHalfwayHypotenusePoint;
- private float[] mTextSize = new float[2];
- private float mInnerTextSize;
-
- private float[][] mTextGridHeights = new float[2][7];
- private float[][] mTextGridWidths = new float[2][7];
-
- private float[] mInnerTextGridHeights = new float[7];
- private float[] mInnerTextGridWidths = new float[7];
-
private String[] mOuterTextHours;
private String[] mInnerTextHours;
private String[] mOuterTextMinutes;
-
- private float[] mCircleRadiusMultiplier = new float[2];
- private float[] mNumbersRadiusMultiplier = new float[3];
-
- private float[] mTextSizeMultiplier = new float[3];
-
- private float[] mAnimationRadiusMultiplier = new float[3];
-
- private float mTransitionMidRadiusMultiplier;
- private float mTransitionEndRadiusMultiplier;
-
private AnimatorSet mTransition;
- private InvalidateUpdateListener mInvalidateUpdateListener = new InvalidateUpdateListener();
-
- private int[] mLineLength = new int[3];
- private int[] mSelectionRadius = new int[3];
- private float mSelectionRadiusMultiplier;
- private int[] mSelectionDegrees = new int[3];
private int mAmOrPm;
private int mDisabledAlpha;
- private RectF mRectF = new RectF();
- private boolean mInputEnabled = true;
private OnValueSelectedListener mListener;
- private final ArrayList<Animator> mHoursToMinutesAnims = new ArrayList<Animator>();
- private final ArrayList<Animator> mMinuteToHoursAnims = new ArrayList<Animator>();
+ private boolean mInputEnabled = true;
public interface OnValueSelectedListener {
void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance);
@@ -282,11 +288,21 @@
return degrees;
}
+ @SuppressWarnings("unused")
+ public RadialTimePickerView(Context context) {
+ this(context, null);
+ }
+
public RadialTimePickerView(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.timePickerStyle);
}
- public RadialTimePickerView(Context context, AttributeSet attrs, int defStyle) {
+ public RadialTimePickerView(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public RadialTimePickerView(
+ Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs);
// Pull disabled alpha from theme.
@@ -297,7 +313,7 @@
// process style attributes
final Resources res = getResources();
final TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.TimePicker,
- defStyle, 0);
+ defStyleAttr, defStyleRes);
mTypeface = Typeface.create("sans-serif", Typeface.NORMAL);
@@ -382,6 +398,14 @@
mIs24HourMode = false;
mAmOrPm = AM;
+ // Set up accessibility components.
+ mTouchHelper = new RadialPickerTouchHelper();
+ setAccessibilityDelegate(mTouchHelper);
+
+ if (getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+ setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
+ }
+
initHoursAndMinutesText();
initData();
@@ -406,8 +430,8 @@
final int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
final int currentMinute = calendar.get(Calendar.MINUTE);
- setCurrentHour(currentHour);
- setCurrentMinute(currentMinute);
+ setCurrentHourInternal(currentHour, false, false);
+ setCurrentMinuteInternal(currentMinute, false);
setHapticFeedbackEnabled(true);
}
@@ -429,8 +453,9 @@
public void initialize(int hour, int minute, boolean is24HourMode) {
mIs24HourMode = is24HourMode;
- setCurrentHour(hour);
- setCurrentMinute(minute);
+
+ setCurrentHourInternal(hour, false, false);
+ setCurrentMinuteInternal(minute, false);
}
public void setCurrentItemShowing(int item, boolean animate) {
@@ -460,17 +485,39 @@
* @param hour the current hour between 0 and 23 (inclusive)
*/
public void setCurrentHour(int hour) {
+ setCurrentHourInternal(hour, true, false);
+ }
+
+ /**
+ * Sets the current hour.
+ *
+ * @param hour The current hour
+ * @param callback Whether the value listener should be invoked
+ * @param autoAdvance Whether the listener should auto-advance to the next
+ * selection mode, e.g. hour to minutes
+ */
+ private void setCurrentHourInternal(int hour, boolean callback, boolean autoAdvance) {
final int degrees = (hour % 12) * DEGREES_FOR_ONE_HOUR;
mSelectionDegrees[HOURS] = degrees;
mSelectionDegrees[HOURS_INNER] = degrees;
// 0 is 12 AM (midnight) and 12 is 12 PM (noon).
- mAmOrPm = (hour == 0 || (hour % 24) < 12) ? AM : PM;
- mIsOnInnerCircle = mIs24HourMode && hour >= 1 && hour <= 12;
+ final int amOrPm = (hour == 0 || (hour % 24) < 12) ? AM : PM;
+ final boolean isOnInnerCircle = mIs24HourMode && hour >= 1 && hour <= 12;
+ if (mAmOrPm != amOrPm || mIsOnInnerCircle != isOnInnerCircle) {
+ mAmOrPm = amOrPm;
+ mIsOnInnerCircle = isOnInnerCircle;
- initData();
- updateLayoutData();
+ initData();
+ updateLayoutData();
+ mTouchHelper.invalidateRoot();
+ }
+
invalidate();
+
+ if (callback && mListener != null) {
+ mListener.onValueSelected(HOURS, hour, autoAdvance);
+ }
}
/**
@@ -479,15 +526,19 @@
* @return the current hour between 0 and 23 (inclusive)
*/
public int getCurrentHour() {
- int hour = (mSelectionDegrees[mIsOnInnerCircle ?
- HOURS_INNER : HOURS] / DEGREES_FOR_ONE_HOUR) % 12;
+ return getHourForDegrees(
+ mSelectionDegrees[mIsOnInnerCircle ? HOURS_INNER : HOURS], mIsOnInnerCircle);
+ }
+
+ private int getHourForDegrees(int degrees, boolean innerCircle) {
+ int hour = (degrees / DEGREES_FOR_ONE_HOUR) % 12;
if (mIs24HourMode) {
// Convert the 12-hour value into 24-hour time based on where the
// selector is positioned.
- if (mIsOnInnerCircle && hour == 0) {
+ if (innerCircle && hour == 0) {
// Inner circle is 1 through 12.
hour = 12;
- } else if (!mIsOnInnerCircle && hour != 0) {
+ } else if (!innerCircle && hour != 0) {
// Outer circle is 13 through 23 and 0.
hour += 12;
}
@@ -497,19 +548,49 @@
return hour;
}
+ private int getDegreesForHour(int hour) {
+ // Convert to be 0-11.
+ if (mIs24HourMode) {
+ if (hour >= 12) {
+ hour -= 12;
+ }
+ } else if (hour == 12) {
+ hour = 0;
+ }
+ return hour * DEGREES_FOR_ONE_HOUR;
+ }
+
public void setCurrentMinute(int minute) {
+ setCurrentMinuteInternal(minute, true);
+ }
+
+ private void setCurrentMinuteInternal(int minute, boolean callback) {
mSelectionDegrees[MINUTES] = (minute % 60) * DEGREES_FOR_ONE_MINUTE;
+
invalidate();
+
+ if (callback && mListener != null) {
+ mListener.onValueSelected(MINUTES, minute, false);
+ }
}
// Returns minutes in 0-59 range
public int getCurrentMinute() {
- return (mSelectionDegrees[MINUTES] / DEGREES_FOR_ONE_MINUTE);
+ return getMinuteForDegrees(mSelectionDegrees[MINUTES]);
+ }
+
+ private int getMinuteForDegrees(int degrees) {
+ return degrees / DEGREES_FOR_ONE_MINUTE;
+ }
+
+ private int getDegreesForMinute(int minute) {
+ return minute * DEGREES_FOR_ONE_MINUTE;
}
public void setAmOrPm(int val) {
mAmOrPm = (val % 2);
invalidate();
+ mTouchHelper.invalidateRoot();
}
public int getAmOrPm() {
@@ -648,6 +729,8 @@
mSelectionRadius[HOURS] = (int) (mCircleRadius[HOURS] * mSelectionRadiusMultiplier);
mSelectionRadius[HOURS_INNER] = mSelectionRadius[HOURS];
mSelectionRadius[MINUTES] = (int) (mCircleRadius[MINUTES] * mSelectionRadiusMultiplier);
+
+ mTouchHelper.invalidateRoot();
}
@Override
@@ -769,20 +852,17 @@
float top = mYCenter - outerRadius;
float right = mXCenter + outerRadius;
float bottom = mYCenter + outerRadius;
- mRectF = new RectF(left, top, right, bottom);
- canvas.drawRect(mRectF, mPaintDebug);
+ canvas.drawRect(left, top, right, bottom, mPaintDebug);
// Draw outer rectangle for background
left = mXCenter - mCircleRadius[HOURS];
top = mYCenter - mCircleRadius[HOURS];
right = mXCenter + mCircleRadius[HOURS];
bottom = mYCenter + mCircleRadius[HOURS];
- mRectF.set(left, top, right, bottom);
- canvas.drawRect(mRectF, mPaintDebug);
+ canvas.drawRect(left, top, right, bottom, mPaintDebug);
// Draw outer view rectangle
- mRectF.set(0, 0, getWidth(), getHeight());
- canvas.drawRect(mRectF, mPaintDebug);
+ canvas.drawRect(0, 0, getWidth(), getHeight(), mPaintDebug);
// Draw selected time
final String selected = String.format("%02d:%02d", getCurrentHour(), getCurrentMinute());
@@ -896,12 +976,14 @@
}
// Used for animating the hours by changing their radius
+ @SuppressWarnings("unused")
private void setAnimationRadiusMultiplierHours(float animationRadiusMultiplier) {
mAnimationRadiusMultiplier[HOURS] = animationRadiusMultiplier;
mAnimationRadiusMultiplier[HOURS_INNER] = animationRadiusMultiplier;
}
// Used for animating the minutes by changing their radius
+ @SuppressWarnings("unused")
private void setAnimationRadiusMultiplierMinutes(float animationRadiusMultiplier) {
mAnimationRadiusMultiplier[MINUTES] = animationRadiusMultiplier;
}
@@ -1094,21 +1176,25 @@
}
final float opposite = Math.abs(y - mYCenter);
- double degrees = Math.toDegrees(Math.asin(opposite / hypotenuse));
+ int degrees = (int) (Math.toDegrees(Math.asin(opposite / hypotenuse)) + 0.5);
// Now we have to translate to the correct quadrant.
- boolean rightSide = (x > mXCenter);
- boolean topSide = (y < mYCenter);
- if (rightSide && topSide) {
- degrees = 90 - degrees;
- } else if (rightSide && !topSide) {
- degrees = 90 + degrees;
- } else if (!rightSide && !topSide) {
- degrees = 270 - degrees;
- } else if (!rightSide && topSide) {
- degrees = 270 + degrees;
+ final boolean rightSide = (x > mXCenter);
+ final boolean topSide = (y < mYCenter);
+ if (rightSide) {
+ if (topSide) {
+ degrees = 90 - degrees;
+ } else {
+ degrees = 90 + degrees;
+ }
+ } else {
+ if (topSide) {
+ degrees = 270 + degrees;
+ } else {
+ degrees = 270 - degrees;
+ }
}
- return (int) degrees;
+ return degrees;
}
@Override
@@ -1176,104 +1262,13 @@
return result;
}
- /**
- * Necessary for accessibility, to ensure we support "scrolling" forward and backward
- * in the circle.
- */
@Override
- public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
- super.onInitializeAccessibilityNodeInfo(info);
- info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD);
- info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_BACKWARD);
- }
-
- /**
- * Announce the currently-selected time when launched.
- */
- @Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
- if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
- // Clear the event's current text so that only the current time will be spoken.
- event.getText().clear();
- Time time = new Time();
- time.hour = getCurrentHour();
- time.minute = getCurrentMinute();
- long millis = time.normalize(true);
- int flags = DateUtils.FORMAT_SHOW_TIME;
- if (mIs24HourMode) {
- flags |= DateUtils.FORMAT_24HOUR;
- }
- String timeString = DateUtils.formatDateTime(getContext(), millis, flags);
- event.getText().add(timeString);
+ public boolean dispatchHoverEvent(MotionEvent event) {
+ // First right-of-refusal goes the touch exploration helper.
+ if (mTouchHelper.dispatchHoverEvent(event)) {
return true;
}
- return super.dispatchPopulateAccessibilityEvent(event);
- }
-
- /**
- * When scroll forward/backward events are received, jump the time to the higher/lower
- * discrete, visible value on the circle.
- */
- @Override
- public boolean performAccessibilityAction(int action, Bundle arguments) {
- if (super.performAccessibilityAction(action, arguments)) {
- return true;
- }
-
- int changeMultiplier = 0;
- if (action == AccessibilityNodeInfo.ACTION_SCROLL_FORWARD) {
- changeMultiplier = 1;
- } else if (action == AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD) {
- changeMultiplier = -1;
- }
- if (changeMultiplier != 0) {
- int value;
- final int stepSize;
- if (mShowHours) {
- stepSize = DEGREES_FOR_ONE_HOUR;
- value = getCurrentHour() % 12;
- } else {
- stepSize = DEGREES_FOR_ONE_MINUTE;
- value = getCurrentMinute();
- }
-
- int degrees = value * stepSize;
- degrees = snapOnly30s(degrees, changeMultiplier);
- value = degrees / stepSize;
- final int maxValue;
- int minValue = 0;
- if (mShowHours) {
- if (mIs24HourMode) {
- maxValue = 23;
- } else {
- maxValue = 12;
- minValue = 1;
- }
- } else {
- maxValue = 55;
- }
- if (value > maxValue) {
- // If we scrolled forward past the highest number, wrap around to the lowest.
- value = minValue;
- } else if (value < minValue) {
- // If we scrolled backward past the lowest number, wrap around to the highest.
- value = maxValue;
- }
- if (mShowHours) {
- setCurrentHour(value);
- if (mListener != null) {
- mListener.onValueSelected(HOURS, value, false);
- }
- } else {
- setCurrentMinute(value);
- if (mListener != null) {
- mListener.onValueSelected(MINUTES, value, false);
- }
- }
- return true;
- }
-
- return false;
+ return super.dispatchHoverEvent(event);
}
public void setInputEnabled(boolean inputEnabled) {
@@ -1281,6 +1276,265 @@
invalidate();
}
+ private class RadialPickerTouchHelper extends ExploreByTouchHelper {
+ private final Rect mTempRect = new Rect();
+
+ private final int TYPE_HOUR = 1;
+ private final int TYPE_MINUTE = 2;
+
+ private final int SHIFT_TYPE = 0;
+ private final int MASK_TYPE = 0xF;
+
+ private final int SHIFT_VALUE = 8;
+ private final int MASK_VALUE = 0xFF;
+
+ /** Increment in which virtual views are exposed for minutes. */
+ private final int MINUTE_INCREMENT = 5;
+
+ public RadialPickerTouchHelper() {
+ super(RadialTimePickerView.this);
+ }
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+
+ info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD);
+ info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_BACKWARD);
+ }
+
+ @Override
+ public boolean performAccessibilityAction(View host, int action, Bundle arguments) {
+ if (super.performAccessibilityAction(host, action, arguments)) {
+ return true;
+ }
+
+ switch (action) {
+ case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD:
+ adjustPicker(1);
+ return true;
+ case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD:
+ adjustPicker(-1);
+ return true;
+ }
+
+ return false;
+ }
+
+ private void adjustPicker(int step) {
+ final int stepSize;
+ final int initialValue;
+ final int maxValue;
+ final int minValue;
+ if (mShowHours) {
+ stepSize = DEGREES_FOR_ONE_HOUR;
+ initialValue = getCurrentHour() % 12;
+
+ if (mIs24HourMode) {
+ maxValue = 23;
+ minValue = 0;
+ } else {
+ maxValue = 12;
+ minValue = 1;
+ }
+ } else {
+ stepSize = DEGREES_FOR_ONE_MINUTE;
+ initialValue = getCurrentMinute();
+
+ maxValue = 55;
+ minValue = 0;
+ }
+
+ final int steppedValue = snapOnly30s(initialValue * stepSize, step) / stepSize;
+ final int clampedValue = MathUtils.constrain(steppedValue, minValue, maxValue);
+ if (mShowHours) {
+ setCurrentHour(clampedValue);
+ } else {
+ setCurrentMinute(clampedValue);
+ }
+ }
+
+ @Override
+ protected int getVirtualViewAt(float x, float y) {
+ final int id;
+ final int degrees = getDegreesFromXY(x, y);
+ if (degrees != -1) {
+ final int snapDegrees = snapOnly30s(degrees, 0) % 360;
+ if (mShowHours) {
+ final int hour = getHourForDegrees(snapDegrees, mIsOnInnerCircle);
+ id = makeId(TYPE_HOUR, hour);
+ } else {
+ final int current = getCurrentMinute();
+ final int touched = getMinuteForDegrees(degrees);
+ final int snapped = getMinuteForDegrees(snapDegrees);
+
+ // If the touched minute is closer to the current minute
+ // than it is to the snapped minute, return current.
+ final int minute;
+ if (Math.abs(current - touched) < Math.abs(snapped - touched)) {
+ minute = current;
+ } else {
+ minute = snapped;
+ }
+ id = makeId(TYPE_MINUTE, minute);
+ }
+ } else {
+ id = INVALID_ID;
+ }
+
+ return id;
+ }
+
+ @Override
+ protected void getVisibleVirtualViews(IntArray virtualViewIds) {
+ if (mShowHours) {
+ final int min = mIs24HourMode ? 0 : 1;
+ final int max = mIs24HourMode ? 23 : 12;
+ for (int i = min; i <= max ; i++) {
+ virtualViewIds.add(makeId(TYPE_HOUR, i));
+ }
+ } else {
+ final int current = getCurrentMinute();
+ for (int i = 0; i < 60; i += MINUTE_INCREMENT) {
+ virtualViewIds.add(makeId(TYPE_MINUTE, i));
+
+ // If the current minute falls between two increments,
+ // insert an extra node for it.
+ if (current > i && current < i + MINUTE_INCREMENT) {
+ virtualViewIds.add(makeId(TYPE_MINUTE, current));
+ }
+ }
+ }
+ }
+
+ @Override
+ protected void onPopulateEventForVirtualView(int virtualViewId, AccessibilityEvent event) {
+ event.setClassName(getClass().getName());
+
+ final int type = getTypeFromId(virtualViewId);
+ final int value = getValueFromId(virtualViewId);
+ final CharSequence description = getVirtualViewDescription(type, value);
+ event.setContentDescription(description);
+ }
+
+ @Override
+ protected void onPopulateNodeForVirtualView(int virtualViewId, AccessibilityNodeInfo node) {
+ node.setClassName(getClass().getName());
+ node.addAction(AccessibilityAction.ACTION_CLICK);
+
+ final int type = getTypeFromId(virtualViewId);
+ final int value = getValueFromId(virtualViewId);
+ final CharSequence description = getVirtualViewDescription(type, value);
+ node.setContentDescription(description);
+
+ getBoundsForVirtualView(virtualViewId, mTempRect);
+ node.setBoundsInParent(mTempRect);
+
+ final boolean selected = isVirtualViewSelected(type, value);
+ node.setSelected(selected);
+ }
+
+ @Override
+ protected boolean onPerformActionForVirtualView(int virtualViewId, int action,
+ Bundle arguments) {
+ if (action == AccessibilityNodeInfo.ACTION_CLICK) {
+ final int type = getTypeFromId(virtualViewId);
+ final int value = getValueFromId(virtualViewId);
+ if (type == TYPE_HOUR) {
+ final int hour = mIs24HourMode ? value : hour12To24(value, mAmOrPm);
+ setCurrentHour(hour);
+ return true;
+ } else if (type == TYPE_MINUTE) {
+ setCurrentMinute(value);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private int hour12To24(int hour12, int amOrPm) {
+ int hour24 = hour12;
+ if (hour12 == 12) {
+ if (amOrPm == AM) {
+ hour24 = 0;
+ }
+ } else if (amOrPm == PM) {
+ hour24 += 12;
+ }
+ return hour24;
+ }
+
+ private void getBoundsForVirtualView(int virtualViewId, Rect bounds) {
+ final float radius;
+ final int type = getTypeFromId(virtualViewId);
+ final int value = getValueFromId(virtualViewId);
+ final float centerRadius;
+ final float degrees;
+ if (type == TYPE_HOUR) {
+ final boolean innerCircle = mIs24HourMode && value > 0 && value <= 12;
+ if (innerCircle) {
+ centerRadius = mCircleRadius[HOURS_INNER] * mNumbersRadiusMultiplier[HOURS_INNER];
+ radius = mSelectionRadius[HOURS_INNER];
+ } else {
+ centerRadius = mCircleRadius[HOURS] * mNumbersRadiusMultiplier[HOURS];
+ radius = mSelectionRadius[HOURS];
+ }
+
+ degrees = getDegreesForHour(value);
+ } else if (type == TYPE_MINUTE) {
+ centerRadius = mCircleRadius[MINUTES] * mNumbersRadiusMultiplier[MINUTES];
+ degrees = getDegreesForMinute(value);
+ radius = mSelectionRadius[MINUTES];
+ } else {
+ // This should never happen.
+ centerRadius = 0;
+ degrees = 0;
+ radius = 0;
+ }
+
+ final double radians = Math.toRadians(degrees);
+ final float xCenter = mXCenter + centerRadius * (float) Math.sin(radians);
+ final float yCenter = mYCenter - centerRadius * (float) Math.cos(radians);
+
+ bounds.set((int) (xCenter - radius), (int) (yCenter - radius),
+ (int) (xCenter + radius), (int) (yCenter + radius));
+ }
+
+ private CharSequence getVirtualViewDescription(int type, int value) {
+ final CharSequence description;
+ if (type == TYPE_HOUR || type == TYPE_MINUTE) {
+ description = Integer.toString(value);
+ } else {
+ description = null;
+ }
+ return description;
+ }
+
+ private boolean isVirtualViewSelected(int type, int value) {
+ final boolean selected;
+ if (type == TYPE_HOUR) {
+ selected = getCurrentHour() == value;
+ } else if (type == TYPE_MINUTE) {
+ selected = getCurrentMinute() == value;
+ } else {
+ selected = false;
+ }
+ return selected;
+ }
+
+ private int makeId(int type, int value) {
+ return type << SHIFT_TYPE | value << SHIFT_VALUE;
+ }
+
+ private int getTypeFromId(int id) {
+ return id >>> SHIFT_TYPE & MASK_TYPE;
+ }
+
+ private int getValueFromId(int id) {
+ return id >>> SHIFT_VALUE & MASK_VALUE;
+ }
+ }
+
private static class IntHolder {
private int mValue;
diff --git a/core/java/android/widget/SimpleMonthView.java b/core/java/android/widget/SimpleMonthView.java
index a76241e..59baabae 100644
--- a/core/java/android/widget/SimpleMonthView.java
+++ b/core/java/android/widget/SimpleMonthView.java
@@ -31,6 +31,7 @@
import android.text.format.DateUtils;
import android.text.format.Time;
import android.util.AttributeSet;
+import android.util.IntArray;
import android.util.MathUtils;
import android.view.MotionEvent;
import android.view.View;
@@ -610,7 +611,7 @@
}
@Override
- protected void getVisibleVirtualViews(List<Integer> virtualViewIds) {
+ protected void getVisibleVirtualViews(IntArray virtualViewIds) {
for (int day = 1; day <= mNumCells; day++) {
virtualViewIds.add(day);
}
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 5cdee53..0917b32 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -8518,6 +8518,7 @@
} return false;
case AccessibilityNodeInfo.ACTION_SET_SELECTION: {
if (isFocused() && canSelectText()) {
+ ensureIterableTextForAccessibilitySelectable();
CharSequence text = getIterableTextForAccessibility();
if (text == null) {
return false;
@@ -8543,6 +8544,11 @@
}
}
} return false;
+ case AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY:
+ case AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY: {
+ ensureIterableTextForAccessibilitySelectable();
+ return super.performAccessibilityAction(action, arguments);
+ }
default: {
return super.performAccessibilityAction(action, arguments);
}
@@ -9032,10 +9038,13 @@
*/
@Override
public CharSequence getIterableTextForAccessibility() {
+ return mText;
+ }
+
+ private void ensureIterableTextForAccessibilitySelectable() {
if (!(mText instanceof Spannable)) {
setText(mText, BufferType.SPANNABLE);
}
- return mText;
}
/**
diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java
index 85cf67b..26e02f8 100644
--- a/core/java/android/widget/TimePicker.java
+++ b/core/java/android/widget/TimePicker.java
@@ -86,12 +86,12 @@
switch (mode) {
case MODE_CLOCK:
- mDelegate = new TimePickerSpinnerDelegate(
+ mDelegate = new TimePickerClockDelegate(
this, context, attrs, defStyleAttr, defStyleRes);
break;
case MODE_SPINNER:
default:
- mDelegate = new TimePickerClockDelegate(
+ mDelegate = new TimePickerSpinnerDelegate(
this, context, attrs, defStyleAttr, defStyleRes);
break;
}
diff --git a/core/java/android/widget/TimePickerClockDelegate.java b/core/java/android/widget/TimePickerClockDelegate.java
index 6dfea92..78ee247 100644
--- a/core/java/android/widget/TimePickerClockDelegate.java
+++ b/core/java/android/widget/TimePickerClockDelegate.java
@@ -17,365 +17,376 @@
package android.widget;
import android.content.Context;
+import android.content.res.ColorStateList;
import android.content.res.Configuration;
+import android.content.res.Resources;
import android.content.res.TypedArray;
import android.os.Parcel;
import android.os.Parcelable;
+import android.text.TextUtils;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.util.AttributeSet;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.HapticFeedbackConstants;
+import android.view.KeyCharacterMap;
+import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
-import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputMethodManager;
+
import com.android.internal.R;
-import java.text.DateFormatSymbols;
+import java.util.ArrayList;
import java.util.Calendar;
import java.util.Locale;
-import libcore.icu.LocaleData;
-
-import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
-import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES;
-
/**
- * A delegate implementing the basic spinner-based TimePicker.
+ * A delegate implementing the radial clock-based TimePicker.
*/
-class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate {
+class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate implements
+ RadialTimePickerView.OnValueSelectedListener {
+
+ private static final String TAG = "TimePickerClockDelegate";
+
+ // Index used by RadialPickerLayout
+ private static final int HOUR_INDEX = 0;
+ private static final int MINUTE_INDEX = 1;
+
+ // NOT a real index for the purpose of what's showing.
+ private static final int AMPM_INDEX = 2;
+
+ // Also NOT a real index, just used for keyboard mode.
+ private static final int ENABLE_PICKER_INDEX = 3;
+
+ static final int AM = 0;
+ static final int PM = 1;
+
private static final boolean DEFAULT_ENABLED_STATE = true;
+ private boolean mIsEnabled = DEFAULT_ENABLED_STATE;
+
private static final int HOURS_IN_HALF_DAY = 12;
- // state
+ private final View mHeaderView;
+ private final TextView mHourView;
+ private final TextView mMinuteView;
+ private final View mAmPmLayout;
+ private final CheckedTextView mAmLabel;
+ private final CheckedTextView mPmLabel;
+ private final RadialTimePickerView mRadialTimePickerView;
+ private final TextView mSeparatorView;
+
+ private final String mAmText;
+ private final String mPmText;
+
+ private final float mDisabledAlpha;
+
+ private boolean mAllowAutoAdvance;
+ private int mInitialHourOfDay;
+ private int mInitialMinute;
private boolean mIs24HourView;
- private boolean mIsAm;
- // ui components
- private final NumberPicker mHourSpinner;
- private final NumberPicker mMinuteSpinner;
- private final NumberPicker mAmPmSpinner;
- private final EditText mHourSpinnerInput;
- private final EditText mMinuteSpinnerInput;
- private final EditText mAmPmSpinnerInput;
- private final TextView mDivider;
+ // For hardware IME input.
+ private char mPlaceholderText;
+ private String mDoublePlaceholderText;
+ private String mDeletedKeyFormat;
+ private boolean mInKbMode;
+ private ArrayList<Integer> mTypedTimes = new ArrayList<Integer>();
+ private Node mLegalTimesTree;
+ private int mAmKeyCode;
+ private int mPmKeyCode;
- // Note that the legacy implementation of the TimePicker is
- // using a button for toggling between AM/PM while the new
- // version uses a NumberPicker spinner. Therefore the code
- // accommodates these two cases to be backwards compatible.
- private final Button mAmPmButton;
+ // Accessibility strings.
+ private String mHourPickerDescription;
+ private String mSelectHours;
+ private String mMinutePickerDescription;
+ private String mSelectMinutes;
- private final String[] mAmPmStrings;
+ // Most recent time announcement values for accessibility.
+ private CharSequence mLastAnnouncedText;
+ private boolean mLastAnnouncedIsHour;
- private boolean mIsEnabled = DEFAULT_ENABLED_STATE;
private Calendar mTempCalendar;
- private boolean mHourWithTwoDigit;
- private char mHourFormat;
public TimePickerClockDelegate(TimePicker delegator, Context context, AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super(delegator, context);
// process style attributes
- final TypedArray a = mContext.obtainStyledAttributes(
- attrs, R.styleable.TimePicker, defStyleAttr, defStyleRes);
- final int layoutResourceId = a.getResourceId(
- R.styleable.TimePicker_legacyLayout, R.layout.time_picker_legacy);
+ final TypedArray a = mContext.obtainStyledAttributes(attrs,
+ R.styleable.TimePicker, defStyleAttr, defStyleRes);
+ final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+ final Resources res = mContext.getResources();
+
+ mHourPickerDescription = res.getString(R.string.hour_picker_description);
+ mSelectHours = res.getString(R.string.select_hours);
+ mMinutePickerDescription = res.getString(R.string.minute_picker_description);
+ mSelectMinutes = res.getString(R.string.select_minutes);
+
+ String[] amPmStrings = TimePickerSpinnerDelegate.getAmPmStrings(context);
+ mAmText = amPmStrings[0];
+ mPmText = amPmStrings[1];
+
+ final int layoutResourceId = a.getResourceId(R.styleable.TimePicker_internalLayout,
+ R.layout.time_picker_holo);
+ final View mainView = inflater.inflate(layoutResourceId, delegator);
+
+ mHeaderView = mainView.findViewById(R.id.time_header);
+ mHeaderView.setBackground(a.getDrawable(R.styleable.TimePicker_headerBackground));
+
+ // Set up hour/minute labels.
+ mHourView = (TextView) mHeaderView.findViewById(R.id.hours);
+ mHourView.setOnClickListener(mClickListener);
+ mSeparatorView = (TextView) mHeaderView.findViewById(R.id.separator);
+ mMinuteView = (TextView) mHeaderView.findViewById(R.id.minutes);
+ mMinuteView.setOnClickListener(mClickListener);
+
+ final int headerTimeTextAppearance = a.getResourceId(
+ R.styleable.TimePicker_headerTimeTextAppearance, 0);
+ if (headerTimeTextAppearance != 0) {
+ mHourView.setTextAppearance(context, headerTimeTextAppearance);
+ mSeparatorView.setTextAppearance(context, headerTimeTextAppearance);
+ mMinuteView.setTextAppearance(context, headerTimeTextAppearance);
+ }
+
+ // TODO: This can be removed once we support themed color state lists.
+ final int headerSelectedTextColor = a.getColor(
+ R.styleable.TimePicker_headerSelectedTextColor,
+ res.getColor(R.color.timepicker_default_selector_color_material));
+ mHourView.setTextColor(ColorStateList.addFirstIfMissing(mHourView.getTextColors(),
+ R.attr.state_selected, headerSelectedTextColor));
+ mMinuteView.setTextColor(ColorStateList.addFirstIfMissing(mMinuteView.getTextColors(),
+ R.attr.state_selected, headerSelectedTextColor));
+
+ // Set up AM/PM labels.
+ mAmPmLayout = mHeaderView.findViewById(R.id.ampm_layout);
+ mAmLabel = (CheckedTextView) mAmPmLayout.findViewById(R.id.am_label);
+ mAmLabel.setText(amPmStrings[0]);
+ mAmLabel.setOnClickListener(mClickListener);
+ mPmLabel = (CheckedTextView) mAmPmLayout.findViewById(R.id.pm_label);
+ mPmLabel.setText(amPmStrings[1]);
+ mPmLabel.setOnClickListener(mClickListener);
+
+ final int headerAmPmTextAppearance = a.getResourceId(
+ R.styleable.TimePicker_headerAmPmTextAppearance, 0);
+ if (headerAmPmTextAppearance != 0) {
+ mAmLabel.setTextAppearance(context, headerAmPmTextAppearance);
+ mPmLabel.setTextAppearance(context, headerAmPmTextAppearance);
+ }
+
a.recycle();
- final LayoutInflater inflater = LayoutInflater.from(mContext);
- inflater.inflate(layoutResourceId, mDelegator, true);
+ // Pull disabled alpha from theme.
+ final TypedValue outValue = new TypedValue();
+ context.getTheme().resolveAttribute(android.R.attr.disabledAlpha, outValue, true);
+ mDisabledAlpha = outValue.getFloat();
- // hour
- mHourSpinner = (NumberPicker) delegator.findViewById(R.id.hour);
- mHourSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
- public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
- updateInputState();
- if (!is24HourView()) {
- if ((oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) ||
- (oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1)) {
- mIsAm = !mIsAm;
- updateAmPmControl();
- }
- }
- onTimeChanged();
- }
- });
- mHourSpinnerInput = (EditText) mHourSpinner.findViewById(R.id.numberpicker_input);
- mHourSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
+ mRadialTimePickerView = (RadialTimePickerView) mainView.findViewById(
+ R.id.radial_picker);
- // divider (only for the new widget style)
- mDivider = (TextView) mDelegator.findViewById(R.id.divider);
- if (mDivider != null) {
- setDividerText();
+ setupListeners();
+
+ mAllowAutoAdvance = true;
+
+ // Set up for keyboard mode.
+ mDoublePlaceholderText = res.getString(R.string.time_placeholder);
+ mDeletedKeyFormat = res.getString(R.string.deleted_key);
+ mPlaceholderText = mDoublePlaceholderText.charAt(0);
+ mAmKeyCode = mPmKeyCode = -1;
+ generateLegalTimesTree();
+
+ // Initialize with current time
+ final Calendar calendar = Calendar.getInstance(mCurrentLocale);
+ final int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
+ final int currentMinute = calendar.get(Calendar.MINUTE);
+ initialize(currentHour, currentMinute, false /* 12h */, HOUR_INDEX);
+ }
+
+ private void initialize(int hourOfDay, int minute, boolean is24HourView, int index) {
+ mInitialHourOfDay = hourOfDay;
+ mInitialMinute = minute;
+ mIs24HourView = is24HourView;
+ mInKbMode = false;
+ updateUI(index);
+ }
+
+ private void setupListeners() {
+ mHeaderView.setOnKeyListener(mKeyListener);
+ mHeaderView.setOnFocusChangeListener(mFocusListener);
+ mHeaderView.setFocusable(true);
+
+ mRadialTimePickerView.setOnValueSelectedListener(this);
+ }
+
+ private void updateUI(int index) {
+ // Update RadialPicker values
+ updateRadialPicker(index);
+ // Enable or disable the AM/PM view.
+ updateHeaderAmPm();
+ // Update Hour and Minutes
+ updateHeaderHour(mInitialHourOfDay, false);
+ // Update time separator
+ updateHeaderSeparator();
+ // Update Minutes
+ updateHeaderMinute(mInitialMinute, false);
+ // Invalidate everything
+ mDelegator.invalidate();
+ }
+
+ private void updateRadialPicker(int index) {
+ mRadialTimePickerView.initialize(mInitialHourOfDay, mInitialMinute, mIs24HourView);
+ setCurrentItemShowing(index, false, true);
+ }
+
+ private int computeMaxWidthOfNumbers(int max) {
+ TextView tempView = new TextView(mContext);
+ tempView.setTextAppearance(mContext, R.style.TextAppearance_Material_TimePicker_TimeLabel);
+ ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT);
+ tempView.setLayoutParams(lp);
+ int maxWidth = 0;
+ for (int minutes = 0; minutes < max; minutes++) {
+ final String text = String.format("%02d", minutes);
+ tempView.setText(text);
+ tempView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
+ maxWidth = Math.max(maxWidth, tempView.getMeasuredWidth());
}
+ return maxWidth;
+ }
- // minute
- mMinuteSpinner = (NumberPicker) mDelegator.findViewById(R.id.minute);
- mMinuteSpinner.setMinValue(0);
- mMinuteSpinner.setMaxValue(59);
- mMinuteSpinner.setOnLongPressUpdateInterval(100);
- mMinuteSpinner.setFormatter(NumberPicker.getTwoDigitFormatter());
- mMinuteSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
- public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
- updateInputState();
- int minValue = mMinuteSpinner.getMinValue();
- int maxValue = mMinuteSpinner.getMaxValue();
- if (oldVal == maxValue && newVal == minValue) {
- int newHour = mHourSpinner.getValue() + 1;
- if (!is24HourView() && newHour == HOURS_IN_HALF_DAY) {
- mIsAm = !mIsAm;
- updateAmPmControl();
- }
- mHourSpinner.setValue(newHour);
- } else if (oldVal == minValue && newVal == maxValue) {
- int newHour = mHourSpinner.getValue() - 1;
- if (!is24HourView() && newHour == HOURS_IN_HALF_DAY - 1) {
- mIsAm = !mIsAm;
- updateAmPmControl();
- }
- mHourSpinner.setValue(newHour);
- }
- onTimeChanged();
- }
- });
- mMinuteSpinnerInput = (EditText) mMinuteSpinner.findViewById(R.id.numberpicker_input);
- mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
-
- // Get the localized am/pm strings and use them in the spinner.
- mAmPmStrings = getAmPmStrings(context);
-
- // am/pm
- final View amPmView = mDelegator.findViewById(R.id.amPm);
- if (amPmView instanceof Button) {
- mAmPmSpinner = null;
- mAmPmSpinnerInput = null;
- mAmPmButton = (Button) amPmView;
- mAmPmButton.setOnClickListener(new View.OnClickListener() {
- public void onClick(View button) {
- button.requestFocus();
- mIsAm = !mIsAm;
- updateAmPmControl();
- onTimeChanged();
- }
- });
+ private void updateHeaderAmPm() {
+ if (mIs24HourView) {
+ mAmPmLayout.setVisibility(View.GONE);
} else {
- mAmPmButton = null;
- mAmPmSpinner = (NumberPicker) amPmView;
- mAmPmSpinner.setMinValue(0);
- mAmPmSpinner.setMaxValue(1);
- mAmPmSpinner.setDisplayedValues(mAmPmStrings);
- mAmPmSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
- public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
- updateInputState();
- picker.requestFocus();
- mIsAm = !mIsAm;
- updateAmPmControl();
- onTimeChanged();
- }
- });
- mAmPmSpinnerInput = (EditText) mAmPmSpinner.findViewById(R.id.numberpicker_input);
- mAmPmSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_DONE);
- }
-
- if (isAmPmAtStart()) {
- // Move the am/pm view to the beginning
- ViewGroup amPmParent = (ViewGroup) delegator.findViewById(R.id.timePickerLayout);
- amPmParent.removeView(amPmView);
- amPmParent.addView(amPmView, 0);
- // Swap layout margins if needed. They may be not symmetrical (Old Standard Theme
- // for example and not for Holo Theme)
- ViewGroup.MarginLayoutParams lp =
- (ViewGroup.MarginLayoutParams) amPmView.getLayoutParams();
- final int startMargin = lp.getMarginStart();
- final int endMargin = lp.getMarginEnd();
- if (startMargin != endMargin) {
- lp.setMarginStart(endMargin);
- lp.setMarginEnd(startMargin);
+ final String bestDateTimePattern = DateFormat.getBestDateTimePattern(
+ mCurrentLocale, "hm");
+ boolean amPmOnLeft = bestDateTimePattern.startsWith("a");
+ if (TextUtils.getLayoutDirectionFromLocale(mCurrentLocale) ==
+ View.LAYOUT_DIRECTION_RTL) {
+ amPmOnLeft = !amPmOnLeft;
}
- }
- getHourFormatData();
+ final ViewGroup.MarginLayoutParams params =
+ (ViewGroup.MarginLayoutParams) mAmPmLayout.getLayoutParams();
- // update controls to initial state
- updateHourControl();
- updateMinuteControl();
- updateAmPmControl();
-
- // set to current time
- setCurrentHour(mTempCalendar.get(Calendar.HOUR_OF_DAY));
- setCurrentMinute(mTempCalendar.get(Calendar.MINUTE));
-
- if (!isEnabled()) {
- setEnabled(false);
- }
-
- // set the content descriptions
- setContentDescriptions();
-
- // If not explicitly specified this view is important for accessibility.
- if (mDelegator.getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
- mDelegator.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
- }
- }
-
- private void getHourFormatData() {
- final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale,
- (mIs24HourView) ? "Hm" : "hm");
- final int lengthPattern = bestDateTimePattern.length();
- mHourWithTwoDigit = false;
- char hourFormat = '\0';
- // Check if the returned pattern is single or double 'H', 'h', 'K', 'k'. We also save
- // the hour format that we found.
- for (int i = 0; i < lengthPattern; i++) {
- final char c = bestDateTimePattern.charAt(i);
- if (c == 'H' || c == 'h' || c == 'K' || c == 'k') {
- mHourFormat = c;
- if (i + 1 < lengthPattern && c == bestDateTimePattern.charAt(i + 1)) {
- mHourWithTwoDigit = true;
- }
- break;
+ if (amPmOnLeft) {
+ params.leftMargin = 0;
+ params.rightMargin = computeMaxWidthOfNumbers(12 /* for hours */);
+ } else {
+ params.leftMargin = computeMaxWidthOfNumbers(60 /* for minutes */);
+ params.rightMargin = 0;
}
+
+ mAmPmLayout.setLayoutParams(params);
+ mAmPmLayout.setVisibility(View.VISIBLE);
+
+ updateAmPmLabelStates(mInitialHourOfDay < 12 ? AM : PM);
}
}
- private boolean isAmPmAtStart() {
- final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale,
- "hm" /* skeleton */);
-
- return bestDateTimePattern.startsWith("a");
- }
-
/**
- * The time separator is defined in the Unicode CLDR and cannot be supposed to be ":".
- *
- * See http://unicode.org/cldr/trac/browser/trunk/common/main
- *
- * We pass the correct "skeleton" depending on 12 or 24 hours view and then extract the
- * separator as the character which is just after the hour marker in the returned pattern.
+ * Set the current hour.
*/
- private void setDividerText() {
- final String skeleton = (mIs24HourView) ? "Hm" : "hm";
- final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale,
- skeleton);
- final String separatorText;
- int hourIndex = bestDateTimePattern.lastIndexOf('H');
- if (hourIndex == -1) {
- hourIndex = bestDateTimePattern.lastIndexOf('h');
- }
- if (hourIndex == -1) {
- // Default case
- separatorText = ":";
- } else {
- int minuteIndex = bestDateTimePattern.indexOf('m', hourIndex + 1);
- if (minuteIndex == -1) {
- separatorText = Character.toString(bestDateTimePattern.charAt(hourIndex + 1));
- } else {
- separatorText = bestDateTimePattern.substring(hourIndex + 1, minuteIndex);
- }
- }
- mDivider.setText(separatorText);
- }
-
@Override
public void setCurrentHour(Integer currentHour) {
- setCurrentHour(currentHour, true);
- }
-
- private void setCurrentHour(Integer currentHour, boolean notifyTimeChanged) {
- // why was Integer used in the first place?
- if (currentHour == null || currentHour == getCurrentHour()) {
+ if (mInitialHourOfDay == currentHour) {
return;
}
- if (!is24HourView()) {
- // convert [0,23] ordinal to wall clock display
- if (currentHour >= HOURS_IN_HALF_DAY) {
- mIsAm = false;
- if (currentHour > HOURS_IN_HALF_DAY) {
- currentHour = currentHour - HOURS_IN_HALF_DAY;
- }
- } else {
- mIsAm = true;
- if (currentHour == 0) {
- currentHour = HOURS_IN_HALF_DAY;
- }
- }
- updateAmPmControl();
- }
- mHourSpinner.setValue(currentHour);
- if (notifyTimeChanged) {
- onTimeChanged();
- }
- }
-
- @Override
- public Integer getCurrentHour() {
- int currentHour = mHourSpinner.getValue();
- if (is24HourView()) {
- return currentHour;
- } else if (mIsAm) {
- return currentHour % HOURS_IN_HALF_DAY;
- } else {
- return (currentHour % HOURS_IN_HALF_DAY) + HOURS_IN_HALF_DAY;
- }
- }
-
- @Override
- public void setCurrentMinute(Integer currentMinute) {
- if (currentMinute == getCurrentMinute()) {
- return;
- }
- mMinuteSpinner.setValue(currentMinute);
+ mInitialHourOfDay = currentHour;
+ updateHeaderHour(currentHour, true);
+ updateHeaderAmPm();
+ mRadialTimePickerView.setCurrentHour(currentHour);
+ mRadialTimePickerView.setAmOrPm(mInitialHourOfDay < 12 ? AM : PM);
+ mDelegator.invalidate();
onTimeChanged();
}
+ /**
+ * @return The current hour in the range (0-23).
+ */
@Override
- public Integer getCurrentMinute() {
- return mMinuteSpinner.getValue();
+ public Integer getCurrentHour() {
+ int currentHour = mRadialTimePickerView.getCurrentHour();
+ if (mIs24HourView) {
+ return currentHour;
+ } else {
+ switch(mRadialTimePickerView.getAmOrPm()) {
+ case PM:
+ return (currentHour % HOURS_IN_HALF_DAY) + HOURS_IN_HALF_DAY;
+ case AM:
+ default:
+ return currentHour % HOURS_IN_HALF_DAY;
+ }
+ }
}
+ /**
+ * Set the current minute (0-59).
+ */
@Override
- public void setIs24HourView(Boolean is24HourView) {
- if (mIs24HourView == is24HourView) {
+ public void setCurrentMinute(Integer currentMinute) {
+ if (mInitialMinute == currentMinute) {
return;
}
- // cache the current hour since spinner range changes and BEFORE changing mIs24HourView!!
- int currentHour = getCurrentHour();
- // Order is important here.
- mIs24HourView = is24HourView;
- getHourFormatData();
- updateHourControl();
- // set value after spinner range is updated
- setCurrentHour(currentHour, false);
- updateMinuteControl();
- updateAmPmControl();
+ mInitialMinute = currentMinute;
+ updateHeaderMinute(currentMinute, true);
+ mRadialTimePickerView.setCurrentMinute(currentMinute);
+ mDelegator.invalidate();
+ onTimeChanged();
}
+ /**
+ * @return The current minute.
+ */
+ @Override
+ public Integer getCurrentMinute() {
+ return mRadialTimePickerView.getCurrentMinute();
+ }
+
+ /**
+ * Set whether in 24 hour or AM/PM mode.
+ *
+ * @param is24HourView True = 24 hour mode. False = AM/PM.
+ */
+ @Override
+ public void setIs24HourView(Boolean is24HourView) {
+ if (is24HourView == mIs24HourView) {
+ return;
+ }
+ mIs24HourView = is24HourView;
+ generateLegalTimesTree();
+ int hour = mRadialTimePickerView.getCurrentHour();
+ mInitialHourOfDay = hour;
+ updateHeaderHour(hour, false);
+ updateHeaderAmPm();
+ updateRadialPicker(mRadialTimePickerView.getCurrentItemShowing());
+ mDelegator.invalidate();
+ }
+
+ /**
+ * @return true if this is in 24 hour view else false.
+ */
@Override
public boolean is24HourView() {
return mIs24HourView;
}
@Override
- public void setOnTimeChangedListener(TimePicker.OnTimeChangedListener onTimeChangedListener) {
- mOnTimeChangedListener = onTimeChangedListener;
+ public void setOnTimeChangedListener(TimePicker.OnTimeChangedListener callback) {
+ mOnTimeChangedListener = callback;
}
@Override
public void setEnabled(boolean enabled) {
- mMinuteSpinner.setEnabled(enabled);
- if (mDivider != null) {
- mDivider.setEnabled(enabled);
- }
- mHourSpinner.setEnabled(enabled);
- if (mAmPmSpinner != null) {
- mAmPmSpinner.setEnabled(enabled);
- } else {
- mAmPmButton.setEnabled(enabled);
- }
+ mHourView.setEnabled(enabled);
+ mMinuteView.setEnabled(enabled);
+ mAmLabel.setEnabled(enabled);
+ mPmLabel.setEnabled(enabled);
+ mRadialTimePickerView.setEnabled(enabled);
mIsEnabled = enabled;
}
@@ -386,24 +397,38 @@
@Override
public int getBaseline() {
- return mHourSpinner.getBaseline();
+ // does not support baseline alignment
+ return -1;
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
- setCurrentLocale(newConfig.locale);
+ updateUI(mRadialTimePickerView.getCurrentItemShowing());
}
@Override
public Parcelable onSaveInstanceState(Parcelable superState) {
- return new SavedState(superState, getCurrentHour(), getCurrentMinute());
+ return new SavedState(superState, getCurrentHour(), getCurrentMinute(),
+ is24HourView(), inKbMode(), getTypedTimes(), getCurrentItemShowing());
}
@Override
public void onRestoreInstanceState(Parcelable state) {
SavedState ss = (SavedState) state;
- setCurrentHour(ss.getHour());
- setCurrentMinute(ss.getMinute());
+ setInKbMode(ss.inKbMode());
+ setTypedTimes(ss.getTypesTimes());
+ initialize(ss.getHour(), ss.getMinute(), ss.is24HourMode(), ss.getCurrentItemShowing());
+ mRadialTimePickerView.invalidate();
+ if (mInKbMode) {
+ tryStartingKbMode(-1);
+ mHourView.invalidate();
+ }
+ }
+
+ @Override
+ public void setCurrentLocale(Locale locale) {
+ super.setCurrentLocale(locale);
+ mTempCalendar = Calendar.getInstance(locale);
}
@Override
@@ -422,9 +447,9 @@
}
mTempCalendar.set(Calendar.HOUR_OF_DAY, getCurrentHour());
mTempCalendar.set(Calendar.MINUTE, getCurrentMinute());
- String selectedDateUtterance = DateUtils.formatDateTime(mContext,
+ String selectedDate = DateUtils.formatDateTime(mContext,
mTempCalendar.getTimeInMillis(), flags);
- event.getText().add(selectedDateUtterance);
+ event.getText().add(selectedDate);
}
@Override
@@ -437,121 +462,48 @@
info.setClassName(TimePicker.class.getName());
}
- private void updateInputState() {
- // Make sure that if the user changes the value and the IME is active
- // for one of the inputs if this widget, the IME is closed. If the user
- // changed the value via the IME and there is a next input the IME will
- // be shown, otherwise the user chose another means of changing the
- // value and having the IME up makes no sense.
- InputMethodManager inputMethodManager = InputMethodManager.peekInstance();
- if (inputMethodManager != null) {
- if (inputMethodManager.isActive(mHourSpinnerInput)) {
- mHourSpinnerInput.clearFocus();
- inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0);
- } else if (inputMethodManager.isActive(mMinuteSpinnerInput)) {
- mMinuteSpinnerInput.clearFocus();
- inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0);
- } else if (inputMethodManager.isActive(mAmPmSpinnerInput)) {
- mAmPmSpinnerInput.clearFocus();
- inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0);
- }
- }
- }
-
- private void updateAmPmControl() {
- if (is24HourView()) {
- if (mAmPmSpinner != null) {
- mAmPmSpinner.setVisibility(View.GONE);
- } else {
- mAmPmButton.setVisibility(View.GONE);
- }
- } else {
- int index = mIsAm ? Calendar.AM : Calendar.PM;
- if (mAmPmSpinner != null) {
- mAmPmSpinner.setValue(index);
- mAmPmSpinner.setVisibility(View.VISIBLE);
- } else {
- mAmPmButton.setText(mAmPmStrings[index]);
- mAmPmButton.setVisibility(View.VISIBLE);
- }
- }
- mDelegator.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
+ /**
+ * Set whether in keyboard mode or not.
+ *
+ * @param inKbMode True means in keyboard mode.
+ */
+ private void setInKbMode(boolean inKbMode) {
+ mInKbMode = inKbMode;
}
/**
- * Sets the current locale.
- *
- * @param locale The current locale.
+ * @return true if in keyboard mode
*/
- @Override
- public void setCurrentLocale(Locale locale) {
- super.setCurrentLocale(locale);
- mTempCalendar = Calendar.getInstance(locale);
+ private boolean inKbMode() {
+ return mInKbMode;
}
+ private void setTypedTimes(ArrayList<Integer> typeTimes) {
+ mTypedTimes = typeTimes;
+ }
+
+ /**
+ * @return an array of typed times
+ */
+ private ArrayList<Integer> getTypedTimes() {
+ return mTypedTimes;
+ }
+
+ /**
+ * @return the index of the current item showing
+ */
+ private int getCurrentItemShowing() {
+ return mRadialTimePickerView.getCurrentItemShowing();
+ }
+
+ /**
+ * Propagate the time change
+ */
private void onTimeChanged() {
mDelegator.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
if (mOnTimeChangedListener != null) {
- mOnTimeChangedListener.onTimeChanged(mDelegator, getCurrentHour(),
- getCurrentMinute());
- }
- }
-
- private void updateHourControl() {
- if (is24HourView()) {
- // 'k' means 1-24 hour
- if (mHourFormat == 'k') {
- mHourSpinner.setMinValue(1);
- mHourSpinner.setMaxValue(24);
- } else {
- mHourSpinner.setMinValue(0);
- mHourSpinner.setMaxValue(23);
- }
- } else {
- // 'K' means 0-11 hour
- if (mHourFormat == 'K') {
- mHourSpinner.setMinValue(0);
- mHourSpinner.setMaxValue(11);
- } else {
- mHourSpinner.setMinValue(1);
- mHourSpinner.setMaxValue(12);
- }
- }
- mHourSpinner.setFormatter(mHourWithTwoDigit ? NumberPicker.getTwoDigitFormatter() : null);
- }
-
- private void updateMinuteControl() {
- if (is24HourView()) {
- mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_DONE);
- } else {
- mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
- }
- }
-
- private void setContentDescriptions() {
- // Minute
- trySetContentDescription(mMinuteSpinner, R.id.increment,
- R.string.time_picker_increment_minute_button);
- trySetContentDescription(mMinuteSpinner, R.id.decrement,
- R.string.time_picker_decrement_minute_button);
- // Hour
- trySetContentDescription(mHourSpinner, R.id.increment,
- R.string.time_picker_increment_hour_button);
- trySetContentDescription(mHourSpinner, R.id.decrement,
- R.string.time_picker_decrement_hour_button);
- // AM/PM
- if (mAmPmSpinner != null) {
- trySetContentDescription(mAmPmSpinner, R.id.increment,
- R.string.time_picker_increment_set_pm_button);
- trySetContentDescription(mAmPmSpinner, R.id.decrement,
- R.string.time_picker_decrement_set_am_button);
- }
- }
-
- private void trySetContentDescription(View root, int viewId, int contDescResId) {
- View target = root.findViewById(viewId);
- if (target != null) {
- target.setContentDescription(mContext.getString(contDescResId));
+ mOnTimeChangedListener.onTimeChanged(mDelegator,
+ getCurrentHour(), getCurrentMinute());
}
}
@@ -559,19 +511,34 @@
* Used to save / restore state of time picker
*/
private static class SavedState extends View.BaseSavedState {
+
private final int mHour;
private final int mMinute;
+ private final boolean mIs24HourMode;
+ private final boolean mInKbMode;
+ private final ArrayList<Integer> mTypedTimes;
+ private final int mCurrentItemShowing;
- private SavedState(Parcelable superState, int hour, int minute) {
+ private SavedState(Parcelable superState, int hour, int minute, boolean is24HourMode,
+ boolean isKbMode, ArrayList<Integer> typedTimes,
+ int currentItemShowing) {
super(superState);
mHour = hour;
mMinute = minute;
+ mIs24HourMode = is24HourMode;
+ mInKbMode = isKbMode;
+ mTypedTimes = typedTimes;
+ mCurrentItemShowing = currentItemShowing;
}
private SavedState(Parcel in) {
super(in);
mHour = in.readInt();
mMinute = in.readInt();
+ mIs24HourMode = (in.readInt() == 1);
+ mInKbMode = (in.readInt() == 1);
+ mTypedTimes = in.readArrayList(getClass().getClassLoader());
+ mCurrentItemShowing = in.readInt();
}
public int getHour() {
@@ -582,11 +549,31 @@
return mMinute;
}
+ public boolean is24HourMode() {
+ return mIs24HourMode;
+ }
+
+ public boolean inKbMode() {
+ return mInKbMode;
+ }
+
+ public ArrayList<Integer> getTypesTimes() {
+ return mTypedTimes;
+ }
+
+ public int getCurrentItemShowing() {
+ return mCurrentItemShowing;
+ }
+
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(mHour);
dest.writeInt(mMinute);
+ dest.writeInt(mIs24HourMode ? 1 : 0);
+ dest.writeInt(mInKbMode ? 1 : 0);
+ dest.writeList(mTypedTimes);
+ dest.writeInt(mCurrentItemShowing);
}
@SuppressWarnings({"unused", "hiding"})
@@ -601,11 +588,696 @@
};
}
- public static String[] getAmPmStrings(Context context) {
- String[] result = new String[2];
- LocaleData d = LocaleData.get(context.getResources().getConfiguration().locale);
- result[0] = d.amPm[0].length() > 2 ? d.narrowAm : d.amPm[0];
- result[1] = d.amPm[1].length() > 2 ? d.narrowPm : d.amPm[1];
- return result;
+ private void tryVibrate() {
+ mDelegator.performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK);
}
+
+ private void updateAmPmLabelStates(int amOrPm) {
+ final boolean isAm = amOrPm == AM;
+ mAmLabel.setChecked(isAm);
+ mAmLabel.setAlpha(isAm ? 1 : mDisabledAlpha);
+
+ final boolean isPm = amOrPm == PM;
+ mPmLabel.setChecked(isPm);
+ mPmLabel.setAlpha(isPm ? 1 : mDisabledAlpha);
+ }
+
+ /**
+ * Called by the picker for updating the header display.
+ */
+ @Override
+ public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) {
+ if (pickerIndex == HOUR_INDEX) {
+ if (mAllowAutoAdvance && autoAdvance) {
+ updateHeaderHour(newValue, false);
+ setCurrentItemShowing(MINUTE_INDEX, true, false);
+ mDelegator.announceForAccessibility(newValue + ". " + mSelectMinutes);
+ } else {
+ updateHeaderHour(newValue, true);
+ }
+ } else if (pickerIndex == MINUTE_INDEX){
+ updateHeaderMinute(newValue, true);
+ } else if (pickerIndex == AMPM_INDEX) {
+ updateAmPmLabelStates(newValue);
+ } else if (pickerIndex == ENABLE_PICKER_INDEX) {
+ if (!isTypedTimeFullyLegal()) {
+ mTypedTimes.clear();
+ }
+ finishKbMode();
+ }
+ }
+
+ private void updateHeaderHour(int value, boolean announce) {
+ final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale,
+ (mIs24HourView) ? "Hm" : "hm");
+ final int lengthPattern = bestDateTimePattern.length();
+ boolean hourWithTwoDigit = false;
+ char hourFormat = '\0';
+ // Check if the returned pattern is single or double 'H', 'h', 'K', 'k'. We also save
+ // the hour format that we found.
+ for (int i = 0; i < lengthPattern; i++) {
+ final char c = bestDateTimePattern.charAt(i);
+ if (c == 'H' || c == 'h' || c == 'K' || c == 'k') {
+ hourFormat = c;
+ if (i + 1 < lengthPattern && c == bestDateTimePattern.charAt(i + 1)) {
+ hourWithTwoDigit = true;
+ }
+ break;
+ }
+ }
+ final String format;
+ if (hourWithTwoDigit) {
+ format = "%02d";
+ } else {
+ format = "%d";
+ }
+ if (mIs24HourView) {
+ // 'k' means 1-24 hour
+ if (hourFormat == 'k' && value == 0) {
+ value = 24;
+ }
+ } else {
+ // 'K' means 0-11 hour
+ value = modulo12(value, hourFormat == 'K');
+ }
+ CharSequence text = String.format(format, value);
+ mHourView.setText(text);
+ if (announce) {
+ tryAnnounceForAccessibility(text, true);
+ }
+ }
+
+ private void tryAnnounceForAccessibility(CharSequence text, boolean isHour) {
+ if (mLastAnnouncedIsHour != isHour || !text.equals(mLastAnnouncedText)) {
+ // TODO: Find a better solution, potentially live regions?
+ mDelegator.announceForAccessibility(text);
+ mLastAnnouncedText = text;
+ mLastAnnouncedIsHour = isHour;
+ }
+ }
+
+ private static int modulo12(int n, boolean startWithZero) {
+ int value = n % 12;
+ if (value == 0 && !startWithZero) {
+ value = 12;
+ }
+ return value;
+ }
+
+ /**
+ * The time separator is defined in the Unicode CLDR and cannot be supposed to be ":".
+ *
+ * See http://unicode.org/cldr/trac/browser/trunk/common/main
+ *
+ * We pass the correct "skeleton" depending on 12 or 24 hours view and then extract the
+ * separator as the character which is just after the hour marker in the returned pattern.
+ */
+ private void updateHeaderSeparator() {
+ final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale,
+ (mIs24HourView) ? "Hm" : "hm");
+ final String separatorText;
+ // See http://www.unicode.org/reports/tr35/tr35-dates.html for hour formats
+ final char[] hourFormats = {'H', 'h', 'K', 'k'};
+ int hIndex = lastIndexOfAny(bestDateTimePattern, hourFormats);
+ if (hIndex == -1) {
+ // Default case
+ separatorText = ":";
+ } else {
+ separatorText = Character.toString(bestDateTimePattern.charAt(hIndex + 1));
+ }
+ mSeparatorView.setText(separatorText);
+ }
+
+ static private int lastIndexOfAny(String str, char[] any) {
+ final int lengthAny = any.length;
+ if (lengthAny > 0) {
+ for (int i = str.length() - 1; i >= 0; i--) {
+ char c = str.charAt(i);
+ for (int j = 0; j < lengthAny; j++) {
+ if (c == any[j]) {
+ return i;
+ }
+ }
+ }
+ }
+ return -1;
+ }
+
+ private void updateHeaderMinute(int value, boolean announceForAccessibility) {
+ if (value == 60) {
+ value = 0;
+ }
+ final CharSequence text = String.format(mCurrentLocale, "%02d", value);
+ mMinuteView.setText(text);
+ if (announceForAccessibility) {
+ tryAnnounceForAccessibility(text, false);
+ }
+ }
+
+ /**
+ * Show either Hours or Minutes.
+ */
+ private void setCurrentItemShowing(int index, boolean animateCircle, boolean announce) {
+ mRadialTimePickerView.setCurrentItemShowing(index, animateCircle);
+
+ if (index == HOUR_INDEX) {
+ if (announce) {
+ mDelegator.announceForAccessibility(mSelectHours);
+ }
+ } else {
+ if (announce) {
+ mDelegator.announceForAccessibility(mSelectMinutes);
+ }
+ }
+
+ mHourView.setSelected(index == HOUR_INDEX);
+ mMinuteView.setSelected(index == MINUTE_INDEX);
+ }
+
+ private void setAmOrPm(int amOrPm) {
+ updateAmPmLabelStates(amOrPm);
+ mRadialTimePickerView.setAmOrPm(amOrPm);
+ }
+
+ /**
+ * For keyboard mode, processes key events.
+ *
+ * @param keyCode the pressed key.
+ *
+ * @return true if the key was successfully processed, false otherwise.
+ */
+ private boolean processKeyUp(int keyCode) {
+ if (keyCode == KeyEvent.KEYCODE_DEL) {
+ if (mInKbMode) {
+ if (!mTypedTimes.isEmpty()) {
+ int deleted = deleteLastTypedKey();
+ String deletedKeyStr;
+ if (deleted == getAmOrPmKeyCode(AM)) {
+ deletedKeyStr = mAmText;
+ } else if (deleted == getAmOrPmKeyCode(PM)) {
+ deletedKeyStr = mPmText;
+ } else {
+ deletedKeyStr = String.format("%d", getValFromKeyCode(deleted));
+ }
+ mDelegator.announceForAccessibility(
+ String.format(mDeletedKeyFormat, deletedKeyStr));
+ updateDisplay(true);
+ }
+ }
+ } else if (keyCode == KeyEvent.KEYCODE_0 || keyCode == KeyEvent.KEYCODE_1
+ || keyCode == KeyEvent.KEYCODE_2 || keyCode == KeyEvent.KEYCODE_3
+ || keyCode == KeyEvent.KEYCODE_4 || keyCode == KeyEvent.KEYCODE_5
+ || keyCode == KeyEvent.KEYCODE_6 || keyCode == KeyEvent.KEYCODE_7
+ || keyCode == KeyEvent.KEYCODE_8 || keyCode == KeyEvent.KEYCODE_9
+ || (!mIs24HourView &&
+ (keyCode == getAmOrPmKeyCode(AM) || keyCode == getAmOrPmKeyCode(PM)))) {
+ if (!mInKbMode) {
+ if (mRadialTimePickerView == null) {
+ // Something's wrong, because time picker should definitely not be null.
+ Log.e(TAG, "Unable to initiate keyboard mode, TimePicker was null.");
+ return true;
+ }
+ mTypedTimes.clear();
+ tryStartingKbMode(keyCode);
+ return true;
+ }
+ // We're already in keyboard mode.
+ if (addKeyIfLegal(keyCode)) {
+ updateDisplay(false);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Try to start keyboard mode with the specified key.
+ *
+ * @param keyCode The key to use as the first press. Keyboard mode will not be started if the
+ * key is not legal to start with. Or, pass in -1 to get into keyboard mode without a starting
+ * key.
+ */
+ private void tryStartingKbMode(int keyCode) {
+ if (keyCode == -1 || addKeyIfLegal(keyCode)) {
+ mInKbMode = true;
+ onValidationChanged(false);
+ updateDisplay(false);
+ mRadialTimePickerView.setInputEnabled(false);
+ }
+ }
+
+ private boolean addKeyIfLegal(int keyCode) {
+ // If we're in 24hour mode, we'll need to check if the input is full. If in AM/PM mode,
+ // we'll need to see if AM/PM have been typed.
+ if ((mIs24HourView && mTypedTimes.size() == 4) ||
+ (!mIs24HourView && isTypedTimeFullyLegal())) {
+ return false;
+ }
+
+ mTypedTimes.add(keyCode);
+ if (!isTypedTimeLegalSoFar()) {
+ deleteLastTypedKey();
+ return false;
+ }
+
+ int val = getValFromKeyCode(keyCode);
+ mDelegator.announceForAccessibility(String.format("%d", val));
+ // Automatically fill in 0's if AM or PM was legally entered.
+ if (isTypedTimeFullyLegal()) {
+ if (!mIs24HourView && mTypedTimes.size() <= 3) {
+ mTypedTimes.add(mTypedTimes.size() - 1, KeyEvent.KEYCODE_0);
+ mTypedTimes.add(mTypedTimes.size() - 1, KeyEvent.KEYCODE_0);
+ }
+ onValidationChanged(true);
+ }
+
+ return true;
+ }
+
+ /**
+ * Traverse the tree to see if the keys that have been typed so far are legal as is,
+ * or may become legal as more keys are typed (excluding backspace).
+ */
+ private boolean isTypedTimeLegalSoFar() {
+ Node node = mLegalTimesTree;
+ for (int keyCode : mTypedTimes) {
+ node = node.canReach(keyCode);
+ if (node == null) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Check if the time that has been typed so far is completely legal, as is.
+ */
+ private boolean isTypedTimeFullyLegal() {
+ if (mIs24HourView) {
+ // For 24-hour mode, the time is legal if the hours and minutes are each legal. Note:
+ // getEnteredTime() will ONLY call isTypedTimeFullyLegal() when NOT in 24hour mode.
+ int[] values = getEnteredTime(null);
+ return (values[0] >= 0 && values[1] >= 0 && values[1] < 60);
+ } else {
+ // For AM/PM mode, the time is legal if it contains an AM or PM, as those can only be
+ // legally added at specific times based on the tree's algorithm.
+ return (mTypedTimes.contains(getAmOrPmKeyCode(AM)) ||
+ mTypedTimes.contains(getAmOrPmKeyCode(PM)));
+ }
+ }
+
+ private int deleteLastTypedKey() {
+ int deleted = mTypedTimes.remove(mTypedTimes.size() - 1);
+ if (!isTypedTimeFullyLegal()) {
+ onValidationChanged(false);
+ }
+ return deleted;
+ }
+
+ /**
+ * Get out of keyboard mode. If there is nothing in typedTimes, revert to TimePicker's time.
+ */
+ private void finishKbMode() {
+ mInKbMode = false;
+ if (!mTypedTimes.isEmpty()) {
+ int values[] = getEnteredTime(null);
+ mRadialTimePickerView.setCurrentHour(values[0]);
+ mRadialTimePickerView.setCurrentMinute(values[1]);
+ if (!mIs24HourView) {
+ mRadialTimePickerView.setAmOrPm(values[2]);
+ }
+ mTypedTimes.clear();
+ }
+ updateDisplay(false);
+ mRadialTimePickerView.setInputEnabled(true);
+ }
+
+ /**
+ * Update the hours, minutes, and AM/PM displays with the typed times. If the typedTimes is
+ * empty, either show an empty display (filled with the placeholder text), or update from the
+ * timepicker's values.
+ *
+ * @param allowEmptyDisplay if true, then if the typedTimes is empty, use the placeholder text.
+ * Otherwise, revert to the timepicker's values.
+ */
+ private void updateDisplay(boolean allowEmptyDisplay) {
+ if (!allowEmptyDisplay && mTypedTimes.isEmpty()) {
+ int hour = mRadialTimePickerView.getCurrentHour();
+ int minute = mRadialTimePickerView.getCurrentMinute();
+ updateHeaderHour(hour, false);
+ updateHeaderMinute(minute, false);
+ if (!mIs24HourView) {
+ updateAmPmLabelStates(hour < 12 ? AM : PM);
+ }
+ setCurrentItemShowing(mRadialTimePickerView.getCurrentItemShowing(), true, true);
+ onValidationChanged(true);
+ } else {
+ boolean[] enteredZeros = {false, false};
+ int[] values = getEnteredTime(enteredZeros);
+ String hourFormat = enteredZeros[0] ? "%02d" : "%2d";
+ String minuteFormat = (enteredZeros[1]) ? "%02d" : "%2d";
+ String hourStr = (values[0] == -1) ? mDoublePlaceholderText :
+ String.format(hourFormat, values[0]).replace(' ', mPlaceholderText);
+ String minuteStr = (values[1] == -1) ? mDoublePlaceholderText :
+ String.format(minuteFormat, values[1]).replace(' ', mPlaceholderText);
+ mHourView.setText(hourStr);
+ mHourView.setSelected(false);
+ mMinuteView.setText(minuteStr);
+ mMinuteView.setSelected(false);
+ if (!mIs24HourView) {
+ updateAmPmLabelStates(values[2]);
+ }
+ }
+ }
+
+ private int getValFromKeyCode(int keyCode) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_0:
+ return 0;
+ case KeyEvent.KEYCODE_1:
+ return 1;
+ case KeyEvent.KEYCODE_2:
+ return 2;
+ case KeyEvent.KEYCODE_3:
+ return 3;
+ case KeyEvent.KEYCODE_4:
+ return 4;
+ case KeyEvent.KEYCODE_5:
+ return 5;
+ case KeyEvent.KEYCODE_6:
+ return 6;
+ case KeyEvent.KEYCODE_7:
+ return 7;
+ case KeyEvent.KEYCODE_8:
+ return 8;
+ case KeyEvent.KEYCODE_9:
+ return 9;
+ default:
+ return -1;
+ }
+ }
+
+ /**
+ * Get the currently-entered time, as integer values of the hours and minutes typed.
+ *
+ * @param enteredZeros A size-2 boolean array, which the caller should initialize, and which
+ * may then be used for the caller to know whether zeros had been explicitly entered as either
+ * hours of minutes. This is helpful for deciding whether to show the dashes, or actual 0's.
+ *
+ * @return A size-3 int array. The first value will be the hours, the second value will be the
+ * minutes, and the third will be either AM or PM.
+ */
+ private int[] getEnteredTime(boolean[] enteredZeros) {
+ int amOrPm = -1;
+ int startIndex = 1;
+ if (!mIs24HourView && isTypedTimeFullyLegal()) {
+ int keyCode = mTypedTimes.get(mTypedTimes.size() - 1);
+ if (keyCode == getAmOrPmKeyCode(AM)) {
+ amOrPm = AM;
+ } else if (keyCode == getAmOrPmKeyCode(PM)){
+ amOrPm = PM;
+ }
+ startIndex = 2;
+ }
+ int minute = -1;
+ int hour = -1;
+ for (int i = startIndex; i <= mTypedTimes.size(); i++) {
+ int val = getValFromKeyCode(mTypedTimes.get(mTypedTimes.size() - i));
+ if (i == startIndex) {
+ minute = val;
+ } else if (i == startIndex+1) {
+ minute += 10 * val;
+ if (enteredZeros != null && val == 0) {
+ enteredZeros[1] = true;
+ }
+ } else if (i == startIndex+2) {
+ hour = val;
+ } else if (i == startIndex+3) {
+ hour += 10 * val;
+ if (enteredZeros != null && val == 0) {
+ enteredZeros[0] = true;
+ }
+ }
+ }
+
+ return new int[] { hour, minute, amOrPm };
+ }
+
+ /**
+ * Get the keycode value for AM and PM in the current language.
+ */
+ private int getAmOrPmKeyCode(int amOrPm) {
+ // Cache the codes.
+ if (mAmKeyCode == -1 || mPmKeyCode == -1) {
+ // Find the first character in the AM/PM text that is unique.
+ KeyCharacterMap kcm = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
+ char amChar;
+ char pmChar;
+ for (int i = 0; i < Math.max(mAmText.length(), mPmText.length()); i++) {
+ amChar = mAmText.toLowerCase(mCurrentLocale).charAt(i);
+ pmChar = mPmText.toLowerCase(mCurrentLocale).charAt(i);
+ if (amChar != pmChar) {
+ KeyEvent[] events = kcm.getEvents(new char[]{amChar, pmChar});
+ // There should be 4 events: a down and up for both AM and PM.
+ if (events != null && events.length == 4) {
+ mAmKeyCode = events[0].getKeyCode();
+ mPmKeyCode = events[2].getKeyCode();
+ } else {
+ Log.e(TAG, "Unable to find keycodes for AM and PM.");
+ }
+ break;
+ }
+ }
+ }
+ if (amOrPm == AM) {
+ return mAmKeyCode;
+ } else if (amOrPm == PM) {
+ return mPmKeyCode;
+ }
+
+ return -1;
+ }
+
+ /**
+ * Create a tree for deciding what keys can legally be typed.
+ */
+ private void generateLegalTimesTree() {
+ // Create a quick cache of numbers to their keycodes.
+ final int k0 = KeyEvent.KEYCODE_0;
+ final int k1 = KeyEvent.KEYCODE_1;
+ final int k2 = KeyEvent.KEYCODE_2;
+ final int k3 = KeyEvent.KEYCODE_3;
+ final int k4 = KeyEvent.KEYCODE_4;
+ final int k5 = KeyEvent.KEYCODE_5;
+ final int k6 = KeyEvent.KEYCODE_6;
+ final int k7 = KeyEvent.KEYCODE_7;
+ final int k8 = KeyEvent.KEYCODE_8;
+ final int k9 = KeyEvent.KEYCODE_9;
+
+ // The root of the tree doesn't contain any numbers.
+ mLegalTimesTree = new Node();
+ if (mIs24HourView) {
+ // We'll be re-using these nodes, so we'll save them.
+ Node minuteFirstDigit = new Node(k0, k1, k2, k3, k4, k5);
+ Node minuteSecondDigit = new Node(k0, k1, k2, k3, k4, k5, k6, k7, k8, k9);
+ // The first digit must be followed by the second digit.
+ minuteFirstDigit.addChild(minuteSecondDigit);
+
+ // The first digit may be 0-1.
+ Node firstDigit = new Node(k0, k1);
+ mLegalTimesTree.addChild(firstDigit);
+
+ // When the first digit is 0-1, the second digit may be 0-5.
+ Node secondDigit = new Node(k0, k1, k2, k3, k4, k5);
+ firstDigit.addChild(secondDigit);
+ // We may now be followed by the first minute digit. E.g. 00:09, 15:58.
+ secondDigit.addChild(minuteFirstDigit);
+
+ // When the first digit is 0-1, and the second digit is 0-5, the third digit may be 6-9.
+ Node thirdDigit = new Node(k6, k7, k8, k9);
+ // The time must now be finished. E.g. 0:55, 1:08.
+ secondDigit.addChild(thirdDigit);
+
+ // When the first digit is 0-1, the second digit may be 6-9.
+ secondDigit = new Node(k6, k7, k8, k9);
+ firstDigit.addChild(secondDigit);
+ // We must now be followed by the first minute digit. E.g. 06:50, 18:20.
+ secondDigit.addChild(minuteFirstDigit);
+
+ // The first digit may be 2.
+ firstDigit = new Node(k2);
+ mLegalTimesTree.addChild(firstDigit);
+
+ // When the first digit is 2, the second digit may be 0-3.
+ secondDigit = new Node(k0, k1, k2, k3);
+ firstDigit.addChild(secondDigit);
+ // We must now be followed by the first minute digit. E.g. 20:50, 23:09.
+ secondDigit.addChild(minuteFirstDigit);
+
+ // When the first digit is 2, the second digit may be 4-5.
+ secondDigit = new Node(k4, k5);
+ firstDigit.addChild(secondDigit);
+ // We must now be followd by the last minute digit. E.g. 2:40, 2:53.
+ secondDigit.addChild(minuteSecondDigit);
+
+ // The first digit may be 3-9.
+ firstDigit = new Node(k3, k4, k5, k6, k7, k8, k9);
+ mLegalTimesTree.addChild(firstDigit);
+ // We must now be followed by the first minute digit. E.g. 3:57, 8:12.
+ firstDigit.addChild(minuteFirstDigit);
+ } else {
+ // We'll need to use the AM/PM node a lot.
+ // Set up AM and PM to respond to "a" and "p".
+ Node ampm = new Node(getAmOrPmKeyCode(AM), getAmOrPmKeyCode(PM));
+
+ // The first hour digit may be 1.
+ Node firstDigit = new Node(k1);
+ mLegalTimesTree.addChild(firstDigit);
+ // We'll allow quick input of on-the-hour times. E.g. 1pm.
+ firstDigit.addChild(ampm);
+
+ // When the first digit is 1, the second digit may be 0-2.
+ Node secondDigit = new Node(k0, k1, k2);
+ firstDigit.addChild(secondDigit);
+ // Also for quick input of on-the-hour times. E.g. 10pm, 12am.
+ secondDigit.addChild(ampm);
+
+ // When the first digit is 1, and the second digit is 0-2, the third digit may be 0-5.
+ Node thirdDigit = new Node(k0, k1, k2, k3, k4, k5);
+ secondDigit.addChild(thirdDigit);
+ // The time may be finished now. E.g. 1:02pm, 1:25am.
+ thirdDigit.addChild(ampm);
+
+ // When the first digit is 1, the second digit is 0-2, and the third digit is 0-5,
+ // the fourth digit may be 0-9.
+ Node fourthDigit = new Node(k0, k1, k2, k3, k4, k5, k6, k7, k8, k9);
+ thirdDigit.addChild(fourthDigit);
+ // The time must be finished now. E.g. 10:49am, 12:40pm.
+ fourthDigit.addChild(ampm);
+
+ // When the first digit is 1, and the second digit is 0-2, the third digit may be 6-9.
+ thirdDigit = new Node(k6, k7, k8, k9);
+ secondDigit.addChild(thirdDigit);
+ // The time must be finished now. E.g. 1:08am, 1:26pm.
+ thirdDigit.addChild(ampm);
+
+ // When the first digit is 1, the second digit may be 3-5.
+ secondDigit = new Node(k3, k4, k5);
+ firstDigit.addChild(secondDigit);
+
+ // When the first digit is 1, and the second digit is 3-5, the third digit may be 0-9.
+ thirdDigit = new Node(k0, k1, k2, k3, k4, k5, k6, k7, k8, k9);
+ secondDigit.addChild(thirdDigit);
+ // The time must be finished now. E.g. 1:39am, 1:50pm.
+ thirdDigit.addChild(ampm);
+
+ // The hour digit may be 2-9.
+ firstDigit = new Node(k2, k3, k4, k5, k6, k7, k8, k9);
+ mLegalTimesTree.addChild(firstDigit);
+ // We'll allow quick input of on-the-hour-times. E.g. 2am, 5pm.
+ firstDigit.addChild(ampm);
+
+ // When the first digit is 2-9, the second digit may be 0-5.
+ secondDigit = new Node(k0, k1, k2, k3, k4, k5);
+ firstDigit.addChild(secondDigit);
+
+ // When the first digit is 2-9, and the second digit is 0-5, the third digit may be 0-9.
+ thirdDigit = new Node(k0, k1, k2, k3, k4, k5, k6, k7, k8, k9);
+ secondDigit.addChild(thirdDigit);
+ // The time must be finished now. E.g. 2:57am, 9:30pm.
+ thirdDigit.addChild(ampm);
+ }
+ }
+
+ /**
+ * Simple node class to be used for traversal to check for legal times.
+ * mLegalKeys represents the keys that can be typed to get to the node.
+ * mChildren are the children that can be reached from this node.
+ */
+ private class Node {
+ private int[] mLegalKeys;
+ private ArrayList<Node> mChildren;
+
+ public Node(int... legalKeys) {
+ mLegalKeys = legalKeys;
+ mChildren = new ArrayList<Node>();
+ }
+
+ public void addChild(Node child) {
+ mChildren.add(child);
+ }
+
+ public boolean containsKey(int key) {
+ for (int i = 0; i < mLegalKeys.length; i++) {
+ if (mLegalKeys[i] == key) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public Node canReach(int key) {
+ if (mChildren == null) {
+ return null;
+ }
+ for (Node child : mChildren) {
+ if (child.containsKey(key)) {
+ return child;
+ }
+ }
+ return null;
+ }
+ }
+
+ private final View.OnClickListener mClickListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+
+ final int amOrPm;
+ switch (v.getId()) {
+ case R.id.am_label:
+ setAmOrPm(AM);
+ break;
+ case R.id.pm_label:
+ setAmOrPm(PM);
+ break;
+ case R.id.hours:
+ setCurrentItemShowing(HOUR_INDEX, true, true);
+ break;
+ case R.id.minutes:
+ setCurrentItemShowing(MINUTE_INDEX, true, true);
+ break;
+ default:
+ // Failed to handle this click, don't vibrate.
+ return;
+ }
+
+ tryVibrate();
+ }
+ };
+
+ private final View.OnKeyListener mKeyListener = new View.OnKeyListener() {
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ if (event.getAction() == KeyEvent.ACTION_UP) {
+ return processKeyUp(keyCode);
+ }
+ return false;
+ }
+ };
+
+ private final View.OnFocusChangeListener mFocusListener = new View.OnFocusChangeListener() {
+ @Override
+ public void onFocusChange(View v, boolean hasFocus) {
+ if (!hasFocus && mInKbMode && isTypedTimeFullyLegal()) {
+ finishKbMode();
+
+ if (mOnTimeChangedListener != null) {
+ mOnTimeChangedListener.onTimeChanged(mDelegator,
+ mRadialTimePickerView.getCurrentHour(),
+ mRadialTimePickerView.getCurrentMinute());
+ }
+ }
+ }
+ };
}
diff --git a/core/java/android/widget/TimePickerSpinnerDelegate.java b/core/java/android/widget/TimePickerSpinnerDelegate.java
index e4342b1..e162f4a 100644
--- a/core/java/android/widget/TimePickerSpinnerDelegate.java
+++ b/core/java/android/widget/TimePickerSpinnerDelegate.java
@@ -17,372 +17,365 @@
package android.widget;
import android.content.Context;
-import android.content.res.ColorStateList;
import android.content.res.Configuration;
-import android.content.res.Resources;
import android.content.res.TypedArray;
import android.os.Parcel;
import android.os.Parcelable;
-import android.text.TextUtils;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.util.AttributeSet;
-import android.util.Log;
-import android.util.TypedValue;
-import android.view.HapticFeedbackConstants;
-import android.view.KeyCharacterMap;
-import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
-
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
import com.android.internal.R;
-import java.util.ArrayList;
+import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.Locale;
+import libcore.icu.LocaleData;
+
+import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
+import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES;
+
/**
- * A delegate implementing the radial clock-based TimePicker.
+ * A delegate implementing the basic spinner-based TimePicker.
*/
-class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate implements
- RadialTimePickerView.OnValueSelectedListener {
-
- private static final String TAG = "TimePickerDelegate";
-
- // Index used by RadialPickerLayout
- private static final int HOUR_INDEX = 0;
- private static final int MINUTE_INDEX = 1;
-
- // NOT a real index for the purpose of what's showing.
- private static final int AMPM_INDEX = 2;
-
- // Also NOT a real index, just used for keyboard mode.
- private static final int ENABLE_PICKER_INDEX = 3;
-
- static final int AM = 0;
- static final int PM = 1;
-
+class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate {
private static final boolean DEFAULT_ENABLED_STATE = true;
- private boolean mIsEnabled = DEFAULT_ENABLED_STATE;
-
private static final int HOURS_IN_HALF_DAY = 12;
- private final View mHeaderView;
- private final TextView mHourView;
- private final TextView mMinuteView;
- private final View mAmPmLayout;
- private final CheckedTextView mAmLabel;
- private final CheckedTextView mPmLabel;
- private final RadialTimePickerView mRadialTimePickerView;
- private final TextView mSeparatorView;
-
- private final String mAmText;
- private final String mPmText;
-
- private final float mDisabledAlpha;
-
- private boolean mAllowAutoAdvance;
- private int mInitialHourOfDay;
- private int mInitialMinute;
+ // state
private boolean mIs24HourView;
+ private boolean mIsAm;
- // For hardware IME input.
- private char mPlaceholderText;
- private String mDoublePlaceholderText;
- private String mDeletedKeyFormat;
- private boolean mInKbMode;
- private ArrayList<Integer> mTypedTimes = new ArrayList<Integer>();
- private Node mLegalTimesTree;
- private int mAmKeyCode;
- private int mPmKeyCode;
+ // ui components
+ private final NumberPicker mHourSpinner;
+ private final NumberPicker mMinuteSpinner;
+ private final NumberPicker mAmPmSpinner;
+ private final EditText mHourSpinnerInput;
+ private final EditText mMinuteSpinnerInput;
+ private final EditText mAmPmSpinnerInput;
+ private final TextView mDivider;
- // Accessibility strings.
- private String mHourPickerDescription;
- private String mSelectHours;
- private String mMinutePickerDescription;
- private String mSelectMinutes;
+ // Note that the legacy implementation of the TimePicker is
+ // using a button for toggling between AM/PM while the new
+ // version uses a NumberPicker spinner. Therefore the code
+ // accommodates these two cases to be backwards compatible.
+ private final Button mAmPmButton;
+ private final String[] mAmPmStrings;
+
+ private boolean mIsEnabled = DEFAULT_ENABLED_STATE;
private Calendar mTempCalendar;
+ private boolean mHourWithTwoDigit;
+ private char mHourFormat;
public TimePickerSpinnerDelegate(TimePicker delegator, Context context, AttributeSet attrs,
int defStyleAttr, int defStyleRes) {
super(delegator, context);
// process style attributes
- final TypedArray a = mContext.obtainStyledAttributes(attrs,
- R.styleable.TimePicker, defStyleAttr, defStyleRes);
- final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
- final Resources res = mContext.getResources();
-
- mHourPickerDescription = res.getString(R.string.hour_picker_description);
- mSelectHours = res.getString(R.string.select_hours);
- mMinutePickerDescription = res.getString(R.string.minute_picker_description);
- mSelectMinutes = res.getString(R.string.select_minutes);
-
- String[] amPmStrings = TimePickerClockDelegate.getAmPmStrings(context);
- mAmText = amPmStrings[0];
- mPmText = amPmStrings[1];
-
- final int layoutResourceId = a.getResourceId(R.styleable.TimePicker_internalLayout,
- R.layout.time_picker_holo);
- final View mainView = inflater.inflate(layoutResourceId, delegator);
-
- mHeaderView = mainView.findViewById(R.id.time_header);
- mHeaderView.setBackground(a.getDrawable(R.styleable.TimePicker_headerBackground));
-
- // Set up hour/minute labels.
- mHourView = (TextView) mHeaderView.findViewById(R.id.hours);
- mHourView.setOnClickListener(mClickListener);
- mSeparatorView = (TextView) mHeaderView.findViewById(R.id.separator);
- mMinuteView = (TextView) mHeaderView.findViewById(R.id.minutes);
- mMinuteView.setOnClickListener(mClickListener);
-
- final int headerTimeTextAppearance = a.getResourceId(
- R.styleable.TimePicker_headerTimeTextAppearance, 0);
- if (headerTimeTextAppearance != 0) {
- mHourView.setTextAppearance(context, headerTimeTextAppearance);
- mSeparatorView.setTextAppearance(context, headerTimeTextAppearance);
- mMinuteView.setTextAppearance(context, headerTimeTextAppearance);
- }
-
- // TODO: This can be removed once we support themed color state lists.
- final int headerSelectedTextColor = a.getColor(
- R.styleable.TimePicker_headerSelectedTextColor,
- res.getColor(R.color.timepicker_default_selector_color_material));
- mHourView.setTextColor(ColorStateList.addFirstIfMissing(mHourView.getTextColors(),
- R.attr.state_selected, headerSelectedTextColor));
- mMinuteView.setTextColor(ColorStateList.addFirstIfMissing(mMinuteView.getTextColors(),
- R.attr.state_selected, headerSelectedTextColor));
-
- // Set up AM/PM labels.
- mAmPmLayout = mHeaderView.findViewById(R.id.ampm_layout);
- mAmLabel = (CheckedTextView) mAmPmLayout.findViewById(R.id.am_label);
- mAmLabel.setText(amPmStrings[0]);
- mAmLabel.setOnClickListener(mClickListener);
- mPmLabel = (CheckedTextView) mAmPmLayout.findViewById(R.id.pm_label);
- mPmLabel.setText(amPmStrings[1]);
- mPmLabel.setOnClickListener(mClickListener);
-
- final int headerAmPmTextAppearance = a.getResourceId(
- R.styleable.TimePicker_headerAmPmTextAppearance, 0);
- if (headerAmPmTextAppearance != 0) {
- mAmLabel.setTextAppearance(context, headerAmPmTextAppearance);
- mPmLabel.setTextAppearance(context, headerAmPmTextAppearance);
- }
-
+ final TypedArray a = mContext.obtainStyledAttributes(
+ attrs, R.styleable.TimePicker, defStyleAttr, defStyleRes);
+ final int layoutResourceId = a.getResourceId(
+ R.styleable.TimePicker_legacyLayout, R.layout.time_picker_legacy);
a.recycle();
- // Pull disabled alpha from theme.
- final TypedValue outValue = new TypedValue();
- context.getTheme().resolveAttribute(android.R.attr.disabledAlpha, outValue, true);
- mDisabledAlpha = outValue.getFloat();
+ final LayoutInflater inflater = LayoutInflater.from(mContext);
+ inflater.inflate(layoutResourceId, mDelegator, true);
- mRadialTimePickerView = (RadialTimePickerView) mainView.findViewById(
- R.id.radial_picker);
+ // hour
+ mHourSpinner = (NumberPicker) delegator.findViewById(R.id.hour);
+ mHourSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
+ public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
+ updateInputState();
+ if (!is24HourView()) {
+ if ((oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) ||
+ (oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1)) {
+ mIsAm = !mIsAm;
+ updateAmPmControl();
+ }
+ }
+ onTimeChanged();
+ }
+ });
+ mHourSpinnerInput = (EditText) mHourSpinner.findViewById(R.id.numberpicker_input);
+ mHourSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
- setupListeners();
-
- mAllowAutoAdvance = true;
-
- // Set up for keyboard mode.
- mDoublePlaceholderText = res.getString(R.string.time_placeholder);
- mDeletedKeyFormat = res.getString(R.string.deleted_key);
- mPlaceholderText = mDoublePlaceholderText.charAt(0);
- mAmKeyCode = mPmKeyCode = -1;
- generateLegalTimesTree();
-
- // Initialize with current time
- final Calendar calendar = Calendar.getInstance(mCurrentLocale);
- final int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
- final int currentMinute = calendar.get(Calendar.MINUTE);
- initialize(currentHour, currentMinute, false /* 12h */, HOUR_INDEX);
- }
-
- private void initialize(int hourOfDay, int minute, boolean is24HourView, int index) {
- mInitialHourOfDay = hourOfDay;
- mInitialMinute = minute;
- mIs24HourView = is24HourView;
- mInKbMode = false;
- updateUI(index);
- }
-
- private void setupListeners() {
- mHeaderView.setOnKeyListener(mKeyListener);
- mHeaderView.setOnFocusChangeListener(mFocusListener);
- mHeaderView.setFocusable(true);
-
- mRadialTimePickerView.setOnValueSelectedListener(this);
- }
-
- private void updateUI(int index) {
- // Update RadialPicker values
- updateRadialPicker(index);
- // Enable or disable the AM/PM view.
- updateHeaderAmPm();
- // Update Hour and Minutes
- updateHeaderHour(mInitialHourOfDay, true);
- // Update time separator
- updateHeaderSeparator();
- // Update Minutes
- updateHeaderMinute(mInitialMinute);
- // Invalidate everything
- mDelegator.invalidate();
- }
-
- private void updateRadialPicker(int index) {
- mRadialTimePickerView.initialize(mInitialHourOfDay, mInitialMinute, mIs24HourView);
- setCurrentItemShowing(index, false, true);
- }
-
- private int computeMaxWidthOfNumbers(int max) {
- TextView tempView = new TextView(mContext);
- tempView.setTextAppearance(mContext, R.style.TextAppearance_Material_TimePicker_TimeLabel);
- ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
- ViewGroup.LayoutParams.WRAP_CONTENT);
- tempView.setLayoutParams(lp);
- int maxWidth = 0;
- for (int minutes = 0; minutes < max; minutes++) {
- final String text = String.format("%02d", minutes);
- tempView.setText(text);
- tempView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
- maxWidth = Math.max(maxWidth, tempView.getMeasuredWidth());
+ // divider (only for the new widget style)
+ mDivider = (TextView) mDelegator.findViewById(R.id.divider);
+ if (mDivider != null) {
+ setDividerText();
}
- return maxWidth;
- }
- private void updateHeaderAmPm() {
- if (mIs24HourView) {
- mAmPmLayout.setVisibility(View.GONE);
+ // minute
+ mMinuteSpinner = (NumberPicker) mDelegator.findViewById(R.id.minute);
+ mMinuteSpinner.setMinValue(0);
+ mMinuteSpinner.setMaxValue(59);
+ mMinuteSpinner.setOnLongPressUpdateInterval(100);
+ mMinuteSpinner.setFormatter(NumberPicker.getTwoDigitFormatter());
+ mMinuteSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
+ public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
+ updateInputState();
+ int minValue = mMinuteSpinner.getMinValue();
+ int maxValue = mMinuteSpinner.getMaxValue();
+ if (oldVal == maxValue && newVal == minValue) {
+ int newHour = mHourSpinner.getValue() + 1;
+ if (!is24HourView() && newHour == HOURS_IN_HALF_DAY) {
+ mIsAm = !mIsAm;
+ updateAmPmControl();
+ }
+ mHourSpinner.setValue(newHour);
+ } else if (oldVal == minValue && newVal == maxValue) {
+ int newHour = mHourSpinner.getValue() - 1;
+ if (!is24HourView() && newHour == HOURS_IN_HALF_DAY - 1) {
+ mIsAm = !mIsAm;
+ updateAmPmControl();
+ }
+ mHourSpinner.setValue(newHour);
+ }
+ onTimeChanged();
+ }
+ });
+ mMinuteSpinnerInput = (EditText) mMinuteSpinner.findViewById(R.id.numberpicker_input);
+ mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
+
+ // Get the localized am/pm strings and use them in the spinner.
+ mAmPmStrings = getAmPmStrings(context);
+
+ // am/pm
+ final View amPmView = mDelegator.findViewById(R.id.amPm);
+ if (amPmView instanceof Button) {
+ mAmPmSpinner = null;
+ mAmPmSpinnerInput = null;
+ mAmPmButton = (Button) amPmView;
+ mAmPmButton.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View button) {
+ button.requestFocus();
+ mIsAm = !mIsAm;
+ updateAmPmControl();
+ onTimeChanged();
+ }
+ });
} else {
- final String bestDateTimePattern = DateFormat.getBestDateTimePattern(
- mCurrentLocale, "hm");
- boolean amPmOnLeft = bestDateTimePattern.startsWith("a");
- if (TextUtils.getLayoutDirectionFromLocale(mCurrentLocale) ==
- View.LAYOUT_DIRECTION_RTL) {
- amPmOnLeft = !amPmOnLeft;
- }
-
- final ViewGroup.MarginLayoutParams params =
- (ViewGroup.MarginLayoutParams) mAmPmLayout.getLayoutParams();
-
- if (amPmOnLeft) {
- params.leftMargin = 0;
- params.rightMargin = computeMaxWidthOfNumbers(12 /* for hours */);
- } else {
- params.leftMargin = computeMaxWidthOfNumbers(60 /* for minutes */);
- params.rightMargin = 0;
- }
-
- mAmPmLayout.setLayoutParams(params);
- mAmPmLayout.setVisibility(View.VISIBLE);
-
- updateAmPmLabelStates(mInitialHourOfDay < 12 ? AM : PM);
+ mAmPmButton = null;
+ mAmPmSpinner = (NumberPicker) amPmView;
+ mAmPmSpinner.setMinValue(0);
+ mAmPmSpinner.setMaxValue(1);
+ mAmPmSpinner.setDisplayedValues(mAmPmStrings);
+ mAmPmSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
+ public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
+ updateInputState();
+ picker.requestFocus();
+ mIsAm = !mIsAm;
+ updateAmPmControl();
+ onTimeChanged();
+ }
+ });
+ mAmPmSpinnerInput = (EditText) mAmPmSpinner.findViewById(R.id.numberpicker_input);
+ mAmPmSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_DONE);
}
+
+ if (isAmPmAtStart()) {
+ // Move the am/pm view to the beginning
+ ViewGroup amPmParent = (ViewGroup) delegator.findViewById(R.id.timePickerLayout);
+ amPmParent.removeView(amPmView);
+ amPmParent.addView(amPmView, 0);
+ // Swap layout margins if needed. They may be not symmetrical (Old Standard Theme
+ // for example and not for Holo Theme)
+ ViewGroup.MarginLayoutParams lp =
+ (ViewGroup.MarginLayoutParams) amPmView.getLayoutParams();
+ final int startMargin = lp.getMarginStart();
+ final int endMargin = lp.getMarginEnd();
+ if (startMargin != endMargin) {
+ lp.setMarginStart(endMargin);
+ lp.setMarginEnd(startMargin);
+ }
+ }
+
+ getHourFormatData();
+
+ // update controls to initial state
+ updateHourControl();
+ updateMinuteControl();
+ updateAmPmControl();
+
+ // set to current time
+ setCurrentHour(mTempCalendar.get(Calendar.HOUR_OF_DAY));
+ setCurrentMinute(mTempCalendar.get(Calendar.MINUTE));
+
+ if (!isEnabled()) {
+ setEnabled(false);
+ }
+
+ // set the content descriptions
+ setContentDescriptions();
+
+ // If not explicitly specified this view is important for accessibility.
+ if (mDelegator.getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+ mDelegator.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
+ }
+ }
+
+ private void getHourFormatData() {
+ final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale,
+ (mIs24HourView) ? "Hm" : "hm");
+ final int lengthPattern = bestDateTimePattern.length();
+ mHourWithTwoDigit = false;
+ char hourFormat = '\0';
+ // Check if the returned pattern is single or double 'H', 'h', 'K', 'k'. We also save
+ // the hour format that we found.
+ for (int i = 0; i < lengthPattern; i++) {
+ final char c = bestDateTimePattern.charAt(i);
+ if (c == 'H' || c == 'h' || c == 'K' || c == 'k') {
+ mHourFormat = c;
+ if (i + 1 < lengthPattern && c == bestDateTimePattern.charAt(i + 1)) {
+ mHourWithTwoDigit = true;
+ }
+ break;
+ }
+ }
+ }
+
+ private boolean isAmPmAtStart() {
+ final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale,
+ "hm" /* skeleton */);
+
+ return bestDateTimePattern.startsWith("a");
}
/**
- * Set the current hour.
+ * The time separator is defined in the Unicode CLDR and cannot be supposed to be ":".
+ *
+ * See http://unicode.org/cldr/trac/browser/trunk/common/main
+ *
+ * We pass the correct "skeleton" depending on 12 or 24 hours view and then extract the
+ * separator as the character which is just after the hour marker in the returned pattern.
*/
+ private void setDividerText() {
+ final String skeleton = (mIs24HourView) ? "Hm" : "hm";
+ final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale,
+ skeleton);
+ final String separatorText;
+ int hourIndex = bestDateTimePattern.lastIndexOf('H');
+ if (hourIndex == -1) {
+ hourIndex = bestDateTimePattern.lastIndexOf('h');
+ }
+ if (hourIndex == -1) {
+ // Default case
+ separatorText = ":";
+ } else {
+ int minuteIndex = bestDateTimePattern.indexOf('m', hourIndex + 1);
+ if (minuteIndex == -1) {
+ separatorText = Character.toString(bestDateTimePattern.charAt(hourIndex + 1));
+ } else {
+ separatorText = bestDateTimePattern.substring(hourIndex + 1, minuteIndex);
+ }
+ }
+ mDivider.setText(separatorText);
+ }
+
@Override
public void setCurrentHour(Integer currentHour) {
- if (mInitialHourOfDay == currentHour) {
- return;
- }
- mInitialHourOfDay = currentHour;
- updateHeaderHour(currentHour, true /* accessibility announce */);
- updateHeaderAmPm();
- mRadialTimePickerView.setCurrentHour(currentHour);
- mRadialTimePickerView.setAmOrPm(mInitialHourOfDay < 12 ? AM : PM);
- mDelegator.invalidate();
- onTimeChanged();
+ setCurrentHour(currentHour, true);
}
- /**
- * @return The current hour in the range (0-23).
- */
+ private void setCurrentHour(Integer currentHour, boolean notifyTimeChanged) {
+ // why was Integer used in the first place?
+ if (currentHour == null || currentHour == getCurrentHour()) {
+ return;
+ }
+ if (!is24HourView()) {
+ // convert [0,23] ordinal to wall clock display
+ if (currentHour >= HOURS_IN_HALF_DAY) {
+ mIsAm = false;
+ if (currentHour > HOURS_IN_HALF_DAY) {
+ currentHour = currentHour - HOURS_IN_HALF_DAY;
+ }
+ } else {
+ mIsAm = true;
+ if (currentHour == 0) {
+ currentHour = HOURS_IN_HALF_DAY;
+ }
+ }
+ updateAmPmControl();
+ }
+ mHourSpinner.setValue(currentHour);
+ if (notifyTimeChanged) {
+ onTimeChanged();
+ }
+ }
+
@Override
public Integer getCurrentHour() {
- int currentHour = mRadialTimePickerView.getCurrentHour();
- if (mIs24HourView) {
+ int currentHour = mHourSpinner.getValue();
+ if (is24HourView()) {
return currentHour;
+ } else if (mIsAm) {
+ return currentHour % HOURS_IN_HALF_DAY;
} else {
- switch(mRadialTimePickerView.getAmOrPm()) {
- case PM:
- return (currentHour % HOURS_IN_HALF_DAY) + HOURS_IN_HALF_DAY;
- case AM:
- default:
- return currentHour % HOURS_IN_HALF_DAY;
- }
+ return (currentHour % HOURS_IN_HALF_DAY) + HOURS_IN_HALF_DAY;
}
}
- /**
- * Set the current minute (0-59).
- */
@Override
public void setCurrentMinute(Integer currentMinute) {
- if (mInitialMinute == currentMinute) {
+ if (currentMinute == getCurrentMinute()) {
return;
}
- mInitialMinute = currentMinute;
- updateHeaderMinute(currentMinute);
- mRadialTimePickerView.setCurrentMinute(currentMinute);
- mDelegator.invalidate();
+ mMinuteSpinner.setValue(currentMinute);
onTimeChanged();
}
- /**
- * @return The current minute.
- */
@Override
public Integer getCurrentMinute() {
- return mRadialTimePickerView.getCurrentMinute();
+ return mMinuteSpinner.getValue();
}
- /**
- * Set whether in 24 hour or AM/PM mode.
- *
- * @param is24HourView True = 24 hour mode. False = AM/PM.
- */
@Override
public void setIs24HourView(Boolean is24HourView) {
- if (is24HourView == mIs24HourView) {
+ if (mIs24HourView == is24HourView) {
return;
}
+ // cache the current hour since spinner range changes and BEFORE changing mIs24HourView!!
+ int currentHour = getCurrentHour();
+ // Order is important here.
mIs24HourView = is24HourView;
- generateLegalTimesTree();
- int hour = mRadialTimePickerView.getCurrentHour();
- mInitialHourOfDay = hour;
- updateHeaderHour(hour, false /* no accessibility announce */);
- updateHeaderAmPm();
- updateRadialPicker(mRadialTimePickerView.getCurrentItemShowing());
- mDelegator.invalidate();
+ getHourFormatData();
+ updateHourControl();
+ // set value after spinner range is updated
+ setCurrentHour(currentHour, false);
+ updateMinuteControl();
+ updateAmPmControl();
}
- /**
- * @return true if this is in 24 hour view else false.
- */
@Override
public boolean is24HourView() {
return mIs24HourView;
}
@Override
- public void setOnTimeChangedListener(TimePicker.OnTimeChangedListener callback) {
- mOnTimeChangedListener = callback;
+ public void setOnTimeChangedListener(TimePicker.OnTimeChangedListener onTimeChangedListener) {
+ mOnTimeChangedListener = onTimeChangedListener;
}
@Override
public void setEnabled(boolean enabled) {
- mHourView.setEnabled(enabled);
- mMinuteView.setEnabled(enabled);
- mAmLabel.setEnabled(enabled);
- mPmLabel.setEnabled(enabled);
- mRadialTimePickerView.setEnabled(enabled);
+ mMinuteSpinner.setEnabled(enabled);
+ if (mDivider != null) {
+ mDivider.setEnabled(enabled);
+ }
+ mHourSpinner.setEnabled(enabled);
+ if (mAmPmSpinner != null) {
+ mAmPmSpinner.setEnabled(enabled);
+ } else {
+ mAmPmButton.setEnabled(enabled);
+ }
mIsEnabled = enabled;
}
@@ -393,38 +386,24 @@
@Override
public int getBaseline() {
- // does not support baseline alignment
- return -1;
+ return mHourSpinner.getBaseline();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
- updateUI(mRadialTimePickerView.getCurrentItemShowing());
+ setCurrentLocale(newConfig.locale);
}
@Override
public Parcelable onSaveInstanceState(Parcelable superState) {
- return new SavedState(superState, getCurrentHour(), getCurrentMinute(),
- is24HourView(), inKbMode(), getTypedTimes(), getCurrentItemShowing());
+ return new SavedState(superState, getCurrentHour(), getCurrentMinute());
}
@Override
public void onRestoreInstanceState(Parcelable state) {
SavedState ss = (SavedState) state;
- setInKbMode(ss.inKbMode());
- setTypedTimes(ss.getTypesTimes());
- initialize(ss.getHour(), ss.getMinute(), ss.is24HourMode(), ss.getCurrentItemShowing());
- mRadialTimePickerView.invalidate();
- if (mInKbMode) {
- tryStartingKbMode(-1);
- mHourView.invalidate();
- }
- }
-
- @Override
- public void setCurrentLocale(Locale locale) {
- super.setCurrentLocale(locale);
- mTempCalendar = Calendar.getInstance(locale);
+ setCurrentHour(ss.getHour());
+ setCurrentMinute(ss.getMinute());
}
@Override
@@ -443,9 +422,9 @@
}
mTempCalendar.set(Calendar.HOUR_OF_DAY, getCurrentHour());
mTempCalendar.set(Calendar.MINUTE, getCurrentMinute());
- String selectedDate = DateUtils.formatDateTime(mContext,
+ String selectedDateUtterance = DateUtils.formatDateTime(mContext,
mTempCalendar.getTimeInMillis(), flags);
- event.getText().add(selectedDate);
+ event.getText().add(selectedDateUtterance);
}
@Override
@@ -458,48 +437,121 @@
info.setClassName(TimePicker.class.getName());
}
+ private void updateInputState() {
+ // Make sure that if the user changes the value and the IME is active
+ // for one of the inputs if this widget, the IME is closed. If the user
+ // changed the value via the IME and there is a next input the IME will
+ // be shown, otherwise the user chose another means of changing the
+ // value and having the IME up makes no sense.
+ InputMethodManager inputMethodManager = InputMethodManager.peekInstance();
+ if (inputMethodManager != null) {
+ if (inputMethodManager.isActive(mHourSpinnerInput)) {
+ mHourSpinnerInput.clearFocus();
+ inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0);
+ } else if (inputMethodManager.isActive(mMinuteSpinnerInput)) {
+ mMinuteSpinnerInput.clearFocus();
+ inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0);
+ } else if (inputMethodManager.isActive(mAmPmSpinnerInput)) {
+ mAmPmSpinnerInput.clearFocus();
+ inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0);
+ }
+ }
+ }
+
+ private void updateAmPmControl() {
+ if (is24HourView()) {
+ if (mAmPmSpinner != null) {
+ mAmPmSpinner.setVisibility(View.GONE);
+ } else {
+ mAmPmButton.setVisibility(View.GONE);
+ }
+ } else {
+ int index = mIsAm ? Calendar.AM : Calendar.PM;
+ if (mAmPmSpinner != null) {
+ mAmPmSpinner.setValue(index);
+ mAmPmSpinner.setVisibility(View.VISIBLE);
+ } else {
+ mAmPmButton.setText(mAmPmStrings[index]);
+ mAmPmButton.setVisibility(View.VISIBLE);
+ }
+ }
+ mDelegator.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
+ }
+
/**
- * Set whether in keyboard mode or not.
+ * Sets the current locale.
*
- * @param inKbMode True means in keyboard mode.
+ * @param locale The current locale.
*/
- private void setInKbMode(boolean inKbMode) {
- mInKbMode = inKbMode;
+ @Override
+ public void setCurrentLocale(Locale locale) {
+ super.setCurrentLocale(locale);
+ mTempCalendar = Calendar.getInstance(locale);
}
- /**
- * @return true if in keyboard mode
- */
- private boolean inKbMode() {
- return mInKbMode;
- }
-
- private void setTypedTimes(ArrayList<Integer> typeTimes) {
- mTypedTimes = typeTimes;
- }
-
- /**
- * @return an array of typed times
- */
- private ArrayList<Integer> getTypedTimes() {
- return mTypedTimes;
- }
-
- /**
- * @return the index of the current item showing
- */
- private int getCurrentItemShowing() {
- return mRadialTimePickerView.getCurrentItemShowing();
- }
-
- /**
- * Propagate the time change
- */
private void onTimeChanged() {
mDelegator.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
if (mOnTimeChangedListener != null) {
- mOnTimeChangedListener.onTimeChanged(mDelegator,
- getCurrentHour(), getCurrentMinute());
+ mOnTimeChangedListener.onTimeChanged(mDelegator, getCurrentHour(),
+ getCurrentMinute());
+ }
+ }
+
+ private void updateHourControl() {
+ if (is24HourView()) {
+ // 'k' means 1-24 hour
+ if (mHourFormat == 'k') {
+ mHourSpinner.setMinValue(1);
+ mHourSpinner.setMaxValue(24);
+ } else {
+ mHourSpinner.setMinValue(0);
+ mHourSpinner.setMaxValue(23);
+ }
+ } else {
+ // 'K' means 0-11 hour
+ if (mHourFormat == 'K') {
+ mHourSpinner.setMinValue(0);
+ mHourSpinner.setMaxValue(11);
+ } else {
+ mHourSpinner.setMinValue(1);
+ mHourSpinner.setMaxValue(12);
+ }
+ }
+ mHourSpinner.setFormatter(mHourWithTwoDigit ? NumberPicker.getTwoDigitFormatter() : null);
+ }
+
+ private void updateMinuteControl() {
+ if (is24HourView()) {
+ mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_DONE);
+ } else {
+ mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
+ }
+ }
+
+ private void setContentDescriptions() {
+ // Minute
+ trySetContentDescription(mMinuteSpinner, R.id.increment,
+ R.string.time_picker_increment_minute_button);
+ trySetContentDescription(mMinuteSpinner, R.id.decrement,
+ R.string.time_picker_decrement_minute_button);
+ // Hour
+ trySetContentDescription(mHourSpinner, R.id.increment,
+ R.string.time_picker_increment_hour_button);
+ trySetContentDescription(mHourSpinner, R.id.decrement,
+ R.string.time_picker_decrement_hour_button);
+ // AM/PM
+ if (mAmPmSpinner != null) {
+ trySetContentDescription(mAmPmSpinner, R.id.increment,
+ R.string.time_picker_increment_set_pm_button);
+ trySetContentDescription(mAmPmSpinner, R.id.decrement,
+ R.string.time_picker_decrement_set_am_button);
+ }
+ }
+
+ private void trySetContentDescription(View root, int viewId, int contDescResId) {
+ View target = root.findViewById(viewId);
+ if (target != null) {
+ target.setContentDescription(mContext.getString(contDescResId));
}
}
@@ -507,34 +559,19 @@
* Used to save / restore state of time picker
*/
private static class SavedState extends View.BaseSavedState {
-
private final int mHour;
private final int mMinute;
- private final boolean mIs24HourMode;
- private final boolean mInKbMode;
- private final ArrayList<Integer> mTypedTimes;
- private final int mCurrentItemShowing;
- private SavedState(Parcelable superState, int hour, int minute, boolean is24HourMode,
- boolean isKbMode, ArrayList<Integer> typedTimes,
- int currentItemShowing) {
+ private SavedState(Parcelable superState, int hour, int minute) {
super(superState);
mHour = hour;
mMinute = minute;
- mIs24HourMode = is24HourMode;
- mInKbMode = isKbMode;
- mTypedTimes = typedTimes;
- mCurrentItemShowing = currentItemShowing;
}
private SavedState(Parcel in) {
super(in);
mHour = in.readInt();
mMinute = in.readInt();
- mIs24HourMode = (in.readInt() == 1);
- mInKbMode = (in.readInt() == 1);
- mTypedTimes = in.readArrayList(getClass().getClassLoader());
- mCurrentItemShowing = in.readInt();
}
public int getHour() {
@@ -545,31 +582,11 @@
return mMinute;
}
- public boolean is24HourMode() {
- return mIs24HourMode;
- }
-
- public boolean inKbMode() {
- return mInKbMode;
- }
-
- public ArrayList<Integer> getTypesTimes() {
- return mTypedTimes;
- }
-
- public int getCurrentItemShowing() {
- return mCurrentItemShowing;
- }
-
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(mHour);
dest.writeInt(mMinute);
- dest.writeInt(mIs24HourMode ? 1 : 0);
- dest.writeInt(mInKbMode ? 1 : 0);
- dest.writeList(mTypedTimes);
- dest.writeInt(mCurrentItemShowing);
}
@SuppressWarnings({"unused", "hiding"})
@@ -584,697 +601,11 @@
};
}
- private void tryVibrate() {
- mDelegator.performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK);
+ public static String[] getAmPmStrings(Context context) {
+ String[] result = new String[2];
+ LocaleData d = LocaleData.get(context.getResources().getConfiguration().locale);
+ result[0] = d.amPm[0].length() > 2 ? d.narrowAm : d.amPm[0];
+ result[1] = d.amPm[1].length() > 2 ? d.narrowPm : d.amPm[1];
+ return result;
}
-
- private void updateAmPmLabelStates(int amOrPm) {
- final boolean isAm = amOrPm == AM;
- mAmLabel.setChecked(isAm);
- mAmLabel.setAlpha(isAm ? 1 : mDisabledAlpha);
-
- final boolean isPm = amOrPm == PM;
- mPmLabel.setChecked(isPm);
- mPmLabel.setAlpha(isPm ? 1 : mDisabledAlpha);
- }
-
- /**
- * Called by the picker for updating the header display.
- */
- @Override
- public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) {
- if (pickerIndex == HOUR_INDEX) {
- updateHeaderHour(newValue, false);
- String announcement = String.format("%d", newValue);
- if (mAllowAutoAdvance && autoAdvance) {
- setCurrentItemShowing(MINUTE_INDEX, true, false);
- announcement += ". " + mSelectMinutes;
- } else {
- mRadialTimePickerView.setContentDescription(
- mHourPickerDescription + ": " + newValue);
- }
-
- mRadialTimePickerView.announceForAccessibility(announcement);
- } else if (pickerIndex == MINUTE_INDEX){
- updateHeaderMinute(newValue);
- mRadialTimePickerView.setContentDescription(mMinutePickerDescription + ": " + newValue);
- } else if (pickerIndex == AMPM_INDEX) {
- updateAmPmLabelStates(newValue);
- } else if (pickerIndex == ENABLE_PICKER_INDEX) {
- if (!isTypedTimeFullyLegal()) {
- mTypedTimes.clear();
- }
- finishKbMode();
- }
- }
-
- private void updateHeaderHour(int value, boolean announce) {
- final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale,
- (mIs24HourView) ? "Hm" : "hm");
- final int lengthPattern = bestDateTimePattern.length();
- boolean hourWithTwoDigit = false;
- char hourFormat = '\0';
- // Check if the returned pattern is single or double 'H', 'h', 'K', 'k'. We also save
- // the hour format that we found.
- for (int i = 0; i < lengthPattern; i++) {
- final char c = bestDateTimePattern.charAt(i);
- if (c == 'H' || c == 'h' || c == 'K' || c == 'k') {
- hourFormat = c;
- if (i + 1 < lengthPattern && c == bestDateTimePattern.charAt(i + 1)) {
- hourWithTwoDigit = true;
- }
- break;
- }
- }
- final String format;
- if (hourWithTwoDigit) {
- format = "%02d";
- } else {
- format = "%d";
- }
- if (mIs24HourView) {
- // 'k' means 1-24 hour
- if (hourFormat == 'k' && value == 0) {
- value = 24;
- }
- } else {
- // 'K' means 0-11 hour
- value = modulo12(value, hourFormat == 'K');
- }
- CharSequence text = String.format(format, value);
- mHourView.setText(text);
- if (announce) {
- mRadialTimePickerView.announceForAccessibility(text);
- }
- }
-
- private static int modulo12(int n, boolean startWithZero) {
- int value = n % 12;
- if (value == 0 && !startWithZero) {
- value = 12;
- }
- return value;
- }
-
- /**
- * The time separator is defined in the Unicode CLDR and cannot be supposed to be ":".
- *
- * See http://unicode.org/cldr/trac/browser/trunk/common/main
- *
- * We pass the correct "skeleton" depending on 12 or 24 hours view and then extract the
- * separator as the character which is just after the hour marker in the returned pattern.
- */
- private void updateHeaderSeparator() {
- final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale,
- (mIs24HourView) ? "Hm" : "hm");
- final String separatorText;
- // See http://www.unicode.org/reports/tr35/tr35-dates.html for hour formats
- final char[] hourFormats = {'H', 'h', 'K', 'k'};
- int hIndex = lastIndexOfAny(bestDateTimePattern, hourFormats);
- if (hIndex == -1) {
- // Default case
- separatorText = ":";
- } else {
- separatorText = Character.toString(bestDateTimePattern.charAt(hIndex + 1));
- }
- mSeparatorView.setText(separatorText);
- }
-
- static private int lastIndexOfAny(String str, char[] any) {
- final int lengthAny = any.length;
- if (lengthAny > 0) {
- for (int i = str.length() - 1; i >= 0; i--) {
- char c = str.charAt(i);
- for (int j = 0; j < lengthAny; j++) {
- if (c == any[j]) {
- return i;
- }
- }
- }
- }
- return -1;
- }
-
- private void updateHeaderMinute(int value) {
- if (value == 60) {
- value = 0;
- }
- CharSequence text = String.format(mCurrentLocale, "%02d", value);
- mRadialTimePickerView.announceForAccessibility(text);
- mMinuteView.setText(text);
- }
-
- /**
- * Show either Hours or Minutes.
- */
- private void setCurrentItemShowing(int index, boolean animateCircle, boolean announce) {
- mRadialTimePickerView.setCurrentItemShowing(index, animateCircle);
-
- if (index == HOUR_INDEX) {
- int hours = mRadialTimePickerView.getCurrentHour();
- if (!mIs24HourView) {
- hours = hours % 12;
- }
- mRadialTimePickerView.setContentDescription(mHourPickerDescription + ": " + hours);
- if (announce) {
- mRadialTimePickerView.announceForAccessibility(mSelectHours);
- }
- } else {
- int minutes = mRadialTimePickerView.getCurrentMinute();
- mRadialTimePickerView.setContentDescription(mMinutePickerDescription + ": " + minutes);
- if (announce) {
- mRadialTimePickerView.announceForAccessibility(mSelectMinutes);
- }
- }
-
- mHourView.setSelected(index == HOUR_INDEX);
- mMinuteView.setSelected(index == MINUTE_INDEX);
- }
-
- private void setAmOrPm(int amOrPm) {
- updateAmPmLabelStates(amOrPm);
- mRadialTimePickerView.setAmOrPm(amOrPm);
- }
-
- /**
- * For keyboard mode, processes key events.
- *
- * @param keyCode the pressed key.
- *
- * @return true if the key was successfully processed, false otherwise.
- */
- private boolean processKeyUp(int keyCode) {
- if (keyCode == KeyEvent.KEYCODE_DEL) {
- if (mInKbMode) {
- if (!mTypedTimes.isEmpty()) {
- int deleted = deleteLastTypedKey();
- String deletedKeyStr;
- if (deleted == getAmOrPmKeyCode(AM)) {
- deletedKeyStr = mAmText;
- } else if (deleted == getAmOrPmKeyCode(PM)) {
- deletedKeyStr = mPmText;
- } else {
- deletedKeyStr = String.format("%d", getValFromKeyCode(deleted));
- }
- mRadialTimePickerView.announceForAccessibility(
- String.format(mDeletedKeyFormat, deletedKeyStr));
- updateDisplay(true);
- }
- }
- } else if (keyCode == KeyEvent.KEYCODE_0 || keyCode == KeyEvent.KEYCODE_1
- || keyCode == KeyEvent.KEYCODE_2 || keyCode == KeyEvent.KEYCODE_3
- || keyCode == KeyEvent.KEYCODE_4 || keyCode == KeyEvent.KEYCODE_5
- || keyCode == KeyEvent.KEYCODE_6 || keyCode == KeyEvent.KEYCODE_7
- || keyCode == KeyEvent.KEYCODE_8 || keyCode == KeyEvent.KEYCODE_9
- || (!mIs24HourView &&
- (keyCode == getAmOrPmKeyCode(AM) || keyCode == getAmOrPmKeyCode(PM)))) {
- if (!mInKbMode) {
- if (mRadialTimePickerView == null) {
- // Something's wrong, because time picker should definitely not be null.
- Log.e(TAG, "Unable to initiate keyboard mode, TimePicker was null.");
- return true;
- }
- mTypedTimes.clear();
- tryStartingKbMode(keyCode);
- return true;
- }
- // We're already in keyboard mode.
- if (addKeyIfLegal(keyCode)) {
- updateDisplay(false);
- }
- return true;
- }
- return false;
- }
-
- /**
- * Try to start keyboard mode with the specified key.
- *
- * @param keyCode The key to use as the first press. Keyboard mode will not be started if the
- * key is not legal to start with. Or, pass in -1 to get into keyboard mode without a starting
- * key.
- */
- private void tryStartingKbMode(int keyCode) {
- if (keyCode == -1 || addKeyIfLegal(keyCode)) {
- mInKbMode = true;
- onValidationChanged(false);
- updateDisplay(false);
- mRadialTimePickerView.setInputEnabled(false);
- }
- }
-
- private boolean addKeyIfLegal(int keyCode) {
- // If we're in 24hour mode, we'll need to check if the input is full. If in AM/PM mode,
- // we'll need to see if AM/PM have been typed.
- if ((mIs24HourView && mTypedTimes.size() == 4) ||
- (!mIs24HourView && isTypedTimeFullyLegal())) {
- return false;
- }
-
- mTypedTimes.add(keyCode);
- if (!isTypedTimeLegalSoFar()) {
- deleteLastTypedKey();
- return false;
- }
-
- int val = getValFromKeyCode(keyCode);
- mRadialTimePickerView.announceForAccessibility(String.format("%d", val));
- // Automatically fill in 0's if AM or PM was legally entered.
- if (isTypedTimeFullyLegal()) {
- if (!mIs24HourView && mTypedTimes.size() <= 3) {
- mTypedTimes.add(mTypedTimes.size() - 1, KeyEvent.KEYCODE_0);
- mTypedTimes.add(mTypedTimes.size() - 1, KeyEvent.KEYCODE_0);
- }
- onValidationChanged(true);
- }
-
- return true;
- }
-
- /**
- * Traverse the tree to see if the keys that have been typed so far are legal as is,
- * or may become legal as more keys are typed (excluding backspace).
- */
- private boolean isTypedTimeLegalSoFar() {
- Node node = mLegalTimesTree;
- for (int keyCode : mTypedTimes) {
- node = node.canReach(keyCode);
- if (node == null) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Check if the time that has been typed so far is completely legal, as is.
- */
- private boolean isTypedTimeFullyLegal() {
- if (mIs24HourView) {
- // For 24-hour mode, the time is legal if the hours and minutes are each legal. Note:
- // getEnteredTime() will ONLY call isTypedTimeFullyLegal() when NOT in 24hour mode.
- int[] values = getEnteredTime(null);
- return (values[0] >= 0 && values[1] >= 0 && values[1] < 60);
- } else {
- // For AM/PM mode, the time is legal if it contains an AM or PM, as those can only be
- // legally added at specific times based on the tree's algorithm.
- return (mTypedTimes.contains(getAmOrPmKeyCode(AM)) ||
- mTypedTimes.contains(getAmOrPmKeyCode(PM)));
- }
- }
-
- private int deleteLastTypedKey() {
- int deleted = mTypedTimes.remove(mTypedTimes.size() - 1);
- if (!isTypedTimeFullyLegal()) {
- onValidationChanged(false);
- }
- return deleted;
- }
-
- /**
- * Get out of keyboard mode. If there is nothing in typedTimes, revert to TimePicker's time.
- */
- private void finishKbMode() {
- mInKbMode = false;
- if (!mTypedTimes.isEmpty()) {
- int values[] = getEnteredTime(null);
- mRadialTimePickerView.setCurrentHour(values[0]);
- mRadialTimePickerView.setCurrentMinute(values[1]);
- if (!mIs24HourView) {
- mRadialTimePickerView.setAmOrPm(values[2]);
- }
- mTypedTimes.clear();
- }
- updateDisplay(false);
- mRadialTimePickerView.setInputEnabled(true);
- }
-
- /**
- * Update the hours, minutes, and AM/PM displays with the typed times. If the typedTimes is
- * empty, either show an empty display (filled with the placeholder text), or update from the
- * timepicker's values.
- *
- * @param allowEmptyDisplay if true, then if the typedTimes is empty, use the placeholder text.
- * Otherwise, revert to the timepicker's values.
- */
- private void updateDisplay(boolean allowEmptyDisplay) {
- if (!allowEmptyDisplay && mTypedTimes.isEmpty()) {
- int hour = mRadialTimePickerView.getCurrentHour();
- int minute = mRadialTimePickerView.getCurrentMinute();
- updateHeaderHour(hour, true);
- updateHeaderMinute(minute);
- if (!mIs24HourView) {
- updateAmPmLabelStates(hour < 12 ? AM : PM);
- }
- setCurrentItemShowing(mRadialTimePickerView.getCurrentItemShowing(), true, true);
- onValidationChanged(true);
- } else {
- boolean[] enteredZeros = {false, false};
- int[] values = getEnteredTime(enteredZeros);
- String hourFormat = enteredZeros[0] ? "%02d" : "%2d";
- String minuteFormat = (enteredZeros[1]) ? "%02d" : "%2d";
- String hourStr = (values[0] == -1) ? mDoublePlaceholderText :
- String.format(hourFormat, values[0]).replace(' ', mPlaceholderText);
- String minuteStr = (values[1] == -1) ? mDoublePlaceholderText :
- String.format(minuteFormat, values[1]).replace(' ', mPlaceholderText);
- mHourView.setText(hourStr);
- mHourView.setSelected(false);
- mMinuteView.setText(minuteStr);
- mMinuteView.setSelected(false);
- if (!mIs24HourView) {
- updateAmPmLabelStates(values[2]);
- }
- }
- }
-
- private int getValFromKeyCode(int keyCode) {
- switch (keyCode) {
- case KeyEvent.KEYCODE_0:
- return 0;
- case KeyEvent.KEYCODE_1:
- return 1;
- case KeyEvent.KEYCODE_2:
- return 2;
- case KeyEvent.KEYCODE_3:
- return 3;
- case KeyEvent.KEYCODE_4:
- return 4;
- case KeyEvent.KEYCODE_5:
- return 5;
- case KeyEvent.KEYCODE_6:
- return 6;
- case KeyEvent.KEYCODE_7:
- return 7;
- case KeyEvent.KEYCODE_8:
- return 8;
- case KeyEvent.KEYCODE_9:
- return 9;
- default:
- return -1;
- }
- }
-
- /**
- * Get the currently-entered time, as integer values of the hours and minutes typed.
- *
- * @param enteredZeros A size-2 boolean array, which the caller should initialize, and which
- * may then be used for the caller to know whether zeros had been explicitly entered as either
- * hours of minutes. This is helpful for deciding whether to show the dashes, or actual 0's.
- *
- * @return A size-3 int array. The first value will be the hours, the second value will be the
- * minutes, and the third will be either AM or PM.
- */
- private int[] getEnteredTime(boolean[] enteredZeros) {
- int amOrPm = -1;
- int startIndex = 1;
- if (!mIs24HourView && isTypedTimeFullyLegal()) {
- int keyCode = mTypedTimes.get(mTypedTimes.size() - 1);
- if (keyCode == getAmOrPmKeyCode(AM)) {
- amOrPm = AM;
- } else if (keyCode == getAmOrPmKeyCode(PM)){
- amOrPm = PM;
- }
- startIndex = 2;
- }
- int minute = -1;
- int hour = -1;
- for (int i = startIndex; i <= mTypedTimes.size(); i++) {
- int val = getValFromKeyCode(mTypedTimes.get(mTypedTimes.size() - i));
- if (i == startIndex) {
- minute = val;
- } else if (i == startIndex+1) {
- minute += 10 * val;
- if (enteredZeros != null && val == 0) {
- enteredZeros[1] = true;
- }
- } else if (i == startIndex+2) {
- hour = val;
- } else if (i == startIndex+3) {
- hour += 10 * val;
- if (enteredZeros != null && val == 0) {
- enteredZeros[0] = true;
- }
- }
- }
-
- return new int[] { hour, minute, amOrPm };
- }
-
- /**
- * Get the keycode value for AM and PM in the current language.
- */
- private int getAmOrPmKeyCode(int amOrPm) {
- // Cache the codes.
- if (mAmKeyCode == -1 || mPmKeyCode == -1) {
- // Find the first character in the AM/PM text that is unique.
- KeyCharacterMap kcm = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
- char amChar;
- char pmChar;
- for (int i = 0; i < Math.max(mAmText.length(), mPmText.length()); i++) {
- amChar = mAmText.toLowerCase(mCurrentLocale).charAt(i);
- pmChar = mPmText.toLowerCase(mCurrentLocale).charAt(i);
- if (amChar != pmChar) {
- KeyEvent[] events = kcm.getEvents(new char[]{amChar, pmChar});
- // There should be 4 events: a down and up for both AM and PM.
- if (events != null && events.length == 4) {
- mAmKeyCode = events[0].getKeyCode();
- mPmKeyCode = events[2].getKeyCode();
- } else {
- Log.e(TAG, "Unable to find keycodes for AM and PM.");
- }
- break;
- }
- }
- }
- if (amOrPm == AM) {
- return mAmKeyCode;
- } else if (amOrPm == PM) {
- return mPmKeyCode;
- }
-
- return -1;
- }
-
- /**
- * Create a tree for deciding what keys can legally be typed.
- */
- private void generateLegalTimesTree() {
- // Create a quick cache of numbers to their keycodes.
- final int k0 = KeyEvent.KEYCODE_0;
- final int k1 = KeyEvent.KEYCODE_1;
- final int k2 = KeyEvent.KEYCODE_2;
- final int k3 = KeyEvent.KEYCODE_3;
- final int k4 = KeyEvent.KEYCODE_4;
- final int k5 = KeyEvent.KEYCODE_5;
- final int k6 = KeyEvent.KEYCODE_6;
- final int k7 = KeyEvent.KEYCODE_7;
- final int k8 = KeyEvent.KEYCODE_8;
- final int k9 = KeyEvent.KEYCODE_9;
-
- // The root of the tree doesn't contain any numbers.
- mLegalTimesTree = new Node();
- if (mIs24HourView) {
- // We'll be re-using these nodes, so we'll save them.
- Node minuteFirstDigit = new Node(k0, k1, k2, k3, k4, k5);
- Node minuteSecondDigit = new Node(k0, k1, k2, k3, k4, k5, k6, k7, k8, k9);
- // The first digit must be followed by the second digit.
- minuteFirstDigit.addChild(minuteSecondDigit);
-
- // The first digit may be 0-1.
- Node firstDigit = new Node(k0, k1);
- mLegalTimesTree.addChild(firstDigit);
-
- // When the first digit is 0-1, the second digit may be 0-5.
- Node secondDigit = new Node(k0, k1, k2, k3, k4, k5);
- firstDigit.addChild(secondDigit);
- // We may now be followed by the first minute digit. E.g. 00:09, 15:58.
- secondDigit.addChild(minuteFirstDigit);
-
- // When the first digit is 0-1, and the second digit is 0-5, the third digit may be 6-9.
- Node thirdDigit = new Node(k6, k7, k8, k9);
- // The time must now be finished. E.g. 0:55, 1:08.
- secondDigit.addChild(thirdDigit);
-
- // When the first digit is 0-1, the second digit may be 6-9.
- secondDigit = new Node(k6, k7, k8, k9);
- firstDigit.addChild(secondDigit);
- // We must now be followed by the first minute digit. E.g. 06:50, 18:20.
- secondDigit.addChild(minuteFirstDigit);
-
- // The first digit may be 2.
- firstDigit = new Node(k2);
- mLegalTimesTree.addChild(firstDigit);
-
- // When the first digit is 2, the second digit may be 0-3.
- secondDigit = new Node(k0, k1, k2, k3);
- firstDigit.addChild(secondDigit);
- // We must now be followed by the first minute digit. E.g. 20:50, 23:09.
- secondDigit.addChild(minuteFirstDigit);
-
- // When the first digit is 2, the second digit may be 4-5.
- secondDigit = new Node(k4, k5);
- firstDigit.addChild(secondDigit);
- // We must now be followd by the last minute digit. E.g. 2:40, 2:53.
- secondDigit.addChild(minuteSecondDigit);
-
- // The first digit may be 3-9.
- firstDigit = new Node(k3, k4, k5, k6, k7, k8, k9);
- mLegalTimesTree.addChild(firstDigit);
- // We must now be followed by the first minute digit. E.g. 3:57, 8:12.
- firstDigit.addChild(minuteFirstDigit);
- } else {
- // We'll need to use the AM/PM node a lot.
- // Set up AM and PM to respond to "a" and "p".
- Node ampm = new Node(getAmOrPmKeyCode(AM), getAmOrPmKeyCode(PM));
-
- // The first hour digit may be 1.
- Node firstDigit = new Node(k1);
- mLegalTimesTree.addChild(firstDigit);
- // We'll allow quick input of on-the-hour times. E.g. 1pm.
- firstDigit.addChild(ampm);
-
- // When the first digit is 1, the second digit may be 0-2.
- Node secondDigit = new Node(k0, k1, k2);
- firstDigit.addChild(secondDigit);
- // Also for quick input of on-the-hour times. E.g. 10pm, 12am.
- secondDigit.addChild(ampm);
-
- // When the first digit is 1, and the second digit is 0-2, the third digit may be 0-5.
- Node thirdDigit = new Node(k0, k1, k2, k3, k4, k5);
- secondDigit.addChild(thirdDigit);
- // The time may be finished now. E.g. 1:02pm, 1:25am.
- thirdDigit.addChild(ampm);
-
- // When the first digit is 1, the second digit is 0-2, and the third digit is 0-5,
- // the fourth digit may be 0-9.
- Node fourthDigit = new Node(k0, k1, k2, k3, k4, k5, k6, k7, k8, k9);
- thirdDigit.addChild(fourthDigit);
- // The time must be finished now. E.g. 10:49am, 12:40pm.
- fourthDigit.addChild(ampm);
-
- // When the first digit is 1, and the second digit is 0-2, the third digit may be 6-9.
- thirdDigit = new Node(k6, k7, k8, k9);
- secondDigit.addChild(thirdDigit);
- // The time must be finished now. E.g. 1:08am, 1:26pm.
- thirdDigit.addChild(ampm);
-
- // When the first digit is 1, the second digit may be 3-5.
- secondDigit = new Node(k3, k4, k5);
- firstDigit.addChild(secondDigit);
-
- // When the first digit is 1, and the second digit is 3-5, the third digit may be 0-9.
- thirdDigit = new Node(k0, k1, k2, k3, k4, k5, k6, k7, k8, k9);
- secondDigit.addChild(thirdDigit);
- // The time must be finished now. E.g. 1:39am, 1:50pm.
- thirdDigit.addChild(ampm);
-
- // The hour digit may be 2-9.
- firstDigit = new Node(k2, k3, k4, k5, k6, k7, k8, k9);
- mLegalTimesTree.addChild(firstDigit);
- // We'll allow quick input of on-the-hour-times. E.g. 2am, 5pm.
- firstDigit.addChild(ampm);
-
- // When the first digit is 2-9, the second digit may be 0-5.
- secondDigit = new Node(k0, k1, k2, k3, k4, k5);
- firstDigit.addChild(secondDigit);
-
- // When the first digit is 2-9, and the second digit is 0-5, the third digit may be 0-9.
- thirdDigit = new Node(k0, k1, k2, k3, k4, k5, k6, k7, k8, k9);
- secondDigit.addChild(thirdDigit);
- // The time must be finished now. E.g. 2:57am, 9:30pm.
- thirdDigit.addChild(ampm);
- }
- }
-
- /**
- * Simple node class to be used for traversal to check for legal times.
- * mLegalKeys represents the keys that can be typed to get to the node.
- * mChildren are the children that can be reached from this node.
- */
- private class Node {
- private int[] mLegalKeys;
- private ArrayList<Node> mChildren;
-
- public Node(int... legalKeys) {
- mLegalKeys = legalKeys;
- mChildren = new ArrayList<Node>();
- }
-
- public void addChild(Node child) {
- mChildren.add(child);
- }
-
- public boolean containsKey(int key) {
- for (int i = 0; i < mLegalKeys.length; i++) {
- if (mLegalKeys[i] == key) {
- return true;
- }
- }
- return false;
- }
-
- public Node canReach(int key) {
- if (mChildren == null) {
- return null;
- }
- for (Node child : mChildren) {
- if (child.containsKey(key)) {
- return child;
- }
- }
- return null;
- }
- }
-
- private final View.OnClickListener mClickListener = new View.OnClickListener() {
- @Override
- public void onClick(View v) {
-
- final int amOrPm;
- switch (v.getId()) {
- case R.id.am_label:
- setAmOrPm(AM);
- break;
- case R.id.pm_label:
- setAmOrPm(PM);
- break;
- case R.id.hours:
- setCurrentItemShowing(HOUR_INDEX, true, true);
- break;
- case R.id.minutes:
- setCurrentItemShowing(MINUTE_INDEX, true, true);
- break;
- default:
- // Failed to handle this click, don't vibrate.
- return;
- }
-
- tryVibrate();
- }
- };
-
- private final View.OnKeyListener mKeyListener = new View.OnKeyListener() {
- @Override
- public boolean onKey(View v, int keyCode, KeyEvent event) {
- if (event.getAction() == KeyEvent.ACTION_UP) {
- return processKeyUp(keyCode);
- }
- return false;
- }
- };
-
- private final View.OnFocusChangeListener mFocusListener = new View.OnFocusChangeListener() {
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- if (!hasFocus && mInKbMode && isTypedTimeFullyLegal()) {
- finishKbMode();
-
- if (mOnTimeChangedListener != null) {
- mOnTimeChangedListener.onTimeChanged(mDelegator,
- mRadialTimePickerView.getCurrentHour(),
- mRadialTimePickerView.getCurrentMinute());
- }
- }
- }
- };
}
diff --git a/core/java/android/widget/Toast.java b/core/java/android/widget/Toast.java
index dd165ae..be4cdc1 100644
--- a/core/java/android/widget/Toast.java
+++ b/core/java/android/widget/Toast.java
@@ -235,6 +235,14 @@
public int getYOffset() {
return mTN.mY;
}
+
+ /**
+ * Gets the LayoutParams for the Toast window.
+ * @hide
+ */
+ public WindowManager.LayoutParams getWindowParams() {
+ return mTN.mParams;
+ }
/**
* Make a standard toast that just contains a text view.
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 5267811..0bc1a8d 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -16,13 +16,20 @@
package com.android.internal.app;
+import android.app.Activity;
+import android.content.ComponentName;
import android.content.Intent;
+import android.content.IntentSender;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.Log;
+import android.util.Slog;
public class ChooserActivity extends ResolverActivity {
+ private static final String TAG = "ChooserActivity";
+
private Bundle mReplacementExtras;
+ private IntentSender mChosenComponentSender;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -60,11 +67,14 @@
initialIntents[i] = in;
}
}
+ mChosenComponentSender = intent.getParcelableExtra(
+ Intent.EXTRA_CHOSEN_COMPONENT_INTENT_SENDER);
setSafeForwardingMode(true);
super.onCreate(savedInstanceState, target, title, defaultTitleRes, initialIntents,
null, false);
}
+ @Override
public Intent getReplacementIntent(String packageName, Intent defIntent) {
if (mReplacementExtras != null) {
final Bundle replExtras = mReplacementExtras.getBundle(packageName);
@@ -77,6 +87,22 @@
return defIntent;
}
+ @Override
+ public void onActivityStarted(Intent intent) {
+ if (mChosenComponentSender != null) {
+ final ComponentName target = intent.getComponent();
+ if (target != null) {
+ final Intent fillIn = new Intent().putExtra(Intent.EXTRA_CHOSEN_COMPONENT, target);
+ try {
+ mChosenComponentSender.sendIntent(this, Activity.RESULT_OK, fillIn, null, null);
+ } catch (IntentSender.SendIntentException e) {
+ Slog.e(TAG, "Unable to launch supplied IntentSender to report "
+ + "the chosen component: " + e);
+ }
+ }
+ }
+ }
+
private void modifyTargetIntent(Intent in) {
final String action = in.getAction();
if (Intent.ACTION_SEND.equals(action) ||
diff --git a/core/java/com/android/internal/app/PlatLogoActivity.java b/core/java/com/android/internal/app/PlatLogoActivity.java
index f92fd55..80bc5fe 100644
--- a/core/java/com/android/internal/app/PlatLogoActivity.java
+++ b/core/java/com/android/internal/app/PlatLogoActivity.java
@@ -36,6 +36,7 @@
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
+import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
@@ -54,6 +55,7 @@
};
FrameLayout mLayout;
int mTapCount;
+ int mKeyCount;
PathInterpolator mInterpolator = new PathInterpolator(0f, 0f, 0.5f, 1f);
static int newColorIndex() {
@@ -203,6 +205,28 @@
}
});
+ // Enable hardware keyboard input for TV compatibility.
+ im.setFocusable(true);
+ im.requestFocus();
+ im.setOnKeyListener(new View.OnKeyListener() {
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ if (keyCode != KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
+ ++mKeyCount;
+ if (mKeyCount > 2) {
+ if (mTapCount > 5) {
+ im.performLongClick();
+ } else {
+ im.performClick();
+ }
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+ });
+
mLayout.addView(im, new FrameLayout.LayoutParams(size, size, Gravity.CENTER));
im.animate().scaleX(0.3f).scaleY(0.3f)
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index b9cbc62..ccffa19 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -644,10 +644,12 @@
public void safelyStartActivity(Intent intent) {
if (!mSafeForwardingMode) {
startActivity(intent);
+ onActivityStarted(intent);
return;
}
try {
startActivityAsCaller(intent, null, UserHandle.USER_NULL);
+ onActivityStarted(intent);
} catch (RuntimeException e) {
String launchedFromPackage;
try {
@@ -662,6 +664,10 @@
}
}
+ public void onActivityStarted(Intent intent) {
+ // Do nothing
+ }
+
void showAppDetails(ResolveInfo ri) {
Intent in = new Intent().setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
.setData(Uri.fromParts("package", ri.activityInfo.packageName, null))
diff --git a/core/java/com/android/internal/http/multipart/FilePart.java b/core/java/com/android/internal/http/multipart/FilePart.java
index bfcda00..45e4be6 100644
--- a/core/java/com/android/internal/http/multipart/FilePart.java
+++ b/core/java/com/android/internal/http/multipart/FilePart.java
@@ -51,9 +51,14 @@
* @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
* @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
*
- * @since 2.0
+ * @since 2.0
*
+ * @deprecated Please use {@link java.net.URLConnection} and friends instead.
+ * The Apache HTTP client is no longer maintained and may be removed in a future
+ * release. Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
+ * for further details.
*/
+@Deprecated
public class FilePart extends PartBase {
/** Default content encoding of file attachments. */
diff --git a/core/java/com/android/internal/http/multipart/MultipartEntity.java b/core/java/com/android/internal/http/multipart/MultipartEntity.java
index 2c5e7f6..5319251 100644
--- a/core/java/com/android/internal/http/multipart/MultipartEntity.java
+++ b/core/java/com/android/internal/http/multipart/MultipartEntity.java
@@ -80,7 +80,13 @@
* </pre>
*
* @since 3.0
+ *
+ * @deprecated Please use {@link java.net.URLConnection} and friends instead.
+ * The Apache HTTP client is no longer maintained and may be removed in a future
+ * release. Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
+ * for further details.
*/
+@Deprecated
public class MultipartEntity extends AbstractHttpEntity {
private static final Log log = LogFactory.getLog(MultipartEntity.class);
diff --git a/core/java/com/android/internal/http/multipart/Part.java b/core/java/com/android/internal/http/multipart/Part.java
index cb1b546..1d66dc67 100644
--- a/core/java/com/android/internal/http/multipart/Part.java
+++ b/core/java/com/android/internal/http/multipart/Part.java
@@ -48,7 +48,13 @@
* @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
*
* @since 2.0
+ *
+ * @deprecated Please use {@link java.net.URLConnection} and friends instead.
+ * The Apache HTTP client is no longer maintained and may be removed in a future
+ * release. Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
+ * for further details.
*/
+@Deprecated
public abstract class Part {
/** Log object for this class. */
diff --git a/core/java/com/android/internal/http/multipart/StringPart.java b/core/java/com/android/internal/http/multipart/StringPart.java
index c98257e..73d0f90 100644
--- a/core/java/com/android/internal/http/multipart/StringPart.java
+++ b/core/java/com/android/internal/http/multipart/StringPart.java
@@ -46,7 +46,13 @@
* @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
*
* @since 2.0
+ *
+ * @deprecated Please use {@link java.net.URLConnection} and friends instead.
+ * The Apache HTTP client is no longer maintained and may be removed in a future
+ * release. Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
+ * for further details.
*/
+@Deprecated
public class StringPart extends PartBase {
/** Log object for this class. */
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index 8794d31..e6bcea1 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -43,6 +43,7 @@
void onPanelRevealed();
void onPanelHidden();
void onNotificationClick(String key);
+ void onNotificationActionClick(String key, int actionIndex);
void onNotificationError(String pkg, String tag, int id,
int uid, int initialPid, String message, int userId);
void onClearAllNotifications(int userId);
diff --git a/core/java/com/android/internal/util/MemInfoReader.java b/core/java/com/android/internal/util/MemInfoReader.java
index 5f240f7..1dd9464 100644
--- a/core/java/com/android/internal/util/MemInfoReader.java
+++ b/core/java/com/android/internal/util/MemInfoReader.java
@@ -34,40 +34,65 @@
}
}
+ /**
+ * Total amount of RAM available to the kernel.
+ */
public long getTotalSize() {
return mInfos[Debug.MEMINFO_TOTAL] * 1024;
}
+ /**
+ * Amount of RAM that is not being used for anything.
+ */
public long getFreeSize() {
return mInfos[Debug.MEMINFO_FREE] * 1024;
}
+ /**
+ * Amount of RAM that the kernel is being used for caches, not counting caches
+ * that are mapped in to processes.
+ */
public long getCachedSize() {
- return mInfos[Debug.MEMINFO_CACHED] * 1024;
+ return getCachedSizeKb() * 1024;
}
+ /**
+ * Amount of RAM that is in use by the kernel for actual allocations.
+ */
+ public long getKernelUsedSize() {
+ return getKernelUsedSizeKb() * 1024;
+ }
+
+ /**
+ * Total amount of RAM available to the kernel.
+ */
public long getTotalSizeKb() {
return mInfos[Debug.MEMINFO_TOTAL];
}
+ /**
+ * Amount of RAM that is not being used for anything.
+ */
public long getFreeSizeKb() {
return mInfos[Debug.MEMINFO_FREE];
}
+ /**
+ * Amount of RAM that the kernel is being used for caches, not counting caches
+ * that are mapped in to processes.
+ */
public long getCachedSizeKb() {
- return mInfos[Debug.MEMINFO_CACHED];
+ return mInfos[Debug.MEMINFO_BUFFERS]
+ + mInfos[Debug.MEMINFO_CACHED] - mInfos[Debug.MEMINFO_MAPPED];
}
- public long getBuffersSizeKb() {
- return mInfos[Debug.MEMINFO_BUFFERS];
- }
-
- public long getShmemSizeKb() {
- return mInfos[Debug.MEMINFO_SHMEM];
- }
-
- public long getSlabSizeKb() {
- return mInfos[Debug.MEMINFO_SLAB];
+ /**
+ * Amount of RAM that is in use by the kernel for actual allocations.
+ */
+ public long getKernelUsedSizeKb() {
+ return mInfos[Debug.MEMINFO_SHMEM] + mInfos[Debug.MEMINFO_SLAB]
+ + mInfos[Debug.MEMINFO_VM_ALLOC_USED] + mInfos[Debug.MEMINFO_PAGE_TABLES]
+ + mInfos[Debug.MEMINFO_KERNEL_STACK];
}
public long getSwapTotalSizeKb() {
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index 91e5330..b9a85e5 100644
--- a/core/java/com/android/internal/widget/ActionBarView.java
+++ b/core/java/com/android/internal/widget/ActionBarView.java
@@ -19,8 +19,6 @@
import android.animation.LayoutTransition;
import android.app.ActionBar;
import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
@@ -29,9 +27,7 @@
import android.text.Layout;
import android.text.TextUtils;
import android.util.AttributeSet;
-import android.util.TypedValue;
import android.view.CollapsibleActionView;
-import android.view.ContextThemeWrapper;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -111,10 +107,10 @@
private int mProgressBarPadding;
private int mItemPadding;
- private int mTitleStyleRes;
- private int mSubtitleStyleRes;
- private int mProgressStyle;
- private int mIndeterminateProgressStyle;
+ private final int mTitleStyleRes;
+ private final int mSubtitleStyleRes;
+ private final int mProgressStyle;
+ private final int mIndeterminateProgressStyle;
private boolean mUserTitle;
private boolean mIncludeTabs;
diff --git a/core/java/com/android/internal/widget/ExploreByTouchHelper.java b/core/java/com/android/internal/widget/ExploreByTouchHelper.java
index 4689179..0e046cb 100644
--- a/core/java/com/android/internal/widget/ExploreByTouchHelper.java
+++ b/core/java/com/android/internal/widget/ExploreByTouchHelper.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.graphics.Rect;
import android.os.Bundle;
+import android.util.IntArray;
import android.view.accessibility.*;
import android.view.MotionEvent;
import android.view.View;
@@ -26,11 +27,9 @@
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import android.view.accessibility.AccessibilityNodeProvider;
-import java.util.LinkedList;
-import java.util.List;
-
/**
* ExploreByTouchHelper is a utility class for implementing accessibility
* support in custom {@link android.view.View}s that represent a collection of View-like
@@ -58,14 +57,16 @@
private static final Rect INVALID_PARENT_BOUNDS = new Rect(
Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE);
- // Temporary, reusable data structures.
- private final Rect mTempScreenRect = new Rect();
- private final Rect mTempParentRect = new Rect();
- private final Rect mTempVisibleRect = new Rect();
- private final int[] mTempGlobalRect = new int[2];
+ // Lazily-created temporary data structures used when creating nodes.
+ private Rect mTempScreenRect;
+ private Rect mTempParentRect;
+ private int[] mTempGlobalRect;
- /** View's context **/
- private Context mContext;
+ /** Lazily-created temporary data structure used to compute visibility. */
+ private Rect mTempVisibleRect;
+
+ /** Lazily-created temporary data structure used to obtain child IDs. */
+ private IntArray mTempArray;
/** System accessibility manager, used to check state and send events. */
private final AccessibilityManager mManager;
@@ -73,6 +74,9 @@
/** View whose internal structure is exposed through this helper. */
private final View mView;
+ /** Context of the host view. **/
+ private final Context mContext;
+
/** Node provider that handles creating nodes and performing actions. */
private ExploreByTouchNodeProvider mNodeProvider;
@@ -332,11 +336,17 @@
onInitializeAccessibilityNodeInfo(mView, node);
// Add the virtual descendants.
- final LinkedList<Integer> virtualViewIds = new LinkedList<Integer>();
+ if (mTempArray == null) {
+ mTempArray = new IntArray();
+ } else {
+ mTempArray.clear();
+ }
+ final IntArray virtualViewIds = mTempArray;
getVisibleVirtualViews(virtualViewIds);
- for (Integer childVirtualViewId : virtualViewIds) {
- node.addChild(mView, childVirtualViewId);
+ final int N = virtualViewIds.size();
+ for (int i = 0; i < N; i++) {
+ node.addChild(mView, virtualViewIds.get(i));
}
return node;
@@ -371,6 +381,11 @@
* @return An {@link AccessibilityNodeInfo} for the specified item.
*/
private AccessibilityNodeInfo createNodeForChild(int virtualViewId) {
+ ensureTempRects();
+ final Rect tempParentRect = mTempParentRect;
+ final int[] tempGlobalRect = mTempGlobalRect;
+ final Rect tempScreenRect = mTempScreenRect;
+
final AccessibilityNodeInfo node = AccessibilityNodeInfo.obtain();
// Ensure the client has good defaults.
@@ -387,8 +402,8 @@
+ "populateNodeForVirtualViewId()");
}
- node.getBoundsInParent(mTempParentRect);
- if (mTempParentRect.equals(INVALID_PARENT_BOUNDS)) {
+ node.getBoundsInParent(tempParentRect);
+ if (tempParentRect.equals(INVALID_PARENT_BOUNDS)) {
throw new RuntimeException("Callbacks must set parent bounds in "
+ "populateNodeForVirtualViewId()");
}
@@ -411,29 +426,35 @@
// Manage internal accessibility focus state.
if (mFocusedVirtualViewId == virtualViewId) {
node.setAccessibilityFocused(true);
- node.addAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
+ node.addAction(AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
} else {
node.setAccessibilityFocused(false);
- node.addAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS);
+ node.addAction(AccessibilityAction.ACTION_ACCESSIBILITY_FOCUS);
}
// Set the visibility based on the parent bound.
- if (intersectVisibleToUser(mTempParentRect)) {
+ if (intersectVisibleToUser(tempParentRect)) {
node.setVisibleToUser(true);
- node.setBoundsInParent(mTempParentRect);
+ node.setBoundsInParent(tempParentRect);
}
// Calculate screen-relative bound.
- mView.getLocationOnScreen(mTempGlobalRect);
- final int offsetX = mTempGlobalRect[0];
- final int offsetY = mTempGlobalRect[1];
- mTempScreenRect.set(mTempParentRect);
- mTempScreenRect.offset(offsetX, offsetY);
- node.setBoundsInScreen(mTempScreenRect);
+ mView.getLocationOnScreen(tempGlobalRect);
+ final int offsetX = tempGlobalRect[0];
+ final int offsetY = tempGlobalRect[1];
+ tempScreenRect.set(tempParentRect);
+ tempScreenRect.offset(offsetX, offsetY);
+ node.setBoundsInScreen(tempScreenRect);
return node;
}
+ private void ensureTempRects() {
+ mTempGlobalRect = new int[2];
+ mTempParentRect = new Rect();
+ mTempScreenRect = new Rect();
+ }
+
private boolean performAction(int virtualViewId, int action, Bundle arguments) {
switch (virtualViewId) {
case View.NO_ID:
@@ -451,13 +472,13 @@
switch (action) {
case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS:
case AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS:
- return manageFocusForChild(virtualViewId, action, arguments);
+ return manageFocusForChild(virtualViewId, action);
default:
return onPerformActionForVirtualView(virtualViewId, action, arguments);
}
}
- private boolean manageFocusForChild(int virtualViewId, int action, Bundle arguments) {
+ private boolean manageFocusForChild(int virtualViewId, int action) {
switch (action) {
case AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS:
return requestAccessibilityFocus(virtualViewId);
@@ -503,12 +524,16 @@
}
// If no portion of the parent is visible, this view is not visible.
- if (!mView.getLocalVisibleRect(mTempVisibleRect)) {
+ if (mTempVisibleRect == null) {
+ mTempVisibleRect = new Rect();
+ }
+ final Rect tempVisibleRect = mTempVisibleRect;
+ if (!mView.getLocalVisibleRect(tempVisibleRect)) {
return false;
}
// Check if the view intersects the visible portion of the parent.
- return localRect.intersect(mTempVisibleRect);
+ return localRect.intersect(tempVisibleRect);
}
/**
@@ -588,7 +613,7 @@
*
* @param virtualViewIds The list to populate with visible items
*/
- protected abstract void getVisibleVirtualViews(List<Integer> virtualViewIds);
+ protected abstract void getVisibleVirtualViews(IntArray virtualViewIds);
/**
* Populates an {@link AccessibilityEvent} with information about the
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 9a1c9fc..d6885da 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -560,9 +560,7 @@
// Update the device encryption password.
if (userId == UserHandle.USER_OWNER
&& LockPatternUtils.isDeviceEncryptionEnabled()) {
- final ContentResolver cr = mContext.getContentResolver();
- final boolean required = Settings.Global.getInt(cr,
- Settings.Global.REQUIRE_PASSWORD_TO_DECRYPT, 1) == 1 ? true : false;
+ final boolean required = isCredentialRequiredToDecrypt(true);
if (!required) {
clearEncryptionPassword();
} else {
@@ -728,12 +726,9 @@
/** Update the encryption password if it is enabled **/
private void updateEncryptionPassword(final int type, final String password) {
- DevicePolicyManager dpm = getDevicePolicyManager();
- if (dpm.getStorageEncryptionStatus(getCurrentOrCallingUserId())
- != DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE) {
+ if (!isDeviceEncryptionEnabled()) {
return;
}
-
final IBinder service = ServiceManager.getService("mount");
if (service == null) {
Log.e(TAG, "Could not find the mount service to update the encryption password");
@@ -796,10 +791,7 @@
// Update the device encryption password.
if (userHandle == UserHandle.USER_OWNER
&& LockPatternUtils.isDeviceEncryptionEnabled()) {
- final ContentResolver cr = mContext.getContentResolver();
- final boolean required = Settings.Global.getInt(cr,
- Settings.Global.REQUIRE_PASSWORD_TO_DECRYPT, 1) == 1 ? true : false;
- if (!required) {
+ if (!isCredentialRequiredToDecrypt(true)) {
clearEncryptionPassword();
} else {
boolean numeric = computedQuality
@@ -1661,4 +1653,19 @@
private void onAfterChangingPassword() {
getTrustManager().reportEnabledTrustAgentsChanged(getCurrentOrCallingUserId());
}
+
+ public boolean isCredentialRequiredToDecrypt(boolean defaultValue) {
+ final int value = Settings.Global.getInt(mContentResolver,
+ Settings.Global.REQUIRE_PASSWORD_TO_DECRYPT, -1);
+ return value == -1 ? defaultValue : (value != 0);
+ }
+
+ public void setCredentialRequiredToDecrypt(boolean required) {
+ if (getCurrentUser() != UserHandle.USER_OWNER) {
+ Log.w(TAG, "Only device owner may call setCredentialRequiredForDecrypt()");
+ return;
+ }
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.REQUIRE_PASSWORD_TO_DECRYPT, required ? 1 : 0);
+ }
}
diff --git a/core/java/com/android/internal/widget/SwipeDismissLayout.java b/core/java/com/android/internal/widget/SwipeDismissLayout.java
index 97b1634..99b1bae 100644
--- a/core/java/com/android/internal/widget/SwipeDismissLayout.java
+++ b/core/java/com/android/internal/widget/SwipeDismissLayout.java
@@ -17,6 +17,7 @@
package com.android.internal.widget;
import android.animation.TimeInterpolator;
+import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
@@ -102,6 +103,13 @@
android.R.integer.config_shortAnimTime);
mCancelInterpolator = new DecelerateInterpolator(1.5f);
mDismissInterpolator = new AccelerateInterpolator(1.5f);
+ // SwipeDismissLayout assumes that the host Activity is translucent
+ // and temporarily disables translucency when it is fully visible.
+ // As soon as the user starts swiping, we will re-enable
+ // translucency.
+ if (context instanceof Activity) {
+ ((Activity) context).convertFromTranslucent();
+ }
}
public void setOnDismissedListener(OnDismissedListener listener) {
@@ -197,6 +205,9 @@
mLastX = ev.getRawX();
updateSwiping(ev);
if (mSwiping) {
+ if (getContext() instanceof Activity) {
+ ((Activity) getContext()).convertToTranslucent(null, null);
+ }
setProgress(ev.getRawX() - mDownX);
break;
}
@@ -218,6 +229,9 @@
}
protected void cancel() {
+ if (getContext() instanceof Activity) {
+ ((Activity) getContext()).convertFromTranslucent();
+ }
if (mProgressListener != null) {
mProgressListener.onSwipeCancelled(this);
}
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index e0abc24..a578b5d 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -315,7 +315,8 @@
}
SkBitmap decodingBitmap;
- if (!decoder->decode(stream, &decodingBitmap, prefColorType, decodeMode)) {
+ if (decoder->decode(stream, &decodingBitmap, prefColorType, decodeMode)
+ != SkImageDecoder::kSuccess) {
return nullObjectReturn("decoder->decode returned false");
}
diff --git a/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp b/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp
index b64ab0d..a67740c 100644
--- a/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp
+++ b/core/jni/android/graphics/CreateJavaOutputStreamAdaptor.cpp
@@ -78,6 +78,8 @@
env->ExceptionDescribe();
env->ExceptionClear();
SkDebugf("---- read threw an exception\n");
+ // Consider the stream to be at the end, since there was an error.
+ fIsAtEnd = true;
return 0;
}
@@ -92,6 +94,9 @@
env->ExceptionDescribe();
env->ExceptionClear();
SkDebugf("---- read:GetByteArrayRegion threw an exception\n");
+ // The error was not with the stream itself, but consider it to be at the
+ // end, since we do not have a way to recover.
+ fIsAtEnd = true;
return 0;
}
diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp
index 7b3528b..9ec9993 100644
--- a/core/jni/android_os_Debug.cpp
+++ b/core/jni/android_os_Debug.cpp
@@ -552,6 +552,10 @@
MEMINFO_SWAP_TOTAL,
MEMINFO_SWAP_FREE,
MEMINFO_ZRAM_TOTAL,
+ MEMINFO_MAPPED,
+ MEMINFO_VMALLOC_USED,
+ MEMINFO_PAGE_TABLES,
+ MEMINFO_KERNEL_STACK,
MEMINFO_COUNT
};
@@ -590,6 +594,11 @@
"Slab:",
"SwapTotal:",
"SwapFree:",
+ "ZRam:",
+ "Mapped:",
+ "VmallocUsed:",
+ "PageTables:",
+ "KernelStack:",
NULL
};
static const int tagsLen[] = {
@@ -601,12 +610,17 @@
5,
10,
9,
+ 5,
+ 7,
+ 12,
+ 11,
+ 12,
0
};
- long mem[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ long mem[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
char* p = buffer;
- while (*p && numFound < 8) {
+ while (*p && numFound < 13) {
int i = 0;
while (tags[i]) {
if (strncmp(p, tags[i], tagsLen[i]) == 0) {
diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp
index 9bb8195..a0b2ca8 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -47,6 +47,11 @@
#include <ScopedUtfChars.h>
+#include <AnimationContext.h>
+#include <DisplayListRenderer.h>
+#include <RenderNode.h>
+#include <renderthread/RenderProxy.h>
+
// ----------------------------------------------------------------------------
namespace android {
@@ -352,8 +357,54 @@
parcel->writeStrongBinder( self != 0 ? self->getIGraphicBufferProducer()->asBinder() : NULL);
}
+namespace uirenderer {
+
+using namespace android::uirenderer::renderthread;
+
+class ContextFactory : public IContextFactory {
+public:
+ virtual AnimationContext* createAnimationContext(renderthread::TimeLord& clock) {
+ return new AnimationContext(clock);
+ }
+};
+
+static jlong create(JNIEnv* env, jclass clazz, jlong rootNodePtr, jlong surfacePtr) {
+ RenderNode* rootNode = reinterpret_cast<RenderNode*>(rootNodePtr);
+ sp<Surface> surface(reinterpret_cast<Surface*>(surfacePtr));
+ ContextFactory factory;
+ RenderProxy* proxy = new RenderProxy(false, rootNode, &factory);
+ proxy->loadSystemProperties();
+ proxy->setSwapBehavior(kSwap_discardBuffer);
+ proxy->initialize(surface);
+ // Shadows can't be used via this interface, so just set the light source
+ // to all 0s. (and width & height are unused, TODO remove them)
+ proxy->setup(0, 0, (Vector3){0, 0, 0}, 0, 0, 0);
+ return (jlong) proxy;
+}
+
+static void setSurface(JNIEnv* env, jclass clazz, jlong rendererPtr, jlong surfacePtr) {
+ RenderProxy* proxy = reinterpret_cast<RenderProxy*>(rendererPtr);
+ sp<Surface> surface(reinterpret_cast<Surface*>(surfacePtr));
+ proxy->updateSurface(surface);
+}
+
+static void draw(JNIEnv* env, jclass clazz, jlong rendererPtr) {
+ RenderProxy* proxy = reinterpret_cast<RenderProxy*>(rendererPtr);
+ nsecs_t frameTimeNs = systemTime(CLOCK_MONOTONIC);
+ proxy->syncAndDrawFrame(frameTimeNs, 0, 1.0f);
+}
+
+static void destroy(JNIEnv* env, jclass clazz, jlong rendererPtr) {
+ RenderProxy* proxy = reinterpret_cast<RenderProxy*>(rendererPtr);
+ delete proxy;
+}
+
+} // uirenderer
+
// ----------------------------------------------------------------------------
+namespace hwui = android::uirenderer;
+
static JNINativeMethod gSurfaceMethods[] = {
{"nativeCreateFromSurfaceTexture", "(Landroid/graphics/SurfaceTexture;)J",
(void*)nativeCreateFromSurfaceTexture },
@@ -375,6 +426,12 @@
(void*)nativeReadFromParcel },
{"nativeWriteToParcel", "(JLandroid/os/Parcel;)V",
(void*)nativeWriteToParcel },
+
+ // HWUI context
+ {"nHwuiCreate", "(JJ)J", (void*) hwui::create },
+ {"nHwuiSetSurface", "(JJ)V", (void*) hwui::setSurface },
+ {"nHwuiDraw", "(J)V", (void*) hwui::draw },
+ {"nHwuiDestroy", "(J)V", (void*) hwui::destroy },
};
int register_android_view_Surface(JNIEnv* env)
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 6e48351..15b56c3 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -300,6 +300,9 @@
<protected-broadcast android:name="android.intent.action.ACTION_SUBINFO_CONTENT_CHANGE" />
<protected-broadcast android:name="android.intent.action.ACTION_SUBINFO_RECORD_UPDATED" />
+ <protected-broadcast android:name="android.intent.action.ACTION_SET_RADIO_CAPABILITY_DONE" />
+ <protected-broadcast android:name="android.intent.action.ACTION_SET_RADIO_CAPABILITY_FAILED" />
+
<!-- ====================================== -->
<!-- Permissions for things that cost money -->
<!-- ====================================== -->
@@ -687,14 +690,14 @@
<!-- Allows an application to modify and remove existing voicemails in the system -->
<permission android:name="com.android.voicemail.permission.WRITE_VOICEMAIL"
android:permissionGroup="android.permission-group.VOICEMAIL"
- android:protectionLevel="dangerous"
+ android:protectionLevel="system|signature"
android:label="@string/permlab_writeVoicemail"
android:description="@string/permdesc_writeVoicemail" />
<!-- Allows an application to read voicemails in the system. -->
<permission android:name="com.android.voicemail.permission.READ_VOICEMAIL"
android:permissionGroup="android.permission-group.VOICEMAIL"
- android:protectionLevel="dangerous"
+ android:protectionLevel="system|signature"
android:label="@string/permlab_readVoicemail"
android:description="@string/permdesc_readVoicemail" />
diff --git a/core/res/res/layout/select_dialog_item_material.xml b/core/res/res/layout/select_dialog_item_material.xml
index 59b432e..fe326f3 100644
--- a/core/res/res/layout/select_dialog_item_material.xml
+++ b/core/res/res/layout/select_dialog_item_material.xml
@@ -28,6 +28,6 @@
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:textColor="?android:attr/textColorAlertDialogListItem"
android:gravity="center_vertical"
- android:paddingStart="16dip"
- android:paddingEnd="16dip"
+ android:paddingStart="@dimen/alert_dialog_padding_material"
+ android:paddingEnd="@dimen/alert_dialog_padding_material"
android:ellipsize="marquee" />
diff --git a/core/res/res/layout/select_dialog_multichoice_material.xml b/core/res/res/layout/select_dialog_multichoice_material.xml
index 01e4cfa..e5b5b62 100644
--- a/core/res/res/layout/select_dialog_multichoice_material.xml
+++ b/core/res/res/layout/select_dialog_multichoice_material.xml
@@ -23,8 +23,8 @@
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorAlertDialogListItem"
android:gravity="center_vertical"
- android:paddingStart="16dip"
- android:paddingEnd="16dip"
+ android:paddingStart="@dimen/alert_dialog_padding_material"
+ android:paddingEnd="@dimen/alert_dialog_padding_material"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:checkMarkGravity="start"
android:ellipsize="marquee" />
diff --git a/core/res/res/layout/select_dialog_singlechoice_material.xml b/core/res/res/layout/select_dialog_singlechoice_material.xml
index 0f3c277..a9e603d 100644
--- a/core/res/res/layout/select_dialog_singlechoice_material.xml
+++ b/core/res/res/layout/select_dialog_singlechoice_material.xml
@@ -23,8 +23,8 @@
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorAlertDialogListItem"
android:gravity="center_vertical"
- android:paddingStart="16dip"
- android:paddingEnd="16dip"
+ android:paddingStart="@dimen/alert_dialog_padding_material"
+ android:paddingEnd="@dimen/alert_dialog_padding_material"
android:checkMark="?android:attr/listChoiceIndicatorSingle"
android:checkMarkGravity="start"
android:ellipsize="marquee" />
diff --git a/core/res/res/layout/time_header_label.xml b/core/res/res/layout/time_header_label.xml
index 84b2b0c..efb3628 100644
--- a/core/res/res/layout/time_header_label.xml
+++ b/core/res/res/layout/time_header_label.xml
@@ -56,7 +56,9 @@
android:paddingStart="@dimen/timepicker_ampm_horizontal_padding"
android:paddingTop="@dimen/timepicker_ampm_vertical_padding"
android:paddingEnd="@dimen/timepicker_ampm_horizontal_padding"
- android:paddingBottom="@dimen/timepicker_am_bottom_padding" />
+ android:paddingBottom="@dimen/timepicker_am_bottom_padding"
+ android:lines="1"
+ android:ellipsize="none" />
<CheckedTextView
android:id="@+id/pm_label"
android:layout_width="wrap_content"
@@ -64,7 +66,9 @@
android:paddingStart="@dimen/timepicker_ampm_horizontal_padding"
android:paddingTop="@dimen/timepicker_pm_top_padding"
android:paddingEnd="@dimen/timepicker_ampm_horizontal_padding"
- android:paddingBottom="@dimen/timepicker_ampm_vertical_padding" />
+ android:paddingBottom="@dimen/timepicker_ampm_vertical_padding"
+ android:lines="1"
+ android:ellipsize="none" />
</LinearLayout>
</RelativeLayout>
</FrameLayout>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index d3004a5..a0c93b9 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"verander jou eie kontakkaart"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Laat die program toe om persoonlike profielinligting, soos jou naam en kontakinligting, wat op jou toestel gestoor is, te verander of daarby te voeg. Dit beteken dat die program jou kan identifiseer en moontlik jou profielinligting na ander mense kan stuur."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"liggaamsensors (soos hartklopmonitors)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Laat die program toe om toegang tot data te verkry vanaf sensors wat jy gebruik om te meet wat binne jou liggaam aangaan, soos hartklop."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Laat die program toe om toegang te verkry tot data van sensors af wat jou fisieke toestand, soos jou polsslag, monitor."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"lees jou sosiale stroom"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Laat die program toe om toegang tot sosiale opdaterings van jou en jou vriende te verkry en dit te sinkroniseer. Wees versigtig wanneer jy inligting deel -- dit laat die program toe om kommunikasie tussen jou en jou vriende op sosiale netwerke te lees, ongeag vertroulikheid. Let wel: hierdie toestemming mag dalk nie op alle sosiale netwerke afgedwing word nie."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"skryf aan jou sosiale stroom"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index c2e2e39..16d4c38 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"የራስዎን የዕውቂያ ካርድ ያስተካክሉ"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"መተግበሪያው ልክ እንደ ስምዎ እና የእውቂያ መረጃዎ ያሉ በመሳሪያዎ ላይ የተከማቹ የግል መገለጫ መረጃዎችን እንዲቀይር ወይም እንዲያክልባቸው ይፈቅድለታል። ይህም ማለት መተግበሪያው ለይቶ ሊያውቅዎ እና የመገለጫ መረጃዎን ለሌሎች ሊልክ ይችላል።"</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"የሰውነት መመርመሪያዎች (እንደ የልብ ምት መቆጣጠሪያዎች)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"መተግበሪያው እርስዎ በሰውነትዎ ውስጥ እየተካሄዱ ያሉ እንደ የልብ ምት የመሳሰሉ ነገሮችን ለመለካት የሚጠቀሙበትን ውሂብ ከመመርመሪያዎቹ ላይ እንዲደርስ ይፈቅድለታል።"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"እንደ የእርስዎ የልብ ምት የመሳሰሉ ያሉበትን አካላዊ ሁኔታ ከሚቆጣጠሩ ሰውነት ዳሳሾች ውሂብ ላይ እንዲደርስ ለመተግበሪያው ይፈቅደለታል።"</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"የእርስዎን ማህበራዊ የውይይት ክፍሎች ያንብቡ"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"መተግበሪያው የአንተንና የጓኞችህን ማህበራዊ ዝማኔዎችን እንዲደርስባቸው እና እንዲያመሳስላቸው ይፈቅድለታል። መረጃ ስታጋራ ተጠንቀቅ -- ይህ መተግበሪያው ሚስጥራዊነትን ከግምት ሳያስገባ በማህበራዊ አውታረ መረቦች በአንተ እና በጓደኞችህ መካከል የሚደረጉ ግንኙነቶችን እንዲያነብ ይፈቅድለታል። ማስታወሻ፦ ይህ ፈቃድ ለሁሉም ማህበራዊ አውታር መረቦች ላይ ላይፈጸም ይችላል።"</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"ወደ የእርስዎ ማህበራዊ የውይይት ክፍሎች ይጻፉ"</string>
@@ -1761,7 +1761,7 @@
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ይህን ማያ ገጽ ለመንቀል አጠቃላይ እይታን ይንኩትና ይያዙት።"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"ማያ ገጽ ተሰክቷል። መንቀል በድርጅትዎ አይፈቀድም።"</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"ማያ ገጽ መሰካትን ይጠቀሙ?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"ማያ ገጽ መሰካን ማሳያውን በአንዲ እይታ ውስጥ ይቆልፈዋል።\n\nለመንቀል ተመለስን እና አጠቃላይ እይታን በተመሳሳይ ይንኳቸውና ይያዟቸው።"</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"ማያ ገጽ መሰካትን ማሳያውን በነጠላ እይታ ውስጥ ይቆልፈዋል።\n\nለመንቀል ተመለስን እና አጠቃላይ እይታን በተመሳሳይ ይንኳቸውና ይያዟቸው።"</string>
<string name="lock_to_app_description_accessible" msgid="199664191087836099">"ማያ ገጽ መሰካት ማሳያውን በአንዲት እይታ ውስጥ ይቆልፈዋል።\n\nለመንቀል አጠቃላይ እይታን ይንኩትና ይያዙት።"</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"አይ፣ አመሰግናለሁ"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"ጀምር"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 092cb29..891c940 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"تعديل بطاقة جهة الاتصال الخاصة"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"للسماح للتطبيق بتغيير المعلومات الشخصية في الملف الشخصي المخزنة على الجهاز أو الإضافة إليها، مثل اسمك ومعلومات جهات الاتصال. ويعني ذلك أنه يمكن للتطبيق التعرف عليك كما يمكنه إرسال معلومات ملفك الشخصي إلى الآخرين."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"أجهزة استشعار الجسم (مثل شاشات معدل ضربات القلب)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"للسماح للتطبيق بالدخول إلى البيانات من أجهزة الاستشعار التي تستخدمها لقياس ما يجري داخل جسمك، مثل معدل ضربات القلب."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"للسماح للتطبيق بالدخول إلى البيانات من المستشعرات التي تراقب الحالة البدنية، مثل معدل نبضات القلب."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"قراءة المشاركات الاجتماعية"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"للسماح للتطبيق بالدخول إلى التحديثات الاجتماعية منك ومن أصدقائك ومزامنتها. توخ الحذر عند مشاركة المعلومات، حيث يتيح هذا للتطبيق قراءة عمليات التواصل بينك وبين أصدقائك على الشبكات الاجتماعية، بغض النظر عن مدى السرية. ملاحظة: لا يجوز فرض هذا الإذن على جميع الشبكات الاجتماعية."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"كتابة إلى المشاركات الاجتماعية"</string>
@@ -1757,12 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"تم تحديد <xliff:g id="ITEM">%1$s</xliff:g>"</string>
<string name="deleted_key" msgid="7659477886625566590">"تم حذف <xliff:g id="KEY">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> المخصص للعمل"</string>
- <string name="lock_to_app_toast" msgid="7570091317001980053">"لإلغاء تثبيت هذه الشاشة، يمكنك لمس \"رجوع\" و\"عرض عام\" في آن واحد مع الاستمرار."</string>
- <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"لإلغاء تثبيت هذه الشاشة، يمكنك لمس \"عرض عام\" مع الاستمرار."</string>
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"لإلغاء تثبيت هذه الشاشة، يمكنك لمس \"رجوع\" و\"نظرة عامة\" في آن واحد مع الاستمرار."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"لإلغاء تثبيت هذه الشاشة، يمكنك لمس \"نظرة عامة\" مع الاستمرار."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"الشاشة مثبتة. لا تسمح منظمتك بإلغاء التثبيت."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"هل تريد استخدام تثبيت الشاشة؟"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"يؤدي تثبيت الشاشة إلى تأمين الشاشة في العرض المفرد.\n\nلإلغاء التثبيت، المس \"رجوع\" و\"عرض عام\" في آن واحد مع الاستمرار."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"يؤدي تثبيت الشاشة إلى قفل الشاشة في العرض المفرد.\n\nلإلغاء التثبيت، يمكنك لمس \"عرض عام\" مع الاستمرار."</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"يؤدي تثبيت الشاشة إلى تأمين الشاشة في العرض المفرد.\n\nلإلغاء التثبيت، المس \"رجوع\" و\"نظرة عامة\" في آن واحد مع الاستمرار."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"يؤدي تثبيت الشاشة إلى قفل الشاشة في العرض المفرد.\n\nلإلغاء التثبيت، يمكنك لمس \"نظرة عامة\" مع الاستمرار."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"لا، شكرًا"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"بدء"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"تم تثبيت الشاشة"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 62d6d1d..7671cb1 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"промяна на собств. ви карт. с данни за контакт"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Разрешава на приложението да променя или добавя към личния потребителски профил информация, съхранена на устройството ви, като например вашето име и данни за връзка. Това означава, че приложението може да ви идентифицира и да изпраща данните за потребителския ви профил на други хора."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"телесни сензори (като монитори за сърдечния ритъм)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Разрешава на приложението да осъществява достъп до данни от използваните от вас сензори, за да измери какво се случва в тялото ви, като например сърдечен ритъм."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Разрешава на приложението да осъществява достъп до данните от сензорите, които следят физическото ви състояние, като например сърдечния ви ритъм."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"четене на социалния ви поток"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Разрешава на приложението да осъществява достъп и да синхронизира социални актуализации от вас и приятелите ви. Бъдете внимателни при споделянето на информация – това позволява на приложението да чете съобщения помежду ви в социалните мрежи независимо от поверителността. Забележка: Възможно е ограниченията на това разрешение да не могат да бъдат наложени във всички социални мрежи."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"писане в социалния ви поток"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"Избрахте <xliff:g id="ITEM">%1$s</xliff:g>"</string>
<string name="deleted_key" msgid="7659477886625566590">"Изтрихте <xliff:g id="KEY">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> за работа"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"За да освободите екрана, докоснете и задръжте едновременно бутона за връщане назад и този за общ преглед."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"За да освободите този екран, докоснете и задръжте бутона „Общ преглед“."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Екранът е фиксиран. Освобождаването не е разрешено от организацията ви."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Да се използва ли функцията за фиксиране на екрана?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Фиксирането на екрана заключва дисплея в един изглед.\n\nЗа да го освободите, докоснете и задръжте едновременно бутона за връщане назад и този за общ преглед."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Фиксирането на екрана заключва дисплея в един изглед.\n\nЗа да го освободите, докоснете и задръжте бутона „Общ преглед“."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"НЕ, БЛАГОДАРЯ"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"СТАРТИРАНЕ"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Екранът е фиксиран"</string>
diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml
index e6ea6c9..401bd7f 100644
--- a/core/res/res/values-bn-rBD/strings.xml
+++ b/core/res/res/values-bn-rBD/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"আপনার নিজস্ব পরিচিতি কার্ড সংশোধন করুন"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"অ্যাপ্লিকেশানটিকে আপনার ডিভাইসে সংরক্ষিত ব্যক্তিগত প্রোফাইলের তথ্য যেমন আপনার নাম এবং পরিচিতি তথ্য পড়ার অনুমতি দেয়৷ এর মানে হল এই অ্যাপ্লিকেশানটি আপনাকে শনাক্ত করতে পারে এবং আপনার প্রোফাইলের তথ্য অন্যদের পাঠাতে পারে৷"</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"শরীরের সেন্সর (হার্ট রেট মনিটারের মত)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"অ্যাপ্লিকেশানকে, হৃদস্পন্দনের মতো, আপনার শরীরের ভেতর কি ঘটছে তা পরিমাপ করার জন্য ব্যবহৃত সেন্সর থেকে তথ্য অ্যাক্সেস করার অনুমতি দেয়৷"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"অ্যাপ্লিকেশানটিকে আপনার শারীরিক অবস্থা যেমন, আপনার হৃৎস্পন্দন পর্যবেক্ষণ করে এমন সেন্সরগুলি অ্যাক্সেস করতে মঞ্জুরি দেয়।"</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"আপনার সামাজিক স্ট্রীম পড়ে"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"অ্যাপ্লিকেশানটিকে আপনার এবং আপনার বন্ধুদের থেকে সামাজিক আপডেটগুলিতে অ্যাক্সেস এবং সিঙ্ক করতে দেয়৷ তথ্য ভাগ করার সময় সতর্ক থাকুন -- এই অ্যাপ্লিকেশানটিকে গোপনীয়তা নির্বিশেষে সামাজিক নেটওয়ার্কগুলিতে আপনি এবং আপনার বন্ধুদের মধ্যে যোগাযোগগুলি পড়তে দেয়৷ দ্রষ্টব্য: এই অনুমতি সমস্ত সামাজিক নেটওয়ার্কে বলবৎ নাও হতে পারে৷"</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"আপনার সামাজিক স্ট্রীমে লেখে"</string>
@@ -1757,12 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> নির্বাচন করা হয়েছে"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> মুছে ফেলা হয়েছে"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"কর্মক্ষেত্র <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="7570091317001980053">"এই স্ক্রীনটিকে আনপিন করতে, \'ফিরুন\' এবং \'ওভারভিউ\' একসাথে স্পর্শ করুন এবং ধরে রাখুন৷"</string>
- <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"এই স্ক্রীনটিকে আনপিন করতে, \'ওভারভিউ\' স্পর্শ করুন এবং ধরে রাখুন৷"</string>
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"এই স্ক্রীনটিকে আনপিন করতে, \'ফিরুন\' এবং \'এক নজরে\' একসাথে স্পর্শ করুন এবং ধরে রাখুন৷"</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"এই স্ক্রীনটিকে আনপিন করতে, \'এক নজরে\' স্পর্শ করুন এবং ধরে রাখুন৷"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"স্ক্রীন পিন করা আছে। আপনার প্রতিষ্ঠান এটিকে পিনমুক্ত করার অনুমতি দেয়নি।"</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"স্ক্রীন পিন করা ব্যবহার করবেন?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"পিন করে রাখলে তা স্ক্রীনের প্রদর্শনকে একটি নির্দিষ্ট অবস্থায় লক করবে৷\n\nআনপিন করার জন্য, \'ফিরুন\' এবং \'ওভারভিউ\' একসাথে স্পর্শ করুন এবং ধরে রাখুন৷"</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"পিন করে রাখলে তা স্ক্রীনের প্রদর্শনকে একটি নির্দিষ্ট অবস্থায় লক করবে৷\n\n আনপিন করার জন্য, \'ওভারভিউ\' স্পর্শ করুন এবং ধরে রাখুন৷"</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"পিন করে রাখলে তা স্ক্রীনের প্রদর্শনকে একটি নির্দিষ্ট অবস্থায় লক করবে৷\n\nআনপিন করার জন্য, \'ফিরুন\' এবং \'এক নজরে\' একসাথে স্পর্শ করুন এবং ধরে রাখুন৷"</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"পিন করে রাখলে তা স্ক্রীনের প্রদর্শনকে একটি নির্দিষ্ট অবস্থায় লক করবে৷\n\n আনপিন করার জন্য, \'এক নজরে\' স্পর্শ করুন এবং ধরে রাখুন৷"</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"না, থাক"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"চালু করুন"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"স্ক্রীন পিন করা হয়েছে"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index e53d3fb..ef5103f 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"modificació targeta contacte"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Permet que l\'aplicació pugui canviar o afegir informació del perfil personal emmagatzemada al dispositiu, com ara el teu nom i la teva informació de contacte. Això significa que l\'aplicació et pot identificar i enviar la informació del teu perfil a altres persones."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"sensors corp. (monitors freq. cardíaca)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Permet que l\'aplicació accedeixi a les dades dels sensors que utilitzes per mesurar els signes vitals del teu cos, com ara la freqüència cardíaca."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Permet que l\'aplicació accedeixi a les dades dels sensors que supervisen el teu estat físic, com ara la freqüència cardíaca."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"llegeix el teu tauler d\'activitat social"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Permet que l\'aplicació accedeixi i sincronitzi actualitzacions socials teves i dels teus amics. Vés amb compte en compartir informació: això permet que l\'aplicació llegeixi comunicacions entre tu i els teus amics a les xarxes socials, independentment de la confidencialitat. Nota: És possible que aquest permís no s\'apliqui a totes les xarxes socials."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"escriu al tauler d\'activitat social"</string>
@@ -1757,12 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> seleccionat"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> suprimit"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> de la feina"</string>
- <string name="lock_to_app_toast" msgid="7570091317001980053">"Per anul·lar la fixació d\'aquesta pantalla, mantén premudes les opcions Enrere i Vista general alhora."</string>
- <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Per anul·lar la fixació d\'aquesta pantalla, mantén premuda l\'opció Vista general."</string>
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Per anul·lar la fixació d\'aquesta pantalla, mantén premudes les opcions Enrere i Visió general alhora."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Per anul·lar la fixació d\'aquesta pantalla, mantén premuda l\'opció Visió general."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"S\'ha fixat la pantalla. La teva organització no permet anul·lar-ne la fixació."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Vols fixar aquesta pantalla?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Si fixes la pantalla, es bloquejarà en una sola vista.\n\nPer anul·lar la fixació, mantén premudes les opcions Enrere i Vista general alhora."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Si fixes la pantalla, es bloquejarà en una sola vista.\n\nPer anul·lar la fixació, mantén premuda l\'opció Vista general."</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Si fixes la pantalla, es bloquejarà en una sola vista.\n\nPer anul·lar la fixació, mantén premudes les opcions Enrere i Visió general alhora."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Si fixes la pantalla, es bloquejarà en una sola vista.\n\nPer anul·lar la fixació, mantén premuda l\'opció Visió general."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"NO, GRÀCIES"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"INICIA"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fixada"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 308b1d0..771222f 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"úprava vaší vlastní vizitky"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Umožňuje aplikaci změnit nebo přidat údaje osobního profilu uložené v zařízení, například jméno nebo kontaktní údaje. Znamená to, že vás aplikace může identifikovat a odeslat údaje z profilu dalším aplikacím."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"tělesné senzory (například snímače tepu)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Umožňuje aplikaci přistupovat k datům ze senzorů, pomocí kterých měříte činnost svého těla, například tep."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Umožňuje aplikaci používat data ze senzorů, které sledují vaši fyzickou kondici, například tepovou frekvenci."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"čtení vašeho sociálního streamu"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Umožňuje aplikaci získat přístup k sociálním aktualizacím od vašich přátel a synchronizaci těchto aktualizací. Při sdílení informací buďte opatrní – toto oprávnění umožňuje aplikaci číst komunikaci mezi vámi a vašimi přáteli v sociálních sítích bez ohledu na její důvěrnost. Poznámka: Toto oprávnění nemusí platit pro všechny sociální sítě."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"zápis do sociálního streamu"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"Vybrána položka <xliff:g id="ITEM">%1$s</xliff:g>"</string>
<string name="deleted_key" msgid="7659477886625566590">"Číslice <xliff:g id="KEY">%1$s</xliff:g> byla smazána"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Pracovní <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Chcete-li tuto obrazovku uvolnit, klepněte současně na možnosti Zpět a Přehled a podržte je."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Chcete-li tuto obrazovku uvolnit, klepněte na možnost Přehled a podržte ji."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Obrazovka je připnuta. Vaše organizace uvolnění zakázala."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Použít připnutí obrazovky?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Připnutím obrazovky uzamknete displej v jednom zobrazení.\n\nChcete-li obrazovku uvolnit, klepněte současně na možnosti Zpět a Přehled a podržte je."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Připnutím obrazovky uzamknete displej v jednom zobrazení.\n\nChcete-li obrazovku uvolnit, klepněte na možnost Přehled a podržte ji."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"NE, DĚKUJI"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"SPUSTIT"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Obrazovka připnuta"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index c2481de..1543eee 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"ændre dit eget kontaktkort"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Tillader, at appen kan ændre eller tilføje oplysninger i din personlige profil, der er gemt på din enhed, f.eks. dit navn eller dine kontaktoplysninger. Dette betyder, at andre apps kan identificere dig og sende profiloplysninger til andre."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"kropssensorer (f.eks. pulsmålere)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Tillader, at appen får adgang til data fra sensorer, du bruger til at måle, hvad der sker inde i din krop, f.eks. din puls."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Giver appen adgang til data fra sensorer, der overvåger din fysiske tilstand, f.eks. din puls."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"læse din sociale strøm"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Tillader, at appen kan få adgang til og synkronisere sociale opdateringer fra dig og dine venner. Vær forsigtig, når du deler oplysninger – med denne tilladelse kan appen læse kommunikation mellem dig og dine venner på sociale netværk, uanset fortrolighed. Bemærk! Denne tilladelse håndhæves muligvis ikke på alle sociale netværk."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"skrive i din sociale strøm"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 780c0b9..6aad289 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"Ihre Kontaktkarten ändern"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Ermöglicht der App, auf Ihrem Gerät gespeicherte personenbezogene Profildaten zu ändern, einschließlich Ihres Namens und Ihrer Kontaktdaten, sowie Daten hinzuzufügen. Die App kann Sie so identifizieren und Ihre Profildaten an andere senden."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"Körpersensoren (wie Herzfrequenzmesser)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Ermöglicht der App den Zugriff auf Daten von Sensoren, mit denen Ihre Vitalfunktionen, etwa die Herzfrequenz, gemessen werden."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Ermöglicht der App, auf Daten von Sensoren zuzugreifen, die Ihre körperliche Verfassung überwachen, beispielsweise Ihre Herzfrequenz"</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"In sozialem Stream lesen"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Ermöglicht der App, auf Updates aus sozialen Netzwerken von Ihnen und Ihren Freunden zuzugreifen und diese zu synchronisieren. Seien Sie vorsichtig, wenn Sie Informationen teilen: Der App wird erlaubt, die Kommunikation zwischen Ihnen und Ihren Freunden in sozialen Netzwerken zu lesen, unabhängig von der Vertraulichkeit der kommunizierten Informationen. Hinweis: Diese Berechtigung kann möglicherweise nicht in allen sozialen Netzwerken erzwungen werden."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"In sozialem Stream schreiben"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index f02cac1..c86d4a3 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"τροποποίηση κάρτας επαφής"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Επιτρέπει στην εφαρμογή την αλλαγή ή την προσθήκη προσωπικών πληροφοριών προφίλ οι οποίες είναι αποθηκευμένες στη συσκευή σας, όπως το όνομα και τα στοιχεία επικοινωνίας σας. Αυτό σημαίνει ότι η εφαρμογή μπορεί να σας αναγνωρίσει και να στείλει τις πληροφορίες του προφίλ σας σε άλλα άτομα."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"αισθητήρες λειτουργιών (π.χ. καρδιακό ρυθμό)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Επιτρέπει στην εφαρμογή την πρόσβαση στα δεδομένα από τους αισθητήρες που χρησιμοποιείτε για να παρακολουθείτε τις εσωτερικές λειτουργίες σας, όπως τον καρδιακό ρυθμό."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Επιτρέπει στην εφαρμογή να αποκτήσει πρόσβαση στα δεδομένα των αισθητήρων που παρακολουθούν τη φυσική σας κατάσταση, όπως τον καρδιακό ρυθμό σας."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"διαβάστε τη ροή σας κοινωνικών δικτύων"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Επιτρέπει στην εφαρμογή την πρόσβαση και το συγχρονισμό κοινωνικών ενημερώσεων από εσάς και τους φίλους σας. Θα πρέπει να είστε προσεκτικοί όταν μοιράζεστε πληροφορίες -- αυτό δίνει τη δυνατότητα στην εφαρμογή να διαβάζει τις επικοινωνίες ανάμεσα σε εσάς και τους φίλους σας σε κοινωνικά δίκτυα, ανεξάρτητα από το επίπεδο εμπιστευτικότητας. Σημείωση: αυτή η άδεια ίσως να μην μπορεί να εφαρμοστεί σε όλα τα κοινωνικά δίκτυα."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"γράψτε στη ροή σας κοινωνικών δικτύων"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index ccf4ffa..fa1d952 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"modify your own contact card"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Allows the app to change or add to personal profile information stored on your device, such as your name and contact information. This means that the app can identify you and may send your profile information to others."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"body sensors (like heart rate monitors)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Allows the app to access data from sensors that you use to measure what’s happening inside your body, such as heart rate."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Allows the app to access data from sensors that monitor your physical condition, such as your heart rate."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"read your social stream"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Allows the app to access and sync social updates from you and your friends. Be careful when sharing information - this allows the app to read communications between you and your friends on social networks, regardless of confidentiality. Note: this permission may not be enforced on all social networks."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"write to your social stream"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index ccf4ffa..fa1d952 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"modify your own contact card"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Allows the app to change or add to personal profile information stored on your device, such as your name and contact information. This means that the app can identify you and may send your profile information to others."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"body sensors (like heart rate monitors)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Allows the app to access data from sensors that you use to measure what’s happening inside your body, such as heart rate."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Allows the app to access data from sensors that monitor your physical condition, such as your heart rate."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"read your social stream"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Allows the app to access and sync social updates from you and your friends. Be careful when sharing information - this allows the app to read communications between you and your friends on social networks, regardless of confidentiality. Note: this permission may not be enforced on all social networks."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"write to your social stream"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index bf39973..9e0d284 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"modif. tarjeta contacto propia"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Permite que la aplicación modifique la información del perfil personal almacenada en el dispositivo, como el nombre o la información de contacto, o que agregue contenido a esa información. Esto significa que puede identificarte y enviar la información de tu perfil a otros usuarios."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"sensores corporales (frec. card)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Permite que la aplicación acceda a datos de sensores que utilizas para medir lo que sucede en tu cuerpo, como la frecuencia cardíaca."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Permite que la aplicación acceda a datos de sensores que controlan tu condición física, como el ritmo cardíaco."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"Lectura de tu muro social"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Permite que la aplicación acceda a las actualizaciones de tus redes sociales y las de tus amigos, y que las sincronice. Ten cuidado al compartir información, ya que la aplicación puede utilizar este permiso para leer las conversaciones que tengas con tus amigos en las redes sociales sin tener en cuenta si son confidenciales. Nota: Este permiso no se puede utilizar en todas las redes sociales."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"Escritura en tu muro social"</string>
@@ -1757,12 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> seleccionado"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> borrado"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> de trabajo"</string>
- <string name="lock_to_app_toast" msgid="7570091317001980053">"Para dejar de fijar esta pantalla, mantén presionados los botones para volver y Descripción general al mismo tiempo."</string>
- <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Para dejar de fijar esta pantalla, mantén presionado el botón Descripción general."</string>
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Para dejar de fijar esta pantalla, mantén presionados los botones para volver y Recientes al mismo tiempo."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Para dejar de fijar esta pantalla, mantén presionado el botón Recientes."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"La pantalla está fija. La organización no permite dejar de fijar la pantalla."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"¿Utilizar función para fijar la pantalla?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"La función para fijar la pantalla bloquea la pantalla en una vista única.\n\nPara dejar de fijar la pantalla, mantén presionados los botones para volver y Descripción general al mismo tiempo."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"La función para fijar la pantalla bloquea la pantalla en una vista única.\n\nPara dejar de fijar la pantalla, mantén presionado el botón Descripción general."</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"La función para fijar la pantalla bloquea la pantalla en una vista única.\n\nPara dejar de fijar la pantalla, mantén presionados los botones para volver y Recientes al mismo tiempo."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"La función para fijar la pantalla bloquea la pantalla en una vista única.\n\nPara dejar de fijar la pantalla, mantén presionado el botón Recientes."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"NO, GRACIAS"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"INICIAR"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fija"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index c85c9b7..26fa299 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"modificar tu propia tarjeta de contacto"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Permite que la aplicación modifique la información del perfil personal almacenada en el dispositivo (como el nombre o la información de contacto) o que añada contenido a esa información, lo que significa que puede identificar al usuario y enviar la información de su perfil a otros usuarios."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"sens. corp. (mon. frec. card.)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Permite que la aplicación acceda a datos de sensores que utilizas para medir lo que sucede en tu cuerpo, como la frecuencia cardíaca."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Permite que la aplicación acceda a datos de sensores que controlan tu condición física, como la frecuencia cardíaca."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"consulta tu actividad social"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Permite que la aplicación acceda a novedades de redes sociales tuyas y de tus amigos y las sincronice. Ten cuidado al compartir información, ya que la aplicación puede utilizar este permiso para leer conversaciones privadas con tus amigos en las redes sociales sin tener en cuenta si son confidenciales. Nota: este permiso no se puede utilizar en todas las redes sociales."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"escribir en tu actividad social"</string>
@@ -1757,12 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> seleccionado"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> eliminado"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> de trabajo"</string>
- <string name="lock_to_app_toast" msgid="7570091317001980053">"Para desactivar esta pantalla, mantén pulsados los botones de retroceso e información general al mismo tiempo."</string>
- <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Para desactivar esta pantalla, mantén pulsado el botón de información general."</string>
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Para desactivar esta pantalla, mantén pulsados los botones de retroceso y Visión general al mismo tiempo."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Para desactivar esta pantalla, mantén pulsado Visión general."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Se ha activado la pantalla. Tu organización no puede desactivarla."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"¿Quieres fijar esta pantalla?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Si activas la pantalla, esta se bloqueará en una vista única.\n\nPara desactivarla, mantén pulsados los botones de retroceso e información general al mismo tiempo."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Si activas la pantalla, esta se bloqueará en una vista única.\n\nPara desactivarla, mantén pulsado el botón de información general."</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Si activas la pantalla, esta se bloqueará en una vista única.\n\nPara desactivarla, mantén pulsados los botones de retroceso y Visión general al mismo tiempo."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Si activas la pantalla, esta se bloqueará en una vista única.\n\nPara desactivarla, mantén pulsado el botón Visión general."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"NO, GRACIAS"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"INICIAR"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fijada"</string>
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index cb962c6..31346a6 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"muutke oma kontaktikaarti"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Võimaldab rakendusel muuta või lisada seadmesse salvestatud isiklikku profiiliteavet, näiteks teie nime ja kontaktteavet. See tähendab, et rakendus saab teid tuvastada ja saata teie profiiliteavet teistele."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"kehaandurid (nt pulsilugeja)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Lubab rakendusel saada juurdepääsu selliste andurite andmetele, mida kasutate kehas toimuva (nt pulsi) mõõtmiseks."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Lubab rakendusel hankida juurdepääsu andmetele anduritest, mis jälgivad teie füüsilist seisundit, nt südame löögisagedust."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"Sotsiaalvoo lugemine"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Annab rakendusele juurdepääsu ja võimaldab sünkroonida teie ja teie sõprade sotsiaalseid värskendusi. Olge teabe jagamisel ettevaatlik – see võimaldab rakendusel lugeda teie suhtlusi sõpradega suhtlusvõrgustikes konfidentsiaalsusest hoolimata. Märkus: see luba ei pruugi jõustuda kõigis suhtlusvõrgustikes."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"Sotsiaalvoogu kirjutamine"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> on valitud"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> on kustutatud"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Töö <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Ekraanikuva vabastamiseks puudutage pikalt samal ajal nuppe Tagasi ja Ülevaade."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Ekraanikuva vabastamiseks puudutage pikalt nuppu Ülevaade."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Ekraan on kinnitatud. Teie organisatsioon ei luba vabastamist."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Kas kasutada ekraani kinnitamist?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_title" msgid="1682643873107812874">"Kas kasutada ekraanikuva kinnitamist?"</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Ekraanikuva kinnitamine lukustab ekraani ühele vaatele.\n\nVabastamiseks puudutage pikalt samal ajal nuppe Tagasi ja Ülevaade."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Ekraanikuva kinnitamine lukustab ekraani ühele vaatele.\n\nVabastamiseks puudutage pikalt nuppu Ülevaade."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"TÄNAN, EI"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"KÄIVITA"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekraan on kinnitatud"</string>
diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml
index 1ff59e4f..a05e9c6 100644
--- a/core/res/res/values-eu-rES/strings.xml
+++ b/core/res/res/values-eu-rES/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"zeure kontaktu-txartela aldatzea"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Gailuan gordetako profil pertsonalaren informazioa aldatzeko baimena ematen dio; esaterako, zure izena eta harremanetan jartzeko informazioa. Horrek esan nahi du aplikazioak identifikatu egin zaitzakeela eta zure profil-informazioa besteei bidal diezaiekeela."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"Gorputzaren sentsoreak (adibidez, bihotz-erritmoaren monitoreak)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Zure gorputzaren barnean gertatzen ari dena (adibidez, bihotz-erritmoa) neurtzeko sentsoreen datuak atzitzea baimentzen die aplikazioei."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Zure egoera fisikoa kontrolatzen duten sentsoreetako datuak (adibidez, maiztasun kardiakoa) atzitzea baimentzen die aplikazioei."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"irakurri sare sozialetako korronteak"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Zure eta zure lagunen sare sozialetako eguneratzeak atzitzeko baimena ematen die aplikazioei. Kontuz partekatu informazioa; baimen honekin aplikazioak zure eta zure lagunen arteko sare sozialetako komunikazioak irakur ditzake, isilpekotasuna kontuan izan gabe. Oharra: baliteke baimen hori sare sozial guztiek ez aplikatzea."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"idatzi sare sozialetako korronteetan"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index b66d0ae..615d1e4 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"اصلاح کارت تماس شما"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"به برنامه اجازه میدهد تا اطلاعات نمایه شخصی ذخیره شده در دستگاه شما، مانند نام و اطلاعات تماس شما را تغییر دهد یا اضافه کند. یعنی برنامه میتواند شما را شناسایی کند و ممکن است اطلاعات نمایهٔ شما را برای دیگران ارسال کند."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"حسگرهای بدن (مانند پایشگرهای ضربان قلب)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"به برنامه امکان میدهد به اطلاعات حسگرهایی که استفاده میکنید، دسترسی پیدا کند تا اندازهگیریهای مربوط به آنچه که درون بدنتان رخ میدهد، مانند ضربان قلب، را انجام دهد."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"به برنامه امکان میدهد به اطلاعات حسگرهایی که بر شرایط فیزیکی شما مانند ضربان قلبتان، نظارت دارند، دسترسی داشته باشد."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"خواندن جریان اجتماعی شما"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"به برنامه اجازه میدهد به بهروزرسانیهای اجتماعی از طرف شما و دوستان شما دسترسی پیدا کرده و آنها را همگامسازی کند. دقت کنید که هنگام اشتراکگذاری -- این ویژگی به برنامه اجازه میدهد ارتباطات بین شما و دوستان شما را در شبکههای اجتماعی، صرفنظر از محرمانه بودن آنها بخواند. توجه: این مجوز ممکن است در همه شبکههای اجتماعی اجرا نشود."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"نوشتن در جریان اجتماعی شما"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 3c1788f..7566ec6 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"muokkaa omia yhteystietoja"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Antaa sovelluksen muuttaa laitteelle tallennettuja henkilökohtaisia tietoja, kuten nimeä ja yhteystietoja, tai lisätä niitä. Sovellus voi tunnistaa sinut ja lähettää profiilitietojasi muille."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"kehon anturit (kuten sykemittarit)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Antaa sovelluksen käyttää tietoja antureista, joita käytetään kehon toimintojen kuten sykkeen mittaamiseen."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Antaa sovelluksen käyttää kehosi tilaa seuraavien anturien tietoja, esimerkiksi sykettä."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"lue sosiaalista streamia"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Antaa sovelluksen käyttää ja synkronoida sinun tai kavereidesi päivityksiä sosiaalisista palveluista. Mieti tarkkaan ennen tietojen jakamista: tämän luvan saaneet sovellukset voivat lukea sinun ja kavereidesi välisiä viestejä sosiaalisissa verkkopalveluissa huolimatta viestien arkaluonteisuudesta. Huom: tätä lupaa ei saa ottaa käyttöön kaikissa sosiaalisissa verkkopalveluissa."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"kirjoita sosiaaliseen streamiin"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> on valittu"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> poistettiin"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (työ)"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Poista näytön kiinnitys painamalla Edellinen- ja Viimeisimmät-kohtaa samanaikaisesti pitkään."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Poista näytön kiinnitys painamalla Viimeisimmät-kohtaa pitkään."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Näyttö on kiinnitetty. Irrottaminen ei ole sallittu organisaatiossasi."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Käytetäänkö näytön kiinnitystä?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Näytön kiinnitys lukitsee näytön yhteen näkymään.\n\nVoit poistaa kiinnityksen painamalla Edellinen- ja Viimeisimmät-kohtaa samanaikaisesti pitkään."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Näytön lukitus lukitsee näytön yhteen näkymään.\n\nVoit poistaa kiinnityksen painamalla Viimeisimmät-kohtaa pitkään."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"EI KIITOS"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"ALOITA"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Näyttö kiinnitetty"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index d3586cc..45ceddee 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"modifier votre fiche de contact"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Permet à l\'application de modifier les données de profil enregistrées sur votre appareil, telles que votre nom et vos coordonnées, ou d\'en ajouter. Elle peut alors vous identifier et envoyer vos données de profil à des tiers."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"capteurs corporels (tels que les moniteurs de fréquence cardiaque)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Permet à l\'application d\'accéder aux données des capteurs utilisés pour mesurer des valeurs physiologiques, telles que votre fréquence cardiaque."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Permet à l\'application d\'accéder aux données des capteurs qui surveillent votre condition physique, comme votre rythme cardiaque."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"lire les flux de réseaux sociaux"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Permet à l\'application d\'accéder à vos mises à jour sur les réseaux sociaux, ainsi qu\'à celles de vos amis, et de les synchroniser. Soyez prudent lorsque vous partagez de l\'information. Cette autorisation permet à l\'application de lire les communications entre vous et vos amis sur les réseaux sociaux, indépendamment de leur caractère confidentiel. Remarque : Il est possible que cette autorisation ne soit pas appliquée sur tous les réseaux sociaux."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"modifier vos flux de réseaux sociaux"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"« <xliff:g id="ITEM">%1$s</xliff:g> » a été sélectionné"</string>
<string name="deleted_key" msgid="7659477886625566590">"« <xliff:g id="KEY">%1$s</xliff:g> » a été supprimé"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (travail)"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Pour annuler l\'épinglage de cet écran, appuyez de manière prolongée sur Retour et Aperçu simultanément."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Pour annuler l\'épinglage, appuyez de manière prolongée sur Aperçu."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"L\'écran est épinglé. Votre organisation n\'autorise pas l\'annulation d\'épinglage."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Utiliser l\'épinglage d\'écran?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Lorsque vous épinglez l\'écran, celui-ci n\'affiche plus qu\'une seule vue.\n\nPour annuler l\'épinglage, appuyez de manière prolongée sur Retour et Aperçu simultanément."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Lorsque vous épinglez l\'écran, celui-ci n\'affiche plus qu\'une seule vue.\n\nPour annuler l\'épinglage, appuyez de manière prolongée sur Aperçu."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"NON, MERCI"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"COMMENCER"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Écran épinglé"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 1fee667..627d2db 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"modifier votre fiche de contact"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Permet à l\'application de modifier les informations de profil stockées sur votre appareil, telles que votre nom et vos coordonnées, ou d\'en ajouter. Elle peut alors vous identifier et envoyer vos informations de profil à des tiers."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"capteurs corporels (tels que les cardiofréquencemètres)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Permet à l\'application d\'accéder aux données des capteurs utilisés pour mesurer des valeurs physiologiques, telles que votre fréquence cardiaque."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Permet à l\'application d\'accéder aux données des capteurs qui contrôlent votre condition physique, comme votre rythme cardiaque."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"lire votre flux de réseau social"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Permet à l\'application d\'accéder à vos mises à jour sur les réseaux sociaux, ainsi qu\'à celles de vos amis, et de les synchroniser. Soyez prudent lorsque vous partagez des informations. Cette autorisation permet à l\'application de lire les communications entre vous et vos amis sur les réseaux sociaux, indépendamment de leur caractère confidentiel. Remarque : il est possible que cette autorisation ne soit pas appliquée sur tous les réseaux sociaux."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"écrire sur votre flux social"</string>
@@ -1757,12 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"\"<xliff:g id="ITEM">%1$s</xliff:g>\" sélectionné"</string>
<string name="deleted_key" msgid="7659477886625566590">"\"<xliff:g id="KEY">%1$s</xliff:g>\" supprimé"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (travail)"</string>
- <string name="lock_to_app_toast" msgid="7570091317001980053">"Pour annuler l\'épinglage, appuyez de manière prolongée et simultanée sur \"Retour\" et \"Vue d\'ensemble\"."</string>
- <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Pour annuler l\'épinglage, appuyez de manière prolongée sur \"Vue d\'ensemble\"."</string>
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Pour annuler l\'épinglage, appuyez de manière prolongée et simultanée sur \"Retour\" et \"Aperçu\"."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Pour annuler l\'épinglage, appuyez de manière prolongée sur \"Aperçu\"."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"L\'écran est épinglé. L\'annulation de l\'épinglage n\'est pas autorisée par votre organisation."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Utiliser l\'épinglage d\'écran ?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Lorsque vous épinglez l\'écran, celui-ci n\'affiche plus qu\'une seule vue.\n\nPour annuler l\'épinglage, appuyez de manière prolongée et simultanée sur \"Retour\" et \"Vue d\'ensemble\"."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Lorsque vous épinglez l\'écran, celui-ci n\'affiche plus qu\'une seule vue.\n\nPour annuler l\'épinglage, appuyez de manière prolongée sur \"Vue d\'ensemble\"."</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Lorsque vous épinglez l\'écran, celui-ci n\'affiche plus qu\'une seule vue.\n\nPour annuler l\'épinglage, appuyez de manière prolongée et simultanée sur \"Retour\" et \"Aperçu\"."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Lorsque vous épinglez l\'écran, celui-ci n\'affiche plus qu\'une seule vue.\n\nPour annuler l\'épinglage, appuyez de manière prolongée sur \"Aperçu\"."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"NON, MERCI"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"ACTIVER"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Écran épinglé."</string>
diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml
index ed321e6..6e910d8 100644
--- a/core/res/res/values-gl-rES/strings.xml
+++ b/core/res/res/values-gl-rES/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"modificar tarxeta de contacto"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Permite á aplicación cambiar ou engadir á información do perfil persoal almacenada no teu dispositivo, como o teu nome e información de contacto. Isto significa que a aplicación pode identificarte e enviar a información do teu perfil a outros usuarios."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"sensores de corpo (como monitores de ritmo cardíaco)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Permite á aplicación acceder a datos de sensores que utilizas para medir o que está pasando dentro do teu corpo, como o ritmo cardíaco."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Permite que a aplicación acceda aos datos dos sensores que controlan o teu estado físico, como o ritmo cardíaco."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"ler a túa actividade social"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Permite á aplicación acceder ás túas actualizacións nas redes sociais, e sincronizalas, e ás dos teus amigos. Ten coidado ao compartir información (esta acción permite á aplicación ler comunicacións entre ti e os teus amigos efectuadas a través das redes sociais, independentemente da súa confidencialidade). Nota: É posible que este permiso non se execute en todas as redes sociais."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"escribir na túa actividade social"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> seleccionado"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> eliminado"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> do traballo"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Para soltar a pantalla, mantén premido Atrás e Visión xeral ao mesmo tempo."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Para soltar a pantalla, mantén premido Visión xeral."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"A pantalla está fixada. A túa organización non permite desactivar a pantalla."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Queres usar a fixación de pantalla?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"A fixación de pantalla bloquea a pantalla nunha única vista.\n\nPara soltar a pantalla, mantén premido Atrás e Visión xeral ao mesmo tempo."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"A fixación de pantalla bloquea a pantalla nunha única vista.\n\nPara soltar a pantalla, mantén premido e Visión xeral."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"NON, GRAZAS"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"SI"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fixada"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 60e7930..66670f2 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -43,7 +43,7 @@
<string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
<string name="emptyPhoneNumber" msgid="7694063042079676517">"(कोई फ़ोन नंबर नहीं)"</string>
<string name="unknownName" msgid="2277556546742746522">"(अज्ञात)"</string>
- <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"ध्वनिमेल"</string>
+ <string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"वॉयस मेल"</string>
<string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
<string name="mmiError" msgid="5154499457739052907">"कनेक्शन समस्या या अमान्य MMI कोड."</string>
<string name="mmiFdnError" msgid="5224398216385316471">"कार्रवाई केवल फ़िक्स्ड डायलिंग नंबर के लिए प्रतिबंधित है."</string>
@@ -221,7 +221,7 @@
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"बुकमार्क और ब्राउज़र इतिहास पर सीधी पहुंच."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"अलार्म"</string>
<string name="permgroupdesc_deviceAlarms" msgid="4769356362251641175">"अलार्म घड़ी सेट करें."</string>
- <string name="permgrouplab_voicemail" msgid="4162237145027592133">"ध्वनिमेल"</string>
+ <string name="permgrouplab_voicemail" msgid="4162237145027592133">"वॉयस मेल"</string>
<string name="permgroupdesc_voicemail" msgid="2498403969862951393">"ध्वनिमेल पर सीधी पहुंच."</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"माइक्रोफ़ोन"</string>
<string name="permgroupdesc_microphone" msgid="7106618286905738408">"ऑडियो रिकॉर्ड करने के लिए माइक्रोफ़ोन पर सीधी पहुंच."</string>
@@ -286,8 +286,8 @@
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"ऐप्स को आपके डिवाइस द्वारा प्राप्त सेल प्रसारण संदेशों को पढ़ने देता है. कुछ स्थानों पर आपको आपातकालीन स्थितियों की चेतावनी देने के लिए सेल प्रसारण अलर्ट वितरित किए जाते हैं. आपातकालीन सेल प्रसारण प्राप्त होने पर दुर्भावनापूर्ण ऐप्स आपके डिवाइस के निष्पादन या संचालन में हस्तक्षेप कर सकते हैं."</string>
<string name="permlab_sendSms" msgid="5600830612147671529">"SMS संदेश भेजें"</string>
<string name="permdesc_sendSms" msgid="7094729298204937667">"ऐप्स को SMS संदेशों को भेजने देता है. इसके परिणामस्वरूप अप्रत्याशित शुल्क लागू हो सकते हैं. दुर्भावनापूर्ण ऐप्स आपकी पुष्टि के बिना संदेश भेजकर आपका धन व्यय कर सकते हैं."</string>
- <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"संदेश-द्वारा-जवाब भेजें ईवेंट"</string>
- <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"इनकमिंग कॉल के संदेश-द्वारा-जवाब देने के ईवेंट प्रबंधित करने के लिए, ऐप्स को अन्य संदेश सेवा ऐप्स को अनुरोध भेजने देती है."</string>
+ <string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"संदेश-द्वारा-उत्तर भेजें ईवेंट"</string>
+ <string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"इनकमिंग कॉल के संदेश-द्वारा-उत्तर देने के ईवेंट प्रबंधित करने के लिए, ऐप्स को अन्य संदेश सेवा ऐप्स को अनुरोध भेजने देती है."</string>
<string name="permlab_readSms" msgid="8745086572213270480">"अपने लेख संदेश (SMS या MMS) पढ़ें"</string>
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"ऐप्स को आपके टेबलेट या सिम कार्ड में संग्रहीत SMS संदेश पढ़ने देता है. इससे सामग्री या गोपनीयता पर ध्यान दिए बिना, ऐप्स सभी SMS संदेश पढ़ सकता है."</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"ऐप्स को आपके फ़ोन या सिम कार्ड में संग्रहीत SMS संदेश पढ़ने देता है. इससे सामग्री या गोपनीयता पर ध्यान दिए बिना, ऐप्स सभी SMS संदेश पढ़ सकता है."</string>
@@ -372,7 +372,7 @@
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"ऐप्स को ऐप्स कार्यवाही के एकत्रित आंकड़े बदलने देता है. सामान्य ऐप्स के द्वारा उपयोग करने के लिए नहीं."</string>
<string name="permlab_backup" msgid="470013022865453920">"सिस्टम सुरक्षा नियंत्रित और पुनर्स्थापित करें"</string>
<string name="permdesc_backup" msgid="6912230525140589891">"ऐप्स को सिस्टम के बैकअप को नियंत्रित और क्रियाविधि को पुर्नस्थापित करने देता है. सामान्य ऐप्स द्वारा उपयोग करने के लिए नहीं."</string>
- <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"पूर्ण सुरक्षा या पुनर्स्थापना कार्यवाही की पुष्टि करें"</string>
+ <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"पूर्ण सुरक्षा या पुनर्स्थापना कार्यवाही की दुबारा पूछें"</string>
<string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"ऐप्स को पूर्ण बैकअप पुष्टिकरण UI लॉन्च करने देता है. किसी ऐप्स द्वारा उपयोग के लिए नहीं."</string>
<string name="permlab_internalSystemWindow" msgid="2148563628140193231">"अनधिकृत विंडो दिखाएं"</string>
<string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"किसी ऐप्स को ऐसी विंडो बनाने देता है जिनका उपयोग आंतरिक सिस्टम उपयोगकर्ता इंटरफ़ेस द्वारा किया जाना है. सामान्य ऐप्स द्वारा उपयोग करने के लिए नहीं."</string>
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"स्वयं का संपर्क कार्ड बदलें"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"ऐप्स को आपके डिवाइस में संग्रहीत निजी प्रोफ़ाइल जानकारी, जैसे आपका नाम और संपर्क जानकारी को बदलने या उसमें कुछ जोड़ने देता है. इसका अर्थ है कि ऐप्स आपको पहचान सकता है और आपकी प्रोफ़ाइल जानकारी अन्य लोगों को भेज सकता है."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"बॉडी सेंसर (जैसे हृदय गति मॉनीटर)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"ऐप्लिकेशन को ऐसे सेंसर का डेटा एक्सेस करने देती है जिनका उपयोग आप यह मापने के लिए करते हैं कि आपके शरीर के भीतर क्या चल रहा है, जैसे हृदय गति."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"ऐप को आपकी शारीरिक स्थिति, जैसे आपकी हृदय गति पर नज़र रखने वाले संवेदकों का डेटा एक्सेस करने देती है."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"अपनी सामाजिक स्ट्रीम पढ़ें"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"एप को आपके और आपके मित्रों की नई सामाजिक जानकारी तक पहुंचने और उन्हें समन्वयित करने देता है. जानकारी साझा करते समय सावधान रहें - इससे गोपनीयता पर ध्यान दिए बिना, एप सामाजिक नेटवर्क पर आपके और आपके मित्रों के बीच संचारों को पढ़ सकता है. ध्यान दें: यह अनुमति सभी सामाजिक नेटवर्क पर लागू नहीं की जा सकती."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"सामाजिक स्ट्रीम में लिखें"</string>
@@ -902,8 +902,8 @@
<string name="lockscreen_emergency_call" msgid="5347633784401285225">"आपातकालीन कॉल"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"कॉल पर वापस लौटें"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"सही!"</string>
- <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"पुनः प्रयास करें"</string>
- <string name="lockscreen_password_wrong" msgid="5737815393253165301">"पुनः प्रयास करें"</string>
+ <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"फिर से प्रयास करें"</string>
+ <string name="lockscreen_password_wrong" msgid="5737815393253165301">"फिर से प्रयास करें"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"फेस अनलॉक के अधिकतम प्रयासों की सीमा पार हो गई"</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"कोई सिम कार्ड नहीं है"</string>
<string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"टेबलेट में कोई सिम कार्ड नहीं है."</string>
@@ -927,7 +927,7 @@
<string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"सिम कार्ड अनलॉक कर रहा है…"</string>
<string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"आपने अपना अनलॉक आकार <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="2725973286239344555">"आपने अपना पासवर्ड <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="6216672706545696955">"आपने अपना पिन <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="6216672706545696955">"आपने अपना पिन <xliff:g id="NUMBER_0">%d</xliff:g> बार गलत तरीके से लिखा है. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> सेकंड में फिर से प्रयास करें."</string>
<string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"आपने अपना अनलॉक आकार <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"आपने अपना अनलॉक आकार <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"आप गलत तरीके से टेबलेट को अनलॉक करने का प्रयास <xliff:g id="NUMBER_0">%d</xliff:g> बार कर चुके हैं. <xliff:g id="NUMBER_1">%d</xliff:g> और असफल प्रयास के बाद, टेबलेट फ़ैक्टरी डिफ़ॉल्ट पर रीसेट हो जाएगा और सभी उपयोगकर्ता डेटा खो जाएगा."</string>
@@ -962,8 +962,8 @@
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"स्थिति"</string>
<string name="keyguard_accessibility_camera" msgid="8904231194181114603">"कैमरा"</string>
<string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"मीडिया नियंत्रण"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"विजेट पुनः क्रमित करना प्रारंभ."</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"विजेट पुनः क्रमित करना समाप्त."</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"विजेट फिर से क्रमित करना प्रारंभ."</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"विजेट फिर से क्रमित करना समाप्त."</string>
<string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"विजेट <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> को हटा दिया गया."</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"अनलॉक क्षेत्र विस्तृत करें."</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"स्लाइड अनलॉक."</string>
@@ -988,11 +988,11 @@
<string name="factorytest_reboot" msgid="6320168203050791643">"रीबूट करें"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"\'<xliff:g id="TITLE">%s</xliff:g>\' पर यह पृष्ठ दर्शाता है:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
- <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"मार्गदर्शक की पुष्टि करें"</string>
+ <string name="js_dialog_before_unload_title" msgid="2619376555525116593">"मार्गदर्शक की दुबारा पूछें"</string>
<string name="js_dialog_before_unload_positive_button" msgid="3112752010600484130">"इस पृष्ठ से आगे बढ़ें"</string>
<string name="js_dialog_before_unload_negative_button" msgid="5614861293026099715">"इस पृष्ठ पर बने रहें"</string>
<string name="js_dialog_before_unload" msgid="3468816357095378590">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nक्या आप वाकई इस पृष्ठ से दूर नेविगेट करना चाहते हैं?"</string>
- <string name="save_password_label" msgid="6860261758665825069">"पुष्टि करें"</string>
+ <string name="save_password_label" msgid="6860261758665825069">"दुबारा पूछें"</string>
<string name="double_tap_toast" msgid="4595046515400268881">"युक्ति: ज़ूम इन और आउट करने के लिए डबल-टैप करें."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"स्वत: भरण"</string>
<string name="setup_autofill" msgid="7103495070180590814">"स्वत: भरण सेट करें"</string>
@@ -1019,12 +1019,12 @@
<string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"ऐप्स को आपके फ़ोन में संग्रहीत ब्राउज़र के इतिहास या बुकमार्क को संशोधित करने देता है. इससे ऐप्स ब्राउज़र डेटा को मिटा सकता है या संशोधित कर सकता है. ध्यान दें: यह अनुमति तृतीय-पक्ष ब्राउज़र या वेब ब्राउज़िंग क्षमताओं वाले अन्य ऐप्स द्वारा लागू नहीं की जा सकती."</string>
<string name="permlab_setAlarm" msgid="1379294556362091814">"अलार्म सेट करें"</string>
<string name="permdesc_setAlarm" msgid="316392039157473848">"ऐप्स को इंस्टॉल किए गए अलार्म घड़ी ऐप्स में अलार्म सेट करने देता है. हो सकता है कुछ अलार्म घड़ी ऐप्स में यह सुविधा न हो."</string>
- <string name="permlab_writeVoicemail" msgid="7309899891683938100">"ध्वनिमेल लिखें"</string>
- <string name="permdesc_writeVoicemail" msgid="6592572839715924830">"ऐप्स को आपके ध्वनिमेल इनबॉक्स के संदेशों को बदलने और निकालने देती है."</string>
+ <string name="permlab_writeVoicemail" msgid="7309899891683938100">"वॉयस मेल लिखें"</string>
+ <string name="permdesc_writeVoicemail" msgid="6592572839715924830">"ऐप्स को आपके वॉयस मेल इनबॉक्स के संदेशों को बदलने और निकालने देती है."</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"ध्वनिमेल जोड़ें"</string>
<string name="permdesc_addVoicemail" msgid="6604508651428252437">"ऐप्स को आपके ध्वनिमेल इनबॉक्स में संदेश जोड़ने देता है."</string>
- <string name="permlab_readVoicemail" msgid="8415201752589140137">"ध्वनिमेल पढ़ें"</string>
- <string name="permdesc_readVoicemail" msgid="8926534735321616550">"ऐप्स को आपका ध्वनिमेल पढ़ने देती है."</string>
+ <string name="permlab_readVoicemail" msgid="8415201752589140137">"वॉयस मेल पढ़ें"</string>
+ <string name="permdesc_readVoicemail" msgid="8926534735321616550">"ऐप्स को आपका वॉयस मेल पढ़ने देती है."</string>
<string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"ब्राउज़र भौगोलिक-स्थान अनुमतियों को बदलें"</string>
<string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"ऐप्स को ब्राउज़र के भौगोलिक-स्थान की अनुमतियां संशोधित करने देता है. दुर्भावनापूर्ण ऐप्स इसका उपयोग एकपक्षीय वेबसाइट को स्थान जानकारी भेजने में कर सकते हैं."</string>
<string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"पैकेज सत्यापित करें"</string>
@@ -1181,7 +1181,7 @@
<string name="editTextMenuTitle" msgid="4909135564941815494">"लेख क्रियाएं"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"मेमोरी स्थान समाप्त हो रहा है"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"हो सकता है कुछ सिस्टम फ़ंक्शन कार्य न करें"</string>
- <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"सिस्टम के लिए पर्याप्त मेमोरी नहीं है. सुनिश्चित करें कि आपके पास 250MB का खाली स्थान है और पुनः प्रारंभ करें."</string>
+ <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"सिस्टम के लिए पर्याप्त मेमोरी नहीं है. सुनिश्चित करें कि आपके पास 250MB का खाली स्थान है और फिर से प्रारंभ करें."</string>
<string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> चल रहा है"</string>
<string name="app_running_notification_text" msgid="4653586947747330058">"अधिक जानकारी के लिए या ऐप्स रोकने के लिए स्पर्श करें."</string>
<string name="ok" msgid="5970060430562524910">"ठीक है"</string>
@@ -1485,7 +1485,7 @@
<string name="sync_too_many_deletes" msgid="5296321850662746890">"हटाने की सीमा पार हो गई"</string>
<string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> खाते के <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> आइटम हटा दिए गए हैं. आप क्या करना चाहते हैं?"</string>
<string name="sync_really_delete" msgid="2572600103122596243">"आइटम हटाएं"</string>
- <string name="sync_undo_deletes" msgid="2941317360600338602">"हटाए गए को पूर्ववत करें"</string>
+ <string name="sync_undo_deletes" msgid="2941317360600338602">"हटाए गए को वापस लाएं"</string>
<string name="sync_do_nothing" msgid="3743764740430821845">"फिलहाल कुछ न करें"</string>
<string name="choose_account_label" msgid="5655203089746423927">"कोई खाता चुनें"</string>
<string name="add_account_label" msgid="2935267344849993553">"कोई खाता जोड़ें"</string>
@@ -1531,7 +1531,7 @@
<string name="storage_usb" msgid="3017954059538517278">"USB मेमोरी"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"संपादित करें"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"डेटा उपयोग की चेतावनी"</string>
- <string name="data_usage_warning_body" msgid="2814673551471969954">"उपयोग व सेटिंग देखने हेतु स्पर्श करें."</string>
+ <string name="data_usage_warning_body" msgid="2814673551471969954">"उपयोग व सेटिंग देखने के लिए स्पर्श करें."</string>
<string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G डेटा सीमा पूर्ण हो गई"</string>
<string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G डेटा सीमा पूर्ण हो गई"</string>
<string name="data_usage_mobile_limit_title" msgid="557158376602636112">"सेल्युलर डेटा सीमा पूर्ण हो गई"</string>
@@ -1543,7 +1543,7 @@
<string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"वाई-फ़ाई डेटा सीमा पार हो गई है"</string>
<string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> निर्दिष्ट सीमा से अधिक."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"पृष्ठभूमि डेटा प्रतिबंधित है"</string>
- <string name="data_usage_restricted_body" msgid="6741521330997452990">"प्रतिबंध निकालने हेतु स्पर्श करें."</string>
+ <string name="data_usage_restricted_body" msgid="6741521330997452990">"प्रतिबंध निकालने के लिए स्पर्श करें."</string>
<string name="ssl_certificate" msgid="6510040486049237639">"सुरक्षा प्रमाणपत्र"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"यह प्रमाणपत्र मान्य है."</string>
<string name="issued_to" msgid="454239480274921032">"इन्हें जारी किया गया:"</string>
@@ -1604,7 +1604,7 @@
<string name="kg_password_instructions" msgid="5753646556186936819">"पासवर्ड डालें"</string>
<string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"सिम अब अक्षम हो गई है. जारी रखने के लिए PUK कोड डालें. विवरण के लिए कैरियर से संपर्क करें."</string>
<string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"इच्छित पिन कोड डालें"</string>
- <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"इच्छित पिन कोड की पुष्टि करें"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"इच्छित पिन कोड की दुबारा पूछें"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"सिम कार्ड अनलॉक कर रहा है…"</string>
<string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"गलत PIN कोड."</string>
<string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"ऐसा PIN लिखें, जो 4 से 8 अंकों का हो."</string>
@@ -1735,15 +1735,15 @@
<string name="restr_pin_incorrect" msgid="8571512003955077924">"गलत"</string>
<string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"वर्तमान पिन"</string>
<string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"नया पिन"</string>
- <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"नए पिन की पुष्टि करें"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"नए पिन की दुबारा पूछें"</string>
<string name="restr_pin_create_pin" msgid="8017600000263450337">"प्रतिबंधों को बदलने के लिए PIN बनाएं"</string>
- <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN मिलान नहीं करते हैं. पुनः प्रयास करें."</string>
+ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN मिलान नहीं करते हैं. फिर से प्रयास करें."</string>
<string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN बहुत छोटा है. कम से कम 4 अंकों का होना चाहिए."</string>
<plurals name="restr_pin_countdown">
<item quantity="one" msgid="311050995198548675">"1 सेकंड में पुन: प्रयास करें"</item>
<item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> सेकंड में पुन: प्रयास करें"</item>
</plurals>
- <string name="restr_pin_try_later" msgid="973144472490532377">"बाद में पुनः प्रयास करें"</string>
+ <string name="restr_pin_try_later" msgid="973144472490532377">"बाद में फिर से प्रयास करें"</string>
<string name="immersive_mode_confirmation" msgid="7227416894979047467">"पूर्ण स्क्रीन से बाहर आने के लिए ऊपर से नीचे स्वाइप करें."</string>
<string name="done_label" msgid="2093726099505892398">"पूर्ण"</string>
<string name="hour_picker_description" msgid="6698199186859736512">"घंटो का चक्राकार स्लाइडर"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> चयनित"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> को हटा दिया गया"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"कार्यस्थल का <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"इस स्क्रीन को अनपिन करने के लिए, एक ही समय में वापस जाएं और अवलोकन को स्पर्श करके रखें."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"इस स्क्रीन को अनपिन करने के लिए, अवलोकन को स्पर्श करके रखें."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"स्क्रीन पिन की गई है. आपके संगठन के द्वारा अनपिन करने की अनुमति नहीं है."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"स्क्रीन पिन करने का उपयोग करें?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"स्क्रीन पिनिंग एकल दृश्य में डिस्प्ले को लॉक कर देती है.\n\nअनपिन करने के लिए, एक ही समय में वापस जाएं और अवलोकन स्पर्श करके रखें."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"स्क्रीन पिनिंग एकल दृश्य में डिस्प्ले को लॉक कर देती है.\n\nअनपिन करने के लिए, अवलोकन को स्पर्श करके रखें."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"रहने दें"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"प्रारंभ करें"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"स्क्रीन पिन की गई"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index aa93037..fcdef47 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"izmjena vaše kontaktne kartice"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Aplikaciji omogućuje promjenu ili dodavanje osobnih podataka profila pohranjenih na uređaju, kao što su vaše ime i kontaktni podaci. To znači da vas aplikacija može identificirati i slati informacije s vašeg profila drugima."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"senzori tjelesnih funkcija (npr. monitori otkucaja srca)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Aplikaciji omogućuje pristup podacima iz senzora koje upotrebljavate za mjerenje onoga što se odvija u vašem tijelu, poput otkucaja srca."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Omogućuje aplikaciji pristup podacima sa senzora koji nadziru vaše fizičko stanje, na primjer, broj otkucaja srca."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"čitanje društvenog streama"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Aplikaciji omogućuje pristup vašim ažuriranjima na društvenim mrežama i ažuriranjima vaših prijatelja, kao i sinkronizaciju tih ažuriranja. Budite oprezni kad dijelite informacije – to aplikaciji omogućuje čitanje poruka između vas i vaših prijatelja na društvenim mrežama, neovisno o povjerljivosti. Napomena: ta se dozvola možda ne primjenjuje na svim društvenim mrežama."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"pisanje društvenog streama"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index a39e2f0..f676da4 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"saját névjegykártya módosítása"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Lehetővé teszi az alkalmazás számára az eszközön tárolt személyes profiladatok, például a név és az elérhetőségek módosítását vagy hozzáadását. Ez azt jelenti, hogy az alkalmazás azonosíthatja Önt, és elküldheti másoknak profiladatait."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"testérzékelők (pl. pulzusmérő)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Lehetővé teszi, hogy az alkalmazás hozzáférjen az olyan érzékelők által észlelt adatokhoz, amelyek az Ön életfunkcióit – például a pulzusszámát – figyelik."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Engedélyezi az alkalmazásnak, hogy hozzáférjen az Ön fizikai állapotát – például a pulzusszámát – figyelő érzékelők adataihoz."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"közösségi adatfolyam olvasása"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Lehetővé teszi az alkalmazás számára, hogy hozzáférjen az Ön és ismerősei közösségi oldalakon szereplő frissítéseihez. Legyen elővigyázatos, amikor információt tesz közzé -- így az alkalmazás hozzáférhet az ismerőseivel a közösségi hálózatokon folytatott magánbeszélgetésekhez, a tartalom titkos jellegétől függetlenül. Megjegyzés: előfordulhat, hogy ez nincs minden közösségi hálózaton engedélyezve."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"írás a közösség adatfolyamra"</string>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index a11037e..a53ea28 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -472,7 +472,7 @@
<string name="permlab_writeGservices" msgid="2149426664226152185">"փոփոխել Google ծառայությունների քարտեզը"</string>
<string name="permdesc_writeGservices" msgid="1287309437638380229">"Թույլ է տալիս հավելվածին փոփոխել Google-ի ծառայությունների քարտեզը: Սովորական հավելվածների օգտագործման համար չէ:"</string>
<string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"աշխատել մեկնարկային ռեժիմով"</string>
- <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Թույլ է տալիս հավելվածին ինքնուրույն մեկնարկել համակարգի բեռնման ավարտից հետո: Սա կարող է երկարացնել գրասալիկի մեկնարկը և թույլ տալ հավելավածին դանդաղեցնել ամբողջ գրասալիկի աշխատանքը` միշտ աշխատելով:"</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Թույլ է տալիս հավելվածին ինքնաշխատ մեկնարկել համակարգի բեռնման ավարտից հետո: Սա կարող է երկարացնել գրասալիկի մեկնարկը և թույլ տալ հավելավածին դանդաղեցնել ամբողջ գրասալիկի աշխատանքը` միշտ աշխատելով:"</string>
<string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Թույլ է տալիս հավելվածին ինքն իրեն սկսել` համակարգի բեռնումն ավարտվելուն պես: Սա կարող է հեռախոսի մեկնարկը դարձնել ավելի երկար և թույլ տալ, որ հավելվածը դանդաղեցնի ընդհանուր հեռախոսի աշխատանքը` միշտ աշխատելով:"</string>
<string name="permlab_broadcastSticky" msgid="7919126372606881614">"ուղարկել կպչուն հաղորդում"</string>
<string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Թույլ է տալիս հավելվածին ուղարկել կպչուն հաղորդումներ, որոնք մնում են հաղորդման ավարտից հետո: Չափազանց շատ օգտագործումը կարող է գրասալիկի աշխատանքը դանդաղեցնել կամ դարձնել անկայուն` պատճառ դառնալով չափազանց մեծ հիշողության օգտագործման:"</string>
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"փոփոխել ձեր սեփական կոնտակտային քարտը"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Թույլ է տալիս հավելվածին փոխել կամ ավելացնել ձեր սարքում պահված անհատական պրոֆիլի տվյալները, ինչպիսիք են ձեր անունը և կոնտակտային տվյալները: Սա նշանակում է, որ հավելվածը կարող է ձեզ ճանաչել և ուղարկել ձեր պրոֆիլի տվյալները ուրիշներին:"</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"մարմնի սենսորներ (օր.` սրտի)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Ծրագրին թույլ է տալիս մատչել ձեր կողմից օգտագործվող սենսորների տվյալները՝ չափելու, թե ինչ է տեղի ունենում ձեր մարմնի ներսում, ինչպես օրինակ՝ սրտի զարկերը:"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Հավելվածին թույլ է տալիս մուտք ունենալ սենսորների տվյալներին, որոնք վերահսկում են ձեր ֆիզիկական վիճակը, օրինակ՝ ձեր սրտի զարկերը:"</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"կարդալ ձեր սոցիալական հոսքը"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Թույլ է տալիս հավելվածին մուտք գործել և համաժամեցնել ձեր և ձեր ընկերների սոցիալական թարմացումները: Զգույշ եղեք տեղեկություններ տարածելիս. այն թույլ է տալիս հավելվածին կարդալ ձեր և ձեր ընկերների միջև անձնական հաղորդագրությունները սոցիալական ցանցերում` անկախ գաղտնիությունից: Նշում. այս թույլտվությունը չի կարող գործածվել բոլոր սոցիալական ցանցերում:"</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"գրել ձեր սոցիալական հոսքում"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"Ընտրված է <xliff:g id="ITEM">%1$s</xliff:g> տարրը"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> թիվը ջնջված է"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Աշխատանքային <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Այս էկրան ապամրացնելու համար միաժամանակ հպեք և պահեք Հետ և Համատեսք կոճակները:"</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Այս էկրանն ապամրացնելու համար հպեք և պահեք Համատեսքի կոճակը:"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Էկրանն ամրացված է: Ապամրացումը չի թույլատրվում ձեր կազմակերպության կողմից:"</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Օգտագործե՞լ էկրանի ամրացումը:"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Էկրանի ամրացումը կողպում է էկրանը ընթացիկ տեսքով:\n\nԱպամրացնելու համար միաժամանակ հպեք և պահեք Հետ և Համատեսք կոճակները:"</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Էկրանի ամրացումը կողպում է էկրանը տվյալ պահի տեսքով:\n\nԱպամրացնելու համար հպեք և պահեք Համատեսքի կոճակին:"</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"ՈՉ, ՇՆՈՐՀԱԿԱԼՈՒԹՅՈՒՆ"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"Այո"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Էկրանն ամրացված է"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index a720747..ab5ff0d 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"ubah kartu kontak Anda"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Memungkinkan aplikasi mengubah atau menambah informasi profil pribadi yang tersimpan di perangkat Anda, seperti nama dan informasi kontak. Ini berarti aplikasi tersebut dapat mengenali Anda dan mengirim informasi profil Anda ke orang lain."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"sensor tubuh (misal: monitor detak jantung)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Memungkinkan aplikasi mengakses data dari sensor yang Anda gunakan untuk mengukur yang terjadi di dalam tubuh, misalnya detak jantung."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Mengizinkan aplikasi untuk mengakses data dari sensor yang memantau kondisi fisik Anda, seperti denyut jantung."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"membaca aliran sosial Anda"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Memungkinkan aplikasi mengakses dan menyinkronkan pembaruan sosial dari Anda dan teman. Hati-hati ketika berbagi informasi -- izin ini memungkinkan aplikasi membaca komunikasi antara Anda dan teman di jejaring sosial, terlepas dari kerahasiaan. Catatan: izin ini tidak dapat diberlakukan di semua jejaring sosial."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"menulis ke aliran sosial Anda"</string>
@@ -1492,7 +1492,7 @@
<string name="add_account_button_label" msgid="3611982894853435874">"Tambahkan akun"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Tambah"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Kurangi"</string>
- <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> sentuh dan tahan."</string>
+ <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> sentuh lama."</string>
<string name="number_picker_increment_scroll_action" msgid="9101473045891835490">"Geser ke atas untuk menambah dan ke bawah untuk mengurangi."</string>
<string name="time_picker_increment_minute_button" msgid="8865885114028614321">"Tambah menit"</string>
<string name="time_picker_decrement_minute_button" msgid="6246834937080684791">"Kurangi menit"</string>
@@ -1757,12 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> dipilih"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> dihapus"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Kantor <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="7570091317001980053">"Untuk melepas pin layar ini, sentuh dan tahan tombol Kembali dan Ikhtisar secara bersamaan."</string>
- <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Untuk melepas pin layar ini, sentuh dan tahan tombol Ikhtisar."</string>
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Untuk melepas pin layar ini, sentuh lama tombol Kembali dan Ringkasan secara bersamaan."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Untuk melepas pin layar ini, sentuh lama tombol Ringkasan."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Layar disematkan. Pelepasan sematan tidak diizinkan oleh organisasi Anda."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Gunakan penyematan layar?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Pemasangan pin pada layar mengunci layar dalam satu tampilan.\n\nUntuk melepas pin, sentuh dan tahan tombol Kembali dan Ikhtisar secara bersamaan."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Pemasangan pin pada layar mengunci layar dalam satu tampilan.\n\nUntuk melepas pin, sentuh dan tahan tombol Ikhtisar."</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Pemasangan pin pada layar mengunci layar dalam satu tampilan.\n\nUntuk melepas pin, sentuh lama tombol Kembali dan Ringkasan secara bersamaan."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Pemasangan pin pada layar mengunci layar dalam satu tampilan.\n\nUntuk melepas pin, sentuh lama tombol Ringkasan."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"TIDAK, TERIMA KASIH"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"MULAI"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Layar disematkan"</string>
diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml
index 02cfa67..1735136 100644
--- a/core/res/res/values-is-rIS/strings.xml
+++ b/core/res/res/values-is-rIS/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"breyta tengiliðaspjaldinu þínu"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Leyfir forriti að breyta eða bæta við persónulegum prófílupplýsingum sem vistaðar eru í tækinu, t.d. nafni og samskiptaupplýsingum. Þetta þýðir að forritið veit hver þú ert og getur sent prófílupplýsingarnar þínar til annarra."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"líkamsskynjarar (s.s. hjartsláttarmælar)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Leyfir forriti að fá aðgang að gögnum frá skynjurum sem þú notar til að mæla líkamsstarfsemi þína, svo sem hjartslátt."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Veitir forritinu aðgang að gögnum frá skynjurum sem fylgjast með líkamsstarfsemi þinni, svo sem hjartslætti."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"lesa samfélagsstrauminn þinn"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Leyfir forriti að fá aðgang að og samstilla samfélagsuppfærslur þínar og vina þinna. Sýndu aðgát þegar þú deilir upplýsingum; þetta gerir forritinu kleift að lesa samskipti þín og vina þinna í netsamfélögum. Athugaðu: Ekki er víst að þessi heimild sé virt í öllum netsamfélögum."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"skrifa í samfélagsstrauminn þinn"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 7778b93..df69809 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"modifica scheda contatti"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Consente all\'applicazione di modificare o aggiungere informazioni ai dati del profilo personale memorizzati sul dispositivo, come il tuo nome e le tue informazioni di contatto. Significa che l\'applicazione può identificarti e inviare le informazioni del tuo profilo ad altri."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"sensori per il corpo (come il cardiofrequenzimetro)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Consente all\'app di accedere a dati derivanti dai sensori utilizzati per rilevare cosa sta accadendo nel tuo corpo, ad esempio la frequenza cardiaca."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Consente all\'app di accedere ai dati relativi ai sensori che monitorano le tue condizioni fisiche, ad esempio la frequenza cardiaca."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"lettura del tuo stream sociale"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Consente all\'applicazione di accedere agli aggiornamenti dei social network tra te e i tuoi amici e di sincronizzarli. Fai attenzione quando condividi informazioni: questa autorizzazione consente all\'applicazione di leggere le comunicazioni tra te e i tuoi amici sui social network, indipendentemente dal livello di riservatezza. Nota. È possibile che questa autorizzazione non sia applicabile su tutti i social network."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"scrittura nel tuo stream sociale"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 074f252..8e4e2ab 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"שינוי כרטיס איש הקשר שלך"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"מאפשר לאפליקציה לשנות או להוסיף נתונים לפרטי הפרופיל האישי המאוחסנים במכשיר, כגון שמך ופרטי הקשר שלך. משמעות הדבר שהאפליקציה יכולה לזהות אותך ועשוי לשלוח את פרטי הפרופיל שלך לאנשים אחרים."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"חיישני גוף (כמו מוניטורים עבור קצב לב)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"מאפשר לאפליקציה לגשת לנתוני חיישנים שבהם אתה משתמש כדי למדוד פעילות המתרחשת בתוך הגוף, כמו קצב לב."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"מאפשר לאפליקציה לגשת אל נתוני חיישנים העוקבים אחר מצבך הגופני, כמו קצב הלב."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"קריאת הזרם החברתי שלך"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"מאפשר לאפליקציה גישה ויכולת סנכרון של עדכונים חברתיים שאתה וחבריך מבצעים. היזהר בעת שיתוף מידע -- הדבר מתיר לאפליקציה לקרוא התכתבויות בינך ובין חבריך ברשתות חברתיות, ללא התחשבות בסודיות. שים לב: ייתכן שאישור זה לא נאכף בכל הרשתות החברתיות."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"כתיבה בזרם החברתי שלך"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 7fd48f1..e20947d 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"自分の連絡先カードの変更"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"端末に保存されている個人のプロフィール情報(名前、連絡先情報など)の変更と追加をアプリに許可します。これにより、アプリがユーザーの身元を特定できるようになり、プロフィール情報を第三者に転送する可能性があります。"</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"ボディーセンサー(心拍数モニターなど)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"心拍数など、体内の変化の測定に使用するセンサーからのデータにアクセスすることをアプリに許可します。"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"心拍数など、身体状態を監視するセンサーからのデータにアクセスすることをアプリに許可します。"</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"ソーシャルストリームを読む"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"あなたや友だちのソーシャル更新情報へのアクセスと同期をアプリに許可します。情報の共有は慎重に行ってください。これを許可すると、あなたと友だちがソーシャルネットワークで行ったやり取りを、機密性に関係なくアプリから読み取ることができるようになります。注: この許可は、一部のソーシャルネットワークでは適用されない場合があります。"</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"ソーシャルストリームに書く"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g>を選択しました"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g>を削除しました"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"仕事の<xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"この画面の固定を解除するには[戻る]と[最近]を同時に押し続けます。"</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"この画面の固定を解除するには[最近]を押し続けます。"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"画面が固定されています。会社/組織により解除は許可されていません。"</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"画面固定を使用しますか?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"画面の固定では、1つの画面が表示されたままになります。\n\n解除するには、[戻る]と[最近]を同時に押し続けます。"</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"画面の固定では、1つの画面が表示されたままになります。\n\n解除するには、[最近]を押し続けます。"</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"いいえ"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"開始する"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"画面を固定しました"</string>
diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml
index 0b9500d..6765fd2 100644
--- a/core/res/res/values-ka-rGE/strings.xml
+++ b/core/res/res/values-ka-rGE/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"თქვენი საკონტაქტო ინფორმაციის შეცვლა"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"აპს შეეძლება მოწყობილობაზე შენახული პირადი პროფილის ინფორმაციის შეცვლა ან დამატება, მაგალითად, თქვენი სახელისა და საკონტაქტო ინფორმაციის. ეს ნიშნავს, რომ აპს შეუძლია თქვენი იდენტიფიცირება და თქვენი პირადი ინფორმაციის სხვებისთვის გაგზავნა."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"სხეულის სენსორები (მაგ. გულისცემის მონიტორები)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"საშუალებას აძლევს აპს იქონიოს წვდომა თქვენ მიერ გამოყენებული სენსორებიდან, რათა გაზომოთ, რა ხდება თქვენ სხეულში, მაგ. გულის ცემის რითმი."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"აპისთვის ნების დართვა იქონიოს წვდომა თქვენი ფიზიკური მდგომარეობის მონიტორინგის სენსორების მონაცემებზე."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"სოციალური ნაკადის წაკითხვა"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"აპს შეეძლება თქვენი და თქვენი მეგობრების სოციალური განახლებებთან წვდომა და სინქრონიზაცია. ინფორმაციის გაზიარებისას იყავით ფრთხიად - აპს ექნება შესაძლებლობა, რომ წაიკითხოს სოციალურ ქსელებში კომუნიკაცია თქვენსა და თქვენს მეგობრებს შორის კონფიდენციალურობის მიუხედავად. შენიშვნა: ეს უფლება შესაძლოა ვერ იყოს გამოყენებული ყველა სოციალურ ქსელში."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"თქვენს სოციალურ მაუწყებლობაზე დაწერა"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"არჩეულია <xliff:g id="ITEM">%1$s</xliff:g>"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> წაიშალა"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"სამსახური <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"მიმაგრების გასაუქმებლად ერთდროულად შეეხეთ და არ აუშვათ ღილაკებს „უკან“ და „გადახედვა“."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ამ ეკრანისთვის მიმაგრების გასაუქმებლად შეეხეთ და არ აუშვათ ღილაკებს „გადახედვა“."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"ეკრანი დაფიქსირებული. ფიქსაციის მოხსნა თქვენო ორგანიზაციის მიერ ნებადართული არ არის."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"გსურთ ეკრანის ფიქსაციის გამოყენება?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"ეკრანის მიმაგრება მხოლოდ ერთ ამჟამინდელ ხედს აჩვენებს.\n\nმიმაგრების გასაუქმებლად ერთდროულად შეეხეთ და არ აუშვათ ღილაკებს „უკან“ და „გადახედვა“."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"ეკრანის მიმაგრება მხოლოდ ერთ ამჟამინდელ ხედს აჩვენებს.\n\nმიმაგრების გასაუქმებლად ერთდროულად შეეხეთ და არ აუშვათ ღილაკებს „უკან“ და „გადახედვა“."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"არა, გმადლობთ"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"დაწყება"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"ეკრანი დაფიქსირდა"</string>
diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml
index fb0e5da..d698acd 100644
--- a/core/res/res/values-kk-rKZ/strings.xml
+++ b/core/res/res/values-kk-rKZ/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"өзіңіздің байланыс картаңызды өзгерту"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Қолданбаға құрылғыда сақталған сіздің аты-жөніңіз және байланыс ақпаратыңыз сияқты жеке ақпаратты өзгерту немесе қосу мүмкіндігін береді. Бұл - қолданба сізді анықтап, сіз туралы жеке ақпаратты басқаларға жібере алады дегенді білдіреді."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"дене сен-ры (жүрек соғу жиіл. мон-ры сияқты)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Қолданбаларға сіз жүрек соғу жиілігі сияқты дене ішінде болып жатқан нәрселерді өлшеу үшін пайдаланатын сенсорлардан алынған деректерге қатынасуға рұқсат береді."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Қолданбаға жүрек соғу жиілігіңіз сияқты дене күйіңізді бақылайтын сенсорлардың деректеріне қатынасуға рұқсат етеді."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"әлеуметтік ағымды оқу"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Қолданбаға сіз және достарыңыздың әлеуметтік жаңартуларына кіру және синхрондау мүмкіндігін береді. Ақпарат бөліскенде абай болыңыз -- бұл қолданбаға сіз және достарыңызды әлеуметтік желілердегі қарым-қатынасты, құпиялығына қарамастан, оқу мүмкіндігін берді. Есіңізде болсын: бұл рұқсатты барлық әлеуметтік желілер қолданбайды."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"әлеуметтік ағынға жазу"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> таңдалды"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> жойылды"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Жұмыс <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Осы экранды босату үшін «Кері» және «Шолу» пәрмендерін бір уақытта түртіп, ұстап тұрыңыз."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Осы экранды босату үшін «Шолу» пәрменін түртіп, ұстап тұрыңыз."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Экран түйрелген. Босатуға ұйымыңыз рұқсат етпейді."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Экранды түйреуді пайдалану керек пе?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Экранды бекіту дисплейді бір көріністе бекітеді.\n\nБосату үшін «Кері» және «Шолу» пәрмендерін бір уақытта түртіп, ұстап тұрыңыз."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Экранды бекіту дисплейді бір көріністе бекітеді.\n\nБосату үшін «Шолу» пәрменін түртіп, ұстап тұрыңыз."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"ЖОҚ, РАҚМЕТ"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"БАСТАУ"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Экран түйрелді"</string>
diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml
index 375efa6..a0fd3e7 100644
--- a/core/res/res/values-km-rKH/strings.xml
+++ b/core/res/res/values-km-rKH/strings.xml
@@ -68,7 +68,7 @@
</plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
- <string name="ClipMmi" msgid="6952821216480289285">"លេខសម្គាល់អ្នកហៅចូល"</string>
+ <string name="ClipMmi" msgid="6952821216480289285">"លេខសម្គាល់អ្នកហៅចូល"</string>
<string name="ClirMmi" msgid="7784673673446833091">"លេខសម្គាល់អ្នកហៅចេញ"</string>
<string name="ColpMmi" msgid="3065121483740183974">"បានភ្ជាប់លេខសម្គាល់បន្ទាត់"</string>
<string name="ColrMmi" msgid="4996540314421889589">"បានភ្ជាប់ការដាក់កម្រិតលេខសម្គាល់បន្ទាត់"</string>
@@ -127,7 +127,7 @@
<string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g> ៖ មិនបានបញ្ជូនបន្ត"</string>
<string name="fcComplete" msgid="3118848230966886575">"កូដលក្ខណៈពេញលេញ។"</string>
<string name="fcError" msgid="3327560126588500777">"បញ្ហាការតភ្ជាប់ ឬកូដលក្ខណៈមិនត្រឹមត្រូវ។"</string>
- <string name="httpErrorOk" msgid="1191919378083472204">"យល់ព្រម"</string>
+ <string name="httpErrorOk" msgid="1191919378083472204">"យល់ព្រម"</string>
<string name="httpError" msgid="7956392511146698522">"មានកំហុសបណ្ដាញ។"</string>
<string name="httpErrorLookup" msgid="4711687456111963163">"រកមិនឃើញ URL ។"</string>
<string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"គ្រោងការណ៍ផ្ទៀងផ្ទាត់តំបន់បណ្ដាញមិនត្រូវបានគាំទ្រ។"</string>
@@ -185,7 +185,7 @@
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"បើកសំឡេង"</string>
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ពេលជិះយន្តហោះ"</string>
<string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"បានបើករបៀបពេលជិះយន្តហោះ"</string>
- <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"បានបិទរបៀបពេលជិះយន្តហោះ"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"បានបិទរបៀបពេលជិះយន្តហោះ"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ការកំណត់"</string>
<string name="global_action_lockdown" msgid="8751542514724332873">"ចាក់សោឥឡូវនេះ"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
@@ -198,7 +198,7 @@
<string name="permgrouplab_messages" msgid="7521249148445456662">"សាររបស់អ្នក"</string>
<string name="permgroupdesc_messages" msgid="7821999071003699236">"អាន និងសរសេរសារ SMS, អ៊ីមែល និងសារផ្សេងៗទៀតរបស់អ្នក។"</string>
<string name="permgrouplab_personalInfo" msgid="3519163141070533474">"ព័ត៌មានផ្ទាល់ខ្លួនរបស់អ្នក"</string>
- <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"ចូលដំណើរការព័ត៌មានដោយផ្ទាល់អំពីអ្នក ដែលបានរក្សាទុកក្នុងកាតទំនាក់ទំនងរបស់អ្នក។"</string>
+ <string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"ចូលដំណើរការព័ត៌មានដោយផ្ទាល់អំពីអ្នក ដែលបានរក្សាទុកក្នុងកាតទំនាក់ទំនងរបស់អ្នក។"</string>
<string name="permgrouplab_socialInfo" msgid="5799096623412043791">"ព័ត៌មានសង្គមរបស់អ្នក"</string>
<string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"ចូលដំណើរការព័ត៌មានដោយផ្ទាល់អំពីទំនាក់ទំនង និងការភ្ជាប់សង្គមរបស់អ្នក។"</string>
<string name="permgrouplab_location" msgid="635149742436692049">"ទីតាំងរបស់អ្នក"</string>
@@ -391,7 +391,7 @@
<string name="permdesc_readInputState" msgid="8387754901688728043">"ឲ្យកម្មវិធីមើលគ្រាប់ចុចដែលអ្នកចុចពេលមានអន្តរកម្មជាមួយកម្មវិធីផ្សេង (ដូចជា បញ្ចូលពាក្យសម្ងាត់)។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
<string name="permlab_bindInputMethod" msgid="3360064620230515776">"ចងទៅវិធីសាស្ត្របញ្ចូល"</string>
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"ឲ្យម្ចាស់ចងចំណុចប្រទាក់កម្រិតកំពូលនៃវិធីសាស្ត្របញ្ចូល។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
- <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"ចងសេវាកម្មភាពមធ្យោបាយងាយស្រួល"</string>
+ <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"ចងសេវាកម្មភាពមធ្យោបាយងាយស្រួល"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"ឲ្យម្ចាស់ចងចំណុចប្រទាក់កម្រិតកំពូលនៃសេវាកម្មភាពងាយស្រួល។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
<string name="permlab_bindPrintService" msgid="8462815179572748761">"ចងសេវាកម្មបោះពុម្ព"</string>
<string name="permdesc_bindPrintService" msgid="7960067623209111135">"ឲ្យម្ចាស់ចងចំណុចប្រទាក់កម្រិតកំពូលនៃសេវាកម្មធាតុក្រាហ្វិក។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
@@ -411,7 +411,7 @@
<string name="permdesc_manageVoiceKeyphrases" msgid="8476560722907530008">"អនុញ្ញាតឲ្យម្ចាស់គ្រប់គ្រងឃ្លាសម្រាប់ការរកឃើញពាក្យជាសំឡេង។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
<string name="permlab_bindRemoteDisplay" msgid="1782923938029941960">"ភ្ជាប់ទៅការបង្ហាញពីចម្ងាយ"</string>
<string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"អនុញ្ញាតឲ្យម្ចាស់ភ្ជាប់ទៅចំណុចប្រទាក់កម្រិតកំពូលនៃការបង្ហាញពីចម្ងាយ។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
- <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"ចងសេវាកម្មធាតុក្រាហ្វិក"</string>
+ <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"ចងសេវាកម្មធាតុក្រាហ្វិក"</string>
<string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"ឲ្យម្ចាស់ចងចំណុចប្រទាក់កម្រិតកំពូលនៃសេវាកម្មធាតុក្រាហ្វិក។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
<string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"ទាក់ទងជាមួយអ្នកគ្រប់គ្រងឧបករណ៍"</string>
<string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"ឲ្យម្ចាស់ផ្ញើគោលបំណងទៅអ្នកគ្រប់គ្រងឧបករណ៍។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
@@ -419,7 +419,7 @@
<string name="permdesc_bindTvInput" msgid="2371008331852001924">"អនុញ្ញាតឲ្យម្ចាស់ភ្ជាប់ទៅចំណុចប្រទាក់កម្រិតខ្ពស់នៃការបញ្ចូលទូរទស្សន៍។ មិនគួរចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
<string name="permlab_modifyParentalControls" msgid="4611318225997592242">"កែប្រែការត្រួតពិនិត្យមាតាបិតា"</string>
<string name="permdesc_modifyParentalControls" msgid="7438482894162282039">"អនុញ្ញាតឲ្យម្ចាស់កែប្រែទិន្នន័យការត្រួតពិនិត្យមាតាបិតារបស់ប្រព័ន្ធ។ គួរតែមិនត្រូវការសម្រាប់កម្មវិធីធម្មតា។"</string>
- <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"បន្ថែម ឬលុបកម្មវិធីគ្រប់គ្រងឧបករណ៍"</string>
+ <string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"បន្ថែម ឬលុបកម្មវិធីគ្រប់គ្រងឧបករណ៍"</string>
<string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"អនុញ្ញាតឲ្យម្ចាស់បន្ថែម ឬលុបកម្មវិធីគ្រប់គ្រងឧបករណ៍សកម្មចេញ។ មិនគួរប្រើសម្រាប់កម្មវិធីធម្មតាទេ។"</string>
<string name="permlab_setOrientation" msgid="3365947717163866844">"ប្ដូរទិសអេក្រង់"</string>
<string name="permdesc_setOrientation" msgid="3046126619316671476">"ឲ្យកម្មវិធីប្ដូរការបង្វិលអេក្រង់នៅពេលណាមួយ។ មិនចាំបាច់សម្រាប់កម្មវិធីធម្មតាទេ។"</string>
@@ -431,9 +431,9 @@
<string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"ឲ្យកម្មវិធីស្នើសញ្ញាដែលបានផ្ដល់ត្រូវផ្ញើទៅដំណើរការស្ថិតស្ថេរទាំងអស់។"</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"ធ្វើឲ្យកម្មវិធីដំណើរការជានិច្ច"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"ឲ្យកម្មវិធីធ្វើជាផ្នែកស្ថិតស្ថេរដោយខ្លួនឯងក្នុងអង្គចងចាំ។ វាអាចកំណត់អង្គចងចាំដែលអាចប្រើបានចំពោះកម្មវិធីផ្សេងៗ ដោយធ្វើឲ្យកុំព្យូទ័របន្ទះយឺត។"</string>
- <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"ឲ្យកម្មវិធី ធ្វើជាផ្នែកអចិន្ត្រៃយ៍នៃខ្លួនក្នុងអង្គចងចាំ។ វាអាចកម្រិតអង្គចងចាំអាចប្រើបាន ដើម្បីធ្វើឲ្យកម្មវិធីផ្សេងធ្វើឲ្យទូរស័ព្ទរបស់អ្នកយឺត។"</string>
+ <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"ឲ្យកម្មវិធី ធ្វើជាផ្នែកអចិន្ត្រៃយ៍នៃខ្លួនក្នុងអង្គចងចាំ។ វាអាចកម្រិតអង្គចងចាំអាចប្រើបាន ដើម្បីធ្វើឲ្យកម្មវិធីផ្សេងធ្វើឲ្យទូរស័ព្ទរបស់អ្នកយឺត។"</string>
<string name="permlab_deletePackages" msgid="184385129537705938">"លុបកម្មវិធី"</string>
- <string name="permdesc_deletePackages" msgid="7411480275167205081">"ឲ្យកម្មវិធីលុបកញ្ចប់ Android ។ កម្មវិធីព្យាបាទអាចប្រើវា ដើម្បីលុបកម្មវិធីសំខាន់ៗ។ "</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"ឲ្យកម្មវិធីលុបកញ្ចប់ Android ។ កម្មវិធីព្យាបាទអាចប្រើវា ដើម្បីលុបកម្មវិធីសំខាន់ៗ។"</string>
<string name="permlab_clearAppUserData" msgid="274109191845842756">"លុបទិន្នន័យរបស់កម្មវិធីផ្សេង"</string>
<string name="permdesc_clearAppUserData" msgid="4625323684125459488">"ឲ្យកម្មវិធីសម្អាតទិន្នន័យអ្នកប្រើ។"</string>
<string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"លុបឃ្លាំងសម្ងាត់កម្មវិធីផ្សេងៗ"</string>
@@ -484,7 +484,7 @@
<string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"ឲ្យកម្មវិធីកែទិន្នន័យអំពីទំនាក់ទំនងរបស់អ្នកដែលបានរក្សាទុកក្នុងកុំព្យូទ័របន្ទះ រួមមានប្រេកង់ដែលអ្នកបានហៅ អ៊ីមែល ឬទាក់ទងតាមវិធីផ្សេងៗជាមួយទំនាក់ទំនងជាក់លាក់។ សិទ្ធិនេះអនុញ្ញាតឲ្យកម្មវិធីលុបទិន្នន័យទំនាក់ទំនងរបស់អ្នក។"</string>
<string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"ឲ្យកម្មវិធីកែទិន្នន័យអំពីទំនាក់ទំនងរបស់អ្នកដែលបានរក្សាទុកក្នុងទូរស័ព្ទរបស់អ្នក រួមមានប្រេកង់ដែលអ្នកបានហៅ អ៊ីមែល ឬបានទាក់ទងតាមវិធីផ្សេងៗជាមួយទំនាក់ទំនាក់ជាក់លាក់។ សិទ្ធិនេះឲ្យកម្មវិធីលុបទិន្នន័យទំនាក់ទំនង។"</string>
<string name="permlab_readCallLog" msgid="3478133184624102739">"អានកំណត់ហេតុហៅ"</string>
- <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"ឲ្យកម្មវិធីអានបញ្ជីហៅកុំព្យូទ័របន្ទះរបស់អ្នក រួមមានទិន្នន័យអំពីការហៅចូល និងចេញ។ សិទ្ធិនេះអនុញ្ញាតឲ្យកម្មវិធីរក្សាទុកទិន្នន័យបញ្ជីហៅរបស់អ្នក ហើយកម្មវិធីព្យាបាទអាចចែករំលែកទិន្នន័យបញ្ជីហៅដោយមិនឲ្យអ្នកដឹង។"</string>
+ <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"ឲ្យកម្មវិធីអានបញ្ជីហៅកុំព្យូទ័របន្ទះរបស់អ្នក រួមមានទិន្នន័យអំពីការហៅចូល និងចេញ។ សិទ្ធិនេះអនុញ្ញាតឲ្យកម្មវិធីរក្សាទុកទិន្នន័យបញ្ជីហៅរបស់អ្នក ហើយកម្មវិធីព្យាបាទអាចចែករំលែកទិន្នន័យបញ្ជីហៅដោយមិនឲ្យអ្នកដឹង។"</string>
<string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"ឲ្យកម្មវិធីអានបញ្ជីហៅទូរស័ព្ទរបស់អ្នក រួមមានទិន្នន័យអំពីការហៅចូល និងចេញ។ សិទ្ធិនេះអនុញ្ញាតឲ្យកម្មវិធីរក្សាទុកទិន្នន័យបញ្ជីហៅរបស់អ្នក ហើយកម្មវិធីព្យាបាទអាចចែករំលែកទិន្នន័យបញ្ជីហៅដោយមិនឲ្យអ្នកដឹង។"</string>
<string name="permlab_writeCallLog" msgid="8552045664743499354">"សរសេរបញ្ជីហៅ"</string>
<string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"ឲ្យកម្មវិធីកែបញ្ជីហៅកុំព្យូទ័របន្ទះរបស់អ្នករួមមានទិន្នន័យអំពីការហៅចូល និងចេញ។កម្មវិធីព្យាបាទអាចប្រើវា ដើម្បីលុប ឬកែបញ្ជីហៅរបស់អ្នក។"</string>
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"កែកាតទំនាក់ទំនងផ្ទាល់ខ្លួនរបស់អ្នក"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"ឲ្យកម្មវិធីប្ដូរ ឬបន្ថែមព័ត៌មានប្រវត្តិរូបផ្ទាល់ខ្លួនដែលបានរក្សាទុកក្នុងឧបករណ៍របស់អ្នក ដូចជា ឈ្មោះ និងព័ត៌មានទំនាក់ទំនងរបស់អ្នក។ នេះមានន័យថាកម្មវិធីអាចកំណត់អ្នក និងផ្ញើព័ត៌មានប្រវត្តិរូបរបស់អ្នកទៅអ្នកផ្សេង។"</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"ឧបករណ៍ចាប់សញ្ញារាងកាយ(ដូចជាម៉ាស៊ីនវាស់ចង្វាក់បេះដូង)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"ឲ្យកម្មវិធីដើម្បីចូលដំណើរការទិន្នន័យពីឧបករណ៍ចាប់សញ្ញាដែលអ្នកប្រើ ដើម្បីវាស់ពីអ្វីដែលកំពុងកើតឡើងនៅខាងក្នុងខ្លួនរបស់អ្នកដូចជាចង្វាក់បេះដូង។"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"ឲ្យកម្មវិធីចូលដំណើរការទិន្នន័យពីឧបករណ៍ចាប់សញ្ញាដែលតាមដានលក្ខខណ្ឌសុខភាពរបស់អ្នក ដូចជាចង្វាក់បេះដូង។"</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"អានចរន្តសង្គមរបស់អ្នក"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"ឲ្យកម្មវិធីចូលដំណើរការ និងធ្វើសមកាលកម្មបច្ចុប្បន្នភាពសង្គមពីអ្នក និងមិត្តភ័ក្ដិ។ ប្រយ័ត្នពេលចែករំលែកព័ត៌មាន វាអនុញ្ញាតឲ្យកម្មវិធីអានការទាក់ទងរវាងអ្នក និងមិត្តភ័ក្ដិលើបណ្ដាញសង្គម ទាក់ទងនឹងព័ត៌មានសម្ងាត់។ ចំណាំ៖ សិទ្ធិនេះមិនអាចត្រូវបានអនុវត្តលើបណ្ដាញសង្គមទាំងអស់បានទេ។"</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"សរសេរទៅចរន្តសង្គមរបស់អ្នក"</string>
@@ -624,7 +624,7 @@
<string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"ឲ្យកម្មវិធីកំណត់ជំនួយទំហំផ្ទាំងរូបភាពប្រព័ន្ធ។"</string>
<string name="permlab_masterClear" msgid="2315750423139697397">"កំណត់ប្រព័ន្ធទៅលំនាំដើមរោងចក្រឡើងវិញ"</string>
<string name="permdesc_masterClear" msgid="3665380492633910226">"ឲ្យកម្មវិធីកំណត់ប្រព័ន្ធដូចការកំណត់ចេញពីរោងចក្រឡើងវិញពេញលេញ ដោយលុបទិន្នន័យ ការកំណត់រចនាសម្ព័ន្ធ និងកម្មវិធីបានដំឡើង។"</string>
- <string name="permlab_setTime" msgid="2021614829591775646">"កំណត់ម៉ោង"</string>
+ <string name="permlab_setTime" msgid="2021614829591775646">"កំណត់ម៉ោង"</string>
<string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"ឲ្យកម្មវិធីប្ដូរម៉ោងកុំព្យូទ័របន្ទះ។"</string>
<string name="permdesc_setTime" product="default" msgid="1855702730738020">"ឲ្យកម្មវិធីប្ដូរម៉ោងទូរស័ព្ទ។"</string>
<string name="permlab_setTimeZone" msgid="2945079801013077340">"កំណត់តំបន់ពេលវេលា"</string>
@@ -801,7 +801,7 @@
<string-array name="organizationTypes">
<item msgid="7546335612189115615">"កន្លែងធ្វើការ"</item>
<item msgid="4378074129049520373">"ផ្សេងៗ"</item>
- <item msgid="3455047468583965104">"តាមតម្រូវការ"</item>
+ <item msgid="3455047468583965104">"តាមតម្រូវការ"</item>
</string-array>
<string-array name="imProtocols">
<item msgid="8595261363518459565">"AIM"</item>
@@ -817,7 +817,7 @@
<string name="phoneTypeHome" msgid="2570923463033985887">"ផ្ទះ"</string>
<string name="phoneTypeMobile" msgid="6501463557754751037">"ចល័ត"</string>
<string name="phoneTypeWork" msgid="8863939667059911633">"កន្លែងធ្វើការ"</string>
- <string name="phoneTypeFaxWork" msgid="3517792160008890912">"ទូរសារកន្លែងធ្វើការ"</string>
+ <string name="phoneTypeFaxWork" msgid="3517792160008890912">"ទូរសារកន្លែងធ្វើការ"</string>
<string name="phoneTypeFaxHome" msgid="2067265972322971467">"ទូរសារផ្ទះ"</string>
<string name="phoneTypePager" msgid="7582359955394921732">"ភេយ័រ"</string>
<string name="phoneTypeOther" msgid="1544425847868765990">"ផ្សេងៗ"</string>
@@ -940,7 +940,7 @@
<string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"ព្យាយាមលំនាំច្រើនពេក"</string>
<string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"ដើម្បីដោះសោ ចូលគណនី Google របស់អ្នក។"</string>
<string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"ឈ្មោះអ្នកប្រើ (អ៊ីមែល)"</string>
- <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"ពាក្យសម្ងាត់"</string>
+ <string name="lockscreen_glogin_password_hint" msgid="5958028383954738528">"ពាក្យសម្ងាត់"</string>
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"ចូល"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"ឈ្មោះអ្នកប្រើ ឬពាក្យសម្ងាត់មិនត្រឹមត្រូវ។"</string>
<string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"ភ្លេចឈ្មោះអ្នកប្រើ ឬពាក្យសម្ងាត់របស់អ្នក?\nមើល "<b>"google.com/accounts/recovery"</b>" ។"</string>
@@ -985,7 +985,7 @@
<string name="factorytest_failed" msgid="5410270329114212041">"បានបរាជ័យក្នុងការសាកល្បងរោងចក្រ"</string>
<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="factorytest_reboot" msgid="6320168203050791643">"ចាប់ផ្ដើមឡើងវិញ"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"ទំព័រមានចំណងជើង \"<xliff:g id="TITLE">%s</xliff:g>\" សរសេរ៖"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
<string name="js_dialog_before_unload_title" msgid="2619376555525116593">"បញ្ជាក់ការរុករក"</string>
@@ -1047,7 +1047,7 @@
<string name="prepend_shortcut_label" msgid="2572214461676015642">"ម៉ឺនុយ +"</string>
<string name="menu_space_shortcut_label" msgid="2410328639272162537">"ដកឃ្លា"</string>
<string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string>
- <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"លុប"</string>
+ <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"លុប"</string>
<string name="search_go" msgid="8298016669822141719">"ស្វែងរក"</string>
<string name="searchview_description_search" msgid="6749826639098512120">"ស្វែងរក"</string>
<string name="searchview_description_query" msgid="5911778593125355124">"ស្វែងរកសំណួរ"</string>
@@ -1131,18 +1131,18 @@
<string name="preposition_for_date" msgid="9093949757757445117">"នៅ <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="preposition_for_time" msgid="5506831244263083793">"នៅម៉ោង <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="preposition_for_year" msgid="5040395640711867177">"ក្នុងឆ្នាំ <xliff:g id="YEAR">%s</xliff:g>"</string>
- <string name="day" msgid="8144195776058119424">"ថ្ងៃ"</string>
+ <string name="day" msgid="8144195776058119424">"ថ្ងៃ"</string>
<string name="days" msgid="4774547661021344602">"ថ្ងៃ"</string>
<string name="hour" msgid="2126771916426189481">"ម៉ោង"</string>
<string name="hours" msgid="894424005266852993">"ម៉ោង"</string>
- <string name="minute" msgid="9148878657703769868">"នាទី"</string>
+ <string name="minute" msgid="9148878657703769868">"នាទី"</string>
<string name="minutes" msgid="5646001005827034509">"នាទី"</string>
- <string name="second" msgid="3184235808021478">"វិនាទី"</string>
+ <string name="second" msgid="3184235808021478">"វិនាទី"</string>
<string name="seconds" msgid="3161515347216589235">"វិនាទី"</string>
- <string name="week" msgid="5617961537173061583">"សប្ដាហ៍"</string>
- <string name="weeks" msgid="6509623834583944518">"សប្ដាហ៍"</string>
- <string name="year" msgid="4001118221013892076">"ឆ្នាំ"</string>
- <string name="years" msgid="6881577717993213522">"ឆ្នាំ"</string>
+ <string name="week" msgid="5617961537173061583">"សប្ដាហ៍"</string>
+ <string name="weeks" msgid="6509623834583944518">"សប្ដាហ៍"</string>
+ <string name="year" msgid="4001118221013892076">"ឆ្នាំ"</string>
+ <string name="years" msgid="6881577717993213522">"ឆ្នាំ"</string>
<plurals name="duration_seconds">
<item quantity="one" msgid="6962015528372969481">"1 វិនាទី"</item>
<item quantity="other" msgid="1886107766577166786">"<xliff:g id="COUNT">%d</xliff:g> វិនាទី"</item>
@@ -1158,12 +1158,12 @@
<string name="VideoView_error_title" msgid="3534509135438353077">"បញ្ហាវីដេអូ"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"វីដេអូនេះមិនត្រឹមត្រូវសម្រាប់ចរន្តចូលឧបករណ៍នេះ។"</string>
<string name="VideoView_error_text_unknown" msgid="3450439155187810085">"មិនអាចចាក់វីដេអូនេះ។"</string>
- <string name="VideoView_error_button" msgid="2822238215100679592">"យល់ព្រម"</string>
+ <string name="VideoView_error_button" msgid="2822238215100679592">"យល់ព្រម"</string>
<string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="noon" msgid="7245353528818587908">"រសៀល"</string>
<string name="Noon" msgid="3342127745230013127">"រសៀល"</string>
<string name="midnight" msgid="7166259508850457595">"កណ្ដាលអធ្រាត្រ"</string>
- <string name="Midnight" msgid="5630806906897892201">"កណ្ដាលអធ្រាត្រ"</string>
+ <string name="Midnight" msgid="5630806906897892201">"កណ្ដាលអធ្រាត្រ"</string>
<string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
<string name="elapsed_time_short_format_h_mm_ss" msgid="1846071997616654124">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string>
<string name="selectAll" msgid="6876518925844129331">"ជ្រើសទាំងអស់"</string>
@@ -1180,14 +1180,14 @@
<string name="inputMethod" msgid="1653630062304567879">"វិធីសាស្ត្របញ្ចូល"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"សកម្មភាពអត្ថបទ"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"អស់ទំហំផ្ទុក"</string>
- <string name="low_internal_storage_view_text" msgid="6640505817617414371">"មុខងារប្រព័ន្ធមួយចំនួនអាចមិនដំណើរការ"</string>
+ <string name="low_internal_storage_view_text" msgid="6640505817617414371">"មុខងារប្រព័ន្ធមួយចំនួនអាចមិនដំណើរការ"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"មិនមានទំហំផ្ទុកគ្រប់គ្រាន់សម្រាប់ប្រព័ន្ធ។ សូមប្រាកដថាអ្នកមានទំហំទំនេរ 250MB ហើយចាប់ផ្ដើមឡើងវិញ។"</string>
<string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុងដំណើរការ"</string>
<string name="app_running_notification_text" msgid="4653586947747330058">"ប៉ះ ដើម្បីមើលព័ត៌មានបន្ថែម ឬបញ្ឈប់កម្មវិធី។"</string>
- <string name="ok" msgid="5970060430562524910">"យល់ព្រម"</string>
- <string name="cancel" msgid="6442560571259935130">"បោះបង់"</string>
- <string name="yes" msgid="5362982303337969312">"យល់ព្រម"</string>
- <string name="no" msgid="5141531044935541497">"បោះបង់"</string>
+ <string name="ok" msgid="5970060430562524910">"យល់ព្រម"</string>
+ <string name="cancel" msgid="6442560571259935130">"បោះបង់"</string>
+ <string name="yes" msgid="5362982303337969312">"យល់ព្រម"</string>
+ <string name="no" msgid="5141531044935541497">"បោះបង់"</string>
<string name="dialog_alert_title" msgid="2049658708609043103">"ប្រយ័ត្ន"</string>
<string name="loading" msgid="7933681260296021180">"កំពុងផ្ទុក..."</string>
<string name="capital_on" msgid="1544682755514494298">"បើក"</string>
@@ -1207,7 +1207,7 @@
<string name="alwaysUse" msgid="4583018368000610438">"ប្រើតាមលំនាំដើមសម្រាប់សកម្មភាពនេះ។"</string>
<string name="use_a_different_app" msgid="8134926230585710243">"ប្រើកម្មវិធីផ្សេង"</string>
<string name="clearDefaultHintMsg" msgid="3252584689512077257">"សម្អាតលំនាំដើមក្នុងការកំណត់ប្រព័ន្ធ > កម្មវិធី > ទាញយក។"</string>
- <string name="chooseActivity" msgid="7486876147751803333">"ជ្រើសសកម្មភាព"</string>
+ <string name="chooseActivity" msgid="7486876147751803333">"ជ្រើសសកម្មភាព"</string>
<string name="chooseUsbActivity" msgid="6894748416073583509">"ជ្រើសកម្មវិធីសម្រាប់ឧបករណ៍យូអេសប៊ី"</string>
<string name="noApplications" msgid="2991814273936504689">"គ្មានកម្មវិធីអាចអនុវត្តសកម្មភាពនេះ។"</string>
<string name="aerr_title" msgid="1905800560317137752"></string>
@@ -1218,7 +1218,7 @@
<string name="anr_activity_process" msgid="5776209883299089767">"សកម្មភាព <xliff:g id="ACTIVITY">%1$s</xliff:g> មិនឆ្លើយតប។\n\nតើអ្នកចង់បិទវា?"</string>
<string name="anr_application_process" msgid="8941757607340481057">"<xliff:g id="APPLICATION">%1$s</xliff:g> មិនឆ្លើយតប។ តើអ្នកចង់បិទវា?"</string>
<string name="anr_process" msgid="6513209874880517125">"ដំណើរការ <xliff:g id="PROCESS">%1$s</xliff:g> មិនឆ្លើយតប។ \n\nតើអ្នកចង់បិទវាឬ?"</string>
- <string name="force_close" msgid="8346072094521265605">"យល់ព្រម"</string>
+ <string name="force_close" msgid="8346072094521265605">"យល់ព្រម"</string>
<string name="report" msgid="4060218260984795706">"រាយការណ៍"</string>
<string name="wait" msgid="7147118217226317732">"រង់ចាំ"</string>
<string name="webpage_unresponsive" msgid="3272758351138122503">"ទំព័រក្លាយជាមិនឆ្លើយតប។\n\nតើអ្នកចង់បិទវា?"</string>
@@ -1300,7 +1300,7 @@
<string name="sms_short_code_details" msgid="5873295990846059400">"វា "<b>"អាចគិតលុយ"</b>" លើគណនីចល័តរបស់អ្នក។"</string>
<string name="sms_premium_short_code_details" msgid="7869234868023975"><b>"វានឹងគិតលុយគណនីចល័តរបស់អ្នក។"</b></string>
<string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"ផ្ញើ"</string>
- <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"បោះបង់"</string>
+ <string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"បោះបង់"</string>
<string name="sms_short_code_remember_choice" msgid="5289538592272218136">"ចងចាំជម្រើសរបស់ខ្ញុំ"</string>
<string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"អ្នកអាចប្ដូរវាពេលក្រោយក្នុងការកំណត់ > កម្មវិធី"</string>
<string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"អនុញ្ញាតជានិច្ច"</string>
@@ -1311,8 +1311,8 @@
<string name="sim_added_title" msgid="3719670512889674693">"បានបន្ថែមស៊ីមកាត"</string>
<string name="sim_added_message" msgid="7797975656153714319">"ចាប់ផ្ដើមឧបករណ៍របស់អ្នកឡើងវិញ ដើម្បីចូលប្រើបណ្ដាញចល័ត។"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"ចាប់ផ្ដើមឡើងវិញ"</string>
- <string name="time_picker_dialog_title" msgid="8349362623068819295">"កំណត់ម៉ោង"</string>
- <string name="date_picker_dialog_title" msgid="5879450659453782278">"កំណត់កាលបរិច្ឆេទ"</string>
+ <string name="time_picker_dialog_title" msgid="8349362623068819295">"កំណត់ម៉ោង"</string>
+ <string name="date_picker_dialog_title" msgid="5879450659453782278">"កំណត់កាលបរិច្ឆេទ"</string>
<string name="date_time_set" msgid="5777075614321087758">"កំណត់"</string>
<string name="date_time_done" msgid="2507683751759308828">"រួចរាល់"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"ថ្មី៖ "</font></string>
@@ -1390,7 +1390,7 @@
<string name="permdesc_copyProtectedData" msgid="4390697124288317831">"ឲ្យកម្មវិធីដកសេវាកម្មនៃកម្មវិធីផ្ទុកលំនាំដើម ដើម្បីចម្លងមាតិកា។ មិនសម្រាប់ប្រើដោយកម្មវិធីលំនាំដើម។"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"នាំផ្លូវលទ្ធផលមេឌៀ"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"ឲ្យកម្មវិធីនាំផ្លូវលទ្ធផលមេឌៀទៅឧបករណ៍ខាងក្រៅផ្សេង។"</string>
- <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"ចូលដំណើរការឧបករណ៍ផ្ទុកសុវត្ថិភាព"</string>
+ <string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"ចូលដំណើរការឧបករណ៍ផ្ទុកសុវត្ថិភាព"</string>
<string name="permdesc_access_keyguard_secure_storage" msgid="5866245484303285762">"ឲ្យកម្មវិធីចូលការផ្ទុកមានសុវត្ថិភាព keguard ។"</string>
<string name="permlab_control_keyguard" msgid="172195184207828387">"ពិនិត្យការបង្ហាញ និងលាក់ការការពារ"</string>
<string name="permdesc_control_keyguard" msgid="3043732290518629061">"ឲ្យកម្មវិធីគ្រប់គ្រង keguard ។"</string>
@@ -1413,7 +1413,7 @@
<string name="ime_action_go" msgid="8320845651737369027">"ទៅ"</string>
<string name="ime_action_search" msgid="658110271822807811">"ស្វែងរក"</string>
<string name="ime_action_send" msgid="2316166556349314424">"ផ្ញើ"</string>
- <string name="ime_action_next" msgid="3138843904009813834">"បន្ទាប់"</string>
+ <string name="ime_action_next" msgid="3138843904009813834">"បន្ទាប់"</string>
<string name="ime_action_done" msgid="8971516117910934605">"រួចរាល់"</string>
<string name="ime_action_previous" msgid="1443550039250105948">"មុន"</string>
<string name="ime_action_default" msgid="2840921885558045721">"អនុវត្ត"</string>
@@ -1422,7 +1422,7 @@
<string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"កម្មវិធីមួយ ឬច្រើនដូចខាងក្រោមស្នើសិទ្ធិ ដើម្បីចូលគណនីរបស់អ្នកឥឡូវ និងពេលអនាគត។"</string>
<string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"តើអ្នកចង់អនុញ្ញាតសំណើនេះ?"</string>
<string name="grant_permissions_header_text" msgid="6874497408201826708">"ស្នើចូល"</string>
- <string name="allow" msgid="7225948811296386551">"អនុញ្ញាត"</string>
+ <string name="allow" msgid="7225948811296386551">"អនុញ្ញាត"</string>
<string name="deny" msgid="2081879885755434506">"បដិសេធ"</string>
<string name="permission_request_notification_title" msgid="6486759795926237907">"បានស្នើសិទ្ធិ"</string>
<string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"បានស្នើសិទ្ធិ\nសម្រាប់គណនី <xliff:g id="ACCOUNT">%s</xliff:g> ។"</string>
@@ -1447,12 +1447,12 @@
<string name="no_file_chosen" msgid="6363648562170759465">"គ្មានឯកសារបានជ្រើស"</string>
<string name="reset" msgid="2448168080964209908">"កំណត់ឡើងវិញ"</string>
<string name="submit" msgid="1602335572089911941">"ដាក់ស្នើ"</string>
- <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"បានបើករបៀបរថយន្ត"</string>
+ <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"បានបើករបៀបរថយន្ត"</string>
<string name="car_mode_disable_notification_message" msgid="8035230537563503262">"ប៉ះ ដើម្បីចេញពីរបៀបរថយន្ត។"</string>
<string name="tethered_notification_title" msgid="3146694234398202601">"ភ្ជាប់ ឬហតស្ពតសកម្ម"</string>
<string name="tethered_notification_message" msgid="6857031760103062982">"ប៉ះ ដើម្បីរៀបចំ។"</string>
<string name="back_button_label" msgid="2300470004503343439">"ថយក្រោយ"</string>
- <string name="next_button_label" msgid="1080555104677992408">"បន្ទាប់"</string>
+ <string name="next_button_label" msgid="1080555104677992408">"បន្ទាប់"</string>
<string name="skip_button_label" msgid="1275362299471631819">"រំលង"</string>
<string name="no_matches" msgid="8129421908915840737">"គ្មានការផ្គូផ្គង"</string>
<string name="find_on_page" msgid="1946799233822820384">"រកក្នុងទំព័រ"</string>
@@ -1474,7 +1474,7 @@
<string name="media_shared" product="nosdcard" msgid="5830814349250834225">"ឧបករណ៍ផ្ទុកយូអេសប៊ីបច្ចុប្បន្នកំពុងប្រើដោយកុំព្យូទ័រ។"</string>
<string name="media_shared" product="default" msgid="5706130568133540435">"បច្ចុប្បន្នកាតអេសឌីកំពុងប្រើដោយកុំព្យូទ័រ"</string>
<string name="media_unknown_state" msgid="729192782197290385">"មិនស្គាល់ស្ថានភាពមេឌៀខាងក្រៅ។"</string>
- <string name="share" msgid="1778686618230011964">"ចែករំលែក"</string>
+ <string name="share" msgid="1778686618230011964">"ចែករំលែក"</string>
<string name="find" msgid="4808270900322985960">"រក"</string>
<string name="websearch" msgid="4337157977400211589">"ស្វែងរកតាមបណ្ដាញ"</string>
<string name="find_next" msgid="5742124618942193978">"រកបន្ទាប់"</string>
@@ -1490,7 +1490,7 @@
<string name="sync_undo_deletes" msgid="2941317360600338602">"មិនធ្វើការលុបវិញ"</string>
<string name="sync_do_nothing" msgid="3743764740430821845">"មិនធ្វើអ្វីទេឥឡូវ"</string>
<string name="choose_account_label" msgid="5655203089746423927">"ជ្រើសគណនី"</string>
- <string name="add_account_label" msgid="2935267344849993553">"បន្ថែមគណនីថ្មី"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"បន្ថែមគណនីថ្មី"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"បន្ថែមគណនី"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"បង្កើន"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"បន្ថយ"</string>
@@ -1509,15 +1509,15 @@
<string name="date_picker_increment_year_button" msgid="6318697384310808899">"បង្កើនឆ្នាំ"</string>
<string name="date_picker_decrement_year_button" msgid="4482021813491121717">"បន្ថយឆ្នាំ"</string>
<string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Alt"</string>
- <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"បោះបង់"</string>
+ <string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"បោះបង់"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"លុប"</string>
<string name="keyboardview_keycode_done" msgid="1992571118466679775">"រួចរាល់"</string>
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"ប្ដូររបៀប"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
- <string name="activitychooserview_choose_application" msgid="2125168057199941199">"ជ្រើសកម្មវិធី"</string>
+ <string name="activitychooserview_choose_application" msgid="2125168057199941199">"ជ្រើសកម្មវិធី"</string>
<string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"មិនអាចចាប់ផ្ដើម <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
- <string name="shareactionprovider_share_with" msgid="806688056141131819">"ចែករំលែកជាមួយ"</string>
+ <string name="shareactionprovider_share_with" msgid="806688056141131819">"ចែករំលែកជាមួយ"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"ចែករំលែកជាមួយ <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"គ្រប់គ្រងការរុញ។ ប៉ះ & សង្កត់។"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"អូស ដើម្បីដោះសោ។"</string>
@@ -1531,7 +1531,7 @@
<string name="storage_internal" msgid="4891916833657929263">"ឧបករណ៍ផ្ទុកខាងក្នុង"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"កាតអេសឌី"</string>
<string name="storage_usb" msgid="3017954059538517278">"ឧបករណ៍ផ្ទុកយូអេសប៊ី"</string>
- <string name="extract_edit_menu_button" msgid="8940478730496610137">"កែសម្រួល"</string>
+ <string name="extract_edit_menu_button" msgid="8940478730496610137">"កែសម្រួល"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"ការព្រមានប្រើទិន្នន័យ"</string>
<string name="data_usage_warning_body" msgid="2814673551471969954">"ប៉ះ ដើម្បីមើលការប្រើ និងការកំណត់។"</string>
<string name="data_usage_3g_limit_title" msgid="4361523876818447683">"បានដល់ដែនកំណត់ទិន្នន័យ 2G-3G"</string>
@@ -1589,7 +1589,7 @@
<string name="media_route_status_available" msgid="6983258067194649391">"ទំនេរ"</string>
<string name="media_route_status_not_available" msgid="6739899962681886401">"មិនទំនេរ"</string>
<string name="media_route_status_in_use" msgid="4533786031090198063">"កំពុងប្រើ"</string>
- <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"អេក្រង់ជាប់"</string>
+ <string name="display_manager_built_in_display_name" msgid="2583134294292563941">"អេក្រង់ជាប់"</string>
<string name="display_manager_hdmi_display_name" msgid="1555264559227470109">"អេក្រង់ HDMI"</string>
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"#<xliff:g id="ID">%1$d</xliff:g> ត្រួតគ្នា"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
@@ -1615,8 +1615,8 @@
<string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"កូដ PIN មិនដូចគ្នា"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ព្យាយាមលំនាំច្រើនពេក"</string>
<string name="kg_login_instructions" msgid="1100551261265506448">"ដើម្បីដោះសោ ចូលក្នុងគណនី Google ។"</string>
- <string name="kg_login_username_hint" msgid="5718534272070920364">"ឈ្មោះអ្នកប្រើ (អ៊ីម៉ែល)"</string>
- <string name="kg_login_password_hint" msgid="9057289103827298549">"ពាក្យសម្ងាត់"</string>
+ <string name="kg_login_username_hint" msgid="5718534272070920364">"ឈ្មោះអ្នកប្រើ (អ៊ីមែល)"</string>
+ <string name="kg_login_password_hint" msgid="9057289103827298549">"ពាក្យសម្ងាត់"</string>
<string name="kg_login_submit_button" msgid="5355904582674054702">"ចូល"</string>
<string name="kg_login_invalid_input" msgid="5754664119319872197">"ឈ្មោះអ្នកប្រើ ឬពាក្យសម្ងាត់មិនត្រឹមត្រូវ។"</string>
<string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ភ្លេចឈ្មោះអ្នកប្រើ ឬពាក្យសម្ងាត់របស់អ្នក?\nមើល "<b>"google.com/accounts/recovery"</b>" ។"</string>
@@ -1726,7 +1726,7 @@
<string name="mediasize_japanese_you4" msgid="2091777168747058008">"You4"</string>
<string name="mediasize_unknown_portrait" msgid="3088043641616409762">"មិនស្គាល់បញ្ឈរ"</string>
<string name="mediasize_unknown_landscape" msgid="4876995327029361552">"មិនស្គាល់ទេសភាព"</string>
- <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"បានបោះបង់"</string>
+ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"បានបោះបង់"</string>
<string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"កំហុសក្នុងការសរសេរមាតិកា"</string>
<string name="reason_unknown" msgid="6048913880184628119">"មិនស្គាល់"</string>
<string name="reason_service_unavailable" msgid="7824008732243903268">"មិនបានបើកសេវាកម្មបោះពុម្ព"</string>
@@ -1759,16 +1759,12 @@
<string name="item_is_selected" msgid="949687401682476608">"បានជ្រើស <xliff:g id="ITEM">%1$s</xliff:g>"</string>
<string name="deleted_key" msgid="7659477886625566590">"បានលុប <xliff:g id="KEY">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"កន្លែងធ្វើការ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"ដើម្បីមិនភ្ជាប់អេក្រង់នេះ ប៉ះ ហើយសង្កត់ថយក្រោយ និងទិដ្ឋភាពនៅពេលតែមួយ។"</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ដើម្បីមិនភ្ជាប់អេក្រង់នេះ ប៉ះ ហើយសង្កត់ទិដ្ឋភាព។"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"អេក្រង់ត្រូវបានភ្ជាប់។ ការផ្ដាច់មិនត្រូវបានអនុញ្ញាតដោយស្ថាប័នរបស់អ្នក។"</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"ប្រើការភ្ជាប់អេក្រង់?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"ការភ្ជាប់អេក្រង់ចាក់សោការបង្ហាញក្នុងទិដ្ឋភាពតែមួយ។\n\nដើម្បីមិនភ្ជាប់ ប៉ះ ហើយសង្កត់ថយក្រោយ និងទិដ្ឋភាពនៅពេលតែមួយ។"</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"ការភ្ជាប់អេក្រង់ចាក់សោការបង្ហាញក្នុងទិដ្ឋភាពតែមួយ។\n\nដើម្បីមិនភ្ជាប់ ប៉ះ ហើយសង្កត់ទិដ្ឋភាព។"</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"ទេ, អរគុណ!"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"ចាប់ផ្ដើម"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"បានភ្ជាប់អេក្រង់"</string>
diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml
index ea9db0c..8692a4f 100644
--- a/core/res/res/values-kn-rIN/strings.xml
+++ b/core/res/res/values-kn-rIN/strings.xml
@@ -54,17 +54,17 @@
<string name="serviceErased" msgid="1288584695297200972">"ಅಳಿಸುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿದೆ."</string>
<string name="passwordIncorrect" msgid="7612208839450128715">"ತಪ್ಪಾದ ಪಾಸ್ವರ್ಡ್."</string>
<string name="mmiComplete" msgid="8232527495411698359">"MMI ಪೂರ್ಣಗೊಂಡಿದೆ."</string>
- <string name="badPin" msgid="9015277645546710014">"ನೀವು ಟೈಪ್ ಮಾಡಿದ ಹಳೆಯ PIN ಸರಿಯಾಗಿಲ್ಲ."</string>
+ <string name="badPin" msgid="9015277645546710014">"ನೀವು ಟೈಪ್ ಮಾಡಿದ ಹಳೆಯ ಪಿನ್ ಸರಿಯಾಗಿಲ್ಲ."</string>
<string name="badPuk" msgid="5487257647081132201">"ನೀವು ಟೈಪ್ ಮಾಡಿದ PUK ಸರಿಯಾಗಿಲ್ಲ."</string>
- <string name="mismatchPin" msgid="609379054496863419">"ನೀವು ಟೈಪ್ ಮಾಡಿದ PIN ಗಳು ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ."</string>
- <string name="invalidPin" msgid="3850018445187475377">"4 ರಿಂದ 8 ಸಂಖ್ಯೆಗಳಿರುವ PIN ಟೈಪ್ ಮಾಡಿ."</string>
+ <string name="mismatchPin" msgid="609379054496863419">"ನೀವು ಟೈಪ್ ಮಾಡಿದ ಪಿನ್ ಗಳು ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ."</string>
+ <string name="invalidPin" msgid="3850018445187475377">"4 ರಿಂದ 8 ಸಂಖ್ಯೆಗಳಿರುವ ಪಿನ್ ಟೈಪ್ ಮಾಡಿ."</string>
<string name="invalidPuk" msgid="8761456210898036513">"8 ಅಥವಾ ಅದಕ್ಕಿಂತ ಹೆಚ್ಚು ಸಂಖ್ಯೆಗಳಿರುವ PUK ಟೈಪ್ ಮಾಡಿ."</string>
- <string name="needPuk" msgid="919668385956251611">"ನಿಮ್ಮ SIM ಕಾರ್ಡ್ PUK-ಲಾಕ್ ಆಗಿದೆ. ಅದನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು PUK ಕೋಡ್ ಟೈಪ್ ಮಾಡಿ."</string>
- <string name="needPuk2" msgid="4526033371987193070">"SIM ಕಾರ್ಡ್ ಅನ್ಲಾಕ್ ಮಾಡಲು PUK2 ಟೈಪ್ ಮಾಡಿ."</string>
- <string name="enablePin" msgid="209412020907207950">"ಯಶಸ್ವಿಯಾಗಿಲ್ಲ, SIM/RUIM ಲಾಕ್ ಸಕ್ರಿಯಗೊಳಿಸಿ."</string>
+ <string name="needPuk" msgid="919668385956251611">"ನಿಮ್ಮ ಸಿಮ್ ಕಾರ್ಡ್ PUK-ಲಾಕ್ ಆಗಿದೆ. ಅದನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು PUK ಕೋಡ್ ಟೈಪ್ ಮಾಡಿ."</string>
+ <string name="needPuk2" msgid="4526033371987193070">"ಸಿಮ್ ಕಾರ್ಡ್ ಅನ್ಲಾಕ್ ಮಾಡಲು PUK2 ಟೈಪ್ ಮಾಡಿ."</string>
+ <string name="enablePin" msgid="209412020907207950">"ಯಶಸ್ವಿಯಾಗಿಲ್ಲ, ಸಿಮ್/RUIM ಲಾಕ್ ಸಕ್ರಿಯಗೊಳಿಸಿ."</string>
<plurals name="pinpuk_attempts">
- <item quantity="one" msgid="6596245285809790142">"SIM ಲಾಕ್ ಆಗುವುದಕ್ಕಿಂತ ಮೊದಲು ನಿಮ್ಮಲ್ಲಿ <xliff:g id="NUMBER">%d</xliff:g> ಪ್ರಯತ್ನ ಬಾಕಿ ಉಳಿದಿದೆ."</item>
- <item quantity="other" msgid="7530597808358774740">"SIM ಲಾಕ್ ಆಗುವುದಕ್ಕೂ ಮೊದಲು ನಿಮ್ಮಲ್ಲಿ <xliff:g id="NUMBER">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ."</item>
+ <item quantity="one" msgid="6596245285809790142">"ಸಿಮ್ ಲಾಕ್ ಆಗುವುದಕ್ಕಿಂತ ಮೊದಲು ನಿಮ್ಮಲ್ಲಿ <xliff:g id="NUMBER">%d</xliff:g> ಪ್ರಯತ್ನ ಬಾಕಿ ಉಳಿದಿದೆ."</item>
+ <item quantity="other" msgid="7530597808358774740">"ಸಿಮ್ ಲಾಕ್ ಆಗುವುದಕ್ಕೂ ಮೊದಲು ನಿಮ್ಮಲ್ಲಿ <xliff:g id="NUMBER">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ."</item>
</plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
@@ -76,7 +76,7 @@
<string name="CwMmi" msgid="9129678056795016867">"ಕರೆ ನಿರೀಕ್ಷೆ"</string>
<string name="BaMmi" msgid="455193067926770581">"ಕರೆ ಬಾರಿಂಗ್"</string>
<string name="PwdMmi" msgid="7043715687905254199">"ಪಾಸ್ವರ್ಡ್ ಬದಲಾವಣೆ"</string>
- <string name="PinMmi" msgid="3113117780361190304">"PIN ಬದಲಾವಣೆ"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"ಪಿನ್ ಬದಲಾವಣೆ"</string>
<string name="CnipMmi" msgid="3110534680557857162">"ಕರೆ ಮಾಡುತ್ತಿರುವ ಸಂಖ್ಯೆಯು ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ"</string>
<string name="CnirMmi" msgid="3062102121430548731">"ಕರೆ ಮಾಡುವ ಸಂಖ್ಯೆಯನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
<string name="ThreeWCMmi" msgid="9051047170321190368">"ಮೂರು ಮಾರ್ಗದಲ್ಲಿ ಕರೆ ಮಾಡುವಿಕೆ"</string>
@@ -289,11 +289,11 @@
<string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"ಸಂದೇಶದ ಈವೆಂಟ್ಗಳ ಮೂಲಕ ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸಿ"</string>
<string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"ಒಳಬರುವ ಕರೆಗಳಿಗಾಗಿ ಸಂದೇಶದ ಈವೆಂಟ್ಗಳ ಮೂಲಕ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ನಿರ್ವಹಿಸುವ ಸಲುವಾಗಿ ಇತರ ಸಂದೇಶದ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ವಿನಂತಿಗಳನ್ನು ಕಳುಹಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_readSms" msgid="8745086572213270480">"ನಿಮ್ಮ ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಓದಿ (SMS ಅಥವಾ MMS)"</string>
- <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅಥವಾ SIM ಕಾರ್ಡ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾದ SMS ಸಂದೇಶಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು ವಿಷಯ ಅಥವಾ ಗೌಪ್ಯತೆಯನ್ನು ಲೆಕ್ಕಿಸದೆಯೇ, ಎಲ್ಲಾ SMS ಸಂದೇಶಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
- <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"ನಿಮ್ಮ ಫೋನ್ ಅಥವಾ SIM ಕಾರ್ಡ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾದ SMS ಸಂದೇಶಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು ವಿಷಯ ಅಥವಾ ಗೌಪ್ಯತೆಯನ್ನು ಲೆಕ್ಕಿಸದೆಯೇ, ಎಲ್ಲಾ SMS ಸಂದೇಶಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅಥವಾ ಸಿಮ್ ಕಾರ್ಡ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾದ SMS ಸಂದೇಶಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು ವಿಷಯ ಅಥವಾ ಗೌಪ್ಯತೆಯನ್ನು ಲೆಕ್ಕಿಸದೆಯೇ, ಎಲ್ಲಾ SMS ಸಂದೇಶಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"ನಿಮ್ಮ ಫೋನ್ ಅಥವಾ ಸಿಮ್ ಕಾರ್ಡ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾದ SMS ಸಂದೇಶಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಇದು ವಿಷಯ ಅಥವಾ ಗೌಪ್ಯತೆಯನ್ನು ಲೆಕ್ಕಿಸದೆಯೇ, ಎಲ್ಲಾ SMS ಸಂದೇಶಗಳನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_writeSms" msgid="3216950472636214774">"ನಿಮ್ಮ ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಸಂಪಾದಿಸಿ (SMS ಅಥವಾ MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅಥವಾ SIM ಕಾರ್ಡ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗಿರುವ SMS ಸಂದೇಶಗಳನ್ನು ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನಿಮ್ಮ ಸಂದೇಶಗಳನ್ನು ಅಳಿಸಬಹುದು."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"ನಿಮ್ಮ ಫೋನ್ ಅಥವಾ SIM ಕಾರ್ಡ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾದ SMS ಸಂದೇಶಗಳಲ್ಲಿ ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನಿಮ್ಮ ಸಂದೇಶಗಳನ್ನು ಅಳಿಸಬಹುದು."</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅಥವಾ ಸಿಮ್ ಕಾರ್ಡ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗಿರುವ SMS ಸಂದೇಶಗಳನ್ನು ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನಿಮ್ಮ ಸಂದೇಶಗಳನ್ನು ಅಳಿಸಬಹುದು."</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"ನಿಮ್ಮ ಫೋನ್ ಅಥವಾ ಸಿಮ್ ಕಾರ್ಡ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾದ SMS ಸಂದೇಶಗಳಲ್ಲಿ ಬರೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನಿಮ್ಮ ಸಂದೇಶಗಳನ್ನು ಅಳಿಸಬಹುದು."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಿ (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಈ ಅನುಮತಿಯು, ನಿಮಗೆ ಕಳುಹಿಸಲಾಗಿರುವ ಸಂದೇಶಗಳನ್ನು ನಿಮಗೆ ತೋರಿಸದೆಯೇ, ಅವುಗಳನ್ನು ಮಾನಿಟರ್ ಮಾಡುವ ಅಥವಾ ಅಳಿಸುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ."</string>
<string name="permlab_receiveBluetoothMap" msgid="7593811487142360528">"ಬ್ಲೂಟೂತ್ ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಿ (MAP)"</string>
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"ನಿಮ್ಮದೇ ಸಂಪರ್ಕದ ಕಾರ್ಡ್ ಮಾರ್ಪಡಿಸಿ"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗಿರುವ ನಿಮ್ಮ ಹೆಸರು ಹಾಗೂ ಸಂಪರ್ಕ ಮಾಹಿತಿಯಂತಹ, ವೈಯಕ್ತಿಕ ಪ್ರೊಫೈಲ್ ಮಾಹಿತಿಯನ್ನು ಬದಲಿಸಲು ಅಥವಾ ಸೇರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಅಂದರೆ, ಅಪ್ಲಿಕೇಶನ್ ನಿಮ್ಮನ್ನು ಗುರುತಿಸಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಪ್ರೊಫೈಲ್ ಮಾಹಿತಿಯನ್ನು ಇತರರಿಗೆ ಕಳುಹಿಸಬಹುದು ಎಂದರ್ಥ."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"ದೇಹದ ಸಂವೇದಗಳು (ಹೃದಯದ ರೇಟ್ ಮಾನಿಟರ್ಗಳಂತಹ)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"ಹೃದಯ ಬಡಿತದಂತಹ, ನಿಮ್ಮ ದೇಹದಲ್ಲಿ ಏನು ನಡೆಯುತ್ತಿದೆ ಎಂಬುದನ್ನು ಅಳತೆ ಮಾಡಲು ನೀವು ಬಳಸುವ ಸಂವೇದಕಗಳಿಂದ ಡೇಟಾ ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"ನಿಮ್ಮ ಹೃದಯ ಬಡಿತದಂತಹ ನಿಮ್ಮ ದೈಹಿಕ ಸ್ಥಿತಿಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುವ ಸೆನ್ಸಾರ್ಸ್ಗಳಿಂದ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"ನಿಮ್ಮ ಸಾಮಾಜಿಕ ಸ್ಟ್ರೀಮ್ ಓದಿರಿ"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"ನೀವು ಮತ್ತು ನಿಮ್ಮ ಸ್ನೇಹಿತರ ಸಾಮಾಜಿಕ ನವೀಕರಣಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಮತ್ತು ಸಿಂಕ್ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಮಾಹಿತಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳುವಾಗ ಜಾಗರೂಕರಾಗಿರಿ -- ಇದು ಗೌಪ್ಯತೆಯನ್ನು ಲೆಕ್ಕಿಸದೆಯೇ, ಸಾಮಾಜಿಕ ನೆಟ್ವರ್ಕ್ಗಳಲ್ಲಿ ನೀವು ಮತ್ತು ನಿಮ್ಮ ಸ್ನೇಹಿತರ ನಡುವೆ ನಡೆದಿರುವ ಸಂವಹನವನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಗಮನಿಸಿ: ಈ ಅನುಮತಿಯನ್ನು ಎಲ್ಲಾ ಸಾಮಾಜಿಕ ನೆಟ್ವರ್ಕ್ಗಳಲ್ಲಿ ಜಾರಿಗೊಳಿಸದೇ ಇರಬಹುದು."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"ನಿಮ್ಮ ಸಾಮಾಜಿಕ ಸ್ಟ್ರೀಮ್ನಲ್ಲಿ ಬರೆಯಿರಿ"</string>
@@ -521,10 +521,10 @@
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"ಫ್ರೇಮ್ ಬಫರ್ ವಿಷಯವನ್ನು ಓದಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger ಪ್ರವೇಶಿಸಿ"</string>
<string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"InputFlinger ಕೆಳಮಟ್ಟದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
- <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wifi ಪ್ರದರ್ಶನಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ"</string>
- <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Wifi ಪ್ರದರ್ಶನಗಳಿಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಮತ್ತು ಸಂಪರ್ಕಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ."</string>
- <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Wifi ಪ್ರದರ್ಶನಗಳನ್ನು ನಿಯಂತ್ರಿಸಿ"</string>
- <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Wifi ಪ್ರದರ್ಶನಗಳ ಕೆಳ-ಮಟ್ಟದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ನಿಯಂತ್ರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಕಲ್ಪಿಸುತ್ತದೆ."</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"ವೈಫೈ ಪ್ರದರ್ಶನಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"ವೈಫೈ ಪ್ರದರ್ಶನಗಳಿಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಮತ್ತು ಸಂಪರ್ಕಪಡಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ."</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"ವೈಫೈ ಪ್ರದರ್ಶನಗಳನ್ನು ನಿಯಂತ್ರಿಸಿ"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"ವೈಫೈ ಪ್ರದರ್ಶನಗಳ ಕೆಳ-ಮಟ್ಟದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ನಿಯಂತ್ರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಕಲ್ಪಿಸುತ್ತದೆ."</string>
<string name="permlab_captureAudioOutput" msgid="6857134498402346708">"ಆಡಿಯೊ ಔಟ್ಪುಟ್ ಸೆರೆಹಿಡಿಯಿರಿ"</string>
<string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"ಆಡಿಯೊ ಔಟ್ಪುಟ್ ಸೆರೆಹಿಡಿಯಲು ಮತ್ತು ಮರುನಿರ್ದೇಶಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
<string name="permlab_captureAudioHotword" msgid="1890553935650349808">"ಹಾಟ್ವರ್ಡ್ ಪತ್ತೆಹಚ್ಚುವಿಕೆ"</string>
@@ -542,7 +542,7 @@
<string name="permlab_recordAudio" msgid="3876049771427466323">"ಆಡಿಯೊ ರೆಕಾರ್ಡ್ ಮಾಡಿ"</string>
<string name="permdesc_recordAudio" msgid="4906839301087980680">"ಮೈಕ್ರೋಫೋನ್ ಮೂಲಕ ಆಡಿಯೊ ರೆಕಾರ್ಡ್ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ. ಈ ಅನುಮತಿಯು ನಿಮ್ಮ ಖಾತರಿ ಇಲ್ಲದೆಯೇ, ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಆಡಿಯೊ ರೆಕಾರ್ಡ್ ಮಾಡಿಕೊಳ್ಳಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_sim_communication" msgid="1180265879464893029">"ಸಿಮ್ ಸಂವಹನ"</string>
- <string name="permdesc_sim_communication" msgid="5725159654279639498">"SIM ಗೆ ಆದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದು ತುಂಬಾ ಅಪಾಯಕಾರಿ."</string>
+ <string name="permdesc_sim_communication" msgid="5725159654279639498">"ಸಿಮ್ ಗೆ ಆದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದು ತುಂಬಾ ಅಪಾಯಕಾರಿ."</string>
<string name="permlab_camera" msgid="3616391919559751192">"ಚಿತ್ರಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳನ್ನು ಸೆರೆಹಿಡಿಯಿರಿ"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"ಕ್ಯಾಮರಾ ಮೂಲಕ ಚಿತ್ರಗಳು ಮತ್ತು ವೀಡಿಯೊಗಳನ್ನು ಸೆರೆಹಿಡಿಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಈ ಅನುಮತಿಯು ನಿಮ್ಮ ಖಾತರಿ ಇಲ್ಲದೆಯೇ ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"ಕ್ಯಾಮರಾ ಬಳಕೆಯಲ್ಲಿರುವಾಗ ಪ್ರಸಾರ ಸೂಚಕ LED ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
@@ -663,7 +663,7 @@
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"ಬ್ಲೂಟೂತ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"ಸ್ಥಳೀಯ ಬ್ಲೂಟೂತ್ ಟ್ಯಾಬ್ಲೆಟ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಮತ್ತು ಅನ್ವೇಷಿಸಲು ಹಾಗೂ ರಿಮೊಟ್ ಸಾಧನಗಳ ಜೊತೆಗೆ ಜೋಡಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"ಸ್ಥಳೀಯ ಬ್ಲೂಟೂತ್ ಫೋನ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಮತ್ತು ಅನ್ವೇಷಿಸಲು ಹಾಗೂ ರಿಮೊಟ್ ಸಾಧನಗಳ ಜೊತೆಗೆ ಜೋಡಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
- <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ Bluetooth ಜೋಡಣೆಯನ್ನು ಅನುಮತಿಸಿ"</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ ಬ್ಲೂಟೂತ್ ಜೋಡಣೆಯನ್ನು ಅನುಮತಿಸಿ"</string>
<string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"ಬಳಕೆದಾರರ ಸಂವಹನವಿಲ್ಲದೆಯೇ ರಿಮೋಟ್ ಸಾಧನಗಳೊಂದಿಗೆ ಜೋಡಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
<string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"ಬಳಕೆದಾರರ ಸಂವಹನವಿಲ್ಲದೆಯೇ ರಿಮೋಟ್ ಸಾಧನಗಳೊಂದಿಗೆ ಜೋಡಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</string>
<string name="permlab_bluetoothMap" msgid="6372198338939197349">"ಬ್ಲೂಟೂತ್ MAP ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಿ"</string>
@@ -884,14 +884,14 @@
<string name="sipAddressTypeWork" msgid="6920725730797099047">"ಕಚೇರಿ"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"ಇತರೆ"</string>
<string name="quick_contacts_not_available" msgid="746098007828579688">"ಈ ಸಂಪರ್ಕವನ್ನು ವೀಕ್ಷಿಸಲು ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್ ಕಂಡುಬಂದಿಲ್ಲ."</string>
- <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN ಕೋಡ್ ಟೈಪ್ ಮಾಡಿ"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK ಮತ್ತು ಹೊಸ PIN ಕೋಡ್ ಟೈಪ್ ಮಾಡಿ"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"ಪಿನ್ ಕೋಡ್ ಟೈಪ್ ಮಾಡಿ"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK ಮತ್ತು ಹೊಸ ಪಿನ್ ಕೋಡ್ ಟೈಪ್ ಮಾಡಿ"</string>
<string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK ಕೋಡ್"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"ಹೊಸ PIN ಕೋಡ್"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"ಹೊಸ ಪಿನ್ ಕೋಡ್"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"ಪಾಸ್ವರ್ಡ್ ಟೈಪ್ ಮಾಡಲು ಸ್ಪರ್ಶಿಸಿ"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಪಾಸ್ವರ್ಡ್ ಟೈಪ್ ಮಾಡಿ"</string>
- <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"ಅನ್ಲಾಕ್ ಮಾಡಲು PIN ಟೈಪ್ ಮಾಡಿ"</string>
- <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ತಪ್ಪಾದ PIN ಕೋಡ್."</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಪಿನ್ ಟೈಪ್ ಮಾಡಿ"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ತಪ್ಪಾದ ಪಿನ್ ಕೋಡ್."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"ಅನ್ಲಾಕ್ ಮಾಡಲು, ಮೆನು ನಂತರ 0 ಒತ್ತಿರಿ."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"ತುರ್ತು ಸಂಖ್ಯೆ"</string>
<string name="lockscreen_carrier_default" msgid="8963839242565653192">"ಸೇವೆ ಇಲ್ಲ."</string>
@@ -905,13 +905,13 @@
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸು"</string>
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸು"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"ಗರಿಷ್ಠ ಫೇಸ್ ಅನ್ಲಾಕ್ ಪ್ರಯತ್ನಗಳು ಮೀರಿವೆ"</string>
- <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"ಯಾವುದೇ SIM ಕಾರ್ಡ್ ಇಲ್ಲ"</string>
- <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿ SIM ಕಾರ್ಡ್ ಇಲ್ಲ."</string>
- <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"ಫೋನ್ನಲ್ಲಿ SIM ಕಾರ್ಡ್ ಇಲ್ಲ."</string>
- <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"SIM ಕಾರ್ಡ್ ಸೇರಿಸಿ."</string>
- <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SIM ಕಾರ್ಡ್ ಕಾಣೆಯಾಗಿದೆ ಅಥವಾ ಓದಲು ಸಾಧ್ಯವಿಲ್ಲ. ಒಂದು SIM ಕಾರ್ಡ್ ಸೇರಿಸಿ."</string>
- <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"ನಿಷ್ಪ್ರಯೋಜಕ SIM ಕಾರ್ಡ್."</string>
- <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"ನಿಮ್ಮ SIM ಕಾರ್ಡ್ ಅನ್ನು ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.\n ಮತ್ತೊಂದು SIM ಕಾರ್ಡ್ಗಾಗಿ ನಿಮ್ಮ ವಯರ್ಲೆಸ್ ಸೇವೆಯ ಪೂರೈಕೆದಾರರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"ಯಾವುದೇ ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ"</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"ಟ್ಯಾಬ್ಲೆಟ್ನಲ್ಲಿ ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ."</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"ಫೋನ್ನಲ್ಲಿ ಸಿಮ್ ಕಾರ್ಡ್ ಇಲ್ಲ."</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"ಸಿಮ್ ಕಾರ್ಡ್ ಸೇರಿಸಿ."</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"ಸಿಮ್ ಕಾರ್ಡ್ ಕಾಣೆಯಾಗಿದೆ ಅಥವಾ ಓದಲು ಸಾಧ್ಯವಿಲ್ಲ. ಒಂದು ಸಿಮ್ ಕಾರ್ಡ್ ಸೇರಿಸಿ."</string>
+ <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"ನಿಷ್ಪ್ರಯೋಜಕ ಸಿಮ್ ಕಾರ್ಡ್."</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"ನಿಮ್ಮ ಸಿಮ್ ಕಾರ್ಡ್ ಅನ್ನು ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.\n ಮತ್ತೊಂದು ಸಿಮ್ ಕಾರ್ಡ್ಗಾಗಿ ನಿಮ್ಮ ವಯರ್ಲೆಸ್ ಸೇವೆಯ ಪೂರೈಕೆದಾರರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
<string name="lockscreen_transport_prev_description" msgid="6300840251218161534">"ಹಿಂದಿನ ಟ್ರ್ಯಾಕ್"</string>
<string name="lockscreen_transport_next_description" msgid="573285210424377338">"ಮುಂದಿನ ಟ್ರ್ಯಾಕ್"</string>
<string name="lockscreen_transport_pause_description" msgid="3980308465056173363">"ವಿರಾಮಗೊಳಿಸು"</string>
@@ -921,13 +921,13 @@
<string name="lockscreen_transport_ffw_description" msgid="42987149870928985">"ವೇಗವಾಗಿ ಮುಂದಕ್ಕೆ"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"ತುರ್ತು ಕರೆಗಳು ಮಾತ್ರ"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"ನೆಟ್ವರ್ಕ್ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ"</string>
- <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM ಕಾರ್ಡ್ PUK-ಲಾಕ್ ಆಗಿದೆ."</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"ಸಿಮ್ ಕಾರ್ಡ್ PUK-ಲಾಕ್ ಆಗಿದೆ."</string>
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"ಬಳಕೆದಾರರ ಮಾರ್ಗಸೂಚಿಯನ್ನು ನೋಡಿ ಅಥವಾ ಗ್ರಾಹಕರ ಸಹಾಯ ಕೇಂದ್ರಕ್ಕೆ ಸಂಪರ್ಕಿಸಿ."</string>
- <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM ಕಾರ್ಡ್ ಲಾಕ್ ಆಗಿದೆ."</string>
- <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM ಕಾರ್ಡ್ ಅನ್ಲಾಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"ಸಿಮ್ ಕಾರ್ಡ್ ಲಾಕ್ ಆಗಿದೆ."</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"ಸಿಮ್ ಕಾರ್ಡ್ ಅನ್ಲಾಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
<string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"ನಿಮ್ಮ ಅನ್ಲಾಕ್ ನಮೂನೆಯನ್ನುನೀವು <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="2725973286239344555">"ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನೀವು <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="6216672706545696955">"ನಿಮ್ಮ PIN ಅನ್ನು ನೀವು <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="6216672706545696955">"ನಿಮ್ಮ ಪಿನ್ ಅನ್ನು ನೀವು <xliff:g id="NUMBER_0">%d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಟೈಪ್ ಮಾಡಿರುವಿರಿ. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"ನಿಮ್ಮ ಅನ್ಲಾಕ್ ನಮೂನೆಯನ್ನು ನೀವು <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"ನಿಮ್ಮ ಅನ್ಲಾಕ್ ನಮೂನೆಯನ್ನು ನೀವು <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ಲಾಕ್ ಮಾಡಲು ನೀವು <xliff:g id="NUMBER_0">%d</xliff:g> ಬಾರಿ ಪ್ರಯತ್ನಿಸಿರುವಿರಿ. <xliff:g id="NUMBER_1">%d</xliff:g> ಹೆಚ್ಚಿನ ವಿಫಲ ಪ್ರಯತ್ನಗಳ ನಂತರ, ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಫ್ಯಾಕ್ಟರಿ ಡೀಫಾಲ್ಟ್ಗೆ ಮರು ಹೊಂದಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಎಲ್ಲಾ ಬಳಕೆದಾರ ಡೇಟಾ ಕಳೆದು ಹೋಗುತ್ತದೆ."</string>
@@ -1243,14 +1243,14 @@
<string name="sendText" msgid="5209874571959469142">"ಪಠ್ಯಕ್ಕೆ ಕ್ರಿಯೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"ರಿಂಗರ್ ವಾಲ್ಯೂಮ್"</string>
<string name="volume_music" msgid="5421651157138628171">"ಮೀಡಿಯಾ ವಾಲ್ಯೂಮ್"</string>
- <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Bluetooth ಮೂಲಕ ಪ್ಲೇ ಆಗುತ್ತಿದೆ"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"ಬ್ಲೂಟೂತ್ ಮೂಲಕ ಪ್ಲೇ ಆಗುತ್ತಿದೆ"</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"ಶಾಂತ ರಿಂಗ್ಟೋನ್ ಹೊಂದಿಸಲಾಗಿದೆ"</string>
<string name="volume_call" msgid="3941680041282788711">"ಒಳ-ಕರೆಯ ವಾಲ್ಯೂಮ್"</string>
- <string name="volume_bluetooth_call" msgid="2002891926351151534">"Bluetooth ಒಳ-ಕರೆಯ ವಾಲ್ಯೂಮ್"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"ಬ್ಲೂಟೂತ್ ಒಳ-ಕರೆಯ ವಾಲ್ಯೂಮ್"</string>
<string name="volume_alarm" msgid="1985191616042689100">"ಅಲಾರಂ ವಾಲ್ಯೂಮ್"</string>
<string name="volume_notification" msgid="2422265656744276715">"ಅಧಿಸೂಚನೆಯ ವಾಲ್ಯೂಮ್"</string>
<string name="volume_unknown" msgid="1400219669770445902">"ವಾಲ್ಯೂಮ್"</string>
- <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Bluetooth ವಾಲ್ಯೂಮ್"</string>
+ <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"ಬ್ಲೂಟೂತ್ ವಾಲ್ಯೂಮ್"</string>
<string name="volume_icon_description_ringer" msgid="3326003847006162496">"ರಿಂಗ್ಟೋನ್ ವಾಲ್ಯೂಮ್"</string>
<string name="volume_icon_description_incall" msgid="8890073218154543397">"ಕರೆಯ ವಾಲ್ಯೂಮ್"</string>
<string name="volume_icon_description_media" msgid="4217311719665194215">"ಮೀಡಿಯಾ ವಾಲ್ಯೂಮ್"</string>
@@ -1285,8 +1285,8 @@
<string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"ಸಂಪರ್ಕಗೊಳ್ಳಲು ಆಹ್ವಾನ"</string>
<string name="wifi_p2p_from_message" msgid="570389174731951769">"ಇಂದ:"</string>
<string name="wifi_p2p_to_message" msgid="248968974522044099">"ಗೆ:"</string>
- <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"ಅಗತ್ಯವಿರುವ PIN ಟೈಪ್ ಮಾಡಿ:"</string>
- <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"ಅಗತ್ಯವಿರುವ ಪಿನ್ ಟೈಪ್ ಮಾಡಿ:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"ಪಿನ್:"</string>
<string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"ಟ್ಯಾಬ್ಲೆಟ್ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವಾಗ ಅದನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ Wi-Fi ನಿಂದ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗುತ್ತದೆ"</string>
<string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"ಫೋನ್ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವಾಗ Wi-Fi ನಿಂದ ಅದು ತಾತ್ಕಾಲಿಕವಾಗಿ ಸಂಪರ್ಕ ಕಡಿತಗೊಳ್ಳುತ್ತದೆ"</string>
<string name="select_character" msgid="3365550120617701745">"ಅಕ್ಷರವನ್ನು ಸೇರಿಸಿ"</string>
@@ -1303,10 +1303,10 @@
<string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"ನೀವು ಇದನ್ನು ನಂತರದಲ್ಲಿ ಸೆಟ್ಟಿಂಗ್ಗಳು > ಅಪ್ಲಿಕೇಶನ್ಗಳಲ್ಲಿ ಬದಲಾಯಿಸಬಹುದು"</string>
<string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"ಯಾವಾಗಲೂ ಅನುಮತಿಸು"</string>
<string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"ಎಂದಿಗೂ ಅನುಮತಿಸದಿರು"</string>
- <string name="sim_removed_title" msgid="6227712319223226185">"SIM ಕಾರ್ಡ್ ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
- <string name="sim_removed_message" msgid="5450336489923274918">"ನೀವು ಮಾನ್ಯವಾದ SIM ಕಾರ್ಡ್ ಮರುಪ್ರಾರಂಭಿಸುವವರೆಗೆ ಸೆಲ್ಯುಲಾರ್ ನೆಟ್ವರ್ಕ್ ಲಭ್ಯವಿರುವುದಿಲ್ಲ."</string>
+ <string name="sim_removed_title" msgid="6227712319223226185">"ಸಿಮ್ ಕಾರ್ಡ್ ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
+ <string name="sim_removed_message" msgid="5450336489923274918">"ನೀವು ಮಾನ್ಯವಾದ ಸಿಮ್ ಕಾರ್ಡ್ ಮರುಪ್ರಾರಂಭಿಸುವವರೆಗೆ ಸೆಲ್ಯುಲಾರ್ ನೆಟ್ವರ್ಕ್ ಲಭ್ಯವಿರುವುದಿಲ್ಲ."</string>
<string name="sim_done_button" msgid="827949989369963775">"ಮುಗಿದಿದೆ"</string>
- <string name="sim_added_title" msgid="3719670512889674693">"SIM ಕಾರ್ಡ್ ಸೇರಿಸಲಾಗಿದೆ"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"ಸಿಮ್ ಕಾರ್ಡ್ ಸೇರಿಸಲಾಗಿದೆ"</string>
<string name="sim_added_message" msgid="7797975656153714319">"ಸೆಲ್ಯುಲಾರ್ ನೆಟ್ವರ್ಕ್ ಪ್ರವೇಶಿಸಲು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"ಮರುಪ್ರಾರಂಭಿಸು"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"ಸಮಯವನ್ನು ಹೊಂದಿಸಿ"</string>
@@ -1596,21 +1596,21 @@
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ಮರೆತಿರುವಿರಿ"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"ತಪ್ಪು ಪ್ಯಾಟರ್ನ್"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"ತಪ್ಪಾದ ಪಾಸ್ವರ್ಡ್"</string>
- <string name="kg_wrong_pin" msgid="1131306510833563801">"ತಪ್ಪಾದ PIN"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"ತಪ್ಪಾದ ಪಿನ್"</string>
<string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="kg_pattern_instructions" msgid="398978611683075868">"ನಿಮ್ಮ ನಮೂನೆಯನ್ನು ಚಿತ್ರಿಸಿ"</string>
- <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN ನಮೂದಿಸಿ"</string>
- <string name="kg_pin_instructions" msgid="2377242233495111557">"PIN ನಮೂದಿಸಿ"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"ಪಿನ್ ನಮೂದಿಸಿ"</string>
<string name="kg_password_instructions" msgid="5753646556186936819">"ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ"</string>
- <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"ಇದೀಗ SIM ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ. ಮುಂದುವರೆಯಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
- <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"ಅಗತ್ಯವಿರುವ PIN ಕೋಡ್ ನಮೂದಿಸಿ"</string>
- <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"ಬಯಸಿರುವ PIN ಕೋಡ್ ದೃಢೀಕರಿಸಿ"</string>
- <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM ಕಾರ್ಡ್ ಅನ್ಲಾಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"ತಪ್ಪಾದ PIN ಕೋಡ್."</string>
- <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4 ರಿಂದ 8 ಸಂಖ್ಯೆಗಳಿರುವ PIN ಟೈಪ್ ಮಾಡಿ."</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"ಇದೀಗ ಸಿಮ್ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ. ಮುಂದುವರೆಯಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"ಅಗತ್ಯವಿರುವ ಪಿನ್ ಕೋಡ್ ನಮೂದಿಸಿ"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"ಬಯಸಿರುವ ಪಿನ್ ಕೋಡ್ ದೃಢೀಕರಿಸಿ"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"ಸಿಮ್ ಕಾರ್ಡ್ ಅನ್ಲಾಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"ತಪ್ಪಾದ ಪಿನ್ ಕೋಡ್."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4 ರಿಂದ 8 ಸಂಖ್ಯೆಗಳಿರುವ ಪಿನ್ ಟೈಪ್ ಮಾಡಿ."</string>
<string name="kg_invalid_sim_puk_hint" msgid="6025069204539532000">"PUK ಕೋಡ್ 8 ಸಂಖ್ಯೆಗಳನ್ನು ಹೊಂದಿರಬೇಕು."</string>
- <string name="kg_invalid_puk" msgid="3638289409676051243">"ಸರಿಯಾದ PUK ಕೋಡ್ ಅನ್ನು ಮರು-ನಮೂದಿಸಿ. ಸತತ ಪ್ರಯತ್ನಗಳು SIM ಅನ್ನು ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ."</string>
- <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN ಕೋಡ್ಗಳು ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತಿಲ್ಲ"</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"ಸರಿಯಾದ PUK ಕೋಡ್ ಅನ್ನು ಮರು-ನಮೂದಿಸಿ. ಸತತ ಪ್ರಯತ್ನಗಳು ಸಿಮ್ ಅನ್ನು ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"ಪಿನ್ ಕೋಡ್ಗಳು ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತಿಲ್ಲ"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"ಹಲವಾರು ಪ್ಯಾಟರ್ನ್ ಪ್ರಯತ್ನಗಳು"</string>
<string name="kg_login_instructions" msgid="1100551261265506448">"ಅನ್ಲಾಕ್ ಮಾಡಲು, ನಿಮ್ಮ Google ಖಾತೆ ಬಳಸಿಕೊಂಡು ಸೈನ್ ಇನ್ ಮಾಡಿ."</string>
<string name="kg_login_username_hint" msgid="5718534272070920364">"ಬಳಕೆದಾರಹೆಸರು (ಇಮೇಲ್)"</string>
@@ -1619,7 +1619,7 @@
<string name="kg_login_invalid_input" msgid="5754664119319872197">"ಅಮಾನ್ಯ ಬಳಕೆದಾರಹೆಸರು ಅಥವಾ ಪಾಸ್ವರ್ಡ್."</string>
<string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"ನಿಮ್ಮ ಬಳಕೆದಾರಹೆಸರು ಅಥವಾ ಪಾಸ್ವರ್ಡ್ ಮರೆತಿರುವಿರಾ?\n"<b>"google.com/accounts/recovery"</b>" ಗೆ ಭೇಟಿ ನೀಡಿ."</string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"ಖಾತೆಯನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ…"</string>
- <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"ನಿಮ್ಮ PIN ಅನ್ನು ನೀವು <xliff:g id="NUMBER_0">%d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಟೈಪ್ ಮಾಡಿರುವಿರಿ. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"ನಿಮ್ಮ ಪಿನ್ ಅನ್ನು ನೀವು <xliff:g id="NUMBER_0">%d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಟೈಪ್ ಮಾಡಿರುವಿರಿ. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನೀವು <xliff:g id="NUMBER_0">%d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಟೈಪ್ ಮಾಡಿರುವಿರಿ. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"ನಿಮ್ಮ ಅನ್ಲಾಕ್ ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ನೀವು <xliff:g id="NUMBER_0">%d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಚಿತ್ರಿಸಿರುವಿರಿ. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ಲಾಕ್ ಮಾಡಲು ನೀವು <xliff:g id="NUMBER_0">%d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಪ್ರಯತ್ನಿಸಿರುವಿರಿ. <xliff:g id="NUMBER_1">%d</xliff:g> ಕ್ಕೂ ಹೆಚ್ಚಿನ ವಿಫಲ ಪ್ರಯತ್ನಗಳ ಬಳಿಕ, ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಫ್ಯಾಕ್ಟರಿ ಡೀಫಾಲ್ಟ್ಗೆ ಮರು ಹೊಂದಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಎಲ್ಲಾ ಬಳಕೆದಾರರ ಡೇಟಾ ಕಳೆದು ಹೋಗುತ್ತದೆ."</string>
@@ -1730,15 +1730,15 @@
<string name="reason_service_unavailable" msgid="7824008732243903268">"ಮುದ್ರಣ ಸೇವೆ ಸಕ್ರಿಯಗೊಂಡಿಲ್ಲ"</string>
<string name="print_service_installed_title" msgid="2246317169444081628">"<xliff:g id="NAME">%s</xliff:g> ಸೇವೆಯನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿದೆ"</string>
<string name="print_service_installed_message" msgid="5897362931070459152">"ಸಕ್ರಿಯಗೊಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
- <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"ನಿರ್ವಾಹಕರ PIN ನಮೂದಿಸಿ"</string>
- <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN ನಮೂದಿಸಿ"</string>
+ <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"ನಿರ್ವಾಹಕರ ಪಿನ್ ನಮೂದಿಸಿ"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"ಪಿನ್ ನಮೂದಿಸಿ"</string>
<string name="restr_pin_incorrect" msgid="8571512003955077924">"ತಪ್ಪು"</string>
- <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"ಸದ್ಯದ PIN"</string>
- <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"ಹೊಸ PIN"</string>
- <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"ಹೊಸ PIN ದೃಢೀಕರಿಸಿ"</string>
- <string name="restr_pin_create_pin" msgid="8017600000263450337">"ನಿರ್ಬಂಧಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು PIN ರಚಿಸಿ"</string>
- <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN ಗಳು ಹೊಂದಿಕೆಯಾಗುತ್ತಿಲ್ಲ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
- <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN ತುಂಬಾ ಚಿಕ್ಕದಾಗಿದೆ. ಕನಿಷ್ಟ ಪಕ್ಷ 4 ಅಂಕಿಗಳಾಗಿರಬೇಕು."</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"ಸದ್ಯದ ಪಿನ್"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"ಹೊಸ ಪಿನ್"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"ಹೊಸ ಪಿನ್ ದೃಢೀಕರಿಸಿ"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"ನಿರ್ಬಂಧಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಪಿನ್ ರಚಿಸಿ"</string>
+ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"ಪಿನ್ ಗಳು ಹೊಂದಿಕೆಯಾಗುತ್ತಿಲ್ಲ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"ಪಿನ್ ತುಂಬಾ ಚಿಕ್ಕದಾಗಿದೆ. ಕನಿಷ್ಟ ಪಕ್ಷ 4 ಅಂಕಿಗಳಾಗಿರಬೇಕು."</string>
<plurals name="restr_pin_countdown">
<item quantity="one" msgid="311050995198548675">"1 ಸೆಕೆಂಡಿನಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ"</item>
<item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ"</item>
@@ -1757,17 +1757,17 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> ಅಳಿಸಲಾಗಿದೆ"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"ಕೆಲಸ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="7570091317001980053">"ಈ ಪರದೆಯನ್ನು ಅನ್ಪಿನ್ ಮಾಡಲು, ಹಿಂದೆ ಮತ್ತು ಅವಲೋಕನವನ್ನು ಏಕ ಸಮಯದಲ್ಲಿ ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ."</string>
- <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ಈ ಪರದೆಯನ್ನು ಅನ್ಪಿನ್ ಮಾಡಲು, ಅವಲೋಕನವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿಯಿರಿ."</string>
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"ಈ ಪರದೆಯನ್ನು ಅನ್ಪಿನ್ ಮಾಡಲು, ‘ಹಿಂದೆ’ ಮತ್ತು ‘ಸಮಗ್ರ ನೋಟ’ವನ್ನು ಏಕಕಾಲದಲ್ಲಿ ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ಈ ಪರದೆಯನ್ನು ಅನ್ಪಿನ್ ಮಾಡಲು, ‘ಸಮಗ್ರ ನೋಟ’ವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿಯಿರಿ."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"ಪರದೆ ಪಿನ್ ಮಾಡಲಾಗಿದೆ. ಅನ್ಪಿನ್ ಮಾಡಲು ನಿಮ್ಮ ಸಂಸ್ಥೆ ಅವಕಾಶ ಮಾಡಿಕೊಟ್ಟಿಲ್ಲ."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"ಸ್ಕ್ರೀನ್ ಪಿನ್ನಿಂಗ್ ಬಳಸುವುದೇ?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"ಪರದೆ ಪಿನ್ ಮಾಡುವಿಕೆಯು ಪ್ರದರ್ಶನವನ್ನು ಏಕ ವೀಕ್ಷಣೆಯಲ್ಲಿ ಲಾಕ್ ಮಾಡುತ್ತದೆ.\n\nಅನ್ಪಿನ್ ಮಾಡಲು, ಹಿಂದೆ ಮತ್ತು ಅವಲೋಕನವನ್ನು ಏಕ ಸಮಯದಲ್ಲಿ ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"ಪರದೆ ಪಿನ್ ಮಾಡುವಿಕೆಯು ಪ್ರದರ್ಶನವನ್ನು ಏಕ ವೀಕ್ಷಣೆಯಲ್ಲಿ ಲಾಕ್ ಮಾಡುತ್ತದೆ.\n\nಅನ್ಪಿನ್ ಮಾಡಲು, ಅವಲೋಕನವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ."</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"ಪರದೆ ಪಿನ್ ಮಾಡುವಿಕೆಯು ಪ್ರದರ್ಶನವನ್ನು ಏಕ ವೀಕ್ಷಣೆಯಲ್ಲಿ ಲಾಕ್ ಮಾಡುತ್ತದೆ.\n\nಅನ್ಪಿನ್ ಮಾಡಲು, ‘ಹಿಂದೆ’ ಮತ್ತು ‘ಸಮಗ್ರ ನೋಟ’ ಎರಡೂ ಬಟನ್ ಅನ್ನು ಏಕಕಾಲದಲ್ಲಿ ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"ಪರದೆ ಪಿನ್ ಮಾಡುವಿಕೆಯು ಪ್ರದರ್ಶನವನ್ನು ಏಕ ವೀಕ್ಷಣೆಯಲ್ಲಿ ಲಾಕ್ ಮಾಡುತ್ತದೆ.\n\nಅನ್ಪಿನ್ ಮಾಡಲು, ‘ಸಮಗ್ರ ನೋಟ’ವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"ಬೇಡ, ಧನ್ಯವಾದಗಳು"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"ಪ್ರಾರಂಭಿಸು"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"ಸ್ಕ್ರೀನ್ ಪಿನ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"ಸ್ಕ್ರೀನ್ ಅನ್ಪಿನ್ ಮಾಡಲಾಗಿದೆ"</string>
- <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ಅನ್ಪಿನ್ ಮಾಡುವುದಕ್ಕೂ ಮೊದಲು PIN ಕೇಳಿ"</string>
+ <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ಅನ್ಪಿನ್ ಮಾಡುವುದಕ್ಕೂ ಮೊದಲು ಪಿನ್ ಕೇಳಿ"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ಅನ್ಪಿನ್ ಮಾಡುವುದಕ್ಕೂ ಮೊದಲು ಅನ್ಲಾಕ್ ನಮೂನೆಯನ್ನು ಕೇಳಿ"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ಅನ್ಪಿನ್ ಮಾಡುವುದಕ್ಕೂ ಮೊದಲು ಪಾಸ್ವರ್ಡ್ ಕೇಳಿ"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"ಬ್ಯಾಟರಿ ಬಾಳಿಕೆಯನ್ನು ಹೆಚ್ಚಿಸುವ ನಿಟ್ಟಿನಲ್ಲಿ ಸಹಾಯ ಮಾಡಲು, ಬ್ಯಾಟರಿ ಉಳಿತಾಯವು ನಿಮ್ಮ ಸಾಧನದ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಕುಂಠಿತಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ವೈಬ್ರೇಷನ್ ಹಾಗೂ ಹೆಚ್ಚಿನ ಹಿನ್ನೆಲೆ ಡೇಟಾವನ್ನು ಸೀಮಿತಗೊಳಿಸುತ್ತದೆ. ಇಮೇಲ್, ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ, ಮತ್ತು ಸಿಂಕ್ ಮಾಡುವುದನ್ನು ಅವಲಂಬಿಸಿರುವ ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ನೀವು ತೆರೆಯುವವರೆಗೆ ಅವುಗಳನ್ನು ನವೀಕರಿಸಲಾಗುವುದಿಲ್ಲ.\n\nನಿಮ್ಮ ಸಾಧನವು ಚಾರ್ಜ್ ಆಗುತ್ತಿರುವಾಗ ಬ್ಯಾಟರಿ ಉಳಿತಾಯವು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆಫ್ ಆಗುತ್ತದೆ."</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 4264aa4..0a89714 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"나만의 연락처 카드 수정"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"앱이 기기에 저장된 개인 프로필 정보(예: 사용자 이름, 연락처 정보 등)를 변경 또는 추가할 수 있도록 허용합니다. 이는 앱이 사용자를 확인하고 다른 사용자에게 해당 프로필 정보를 전송할 수 있다는 것을 의미합니다."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"신체 센서(예: 심박수 모니터)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"앱이 신체 변화(예: 심박수) 측정을 위해 사용하는 센서의 데이터에 액세스하도록 허용합니다."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"앱이 심박수와 같은 신체 상태를 모니터링하는 센서의 데이터에 액세스하도록 허용합니다."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"소셜 스트림 읽기"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"앱이 사용자와 친구의 최신 소셜 소식에 액세스하고 동기화할 수 있도록 허용합니다. 이 경우 앱이 비밀유지와 관계 없이 소셜 네트워크에서 사용자와 친구가 주고받는 내용을 읽을 수 있으므로, 정보를 공유할 때 주의해야 합니다. 참고: 이 권한이 적용되지 않는 소셜 네트워크도 있습니다."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"소셜 스트림에 쓰기"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g>이(가) 선택됨"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> 삭제됨"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"업무용 <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"화면을 고정 해제하려면 \'뒤로\'와 \'최근 사용\'을 동시에 길게 터치합니다."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"화면을 고정 해제하려면 \'최근 사용\'을 길게 터치합니다."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"화면이 고정되었습니다. 소속된 조직에서 고정 해제를 허용하지 않습니다."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"화면을 고정하시겠습니까?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"화면을 고정하면 단일 보기에서 디스플레이를 잠급니다.\n\n고정 해제하려면 \'뒤로\'와 \'최근 사용\'을 동시에 길게 터치합니다."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"화면을 고정하면 단일 보기에서 디스플레이를 잠급니다.\n\n고정 해제하려면 \'최근 사용\'을 길게 터치합니다."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"아니요"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"시작"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"화면 고정됨"</string>
diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml
index 312ef99..d240c7a 100644
--- a/core/res/res/values-ky-rKG/strings.xml
+++ b/core/res/res/values-ky-rKG/strings.xml
@@ -653,7 +653,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"сиздин байланыш картаңызды өзгөртүү"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Колдонмого түзмөгүңүздө сакталган, сиздин атыңыз жана байланыш маалыматтарыңыз сыяктуу жеке профайл маалыматтарын өзгөртүү же кошуу уруксатын берет. Бул колдонмо сизди аныктай алат жана сиздин профилдик маалыматтарыңызды башкаларга жөнөтүүгө жөндөм алат дегенди билдирет."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"дене-бой сенсорлору (жүрөктүн кагышын өлчөгүчтөр сыяктуу)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Колдонмого жүрөктүн кагышы сыяктуу дене-боюңуздагы нерселерди өлчөп турган сенсорлордун дайындарын алып туруу мүмкүнчүлүгүн берет."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Колдонмого жүрөгүңүздүн согушу сыяктуу дене-бой абалыңызды көзөмөлдөгөн сенсорлордогу дайындарды көрүп туруу мүмкүнчүлүгүн берет."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"сиздин социалдык агымыңызды окуу"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Колдонмого социалдык түйүндөргө жетүү жана сиздин жана досторуңуздун жаңыртуулары менен синхрондошуу уруксатын берет. Маалымат бөлүшкөндө абайлаңыз -- бул колдонмого сиздин социалдык түйүндөрдөгү досторуңуз менен баарлашууңузду, анын конфиденциалдуулугуна карабастан, окуганга уруксат берет. Эскертүү: бул уруксат айрым социалдык түйүндөрдө иштебеши мүмкүн."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"сиздин социалдык агымыңызга жазуу"</string>
@@ -2237,16 +2237,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> тандалды"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> өчүрүлдү"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Жумуш <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Бул экранды бошотуу үчүн Артка жана Көз жүгүртүүнү чогуу басып, кармап туруңуз."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Бул экранды бошотуу үчүн Көз жүгүртүүнү басып, кармап туруңуз."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Экран кадалды. Уюмуңуздун уруксатысыз бошото албайсыз."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Экран кадалсынбы?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Экран кадоосу дисплейди жалгыз көрүнүш менен бекитет.\n\nБошотуу үчүн Артка жана Көз жүгүртүүнү чогуу басып, кармап туруңуз."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Экран кадоосу дисплейди жалгыз көрүнүш менен бекитет.\n\n Бошотуу үчүн Көз жүгүртүүнү басып, кармап туруңуз."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"ЖОК, РАХМАТ"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"БАШТОО"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Экран кадалды"</string>
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index 81e9683..34ecf92 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"ແກ້ໄຂບັດລາຍຊື່ຜູ່ຕິດຕໍ່ຂອງທ່ານເອງ"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"ອະນຸຍາດໃຫ້ແອັບຯ ປ່ຽນແປງ ຫຼືເພີ່ມຂໍ້ມູນໃສ່ໂປຣໄຟລ໌ສ່ວນບຸກຄົນທີ່ເກັບໄວ້ໃນອຸປະກອນຂອງທ່ານ, ເຊັ່ນ: ຊື່ ແລະຂໍ້ມູນຕິດຕໍ່ທ່ານ. ນີ້ໝາຍຄວາມວ່າແອັບຯສາມາດບົ່ງບອກໂຕທ່ານ ແລະອາດສົ່ງຂໍ້ມູນໂປຣໄຟລ໌ຂອງທ່ານໃຫ້ຜູ່ອື່ນໄດ້."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"ເຊັນເຊີຮ່າງກາຍ (ເຊັ່ນ: ຕິດຕາມອັດຕາການເຕັ້ນຂອງຫົວໃຈ)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"ອະນຸຍາດໃຫ້ແອັບຯເຂົ້າເຖິງຂໍ້ມູນຈາກເຊັນເຊີທີ່ທ່ານໃຊ້ເພື່ອວັດແທກສິ່ງທີ່ເກີດຂຶ້ນໃນຮ່າງກາຍຂອງທ່ານ ເຊັ່ນ: ອັດຕາການເຕັ້ນຂອງຫົວໃຈ."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"ອະນຸຍາດໃຫ້ແອັບຯເຂົ້າເຖິງຂໍ້ມູນຈາກເຊັນເຊີທີ່ຕິດຕາມສະພາບຮ່າງການຂອງທ່ານ, ເຊັ່ນ: ອັດຕາການເຕັ້ນຂອງຫົວໃຈຂອງທ່ານ."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"ອ່ານການອັບເດດສັງຄົມອອນລາຍຂອງທ່ານ"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"ອະນຸຍາດໃຫ້ແອັບຯ ເຂົ້າເຖິງ ແລະຊິ້ງຂໍ້ມູນຂ່າວສານສັງຄົມຈາກທ່ານ ແລະໝູ່ຂອງທ່ານ. ຄວນລະມັດລະວັງໃນເວລາທີ່ແລກປ່ຽນຂໍ້ມູນ -- ນີ້ຈະເປັນການອະນຸຍາດໃຫ້ແອັບຯ ອ່ານການສື່ສານລະຫວ່າງທ່ານ ກັບໝູ່ຂອງທ່ານເທິງເຄືອຂ່າຍສັງຄົມ ໂດຍບໍ່ຄຳນຶງເຖິງຄວາມລັບ. ໝາຍເຫດ: ການກຳນົດສິດນີ້ອາດບໍ່ໄດ້ບັງຄັບໃຊ້ໃນທຸກເຄືອຂ່າຍສັງຄົມ."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"ຂຽນໃສ່ເຄືອຂ່າຍສັງຄົມຂອງທ່ານ"</string>
@@ -1736,7 +1736,7 @@
<string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN ປະຈຸບັນ"</string>
<string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"ລະຫັດ PIN ໃໝ່"</string>
<string name="restr_pin_confirm_pin" msgid="8501523829633146239">"ຢືນຢັນລະຫັດ PIN ໃໝ່"</string>
- <string name="restr_pin_create_pin" msgid="8017600000263450337">"ສ້າງ PIN ສໍາລັບການປັບປຸງຂໍ້ຈໍາກັດ"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"ສ້າງ PIN ສໍາລັບການປັບປຸງຂໍ້ຈໍາກັດ"</string>
<string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN ບໍ່ກົງກັນ. ລອງໃໝ່ອີກຄັ້ງ."</string>
<string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN ສັ້ນເກີນໄປ. ຕ້ອງມີຢ່າງໜ້ອຍ 4 ຫຼັກ."</string>
<plurals name="restr_pin_countdown">
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> ຖືກເລືອກແລ້ວ"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> ຖືກລຶບແລ້ວ"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"ບ່ອນເຮັດວຽກ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"ເພື່ອຖອດການປັກໝຸດໜ້າຈໍນີ້, ສຳຜັດປຸ່ມ ກັບຄືນ ແລະ ພາບຮວມ ຄ້າງໄວ້ພ້ອມກັນ."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ເພື່ອຖອດການປັກໝຸດໜ້າຈໍນີ້, ສຳຜັດປຸ່ມ ພາບຮວມ ຄ້າງໄວ້."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"ໜ້າຈໍຖືກປັກໝຸດໄວ້. ອົງກອນຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ຍົກເລີກການປັກໝຸດໄດ້."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"ໃຊ້ການປັກໝຸດໜ້າຈໍບໍ່?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"ການປັກໝຸດໜ້າຈໍຈະເຮັດໃຫ້ການສະແດງຜົນນັ້ນລັອກຢູ່ໃນມຸມມອງດຽວ.\n\nເພື່ອຖອດການປັກໝຸດ, ສຳຜັດປຸ່ມ ກັບຄືນ ແລະ ພາບຮວມ ຄ້າງໄວ້ພ້ອມກັນ."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"ການປັກໝຸດໜ້າຈໍຈະເຮັດໃຫ້ໃຫ້ການແດງຜົນນັ້ນລັອກຢູ່ໃນມຸມມອງດຽວ.\n\nເພື່ອຖອດການປັກໝຸດ, ສຳຜັດປຸ່ມ ພາບຮວມ ຄ້າງໄວ້."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"ບໍ່, ຂອບໃຈ"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"ເລີ່ມ"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"ປັກໝຸດໜ້າຈໍແລ້ວ"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index bf6c1b1..35fbe0c 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"keisti jūsų kontaktinę kortelę"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Leidžiama programai keisti įrenginyje saugomą asmeninę profilio informaciją, pvz., vardą, pavardę ir kontaktinę informaciją, arba jos pridėti. Tai reiškia, kad programa gali nustatyti tapatybę ir siųsti profilio informaciją kitiems."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"kūno jut. (pvz., pulso d. t.)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Programai leidžiama pasiekti naudojamų jutiklių duomenis, siekiant įvertinti, kas vyksta jūsų kūne, pvz., pulso dažnį."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Programai leidžiama pasiekti duomenis, gautus iš jutiklių, stebinčių fizinę būseną, pvz., širdies ritmą."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"skaityti socialinį srautą"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Leidžiama programai pasiekti ir sinchronizuoti viešas naujienas iš jūsų ir jūsų draugų. Būkite atidūs bendrindami informaciją – programai leidžiama skaityti korespondenciją tarp jūsų ir draugų viešuosiuose tinkluose, neatsižvelgiant į konfidencialumą. Pastaba: šis leidimas negali būti taikomas visuose viešuosiuose tinkluose."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"rašyti į socialinį srautą"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 82d38478..de2d8a6 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"mainīt manu vizītkarti"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Ļauj lietotnei mainīt ierīcē saglabāto personīgā profila informāciju, piemēram, jūsu vārdu un kontaktinformāciju, vai pievienot tai citu informāciju. Tas nozīmē, ka lietotne var jūs identificēt un var nosūtīt jūsu profila informāciju citām personām."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"ķermeņa sensori (piemēram, sirdsdarbības monitori)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Ļauj lietotnei piekļūt to sensoru datiem, kurus izmantojat, lai novērtētu ķermeņa procesus, piemēram, sirdsdarbību."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Ļauj lietotnei piekļūt to sensoru datiem, kuri pārrauga jūsu fizisko stāvokli (piemēram, sirdsdarbības ātrumu)."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"lasīt jūsu soc. tīklu straumi"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Ļauj lietotnei piekļūt sociālajiem atjauninājumiem no jums un jūsu draugiem un sinhronizēt tos. Esiet piesardzīgs, kad kopīgojat informāciju, — šādi lietotne var lasīt sociālajos tīklos ar draugiem veikto saziņu, neraugoties uz konfidencialitāti. Piezīme: šo atļauju nedrīkst piemērot visiem sociālajiem tīkliem."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"rakstīt sociālo tīklu straumē"</string>
@@ -1757,12 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"Atlasīts: <xliff:g id="ITEM">%1$s</xliff:g>"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> tika dzēsts."</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Darbā: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="7570091317001980053">"Lai atspraustu šo ekrānu, vienlaicīgi pieskarieties pogām “Atpakaļ” un “Kopsavilkums” un turiet tās."</string>
- <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Lai atspraustu šo ekrānu, pieskarieties pogai “Kopsavilkums” un turiet to."</string>
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Lai atspraustu šo ekrānu, vienlaicīgi pieskarieties pogām “Atpakaļ” un “Pārskats” un turiet tās."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Lai atspraustu šo ekrānu, pieskarieties pogai “Pārskats” un turiet to."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Ekrāns ir piesprausts. Jūsu organizācija nav atļāvusi atspraušanu."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Vai izmantot ekrāna piespraušanu?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Izmantojot ekrāna piespraušanu, ekrāns tiek bloķēts, lai tiktu rādīts viens skats.\n\nLai atspraustu ekrānu, vienlaicīgi pieskarieties pogām “Atpakaļ” un “Kopsavilkums” un turiet tās."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Izmantojot ekrāna piespraušanu, ekrāns tiek bloķēts, lai tiktu rādīts viens skats.\n\nLai atspraustu ekrānu, pieskarieties pogai “Kopsavilkums” un turiet to."</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Izmantojot ekrāna piespraušanu, ekrāns tiek bloķēts, lai tiktu rādīts viens skats.\n\nLai atspraustu ekrānu, vienlaicīgi pieskarieties pogām “Atpakaļ” un “Pārskats” un turiet tās."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Izmantojot ekrāna piespraušanu, ekrāns tiek bloķēts, lai tiktu rādīts viens skats.\n\nLai atspraustu ekrānu, pieskarieties pogai “Pārskats” un turiet to."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"NĒ, PALDIES"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"SĀKT"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekrāns ir piesprausts"</string>
diff --git a/core/res/res/values-mcc310-mnc120/config.xml b/core/res/res/values-mcc310-mnc120/config.xml
index 24e55b1..774732d 100644
--- a/core/res/res/values-mcc310-mnc120/config.xml
+++ b/core/res/res/values-mcc310-mnc120/config.xml
@@ -27,4 +27,8 @@
<!-- Sprint need a 70 ms delay for 3way call -->
<integer name="config_cdma_3waycall_flash_delay">70</integer>
+
+ <!-- If this value is true, The mms content-disposition field is supported correctly.
+ If false, Content-disposition fragments are ignored -->
+ <bool name="config_mms_content_disposition_support">false</bool>
</resources>
diff --git a/core/res/res/values-mcc310-mnc160/config.xml b/core/res/res/values-mcc310-mnc160/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc160/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc200/config.xml b/core/res/res/values-mcc310-mnc200/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc200/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc210/config.xml b/core/res/res/values-mcc310-mnc210/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc210/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc220/config.xml b/core/res/res/values-mcc310-mnc220/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc220/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc230/config.xml b/core/res/res/values-mcc310-mnc230/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc230/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc240/config.xml b/core/res/res/values-mcc310-mnc240/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc240/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc250/config.xml b/core/res/res/values-mcc310-mnc250/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc250/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc260/config.xml b/core/res/res/values-mcc310-mnc260/config.xml
index 28cd695..6bfc3d1 100644
--- a/core/res/res/values-mcc310-mnc260/config.xml
+++ b/core/res/res/values-mcc310-mnc260/config.xml
@@ -25,8 +25,8 @@
-->
<integer name="config_mobile_mtu">1440</integer>
- <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ <!-- Flag specifying whether VoLTE should be available for carrier: independent of
carrier provisioning. If false: hard disabled. If true: then depends on carrier
provisioning, availability etc -->
- <bool name="config_carrier_volte_vt_available">true</bool>
+ <bool name="config_carrier_volte_available">true</bool>
</resources>
diff --git a/core/res/res/values-mcc310-mnc270/config.xml b/core/res/res/values-mcc310-mnc270/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc270/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc300/config.xml b/core/res/res/values-mcc310-mnc300/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc300/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc310/config.xml b/core/res/res/values-mcc310-mnc310/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc310/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc490/config.xml b/core/res/res/values-mcc310-mnc490/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc490/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc530/config.xml b/core/res/res/values-mcc310-mnc530/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc530/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc580/config.xml b/core/res/res/values-mcc310-mnc580/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc580/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc590/config.xml b/core/res/res/values-mcc310-mnc590/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc590/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc640/config.xml b/core/res/res/values-mcc310-mnc640/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc640/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc660/config.xml b/core/res/res/values-mcc310-mnc660/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc660/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc310-mnc800/config.xml b/core/res/res/values-mcc310-mnc800/config.xml
new file mode 100644
index 0000000..28cd695
--- /dev/null
+++ b/core/res/res/values-mcc310-mnc800/config.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2013, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You my 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">
+
+ <!-- Configure mobile network MTU. Carrier specific value is set here.
+ -->
+ <integer name="config_mobile_mtu">1440</integer>
+
+ <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_volte_vt_available">true</bool>
+</resources>
diff --git a/core/res/res/values-mcc311-mnc480/config.xml b/core/res/res/values-mcc311-mnc480/config.xml
index 820cc2e..d0a57b3 100644
--- a/core/res/res/values-mcc311-mnc480/config.xml
+++ b/core/res/res/values-mcc311-mnc480/config.xml
@@ -38,10 +38,10 @@
be disabled) but individual Features can be disabled using ImsConfig.setFeatureValue() -->
<bool name="imsServiceAllowTurnOff">false</bool>
- <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ <!-- Flag specifying whether VoLTE should be available for carrier: independent of
carrier provisioning. If false: hard disabled. If true: then depends on carrier
provisioning, availability etc -->
- <bool name="config_carrier_volte_vt_available">true</bool>
+ <bool name="config_carrier_volte_available">true</bool>
<bool name="config_auto_attach_data_on_creation">false</bool>
<!-- service number convert map in roaming network. -->
diff --git a/core/res/res/values-mcc530-mnc05/config.xml b/core/res/res/values-mcc530-mnc05/config.xml
new file mode 100644
index 0000000..893afe5
--- /dev/null
+++ b/core/res/res/values-mcc530-mnc05/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2014, 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 my 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>
+ <!-- If this value is true, The mms content-disposition field is supported correctly.
+ If false, Content-disposition fragments are ignored -->
+ <bool name="config_mms_content_disposition_support">false</bool>
+</resources>
diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml
index dfa537e..a2049f4 100644
--- a/core/res/res/values-mk-rMK/strings.xml
+++ b/core/res/res/values-mk-rMK/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"измени ја сопствената картичка за контакт"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Овозможува апликацијата да менува или да додава информации од личниот профил што се зачувани на вашиот уред, како што се вашето име и информации за контакт. Ова значи дека апликацијата може да ве идентификува и да ги испрати информациите од вашиот профил на други."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"телесни сензори (како монитори за срцев пулс)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Дозволува апликацијата да пристапи до податоци од сензори што ги користите за мерење на настани во вашето тело, како срцевиот ритам."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Дозволува апликацијата да пристапува до податоци од сензори кои ја следат вашата физичка состојба, како на пр. отчукувањата на срцето."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"читај социјални текови"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Овозможува апликацијата да пристапува и да синхронизира социјални ажурирања од вас и вашите пријатели. Бидете внимателни кога споделувате информации - ова овозможува апликацијата да ја чита комуникацијата меѓу вас и вашите пријатели на социјалните мрежи, без оглед на нејзината доверливост. Напомена: оваа дозвола не може да се наметне на сите социјални мрежи."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"пишувај на социјалните текови"</string>
diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml
index d65cff2..44399cc 100644
--- a/core/res/res/values-ml-rIN/strings.xml
+++ b/core/res/res/values-ml-rIN/strings.xml
@@ -57,14 +57,14 @@
<string name="badPin" msgid="9015277645546710014">"നിങ്ങൾ ടൈപ്പുചെയ്ത പഴയ പിൻ തെറ്റാണ്."</string>
<string name="badPuk" msgid="5487257647081132201">"നിങ്ങൾ ടൈപ്പുചെയ്ത PUK തെറ്റാണ്."</string>
<string name="mismatchPin" msgid="609379054496863419">"നിങ്ങൾ ടൈപ്പുചെയ്ത് പിൻ പൊരുത്തപ്പെടുന്നില്ല."</string>
- <string name="invalidPin" msgid="3850018445187475377">"4 മുതൽ 8 വരെ അക്കങ്ങളുള്ള ഒരു PIN ടൈപ്പുചെയ്യുക."</string>
+ <string name="invalidPin" msgid="3850018445187475377">"4 മുതൽ 8 വരെ അക്കങ്ങളുള്ള ഒരു പിൻ ടൈപ്പുചെയ്യുക."</string>
<string name="invalidPuk" msgid="8761456210898036513">"എട്ടോ അതിലധികമോ അക്കങ്ങളുള്ള ഒരു PUK ടൈപ്പുചെയ്യുക."</string>
- <string name="needPuk" msgid="919668385956251611">"നിങ്ങളുടെ SIM കാർഡ് PUK ലോക്ക് ചെയ്തതാണ്. ഇത് അൺലോക്ക് ചെയ്യാൻ PUK കോഡ് ടൈപ്പുചെയ്യുക."</string>
- <string name="needPuk2" msgid="4526033371987193070">"SIM കാർഡ് തടഞ്ഞത് മാറ്റാൻ PUK2 ടൈപ്പുചെയ്യുക."</string>
- <string name="enablePin" msgid="209412020907207950">"വിജയകരമല്ല, SIM/RUIM ലോക്ക് പ്രവർത്തനക്ഷമമാക്കുക."</string>
+ <string name="needPuk" msgid="919668385956251611">"നിങ്ങളുടെ സിം കാർഡ് PUK ലോക്ക് ചെയ്തതാണ്. ഇത് അൺലോക്ക് ചെയ്യാൻ PUK കോഡ് ടൈപ്പുചെയ്യുക."</string>
+ <string name="needPuk2" msgid="4526033371987193070">"സിം കാർഡ് തടഞ്ഞത് മാറ്റാൻ PUK2 ടൈപ്പുചെയ്യുക."</string>
+ <string name="enablePin" msgid="209412020907207950">"വിജയകരമല്ല, സിം/RUIM ലോക്ക് പ്രവർത്തനക്ഷമമാക്കുക."</string>
<plurals name="pinpuk_attempts">
- <item quantity="one" msgid="6596245285809790142">"SIM ലോക്കാകുന്നതിന് മുമ്പായി നിങ്ങൾക്ക് <xliff:g id="NUMBER">%d</xliff:g> ശ്രമം കൂടി ബാക്കിയുണ്ട്."</item>
- <item quantity="other" msgid="7530597808358774740">"SIM ലോക്കാകുന്നതിന് മുമ്പായി നിങ്ങൾക്ക് <xliff:g id="NUMBER">%d</xliff:g> ശ്രമങ്ങൾ കൂടി ബാക്കിയുണ്ട്."</item>
+ <item quantity="one" msgid="6596245285809790142">"സിം ലോക്കാകുന്നതിന് മുമ്പായി നിങ്ങൾക്ക് <xliff:g id="NUMBER">%d</xliff:g> ശ്രമം കൂടി ബാക്കിയുണ്ട്."</item>
+ <item quantity="other" msgid="7530597808358774740">"സിം ലോക്കാകുന്നതിന് മുമ്പായി നിങ്ങൾക്ക് <xliff:g id="NUMBER">%d</xliff:g> ശ്രമങ്ങൾ കൂടി ബാക്കിയുണ്ട്."</item>
</plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
@@ -76,7 +76,7 @@
<string name="CwMmi" msgid="9129678056795016867">"കോൾ വെയ്റ്റിംഗ്"</string>
<string name="BaMmi" msgid="455193067926770581">"കോൾ നിരോധിക്കൽ"</string>
<string name="PwdMmi" msgid="7043715687905254199">"പാസ്വേഡ് മാറ്റം"</string>
- <string name="PinMmi" msgid="3113117780361190304">"PIN മാറ്റം"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"പിൻ മാറ്റം"</string>
<string name="CnipMmi" msgid="3110534680557857162">"കോൾ ചെയ്യേണ്ട നമ്പർ ഉണ്ട്"</string>
<string name="CnirMmi" msgid="3062102121430548731">"കോൾ ചെയ്യാനുള്ള നമ്പർ നിയന്ത്രിച്ചു"</string>
<string name="ThreeWCMmi" msgid="9051047170321190368">"മൂന്നുവിധത്തിൽ കോൾ ചെയ്യൽ"</string>
@@ -183,9 +183,9 @@
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"നിശബ്ദ മോഡ്"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ശബ്ദം ഓഫാണ്"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ശബ്ദം ഓണാണ്"</string>
- <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"വിമാന മോഡ്"</string>
- <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"വിമാന മോഡ് ഓണാണ്"</string>
- <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"വിമാന മോഡ് ഓഫാണ്"</string>
+ <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ഫ്ലൈറ്റ് മോഡ്"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"ഫ്ലൈറ്റ് മോഡ് ഓണാണ്"</string>
+ <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"ഫ്ലൈറ്റ് മോഡ് ഓഫാണ്"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ക്രമീകരണങ്ങൾ"</string>
<string name="global_action_lockdown" msgid="8751542514724332873">"ഇപ്പോൾ ലോക്കുചെയ്യുക"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
@@ -205,8 +205,8 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"നിങ്ങളുടെ ഭൗതിക ലൊക്കേഷൻ നിരീക്ഷിക്കുക."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"നെറ്റ്വർക്ക് ആശയവിനിമയം"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"വ്യത്യസ്ത നെറ്റ്വർക്ക് സവിശേഷതകൾ ആക്സസ്സുചെയ്യുക."</string>
- <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
- <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Bluetooth മുഖേന ഉപകരണങ്ങളും നെറ്റ്വർക്കുകളും ആക്സസ്സുചെയ്യുക."</string>
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"ബ്ലൂടൂത്ത്"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"ബ്ലൂടൂത്ത് മുഖേന ഉപകരണങ്ങളും നെറ്റ്വർക്കുകളും ആക്സസ്സുചെയ്യുക."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"ഓഡിയോ ക്രമീകരണങ്ങൾ"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"ഓഡിയോ ക്രമീകരണങ്ങൾ മാറ്റുക."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"ബാറ്ററിയെ ബാധിക്കുന്നു"</string>
@@ -289,15 +289,15 @@
<string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"സന്ദേശം വഴി പ്രതികരിക്കുക ഇവന്റുകൾ അയയ്ക്കുക"</string>
<string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"ഇൻകമിംഗ് കോളുകൾക്കായി സന്ദേശം മുഖേന പ്രതികരിക്കുക ഇവന്റുകൾ കൈകാര്യം ചെയ്യുന്ന മറ്റ് സന്ദേശമയയ്ക്കൽ അപ്ലിക്കേഷനുകൾക്ക് അഭ്യർത്ഥനകൾ അയയ്ക്കാൻ അപ്ലിക്കേഷനുകളെ അനുവദിക്കുന്നു."</string>
<string name="permlab_readSms" msgid="8745086572213270480">"നിങ്ങളുടെ വാചക സന്ദേശങ്ങൾ വായിക്കുക (SMS അല്ലെങ്കിൽ MMS)"</string>
- <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"നിങ്ങളുടെ ടാബ്ലെറ്റിലോ SIM കാർഡിലോ സംഭരിച്ചിരിക്കുന്ന SMS സന്ദേശങ്ങൾ വായിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഇത് ഉള്ളടക്കമോ രഹസ്യാത്മകതയോ പരിഗണിക്കാതെ എല്ലാ SMS സന്ദേശങ്ങളും വായിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
- <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"നിങ്ങളുടെ ഫോണിലോ SIM കാർഡിലോ സംഭരിച്ചിരിക്കുന്ന SMS സന്ദേശങ്ങൾ വായിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഇത് ഉള്ളടക്കമോ രഹസ്യാത്മകതയോ പരിഗണിക്കാതെ എല്ലാ SMS സന്ദേശങ്ങളും വായിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"നിങ്ങളുടെ ടാബ്ലെറ്റിലോ സിം കാർഡിലോ സംഭരിച്ചിരിക്കുന്ന SMS സന്ദേശങ്ങൾ വായിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഇത് ഉള്ളടക്കമോ രഹസ്യാത്മകതയോ പരിഗണിക്കാതെ എല്ലാ SMS സന്ദേശങ്ങളും വായിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"നിങ്ങളുടെ ഫോണിലോ സിം കാർഡിലോ സംഭരിച്ചിരിക്കുന്ന SMS സന്ദേശങ്ങൾ വായിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഇത് ഉള്ളടക്കമോ രഹസ്യാത്മകതയോ പരിഗണിക്കാതെ എല്ലാ SMS സന്ദേശങ്ങളും വായിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_writeSms" msgid="3216950472636214774">"നിങ്ങളുടെ വാചക സന്ദേശങ്ങൾ എഡിറ്റുചെയ്യുക (SMS അല്ലെങ്കിൽ MMS)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"നിങ്ങളുടെ ടാബ്ലെറ്റിലോ SIM കാർഡിലോ സംഭരിച്ചിരിക്കുന്ന SMS സന്ദേശങ്ങളിലേക്ക് റൈറ്റുചെയ്യുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ദോഷകരമായ അപ്ലിക്കേഷനുകൾ നിങ്ങളുടെ സന്ദേശങ്ങളെ ഇല്ലാതാക്കിയേക്കാം."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"നിങ്ങളുടെ ഫോണിലോ SIM കാർഡിലോ സംഭരിച്ചിരിക്കുന്ന SMS സന്ദേശങ്ങളിലേക്ക് റൈറ്റുചെയ്യുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ദോഷകരമായ അപ്ലിക്കേഷനുകൾ നിങ്ങളുടെ സന്ദേശങ്ങളെ ഇല്ലാതാക്കിയേക്കാം."</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"നിങ്ങളുടെ ടാബ്ലെറ്റിലോ സിം കാർഡിലോ സംഭരിച്ചിരിക്കുന്ന SMS സന്ദേശങ്ങളിലേക്ക് റൈറ്റുചെയ്യുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ദോഷകരമായ അപ്ലിക്കേഷനുകൾ നിങ്ങളുടെ സന്ദേശങ്ങളെ ഇല്ലാതാക്കിയേക്കാം."</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"നിങ്ങളുടെ ഫോണിലോ സിം കാർഡിലോ സംഭരിച്ചിരിക്കുന്ന SMS സന്ദേശങ്ങളിലേക്ക് റൈറ്റുചെയ്യുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ദോഷകരമായ അപ്ലിക്കേഷനുകൾ നിങ്ങളുടെ സന്ദേശങ്ങളെ ഇല്ലാതാക്കിയേക്കാം."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"വാചക സന്ദേശം നേടുക (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP സന്ദേശങ്ങൾ നേടാനും പ്രോസസ്സുചെയ്യാനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. നിങ്ങൾക്ക് അയയ്ക്കുന്ന സന്ദേശങ്ങൾ നിങ്ങൾക്ക് ദൃശ്യമാക്കാതെ തന്നെ നിരീക്ഷിക്കാനോ ഇല്ലാതാക്കാനോ ഉള്ള കഴിവ് ഈ അനുമതികളിൽ ഉൾപ്പെടുന്നു."</string>
- <string name="permlab_receiveBluetoothMap" msgid="7593811487142360528">"Bluetooth സന്ദേശങ്ങൾ (MAP) സ്വീകരിക്കുക"</string>
- <string name="permdesc_receiveBluetoothMap" msgid="8656755936919466345">"Bluetooth MAP സന്ദേശങ്ങൾ സ്വീകരിക്കുന്നതിനും പ്രോസസ്സുചെയ്യുന്നതിനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഉപകരണത്തിലേക്ക് അയച്ച സന്ദേശങ്ങൾ നിങ്ങളെ കാണിക്കാതെ തന്നെ നിരീക്ഷിക്കാനോ ഇല്ലാതാക്കാനോ അപ്ലിക്കേഷനാവും."</string>
+ <string name="permlab_receiveBluetoothMap" msgid="7593811487142360528">"ബ്ലൂടൂത്ത് സന്ദേശങ്ങൾ (MAP) സ്വീകരിക്കുക"</string>
+ <string name="permdesc_receiveBluetoothMap" msgid="8656755936919466345">"ബ്ലൂടൂത്ത് MAP സന്ദേശങ്ങൾ സ്വീകരിക്കുന്നതിനും പ്രോസസ്സുചെയ്യുന്നതിനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഉപകരണത്തിലേക്ക് അയച്ച സന്ദേശങ്ങൾ നിങ്ങളെ കാണിക്കാതെ തന്നെ നിരീക്ഷിക്കാനോ ഇല്ലാതാക്കാനോ അപ്ലിക്കേഷനാവും."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"പ്രവർത്തിക്കുന്ന അപ്ലിക്കേഷനുകൾ വീണ്ടെടുക്കുക"</string>
<string name="permdesc_getTasks" msgid="7454215995847658102">"നിലവിലും സമീപകാലത്തും പ്രവർത്തിക്കുന്ന ടാസ്ക്കുകളെക്കുറിച്ചുള്ള വവിവരങ്ങൾ വീണ്ടെടുക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഇത് ഉപകരണത്തിൽ ഉപയോഗിച്ച അപ്ലിക്കേഷനുകളെക്കുറിച്ചുള്ള വിവരം കണ്ടെത്താൻ അപ്ലിക്കേഷനെ അനുവദിക്കാനിടയുണ്ട്."</string>
<string name="permlab_startTasksFromRecents" msgid="8990073877885690623">"\'അടുത്തിടെയുള്ളവ\' എന്നതിൽ നിന്ന് ഒരു ടാസ്ക് ആരംഭിക്കുക"</string>
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"നിങ്ങളുടെ സ്വന്തം കോൺടാക്റ്റ് കാർഡ് പരിഷ്ക്കരിക്കുക"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"നിങ്ങളുടെ ഉപകരണത്തിൽ സംഭരിച്ചിരിക്കുന്ന നിങ്ങളുടെ പേരും ബന്ധപ്പെടാനുള്ള വിവരങ്ങളും പോലുള്ള വ്യക്തിഗത പ്രൊഫൈൽ വിവരം മാറ്റാനോ ചേർക്കാനോ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. നിങ്ങളെ തിരിച്ചറിയാനും നിങ്ങളുടെ പ്രൊഫൈൽ വിവരം മറ്റുള്ളവർക്ക് അയയ്ക്കാനും അപ്ലിക്കേഷന് കഴിഞ്ഞേക്കാമെന്നാണ് ഇതിനർത്ഥം."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"ശാരീര സെൻസറുകൾ (ഹൃദയമിടിപ്പ് നിരക്ക് മോണിറ്ററുകൾ പോലെ)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"ഹൃദയമിടിപ്പിന്റെ നിരക്കുപോലെ നിങ്ങളുടെ ശരീരത്തിനുള്ളിൽ സംഭവിക്കുന്ന കാര്യങ്ങൾ കണക്കാക്കാൻ ഉപയോഗിക്കുന്ന സെൻസറുകളിൽനിന്ന് ഡാറ്റ ആക്സസ്സുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"നിങ്ങളുടെ ഹൃദയമിടിപ്പ് പോലുള്ള ശാരീരികാവസ്ഥ നിരീക്ഷിക്കാൻ സെൻസറുകളിൽ നിന്ന് വിവരം ആക്സസ്സുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"നിങ്ങളുടെ സോഷ്യൽ സ്ട്രീം വായിക്കുക"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"നിങ്ങളിൽ നിന്നും സുഹൃത്തുക്കളിൽ നിന്നും സോഷ്യൽ അപ്ഡേറ്റുകൾ ആക്സസ്സുചെയ്യാനും സമന്വയിപ്പിക്കാനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. വിവരം പങ്കിടുമ്പോൾ ജാഗ്രത പാലിക്കുക -- ഇത് സോഷ്യൽ നെറ്റ്വർക്കുകളിൽ നിങ്ങൾക്കും സുഹൃത്തുക്കൾക്കും ഇടയിലുള്ള ആശയവിനിമയങ്ങൾ രഹസ്യാത്മകത പരിഗണിക്കാതെ റീഡുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ശ്രദ്ധിക്കുക: ഈ അനുമതി എല്ലാ സോഷ്യൽ നെറ്റ്വർക്കുകളിലും നടപ്പിലാക്കാനിടയില്ല."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"നിങ്ങളുടെ സോഷ്യൽ സ്ട്രീമിലേക്ക് എഴുതുക"</string>
@@ -521,10 +521,10 @@
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"ഫ്രെയിം ബഫറിന്റെ ഉള്ളടക്കം റീഡുചെയ്യുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger ആക്സസ്സുചെയ്യുക"</string>
<string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"InputFlinger കുറഞ്ഞ നിലയിലുള്ള സവിശേഷതകൾ ഉപയോഗിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
- <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wifi ഡിസ്പ്ലേകൾ കോൺഫിഗർ ചെയ്യുക"</string>
- <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Wifi ഡിസ്പ്ലേകൾ കോൺഫിഗർ ചെയ്യാനും അതിലേക്ക് കണക്റ്റുചെയ്യാനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
- <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Wifi ഡിസ്പ്ലേകൾ നിയന്ത്രിക്കുക"</string>
- <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Wifi ഡിസ്പ്ലേകളുടെ കുറഞ്ഞ നിലയിലുള്ള സവിശേഷതകൾ നിയന്ത്രിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"വൈഫൈ ഡിസ്പ്ലേകൾ കോൺഫിഗർ ചെയ്യുക"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"വൈഫൈ ഡിസ്പ്ലേകൾ കോൺഫിഗർ ചെയ്യാനും അതിലേക്ക് കണക്റ്റുചെയ്യാനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"വൈഫൈ ഡിസ്പ്ലേകൾ നിയന്ത്രിക്കുക"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"വൈഫൈ ഡിസ്പ്ലേകളുടെ കുറഞ്ഞ നിലയിലുള്ള സവിശേഷതകൾ നിയന്ത്രിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_captureAudioOutput" msgid="6857134498402346708">"ഓഡിയോ ഔട്ട്പുട്ട് ക്യാപ്ചർ ചെയ്യുക"</string>
<string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"ഓഡിയോ ഔട്ട്പുട്ട് ക്യാപ്ചർ ചെയ്ത് റീഡയറക്ടുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_captureAudioHotword" msgid="1890553935650349808">"ഹോട്ട്വേഡ് തിരിച്ചറിയൽ"</string>
@@ -542,7 +542,7 @@
<string name="permlab_recordAudio" msgid="3876049771427466323">"ഓഡിയോ റെക്കോർഡ് ചെയ്യുക"</string>
<string name="permdesc_recordAudio" msgid="4906839301087980680">"മൈക്രോഫോൺ ഉപയോഗിച്ച് ഓഡിയോ റെക്കോർഡുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഈ അനുമതി നിങ്ങളുടെ സ്ഥിരീകരണമില്ലാതെ ഏതുസമയത്തും ഓഡിയോ റെക്കോർഡുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്ന്ഉ."</string>
<string name="permlab_sim_communication" msgid="1180265879464893029">"സിം ആശയവിനിമയം"</string>
- <string name="permdesc_sim_communication" msgid="5725159654279639498">"SIM-ലേക്ക് കമാൻഡുകൾ അയയ്ക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഇത് വളരെ അപകടകരമാണ്."</string>
+ <string name="permdesc_sim_communication" msgid="5725159654279639498">"സിമ്മിലേക്ക് കമാൻഡുകൾ അയയ്ക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഇത് വളരെ അപകടകരമാണ്."</string>
<string name="permlab_camera" msgid="3616391919559751192">"ചിത്രങ്ങളും വീഡിയോകളും എടുക്കുക"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"ക്യാമറ ഉപയോഗിച്ച് ചിത്രങ്ങളും വീഡിയോകളും എടുക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. നിങ്ങളുടെ സ്ഥിരീകരണമില്ലാതെ ഏതുസമയത്തും ക്യാമറ ഉപയോഗിക്കാൻ ഈ അനുമതി അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"ക്യാമറ ഉപയോഗത്തിലായിരിക്കുമ്പോൾ ട്രാൻസ്മിറ്റ് ഇൻഡിക്കേറ്റർ LED പ്രവർത്തനരഹിതമാക്കുക"</string>
@@ -660,15 +660,15 @@
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Wi-Fi മൾട്ടികാസ്റ്റ് റിസപ്ഷൻ അനുവദിക്കുക"</string>
<string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"മൾട്ടികാസ്റ്റ് വിലാസങ്ങൾ ഉപയോഗിച്ച് നിങ്ങളുടെ ടബ്ലെറ്റിലേക്ക് മാത്രമല്ലാതെ, ഒരു Wi-Fi നെറ്റ്വർക്കിലെ എല്ലാ ഉപകരണങ്ങളിലേക്കും അയച്ച പായ്ക്കറ്റുകൾ നേടാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഇത് മൾട്ടികാസ്റ്റ് ഇതര മോഡിനേക്കാൾ അധികം പവർ ഉപയോഗിക്കുന്നു."</string>
<string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"മൾട്ടികാസ്റ്റ് വിലാസങ്ങൾ ഉപയോഗിച്ച് നിങ്ങളുടെ ഫോണിലേക്ക് മാത്രമല്ലാതെ, ഒരു Wi-Fi നെറ്റ്വർക്കിലെ എല്ലാ ഉപകരണങ്ങളിലേക്കും അയച്ച പായ്ക്കറ്റുകൾ നേടാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഇത് മൾട്ടികാസ്റ്റ് ഇതര മോഡിനേക്കാൾ അധികം പവർ ഉപയോഗിക്കുന്നു."</string>
- <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth ക്രമീകരണങ്ങൾ ആക്സസ്സുചെയ്യുക"</string>
- <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"ഒരു പ്രാദേശിക Bluetooth ടാബ്ലെറ്റ് കോൺഫിഗർചെയ്യുന്നതിനും വിദൂര ഉപകരണങ്ങളെ കണ്ടെത്തി ജോടിയാക്കുന്നതിനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
- <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"ഒരു പ്രാദേശിക Bluetooth ഫോണിനെ കോൺഫിഗർചെയ്യുന്നതിനും വിദൂര ഉപകരണങ്ങളെ കണ്ടെത്തി ജോടിയാക്കുന്നതിനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
- <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"അപ്ലിക്കേഷൻ ഉപയോഗിച്ച് Bluetooth ജോടിയാക്കൽ അനുവദിക്കുക"</string>
+ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"ബ്ലൂടൂത്ത് ക്രമീകരണങ്ങൾ ആക്സസ്സുചെയ്യുക"</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"ഒരു പ്രാദേശിക ബ്ലൂടൂത്ത് ടാബ്ലെറ്റ് കോൺഫിഗർചെയ്യുന്നതിനും വിദൂര ഉപകരണങ്ങളെ കണ്ടെത്തി ജോടിയാക്കുന്നതിനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"ഒരു പ്രാദേശിക ബ്ലൂടൂത്ത് ഫോണിനെ കോൺഫിഗർചെയ്യുന്നതിനും വിദൂര ഉപകരണങ്ങളെ കണ്ടെത്തി ജോടിയാക്കുന്നതിനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"അപ്ലിക്കേഷൻ ഉപയോഗിച്ച് ബ്ലൂടൂത്ത് ജോടിയാക്കൽ അനുവദിക്കുക"</string>
<string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"ഉപയോക്തൃ ഇടപെടലില്ലാതെ വിദൂര ഉപകരണങ്ങളുമായി ജോടിയാക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"ഉപയോക്തൃ ഇടപെടലില്ലാതെ വിദൂര ഉപകരണങ്ങളുമായി ജോടിയാക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
- <string name="permlab_bluetoothMap" msgid="6372198338939197349">"Bluetooth MAP ഡാറ്റ ആക്സസ്സുചെയ്യുക"</string>
- <string name="permdesc_bluetoothMap" product="tablet" msgid="5784090105926959958">"Bluetooth MAP ഡാറ്റ ആക്സസ്സുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
- <string name="permdesc_bluetoothMap" product="default" msgid="5784090105926959958">"Bluetooth MAP ഡാറ്റ ആക്സസ്സുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_bluetoothMap" msgid="6372198338939197349">"ബ്ലൂടൂത്ത് MAP ഡാറ്റ ആക്സസ്സുചെയ്യുക"</string>
+ <string name="permdesc_bluetoothMap" product="tablet" msgid="5784090105926959958">"ബ്ലൂടൂത്ത് MAP ഡാറ്റ ആക്സസ്സുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permdesc_bluetoothMap" product="default" msgid="5784090105926959958">"ബ്ലൂടൂത്ത് MAP ഡാറ്റ ആക്സസ്സുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX കണക്റ്റുചെയ്യുക, അതിൽ നിന്നും വിച്ഛേദിക്കുക"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"WiMAX പ്രവർത്തനക്ഷമമാണോയെന്നതും കണക്റ്റുചെയ്തിരിക്കുന്ന ഏതെങ്കിലും WiMAX നെറ്റ്വർക്കുകളെക്കുറിച്ചുള്ള വിവരങ്ങളും നിർണ്ണയിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX നില മാറ്റുക"</string>
@@ -677,9 +677,9 @@
<string name="permlab_scoreNetworks" msgid="6445777779383587181">"സ്കോർ നെറ്റ്വർക്ക്"</string>
<string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"നെറ്റ്വർക്കുകളെ റാങ്ക് ചെയ്യുന്നതിനും ടാബ്ലെറ്റ് മുൻഗണന നൽകുന്ന നെറ്റ്വർക്കിനെ സ്വാധീനിക്കുന്നതിനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"നെറ്റ്വർക്കുകളെ റാങ്ക് ചെയ്യുന്നതിനും ഫോൺ മുൻഗണന നൽകുന്ന നെറ്റ്വർക്കുകളെ സ്വാധീനിക്കുന്നതിനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
- <string name="permlab_bluetooth" msgid="6127769336339276828">"Bluetooth ഉപകരണങ്ങളുമായി ജോടിയാക്കുക"</string>
- <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"ടാബ്ലെറ്റിലെ Bluetooth കോൺഫിഗറേഷൻ കാണാനും ജോടിയാക്കിയ ഉപകരണങ്ങളുമായി കണക്ഷനുകൾ നടത്തി അംഗീകരിക്കാനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
- <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"ഫോണിലെ Bluetooth കോൺഫിഗറേഷൻ കാണാനും ജോടിയാക്കിയ ഉപകരണങ്ങളുമായി കണക്ഷനുകൾ നടത്തി അംഗീകരിക്കാനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_bluetooth" msgid="6127769336339276828">"ബ്ലൂടൂത്ത് ഉപകരണങ്ങളുമായി ജോടിയാക്കുക"</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"ടാബ്ലെറ്റിലെ ബ്ലൂടൂത്ത് കോൺഫിഗറേഷൻ കാണാനും ജോടിയാക്കിയ ഉപകരണങ്ങളുമായി കണക്ഷനുകൾ നടത്തി അംഗീകരിക്കാനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"ഫോണിലെ ബ്ലൂടൂത്ത് കോൺഫിഗറേഷൻ കാണാനും ജോടിയാക്കിയ ഉപകരണങ്ങളുമായി കണക്ഷനുകൾ നടത്തി അംഗീകരിക്കാനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_nfc" msgid="4423351274757876953">"സമീപ ഫീൽഡുമായുള്ള ആശയവിനിമയം നിയന്ത്രിക്കുക"</string>
<string name="permdesc_nfc" msgid="7120611819401789907">"നിയർ ഫീൽഡ് കമ്മ്യൂണിക്കേഷൻ (NFC) ടാഗുകളുമായും കാർഡുകളുമായും റീഡറുകളുമായുള്ള ആശയവിനിമയത്തിന് അപ്ലിക്കേഷനുകളെ അനുവദിക്കുന്നു."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"നിങ്ങളുടെ സ്ക്രീൻ ലോക്ക് പ്രവർത്തനരഹിതമാക്കുക"</string>
@@ -891,7 +891,7 @@
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"പാസ്വേഡ് ടൈപ്പുചെയ്യുന്നതിന് സ്പർശിക്കുക"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"അൺലോക്കുചെയ്യുന്നതിന് പാസ്വേഡ് ടൈപ്പുചെയ്യുക"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"അൺലോക്കുചെയ്യുന്നതിന് പിൻ ടൈപ്പുചെയ്യുക"</string>
- <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"PIN കോഡ് തെറ്റാണ്."</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"പിൻ കോഡ് തെറ്റാണ്."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"അൺലോക്ക് ചെയ്യുന്നതിന് മെനു, 0 എന്നിവ അമർത്തുക."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"അടിയന്തര നമ്പർ"</string>
<string name="lockscreen_carrier_default" msgid="8963839242565653192">"സേവനമില്ല."</string>
@@ -905,13 +905,13 @@
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"വീണ്ടും ശ്രമിക്കുക"</string>
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"വീണ്ടും ശ്രമിക്കുക"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ശ്രമങ്ങളുടെ പരമാവധി കഴിഞ്ഞു"</string>
- <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM കാർഡൊന്നുമില്ല"</string>
- <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"ടാബ്ലെറ്റിൽ SIM കാർഡൊന്നുമില്ല."</string>
- <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"ഫോണിൽ SIM കാർഡൊന്നുമില്ല."</string>
- <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"ഒരു SIM കാർഡ് ചേർക്കുക."</string>
- <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SIM കാർഡ് കാണുന്നില്ല അല്ലെങ്കിൽ റീഡുചെയ്യാനായില്ല. ഒരു SIM കാർഡ് ചേർക്കുക."</string>
- <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"ഉപയോഗശൂന്യമായ SIM കാർഡ്."</string>
- <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"നിങ്ങളുടെ SIM കാർഡ് ശാശ്വതമായി പ്രവർത്തനരഹിതമാക്കി.\n മറ്റൊരു SIM കാർഡിനായി നിങ്ങളുടെ വയർലെസ് സേവന ദാതാവിനെ ബന്ധപ്പെടുക."</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"സിം കാർഡൊന്നുമില്ല"</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"ടാബ്ലെറ്റിൽ സിം കാർഡൊന്നുമില്ല."</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"ഫോണിൽ സിം കാർഡൊന്നുമില്ല."</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"ഒരു സിം കാർഡ് ചേർക്കുക."</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"സിം കാർഡ് കാണുന്നില്ല അല്ലെങ്കിൽ റീഡുചെയ്യാനായില്ല. ഒരു സിം കാർഡ് ചേർക്കുക."</string>
+ <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"ഉപയോഗശൂന്യമായ സിം കാർഡ്."</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"നിങ്ങളുടെ സിം കാർഡ് ശാശ്വതമായി പ്രവർത്തനരഹിതമാക്കി.\n മറ്റൊരു സിം കാർഡിനായി നിങ്ങളുടെ വയർലെസ് സേവന ദാതാവിനെ ബന്ധപ്പെടുക."</string>
<string name="lockscreen_transport_prev_description" msgid="6300840251218161534">"മുമ്പത്തെ ട്രാക്ക്"</string>
<string name="lockscreen_transport_next_description" msgid="573285210424377338">"അടുത്ത ട്രാക്ക്"</string>
<string name="lockscreen_transport_pause_description" msgid="3980308465056173363">"താൽക്കാലികമായി നിർത്തുക"</string>
@@ -921,13 +921,13 @@
<string name="lockscreen_transport_ffw_description" msgid="42987149870928985">"വേഗത്തിലുള്ള കൈമാറൽ"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"അടിയന്തര കോളുകൾ മാത്രം"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"നെറ്റ്വർക്ക് ലോക്കുചെയ്തു"</string>
- <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM കാർഡ് PUK ലോക്ക് ചെയ്തതാണ്."</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"സിം കാർഡ് PUK ലോക്ക് ചെയ്തതാണ്."</string>
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"ഉപയോക്തൃ ഗൈഡ് കാണുകയോ കസ്റ്റമർ കെയറുമായി ബന്ധപ്പെടുകയോ ചെയ്യുക."</string>
- <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM കാർഡ് ലോക്കുചെയ്തു."</string>
- <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM കാർഡ് അൺലോക്കുചെയ്യുന്നു…"</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"സിം കാർഡ് ലോക്കുചെയ്തു."</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"സിം കാർഡ് അൺലോക്കുചെയ്യുന്നു…"</string>
<string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"നിങ്ങളുടെ പാറ്റേൺ <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="2725973286239344555">"നിങ്ങളുടെ പാസ്വേഡ് <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="6216672706545696955">"നിങ്ങളുടെ PIN <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="6216672706545696955">"നിങ്ങളുടെ പിൻ <xliff:g id="NUMBER_0">%d</xliff:g> തവണ തെറ്റായി ടൈപ്പുചെയ്തു. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക."</string>
<string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"നിങ്ങളുടെ അൺലോക്കുചെയ്യൽ പാറ്റേൺ <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"നിങ്ങൾ അൺലോക്കുചെയ്യൽ പാറ്റേൺ <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"നിങ്ങൾ ഫോൺ അൺലോക്കുചെയ്യാൻ തവണ <xliff:g id="NUMBER_0">%d</xliff:g> തെറ്റായി ശ്രമിച്ചു. <xliff:g id="NUMBER_1">%d</xliff:g> ശ്രമങ്ങൾ കൂടി വിജയിച്ചില്ലെങ്കിൽ, ടാബ്ലെറ്റ് ഫാക്ടറി സ്ഥിരമായതിലേക്ക് പുനഃസജ്ജികരിക്കുകയും ഉപയോക്തൃ ഡാറ്റയെല്ലാം നഷ്ടപ്പെടുകയും ചെയ്യും."</string>
@@ -1053,7 +1053,7 @@
<string name="searchview_description_query" msgid="5911778593125355124">"തിരയൽ അന്വേഷണം"</string>
<string name="searchview_description_clear" msgid="1330281990951833033">"അന്വേഷണം മായ്ക്കുക"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"ചോദ്യം സമർപ്പിക്കുക"</string>
- <string name="searchview_description_voice" msgid="2453203695674994440">"വോയ്സ് തിരയൽ"</string>
+ <string name="searchview_description_voice" msgid="2453203695674994440">"ശബ്ദ തിരയൽ"</string>
<string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"ടച്ച് വഴി പര്യവേക്ഷണം ചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കണോ?"</string>
<string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"ടച്ച് വഴി പര്യവേക്ഷണം ചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കാൻ <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> താൽപ്പര്യപ്പെടുന്നു. ടച്ച് വഴി പര്യവേക്ഷണം ചെയ്യൽ ഓൺ ചെയ്യുമ്പോൾ, നിങ്ങളുടെ വിരലിനടിയിലുള്ളവയുടെ വിവരണം കേൾക്കാനോ കാണാനോ അല്ലെങ്കിൽ ടാബ്ലെറ്റുമായി സംവദിക്കുന്ന ജെസ്റ്ററുകൾ നിർവഹിക്കാനോ കഴിയും."</string>
<string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"ടച്ച് വഴി പര്യവേക്ഷണം ചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കാൻ <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> താൽപ്പര്യപ്പെടുന്നു. ടച്ച് വഴി പര്യവേക്ഷണം ചെയ്യൽ ഓൺ ചെയ്യുമ്പോൾ, നിങ്ങളുടെ വിരലിനടിയിലുള്ളവയുടെ വിവരണം കേൾക്കാനോ കാണാനോ അല്ലെങ്കിൽ ഫോണുമായി സംവദിക്കുന്ന ജെസ്റ്ററുകൾ നിർവഹിക്കാനോ കഴിയും."</string>
@@ -1243,14 +1243,14 @@
<string name="sendText" msgid="5209874571959469142">"വാചകസന്ദേശത്തിനായി ഒരു പ്രവർത്തനം തിരഞ്ഞെടുക്കുക"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"റിംഗർ വോളിയം"</string>
<string name="volume_music" msgid="5421651157138628171">"മീഡിയ വോളിയം"</string>
- <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Bluetooth മുഖേന പ്ലേ ചെയ്യുന്നു"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"ബ്ലൂടൂത്ത് മുഖേന പ്ലേ ചെയ്യുന്നു"</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"നിശബ്ദ റിംഗ്ടോൺ സജ്ജമാക്കിയിരിക്കുന്നു"</string>
<string name="volume_call" msgid="3941680041282788711">"ഫോൺ കോൾ വോളിയം"</string>
- <string name="volume_bluetooth_call" msgid="2002891926351151534">"Bluetooth-ൽ കണക്റ്റുചെയ്തിരിക്കുമ്പോഴുള്ള കോൾ വോളിയം"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"ബ്ലൂടൂത്തിൽ കണക്റ്റുചെയ്തിരിക്കുമ്പോഴുള്ള കോൾ വോളിയം"</string>
<string name="volume_alarm" msgid="1985191616042689100">"അലാറം വോളിയം"</string>
<string name="volume_notification" msgid="2422265656744276715">"അറിയിപ്പ് വോളിയം"</string>
<string name="volume_unknown" msgid="1400219669770445902">"വോളിയം"</string>
- <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Bluetooth വോളിയം"</string>
+ <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"ബ്ലൂടൂത്ത് വോളിയം"</string>
<string name="volume_icon_description_ringer" msgid="3326003847006162496">"റിംഗ്ടോൺ വോളിയം"</string>
<string name="volume_icon_description_incall" msgid="8890073218154543397">"കോൾ വോളിയം"</string>
<string name="volume_icon_description_media" msgid="4217311719665194215">"മീഡിയ വോളിയം"</string>
@@ -1285,8 +1285,8 @@
<string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"കണക്റ്റുചെയ്യാനുള്ള ക്ഷണം"</string>
<string name="wifi_p2p_from_message" msgid="570389174731951769">"അയച്ചത്:"</string>
<string name="wifi_p2p_to_message" msgid="248968974522044099">"സ്വീകർത്താവ്:"</string>
- <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"ആവശ്യമായ PIN ടൈപ്പുചെയ്യുക:"</string>
- <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"ആവശ്യമായ പിൻ ടൈപ്പുചെയ്യുക:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"പിൻ:"</string>
<string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"ടാബ്ലെറ്റ് <xliff:g id="DEVICE_NAME">%1$s</xliff:g> എന്നതിൽ കണക്റ്റുചെയ്തിരിക്കുമ്പോൾ അത് താൽക്കാലികമായി Wi-Fi-യിൽ നിന്നും വിച്ഛേദിക്കപ്പെടും."</string>
<string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തിരിക്കുമ്പോൾ ഫോൺ Wi-Fi-യിൽ നിന്ന് താൽക്കാലികമായി വിച്ഛേദിക്കും"</string>
<string name="select_character" msgid="3365550120617701745">"പ്രതീകം ചേർക്കുക"</string>
@@ -1303,10 +1303,10 @@
<string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"നിങ്ങൾക്ക് ഇത് പിന്നീട് ക്രമീകരണങ്ങൾ > അപ്ലിക്കേഷനുകൾ എന്നതിൽ മാറ്റാനാകും"</string>
<string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"എല്ലായ്പ്പോഴും അനുവദിക്കുക"</string>
<string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"ഒരിക്കലും അനുവദിക്കരുത്"</string>
- <string name="sim_removed_title" msgid="6227712319223226185">"SIM കാർഡ് നീക്കംചെയ്തു"</string>
- <string name="sim_removed_message" msgid="5450336489923274918">"സാധുതയുള്ള ഒരു SIM കാർഡ് ചേർത്ത് പുനരാരംഭിക്കുന്നതുവരെ സെല്ലുലാർ നെറ്റ്വർക്ക് ലഭ്യമാകില്ല."</string>
+ <string name="sim_removed_title" msgid="6227712319223226185">"സിം കാർഡ് നീക്കംചെയ്തു"</string>
+ <string name="sim_removed_message" msgid="5450336489923274918">"സാധുതയുള്ള ഒരു സിം കാർഡ് ചേർത്ത് പുനരാരംഭിക്കുന്നതുവരെ സെല്ലുലാർ നെറ്റ്വർക്ക് ലഭ്യമാകില്ല."</string>
<string name="sim_done_button" msgid="827949989369963775">"പൂർത്തിയായി"</string>
- <string name="sim_added_title" msgid="3719670512889674693">"SIM കാർഡ് ചേർത്തു"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"സിം കാർഡ് ചേർത്തു"</string>
<string name="sim_added_message" msgid="7797975656153714319">"സെല്ലുലാർ നെറ്റ്വർക്ക് ആക്സസ്സുചെയ്യാൻ നിങ്ങളുടെ ഉപകരണം പുനരാരംഭിക്കുക."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"പുനരാരംഭിക്കുക"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"സമയം സജ്ജീകരിക്കുക"</string>
@@ -1574,7 +1574,7 @@
<string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"ഡോക്ക് സ്പീക്കറുകൾ"</string>
<string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
<string name="default_audio_route_category_name" msgid="3722811174003886946">"സിസ്റ്റം"</string>
- <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Bluetooth ഓഡിയോ"</string>
+ <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"ബ്ലൂടൂത്ത് ഓഡിയോ"</string>
<string name="wireless_display_route_description" msgid="9070346425023979651">"വയർലെസ് ഡിസ്പ്ലേ"</string>
<string name="media_route_button_content_description" msgid="591703006349356016">"കാസ്റ്റുചെയ്യുക"</string>
<string name="media_route_chooser_title" msgid="1751618554539087622">"ഉപകരണത്തിലേക്ക് കണക്റ്റുചെയ്യുക"</string>
@@ -1596,21 +1596,21 @@
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"പാറ്റേൺ മറന്നു"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"പാറ്റേൺ തെറ്റാണ്"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"പാസ്വേഡ് തെറ്റാണ്"</string>
- <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN തെറ്റാണ്"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"പിൻ തെറ്റാണ്"</string>
<string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക."</string>
<string name="kg_pattern_instructions" msgid="398978611683075868">"നിങ്ങളുടെ പാറ്റേൺ വരയ്ക്കുക"</string>
- <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PIN നൽകുക"</string>
- <string name="kg_pin_instructions" msgid="2377242233495111557">"PIN നൽകുക"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"സിം പിൻ നൽകുക"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"പിൻ നൽകുക"</string>
<string name="kg_password_instructions" msgid="5753646556186936819">"പാസ്വേഡ് നൽകുക"</string>
- <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. വിശദാംശങ്ങൾക്ക് കാരിയറെ ബന്ധപ്പെടുക."</string>
- <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"താൽപ്പര്യപ്പെട്ട PIN കോഡ് നൽകുക"</string>
- <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"താൽപ്പര്യപ്പെട്ട PIN കോഡ് സ്ഥിരീകരിക്കുക"</string>
- <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM കാർഡ് അൺലോക്കുചെയ്യുന്നു…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"PIN കോഡ് തെറ്റാണ്."</string>
- <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4 മുതൽ 8 വരെ അക്കങ്ങളുള്ള ഒരു PIN നൽകുക."</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. വിശദാംശങ്ങൾക്ക് കാരിയറെ ബന്ധപ്പെടുക."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"താൽപ്പര്യപ്പെട്ട പിൻ കോഡ് നൽകുക"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"താൽപ്പര്യപ്പെട്ട പിൻ കോഡ് സ്ഥിരീകരിക്കുക"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"സിം കാർഡ് അൺലോക്കുചെയ്യുന്നു…"</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"പിൻ കോഡ് തെറ്റാണ്."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4 മുതൽ 8 വരെ അക്കങ്ങളുള്ള ഒരു പിൻ നൽകുക."</string>
<string name="kg_invalid_sim_puk_hint" msgid="6025069204539532000">"PUK കോഡ് 8 അക്കങ്ങളായിരിക്കണം."</string>
- <string name="kg_invalid_puk" msgid="3638289409676051243">"ശരിയായ PUK കോഡ് വീണ്ടും നൽകുക. ആവർത്തിച്ചുള്ള ശ്രമങ്ങൾ SIM ശാശ്വതമായി പ്രവർത്തനരഹിതമാക്കും."</string>
- <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN കോഡുകൾ പൊരുത്തപ്പെടുന്നില്ല"</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"ശരിയായ PUK കോഡ് വീണ്ടും നൽകുക. ആവർത്തിച്ചുള്ള ശ്രമങ്ങൾ സിം ശാശ്വതമായി പ്രവർത്തനരഹിതമാക്കും."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"പിൻ കോഡുകൾ പൊരുത്തപ്പെടുന്നില്ല"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"വളരെയധികം പാറ്റേൺ ശ്രമങ്ങൾ"</string>
<string name="kg_login_instructions" msgid="1100551261265506448">"അൺലോക്കുചെയ്യുന്നതിന്, നിങ്ങളുടെ Google അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക."</string>
<string name="kg_login_username_hint" msgid="5718534272070920364">"ഉപയോക്തൃനാമം (ഇമെയിൽ)"</string>
@@ -1619,7 +1619,7 @@
<string name="kg_login_invalid_input" msgid="5754664119319872197">"ഉപയോക്തൃനാമമോ പാസ്വേഡോ അസാധുവാണ്."</string>
<string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"നിങ്ങളുടെ ഉപയോക്തൃനാമമോ പാസ്വേഡോ മറന്നുപോയോ?\n"<b>"google.com/accounts/recovery"</b>" സന്ദർശിക്കുക."</string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"അക്കൗണ്ട് പരിശോധിക്കുന്നു…"</string>
- <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"നിങ്ങളുടെ PIN <xliff:g id="NUMBER_0">%d</xliff:g> തവണ തെറ്റായി ടൈപ്പുചെയ്തു. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"നിങ്ങളുടെ പിൻ <xliff:g id="NUMBER_0">%d</xliff:g> തവണ തെറ്റായി ടൈപ്പുചെയ്തു. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"നിങ്ങളുടെ പാസ്വേഡ് <xliff:g id="NUMBER_0">%d</xliff:g> തവണ തെറ്റായി ടൈപ്പുചെയ്തു. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"നിങ്ങളുടെ പാറ്റേൺ <xliff:g id="NUMBER_0">%d</xliff:g> തവണ തെറ്റായി വരച്ചു. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"നിങ്ങൾ ഫോൺ അൺലോക്കുചെയ്യാൻ തവണ <xliff:g id="NUMBER_0">%d</xliff:g> തെറ്റായി ശ്രമിച്ചു. <xliff:g id="NUMBER_1">%d</xliff:g> ശ്രമങ്ങൾ കൂടി വിജയിച്ചില്ലെങ്കിൽ, ടാബ്ലെറ്റ് ഫാക്ടറി ഡിഫോൾട്ടിലേക്ക് പുനഃസജ്ജികരിക്കുകയും ഉപയോക്തൃ ഡാറ്റയെല്ലാം നഷ്ടപ്പെടുകയും ചെയ്യും."</string>
@@ -1730,15 +1730,15 @@
<string name="reason_service_unavailable" msgid="7824008732243903268">"പ്രിന്റ് സേവനം പ്രവർത്തനക്ഷമമല്ല"</string>
<string name="print_service_installed_title" msgid="2246317169444081628">"<xliff:g id="NAME">%s</xliff:g> സേവനം ഇൻസ്റ്റാളുചെയ്തു"</string>
<string name="print_service_installed_message" msgid="5897362931070459152">"പ്രവർത്തനക്ഷമമാക്കാൻ ടാപ്പുചെയ്യുക"</string>
- <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"അഡ്മിനിസ്ട്രേറ്റർ PIN നൽകുക"</string>
- <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN നൽകുക"</string>
+ <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"അഡ്മിനിസ്ട്രേറ്റർ പിൻ നൽകുക"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"പിൻ നൽകുക"</string>
<string name="restr_pin_incorrect" msgid="8571512003955077924">"തെറ്റാണ്"</string>
- <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"നിലവിലെ PIN"</string>
- <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"പുതിയ PIN"</string>
- <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"പുതിയ PIN സ്ഥിരീകരിക്കുക"</string>
- <string name="restr_pin_create_pin" msgid="8017600000263450337">"നിയന്ത്രണങ്ങൾ പരിഷ്ക്കരിക്കാൻ ഒരു PIN സൃഷ്ടിക്കുക"</string>
- <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-കൾ പൊരുത്തപ്പെടുന്നില്ല. വീണ്ടും ശ്രമിക്കുക"</string>
- <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN തീരെ ചെറുതാണ്. 4 അക്കമെങ്കിലും ഉണ്ടായിരിക്കണം."</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"നിലവിലെ പിൻ"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"പുതിയ പിൻ"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"പുതിയ പിൻ സ്ഥിരീകരിക്കുക"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"നിയന്ത്രണങ്ങൾ പരിഷ്ക്കരിക്കാൻ ഒരു പിൻ സൃഷ്ടിക്കുക"</string>
+ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"പിൻ നമ്പറുകൾ പൊരുത്തപ്പെടുന്നില്ല. വീണ്ടും ശ്രമിക്കുക"</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"പിൻ തീരെ ചെറുതാണ്. 4 അക്കമെങ്കിലും ഉണ്ടായിരിക്കണം."</string>
<plurals name="restr_pin_countdown">
<item quantity="one" msgid="311050995198548675">"ഒരു സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക"</item>
<item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> സെക്കൻഡിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക"</item>
@@ -1757,17 +1757,17 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> തിരഞ്ഞെടുത്തു"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> ഇല്ലാതാക്കി"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"ഔദ്യോഗികം <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="7570091317001980053">"ഈ സ്ക്രീൻ അൺപിൻ ചെയ്യാൻ \'മടങ്ങുക\', \'ചുരുക്കവിവരണം\' എന്നിവ ഒരേ സമയം സ്പർശിച്ച് പിടിക്കുക."</string>
- <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ഈ സ്ക്രീൻ അൺപിൻ ചെയ്യാൻ, ചുരുക്കവിവരണം സ്പർശിച്ച് പിടിക്കുക."</string>
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"ഈ സ്ക്രീൻ അൺപിൻ ചെയ്യാൻ \'മടങ്ങുക\', \'കാഴ്ച\' എന്നിവ ഒരേ സമയം സ്പർശിച്ച് പിടിക്കുക."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ഈ സ്ക്രീൻ അൺപിൻ ചെയ്യാൻ, കാഴ്ച സ്പർശിച്ച് പിടിക്കുക."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"സ്ക്രീൻ പിൻ ചെയ്തിരിക്കുന്നു. നിങ്ങളുടെ ഓർഗനൈസേഷൻ അൺപിൻ ചെയ്യൽ അനുവദിക്കുന്നില്ല."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"സ്ക്രീൻ പിൻ ചെയ്യൽ ഉപയോഗിക്കണോ?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"സ്ക്രീൻ പിൻ ചെയ്യൽ, ഒരൊറ്റ കാഴ്ചയിൽ ഡിസ്പ്ലേയെ ലോക്കുചെയ്യുന്നു.\n\nഅൺപിൻ ചെയ്യാൻ \'മടങ്ങുക\', \'ചുരുക്കവിവരണം\' എന്നിവ ഒരേ സമയം സ്പർശിച്ച് പിടിക്കുക."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"സ്ക്രീൻ പിൻ ചെയ്യൽ, ഒരൊറ്റ കാഴ്ചയിൽ ഡിസ്പ്ലേയെ ലോക്കുചെയ്യുന്നു.\n\nഅൺപിൻ ചെയ്യാൻ, ചുരുക്കവിവരണം സ്പർശിച്ച് പിടിക്കുക."</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"സ്ക്രീൻ പിൻ ചെയ്യൽ, ഒരൊറ്റ കാഴ്ചയിൽ ഡിസ്പ്ലേയെ ലോക്കുചെയ്യുന്നു.\n\nഅൺപിൻ ചെയ്യാൻ \'മടങ്ങുക\', \'കാഴ്ച\' എന്നിവ ഒരേ സമയം സ്പർശിച്ച് പിടിക്കുക."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"സ്ക്രീൻ പിൻ ചെയ്യൽ, ഒരൊറ്റ കാഴ്ചയിൽ ഡിസ്പ്ലേയെ ലോക്കുചെയ്യുന്നു.\n\nഅൺപിൻ ചെയ്യാൻ, കാഴ്ച സ്പർശിച്ച് പിടിക്കുക."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"വേണ്ട, നന്ദി"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"ആരംഭിക്കുക"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"സ്ക്രീൻ പിൻ ചെയ്തു"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"സ്ക്രീൻ അൺപിൻ ചെയ്തു"</string>
- <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"അൺപിൻ ചെയ്യുന്നതിനുമുമ്പ് PIN ആവശ്യപ്പെടുക"</string>
+ <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"അൺപിൻ ചെയ്യുന്നതിനുമുമ്പ് പിൻ ആവശ്യപ്പെടുക"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"അൺപിൻ ചെയ്യുന്നതിനുമുമ്പ് അൺലോക്ക് പാറ്റേൺ ആവശ്യപ്പെടുക"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"അൺപിൻ ചെയ്യുന്നതിനുമുമ്പ് പാസ്വേഡ് ആവശ്യപ്പെടുക"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"ബാറ്ററി ആയുസ്സ് മെച്ചപ്പെടുത്താൻ സഹായിക്കുന്നതിന്, ബാറ്ററി സേവർ നിങ്ങളുടെ ഉപകരണത്തിന്റെ പ്രകടനത്തെ കുറയ്ക്കുകയും വൈബ്രേഷനെയും മിക്ക പശ്ചാത്തല ഡാറ്റയെയും പരിമിതപ്പെടുത്തുകയും ചെയ്യുന്നു. ഇമെയിൽ, സന്ദേശമയയ്ക്കൽ, സമന്വയിപ്പിക്കലിനെ ആശ്രയിച്ചുള്ള മറ്റ് അപ്ലിക്കേഷനുകൾ എന്നിവ നിങ്ങൾ തുറക്കുന്നതുവരെ അപ്ഡേറ്റുചെയ്യാനിടയില്ല.\n\nനിങ്ങളുടെ ഉപകരണം ചാർജ്ജുചെയ്യുമ്പോൾ ബാറ്ററി സേവർ യാന്ത്രികമായി ഓഫാകും."</string>
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
index a82fb50..0368a98 100644
--- a/core/res/res/values-mn-rMN/strings.xml
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"та өөрийн харилцагчийн картыг өөрчлөх"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Апп нь таны нэр болон холбоо барих мэдээлэл зэрэг таны төхөөрөмж дээр хадгалагдсан хувийн профайл мэдээллийг солих эсвэл нэмэх боломжтой. Ингэснээр апп нь танийг таньж чадах ба таны профайл мэдээллийг бусдад илгээх боломжтой."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"биеийн сенсор (зүрхний цохилт хянагч гэх мэт)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Зүрхний цохилт гэх мэт биеийн үзүүлэлт хэмждэг сенсоруудын дата-д хандалт хийх боломжийг апп-д олгоно."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Апп-т таны зүрхний цохилт гэх мэт биеийн байдлыг хянадаг мэдрэгчдийн датанд хандалт хийх боломж олгоно."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"таны нийтийн урсгалаас унших"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Апп нь та болон таны найзуудын нийтийн шинэчлэлтэд хандах болон синк хийх боломжтой. Мэдээлэл хуваалцахдаа болгоомжтой байна уу - энэ нь апп-д нийтийн сүлжээндэх та болон таны найзууд хоорондын холбоог нууц эсэхээс үл хамааран унших боломжтой. Анхаар: энэ зөвшөөрөл нь бүх нийтийн сүлжээнд ашиглаж боломжгүй."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"Таны нийтийн урсгалруу бичих"</string>
diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml
index 5395cf2..90f2394 100644
--- a/core/res/res/values-mr-rIN/strings.xml
+++ b/core/res/res/values-mr-rIN/strings.xml
@@ -54,9 +54,9 @@
<string name="serviceErased" msgid="1288584695297200972">"मिटवणे यशस्वी झाले."</string>
<string name="passwordIncorrect" msgid="7612208839450128715">"अयोग्य संकेतशब्द."</string>
<string name="mmiComplete" msgid="8232527495411698359">"MMI पूर्ण."</string>
- <string name="badPin" msgid="9015277645546710014">"आपण टाइप केलेला जुना PIN योग्य नाही."</string>
+ <string name="badPin" msgid="9015277645546710014">"आपण टाइप केलेला जुना पिन योग्य नाही."</string>
<string name="badPuk" msgid="5487257647081132201">"आपण टाइप केलेला PUK योग्य नाही."</string>
- <string name="mismatchPin" msgid="609379054496863419">"आपण टाइप केलेले PIN जुळत नाहीत."</string>
+ <string name="mismatchPin" msgid="609379054496863419">"आपण टाइप केलेले पिन जुळत नाहीत."</string>
<string name="invalidPin" msgid="3850018445187475377">"4 ते 8 अंकांचा पिन टाइप करा."</string>
<string name="invalidPuk" msgid="8761456210898036513">"8 अंकांचा किंवा मोठा PUK टाइप करा."</string>
<string name="needPuk" msgid="919668385956251611">"आपले सिम कार्ड PUK-लॉक केलेले आहे. ते अनलॉक करण्यासाठी PUK कोड टाइप करा."</string>
@@ -76,7 +76,7 @@
<string name="CwMmi" msgid="9129678056795016867">"कॉल प्रतीक्षा"</string>
<string name="BaMmi" msgid="455193067926770581">"कॉल सोडून"</string>
<string name="PwdMmi" msgid="7043715687905254199">"संकेतशब्द बदल"</string>
- <string name="PinMmi" msgid="3113117780361190304">"PIN बदल"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"पिन बदल"</string>
<string name="CnipMmi" msgid="3110534680557857162">"कॉल करण्याचा नंबर आहे"</string>
<string name="CnirMmi" msgid="3062102121430548731">"कॉल करणारे नंबर प्रतिबंधित"</string>
<string name="ThreeWCMmi" msgid="9051047170321190368">"तीन मार्गांनी कॉल करणे"</string>
@@ -205,8 +205,8 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"आपल्या प्रत्यक्ष स्थानाचे परीक्षण करेल."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"नेटवर्क संप्रेषण"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"विविध नेटवर्क वैशिष्ट्यांवर प्रवेश करेल."</string>
- <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
- <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Bluetooth द्वारे डिव्हाइसेसवर आणि नेटवर्कवर प्रवेश करेल."</string>
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"ब"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"ब द्वारे डिव्हाइसेसवर आणि नेटवर्कवर प्रवेश करेल."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"ऑडिओ सेटिंग्ज"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"ऑडिओ सेटिंग्ज बदला."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"बॅटरी प्रभावित करेल"</string>
@@ -296,8 +296,8 @@
<string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"आपल्या फोनवर किंवा सिम कार्डवर संचयित केलेल्या SMS संदेशांवर लिहिण्यासाठी अॅप ला अनुमती देते. दुर्भावनापूर्ण अॅप्स आपले संदेश हटवू शकतात."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"मजकूर संदेश प्राप्त करा (WAP)"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP संदेश प्राप्त करण्यास आणि त्यावर प्रक्रिया करण्यासाठी अॅप ला अनुमती देते. ही परवानगी आपल्याला पाठविलेले संदेश आपल्याला न दर्शविता त्यांचे परीक्षण करण्याची आणि ते हटविण्याची क्षमता समाविष्ट करते."</string>
- <string name="permlab_receiveBluetoothMap" msgid="7593811487142360528">"Bluetooth संदेश (नकाशा) प्राप्त करा"</string>
- <string name="permdesc_receiveBluetoothMap" msgid="8656755936919466345">"Bluetooth नकाशा संदेश प्राप्त करण्यास आणि त्यावर प्रक्रिया करण्यास अॅप ला अनुमती देते. याचा अर्थ अॅप आपल्या डिव्हाइसवर पाठविलेले संदेश आपल्याला न दर्शवता त्यांचे परीक्षण करू किंवा ते हटवू शकतो."</string>
+ <string name="permlab_receiveBluetoothMap" msgid="7593811487142360528">"ब संदेश (नकाशा) प्राप्त करा"</string>
+ <string name="permdesc_receiveBluetoothMap" msgid="8656755936919466345">"ब नकाशा संदेश प्राप्त करण्यास आणि त्यावर प्रक्रिया करण्यास अॅप ला अनुमती देते. याचा अर्थ अॅप आपल्या डिव्हाइसवर पाठविलेले संदेश आपल्याला न दर्शवता त्यांचे परीक्षण करू किंवा ते हटवू शकतो."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"चालणारे अॅप्स पुनर्प्राप्त करा"</string>
<string name="permdesc_getTasks" msgid="7454215995847658102">"सध्या आणि अलीकडे चालणार्या कार्यांविषयी माहिती पुनर्प्राप्त करण्यासाठी अॅप ला अनुमती देते. हे डिव्हाइसवर कोणते अनुप्रयोग वापरले जात आहेत त्याविषयी माहिती शोधण्यासाठी अॅप ला अनुमती देऊ शकतात."</string>
<string name="permlab_startTasksFromRecents" msgid="8990073877885690623">"अलीकडील वरील कार्य प्रारंभ करा"</string>
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"आपल्या स्वतःचे संपर्क कार्ड सुधारित करा"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"आपल्या डिव्हाइसवर संचयित केलेली वैयक्तिक माहिती बदलण्यासाठी किंवा जोडण्यासाठी अॅप ला अनुमती देते. म्हणजेच अॅप आपल्याला ओळखू शकतो आणि इतरांना आपली प्रोफाईल माहिती पाठवू शकतो."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"(हृदय गती मॉनिटरसारखे) शरीर सेन्सर"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"आपल्या शरीरात काय होत आहे जसे की हृदय गती, मोजण्यासाठी आपण वापरता त्या सेन्सरकडील डेटावर प्रवेश करण्यासाठी अॅप ला अनुमती देते."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"हृदय गती सारख्या, आपल्या शारीरिक स्थितीचे नियंत्रण करणार्या सेन्सरवरून डेटामध्ये प्रवेश करण्यासाठी अॅपला अनुमती देते."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"आपला सामाजिक प्रवाह वाचा"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"आपल्याकडील आणि आपल्या मित्रांकडील सामाजिक अद्यतनांवर प्रवेश करण्यास आणि त्यांचे संकालन करण्यास अॅप ला अनुमती देते. माहिती सामायिक करताना सावधगिरी बाळगा -- हे गोपनीयतेकडे दुर्लक्ष करून, आपण आणि सामाजिक नेटवर्कवरील आपल्या मित्रांमधील संप्रेषणे वाचण्यास अॅप ला अनुमती देते. टीप: या परवानगीची अंमलबजावणी सर्व सामाजिक नेटवर्कवर होऊ शकत नाही."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"आपल्या सामाजिक प्रवाहावर लिहा"</string>
@@ -512,19 +512,19 @@
<string name="permlab_installLocationProvider" msgid="6578101199825193873">"स्थान प्रदाता स्थापित करण्यासाठी परवानगी"</string>
<string name="permdesc_installLocationProvider" msgid="9066146120470591509">"चाचणीसाठी किंवा नवीन स्थान प्रदाता स्थापित करण्यासाठी बनावट स्थान स्त्रोत तयार करा. हे GPS किंवा स्थान प्रदात्यांसारख्या स्थान आणि/किंवा अन्य स्थान स्त्रोतांकडून मिळालेली स्थिती अधिशून्य करण्यास अॅप ला अनुमती देते."</string>
<string name="permlab_accessFineLocation" msgid="1191898061965273372">"अचूक स्थान (GPS आणि नेटवर्क-आधारित)"</string>
- <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"सेल टॉवर आणि Wi-Fi सारखी समग्र स्थिती निर्धारण प्रणाली (GPS) किंवा नेटवर्क स्थान स्त्रोत वापरून आपले अचूक स्थान मिळवण्यासाठी अॅप ला अनुमती देते. अॅपला त्या वापरण्यासाठी या स्थान सेवा चालू असणे आणि आपल्या डिव्हाइसवर उपलब्ध असणे आवश्यक आहे. आपण कुठे आहात हे निर्धारित करण्यासाठी अॅप्स याचा वापर करू शकतात आणि अतिरिक्त बॅटरी उर्जा वापरली जाऊ शकते."</string>
+ <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"सेल टॉवर आणि वाय-फाय सारखी समग्र स्थिती निर्धारण प्रणाली (GPS) किंवा नेटवर्क स्थान स्त्रोत वापरून आपले अचूक स्थान मिळवण्यासाठी अॅप ला अनुमती देते. अॅपला त्या वापरण्यासाठी या स्थान सेवा चालू असणे आणि आपल्या डिव्हाइसवर उपलब्ध असणे आवश्यक आहे. आपण कुठे आहात हे निर्धारित करण्यासाठी अॅप्स याचा वापर करू शकतात आणि अतिरिक्त बॅटरी उर्जा वापरली जाऊ शकते."</string>
<string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"अंदाजे स्थान (नेटवर्क-आधारित)"</string>
- <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"आपले अंदाजे स्थान देण्याची अॅप ला अनुमती देते. हे स्थान सेल टॉवर आणि Wi-Fi सारखे नेटवर्क स्थान स्त्रोत वापरून स्थान सेवांद्वारे मिळवले आहे. अॅपला त्या वापरण्यासाठी या स्थान सेवा चालू असणे आणि आपल्या डिव्हाइसवर उपलब्ध असणे आवश्यक आहे. अॅप्स हे आपण कुठे आहात याचा अंदाज लावण्यासाठी वापरू शकतात."</string>
+ <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"आपले अंदाजे स्थान देण्याची अॅप ला अनुमती देते. हे स्थान सेल टॉवर आणि वाय-फाय सारखे नेटवर्क स्थान स्त्रोत वापरून स्थान सेवांद्वारे मिळवले आहे. अॅपला त्या वापरण्यासाठी या स्थान सेवा चालू असणे आणि आपल्या डिव्हाइसवर उपलब्ध असणे आवश्यक आहे. अॅप्स हे आपण कुठे आहात याचा अंदाज लावण्यासाठी वापरू शकतात."</string>
<string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"SurfaceFlinger वर प्रवेश करा"</string>
<string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"SurfaceFlinger निम्न-स्तर वैशिष्ट्ये वापरण्यासाठी अॅपला अनुमती देते."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"फ्रेम बफर वाचा"</string>
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"फ्रेम बफरची सामग्री वाचण्यास अॅप ला अनुमती देते."</string>
<string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger मध्ये प्रवेश करा"</string>
<string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"अॅपला InputFlinger निम्न-स्तर वैशिष्ट्ये वापरण्याची अनुमती देते."</string>
- <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"WiFi प्रदर्शने कॉन्फिगर करा"</string>
- <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"WiFi प्रदर्शने कॉन्फिगर करण्यासाठी आणि त्यावर कनेक्ट करण्यासाठी अॅप ला अनुमती देते."</string>
- <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"WiFi प्रदर्शने नियंत्रित करा"</string>
- <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"WiFi प्रदर्शनांची निम्न-स्तर वैशिष्ट्ये नियंत्रित करण्यासाठी अॅप ला अनुमती देते."</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"वायफाय प्रदर्शने कॉन्फिगर करा"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"वायफाय प्रदर्शने कॉन्फिगर करण्यासाठी आणि त्यावर कनेक्ट करण्यासाठी अॅप ला अनुमती देते."</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"वायफाय प्रदर्शने नियंत्रित करा"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"वायफाय प्रदर्शनांची निम्न-स्तर वैशिष्ट्ये नियंत्रित करण्यासाठी अॅप ला अनुमती देते."</string>
<string name="permlab_captureAudioOutput" msgid="6857134498402346708">"ऑडिओ आउटपुट कॅप्चर करा"</string>
<string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"अॅपला ऑडिओ आउटपुट कॅप्चर करण्याची आणि पुनर्निर्देशित करण्याची अनुमती देते."</string>
<string name="permlab_captureAudioHotword" msgid="1890553935650349808">"Hotword शोध"</string>
@@ -653,22 +653,22 @@
<string name="permdesc_changeTetherState" msgid="1524441344412319780">"टेदर केलेल्या नेटवर्क कनेक्टिव्हिटीची स्थिती बदलण्यासाठी अॅप ला अनुमती देते."</string>
<string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"पार्श्वभूमी डेटा वापर सेटिंग बदला"</string>
<string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"पार्श्वभूमी डेटा वापर सेटिंग बदलण्यासाठी अॅप ला अनुमती देते."</string>
- <string name="permlab_accessWifiState" msgid="5202012949247040011">"Wi-Fi कनेक्शन पहा"</string>
- <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Wi-Fi सक्षम केले आहे किंवा नाही आणि कनेक्ट केलेल्या Wi-Fi डिव्हाइसेसचे नाव यासारख्या, Wi-Fi नेटवर्किंग विषयीची माहिती पाहण्यासाठी अॅप ला अनुमती देते."</string>
- <string name="permlab_changeWifiState" msgid="6550641188749128035">"Wi-Fi वरून कनेक्ट करा आणि डिस्कनेक्ट करा"</string>
- <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Wi-Fi प्रवेश बिंदूंवर कनेक्ट करण्यासाठी आणि त्यावरून डिस्कनेक्ट करण्यासाठी आणि Wi-Fi नेटवर्कसाठी डिव्हाइस कॉन्फिगरेशनमध्ये बदल करण्यासाठी अॅप ला अनुमती देते."</string>
- <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Wi-Fi मल्टिकास्ट रिसेप्शनला अनुमती द्या"</string>
- <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"मल्टिकास्ट पत्ते वापरून फक्त आपल्या टॅब्लेटवर नाही, तर Wi-Fi नेटवर्कवरील सर्व डिव्हाइसेसवर पाठविलेले पॅकेट प्राप्त करण्यासाठी अॅप ला अनुमती देते. हे गैर-मल्टिकास्ट मोडपेक्षा अधिक उर्जा वापरते."</string>
- <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"मल्टिकास्ट पत्ते वापरून फक्त आपल्या फोनवर नाही, तर Wi-Fi नेटवर्कवरील सर्व डिव्हाइसेसवर पाठविलेले पॅकेट प्राप्त करण्यासाठी अॅप ला अनुमती देते. हे गैर-मल्टिकास्ट मोडपेक्षा अधिक उर्जा वापरते."</string>
- <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth सेटिंग्जवर प्रवेश करा"</string>
- <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"स्थानिक Bluetooth टॅब्लेट कॉन्फिगर करण्याकरिता आणि दूरस्थ डिव्हाइसेस शोधण्यासाठी आणि त्यासह जोडण्यासाठी अॅप ला अनुमती देते."</string>
- <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"स्थानिक Bluetooth फोन कॉन्फिगर करण्याकरिता आणि दूरस्थ डिव्हाइसेस शोधण्यासाठी आणि त्यासह जोडण्यासाठी अॅप ला अनुमती देते."</string>
- <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"अनुप्रयोगाद्वारे Bluetooth जोडणीला अनुमती द्या"</string>
+ <string name="permlab_accessWifiState" msgid="5202012949247040011">"वाय-फाय कनेक्शन पहा"</string>
+ <string name="permdesc_accessWifiState" msgid="5002798077387803726">"वाय-फाय सक्षम केले आहे किंवा नाही आणि कनेक्ट केलेल्या वाय-फाय डिव्हाइसेसचे नाव यासारख्या, वाय-फाय नेटवर्किंग विषयीची माहिती पाहण्यासाठी अॅप ला अनुमती देते."</string>
+ <string name="permlab_changeWifiState" msgid="6550641188749128035">"वाय-फाय वरून कनेक्ट करा आणि डिस्कनेक्ट करा"</string>
+ <string name="permdesc_changeWifiState" msgid="7137950297386127533">"वाय-फाय प्रवेश बिंदूंवर कनेक्ट करण्यासाठी आणि त्यावरून डिस्कनेक्ट करण्यासाठी आणि वाय-फाय नेटवर्कसाठी डिव्हाइस कॉन्फिगरेशनमध्ये बदल करण्यासाठी अॅप ला अनुमती देते."</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"वाय-फाय मल्टिकास्ट रिसेप्शनला अनुमती द्या"</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"मल्टिकास्ट पत्ते वापरून फक्त आपल्या टॅब्लेटवर नाही, तर वाय-फाय नेटवर्कवरील सर्व डिव्हाइसेसवर पाठविलेले पॅकेट प्राप्त करण्यासाठी अॅप ला अनुमती देते. हे गैर-मल्टिकास्ट मोडपेक्षा अधिक उर्जा वापरते."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"मल्टिकास्ट पत्ते वापरून फक्त आपल्या फोनवर नाही, तर वाय-फाय नेटवर्कवरील सर्व डिव्हाइसेसवर पाठविलेले पॅकेट प्राप्त करण्यासाठी अॅप ला अनुमती देते. हे गैर-मल्टिकास्ट मोडपेक्षा अधिक उर्जा वापरते."</string>
+ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"ब सेटिंग्जवर प्रवेश करा"</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"स्थानिक ब टॅब्लेट कॉन्फिगर करण्याकरिता आणि दूरस्थ डिव्हाइसेस शोधण्यासाठी आणि त्यासह जोडण्यासाठी अॅप ला अनुमती देते."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"स्थानिक ब फोन कॉन्फिगर करण्याकरिता आणि दूरस्थ डिव्हाइसेस शोधण्यासाठी आणि त्यासह जोडण्यासाठी अॅप ला अनुमती देते."</string>
+ <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"अनुप्रयोगाद्वारे ब जोडणीला अनुमती द्या"</string>
<string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"अॅपला वापरकर्ता परस्परसंवादाशिवाय दूरस्थ डिव्हाइसेससह जोडण्याची अनुमती देते."</string>
<string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"अॅपला वापरकर्ता परस्परसंवादाशिवाय दूरस्थ डिव्हाइसेससह जोडण्याची अनुमती देते."</string>
- <string name="permlab_bluetoothMap" msgid="6372198338939197349">"Bluetooth नकाशा डेटामध्ये प्रवेश करा"</string>
- <string name="permdesc_bluetoothMap" product="tablet" msgid="5784090105926959958">"अॅपला Bluetooth नकाशा डेटामध्ये प्रवेश करण्याची अनुमती देते."</string>
- <string name="permdesc_bluetoothMap" product="default" msgid="5784090105926959958">"अॅपला Bluetooth नकाशा डेटामध्ये प्रवेश करण्याची अनुमती देते."</string>
+ <string name="permlab_bluetoothMap" msgid="6372198338939197349">"ब नकाशा डेटामध्ये प्रवेश करा"</string>
+ <string name="permdesc_bluetoothMap" product="tablet" msgid="5784090105926959958">"अॅपला ब नकाशा डेटामध्ये प्रवेश करण्याची अनुमती देते."</string>
+ <string name="permdesc_bluetoothMap" product="default" msgid="5784090105926959958">"अॅपला ब नकाशा डेटामध्ये प्रवेश करण्याची अनुमती देते."</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX कनेक्ट करा आणि त्यावरून डिस्कनेक्ट करा"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"WiMAX सक्षम केले आहे किंवा नाही आणि कनेक्ट केलेल्या कोणत्याही WiMAX नेटवर्क विषयीची माहिती निर्धारित करण्यासाठी अॅप ला अनुमती देते."</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX स्थिती बदला"</string>
@@ -677,9 +677,9 @@
<string name="permlab_scoreNetworks" msgid="6445777779383587181">"स्कोअर नेटवर्क"</string>
<string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"नेटवर्क रँक करण्यासाठी आणि टॅब्लेट प्राधान्य देत असलेल्या नेटवर्कच्या प्रभावासाठी अॅप ला अनुमती देते."</string>
<string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"नेटवर्क रँक करण्यासाठी आणि फोन प्राधान्य देत असलेल्या नेटवर्कच्या प्रभावासाठी अॅप ला अनुमती देते."</string>
- <string name="permlab_bluetooth" msgid="6127769336339276828">"Bluetooth डिव्हाइसेससह जोडा"</string>
- <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"टॅब्लेटवर Bluetooth चे कॉन्फिगरेशन पाहण्यासाठी आणि जोडलेल्या डिव्हाइसेससह कनेक्शन करण्यासाठी आणि स्वीकारण्यासाठी, अॅप ला अनुमती देते."</string>
- <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"फोनवर Bluetooth चे कॉन्फिगरेशन पाहण्यासाठी आणि जोडलेल्या डिव्हाइसेससह कनेक्शन करण्यासाठी आणि स्वीकारण्यासाठी, अॅप ला अनुमती देते."</string>
+ <string name="permlab_bluetooth" msgid="6127769336339276828">"ब डिव्हाइसेससह जोडा"</string>
+ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"टॅब्लेटवर ब चे कॉन्फिगरेशन पाहण्यासाठी आणि जोडलेल्या डिव्हाइसेससह कनेक्शन करण्यासाठी आणि स्वीकारण्यासाठी, अॅप ला अनुमती देते."</string>
+ <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"फोनवर ब चे कॉन्फिगरेशन पाहण्यासाठी आणि जोडलेल्या डिव्हाइसेससह कनेक्शन करण्यासाठी आणि स्वीकारण्यासाठी, अॅप ला अनुमती देते."</string>
<string name="permlab_nfc" msgid="4423351274757876953">"फील्ड जवळील संप्रेषण नियंत्रित करा"</string>
<string name="permdesc_nfc" msgid="7120611819401789907">"फील्ड जवळील संप्रेषण (NFC) टॅग, कार्ड आणि वाचक यांच्यासह संप्रेषण करण्यासाठी अॅप ला अनुमती देते."</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"आपले स्क्रीन लॉक अक्षम करा"</string>
@@ -884,14 +884,14 @@
<string name="sipAddressTypeWork" msgid="6920725730797099047">"कार्य"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"अन्य"</string>
<string name="quick_contacts_not_available" msgid="746098007828579688">"हा संपर्क पाहण्यासाठी कोणताही क्रियाकलाप आढळला नाही."</string>
- <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN कोड टाइप करा"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK आणि नवीन PIN कोड टाइप करा"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"पिन कोड टाइप करा"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK आणि नवीन पिन कोड टाइप करा"</string>
<string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK कोड"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"नवीन PIN कोड"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"नवीन पिन कोड"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"संकेतशब्द टाइप करण्यासाठी स्पर्श करा"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"अनलॉक करण्यासाठी संकेतशब्द टाइप करा"</string>
- <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"अनलॉक करण्यासाठी PIN टाइप करा"</string>
- <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"अयोग्य PIN कोड."</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"अनलॉक करण्यासाठी पिन टाइप करा"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"अयोग्य पिन कोड."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"अनलॉक करण्यासाठी, मेनू दाबा नंतर 0."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"आणीबाणीचा नंबर"</string>
<string name="lockscreen_carrier_default" msgid="8963839242565653192">"सेवा नाही."</string>
@@ -927,7 +927,7 @@
<string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"सिम कार्ड अनलॉक करत आहे…"</string>
<string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"आपण आपला अनलॉक नमुना <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="2725973286239344555">"आपण आपला संकेतशब्द <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="6216672706545696955">"आपण आपला PIN <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="6216672706545696955">"आपण आपला पिन <xliff:g id="NUMBER_0">%d</xliff:g> वेळा अयोग्यरितीने टाइप केला आहे. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string>
<string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"आपण आपला अनलॉक नमुना <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"आपण आपला अनलॉक नमुना <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"आपण <xliff:g id="NUMBER_0">%d</xliff:g> वेळा टॅब्लेट अनलॉक करण्याचे चुकीचे प्रयत्न केले. आणखी <xliff:g id="NUMBER_1">%d</xliff:g> अयशस्वी प्रयत्नांनंतर, टॅब्लेट फॅक्टरी डीफॉल्टवर रीसेट केला जाईल आणि सर्व वापरकर्ता डेटा गमावला जाईल."</string>
@@ -1243,14 +1243,14 @@
<string name="sendText" msgid="5209874571959469142">"मजकुरासाठी क्रिया निवडा"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"रिंगर व्हॉल्यूम"</string>
<string name="volume_music" msgid="5421651157138628171">"मीडिया व्हॉल्यूम"</string>
- <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Bluetooth द्वारे प्ले करत आहे"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"ब द्वारे प्ले करत आहे"</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"मूक रिंगटोन सेट केला"</string>
<string name="volume_call" msgid="3941680041282788711">"कॉल-मधील व्हॉल्यूम"</string>
- <string name="volume_bluetooth_call" msgid="2002891926351151534">"Bluetooth कॉल-मधील व्हॉल्यूम"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"ब कॉल-मधील व्हॉल्यूम"</string>
<string name="volume_alarm" msgid="1985191616042689100">"अलार्म व्हॉल्यूम"</string>
<string name="volume_notification" msgid="2422265656744276715">"सूचना व्हॉल्यूम"</string>
<string name="volume_unknown" msgid="1400219669770445902">"व्हॉल्यूम"</string>
- <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Bluetooth व्हॉल्यूम"</string>
+ <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"ब व्हॉल्यूम"</string>
<string name="volume_icon_description_ringer" msgid="3326003847006162496">"रिंगटोन व्हॉल्यूम"</string>
<string name="volume_icon_description_incall" msgid="8890073218154543397">"कॉल व्हॉल्यूम"</string>
<string name="volume_icon_description_media" msgid="4217311719665194215">"मीडिया व्हॉल्यूम"</string>
@@ -1261,23 +1261,23 @@
<string name="ringtone_picker_title" msgid="3515143939175119094">"रिंगटोन"</string>
<string name="ringtone_unknown" msgid="5477919988701784788">"अज्ञात रिंगटोन"</string>
<plurals name="wifi_available">
- <item quantity="one" msgid="6654123987418168693">"Wi-Fi नेटवर्क उपलब्ध"</item>
- <item quantity="other" msgid="4192424489168397386">"Wi-Fi नेटवर्क उपलब्ध"</item>
+ <item quantity="one" msgid="6654123987418168693">"वाय-फाय नेटवर्क उपलब्ध"</item>
+ <item quantity="other" msgid="4192424489168397386">"वाय-फाय नेटवर्क उपलब्ध"</item>
</plurals>
<plurals name="wifi_available_detailed">
- <item quantity="one" msgid="1634101450343277345">"खुले Wi-Fi नेटवर्क उपलब्ध"</item>
- <item quantity="other" msgid="7915895323644292768">"खुले Wi-Fi नेटवर्क उपलब्ध"</item>
+ <item quantity="one" msgid="1634101450343277345">"खुले वाय-फाय नेटवर्क उपलब्ध"</item>
+ <item quantity="other" msgid="7915895323644292768">"खुले वाय-फाय नेटवर्क उपलब्ध"</item>
</plurals>
- <string name="wifi_available_sign_in" msgid="4029489716605255386">"Wi-Fi नेटवर्कवर साइन इन करा"</string>
+ <string name="wifi_available_sign_in" msgid="4029489716605255386">"वाय-फाय नेटवर्कवर साइन इन करा"</string>
<string name="network_available_sign_in" msgid="8495155593358054676">"नेटवर्क वर साइन इन करा"</string>
<!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
<skip />
- <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi ला कनेक्ट करू शकलो नाही"</string>
+ <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"वाय-फाय ला कनेक्ट करू शकलो नाही"</string>
<string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" खराब इंटरनेट कनेक्शन आहे."</string>
- <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"Wi-Fi थेट"</string>
- <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"Wi-Fi थेट प्रारंभ करा. हे Wi-Fi क्लायंट/हॉटस्पॉट बंद करेल."</string>
- <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"Wi-Fi थेट प्रारंभ करू शकलो नाही."</string>
- <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"Wi-Fi थेट चालू आहे"</string>
+ <string name="wifi_p2p_dialog_title" msgid="97611782659324517">"वाय-फाय थेट"</string>
+ <string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"वाय-फाय थेट प्रारंभ करा. हे वाय-फाय क्लायंट/हॉटस्पॉट बंद करेल."</string>
+ <string name="wifi_p2p_failed_message" msgid="3763669677935623084">"वाय-फाय थेट प्रारंभ करू शकलो नाही."</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"वाय-फाय थेट चालू आहे"</string>
<string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"सेटिंग्जसाठी स्पर्श करा"</string>
<string name="accept" msgid="1645267259272829559">"स्वीकार करा"</string>
<string name="decline" msgid="2112225451706137894">"नकार द्या"</string>
@@ -1285,10 +1285,10 @@
<string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"कनेक्ट करण्यासाठी आमंत्रण"</string>
<string name="wifi_p2p_from_message" msgid="570389174731951769">"प्रेषक:"</string>
<string name="wifi_p2p_to_message" msgid="248968974522044099">"प्रति:"</string>
- <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"आवश्यक PIN टाइप करा:"</string>
- <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
- <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"टॅब्लेट <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ला कनेक्ट केलेले असताना तात्पुरते Wi-Fi वरून डिस्कनेक्ट होईल"</string>
- <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> वर फोन कनेक्ट केलेला असताना तो Wi-Fi वरून तात्पुरता डिस्कनेक्ट केला जाईल"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"आवश्यक पिन टाइप करा:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"पिन:"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"टॅब्लेट <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ला कनेक्ट केलेले असताना तात्पुरते वाय-फाय वरून डिस्कनेक्ट होईल"</string>
+ <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> वर फोन कनेक्ट केलेला असताना तो वाय-फाय वरून तात्पुरता डिस्कनेक्ट केला जाईल"</string>
<string name="select_character" msgid="3365550120617701745">"वर्ण घाला"</string>
<string name="sms_control_title" msgid="7296612781128917719">"SMS संदेश पाठवत आहे"</string>
<string name="sms_control_message" msgid="3867899169651496433">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> मोठ्या संख्येने SMS संदेश पाठवत आहे. आपण या अॅप ला संदेश पाठविणे सुरु ठेवण्याची अनुमती देऊ इच्छिता?"</string>
@@ -1535,12 +1535,12 @@
<string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G डेटा मर्यादा गाठली"</string>
<string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G डेटा मर्यादा गाठली"</string>
<string name="data_usage_mobile_limit_title" msgid="557158376602636112">"सेल्युलर डेटा मर्यादा गाठली"</string>
- <string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"Wi-Fi डेटा मर्यादा गाठली"</string>
+ <string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"वाय-फाय डेटा मर्यादा गाठली"</string>
<string name="data_usage_limit_body" msgid="291731708279614081">"उर्वरित चक्रासाठी डेटास विराम दिला"</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"2G-3G डेटा मर्यादा ओलांडली"</string>
<string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"4G डेटा मर्यादा ओलांडली"</string>
<string name="data_usage_mobile_limit_snoozed_title" msgid="4941346653729943789">"सेल्युलर डेटा मर्यादा ओलांडली"</string>
- <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"Wi-Fi डेटा मर्यादा ओलांडली"</string>
+ <string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"वाय-फाय डेटा मर्यादा ओलांडली"</string>
<string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"निर्दिष्ट केलेल्या मर्यादेबाहेर <xliff:g id="SIZE">%s</xliff:g>."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"पार्श्वभूमी डेटा प्रतिबंधित केला"</string>
<string name="data_usage_restricted_body" msgid="6741521330997452990">"प्रतिबंध काढण्यासाठी स्पर्श करा."</string>
@@ -1574,7 +1574,7 @@
<string name="default_audio_route_name_dock_speakers" msgid="6240602982276591864">"स्पीकर डॉक करा"</string>
<string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string>
<string name="default_audio_route_category_name" msgid="3722811174003886946">"सिस्टम"</string>
- <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Bluetooth ऑडिओ"</string>
+ <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"ब ऑडिओ"</string>
<string name="wireless_display_route_description" msgid="9070346425023979651">"वायरलेस प्रदर्शन"</string>
<string name="media_route_button_content_description" msgid="591703006349356016">"कास्ट करा"</string>
<string name="media_route_chooser_title" msgid="1751618554539087622">"डिव्हाइसला कनेक्ट करा"</string>
@@ -1596,21 +1596,21 @@
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"नमुना विसरलात"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"चुकीचा नमुना"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"चुकीचा संकेतशब्द"</string>
- <string name="kg_wrong_pin" msgid="1131306510833563801">"चुकीचा PIN"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"चुकीचा पिन"</string>
<string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string>
<string name="kg_pattern_instructions" msgid="398978611683075868">"आपला नमुना काढा"</string>
- <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"सिम PIN प्रविष्ट करा"</string>
- <string name="kg_pin_instructions" msgid="2377242233495111557">"PIN प्रविष्ट करा"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"सिम पिन प्रविष्ट करा"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"पिन प्रविष्ट करा"</string>
<string name="kg_password_instructions" msgid="5753646556186936819">"संकेतशब्द प्रविष्ट करा"</string>
<string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"सिम आता अक्षम केले आहे. सुरु ठेवण्यासाठी PUK कोड प्रविष्ट करा. तपशीलांसाठी वाहकाशी संपर्क साधा."</string>
- <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"इच्छित PIN कोड प्रविष्ट करा"</string>
- <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"इच्छित PIN कोड ची पुष्टी करा"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"इच्छित पिन कोड प्रविष्ट करा"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"इच्छित पिन कोड ची पुष्टी करा"</string>
<string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"सिम कार्ड अनलॉक करत आहे…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"अयोग्य PIN कोड."</string>
- <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4 ते 8 अंक असलेला PIN टाइप करा."</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"अयोग्य पिन कोड."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4 ते 8 अंक असलेला पिन टाइप करा."</string>
<string name="kg_invalid_sim_puk_hint" msgid="6025069204539532000">"PUK कोड 8 संख्येचा असावा."</string>
<string name="kg_invalid_puk" msgid="3638289409676051243">"योग्य PUK कोड पुन्हा-प्रविष्ट करा. परत प्रयत्न करणे सिम कायमचे अक्षम करेल."</string>
- <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN कोड जुळत नाहीत"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"पिन कोड जुळत नाहीत"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"बरेच नमुना प्रयत्न"</string>
<string name="kg_login_instructions" msgid="1100551261265506448">"अनलॉक करण्यासाठी, आपल्या Google खात्यासह साइन इन करा."</string>
<string name="kg_login_username_hint" msgid="5718534272070920364">"वापरकर्तानाव (ईमेल)"</string>
@@ -1619,7 +1619,7 @@
<string name="kg_login_invalid_input" msgid="5754664119319872197">"अवैध वापरकर्तानाव किंवा संकेतशब्द."</string>
<string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"आपले वापरकर्तानाव किंवा संकेतशब्द विसरलात?\n "<b>"google.com/accounts/recovery"</b>" ला भेट द्या."</string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"खाते तपासत आहे…"</string>
- <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"आपण आपला PIN <xliff:g id="NUMBER_0">%d</xliff:g> वेळा अयोग्यरितीने टाइप केला आहे. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"आपण आपला पिन <xliff:g id="NUMBER_0">%d</xliff:g> वेळा अयोग्यरितीने टाइप केला आहे. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"आपण आपला संकेतशब्द <xliff:g id="NUMBER_0">%d</xliff:g> वेळा अयोग्यरितीने टाइप केला आहे. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"आपण आपला अनलॉक नमुना <xliff:g id="NUMBER_0">%d</xliff:g> वेळा अयोग्यरितीने काढला आहे. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"आपण <xliff:g id="NUMBER_0">%d</xliff:g> वेळा टॅब्लेट अनलॉक करण्याचा अयोग्यपणे प्रयत्न केला. <xliff:g id="NUMBER_1">%d</xliff:g> आणखी अयशस्वी प्रयत्नांनंतर, टॅब्लेट फॅक्टरी डीफॉल्टवर रीसेट केला जाईल आणि वापरकर्ता डेटा गमावेल."</string>
@@ -1767,7 +1767,7 @@
<string name="lock_to_app_positive" msgid="7085139175671313864">"प्रारंभ"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"स्क्रीन पिन केली"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"स्क्रीन अनपिन केली"</string>
- <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"अनपिन करण्यापूर्वी PIN साठी विचारा"</string>
+ <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"अनपिन करण्यापूर्वी पिन साठी विचारा"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"अनपिन करण्यापूर्वी अनलॉक नमुन्यासाठी विचारा"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"अनपिन करण्यापूर्वी संकेतशब्दासाठी विचारा"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"बॅटरीचे आयुष्य सुधारण्यात मदत होण्यासाठी, बॅटरी बचतकर्ता आपल्या डिव्हाइसचे कार्यप्रदर्शन कमी करतो आणि कंपन आणि बराच पार्श्वभूमी डेटा मर्यादित करतो. संकालनावर अवलंबून असणारे ईमेल, संदेशन आणि अन्य अॅप्स आपण ते उघडल्याशिवाय अद्यतनित होऊ शकत नाहीत.\n\nआपले डिव्हाइस चार्ज होत असते तेव्हा बॅटरी बचतकर्ता स्वयंचलितपणे बंद होतो."</string>
diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml
index 7616729..bebee52 100644
--- a/core/res/res/values-ms-rMY/strings.xml
+++ b/core/res/res/values-ms-rMY/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"ubah suai kad kenalan sendiri"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Membenarkan apl menukar atau menambah maklumat profil peribadi yang disimpan pada peranti anda, seperti nama dan maklumat kenalan anda. Ini bermakna apl boleh mengenal pasti anda dan menghantar maklumat profil anda kepada orang lain."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"penderia (spt. denyut jantung)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Membenarkan apl mengakses data dari penderia yang anda gunakan untuk mengukur perkara yang berlaku dalam tubuh anda, seperti kadar denyutan jantung."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Membenarkan apl mengakses data dari penderia yang memantau keadaan fizikal anda, seperti kadar denyutan jantung anda."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"baca aliran sosial anda"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Membenarkan apl mengakses dan menyegerakkan kemas kini sosial daripada anda dan rakan anda. Berhati-hati semasa berkongsi maklumat - ini membenarkan apl untuk membaca komunikasi di antara anda dan rakan anda pada rangkaian sosial tanpa mengira kerahsiaan. Nota: kebenaran ini tidak boleh dikuatkuasakan pada semua rangkaian sosial."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"tulis ke aliran sosial anda"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> dipilih"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> dipadamkan"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Kerja <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Untuk menyahsemat skrin ini, sentuh dan tahan Kembali serta Ikhtisar pada masa yang sama."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Untuk menyahsemat skrin ini, sentuh dan tahan Ikhtisar."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Skrin disemat. Menyahsemat tidak dibenarkan oleh organisasi anda."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Gunakan penyematan skrin?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Penyematan skrin mengunci paparan dalam pandangan tunggal.\n\nUntuk menyahsemat, sentuh dan tahan Kembali serta Ikhtisar pada masa yang sama."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Penyematan skrin mengunci paparan dalam pandangan tunggal.\n\nUntuk menyahsemat, sentuh dan tahan Ikhtisar."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"TIDAK, TERIMA KASIH"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"MULA"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Skrin disemat"</string>
diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml
index 3cce66e..2a8bd76 100644
--- a/core/res/res/values-my-rMM/strings.xml
+++ b/core/res/res/values-my-rMM/strings.xml
@@ -34,10 +34,10 @@
<string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> နာရီ <xliff:g id="MINUTES">%2$d</xliff:g> မိနစ်"</string>
<string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> နာရီ <xliff:g id="MINUTES">%2$d</xliff:g> မိနစ်"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> မိနစ်"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> မိနစ် <xliff:g id="SECONDS">%2$d</xliff:g> စက္ကန့်"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> မိနစ် <xliff:g id="SECONDS">%2$d</xliff:g> စက္ကန့်"</string>
- <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> စက္ကန့်"</string>
- <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> စက္ကန့်"</string>
+ <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> မိနစ် <xliff:g id="SECONDS">%2$d</xliff:g> စက္ကန့်"</string>
+ <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> မိနစ် <xliff:g id="SECONDS">%2$d</xliff:g> စက္ကန့်"</string>
+ <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> စက္ကန့်"</string>
+ <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> စက္ကန့်"</string>
<string name="untitled" msgid="4638956954852782576">"<ခေါင်းစဉ်မဲ့>"</string>
<string name="ellipsis" msgid="7899829516048813237">"…"</string>
<string name="ellipsis_two_dots" msgid="1228078994866030736">"‥"</string>
@@ -46,7 +46,7 @@
<string name="defaultVoiceMailAlphaTag" msgid="2660020990097733077">"အသံစာပို့စနစ်"</string>
<string name="defaultMsisdnAlphaTag" msgid="2850889754919584674">"MSISDN1"</string>
<string name="mmiError" msgid="5154499457739052907">"ဆက်သွယ်မှုဆိုင်ရာပြသနာ သို့မဟုတ် မမှန်ကန်သောMMIကုတ်"</string>
- <string name="mmiFdnError" msgid="5224398216385316471">"သတ်မှတ်ခေါ်ဆိုနိုင်သောနံပါတ်များထံသာ ကန့်သတ်ထားသည်"</string>
+ <string name="mmiFdnError" msgid="5224398216385316471">"သတ်မှတ်ခေါ်ဆိုနိုင်သောနံပါတ်များထံသာ ကန့်သတ်ထားသည်"</string>
<string name="serviceEnabled" msgid="8147278346414714315">"ဝန်ဆောင်မှု လုပ်ဆောင်နိုင်မည်"</string>
<string name="serviceEnabledFor" msgid="6856228140453471041">"ဝန်ဆောင်မှု ရရှိမည်"</string>
<string name="serviceDisabled" msgid="1937553226592516411">"ဝန်ဆောင်မှုအား ရပ်ဆိုင်းသည်"</string>
@@ -56,10 +56,10 @@
<string name="mmiComplete" msgid="8232527495411698359">"MMI ပြီးဆုံးပါပြီ"</string>
<string name="badPin" msgid="9015277645546710014">"သင် ရိုက်ထည့်သော PIN ဟောင်းမှာ မမှန်ပါ။"</string>
<string name="badPuk" msgid="5487257647081132201">"သင်ရိုက် ထည့်သော PUK မှာ မမှန်ကန်ပါ။"</string>
- <string name="mismatchPin" msgid="609379054496863419">"သင် ရိုက်ထည့်ခဲ့သည့် PIN များ မတိုက်ဆိုင်ပါ။"</string>
- <string name="invalidPin" msgid="3850018445187475377">"နံပါတ်(၄)ခုမှ(၈)ခုအထိပါရှိသော ပင်နံပါတ်အားထည့်ပါ"</string>
- <string name="invalidPuk" msgid="8761456210898036513">"နံပါတ်(၈)ခုသို့မဟုတ် ထိုထက်ရှည်သောသော PUKအားထည့်သွင်းပါ"</string>
- <string name="needPuk" msgid="919668385956251611">"ဆင်းမ်ကဒ် ရဲ့ ပင်နံပါတ် ပြန်ဖွင့်သည့် ကုဒ် သော့ကျနေပါသည်။ ဖွင့်ရန် ကုဒ်အားထည့်သွင်းပါ။"</string>
+ <string name="mismatchPin" msgid="609379054496863419">"သင် ရိုက်ထည့်ခဲ့သည့် PIN များ မတိုက်ဆိုင်ပါ။"</string>
+ <string name="invalidPin" msgid="3850018445187475377">"နံပါတ်(၄)ခုမှ(၈)ခုအထိပါရှိသော ပင်နံပါတ်အားထည့်ပါ"</string>
+ <string name="invalidPuk" msgid="8761456210898036513">"နံပါတ်(၈)ခုသို့မဟုတ် ထိုထက်ရှည်သောသော PUKအားထည့်သွင်းပါ"</string>
+ <string name="needPuk" msgid="919668385956251611">"ဆင်းမ်ကဒ် ရဲ့ ပင်နံပါတ် ပြန်ဖွင့်သည့် ကုဒ် သော့ကျနေပါသည်။ ဖွင့်ရန် ကုဒ်အားထည့်သွင်းပါ။"</string>
<string name="needPuk2" msgid="4526033371987193070">"ဆင်းမ်ကဒ်အားမပိတ်ရန် PUK2အားထည့်သွင်းပါ"</string>
<string name="enablePin" msgid="209412020907207950">"မအောင်မြင်ပါ, SIM/RUIM သော့ကို အရင် သုံးခွင့်ပြုရန်"</string>
<plurals name="pinpuk_attempts">
@@ -72,24 +72,24 @@
<string name="ClirMmi" msgid="7784673673446833091">"အထွက်ခေါ်ဆိုခြင်းအိုင်ဒီ"</string>
<string name="ColpMmi" msgid="3065121483740183974">"လိုင်း ID ချိတ်ဆက်သည်"</string>
<string name="ColrMmi" msgid="4996540314421889589">"လိုင်း ID ချိတ်ဆက်မှု ကန့်သတ်ချက်များ"</string>
- <string name="CfMmi" msgid="5123218989141573515">"အဝင်ခေါ်ဆိုမှုအား ထပ်ဆင့်ပို့ခြင်း"</string>
- <string name="CwMmi" msgid="9129678056795016867">"ခေါ်ဆိုမှု စောင့်ဆိုင်းခြင်း"</string>
+ <string name="CfMmi" msgid="5123218989141573515">"အဝင်ခေါ်ဆိုမှုအား ထပ်ဆင့်ပို့ခြင်း"</string>
+ <string name="CwMmi" msgid="9129678056795016867">"ခေါ်ဆိုမှု စောင့်ဆိုင်းခြင်း"</string>
<string name="BaMmi" msgid="455193067926770581">"အဝင်ခေါ်ဆိုမှုအားတားဆီးခြင်း"</string>
<string name="PwdMmi" msgid="7043715687905254199">"လျှို့ဝှက်နံပါတ်/စာ ပြောင်းသည်"</string>
<string name="PinMmi" msgid="3113117780361190304">"ပင်နံပါတ်ပြောင်းသည်"</string>
<string name="CnipMmi" msgid="3110534680557857162">"ခေါ်ဆိုသောနံပါတ်တည်ရှိသည်"</string>
- <string name="CnirMmi" msgid="3062102121430548731">"ခေါ်ဆိုသောနံပါတ်အားကန့်သတ်ခြင်း"</string>
+ <string name="CnirMmi" msgid="3062102121430548731">"ခေါ်ဆိုသောနံပါတ်အားကန့်သတ်ခြင်း"</string>
<string name="ThreeWCMmi" msgid="9051047170321190368">"(၃)ယောက်ဆိုင်ပြောဆိုခြင်း"</string>
- <string name="RuacMmi" msgid="7827887459138308886">"စိတ်အနှောက်အယှက်ဖြစ်သော မလိုလားသည့်ခေါ်ဆိုမှုများအား ငြင်းဖယ်ခြင်း"</string>
+ <string name="RuacMmi" msgid="7827887459138308886">"စိတ်အနှောက်အယှက်ဖြစ်သော မလိုလားသည့်ခေါ်ဆိုမှုများအား ငြင်းဖယ်ခြင်း"</string>
<string name="CndMmi" msgid="3116446237081575808">"ခေါ်ဆိုသောနံပါတ် ပေးပို့မှု"</string>
- <string name="DndMmi" msgid="1265478932418334331">"မနှောက်ယှက်ပါနှင့်"</string>
- <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"ပုံသေအားဖြင့် ခေါ်ဆိုသူအိုင်ဒီ(Caller ID)အား ကန့်သတ်ထားသည်။ နောက်ထပ်အဝင်ခေါ်ဆိုမှု-ကန့်သတ်ထားသည်။"</string>
- <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"ပုံသေအားဖြင့် ခေါ်ဆိုသူအိုင်ဒီ(Caller ID)အား ကန့်သတ်ထားသည်။ နောက်ထပ်အဝင်ခေါ်ဆိုမှု-ကန့်သတ်မထားပါ။"</string>
- <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"ပုံသေအားဖြင့် ခေါ်ဆိုသူအိုင်ဒီ(Caller ID)အား ကန့်သတ်မထားပါ။ နောက်ထပ်အဝင်ခေါ်ဆိုမှု-ကန့်သတ်ထားသည်။"</string>
- <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ပုံသေအားဖြင့် ခေါ်ဆိုသူအိုင်ဒီ(Caller ID)အား ကန့်သတ်မထားပါ။ နောက်ထပ်အဝင်ခေါ်ဆိုမှု-ကန့်သတ်မထားပါ။"</string>
- <string name="serviceNotProvisioned" msgid="8614830180508686666">"ဝန်ဆောင်မှုအား ကန့်သတ်မထားပါ"</string>
+ <string name="DndMmi" msgid="1265478932418334331">"မနှောက်ယှက်ပါနှင့်"</string>
+ <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"ပုံသေအားဖြင့် ခေါ်ဆိုသူအိုင်ဒီ(Caller ID)အား ကန့်သတ်ထားသည်။ နောက်ထပ်အဝင်ခေါ်ဆိုမှု-ကန့်သတ်ထားသည်။"</string>
+ <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"ပုံသေအားဖြင့် ခေါ်ဆိုသူအိုင်ဒီ(Caller ID)အား ကန့်သတ်ထားသည်။ နောက်ထပ်အဝင်ခေါ်ဆိုမှု-ကန့်သတ်မထားပါ။"</string>
+ <string name="CLIRDefaultOffNextCallOn" msgid="6179425182856418465">"ပုံသေအားဖြင့် ခေါ်ဆိုသူအိုင်ဒီ(Caller ID)အား ကန့်သတ်မထားပါ။ နောက်ထပ်အဝင်ခေါ်ဆိုမှု-ကန့်သတ်ထားသည်။"</string>
+ <string name="CLIRDefaultOffNextCallOff" msgid="2567998633124408552">"ပုံသေအားဖြင့် ခေါ်ဆိုသူအိုင်ဒီ(Caller ID)အား ကန့်သတ်မထားပါ။ နောက်ထပ်အဝင်ခေါ်ဆိုမှု-ကန့်သတ်မထားပါ။"</string>
+ <string name="serviceNotProvisioned" msgid="8614830180508686666">"ဝန်ဆောင်မှုအား ကန့်သတ်မထားပါ"</string>
<string name="CLIRPermanent" msgid="3377371145926835671">"သင်သည် ခေါ်ဆိုသူ ID ဆက်တင်ကို မပြောင်းလဲနိုင်ပါ။"</string>
- <string name="RestrictedChangedTitle" msgid="5592189398956187498">"ဝင်ရောက်ကြည့်ရှုခြင်းကန့်သတ်ချက်အားပြောင်းထားသည်"</string>
+ <string name="RestrictedChangedTitle" msgid="5592189398956187498">"ဝင်ရောက်ကြည့်ရှုခြင်းကန့်သတ်ချက်အားပြောင်းထားသည်"</string>
<string name="RestrictedOnData" msgid="8653794784690065540">"ဒေတာဝန်ဆောင်မှုပိတ်ထားသည်။"</string>
<string name="RestrictedOnEmergency" msgid="6581163779072833665">"အရေးပေါ်ဝန်ဆောင်မှုပိတ်ထားသည်။"</string>
<string name="RestrictedOnNormal" msgid="4953867011389750673">"အသံဝန်ဆောင်မှုပိတ်ထားသည်။"</string>
@@ -106,25 +106,25 @@
<string name="serviceClassDataSync" msgid="7530000519646054776">"ထပ်တူ ကိုက်ညီခြင်း"</string>
<string name="serviceClassPacket" msgid="6991006557993423453">"Packet"</string>
<string name="serviceClassPAD" msgid="3235259085648271037">"PAD"</string>
- <string name="roamingText0" msgid="7170335472198694945">"ရုန်းမင်းအချက်ပြမီး ဖွင့်ထားခြင်း"</string>
+ <string name="roamingText0" msgid="7170335472198694945">"ရုန်းမင်းအချက်ပြမီး ဖွင့်ထားခြင်း"</string>
<string name="roamingText1" msgid="5314861519752538922">"ရုန်းမင်းအချက်ပြမီး ပိတ်ထားခြင်း"</string>
<string name="roamingText2" msgid="8969929049081268115">"ရုန်းမင်းအချက်ပြမီး လက်နေခြင်း"</string>
<string name="roamingText3" msgid="5148255027043943317">"ပတ်ဝန်းကျင်အနီးအနားပြင်ပ"</string>
<string name="roamingText4" msgid="8808456682550796530">"အဆောက်အဦးပြင်ပ"</string>
- <string name="roamingText5" msgid="7604063252850354350">"ရုန်းမင်း-ပိုမိုသင့်တော်သောစနစ်"</string>
+ <string name="roamingText5" msgid="7604063252850354350">"ရုန်းမင်း-ပိုမိုသင့်တော်သောစနစ်"</string>
<string name="roamingText6" msgid="2059440825782871513">"ရုန်းမင်း-ရရှိနိုင်သောစနစ်"</string>
<string name="roamingText7" msgid="7112078724097233605">"ရုန်းမင်း-ပူးပေါင်းလုပ်ဖော်ကိုင်ဖက်"</string>
<string name="roamingText8" msgid="5989569778604089291">"ရုန်းမင်း-အထူးတန်ဖိုးထားရသောလုပ်ဖော်ကိုင်ဖက်"</string>
- <string name="roamingText9" msgid="7969296811355152491">"ရုန်းမင်း-ဝန်ဆောင်မှုအပြည့်လုပ်ဆောင်မှု"</string>
+ <string name="roamingText9" msgid="7969296811355152491">"ရုန်းမင်း-ဝန်ဆောင်မှုအပြည့်လုပ်ဆောင်မှု"</string>
<string name="roamingText10" msgid="3992906999815316417">"ရုန်းမင်း-ဝန်ဆောင်မှုတစိတ်တပိုင်းလုပ်ဆောင်မှု"</string>
- <string name="roamingText11" msgid="4154476854426920970">"ရုန်းမင်းစာတမ်းဖွင့်ရန်"</string>
+ <string name="roamingText11" msgid="4154476854426920970">"ရုန်းမင်းစာတမ်းဖွင့်ရန်"</string>
<string name="roamingText12" msgid="1189071119992726320">"ရုန်းမင်းစာတမ်းပိတ်ထားရန်"</string>
<string name="roamingTextSearching" msgid="8360141885972279963">"ဆားဗစ်အားရှာဖွေနေသည်"</string>
- <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ထပ်ဆင့်မပို့နိုင်ပါ"</string>
+ <string name="cfTemplateNotForwarded" msgid="1683685883841272560">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ထပ်ဆင့်မပို့နိုင်ပါ"</string>
<string name="cfTemplateForwarded" msgid="1302922117498590521">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g>"</string>
- <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> နောက် <xliff:g id="TIME_DELAY">{2}</xliff:g> စက္ကန့်"</string>
- <string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ထပ်ဆင့်မပို့နိုင်ပါ"</string>
- <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ထပ်ဆင့်မပို့နိုင်ပါ"</string>
+ <string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> နောက် <xliff:g id="TIME_DELAY">{2}</xliff:g> စက္ကန့်"</string>
+ <string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ထပ်ဆင့်မပို့နိုင်ပါ"</string>
+ <string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ထပ်ဆင့်မပို့နိုင်ပါ"</string>
<string name="fcComplete" msgid="3118848230966886575">"ပုံစံကုတ်ပြီးဆုံးသည်"</string>
<string name="fcError" msgid="3327560126588500777">"ဆက်သွယ်မှုဆိုင်ရာပြသနာ သို့မဟုတ် တရားမဝင်သောပုံစံကုတ်"</string>
<string name="httpErrorOk" msgid="1191919378083472204">"ကောင်းပြီ"</string>
@@ -132,11 +132,11 @@
<string name="httpErrorLookup" msgid="4711687456111963163">"URL ကို ရှာဖွေ့ မတွေ့ရှိပါ"</string>
<string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"ဆိုက် မှန်ကန်မှု စိစစ်ရေး စနစ်ကို ပံ့ပိုး မပေးပါ။"</string>
<string name="httpErrorAuth" msgid="1435065629438044534">"စစ်ဆေးမှု မအောင်မြင်ပါ"</string>
- <string name="httpErrorProxyAuth" msgid="1788207010559081331">"ပရိုစီဆာဗာမှတဆင့် အထောက်အထားပြခြင်းမအောင်မြင်ပါ"</string>
+ <string name="httpErrorProxyAuth" msgid="1788207010559081331">"ပရိုစီဆာဗာမှတဆင့် အထောက်အထားပြခြင်းမအောင်မြင်ပါ"</string>
<string name="httpErrorConnect" msgid="8714273236364640549">"ဆာဗာကို ဆက်သွယ်လို့ မရပါ"</string>
<string name="httpErrorIO" msgid="2340558197489302188">"ဆာဗာနဲ့ ဆက်သွယ်လို့ မရပါ။ နောက်မှ ပြန်လည်ကြိုးစားပါ"</string>
<string name="httpErrorTimeout" msgid="4743403703762883954">"ဆာဗာအားဆက်သွယ်မှု အချိန်ကုန်ဆုံးသွားပါသည်"</string>
- <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"ဤစာမျက်နှာတွင် ဆာဗာအားတဆင့်လွှဲမှု များစွာပါဝင်သည်"</string>
+ <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"ဤစာမျက်နှာတွင် ဆာဗာအားတဆင့်လွှဲမှု များစွာပါဝင်သည်"</string>
<string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"ပရိုတိုကောကို ပံ့ပိုး မပေးပါ။"</string>
<string name="httpErrorFailedSslHandshake" msgid="96549606000658641">"လုံခြုံစိတ်ချရသော ဆက်သွယ်မှု မရပါ"</string>
<string name="httpErrorBadUrl" msgid="3636929722728881972">"URL က အမှန်အကန် မဟုတ်သောကြောင့် စာမျက်နှာကို ဖွင့် လို့ မရပါ"</string>
@@ -148,7 +148,7 @@
<string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"ထပ်တူ ကိုက်ညီခြင်း"</string>
<string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"ဖျက်ရန် <xliff:g id="CONTENT_TYPE">%s</xliff:g> များစွာရှိ"</string>
<string name="low_memory" product="tablet" msgid="6494019234102154896">"တက်ဘလက်တွင် သိမ်းဆည်းသော နေရာ ကုန်သွားပါပြီ။ တချို့ ဖိုင်များ ဖျက်စီးခြင်းဖြင့် နေရာလွတ် ပြုလုပ်ပါ"</string>
- <string name="low_memory" product="watch" msgid="4415914910770005166">"သိုလှောင်ခန်း နေရာ ပြည့်နေပြီ။ နေရာ လွတ်လာရန် ဖိုင် အချို့ကို ဖျက်ပါ။"</string>
+ <string name="low_memory" product="watch" msgid="4415914910770005166">"သိုလှောင်ခန်း နေရာ ပြည့်နေပြီ။ နေရာ လွတ်လာရန် ဖိုင် အချို့ကို ဖျက်ပါ။"</string>
<string name="low_memory" product="default" msgid="3475999286680000541">"ဖုန်းတွင် သိမ်းဆည်းသော နေရာ ကုန်သွားပါပြီ။ တချို့ ဖိုင်များ ဖျက်စီးခြင်းဖြင့် နေရာလွတ် ပြုလုပ်ပါ"</string>
<string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ကွန်ရက်ကို စောင့်ကြည့်စစ်ဆေးခံရနိုင်သည်"</string>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"အမျိုးအမည်မသိ တတိယ ပါတီဖြင့်"</string>
@@ -157,7 +157,7 @@
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Tabletဆိုင်ရာရွေးချယ်မှုများ"</string>
<string name="power_dialog" product="default" msgid="1319919075463988638">"ဖုန်းဆိုင်ရာရွေးချယ်မှုများ"</string>
<string name="silent_mode" msgid="7167703389802618663">"အသံတိတ်စနစ်"</string>
- <string name="turn_on_radio" msgid="3912793092339962371">"wirelessအားဖွင့်မည်"</string>
+ <string name="turn_on_radio" msgid="3912793092339962371">"wirelessအားဖွင့်မည်"</string>
<string name="turn_off_radio" msgid="8198784949987062346">"wirelessအားပိတ်မည်"</string>
<string name="screen_lock" msgid="799094655496098153">"ဖုန်းမျက်နှာပြင်အား သော့ချရန်"</string>
<string name="power_off" msgid="4266614107412865048">"စက်ပိတ်ပါ"</string>
@@ -165,9 +165,9 @@
<string name="silent_mode_vibrate" msgid="7072043388581551395">"တုန်ခါခြင်း ဖုန်းမြည်သံ"</string>
<string name="silent_mode_ring" msgid="8592241816194074353">"ဖုန်းမြည်သံဖွင့်ထားသည်"</string>
<string name="shutdown_progress" msgid="2281079257329981203">"စက်ပိတ်ပါမည်"</string>
- <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"သင့်တက်ဘလက်အား စက်ပိတ်ပါမည်"</string>
- <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"သင်၏ ကြည့်ရှုမှု ပိတ်ပစ်မည်။"</string>
- <string name="shutdown_confirm" product="default" msgid="649792175242821353">"သင့်ဖုန်းအား စက်ပိတ်ပါမည်"</string>
+ <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"သင့်တက်ဘလက်အား စက်ပိတ်ပါမည်"</string>
+ <string name="shutdown_confirm" product="watch" msgid="3490275567476369184">"သင်၏ ကြည့်ရှုမှု ပိတ်ပစ်မည်။"</string>
+ <string name="shutdown_confirm" product="default" msgid="649792175242821353">"သင့်ဖုန်းအား စက်ပိတ်ပါမည်"</string>
<string name="shutdown_confirm_question" msgid="2906544768881136183">"သင်က ပိတ်ပစ်မှာကို လိုပါသလား?"</string>
<string name="reboot_safemode_title" msgid="7054509914500140361">"safe mode ဖြင့် ပြန်လည် စ တင်ရန်"</string>
<string name="reboot_safemode_confirm" msgid="55293944502784668">"safe mode ကို ပြန်လည် စတင် မလား? ဒီလို စတင်ခြင်းဟာ သင် သွင်းထားသော တတိယပါတီ အပလီကေးရှင်းများအား ရပ်ဆိုင်းထားပါမည်။ ပုံမှန်အတိုင်း ပြန်စလျှင် ထိုအရာများ ပြန်လည် ရောက်ရှိလာပါမည်။"</string>
@@ -182,9 +182,9 @@
<string name="bugreport_message" msgid="398447048750350456">"သင့်ရဲ့ လက်ရှိ စက်အခြေအနေ အချက်အလက်များကို အီးမေးလ် အနေဖြင့် ပေးပို့ရန် စုဆောင်းပါမည်။ အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်းမှ ပေးပို့ရန် အသင့်ဖြစ်သည်အထိ အချိန် အနည်းငယ်ကြာမြင့်မှာ ဖြစ်သဖြင့် သည်းခံပြီး စောင့်ပါရန်"</string>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"အသံတိတ်စနစ်"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"အသံပိတ်ထားသည်"</string>
- <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"အသံဖွင့်ထားသည်"</string>
+ <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"အသံဖွင့်ထားသည်"</string>
<string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"လေယာဥ်ပျံပေါ်အသုံးပြုသောစနစ်"</string>
- <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"လေယဥ်ပျံပေါ်၌အသုံးပြုသောစနစ်ဖွင့်ထားသည်"</string>
+ <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"လေယဥ်ပျံပေါ်၌အသုံးပြုသောစနစ်ဖွင့်ထားသည်"</string>
<string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"လေယဥ်ပျံပေါ်၌အသုံးပြုသောစနစ်ပိတ်ထားသည်"</string>
<string name="global_action_settings" msgid="1756531602592545966">"ဆက်တင်များ"</string>
<string name="global_action_lockdown" msgid="8751542514724332873">"ယခု သော့ပိတ်ရန်"</string>
@@ -195,13 +195,13 @@
<string name="managed_profile_label" msgid="6260850669674791528">"အလုပ်"</string>
<string name="permgrouplab_costMoney" msgid="5429808217861460401">"သင်ငွေကုန်ကျမည်ဖြစ်သောဝန်ဆောင်မှုများ"</string>
<string name="permgroupdesc_costMoney" msgid="3293301903409869495">"သင်ပိုက်ဆံကုန်ကျစေသော အရာများ ပြုလုပ်ခြင်း"</string>
- <string name="permgrouplab_messages" msgid="7521249148445456662">"သင့်စာများ"</string>
- <string name="permgroupdesc_messages" msgid="7821999071003699236">"Read and write သင်၏ စာတို၊ အီးမေးလ်၊ နှင့် အခြား စာများကို ဖတ်ခြင်း နှင့် ရေးခြင်း။"</string>
- <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"သင့်ကိုယ်ပိုင်ရေးရာအချက်အလက်များ"</string>
+ <string name="permgrouplab_messages" msgid="7521249148445456662">"သင့်စာများ"</string>
+ <string name="permgroupdesc_messages" msgid="7821999071003699236">"Read and write သင်၏ စာတို၊ အီးမေးလ်၊ နှင့် အခြား စာများကို ဖတ်ခြင်း နှင့် ရေးခြင်း။"</string>
+ <string name="permgrouplab_personalInfo" msgid="3519163141070533474">"သင့်ကိုယ်ပိုင်ရေးရာအချက်အလက်များ"</string>
<string name="permgroupdesc_personalInfo" msgid="8426453129788861338">"အဆက်အသွယ်ကဒ်ထဲ၌ သိမ်းဆည်းထားသော သင့် သတင်းအချက်အလက်များအား တိုက်ရိုက်အသုံးပြုခွင့် ရယူရန်"</string>
<string name="permgrouplab_socialInfo" msgid="5799096623412043791">"သင်၏ ဆိုရှယ် သတင်းအချက်အလက်"</string>
<string name="permgroupdesc_socialInfo" msgid="7129842457611643493">"သင်၏ အဆက်အသွယ်များနှင့် ဆိုရှယ်လ် အဆက်အသွယ်များအား၏ သတင်းအချက်အလက်များအား တိုက်ရိုက်အသုံးပြုခွင့် ရယူရန်"</string>
- <string name="permgrouplab_location" msgid="635149742436692049">"သင့်တည်နေရာ"</string>
+ <string name="permgrouplab_location" msgid="635149742436692049">"သင့်တည်နေရာ"</string>
<string name="permgroupdesc_location" msgid="5704679763124170100">"သင် ရောက်ရှိနေသော တည်နေရာကို စောင့်ကြည့်ခြင်း"</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"ကွန်ယက်ဆက်သွယ်မှု"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"ကွန်ရက် စွမ်းဆောင်ချက် အမျိုးမျိုးအသုံးပြုခွင့်ပေးရန်"</string>
@@ -239,16 +239,16 @@
<string name="permgroupdesc_statusBar" msgid="6242593432226807171">"စက်ရဲ့ အခြေအနေပြ ဘား ဆက်တင်အား ပြင်ဆင်ရန်"</string>
<string name="permgrouplab_syncSettings" msgid="3341990986147826541">"ထပ်တူပြုဆက်တင်များ"</string>
<string name="permgroupdesc_syncSettings" msgid="7603195265129031797">"ထပ်တူညီအောင်လုပ်ရန်ဆက်တင်အား အသုံးပြုခွင့်ပေးရန်"</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"သင့်အကောင့်များ"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"ရရိှနိုင်သောအကောင့်များကို အသုံးပြုရန်"</string>
+ <string name="permgrouplab_accounts" msgid="3359646291125325519">"သင့်အကောင့်များ"</string>
+ <string name="permgroupdesc_accounts" msgid="4948732641827091312">"ရရိှနိုင်သောအကောင့်များကို အသုံးပြုရန်"</string>
<string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"စက်ပစ္စည်းအား ထိန်းချုပ်ရန်"</string>
<string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"ဖုန်း၏ စက်ပိုင်းဆိုင်ရာကို တိုက်ရိုက်ဝင်ရောက်ရန်"</string>
<string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"ဖုန်းခေါ်ဆိုမှုများ"</string>
- <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"ဖုန်းခေါ်ဆိုမှုများကို စောင့်ကြည့်စစ်ဆေးခြင်း၊ မှတ်တမ်းတင်ခြင်းနှင့် စီမံခြင်း"</string>
+ <string name="permgroupdesc_phoneCalls" msgid="7489701620446183770">"ဖုန်းခေါ်ဆိုမှုများကို စောင့်ကြည့်စစ်ဆေးခြင်း၊ မှတ်တမ်းတင်ခြင်းနှင့် စီမံခြင်း"</string>
<string name="permgrouplab_systemTools" msgid="4652191644082714048">"စစ်စတန်ကိရိယာများ"</string>
- <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"အဆင့်နိမ့်ဝင်ရောက်ကြည့်ခြင်းနှင့် စနစ်ကိုထိန်းချုပ်ခြင်း"</string>
+ <string name="permgroupdesc_systemTools" msgid="8162102602190734305">"အဆင့်နိမ့်ဝင်ရောက်ကြည့်ခြင်းနှင့် စနစ်ကိုထိန်းချုပ်ခြင်း"</string>
<string name="permgrouplab_developmentTools" msgid="3446164584710596513">"ဖွံ့ဖိြုးတိုးတက်မှုဆိုင်ရာ ကိရိယာများ"</string>
- <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"appကို တိုးတက်ပြုစုကြသူတို့သာ လိုအပ်နိုင်သည့် အင်္ဂါရပ်များ ဖြစ်သည်။"</string>
+ <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"appကို တိုးတက်ပြုစုကြသူတို့သာ လိုအပ်နိုင်သည့် အင်္ဂါရပ်များ ဖြစ်သည်။"</string>
<string name="permgrouplab_display" msgid="4279909676036402636">"တခြား အပလီကေးရှင်း အသွင်အပြင်"</string>
<string name="permgroupdesc_display" msgid="6051002031933013714">"တခြားအပလီကေးရှင်းများရဲ့ အသွင်အပြင်ကို အကျိုးသက်ရောက်စေရန်"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"သိုလှောင်မှုများ"</string>
@@ -265,26 +265,26 @@
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"ရိုက်သောစာများကို သေချာစွာ စစ်ဆေးပါ"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"အရေးကြီးသော ကိုယ်ရေးအချက်အလက်များဖြစ်တဲ့ ခရက်ဒစ်ကဒ်နံပါတ်များနှင့် စကားဝှက်များ ပါဝင်ပါတယ်."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"အခြေအနေပြဘားအား အလုပ်မလုပ်ခိုင်းရန်သို့မဟုတ် မွမ်းမံရန်"</string>
- <string name="permdesc_statusBar" msgid="8434669549504290975">"appအား အခြေအနေပြ ဘားကို ပိတ်ခွင့် သို့မဟတ် စနစ် အိုင်ကွန်များကို ထည့်ခြင်း ဖယ်ရှားခြင်း ပြုလုပ်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"appအား အခြေအနေပြ ဘားကို ပိတ်ခွင့် သို့မဟတ် စနစ် အိုင်ကွန်များကို ထည့်ခြင်း ဖယ်ရှားခြင်း ပြုလုပ်ခွင့် ပြုသည်။"</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"အခြေအနေပြနေရာ"</string>
- <string name="permdesc_statusBarService" msgid="716113660795976060">"appအား အခြေအနေပြ ဘားဖြစ်ခွင့် ပြုသည်။"</string>
- <string name="permlab_expandStatusBar" msgid="1148198785937489264">"အခြေအနေပြဘားအား ချဲ့/ပြန့်ခြင်း"</string>
- <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"appအား အခြေအနေပြ ဘားကို ချဲ့ခွင့် သို့မဟုတ် ခေါက်သိမ်းခွင့် ပြုသည်။"</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"appအား အခြေအနေပြ ဘားဖြစ်ခွင့် ပြုသည်။"</string>
+ <string name="permlab_expandStatusBar" msgid="1148198785937489264">"အခြေအနေပြဘားအား ချဲ့/ပြန့်ခြင်း"</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"appအား အခြေအနေပြ ဘားကို ချဲ့ခွင့် သို့မဟုတ် ခေါက်သိမ်းခွင့် ပြုသည်။"</string>
<string name="permlab_install_shortcut" msgid="4279070216371564234">"အတိုကောက်များအား ထည့်သွင်းခြင်း"</string>
<string name="permdesc_install_shortcut" msgid="8341295916286736996">"အပလီကေးရှင်းအား အသုံးပြုသူ လုပ်ဆောင်ခြင်း မပါပဲ ပင်မ မြင်ကွင်းအား ပြောင်းလဲခွင့် ပေးခြင်း"</string>
<string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"အတိုကောက်များ ဖယ်ထုတ်ခြင်း"</string>
<string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"အပလီကေးရှင်းအား အသုံးပြုသူ လုပ်ဆောင်ခြင်း မပါပဲ ပင်မ မြင်ကွင်းအား ဖယ်ရှားခွင့် ပေးခြင်း"</string>
<string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"အထွက် ခေါ်ဆိုမှုများအား လမ်းလွှဲပြောင်းခြင်း"</string>
- <string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"appအား အပြင်သို့ ဖုန်းခေါ်ဆိုမှု အတွင်းမှာ ဆက်ခဲ့သည့် နံပါတ်ကို ကြည့်နိုင်ကာ ခေါ်ဆိုမှုကို အခြား နံပါတ် တစ်ခုသို့ ပြောင်းလဲပစ်ခြင်း သို့မဟုတ် ခေါ်ဆိုမှုကို လုံးဝ ဖျက်သိမ်းခွင့် ပြုသည်။"</string>
+ <string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"appအား အပြင်သို့ ဖုန်းခေါ်ဆိုမှု အတွင်းမှာ ဆက်ခဲ့သည့် နံပါတ်ကို ကြည့်နိုင်ကာ ခေါ်ဆိုမှုကို အခြား နံပါတ် တစ်ခုသို့ ပြောင်းလဲပစ်ခြင်း သို့မဟုတ် ခေါ်ဆိုမှုကို လုံးဝ ဖျက်သိမ်းခွင့် ပြုသည်။"</string>
<string name="permlab_receiveSms" msgid="8673471768947895082">"စာပို့ခြင်းအား လက်ခံရယူခြင်း (စာတိုစနစ်)"</string>
- <string name="permdesc_receiveSms" msgid="6424387754228766939">"အပလီကေးရှင်းအား စာတိုများ လက်ခံခြင်း၊ ဆောင်ရွက်ခြင်း ခွင့်ပြုပါ။ ဤခွင့်ပြုချက်တွင် အပလီကေးရှင်းအနေဖြင့် သင် လက်ခံရရှိသော စာများအား သင့်အား မပြပဲစောင့်ကြည့်ခွင့်နှင့် ဖျက်ပစ်ခွင့်များ ပါဝင်ပါသည်။"</string>
+ <string name="permdesc_receiveSms" msgid="6424387754228766939">"အပလီကေးရှင်းအား စာတိုများ လက်ခံခြင်း၊ ဆောင်ရွက်ခြင်း ခွင့်ပြုပါ။ ဤခွင့်ပြုချက်တွင် အပလီကေးရှင်းအနေဖြင့် သင် လက်ခံရရှိသော စာများအား သင့်အား မပြပဲစောင့်ကြည့်ခွင့်နှင့် ဖျက်ပစ်ခွင့်များ ပါဝင်ပါသည်။"</string>
<string name="permlab_receiveMms" msgid="1821317344668257098">"စာပို့ခြင်းအား လက်ခံရယူခြင်း (ရုပ်သံစာ)"</string>
- <string name="permdesc_receiveMms" msgid="533019437263212260">"အပလီကေးရှင်းအား ရုပ်သံစာများ လက်ခံခြင်း၊ ဆောင်ရွက်ခြင်း ခွင့်ပြုပါ။ ဤခွင့်ပြုချက်တွင် အပလီကေးရှင်းအနေဖြင့် သင် လက်ခံရရှိသော စာများအား သင့်အား မပြပဲစောင့်ကြည့်ခွင့်နှင့် ဖျက်ပစ်ခွင့်များ ပါဝင်ပါသည်။"</string>
- <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"အရေးပေါ်ထုတ်လွှင့်မှုများ လက်ခံခြင်း"</string>
- <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"appအား အရေးပေါ် ထုတ်လွှင့်သည့် စာများကို လက်ခံလျက် စီမံဆောင်ရွက်ခွင့် ပြုသည်။ ယင်း ခွင့်ပြုချက်မှာ စနစ် appများ အတွက်သာ ဖြစ်သည်။"</string>
+ <string name="permdesc_receiveMms" msgid="533019437263212260">"အပလီကေးရှင်းအား ရုပ်သံစာများ လက်ခံခြင်း၊ ဆောင်ရွက်ခြင်း ခွင့်ပြုပါ။ ဤခွင့်ပြုချက်တွင် အပလီကေးရှင်းအနေဖြင့် သင် လက်ခံရရှိသော စာများအား သင့်အား မပြပဲစောင့်ကြည့်ခွင့်နှင့် ဖျက်ပစ်ခွင့်များ ပါဝင်ပါသည်။"</string>
+ <string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"အရေးပေါ်ထုတ်လွှင့်မှုများ လက်ခံခြင်း"</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"appအား အရေးပေါ် ထုတ်လွှင့်သည့် စာများကို လက်ခံလျက် စီမံဆောင်ရွက်ခွင့် ပြုသည်။ ယင်း ခွင့်ပြုချက်မှာ စနစ် appများ အတွက်သာ ဖြစ်သည်။"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"စာတိုများ ဖြန့်ဝေခြင်းစနစ်အား ဖတ်ခြင်း"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"အပလီကေးရှင်းကို သင်၏ စက်ပစ္စည်းမှ လက်ခံရရှိသော အများလွှင့်ထုတ်ချက်များကို ဖတ်ရန် ခွင့်ပြုသည်။ အများလွှင့်ထုတ်ချက်များသည် အရေးပေါ်အခြေအနေများကို သင့်အား သတိပေးရန် အချို့ နေရာများတွင် ပို့ပေးသည်။ အရေးပေါ်သတိပေးချက် ထုတ်လွှင့်ချက်ကို လက်ခံရရှိချိန်တွင်အန္တရာယ် ဖြစ်စေနိုင်သော အပလီကေးရှင်းများသည် သင့်စက်ပစ္စည်း၏ လုပ်ငန်းလည်ပတ်မှုနှင့် စွမ်းဆောင်မှုကို ဝင်စွက်ဖက်နိုင်သည်။"</string>
- <string name="permlab_sendSms" msgid="5600830612147671529">"စာတိုပို့စနစ်(SMS)ဖြင့် စာများ ပို့သည်"</string>
+ <string name="permlab_sendSms" msgid="5600830612147671529">"စာတိုပို့စနစ်(SMS)ဖြင့် စာများ ပို့သည်"</string>
<string name="permdesc_sendSms" msgid="7094729298204937667">"အပလီကေးရှင်းအား စာတိုပို့ခွင့် ပြုပါ။ မမျှော်လင့်သော ကုန်ကျမှု ဖြစ်နိုင်ပါသည်။ အန္တရာယ်ရှိ အပလီကေးရှင်းများမှ သင် မသိပဲ စာပို့ခြင်းများ ပြုလုပ်ခြင်းကြောင့် ပိုက်ဆံ အပို ကုန်စေနိုင်သည်"</string>
<string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"စာပြန်မှုခြင်း အသိပေးခြင်း များ ပြုလုပ်ခြင်း"</string>
<string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"အပလီကေးရှင်းအား တခြား စာအပြန်အလှန် ပို့ဆောင်မှု ပေးသော အပလီကေးရှင်းများဆီကို ဖုန်းခေါ်ဆိုမှု များအတွက် စာပို့ခြင်းဖြင့် ပြန်လည် ဖြေဆိုသော တောင်းဆိုမှု များ ခွင့်ပြုခြင်း"</string>
@@ -292,16 +292,16 @@
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"အပလီကေးရှင်းအား တက်ဘလက် သို့မဟုတ် ဆင်းမ်ကဒ်မှာ သိမ်းဆည်းထားသော စာတိုများ ဖတ်ရှုခွင့်ပြုပါ။ အပလီကေးရှင်းအနေဖြင့် အကြာင်းအရာ သို့မဟုတ် ယုံကြည်စိတ်ချရမှုကို ဂရုမပြုပဲ စာတိုအားလုံးကို ဖတ်နိုင်ပါလိမ်မည်။"</string>
<string name="permdesc_readSms" product="default" msgid="3695967533457240550">"အပလီကေးရှင်းအား ဖုန်း သို့မဟုတ် ဆင်းမ်ကဒ်မှာ သိမ်းဆည်းထားသော စာတိုများ ဖတ်ရှုခွင့်ပြုပါ။ အပလီကေးရှင်းအနေဖြင့် အကြာင်းအရာ သို့မဟုတ် ယုံကြည်စိတ်ချရမှုကို ဂရုမပြုပဲ စာတိုအားလုံးကို ဖတ်နိုင်ပါလိမ်မည်။"</string>
<string name="permlab_writeSms" msgid="3216950472636214774">"သင့်ရဲ့ စာပေးပို့ခြင်းများ ပြင်ခြင်း (စာတို နှင့် ရုပ်သံစာ)"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"appအား သင်၏ တက်ဘလက် သို့မဟုတ် ဆင်းမ်ကဒ်ထဲမှာ သိုလှောင်ထားသည့် စာတိုများသို့ ရေးခွင့် ပြုသည်။ ကြံဖန် appများက သင်၏ စာတိုမျာကို ဖျက်ပစ်နိုင်သည်။"</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"appအား သင်၏ ဖုန်း သို့မဟုတ် ဆင်းမ်ကဒ်ထဲမှာ သိုလှောင်ထားသည့် စာတိုများသို့ ရေးခွင့် ပြုသည်။ ကြံဖန် appများက သင်၏ စာတိုမျာကို ဖျက်ပစ်နိုင်သည်။"</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"appအား သင်၏ တက်ဘလက် သို့မဟုတ် ဆင်းမ်ကဒ်ထဲမှာ သိုလှောင်ထားသည့် စာတိုများသို့ ရေးခွင့် ပြုသည်။ ကြံဖန် appများက သင်၏ စာတိုမျာကို ဖျက်ပစ်နိုင်သည်။"</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"appအား သင်၏ ဖုန်း သို့မဟုတ် ဆင်းမ်ကဒ်ထဲမှာ သိုလှောင်ထားသည့် စာတိုများသို့ ရေးခွင့် ပြုသည်။ ကြံဖန် appများက သင်၏ စာတိုမျာကို ဖျက်ပစ်နိုင်သည်။"</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"စာပို့ခြင်းအား လက်ခံရယူခြင်း (WAP)"</string>
- <string name="permdesc_receiveWapPush" msgid="748232190220583385">"အပလီကေးရှင်းအား WAP စာများ လက်ခံခြင်း၊ ဆောင်ရွက်ခြင်း ခွင့်ပြုပါ။ ဤခွင့်ပြုချက်တွင် အပလီကေးရှင်းအနေဖြင့် သင် လက်ခံရရှိသော စာများအား သင့်အား မပြပဲစောင့်ကြည့်ခွင့်နှင့် ဖျက်ပစ်ခွင့်များ ပါဝင်ပါသည်။"</string>
+ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"အပလီကေးရှင်းအား WAP စာများ လက်ခံခြင်း၊ ဆောင်ရွက်ခြင်း ခွင့်ပြုပါ။ ဤခွင့်ပြုချက်တွင် အပလီကေးရှင်းအနေဖြင့် သင် လက်ခံရရှိသော စာများအား သင့်အား မပြပဲစောင့်ကြည့်ခွင့်နှင့် ဖျက်ပစ်ခွင့်များ ပါဝင်ပါသည်။"</string>
<string name="permlab_receiveBluetoothMap" msgid="7593811487142360528">"Bluetooth စာများလက်ခံမည် (MAP)"</string>
<string name="permdesc_receiveBluetoothMap" msgid="8656755936919466345">"Bluetooth MAP စာများကို app မှလက်ခံကာ အလုပ်လုပ်ရန် ခွင့်ပြင်မည်။ ဆိုလိုသည်မှာ app သည်သင့်အား မပြသဘဲ သင့်ကိရိယာသို့ပို့လိုက်သည့် စာများကို ထိန်းချုပ်နိုင် သို့မဟုတ် ဖျက်နိုင်ပါသည်။"</string>
- <string name="permlab_getTasks" msgid="6466095396623933906">"အလုပ်လုပ်နေကြသည့် appများကို ရယူခြင်း"</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"အလုပ်လုပ်နေကြသည့် appများကို ရယူခြင်း"</string>
<string name="permdesc_getTasks" msgid="7454215995847658102">"အပလီကေးရှင်းအား လက်ရှိနဲ့ လတ်တလော လုပ်ဆောင်ခဲ့သော သတင်းအချက်အလက် အသေးစိတ်အား ထုတ်ယူခွင့်ပြုရန်။ အပလီကေးရှင်းမှ သင် ဘယ် အပလီကေးရှင်းများသုံးရှိကြောင့် တွေ့ရှိနိုင်ပါသည်"</string>
<string name="permlab_startTasksFromRecents" msgid="8990073877885690623">"မကြာမီ ထဲက တာဝန် တစ်ခုကို စတင်ရန်"</string>
- <string name="permdesc_startTasksFromRecents" msgid="7382133554871222235">"appအား တက်ကြွမန်နေဂျာ။မကြာမီတာဝန်အင်ဖို အရာကို သုံးပြီး တက်ကြွမန်နေဂျာ။မကြာမီတာဝန်စာရင်းရယူ() ထံမှ ပြန်လာခဲ့သည့် ရပ်စဲခံလိုက်ရသည့် တာဝန်ကို ဖွင့်တင်ရန် အတွက် သုံးခွင့်ပြုသည်။"</string>
+ <string name="permdesc_startTasksFromRecents" msgid="7382133554871222235">"appအား တက်ကြွမန်နေဂျာ။မကြာမီတာဝန်အင်ဖို အရာကို သုံးပြီး တက်ကြွမန်နေဂျာ။မကြာမီတာဝန်စာရင်းရယူ() ထံမှ ပြန်လာခဲ့သည့် ရပ်စဲခံလိုက်ရသည့် တာဝန်ကို ဖွင့်တင်ရန် အတွက် သုံးခွင့်ပြုသည်။"</string>
<string name="permlab_interactAcrossUsers" msgid="7114255281944211682">"အသုံးပြုသူများအကြား ဆက်ဆံခြင်း"</string>
<string name="permdesc_interactAcrossUsers" msgid="364670963623385786">"အပလီကေးရှင်းအား စက်ပေါ်ရှိ တစ်ယောက်ထက်ပိုသော အသုံးပြုသူများအတွက် လုပ်ဆောင်ချက်များ ပြုလုပ်ခွင့်ပေးပါ။ အန္တရာယ်ရှိသော အပလီကေးရှင်းများမှ ဒီအရာကို သုံးပြီး အသုံးပြုသူများအတွင်း ကာကွယ်မှုကို ဖောက်ဖျက်နိုင်ပါသည်"</string>
<string name="permlab_interactAcrossUsersFull" msgid="2567734285545074105">"အသုံးပြုသူများအကြား ဆက်ဆံရန် လိုင်စင် အပြည့်"</string>
@@ -310,9 +310,9 @@
<string name="permdesc_manageUsers" msgid="8409306667645355638">"အပလီကေးရှင်းအား အသုံးပြုသူများကို စီမံခန့်ခွဲခွင့် ပေးပါ။ ဥပမာ ကြည့်ရှုခြင်း၊ အသစ်ပြုလုပ်ခြင်း၊ ဖျက်စီးခြင်း"</string>
<string name="permlab_getDetailedTasks" msgid="6229468674753529501">"သုံးနေသော အပလီကေးရှင်းများ၏ အချက်အလက် ရယူခြင်း"</string>
<string name="permdesc_getDetailedTasks" msgid="153824741440717599">"အပလီကေးရှင်းအား လက်ရှိနဲ့ လတ်တလော လုပ်ဆောင်ခဲ့သော သတင်းအချက်အလက် အသေးစိတ်အား ထုတ်ယူခွင့်ပြုရန်။ အန္တရာယ်ရှိသော အပလီကေးရှင်းများမှ တခြား အပလီကေးရှင်းများရဲ့ အတွင်းကျသော သတင်းအချက်အလက်များအား တွေ့ရှိနိုင်ပါသည်။"</string>
- <string name="permlab_reorderTasks" msgid="2018575526934422779">"အလုပ်လုပ်နေကြသည့် appများကို ပြန်လည်စီစဉ်ခြင်း"</string>
+ <string name="permlab_reorderTasks" msgid="2018575526934422779">"အလုပ်လုပ်နေကြသည့် appများကို ပြန်လည်စီစဉ်ခြင်း"</string>
<string name="permdesc_reorderTasks" msgid="7734217754877439351">"အပလီကေးရှင်းအား နောက်ကွယ် နှင့် ရှေ့မှောက်တွင် လက်ရှိ လုပ်ဆောင်နေမှုများအား ဖယ်ခွင့် ပြုပါ။ သင့် ခွင့်ပြုချက်မပါပဲ လုပ်ဆောင်နိုင်ပါလိမ့်မည်"</string>
- <string name="permlab_removeTasks" msgid="6821513401870377403">"အလုပ်လုပ်နေကြသည့် appများကို ရပ်ခြင်း"</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"အလုပ်လုပ်နေကြသည့် appများကို ရပ်ခြင်း"</string>
<string name="permdesc_removeTasks" msgid="1394714352062635493">"အပလီကေးရှင်းအား စက်မှ လက်ရှိလုပ်ဆောင်နေမှုများအား ဖယ်ရှားခြင်းနှင့် ၎င်းတို့၏ အပလီကေးရှင်းများအား ရပ်တန့်စေရန် လုပ်ခွင့်ပြုပါ။ အန္တရာယ်ရှိ အပလီကေးရှင်းများက တခြား အပလီကေးရှင်းများ၏ အပြုအမူအား ဒုက္ခပေးနိုင်ပါသည်"</string>
<string name="permlab_manageActivityStacks" msgid="7391191384027303065">"လုပ်ဆောင်မှု စာရင်းများအား ထိန်းသိမ်းခြင်း"</string>
<string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"အပလီကေးရှင်းအား တခြားအပလီကေးရှင်းများမှ လုပ်ဆောင်ချက်များအား ထပ်ထည့်ခွင့်၊ ဖယ်ခွင့်၊ ပြင်ဆင်ခွင့် ပေးခြင်း။ စိတ်ချရမှု မရှိသော အပလီကေးရှင်းဆိုလျှင် တခြား အပလီကေးရှင်းများရဲ့ လုပ်ငန်းဆောင်ရွက်ချက်များအား မှားယွင်းစေနိုင်ပါသည်"</string>
@@ -320,48 +320,48 @@
<string name="permdesc_startAnyActivity" msgid="997823695343584001">"ခွင့်ပြုချက်ကာကွယ်ခြင်း၊ သို့ အပြင်သို့ ထုတ်နိုင်မှု အခြေအနေများ မည်သို့ပင်ဖြစ်စေကာမူ အပလီကေးရှင်းအား လှုပ်ရှားမှုများအား စတင်ရန် ခွင့်ပြုပါ"</string>
<string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"ဖန်သားပြင်နှင့် လိုက်ဖက်မှုကို သတ်မှတ်ရန်"</string>
<string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"အပလီကေးရှင်းအား တခြား အပလီကေးရှင်းများ ဖန်သားပြင် ပြသမှုအား ထိန်းချုပ်ခွင့်ပြုပါ။ အန္တရာယ်ရှိ အပလီကေးရှင်းများက တခြားအပလီကေးရှင်းများ ဒုက္ခပေးနိုင်ပါသည်"</string>
- <string name="permlab_setDebugApp" msgid="3022107198686584052">"app ဒီဘာဂင် ဖွင့်ပေးခြင်း"</string>
+ <string name="permlab_setDebugApp" msgid="3022107198686584052">"app ဒီဘာဂင် ဖွင့်ပေးခြင်း"</string>
<string name="permdesc_setDebugApp" msgid="4474512416299013256">"အပလီကေးရှင်းအား တခြား အပလီကေးရှင်းအတွက် အမှားရှာဖွေပြင်ဆင်ခြင်း ခွင့်ပြုပါ။ အန္တရာယ်ရှိ အပလီကေးရှင်း ဒီခွင့်ပြုချက်အား သုံးပြီး တခြားအပလီကေးရှင်းအား ရပ်ပစ်နိုင်ပါသည်"</string>
<string name="permlab_changeConfiguration" msgid="4162092185124234480">"စနစ် ပြသမှုဆက်တင်များပြင်ရန်"</string>
<string name="permdesc_changeConfiguration" msgid="4372223873154296076">"အပလီကေးရှင်းအား လက်ရှိ အပြင်အဆင် ဥပမာ ဘာသာစကား၊ စာလုံးအကြီးအသေး များ ပြင်ခွင့် ပြုရန်"</string>
<string name="permlab_enableCarMode" msgid="5684504058192921098">"ကားမောင်းနေစဥ်စနစ်အား ရရှိစေခြင်း"</string>
- <string name="permdesc_enableCarMode" msgid="4853187425751419467">"appအား ကား မုဒ် ဖွင့်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"appအား ကား မုဒ် ဖွင့်ခွင့် ပြုသည်။"</string>
<string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"အခြား အပလီကေးရှင်းများအား ပိတ်ရန်"</string>
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"အပလီကေးရှင်းအား နောက်ကွယ်တွင် ဖွင့်ထားသော အခြားအပလီကေးရှင်းများရဲ့ လုပ်ဆောင်မှုများအား ရပ်ခွင့်ပေးပါ။ ဒီလိုလုပ်ခြင်းဖြင့် အခြား အပလီကေးရှင်းများ ရပ်တန့်သွားနိုင်ပါသည်"</string>
<string name="permlab_forceStopPackages" msgid="2329627428832067700">"အခြား appများ ရပ်ပစ်ရန် အကြပ်ကိုင်ခြင်း"</string>
- <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"appအား အခြား appများ၏ အလုပ်ကို အတင်းအကြပ် ရပ်ပစ်ခွင့် ရှိသည်။"</string>
+ <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"appအား အခြား appများ၏ အလုပ်ကို အတင်းအကြပ် ရပ်ပစ်ခွင့် ရှိသည်။"</string>
<string name="permlab_forceBack" msgid="652935204072584616">"appကို ပိတ်သွားရန် အကြပ်ကိုင်ခြင်း"</string>
- <string name="permdesc_forceBack" msgid="3892295830419513623">"appအား အရှေ့ပိုင်းမှ မည်သည့် လှုပ်ရှားမှုကို မဆို ပိတ်ခွင့် နှင့် နောက်ကို ပို့ခွင့် ရှိသည်။ သာမန် appများ ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permdesc_forceBack" msgid="3892295830419513623">"appအား အရှေ့ပိုင်းမှ မည်သည့် လှုပ်ရှားမှုကို မဆို ပိတ်ခွင့် နှင့် နောက်ကို ပို့ခွင့် ရှိသည်။ သာမန် appများ ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_dump" msgid="1681799862438954752">"စနစ်၏စက်တွင်းအခြအေနေများထံ ပြန်ထုတ်ခြင်း"</string>
- <string name="permdesc_dump" msgid="1778299088692290329">"appအား စနစ်၏ အတွင်းပိုင်း အခြေအနေကို ရယူခွင့် ပြုသည်။ ကြံဖန် appများသည် ၎င်းတို့ အနေနှင့် ပုံမှန် ဘယ်တော့မှ မလိုအပ်သည့် ကိုယ်ရေး နှင့် လုံခြုံမှု အချက်အလက် အမျိုးမျိုးကို ရယူနိုင်ကြသည်။"</string>
+ <string name="permdesc_dump" msgid="1778299088692290329">"appအား စနစ်၏ အတွင်းပိုင်း အခြေအနေကို ရယူခွင့် ပြုသည်။ ကြံဖန် appများသည် ၎င်းတို့ အနေနှင့် ပုံမှန် ဘယ်တော့မှ မလိုအပ်သည့် ကိုယ်ရေး နှင့် လုံခြုံမှု အချက်အလက် အမျိုးမျိုးကို ရယူနိုင်ကြသည်။"</string>
<string name="permlab_retrieve_window_content" msgid="8022588608994589938">"ဖန်သားပြင်အကြောင်းအရာအားပြန်လည်ရယူရန်"</string>
- <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"appအား တက်ကြွ ဝင်ဒိုး၏ အကြောင်းအရာကို ရယူခွင့် ပြုသည်။ ကြံဖန် appများက ဝင်ဒိုး၏ အကြောင်းအရာ တစ်ခုလုံးကို ရယူနိုင်ပြီး စကားဝှက်မှ လွဲပြီး ၎င်းထဲက စာသား တစ်ခုလုံးကို ဆန်းစစ်နိုင်သည်။"</string>
+ <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"appအား တက်ကြွ ဝင်ဒိုး၏ အကြောင်းအရာကို ရယူခွင့် ပြုသည်။ ကြံဖန် appများက ဝင်ဒိုး၏ အကြောင်းအရာ တစ်ခုလုံးကို ရယူနိုင်ပြီး စကားဝှက်မှ လွဲပြီး ၎င်းထဲက စာသား တစ်ခုလုံးကို ဆန်းစစ်နိုင်သည်။"</string>
<string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"ယာယီ ရယူခွင့် ပြုရန်"</string>
<string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"အပလီကေးရှင်းအား စက်အား ခဏတာ အသုံးပြုခွင့်ပေးပါ။ အန္တရာယ်ရှိ အပလီကေးရှင်းများမှ သုံးစွဲသူ မသိပဲ ရယူခြင်း လုပ်နိုင်ပါသည်"</string>
<string name="permlab_retrieveWindowToken" msgid="7154762602367758602">"ဝင်ဒိုး တိုကင်ကို ရယူခြင်း"</string>
- <string name="permdesc_retrieveWindowToken" msgid="668173747687795074">"အပလီကေးရှင်း တစ်ခုအား ဝင်ဒိုး တိုကင်ကို ရယူခွင့် ပြုသည်။ ကြံဖန် appများက စနစ်လို အယောင်ဆောင်ကာ အပလီကေးရှင်း ဝင်ဒိုးနှင့် ခွင့်မပြုထားသည့် တုံ့ပြန်မှုကို ပြုလုပ်နိုင်သည်။"</string>
+ <string name="permdesc_retrieveWindowToken" msgid="668173747687795074">"အပလီကေးရှင်း တစ်ခုအား ဝင်ဒိုး တိုကင်ကို ရယူခွင့် ပြုသည်။ ကြံဖန် appများက စနစ်လို အယောင်ဆောင်ကာ အပလီကေးရှင်း ဝင်ဒိုးနှင့် ခွင့်မပြုထားသည့် တုံ့ပြန်မှုကို ပြုလုပ်နိုင်သည်။"</string>
<string name="permlab_frameStats" msgid="7056374987314361639">"ဘောင် စာရင်းအင်းများကို ရယူခြင်း"</string>
- <string name="permdesc_frameStats" msgid="4758001089491284919">"အပလီကေးရှင်း တစ်ခုအား မူဘောင် စာရင်းအင်းများကို စုစည်းစေနိုင်သည်။ ကြံဖန် appများက ဝင်ဒိုး၏ မူဘောင် စာရင်းအင်းများကို အခြား appများမှ စောင့်ကြည့်နိုင်သည်။"</string>
+ <string name="permdesc_frameStats" msgid="4758001089491284919">"အပလီကေးရှင်း တစ်ခုအား မူဘောင် စာရင်းအင်းများကို စုစည်းစေနိုင်သည်။ ကြံဖန် appများက ဝင်ဒိုး၏ မူဘောင် စာရင်းအင်းများကို အခြား appများမှ စောင့်ကြည့်နိုင်သည်။"</string>
<string name="permlab_filter_events" msgid="8675535648807427389">"အဖြစ်အပျက်များအား စစ်ထုတ်ခြင်း"</string>
<string name="permdesc_filter_events" msgid="8006236315888347680">"အပလီကေးရှင်းအား သုံးစွဲသူ လုပ်ဆောင်မှုကို မပြုလုပ်ခင် စစ်ဆေးပေးသော input filter မှတ်ပုံတင်ခွင့်ပြုရန်၊ အန္တရယယ် ရှိသော အပလီကေးရှင်းများမှ သုံးစွဲသူ မသိပဲ စနစ်ပုံရိပ်ပြမှုအား ထိန်းချုပ်နိုင်ပါသည်"</string>
<string name="permlab_shutdown" msgid="7185747824038909016">"တစိတ်တပိုင်းအားပိတ်ချရန်"</string>
- <string name="permdesc_shutdown" msgid="7046500838746291775">"လုပ်ဆောင်မှုမန်နေဂျာကို ပိတ်ထားသည့်အခြေအနေတွင်ထားသည်။ အပြီးပိတ်ခြင်းအား မပြုလုပ်ပါ။"</string>
+ <string name="permdesc_shutdown" msgid="7046500838746291775">"လုပ်ဆောင်မှုမန်နေဂျာကို ပိတ်ထားသည့်အခြေအနေတွင်ထားသည်။ အပြီးပိတ်ခြင်းအား မပြုလုပ်ပါ။"</string>
<string name="permlab_stopAppSwitches" msgid="4138608610717425573">"အပ်ပလီကေးရှင်းဖလှယ်ခြင်းမှ မဖြစ်စေရန်"</string>
- <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"အသုံးပြုသူကို အခြား appသို့ ခလုတ် ပြောင်းမရအောင် ဟန့်တားသည်။"</string>
+ <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"အသုံးပြုသူကို အခြား appသို့ ခလုတ် ပြောင်းမရအောင် ဟန့်တားသည်။"</string>
<string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"အပလီကေးရှင်း အချက်အလက်များ ယူခြင်း"</string>
<string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"ကိုင်ဆောင်ထားသူအား လက်ရှိ အပလီကေးရှင်းမှ လျို့ဝှက် အချက်အလက်များအား ထုတ်ယူကြည့်ခွင့်ပြုခြင်း"</string>
- <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"app အားလုံး ဖွင့်တင်မှုကို စောင့်ကြည့်ခြင်း နှင့် ထိန်းချုပ်ခြင်း"</string>
- <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"appအား စနစ်မှ လှုပ်ရှားမှုများကို ဖွင့်လှစ်စတင်ပုံကို စောင့်ကြည့်လျက် ထိန်းချုပ်ခွင့် ပြုသည်။ ကြံဖန် appများက စနစ်ကို လုံးဝ ဖျက်ဆီးပစ်နိုင်ကြသည်။ ယင်း ခွင့်ပြုချက်မှာ တိုးတက်အောင် ပြုစုရာမှာသာ လိုအပ်ပြီး၊ ပုံမှန် အသုံးပြုမှု အတွက် လုံးဝ မဟုတ်ပါ။"</string>
+ <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"app အားလုံး ဖွင့်တင်မှုကို စောင့်ကြည့်ခြင်း နှင့် ထိန်းချုပ်ခြင်း"</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"appအား စနစ်မှ လှုပ်ရှားမှုများကို ဖွင့်လှစ်စတင်ပုံကို စောင့်ကြည့်လျက် ထိန်းချုပ်ခွင့် ပြုသည်။ ကြံဖန် appများက စနစ်ကို လုံးဝ ဖျက်ဆီးပစ်နိုင်ကြသည်။ ယင်း ခွင့်ပြုချက်မှာ တိုးတက်အောင် ပြုစုရာမှာသာ လိုအပ်ပြီး၊ ပုံမှန် အသုံးပြုမှု အတွက် လုံးဝ မဟုတ်ပါ။"</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"package ပယ်ဖျက်မှု ထုတ်လွှင့်မှုအား ပေးပို့ပါ"</string>
- <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"appအား app အထုပ် တစ်ခုကို ဖယ်ရှားပစ်လိုက်ကြောင်း အကြောင်းကြားစာကို ထုတ်လွင့်ခွင့် ပြုသည်။ အကြံအဖန် appများက ၎င်းကို အသုံးပြုပြီး အလုပ်လုပ်နေသည့် မည့်သည့် appကို မဆို သတ်ပစ်နိုင်သည်။"</string>
- <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS-အားပို့ပြီး ထုတ်လွင့်မှုအားရယူခြင်း"</string>
- <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"appအား SMS ရရှိထားကြောင်း အကြောင်းကြားစာကို ထုတ်လွင့်ခွင့် ပြုသည်။ အကြံအဖန် appများက ၎င်းကို အသုံးပြုပြီး ဝင်လာကြသည့် SMS စာများကို အတုလုပ်နိုင်သည်။"</string>
- <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH-အားပို့ပြီး ထုတ်လွင့်မှုအားရယူခြင်း"</string>
- <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"appအား WAP PUSH စာ ရရှိထားကြောင်း အကြောင်းကြားစာကို ထုတ်လွင့်ခွင့် ပြုသည်။ အကြံအဖန် appများက ၎င်းကို အသုံးပြုပြီး ရရှိခဲ့သည့်MMS စာများကို လုပ်ကြံနိုင်သလို၊ မည်သည့် ဝက်ဘ် စာမျက်နှာ၏ အကြောင်းအရာကို မဆို လုပ်ကြံချက်များဖြင့် တိတ်တိတ်ပုန်း အစားထိုးနိုင်သည်။"</string>
- <string name="permlab_setProcessLimit" msgid="2451873664363662666">"အလုပ်လုပ်နေသောလုပ်ငန်းစဥ်နှုန်းအား ကန့်သတ်ခြင်း"</string>
- <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"appအား အလုပ်လုပ်ကြမည့် လုပ်ငန်းစဉ်များ၏ အများဆုံး အရေအတွက်ကို ထိန်းချုပ်ခွင့် ပြုနိုင်သည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"appအား app အထုပ် တစ်ခုကို ဖယ်ရှားပစ်လိုက်ကြောင်း အကြောင်းကြားစာကို ထုတ်လွင့်ခွင့် ပြုသည်။ အကြံအဖန် appများက ၎င်းကို အသုံးပြုပြီး အလုပ်လုပ်နေသည့် မည့်သည့် appကို မဆို သတ်ပစ်နိုင်သည်။"</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS-အားပို့ပြီး ထုတ်လွင့်မှုအားရယူခြင်း"</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"appအား SMS ရရှိထားကြောင်း အကြောင်းကြားစာကို ထုတ်လွင့်ခွင့် ပြုသည်။ အကြံအဖန် appများက ၎င်းကို အသုံးပြုပြီး ဝင်လာကြသည့် SMS စာများကို အတုလုပ်နိုင်သည်။"</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH-အားပို့ပြီး ထုတ်လွင့်မှုအားရယူခြင်း"</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"appအား WAP PUSH စာ ရရှိထားကြောင်း အကြောင်းကြားစာကို ထုတ်လွင့်ခွင့် ပြုသည်။ အကြံအဖန် appများက ၎င်းကို အသုံးပြုပြီး ရရှိခဲ့သည့်MMS စာများကို လုပ်ကြံနိုင်သလို၊ မည်သည့် ဝက်ဘ် စာမျက်နှာ၏ အကြောင်းအရာကို မဆို လုပ်ကြံချက်များဖြင့် တိတ်တိတ်ပုန်း အစားထိုးနိုင်သည်။"</string>
+ <string name="permlab_setProcessLimit" msgid="2451873664363662666">"အလုပ်လုပ်နေသောလုပ်ငန်းစဥ်နှုန်းအား ကန့်သတ်ခြင်း"</string>
+ <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"appအား အလုပ်လုပ်ကြမည့် လုပ်ငန်းစဉ်များ၏ အများဆုံး အရေအတွက်ကို ထိန်းချုပ်ခွင့် ပြုနိုင်သည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_setAlwaysFinish" msgid="550958507798796965">"နောက်ခံ အပလီကေးရှင်းအား မဖြစ်မနေပိတ်ရန်"</string>
- <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"appအား လှုပ်ရှားမှုများ နောက်ခံသို့ သွားကြသည့်နှင့် ပြီးဆုံးခြင်း ရှိမရှိကို အမြဲတမ်း ထိန်းချုပ်ခွင့် ရှိသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်ပါ။"</string>
+ <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"appအား လှုပ်ရှားမှုများ နောက်ခံသို့ သွားကြသည့်နှင့် ပြီးဆုံးခြင်း ရှိမရှိကို အမြဲတမ်း ထိန်းချုပ်ခွင့် ရှိသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်ပါ။"</string>
<string name="permlab_batteryStats" msgid="2789610673514103364">"ဘတ်ထရီ အခြေအနေအား ဖတ်ရန်"</string>
<string name="permdesc_batteryStats" msgid="5897346582882915114">"အပလီကေးရှင်းအား အနိမ့်ပိုင်း စက် အချက်အလက် ဘက်ထရီ အခြေအနေကို ကြည့်ခွင့်ပြုပါ။ အပလီကေးရှင်းမှ သင် အသုံးပြုသော အပလီကေးရှင်းများ၏ အသေးစိတ် သတင်းအချက်အလက်များကို ရှာဖွေရန် ခွင့်ပြုပါ။"</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"ဘက်ထရီ အချက်အလက်အား ပြင်ရန်"</string>
@@ -370,27 +370,27 @@
<string name="permdesc_getAppOpsStats" msgid="6243887041577912877">"အပလီကေးရှင်းကို အပလီကေးရှင်း အသုံးပြုမှု အချက်အလက် စာရင်းများအား ယူသုံးခွင့် ပြုခြင်း။ ပုံမှန် အပလီကေးရှင်းများအတွက် မဟုတ်ပါ"</string>
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"အပလီကေးရှင်း အသုံးပြုမှုအား ပြင်ဆင်ခြင်း"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"အပလီကေးရှင်းကို အပလီကေးရှင်း အသုံးပြုမှု အချက်အလက် စာရင်းများအား ပြောင်းလဲခွင့် ပြုခြင်း။ ပုံမှန် အပလီကေးရှင်းများအတွက် မဟုတ်ပါ"</string>
- <string name="permlab_backup" msgid="470013022865453920">"စနစ်အရန်သိမ်းဆည်းမှုနှင့် ပြန်လည်ရယူရန် ထိန်းချုပ်ခြင်း"</string>
- <string name="permdesc_backup" msgid="6912230525140589891">"appအား စနစ်၏ ဘက်အာပ် နှင့် ပြန်လည် ဖေါ်ထုတ်ရေး ယန္တရားကို ထိန်းချုပ်ခွင့် ပြုသည်။ သာမန် appများ သုံးရန် မဟုတ်ပါ။"</string>
- <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"အပြည့်အဝအရန်သိမ်းဆည်းရန် သို့မဟုတ် ပြန်လည်ရယူခြင်းအောက်ပရေးရှင်းအား အတည်ပြုရန်"</string>
- <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"appအား ဘက်အာပ် အတည်ပြုရေး UI အပြည့်အဝကို ဖွင့်တင်ခွင့် ပြုသည်။ သာမန် appများ သုံးရန် မဟုတ်ပါ။"</string>
- <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"ခွင့်မပြုထားသောဝင်ဒိုးမျာကို ဖော်ပြခြင်း"</string>
+ <string name="permlab_backup" msgid="470013022865453920">"စနစ်အရန်သိမ်းဆည်းမှုနှင့် ပြန်လည်ရယူရန် ထိန်းချုပ်ခြင်း"</string>
+ <string name="permdesc_backup" msgid="6912230525140589891">"appအား စနစ်၏ ဘက်အာပ် နှင့် ပြန်လည် ဖေါ်ထုတ်ရေး ယန္တရားကို ထိန်းချုပ်ခွင့် ပြုသည်။ သာမန် appများ သုံးရန် မဟုတ်ပါ။"</string>
+ <string name="permlab_confirm_full_backup" msgid="5557071325804469102">"အပြည့်အဝအရန်သိမ်းဆည်းရန် သို့မဟုတ် ပြန်လည်ရယူခြင်းအောက်ပရေးရှင်းအား အတည်ပြုရန်"</string>
+ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"appအား ဘက်အာပ် အတည်ပြုရေး UI အပြည့်အဝကို ဖွင့်တင်ခွင့် ပြုသည်။ သာမန် appများ သုံးရန် မဟုတ်ပါ။"</string>
+ <string name="permlab_internalSystemWindow" msgid="2148563628140193231">"ခွင့်မပြုထားသောဝင်ဒိုးမျာကို ဖော်ပြခြင်း"</string>
<string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"အပလီကေးရှင်း အတွင်းပိုင်းစနစ်သာ သုံးရန်သင့်သော ဝင်းဒိုးများ တည်ဆောက်ခွင့် ပြုပါ။ ပုံမှန် အပလီကေးရှင်းများအတွက် မရည်ရွယ်ပါ"</string>
<string name="permlab_systemAlertWindow" msgid="3543347980839518613">"တခြား အပလီကေးရှင်းပေါ်တွင် ထပ်ဆွဲရန်"</string>
<string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"အပလီကေးရှင်းအား အခြားအပလီကေးရှင်းများ သို့ တခြား အသုံးပြုသူ မြင်ရသော နေရာများပေါ်တွင် ထပ်၍ ရေးဆွဲခွင့် ပေးသည်။ ဒီခွင့်ပြုမှုဟာ သင် အပလီကေးရှင်းများနဲ့ အသုံးပြုရန် စီစဉ်ထားမှု သို့ သင် မြင်ရသောမြင်ကွင်းအား ပြောင်းလဲမှု ဖြစ်စေနိုင်သည်"</string>
<string name="permlab_setAnimationScale" msgid="2805103241153907174">"တကမ္ဘာလုံးဆိုင်ရာ လှုပ်ရှားသက်ဝင်နှုန်းမွမ်းမံခြင်း"</string>
<string name="permdesc_setAnimationScale" msgid="7690063428924343571">"အပလီကေးရှင်းအား စက်တစ်ခုလုံးနှင့်ဆိုင်သော သရုပ်ပြမှု အနှေး အမြန် နှုန်း အား အချိန်မရွေး ပြောင်းခွင့်ပြုပါ"</string>
<string name="permlab_manageAppTokens" msgid="1286505717050121370">"app တိုကင်များကို စီမံကွပ်ကဲခြင်း"</string>
- <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"appအား၊ ၎င်းတို့၏ ပုံမှန် Z-အော်ဒါပေးမှုကို ကျော်လွှားပြီး၊ ၎င်းတို့၏ ကိုယ်ပိုင် တိုကင်များကို ဖန်တီးရန် နှင့် စီမံကွပ်ကဲခွင့်ကို ပြုသည်။ သာမန် appများ အတွက ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"appအား၊ ၎င်းတို့၏ ပုံမှန် Z-အော်ဒါပေးမှုကို ကျော်လွှားပြီး၊ ၎င်းတို့၏ ကိုယ်ပိုင် တိုကင်များကို ဖန်တီးရန် နှင့် စီမံကွပ်ကဲခွင့်ကို ပြုသည်။ သာမန် appများ အတွက ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_freezeScreen" msgid="4708181184441880175">"ဖန်သားပြင်အား ရပ်တန့်စေခြင်း"</string>
<string name="permdesc_freezeScreen" msgid="8558923789222670064">"အပလီကေးရှင်းအား ဖန်သားပြည့် ပြသမှုအတွက် ပြောင်းလဲစဉ် ဖန်သားပြင်အား ခဏရပ်ခွင့်ပြုရန်"</string>
- <string name="permlab_injectEvents" msgid="1378746584023586600">"ခလုတ်များနှင့် ထိန်းချုပ်သည့်ခလုတ်များကို နှိပ်ခြင်း"</string>
- <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"appအား ၎င်းကိုယ်နှိုက်၏ ထည့်သွင်းမှုများ (ခလုတ် နှိပ်မှုများ၊ စသဖြင့်)ကို ထည့်ပေးခွင့် ပြုသည်။ ကြံဖန် appများက ၎င်းကို အသုံးပြုပြီး တက်ဘလက်၏ နေရာကို ရယူနိုင်သည်။"</string>
- <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"appအား ၎င်းကိုယ်နှိုက်၏ ထည့်သွင်းမှုများ (ခလုတ် နှိပ်မှုများ၊ စသဖြင့်)ကို ထည့်ပေးခွင့် ပြုသည်။ ကြံဖန် appများက ၎င်းကို အသုံးပြုပြီး ဖုန်း၏ နေရာကို ရယူနိုင်သည်။"</string>
- <string name="permlab_readInputState" msgid="469428900041249234">"သင်မည်သည်ကိုရိုက်သွင်းသည်နှင့် လှုပ်ရှားမှုများကို မှတ်တမ်းတင်ခြင်း"</string>
- <string name="permdesc_readInputState" msgid="8387754901688728043">"appအား သင် နှိပ်သည့် ခလုတ်များကို၊ သင်က အခြား app တစ်ခုနှင့် (စကားဝှက် ရိုက်ထည့်မှုလို) အပြန်အလှန် တုံ့ပြန်နေချိန်မှာတောင်၊ စောင့်ကြည့်ခွင့် ပြုသည်။"</string>
- <string name="permlab_bindInputMethod" msgid="3360064620230515776">"ထည့်သွင်းရန်နည်းလမ်းအား ဆက်ရန်"</string>
- <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"စွဲကိုင်ထားသူအား ရိုက်ထည့်ရေး နည်းလမ်း၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permlab_injectEvents" msgid="1378746584023586600">"ခလုတ်များနှင့် ထိန်းချုပ်သည့်ခလုတ်များကို နှိပ်ခြင်း"</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"appအား ၎င်းကိုယ်နှိုက်၏ ထည့်သွင်းမှုများ (ခလုတ် နှိပ်မှုများ၊ စသဖြင့်)ကို ထည့်ပေးခွင့် ပြုသည်။ ကြံဖန် appများက ၎င်းကို အသုံးပြုပြီး တက်ဘလက်၏ နေရာကို ရယူနိုင်သည်။"</string>
+ <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"appအား ၎င်းကိုယ်နှိုက်၏ ထည့်သွင်းမှုများ (ခလုတ် နှိပ်မှုများ၊ စသဖြင့်)ကို ထည့်ပေးခွင့် ပြုသည်။ ကြံဖန် appများက ၎င်းကို အသုံးပြုပြီး ဖုန်း၏ နေရာကို ရယူနိုင်သည်။"</string>
+ <string name="permlab_readInputState" msgid="469428900041249234">"သင်မည်သည်ကိုရိုက်သွင်းသည်နှင့် လှုပ်ရှားမှုများကို မှတ်တမ်းတင်ခြင်း"</string>
+ <string name="permdesc_readInputState" msgid="8387754901688728043">"appအား သင် နှိပ်သည့် ခလုတ်များကို၊ သင်က အခြား app တစ်ခုနှင့် (စကားဝှက် ရိုက်ထည့်မှုလို) အပြန်အလှန် တုံ့ပြန်နေချိန်မှာတောင်၊ စောင့်ကြည့်ခွင့် ပြုသည်။"</string>
+ <string name="permlab_bindInputMethod" msgid="3360064620230515776">"ထည့်သွင်းရန်နည်းလမ်းအား ဆက်ရန်"</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"စွဲကိုင်ထားသူအား ရိုက်ထည့်ရေး နည်းလမ်း၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"အသုံးပြုမှု ပေးနိုင်သော ဆားဗစ်တစ်ခုနှင့် ပူးပေါင်းမှု ပြုရန်"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"ဖုန်းကိုင်ထားသူနဲ့ ရယူခွင့်ပြုသော ဆားဗစ်မှ ထိပ်ပိုင်းအင်တာဖေ့စ် ကို ပူပေါင်းခွင့်ပေးခြင်း။ ပုံမှန် အပလီကေးရှင်းများမှာ မလိုအပ်ပါ။"</string>
<string name="permlab_bindPrintService" msgid="8462815179572748761">"စာထုတ်မှု ဆားဗစ်နှင့် ပူးပေါင်းခြင်း"</string>
@@ -400,80 +400,80 @@
<string name="permlab_bindNfcService" msgid="2752731300419410724">"NFC ဆားဗစ်နှင့်ပူးပေါင်းခြင်း"</string>
<string name="permdesc_bindNfcService" msgid="6120647629174066862">"ဖုန်းကိုင်ထားသူနှင့် NFC ထုတ်လွှတ်နေတဲ့ အပလီကေးရှင်း ကို ပူးပေါင်းခွင့် ပေးခြင်း၊. ပုံမှန် အပလီကေးရှင်းများမှာ မလိုအပ်ပါ"</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"စာတိုပို့ခြင်းဆားဗစ်နှင့် ပူးပေါင်းခြင်း"</string>
- <string name="permdesc_bindTextService" msgid="8151968910973998670">"စွဲကိုင်ထားသူအား စာသား ဝန်ဆောင်မှု၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"စွဲကိုင်ထားသူအား စာသား ဝန်ဆောင်မှု၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"VPNဆားဗစ်နှင့် ပူးပေါင်းခြင်း"</string>
- <string name="permdesc_bindVpnService" msgid="2067845564581693905">"စွဲကိုင်ထားသူအား Vpn ဝန်ဆောင်မှု၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
- <string name="permlab_bindWallpaper" msgid="8716400279937856462">"နောက်ခံနှင့် ပူးပေါင်းခြင်း"</string>
- <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"စွဲကိုင်ထားသူအား နောက်ခံ ပုံ၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"စွဲကိုင်ထားသူအား Vpn ဝန်ဆောင်မှု၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permlab_bindWallpaper" msgid="8716400279937856462">"နောက်ခံနှင့် ပူးပေါင်းခြင်း"</string>
+ <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"စွဲကိုင်ထားသူအား နောက်ခံ ပုံ၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"အသံ တုံ့ပြန်လုပ်ပေးသူ တစ်ခုဆီသို့ ချိတ်တွဲခြင်း"</string>
- <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"စွဲကိုင်ထားသူအား အသံဖြင့် တုံ့ပြန်ရေး ဝန်ဆောင်မှု၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"စွဲကိုင်ထားသူအား အသံဖြင့် တုံ့ပြန်ရေး ဝန်ဆောင်မှု၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_manageVoiceKeyphrases" msgid="1252285102392793548">"အသံ သော့ချက် စကားရပ်များကို စီမံကွပ်ကဲရန်"</string>
- <string name="permdesc_manageVoiceKeyphrases" msgid="8476560722907530008">"စွဲကိုင်ထားသူအား စကားလုံးတို ရှာကြံရေး အတွက် သော့ချက် စကားရပ်များကို စီမံခွင့်ပြုသည်။သာမန် appများ အတွက် ဘယ်တော့မှ လိုအပ်မည် မဟုတ်။"</string>
+ <string name="permdesc_manageVoiceKeyphrases" msgid="8476560722907530008">"စွဲကိုင်ထားသူအား စကားလုံးတို ရှာကြံရေး အတွက် သော့ချက် စကားရပ်များကို စီမံခွင့်ပြုသည်။သာမန် appများ အတွက် ဘယ်တော့မှ လိုအပ်မည် မဟုတ်။"</string>
<string name="permlab_bindRemoteDisplay" msgid="1782923938029941960">"ထိန်းချုပ်ပြသခြင်း နဲ့ ပူးပေါင်းရန်"</string>
<string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"ဖုန်းကိုင်ထားသူနဲ့ ထိန်းချုပ်ပြသမှုမှ ထိပ်ပိုင်းအင်တာဖေ့စ် ကို ပူးပေါင်းခွင့်ပေးခြင်း။ ပုံမှန် အပလီကေးရှင်းများမှာ မလိုအပ်ပါ"</string>
- <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"ဝဒ်ဂျက်ဝန်ဆောင်မှုနှင့် ပူးပေါင်းရန်"</string>
- <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"စွဲကိုင်ထားသူအားဝီဂျက် ဝန်ဆောင်မှု၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
- <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"စက်ပစ္စည်း ထိန်းချုပ်ခြင်းနှင့် တုံ့ပြန်မှု"</string>
- <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"စွဲကိုင်ထားသူအား ကိရိယာ စီမံအုပ်ချုပ်သူထံသို့ ရည်ရွယ်ချက်များကို ပို့ခွင့် ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
- <string name="permlab_bindTvInput" msgid="5601264742478168987">"တီဗီ ထည့်သွင်းမှု တစ်ခုဆီသို့ ချိတ်တွဲပေးခြင်း"</string>
- <string name="permdesc_bindTvInput" msgid="2371008331852001924">"စွဲကိုင်ထားသူအား တီဗီ ထည့်သွင်းမှု၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permlab_bindRemoteViews" msgid="5697987759897367099">"ဝဒ်ဂျက်ဝန်ဆောင်မှုနှင့် ပူးပေါင်းရန်"</string>
+ <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"စွဲကိုင်ထားသူအားဝီဂျက် ဝန်ဆောင်မှု၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"စက်ပစ္စည်း ထိန်းချုပ်ခြင်းနှင့် တုံ့ပြန်မှု"</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"စွဲကိုင်ထားသူအား ကိရိယာ စီမံအုပ်ချုပ်သူထံသို့ ရည်ရွယ်ချက်များကို ပို့ခွင့် ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permlab_bindTvInput" msgid="5601264742478168987">"တီဗီ ထည့်သွင်းမှု တစ်ခုဆီသို့ ချိတ်တွဲပေးခြင်း"</string>
+ <string name="permdesc_bindTvInput" msgid="2371008331852001924">"စွဲကိုင်ထားသူအား တီဗီ ထည့်သွင်းမှု၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_modifyParentalControls" msgid="4611318225997592242">"မိဘ ထိန်းချုပ်မှုများကို မွမ်းမံရန်"</string>
- <string name="permdesc_modifyParentalControls" msgid="7438482894162282039">"ပိုင်ရှင်အား စနစ်၏ မိဘများ ထိန်းချုပ်ရေး ဒေတာကို မွမ်းမံခွင့် ပြုသည်။ ပုံမှန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permdesc_modifyParentalControls" msgid="7438482894162282039">"ပိုင်ရှင်အား စနစ်၏ မိဘများ ထိန်းချုပ်ရေး ဒေတာကို မွမ်းမံခွင့် ပြုသည်။ ပုံမှန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"စက်အက်မင်တစ်ယောက် ကို ထည့်ခြင်း သို့ ထုတ်ခြင်း"</string>
<string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"အသုံးပြုသူအား အက်ဒ်မင်များအား ထည့်ခြင်း ထုတ်ခြင်း ပြုလုပ်ခွင့် ပေးခြင်း။ . ပုံမှန် အပလီကေးရှင်းများမှာ မလိုအပ်ပါ"</string>
<string name="permlab_setOrientation" msgid="3365947717163866844">"စကရင်အနေအထားအားပြောင်းခြင်း"</string>
- <string name="permdesc_setOrientation" msgid="3046126619316671476">"appအား မျက်နှာပြင် လည်မှုကို အချိန်မရွေး ရပ်ပစ်ခွင့် ပြုသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permdesc_setOrientation" msgid="3046126619316671476">"appအား မျက်နှာပြင် လည်မှုကို အချိန်မရွေး ရပ်ပစ်ခွင့် ပြုသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_setPointerSpeed" msgid="9175371613322562934">"မြားအမြန်နှုန်းအား ပြောင်းခြင်း"</string>
- <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"appအား မောက်စ်ကို သို့မဟုတ် ထရက်ပဲဒ် ညွှန်တံ၏ နှုန်းကို အချိန်မရွေး ပြောင်းခွင့် ရှိသည်။သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"appအား မောက်စ်ကို သို့မဟုတ် ထရက်ပဲဒ် ညွှန်တံ၏ နှုန်းကို အချိန်မရွေး ပြောင်းခွင့် ရှိသည်။သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"လက်ကွက် အပြင်အဆင်ပြောင်းရန်"</string>
<string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"အပလီကေးရှင်းအား လက်ကွက်အပြင်အဆင်အား ပြောင်းခွင့်ပြုပါ။ ပုံမှန် အပလီကေးရှင်းများတွင် မလိုအပ်ပါ။"</string>
<string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"appများသို့ Linux အချက်ပြမှု ပို့ခြင်း"</string>
- <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"appအား ပို့နေသော အချက်ပြမှုကို ရှိနေကြသည့် လုပ်ငန်းစဉ် အားလုံးထံသို့ ပို့ရေးကို တောင်းဆိုခွင့် ပေးသည်။"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"appအား ပို့နေသော အချက်ပြမှုကို ရှိနေကြသည့် လုပ်ငန်းစဉ် အားလုံးထံသို့ ပို့ရေးကို တောင်းဆိုခွင့် ပေးသည်။"</string>
<string name="permlab_persistentActivity" msgid="8841113627955563938">"appကို အမြဲတမ်း အလုပ်လုပ်စေခြင်း"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"အပလီကေးရှင်းအား မှတ်ဉာဏ်ထဲတွင် ရေရှည်သိမ်းဆည်ထားရန် ခွင့်ပြုပါ။ ဒီခွင့်ပြုချက်ကြောင့် တခြားအပလီကေးရှင်းအများအတွက် မှတ်ဉာဏ်ရရှိမှု နည်းသွားနိုင်ပြီး တက်ဘလက်လည်း နှေးသွားနိုင်ပါသည်။"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"အပလီကေးရှင်းအား မှတ်ဉာဏ်ထဲတွင် ရေရှည်သိမ်းဆည်ထားရန် ခွင့်ပြုပါ။ ဒီခွင့်ပြုချက်ကြောင့် တခြားအပလီကေးရှင်းအများအတွက် မှတ်ဉာဏ်ရရှိမှု နည်းသွားနိုင်ပြီး ဖုန်းလည်း နှေးသွားနိုင်ပါသည်။"</string>
<string name="permlab_deletePackages" msgid="184385129537705938">"appများကို ဖျက်ရန်"</string>
- <string name="permdesc_deletePackages" msgid="7411480275167205081">"appအား အန်ဒရွိုက် အထုပ်များကို ဖျက်ခွင့် ပြုသည်။ အကြံအဖန် appများက ၎င်းကို အသုံးပြုပြီး အရေးကြီးသည့် appများကို ဖျက်ပစ်နိုင်သည်။"</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"appအား အန်ဒရွိုက် အထုပ်များကို ဖျက်ခွင့် ပြုသည်။ အကြံအဖန် appများက ၎င်းကို အသုံးပြုပြီး အရေးကြီးသည့် appများကို ဖျက်ပစ်နိုင်သည်။"</string>
<string name="permlab_clearAppUserData" msgid="274109191845842756">"အခြား appများ၏ ဒေတာကို ဖျက်ရန်"</string>
- <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"appအား အသုံးပြုသူ ဒေတာကို ရှင်းပစ်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"appအား အသုံးပြုသူ ဒေတာကို ရှင်းပစ်ခွင့် ပြုသည်။"</string>
<string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"အခြား appများ၏ ကက်ရှများကို ဖျက်ရန်"</string>
- <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"appအား ကက်ရှ ဖိုင်များကို ဖျက်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"appအား ကက်ရှ ဖိုင်များကို ဖျက်ခွင့် ပြုသည်။"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"app သိုလှောင်မှု နေရာကို တိုင်းထွာခြင်း"</string>
- <string name="permdesc_getPackageSize" msgid="3921068154420738296">"appအား ၎င်း၏ ကုဒ်၊ ဒေတာ၊ နှင့် ကက်ရှ ဆိုက်များကို ရယူခွင့် ပြုသည်။"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"appအား ၎င်း၏ ကုဒ်၊ ဒေတာ၊ နှင့် ကက်ရှ ဆိုက်များကို ရယူခွင့် ပြုသည်။"</string>
<string name="permlab_installPackages" msgid="2199128482820306924">"appများကို တိုက်ရိုက် တပ်ဆင်ခြင်း"</string>
- <string name="permdesc_installPackages" msgid="5628530972548071284">"appအား အန်ဒရွိုက် အထုပ် အသစ် သို့မဟုတ် မွမ်းမံပြီးကို တပ်ဆင်ခွင့် ပြုသည်။ ကြံဖန် appများက ၎င်းကို အသုံးပြုပြီး ထင်ရာလုပ်နိုင်သော ကြီးမားသည့် ခွင့်ပြုချက်များ ရှိမည့် appများကို ထည့်ပေးနိုင်ကြသည်။"</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"appအား အန်ဒရွိုက် အထုပ် အသစ် သို့မဟုတ် မွမ်းမံပြီးကို တပ်ဆင်ခွင့် ပြုသည်။ ကြံဖန် appများက ၎င်းကို အသုံးပြုပြီး ထင်ရာလုပ်နိုင်သော ကြီးမားသည့် ခွင့်ပြုချက်များ ရှိမည့် appများကို ထည့်ပေးနိုင်ကြသည်။"</string>
<string name="permlab_clearAppCache" msgid="7487279391723526815">"app ကက်ရှ ဒေတာ အားလုံးကို ဖျက်ပစ်ရန်"</string>
<string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"အပလီကေးရှင်းမှာ တခြား အပလီကေးရှင်းများမှ ဒေတာများအား ယာယီ သိုလှောင်မှုနေရာမှ ဖျက်ပစ်ပြီး နေရာလွတ် လုပ်ခွင့်ပြုပါ။ ဒီလိုလုပ်ခြင်းဖြင့် တခြား အပလီကေးရှင်းများ စတင်ရာတွင် နှေးကွေးမှု ဖြစ်စေနိုင်ပါသည်။"</string>
<string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"အပလီကေးရှင်းမှာ တခြား အပလီကေးရှင်းများမှ ဒေတာများအား ယာယီ သိုလှောင်မှုနေရာမှ ဖျက်ပစ်ပြီး နေရာလွတ် လုပ်ခွင့်ပြုပါ။ ဒီလိုလုပ်ခြင်းဖြင့် တခြား အပလီကေးရှင်းများ စတင်ရာတွင် နှေးကွေးမှု ဖြစ်စေနိုင်ပါသည်။"</string>
<string name="permlab_movePackage" msgid="3289890271645921411">"app အရင်းအမြစ်များကို ဖယ်ရှားခြင်း"</string>
- <string name="permdesc_movePackage" msgid="319562217778244524">"appအား ဖယ်ရှားရနိုင်သော သိုလှောင်ခန်းကို app၏ အရင်းအမြစ်များကို အတွင်းမှ အပြင်သို့ ရွှေ့ပြောင်းခြင်း နှင့် ပြောင်းပြန်လုပ်ခြင်းကို ခွင့်ပြုသည်။"</string>
+ <string name="permdesc_movePackage" msgid="319562217778244524">"appအား ဖယ်ရှားရနိုင်သော သိုလှောင်ခန်းကို app၏ အရင်းအမြစ်များကို အတွင်းမှ အပြင်သို့ ရွှေ့ပြောင်းခြင်း နှင့် ပြောင်းပြန်လုပ်ခြင်းကို ခွင့်ပြုသည်။"</string>
<string name="permlab_readLogs" msgid="6615778543198967614">"တုံ့ပြန်မှုလွယ်သောစာရင်းဒေတာအားဖတ်ခြင်း"</string>
- <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"appအား စနစ်၏ လော့ဂ် ဖိုင် အမျိုးမျိုးတို့ကို ဖတ်ကြားခွင့် ပြုသည်။ သို့ဖြစ်၍ ၎င်းသည် သင်က တက်ဘလက်နှင့် ဘာတွေ လုပ်ကိုင်နေကြောင်း အထွေထွေ အချက်အလက်များကို၊ ဖြစ်နိုင်သည်မှာ ကိုယ်ရေး သို့မဟုတ် ပုဂ္ဂိုလ်ရေး အချက်အလက်များ အပါအဝင် တို့ကိုပါ၊ ရှာတွေ့သိလာနိုင်သည်။"</string>
- <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"appအား စနစ်၏ လော့ဂ် ဖိုင် အမျိုးမျိုးတို့ကို ဖတ်ကြားခွင့် ပြုသည်။ သို့ဖြစ်၍ ၎င်းသည် သင်က ဖုန်းနှင့် ဘာတွေ လုပ်ကိုင်နေကြောင်း အထွေထွေ အချက်အလက်များကို၊ ဖြစ်နိုင်သည်မှာ ကိုယ်ရေး သို့မဟုတ် ပုဂ္ဂိုလ်ရေး အချက်အလက်များ အပါအဝင် တို့ကိုပါ၊ ရှာတွေ့သိလာနိုင်သည်။"</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"appအား စနစ်၏ လော့ဂ် ဖိုင် အမျိုးမျိုးတို့ကို ဖတ်ကြားခွင့် ပြုသည်။ သို့ဖြစ်၍ ၎င်းသည် သင်က တက်ဘလက်နှင့် ဘာတွေ လုပ်ကိုင်နေကြောင်း အထွေထွေ အချက်အလက်များကို၊ ဖြစ်နိုင်သည်မှာ ကိုယ်ရေး သို့မဟုတ် ပုဂ္ဂိုလ်ရေး အချက်အလက်များ အပါအဝင် တို့ကိုပါ၊ ရှာတွေ့သိလာနိုင်သည်။"</string>
+ <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"appအား စနစ်၏ လော့ဂ် ဖိုင် အမျိုးမျိုးတို့ကို ဖတ်ကြားခွင့် ပြုသည်။ သို့ဖြစ်၍ ၎င်းသည် သင်က ဖုန်းနှင့် ဘာတွေ လုပ်ကိုင်နေကြောင်း အထွေထွေ အချက်အလက်များကို၊ ဖြစ်နိုင်သည်မှာ ကိုယ်ရေး သို့မဟုတ် ပုဂ္ဂိုလ်ရေး အချက်အလက်များ အပါအဝင် တို့ကိုပါ၊ ရှာတွေ့သိလာနိုင်သည်။"</string>
<string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"မည်သည့် မီဒီယာ ဒီကုဒ်ဒါမဆို ပြသရာတွင် သုံးရန်"</string>
<string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"အပလီကေးရှင်းအား သွင်းထားသည့် မီဒီယာ ဒီကုဒ်ဒါ အား သုံးပြီး ဖွင့်ရန် ဒီကုဒ် လုပ်ခွင့် ပြုပါ"</string>
<string name="permlab_manageCaCertificates" msgid="1678391896786882014">"ယုံကြည်ရသော အကောင့်များအား ထိန်းသိမ်းခြင်း"</string>
<string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"အပလီကေးရှင်းအား CA လက်မှတ်များအား ယုံကြည်စိတ်ချရသော အရာ အဖြစ် ထည့်ခွင့် ပြန်ထုတ်ခွင့် ပေးခြင်း။"</string>
- <string name="permlab_bindJobService" msgid="3637568367978271086">"အပလီကေးရှင်း၏ စီစဉ်ထားသည့် နောက်ခံ အလုပ်ကို လုပ်ကိုင်ရန်"</string>
+ <string name="permlab_bindJobService" msgid="3637568367978271086">"အပလီကေးရှင်း၏ စီစဉ်ထားသည့် နောက်ခံ အလုပ်ကို လုပ်ကိုင်ရန်"</string>
<string name="permdesc_bindJobService" msgid="3473288460524119838">"ဒီခွင့်ပြုချက်က တောင်းဆိုလာလျှင် အန်ဒရွိုက် စနစ်အား အပလီကေးရှင်းကို နောက်ခံမှာ အလုပ် လုပ်ကိုင်စေပါသည်။"</string>
<string name="permlab_diagnostic" msgid="8076743953908000342">"diagမှပိုင်ဆိုင်သော ရင်းနှီးမှုများကို ဖတ်/ရေးခြင်း"</string>
- <string name="permdesc_diagnostic" msgid="6608295692002452283">"appအား diag အုပ်စု ပိုင်ဆိုင်သည့် မည်သည့် အရင်းအမြစ်ကို မဆို ရေးခြင်း နှင့် ဖတ်ခြင်းကို ခွင့်ပြုသည်၊ ဥပမာ၊ /dev ထဲက ဖိုင်များ။ ၎င်းက စနစ်၏ တည်ငြိမ်မှု နှင့် လုံခြုံမှုကို ထိပါးနိုင်သည့် အလားအလာ ရှိသည်။ ထုတ်လုပ်သူ သို့မဟုတ် အော်ပရေတာက ဟာ့ဒ်ဝဲ ဆိုင်ရာ ပြဿနာ ရှာဖွေ စူးစမ်းမှု အတွက်သာ ၎င်းကို အသုံးပြုရမည်။"</string>
- <string name="permlab_changeComponentState" msgid="6335576775711095931">"app အစိတ်အပိုင်းများကို ဖွင့်ခြင်း သို့မဟုတ် ပိတ်ခြင်း"</string>
- <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"appအား အခြား app တစ်ခု၏ အစိတ်အပိုင်း တစ်ခုမှာ ဖွင့်ထားသည် ဖြစ်စေ ဖွင့်မထားသည် ဖြစ်စေ ပြောင်းလဲခွင့် ပြုသည်။ အကြံအဖန် appများက ၎င်းကို အသုံးပြုပြီး အရေးကြီးသည့် တက်ဘလက်၏ လုပ်နိုင်စွမ်းကို ပိတ်ပစ်နိုင်သည်။ app၏ အစိတ်အပိုင်းများကို သုံးမရအောင်၊ စနစ်မမှန်အောင် သို့မဟုတ် အခြေအနေ မတည်ငြိမ်အောင် လုပ်၍ ရနိုင်သောကြောင့် ဒီ ခွင့်ပြုချက်ကို သုံးရာတွင် သတိထားရန် လိုအပ်သည်။"</string>
- <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"appအား အခြား app တစ်ခု၏ အစိတ်အပိုင်း တစ်ခုမှာ ဖွင့်ထားသည် ဖြစ်စေ ဖွင့်မထားသည် ဖြစ်စေ ပြောင်းလဲခွင့် ပြုသည်။ အကြံအဖန် appများက ၎င်းကို အသုံးပြုပြီး အရေးကြီးသည့် ဖုန်း၏ လုပ်နိုင်စွမ်းကို ပိတ်ပစ်နိုင်သည်။ app၏ အစိတ်အပိုင်းများကို သုံးမရအောင်၊ စနစ်မမှန်အောင် သို့မဟုတ် အခြေအနေ မတည်ငြိမ်အောင် လုပ်၍ ရနိုင်သောကြောင့် ဒီ ခွင့်ပြုချက်ကို သုံးရာတွင် သတိထားရန် လိုအပ်သည်။"</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"appအား diag အုပ်စု ပိုင်ဆိုင်သည့် မည်သည့် အရင်းအမြစ်ကို မဆို ရေးခြင်း နှင့် ဖတ်ခြင်းကို ခွင့်ပြုသည်၊ ဥပမာ၊ /dev ထဲက ဖိုင်များ။ ၎င်းက စနစ်၏ တည်ငြိမ်မှု နှင့် လုံခြုံမှုကို ထိပါးနိုင်သည့် အလားအလာ ရှိသည်။ ထုတ်လုပ်သူ သို့မဟုတ် အော်ပရေတာက ဟာ့ဒ်ဝဲ ဆိုင်ရာ ပြဿနာ ရှာဖွေ စူးစမ်းမှု အတွက်သာ ၎င်းကို အသုံးပြုရမည်။"</string>
+ <string name="permlab_changeComponentState" msgid="6335576775711095931">"app အစိတ်အပိုင်းများကို ဖွင့်ခြင်း သို့မဟုတ် ပိတ်ခြင်း"</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"appအား အခြား app တစ်ခု၏ အစိတ်အပိုင်း တစ်ခုမှာ ဖွင့်ထားသည် ဖြစ်စေ ဖွင့်မထားသည် ဖြစ်စေ ပြောင်းလဲခွင့် ပြုသည်။ အကြံအဖန် appများက ၎င်းကို အသုံးပြုပြီး အရေးကြီးသည့် တက်ဘလက်၏ လုပ်နိုင်စွမ်းကို ပိတ်ပစ်နိုင်သည်။ app၏ အစိတ်အပိုင်းများကို သုံးမရအောင်၊ စနစ်မမှန်အောင် သို့မဟုတ် အခြေအနေ မတည်ငြိမ်အောင် လုပ်၍ ရနိုင်သောကြောင့် ဒီ ခွင့်ပြုချက်ကို သုံးရာတွင် သတိထားရန် လိုအပ်သည်။"</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"appအား အခြား app တစ်ခု၏ အစိတ်အပိုင်း တစ်ခုမှာ ဖွင့်ထားသည် ဖြစ်စေ ဖွင့်မထားသည် ဖြစ်စေ ပြောင်းလဲခွင့် ပြုသည်။ အကြံအဖန် appများက ၎င်းကို အသုံးပြုပြီး အရေးကြီးသည့် ဖုန်း၏ လုပ်နိုင်စွမ်းကို ပိတ်ပစ်နိုင်သည်။ app၏ အစိတ်အပိုင်းများကို သုံးမရအောင်၊ စနစ်မမှန်အောင် သို့မဟုတ် အခြေအနေ မတည်ငြိမ်အောင် လုပ်၍ ရနိုင်သောကြောင့် ဒီ ခွင့်ပြုချက်ကို သုံးရာတွင် သတိထားရန် လိုအပ်သည်။"</string>
<string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"ခွင့်ပြုချက် ထောက်ခံခြင်း သို့ ပယ်ဖျက်ခြင်း"</string>
<string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"အပလီကေးရှင်းအား ကိုယ်တိုင် ဒါမှမဟုတ် တခြား အပလီကေးရှင်းအတွက် ခွင့်ပြုချက်များအား ခွင့်ပြုခြင်း၊ပယ်ဖျယ်ခြင်း လုပ်ခွင့်ပြုပါ။ အန္တရာယ်ရှိသော အပလီကေးရှင်းများမှ ဒီခွင့်ပြုချက်အားသုံးပြီး အခွင့်မရှိသော စွမ်းဆောင်ချက်များအား သုံးနိုင်ပါသည်"</string>
- <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"ပိုကြိုက်သည့် appများကို သတ်မှတ်ခြင်း"</string>
- <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"appအား သင် နှစ်ခြုက်သည့် appများကို မွမ်းမံခွင့် ပြုသည်။ ကြံဖန် appများက ဖွင့်ထားသည့် appများကို တိတ်တဆိတ် ပြောင်းလဲပစ်ကာ၊ ရှိနေကြသည့် သင်၏ appများကို သင့်ထံမှ သင်၏ ကိုယ်ရေး ဒေတာများကို စုစည်းရန် ခိုင်းနိုင်သည်။"</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"ပိုကြိုက်သည့် appများကို သတ်မှတ်ခြင်း"</string>
+ <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"appအား သင် နှစ်ခြုက်သည့် appများကို မွမ်းမံခွင့် ပြုသည်။ ကြံဖန် appများက ဖွင့်ထားသည့် appများကို တိတ်တဆိတ် ပြောင်းလဲပစ်ကာ၊ ရှိနေကြသည့် သင်၏ appများကို သင့်ထံမှ သင်၏ ကိုယ်ရေး ဒေတာများကို စုစည်းရန် ခိုင်းနိုင်သည်။"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"စနစ်အပြင်အဆင်အား မွမ်းမံခြင်း"</string>
- <string name="permdesc_writeSettings" msgid="7775723441558907181">"appအား စနစ်၏ ဆက်တင် ဒေတာကို မွမ်းမံခွင့် ပြုသည်။ သာမန် appများက သင့် စနစ်၏ စီစဉ်ဖွဲ့စည်းမှုကို ဖျက်ဆီးပစ်နိုင်သည်။"</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"appအား စနစ်၏ ဆက်တင် ဒေတာကို မွမ်းမံခွင့် ပြုသည်။ သာမန် appများက သင့် စနစ်၏ စီစဉ်ဖွဲ့စည်းမှုကို ဖျက်ဆီးပစ်နိုင်သည်။"</string>
<string name="permlab_writeSecureSettings" msgid="204676251876718288">"စနစ်အပြင်အဆင်လုံခြုံမှုအား မွမ်းမံခြင်း"</string>
- <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"appအား စနစ်၏ လုံခြုံစိတ်ချရသည့် ဒေတာကို မွမ်းမံခွင့် ပြုသည်။ သာမန် appများ အသုံးပြုရန် မဟုတ်ပါ။"</string>
+ <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"appအား စနစ်၏ လုံခြုံစိတ်ချရသည့် ဒေတာကို မွမ်းမံခွင့် ပြုသည်။ သာမန် appများ အသုံးပြုရန် မဟုတ်ပါ။"</string>
<string name="permlab_writeGservices" msgid="2149426664226152185">"ဂူဂဲလ်ဝန်ဆောင်မှုမြေပုံအားမွမ်းမံခြင်း"</string>
- <string name="permdesc_writeGservices" msgid="1287309437638380229">"appအယဒ Google ဝန်ဆောင်မှုများ မြေပုံကို မွမ်းမံခွင့် ပြုသည်။ သာမန် appများ အသုံးပြုရန် မဟုတ်ပါ။"</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"appအယဒ Google ဝန်ဆောင်မှုများ မြေပုံကို မွမ်းမံခွင့် ပြုသည်။ သာမန် appများ အသုံးပြုရန် မဟုတ်ပါ။"</string>
<string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"အစတွင် လုပ်ဆောင်ရန်"</string>
- <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"appအား စနစ်၏ စတင်မှု ပြီးဆုံးသည့်နှင့် မိမိကိုမိမိ စတင်ခွင့် ပြုသည်။ သို့ဖြစ်၍ ဖုန်း စတင်မှုမှာ အချိန် ပိုကြာနိုင်ပြီး appက တချိန်လုံး အလုပ်လုပ်နေခြင်းကြောင့် တက်ဘလက်၏ အလုပ် တစ်ခုလုံးကို နှေးကွေးလာစေနိုင်သည်။"</string>
- <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"appအား စနစ်၏ စတင်မှု ပြီးဆုံးသည့်နှင့် မိမိကိုမိမိ စတင်ခွင့် ပြုသည်။ သို့ဖြစ်၍ ဖုန်း စတင်မှုမှာ အချိန် ပိုကြာနိုင်ပြီး appက တချိန်လုံး အလုပ်လုပ်နေခြင်းကြောင့် ဖုန်း၏ အလုပ် တစ်ခုလုံးကို နှေးကွေးလာစေနိုင်သည်။"</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"appအား စနစ်၏ စတင်မှု ပြီးဆုံးသည့်နှင့် မိမိကိုမိမိ စတင်ခွင့် ပြုသည်။ သို့ဖြစ်၍ ဖုန်း စတင်မှုမှာ အချိန် ပိုကြာနိုင်ပြီး appက တချိန်လုံး အလုပ်လုပ်နေခြင်းကြောင့် တက်ဘလက်၏ အလုပ် တစ်ခုလုံးကို နှေးကွေးလာစေနိုင်သည်။"</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"appအား စနစ်၏ စတင်မှု ပြီးဆုံးသည့်နှင့် မိမိကိုမိမိ စတင်ခွင့် ပြုသည်။ သို့ဖြစ်၍ ဖုန်း စတင်မှုမှာ အချိန် ပိုကြာနိုင်ပြီး appက တချိန်လုံး အလုပ်လုပ်နေခြင်းကြောင့် ဖုန်း၏ အလုပ် တစ်ခုလုံးကို နှေးကွေးလာစေနိုင်သည်။"</string>
<string name="permlab_broadcastSticky" msgid="7919126372606881614">"ကြာရှည်ခံ ထုတ်လွှတ်မှု အားပေးပို့ခြင်း"</string>
<string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"အပလီကေးရှင်းအား ကြာရှည်ခံ ထုတ်လွှင့်မှု ပြုပါ။ ဒီထုတ်လွှင့်မှုများဟာ ထုတ်လွှင့်မှု ပြီးဆုံးပြီးသွားတည့်တိုင် ကျန်နေမည် ဖြစ်ပါသည်။ အလွန်အကျွံသုံးခြင်းကြောင့် မက်မိုရီ အသုံးများပြီး တက်ဘလက်နှေးခြင်း၊ မတည်ငြိမ်ခြင်း ဖြစ်နိုင်ပါသည်"</string>
<string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"အပလီကေးရှင်းအား ကြာရှည်ခံ ထုတ်လွှင့်မှု ပြုပါ။ ဒီထုတ်လွှင့်မှုများဟာ ထုတ်လွှင့်မှု ပြီးဆုံးပြီးသွားတည့်တိုင် ကျန်နေမည် ဖြစ်ပါသည်။ အလွန်အကျွံသုံးခြင်းကြောင့် မှတ်ဉာဏ်အသုံးများပြီး ဖုန်းနှေးခြင်း၊ မတည်ငြိမ်ခြင်း ဖြစ်နိုင်ပါသည်"</string>
@@ -493,32 +493,32 @@
<string name="permdesc_readProfile" product="default" msgid="5462475151849888848">"အပလီကေးရှင်းအား စက်မှာ သိမ်းထားသော သင့်နာမည် နှင့် အဆက်အသွယ် သတင်းအချက်အလက်များကဲ့သို့သော ကိုယ်ရေးကိုယ်တာ အချက်အလက်များအား ဖတ်ခွင့် ပြုခြင်း။ အပလီကေးရှင်းမှ သင့်အား သိရှိနိုင်ပြီး သင့်ကိုယ်ရေးအချက်အလက်များအား အခြားသူများကို ပေးပို့နိုင်ပါသည်"</string>
<string name="permlab_writeProfile" msgid="907793628777397643">"သင့်ရဲ့ အဆက်အသွယ်ကဒ် အား ပြင်ရန်"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"အပလီကေးရှင်းအား စက်မှာ သိမ်းထားသော သင့်နာမည် နှင့် အဆက်အသွယ် သတင်းအချက်အလက်များကဲ့သို့သော ကိုယ်ရေးကိုယ်တာ အချက်အလက်များအား ပြင်ဆင်ခွင့် သို့ ထည့်ခွင့် ပြုခြင်း။ အပလီကေးရှင်းမှ သင့်အား သိရှိနိုင်ပြီး သင့်ကိုယ်ရေးအချက်အလက်များအား အခြားသူများကို ပေးပို့နိုင်ပါသည်"</string>
- <string name="permlab_bodySensors" msgid="4871091374767171066">"ခန္ဓာကိုယ် အာရံခံကိရိယာများ (နှလုံးခုန်နှုန်း စောင့်ကြည့်စက် လို)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"appအား သင့် ခန္ဓာကိုယ် အတွင်းမှာ၊ နှလုံးခုန်နှုန်းလို၊ ဘာတွေ ဖြစ်ပျက်နေကြောင်းကို တိုင်းထွာရန် အသုံးပြုသည့် အာရုံခံကိရိယာများ ထံမှ ဒေတာများကို ရယူသုံးခွင့် ပေးထားသည်။"</string>
- <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"သင့်လူမှုရေးရာအဖွဲ့အစည်းတွင်ရေးသားရန်"</string>
+ <string name="permlab_bodySensors" msgid="4871091374767171066">"ခန္ဓာကိုယ် အာရံခံကိရိယာများ (နှလုံးခုန်နှုန်း စောင့်ကြည့်စက် လို)"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"သင်၏ နှလုံးခုန်နှုန်းလို ရုပ်ပိုင်း အခြေအနေကို စောင့်ကြပ်သည့် အာရုံခံစက်များထံမှ ဒေတာများကို appအား ရယူသုံးခွင့် ပြုပါ။"</string>
+ <string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"သင့်လူမှုရေးရာအဖွဲ့အစည်းတွင်ရေးသားရန်"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"အပလီကေးရှင်းအား သင်နှင့် သင့်သူငယ်ချင်းတို့၏ ဆိုရှယ်နက်ဝဘ်မှ နောက်ဆုံးပေါ် အချက်အလက်များအား အသုံးပြုခွင့်နင့် ထပ်တူညီအောင် လုပ်ဆောင်ခွင့် ပြုပါ။ သတင်းအချက်အလက် မျှဝေခြင်းတွင် သတိပြုရန် -- ဤသို့ ခွင့်ပြုခြင်းဖြင့် အပလီကေးရှင်းမှ ယုံကြည်စိတ်ချရမှုကို ဂရုမပြုပဲ သင် နှင့် သူငယ်ချင်းများကြား ဆက်သွယ်မှုများအား သိရှိနိုင်ပါသည်။ မှတ်ချက်။ ဤခွင့်ပြုချက်အား ဆိုရှယ်နက်ဝဘ် အားလုံးတွင် ခွင့်ပြုခြင်း မလုပ်သင့်ပါ။"</string>
- <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"သင့်လူမှုရေးရာအဖွဲ့အစည်းတွင်ရေးသားရန်"</string>
+ <string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"သင့်လူမှုရေးရာအဖွဲ့အစည်းတွင်ရေးသားရန်"</string>
<string name="permdesc_writeSocialStream" product="default" msgid="3086557552204114849">"အပလီကေးရှင်းအား သူငယ်ချင်းများရဲ့ ဆိုရှယ်နက်ဝဘ်မှနောက်ဆုံးပေါ် အချက်အလက်များအား ဖန်သားပြင်ပေါ်တွင် ပြခွင့်ပြုရန်။ သတင်းအချက်အလက် မျှဝေခြင်းတွင် သတိပြုရန် -- ဤသို့ ခွင့်ပြုခြင်းဖြင့် အပလီကေးရှင်းမှ သူငယ်ချင်းများထံမှ လာသကဲ့သို့ သတင်းများ ပြုလုပ်နိုင်ပါသည်။ မှတ်ချက်၊ ဤခွင့်ပြုချက်အား ဆိုရှယ်နက်ဝဘ် အားလုံးတွင် ခွင့်ပြုခြင်း မလုပ်သင့်ပါ။"</string>
- <string name="permlab_readCalendar" msgid="5972727560257612398">"ပြက္ခဒိန်အဖြစ်အပျက်များနှင့် လှို့ဝှက်အချက်အလက်များအား ဖတ်ခြင်း"</string>
+ <string name="permlab_readCalendar" msgid="5972727560257612398">"ပြက္ခဒိန်အဖြစ်အပျက်များနှင့် လှို့ဝှက်အချက်အလက်များအား ဖတ်ခြင်း"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"အပလီကေးရှင်းအား တက်ဘလက်ထဲတွင် သိမ်းထားသော သူငယ်ချင်းနှင့် လုပ်ဖော်ကိုင်ဘက်များ၏ ပြက္ခဒိန် အဖြစ်အပျက်များအပါအဝင် အားလုံးကို ဖတ်ရှုခွင့်ပြုပါ။ ဒီခွင့်ပြုချက်ကြောင့် အပလီကေးရှင်းမှ ပြက္ခဒိန် အဖြစ်အပျက်များအား လျှို့ဝှက်မှု သို့ ဂရုပြုမှု ကို ထည့်သွင်းမစဉ်းစားပဲ သိမ်းဆည်းခြင်း၊ မျှဝေခြင်း ပြုလုပ်စေနိုင်ပါသည်"</string>
<string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"အပလီကေးရှင်းအားဖုန်းထဲတွင် သိမ်းထားသော သူငယ်ချင်းနှင့် လုပ်ဖော်ကိုင်ဘက်များ၏ ပြက္ခဒိန် အဖြစ်အပျက်များအပါအဝင် အားလုံးကို ဖတ်ရှုခွင့်ပြုပါ။ ဒီခွင့်ပြုချက်ကြောင့် အပလီကေးရှင်းမှ ပြက္ခဒိန် အဖြစ်အပျက်များအား လျှို့ဝှက်မှု သို့ ဂရုပြုမှု ကို ထည့်သွင်းမစဉ်းစားပဲ သိမ်းဆည်းခြင်း၊ မျှဝေခြင်း ပြုလုပ်စေနိုင်ပါသည်"</string>
- <string name="permlab_writeCalendar" msgid="8438874755193825647">"ပြက္ခဒိန်အဖြစ်အပျက်များကို ထပ်ထည့်ရန် သို့မဟုတ် မွမ်းမံရန်နှင့် ပိုင်ရှင်၏အသိမပေးပဲ ဧည့်သည်များထံ အီးမေးလ်ပို့ရန်"</string>
+ <string name="permlab_writeCalendar" msgid="8438874755193825647">"ပြက္ခဒိန်အဖြစ်အပျက်များကို ထပ်ထည့်ရန် သို့မဟုတ် မွမ်းမံရန်နှင့် ပိုင်ရှင်၏အသိမပေးပဲ ဧည့်သည်များထံ အီးမေးလ်ပို့ရန်"</string>
<string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"အပလီကေးရှင်းအား သင်၏ တက်ဘလက်တွင် သူငယ်ချင်း အလုပ်ဖော်များ အပါအဝင် သင်၏ ပြောင်းလဲအဖြစ်အပျက်များအား ထည့်ခြင်း၊ ထုတ်ခြင်းအား ခွင့်ပြုရန်။ ဤခွင့်ပြုချက်သည် အပလီကေးရှင်းအား သတင်းများပို့ခြင်းကို ပြက္ခဒိန်ပိုင်ရှင်ဆီမှ လာသလို အနေဖြင့် ပေးပို့ခြင်း သို့မဟုတ် အဖြစ်အပျက်များကို ပိုင်ရှင်မသိပဲ ပြင်ဆင်နိုင်ပါသည်။"</string>
<string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"အပလီကေးရှင်းအား သင်၏ ဖုန်းတွင် သူငယ်ချင်း အလုပ်ဖော်များ အပါအဝင် သင်၏ ပြောင်းလဲအဖြစ်အပျက်များအား ထည့်ခြင်း၊ ထုတ်ခြင်းအား ခွင့်ပြုရန်။ ဤခွင့်ပြုချက်သည် အပလီကေးရှင်းအား သတင်းများပို့ခြင်းကို ပြက္ခဒိန်ပိုင်ရှင်ဆီမှ လာသလို အနေဖြင့် ပေးပို့ခြင်း သို့မဟုတ် အဖြစ်အပျက်များကို ပိုင်ရှင်မသိပဲ ပြင်ဆင်နိုင်ပါသည်။"</string>
<string name="permlab_accessMockLocation" msgid="8688334974036823330">"စမ်းသပ်ရန်အတွက် တည်နေရာပုံစံတုမူရင်း"</string>
<string name="permdesc_accessMockLocation" msgid="5808711039482051824">"စမ်းသပ်ရန် သို့ နေရာပြပံ့ပို့းမှု အသစ်သွင်းရန် တည်နေရာဇစ်မြစ်အတုကို ဖန်တီးပါ။ ဤသို့လုပ်ခြင်းအားဖြင့် အပလီကေးရှင်းမှ တည်နေရာကို ကျော်ဖြတ်ပြင်ဆင်ခြင်းနှင်ူ ဂျီပီအက်စ် သို့ နေရာပြပံ့ပိုးမှုကဲ့သို့သော အခြား တည်နေရာဇစ်မြစ်များ၏ အခြေအနေကို ပြန်ပို့ပေးနိုင်မည်ဖြစ်သည်။"</string>
- <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"တည်နေရာပံ့ပိုးမှုညွှန်ကြားချက်အပိုအား ဝင်ရောက်ကြည့်ခြင်း"</string>
- <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"appအား တည်နေရာ စီမံပေးရေး ညွှန်ကြားချက် အပိုများကို ရယူခွင့်ပြုသည်။ သို့ဖြစ်၍ appသည် GPS သို့မဟုတ် အခြား တည်နေရာ ရင်းမြစ်ကို သုံးကြသူတို့၏ လုပ်ငန်းများကို ဝင်စွက်ခွင့် ပြုနိုင်သည်။"</string>
- <string name="permlab_installLocationProvider" msgid="6578101199825193873">"တည်နေရာဝန်ဆောင်မှုပေးသူအားထည့်သွင်းရန်ခွင့်ပြုခြင်း"</string>
+ <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"တည်နေရာပံ့ပိုးမှုညွှန်ကြားချက်အပိုအား ဝင်ရောက်ကြည့်ခြင်း"</string>
+ <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"appအား တည်နေရာ စီမံပေးရေး ညွှန်ကြားချက် အပိုများကို ရယူခွင့်ပြုသည်။ သို့ဖြစ်၍ appသည် GPS သို့မဟုတ် အခြား တည်နေရာ ရင်းမြစ်ကို သုံးကြသူတို့၏ လုပ်ငန်းများကို ဝင်စွက်ခွင့် ပြုနိုင်သည်။"</string>
+ <string name="permlab_installLocationProvider" msgid="6578101199825193873">"တည်နေရာဝန်ဆောင်မှုပေးသူအားထည့်သွင်းရန်ခွင့်ပြုခြင်း"</string>
<string name="permdesc_installLocationProvider" msgid="9066146120470591509">"စမ်းသပ်ရန် သို့ နေရာပြပံ့ပို့းမှု အသစ်သွင်းရန် တည်နေရာဇစ်မြစ်အတုကို ဖန်တီးပါ။ ဤသို့လုပ်ခြင်းအားဖြင့် အပလီကေးရှင်းမှ တည်နေရာကို ကျော်ဖြတ်ပြင်ဆင်ခြင်းနှင်ူ ဂျီပီအက်စ် သို့ နေရာပြပံ့ပိုးမှုကဲ့သို့သော အခြား တည်နေရာဇစ်မြစ်များ၏ အခြေအနေကို ပြန်ပို့ပေးနိုင်မည်ဖြစ်သည်။"</string>
<string name="permlab_accessFineLocation" msgid="1191898061965273372">"တည်နေရာ အတိအကျ (ဂျီပီအက်စ် နှင့် ကွန်ရက်အခြေခံ)"</string>
<string name="permdesc_accessFineLocation" msgid="5295047563564981250">"အပလီကေးရှင်းမှ သင့်ရဲ့ တိကျသောနေရာကို ဂျီပီအက်စ် သို့ ဆယ်လူလာတာဝါတိုင်၊ ဝိုင်ဖိုင် အချက်အလက်များ သုံးပြီး ရှာခြင်း ခွင့်ယူပါ။ နေရာပြ ဆားဗစ်များ စက်ပေါ်မှာ ရှိရမှာ ဖြစ်သလို ဖွင့်ထားရမှာလည်း ဖြစ်ပါသည်။ အပလီကေးရှင်းမှ ဒီဆားဗစ်များကို သုံး၍ ရှာဖွေသောကြောင့် ဘက်ထရီ ပိုကုန်နိုင်ပါသည်။"</string>
<string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"အကြမ်းဖျင်းနေရာ (ကွန်ရက်အခြေခံ)"</string>
<string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"သင့်ရဲ့ ပျမ်းမျတည်နေရာကို အပလီကေးရှင်း အား သိခွင့် ပြုရန်။ ဒီ တည်နေရာကို တည်နေရာရှာဖွေရေး ဆားဗစ်မှ မိုဘိုင်း တာဝါတိုင်၊ ဝိုင်ဖိုင် စသည်တို့မှ တဆင့် ရယူပါသည်။ အပလီကေးရှင်း အနေဖြင့် ဒီ ဆားဗစ်များ ရှိနေရန် လိုအပ်ပါသည်။ ဒီအရာများကို အသုံးပြု၍ သင့်နေရာကို သိနိုင်ပါသည်။"</string>
<string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"SurfaceFlingerအား ချိတ်ဆက်ရန်"</string>
- <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"ဒီ appအား InputFlinger အဆင့်နိမ့် အင်္ဂါရပ်များကို သုံးခွင့် ပြုသည်။"</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"ဒီ appအား InputFlinger အဆင့်နိမ့် အင်္ဂါရပ်များကို သုံးခွင့် ပြုသည်။"</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"frame bufferအားဖတ်ခြင်း"</string>
- <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"appအား ဘောင် စပ်ကြား နေရာ ထဲက အကြောင်းအရာကို ဖတ်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"appအား ဘောင် စပ်ကြား နေရာ ထဲက အကြောင်းအရာကို ဖတ်ခွင့် ပြုသည်။"</string>
<string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlinger အား သုံးခွင့်"</string>
<string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"အပလီကေးရှင်းကို InputFlinger low-level features ပေးသုံးခြင်း"</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"ဝိုင်ဖိုင်ဖြင့် ပြသမှုအား ပြင်ဆင်ရန်"</string>
@@ -527,23 +527,23 @@
<string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"အပလီကေးရှင်းအား စက်ရဲ့ အနိမ့်ပိုင်းမှာ ရှိသော ဝိုင်ဖိုင် ပြသမှုအား ထိန်းချုပ်ခွင့်ပြုပါ"</string>
<string name="permlab_captureAudioOutput" msgid="6857134498402346708">"အသံထွက်မှု အား ဖမ်းယူခြင်း"</string>
<string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"အပလီကေးရှင်းကို အသံဖမ်းခွင့် လမ်းကြောင်းလွှဲခွင့်များ ခွင့်ပြုခြင်း"</string>
- <string name="permlab_captureAudioHotword" msgid="1890553935650349808">"အသံဖြင့်ညွှန်ကြားရန်အတိုကောက်များအား ဖမ်းယူ သိနိုင်မှု"</string>
- <string name="permdesc_captureAudioHotword" msgid="9151807958153056810">"အပလီကေးရှင်းကို အသံဖြင့်ညွှန်းကြားရန်အတိုကောက်များ အတွက် အသံဖမ်းယူခွင့်ပြုခြင်း။ နောက်ကွယ်မှာ ဖြစ်နိုင်ပေမယ့် တခြားအသံဖမ်းခြင်းများ (ဥပမာ ရုပ်သံဖမ်းစက်) များကို ပိတ်ပင်မှု မဖြစ်စေပါ"</string>
+ <string name="permlab_captureAudioHotword" msgid="1890553935650349808">"အသံဖြင့်ညွှန်ကြားရန်အတိုကောက်များအား ဖမ်းယူ သိနိုင်မှု"</string>
+ <string name="permdesc_captureAudioHotword" msgid="9151807958153056810">"အပလီကေးရှင်းကို အသံဖြင့်ညွှန်းကြားရန်အတိုကောက်များ အတွက် အသံဖမ်းယူခွင့်ပြုခြင်း။ နောက်ကွယ်မှာ ဖြစ်နိုင်ပေမယ့် တခြားအသံဖမ်းခြင်းများ (ဥပမာ ရုပ်သံဖမ်းစက်) များကို ပိတ်ပင်မှု မဖြစ်စေပါ"</string>
<string name="permlab_modifyAudioRouting" msgid="7738060354490807723">"အသံ လမ်းကြောင်း"</string>
- <string name="permdesc_modifyAudioRouting" msgid="7205731074267199735">"အက်ပ်အား အသံ လမ်းကြောင်းကို တိုက်ရိုက် ထိန်းချုပ်ခွင့် နှင့် အသံ မူဝါဒ ဆုံးဖြတ်ချက်များကို ကျော်ပြီးလုပ်ပိုင်ခွင့် ပေးသည်။"</string>
+ <string name="permdesc_modifyAudioRouting" msgid="7205731074267199735">"အက်ပ်အား အသံ လမ်းကြောင်းကို တိုက်ရိုက် ထိန်းချုပ်ခွင့် နှင့် အသံ မူဝါဒ ဆုံးဖြတ်ချက်များကို ကျော်ပြီးလုပ်ပိုင်ခွင့် ပေးသည်။"</string>
<string name="permlab_captureVideoOutput" msgid="2246828773589094023">"ရုပ်သံလွှင့်မှုအား ဖမ်းယူရန်"</string>
<string name="permdesc_captureVideoOutput" msgid="359481658034149860">"အပလီကေးရှင်းကို ရုပ်သံဖမ်းခွင့် လမ်းကြောင်းလွှဲခွင့်များ ခွင့်ပြုခြင်း"</string>
<string name="permlab_captureSecureVideoOutput" msgid="7815398969303382016">"လုံခြုံသော ရုပ်သံလွှင့်မှုအား ဖမ်းယူရန်"</string>
<string name="permdesc_captureSecureVideoOutput" msgid="2779793064709350289">"အပလီကေးရှင်းကို လုံးခြုံစိတ်ချရသော အသံဖမ်းခြင်း လမ်းကြောင်းလွှဲခွင့်များ ခွင့်ပြုခြင်း"</string>
<string name="permlab_mediaContentControl" msgid="8749790560720562511">"မီဒီယာ ပလေးဘက် နဲ့ မက်တာဒေတာ အသုံးပြုခွင့် အား ထိန်းချုပ်ခြင်း"</string>
<string name="permdesc_mediaContentControl" msgid="1637478200272062">"အပလီကေးရှင်းအား ရုပ်သံ ပြန်လည်ပြသမှု နှင့် မီဒီယာ အချက်အလက် (ခေါင်းစဉ်၊ ရေးသားသူ) များကို ထိန်းချုပ်ခွင့် ပေးခြင်း"</string>
- <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"သင့်အသံအပြင်အဆင်အားပြောင်းခြင်း"</string>
+ <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"သင့်အသံအပြင်အဆင်အားပြောင်းခြင်း"</string>
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"အပလီကေးရှင်းအား အသံအတိုးအကျယ်နှင့် အထွက်ကို မည်သည့်စပီကာကို သုံးရန်စသည်ဖြင့် စက်တစ်ခုလုံးနှင့်ဆိုင်သော အသံဆိုင်ရာ ဆက်တင်များ ပြင်ဆင်ခွင့် ပြုရန်"</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"အသံဖမ်းခြင်း"</string>
- <string name="permdesc_recordAudio" msgid="4906839301087980680">"အပလီကေးရှင်းအား မိုက်ခရိုဖုန်းဖြင့် အသံသွင်းခွင့် ပြုပါ။ အပလီကေးရှင်းအနေဖြင့် သင့် ခွင့်ပြုချက် မပါပဲ အချိန်မရွေး အသံဖမ်းနိုင်ပါမည်"</string>
+ <string name="permdesc_recordAudio" msgid="4906839301087980680">"အပလီကေးရှင်းအား မိုက်ခရိုဖုန်းဖြင့် အသံသွင်းခွင့် ပြုပါ။ အပလီကေးရှင်းအနေဖြင့် သင့် ခွင့်ပြုချက် မပါပဲ အချိန်မရွေး အသံဖမ်းနိုင်ပါမည်"</string>
<string name="permlab_sim_communication" msgid="1180265879464893029">"ဆင်းမ်ကဒ် ဆက်သွယ်ရေး"</string>
<string name="permdesc_sim_communication" msgid="5725159654279639498">"အပလီကေးရှင်းအား ဆင်းမ်ကဒ်ဆီသို့ အမိန့်များ ပေးပို့ခွင့် ပြုခြင်း။ ဒီ ခွင့်ပြုမှုဟာ အန်တရယ် အလွန် ရှိပါသည်။."</string>
- <string name="permlab_camera" msgid="3616391919559751192">"ဓါတ်ပုံနှင့်ဗွီဒီယိုရိုက်ခြင်း"</string>
+ <string name="permlab_camera" msgid="3616391919559751192">"ဓါတ်ပုံနှင့်ဗွီဒီယိုရိုက်ခြင်း"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"အပလီကေးရှင်းအား အလိုအလျောက် ဓာတ်ပုံရိုက်ခွင့်၊ ဗီဒီယို ရိုက်ကူးခွင့် ပြုပါ။ ဒီခွင့်ပြုချက်က အပလီကေးရှင်းကို အချိန်မရွေး ကင်မရာအား ခွင့်ပြုချက် မလိုအပ်ပဲ သုံးခွင့်ပြုပါသည်။"</string>
<string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"ထုတ်လွှင့်မှုပြ အချက်ပေး မီးအား ကင်မရာ သုံးနေစဉ် ပိတ်ရန်"</string>
<string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"ကြိုတင်သွင်းထားသော စစ်စတန် စနစ်တစ်ခုကို ကင်မရာ သုံးနေသော မီးအား ထိန်းချုပ်ခွင့်ပေးခြင်း"</string>
@@ -553,135 +553,135 @@
<string name="permdesc_brick" product="default" msgid="5788903297627283099">"appအား ဖုန်း တစ်ခုလုံးကို ထာဝရ ပိတ်ပစ်ခွင် ပြုသည်။ ၎င်းမှာ အထူး အန္တရာယ် ရှိနိုင်သည်။"</string>
<string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"တက်ဘလက် မဖြစ်မနေပြန်လည်စတင်လုပ်ဆောင်ရန်"</string>
<string name="permlab_reboot" product="default" msgid="2898560872462638242">"ဖုန်းကို မဖြစ်မနေပြန်လည်စတင်လုပ်ဆောင်ရန်"</string>
- <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"appအား တက်ဘလက်ကို ပြန်စတင်ရန် အတင်းအကြပ် ပြုလုပ်ခွင့် ပြုပါသည်။"</string>
- <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"appအား ဖုန်းကို ပြန်စတင်ရန် အတင်းအကြပ် ပြုလုပ်ခွင့် ပြုပါသည်။"</string>
+ <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"appအား တက်ဘလက်ကို ပြန်စတင်ရန် အတင်းအကြပ် ပြုလုပ်ခွင့် ပြုပါသည်။"</string>
+ <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"appအား ဖုန်းကို ပြန်စတင်ရန် အတင်းအကြပ် ပြုလုပ်ခွင့် ပြုပါသည်။"</string>
<string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"USBသိုလှောင်ရာဖိုင်စနစ်အား အသုံးပြုခွင့်ပေးရန်"</string>
<string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"SDကတ် ဖိုင် စနစ် အား အသုံးပြုခွင့်ပေးရန်"</string>
- <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"appအား ဖယ်ရှားရနိုင်သော သိုလှောင်ခန်း၏ ဖိုင် စနစ်များကို တပ်ဆင်ခြင်း နှင့် ဖြုတ်ခြင်းကို ပြုလုပ်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"appအား ဖယ်ရှားရနိုင်သော သိုလှောင်ခန်း၏ ဖိုင် စနစ်များကို တပ်ဆင်ခြင်း နှင့် ဖြုတ်ခြင်းကို ပြုလုပ်ခွင့် ပြုသည်။"</string>
<string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"USBသိုလှောင်ရာအား ဖျက်ရန်"</string>
<string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"SDကတ်အား ဖျက်ရန်"</string>
- <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"appအား ဖယ်ရှားရနိုင်သော သိုလှောင်ခန်းကို ပုံစံပြန်ချခွင့် ပြုသည်။"</string>
+ <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"appအား ဖယ်ရှားရနိုင်သော သိုလှောင်ခန်းကို ပုံစံပြန်ချခွင့် ပြုသည်။"</string>
<string name="permlab_asec_access" msgid="3411338632002193846">"စက်တွင်းသိုလှောင်ခြင်း၏အချက်အလက်ရယူရန်"</string>
- <string name="permdesc_asec_access" msgid="3094563844593878548">"appအား အတွင်းပိုင်း သိုလှောင်ခန်းထဲက အချက်အလက်များကို ရယူခွင့် ပြုသည်။"</string>
+ <string name="permdesc_asec_access" msgid="3094563844593878548">"appအား အတွင်းပိုင်း သိုလှောင်ခန်းထဲက အချက်အလက်များကို ရယူခွင့် ပြုသည်။"</string>
<string name="permlab_asec_create" msgid="6414757234789336327">"စက်တွင်းသိုလှောင်ခြင်း ပြုလုပ်ဖန်တီးရန်"</string>
- <string name="permdesc_asec_create" msgid="4558869273585856876">"appအား အတွင်းပိုင်း သိုလှောင်ခန်းကို ဖန်တီးခွင့် ပြုသည်။"</string>
+ <string name="permdesc_asec_create" msgid="4558869273585856876">"appအား အတွင်းပိုင်း သိုလှောင်ခန်းကို ဖန်တီးခွင့် ပြုသည်။"</string>
<string name="permlab_asec_destroy" msgid="526928328301618022">"စက်တွင်းသိုလှောင်ခြင်းအား ဖျက်စီးရန်"</string>
- <string name="permdesc_asec_destroy" msgid="7218749286145526537">"appအား အတွင်းပိုင်း သိုလှောင်ခန်းကို ဖျက်ပစ်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"appအား အတွင်းပိုင်း သိုလှောင်ခန်းကို ဖျက်ပစ်ခွင့် ပြုသည်။"</string>
<string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"အတွင်းပိုင်း သိုလှောင်ခန်းကို တပ်ဆင်/ဖြုတ်ခြင်း"</string>
- <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"appအား အတွင်းပိုင်း သိုလှောင်ခန်းကို တပ်ဆင်/ဖြုတ်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"appအား အတွင်းပိုင်း သိုလှောင်ခန်းကို တပ်ဆင်/ဖြုတ်ခွင့် ပြုသည်။"</string>
<string name="permlab_asec_rename" msgid="7496633954080472417">"စက်တွင်းသိုလှောင်မှုအားအမည်ပြောင်းခြင်း"</string>
- <string name="permdesc_asec_rename" msgid="1794757588472127675">"appအား အတွင်းပိုင်း သိုလှောင်ခန်းကို အမည်ပြောင်းခွင့် ပြုသည်။"</string>
+ <string name="permdesc_asec_rename" msgid="1794757588472127675">"appအား အတွင်းပိုင်း သိုလှောင်ခန်းကို အမည်ပြောင်းခွင့် ပြုသည်။"</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"တုန်ခုန်မှုအား ထိန်းချုပ်ခြင်း"</string>
- <string name="permdesc_vibrate" msgid="6284989245902300945">"appအား တုန်ခါစက်ကို ထိန်းချုပ်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"appအား တုန်ခါစက်ကို ထိန်းချုပ်ခွင့် ပြုသည်။"</string>
<string name="permlab_flashlight" msgid="2155920810121984215">"ဓါတ်မီးအား ထိန်းသိမ်းရန်"</string>
- <string name="permdesc_flashlight" msgid="6522284794568368310">"appအား ကား ဖလက်ရှမီးကို ထိန်းချုပ်ခွင့် ပြုသည်။"</string>
- <string name="permlab_manageUsb" msgid="1113453430645402723">"USB စက်ပစ္စည်းများအတွက် ကြိုက်နှစ်သက်ရာနှင့်ခွင့်ပြုချက်များကို စီမံရန်"</string>
- <string name="permdesc_manageUsb" msgid="7776155430218239833">"appအား USB ကိရိယာများ၏ နှစ်ခြိုက်မှုများ နှင့် ခွင့်ပြုချက်များကို စီမံခန့်ခွဲခွင့် ပြုသည်။"</string>
+ <string name="permdesc_flashlight" msgid="6522284794568368310">"appအား ကား ဖလက်ရှမီးကို ထိန်းချုပ်ခွင့် ပြုသည်။"</string>
+ <string name="permlab_manageUsb" msgid="1113453430645402723">"USB စက်ပစ္စည်းများအတွက် ကြိုက်နှစ်သက်ရာနှင့်ခွင့်ပြုချက်များကို စီမံရန်"</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"appအား USB ကိရိယာများ၏ နှစ်ခြိုက်မှုများ နှင့် ခွင့်ပြုချက်များကို စီမံခန့်ခွဲခွင့် ပြုသည်။"</string>
<string name="permlab_accessMtp" msgid="4953468676795917042">"MTPပရိုတိုကောအား စတင်ရန်"</string>
- <string name="permdesc_accessMtp" msgid="6532961200486791570">"MTP USBပရိုတိုကော အကောင်အထည်ဖော်ဆောင်ရွက်ရန် kernel MTPဒရိုင်ဘာအား သုံးစွဲခွင့်ပြုမည်။"</string>
+ <string name="permdesc_accessMtp" msgid="6532961200486791570">"MTP USBပရိုတိုကော အကောင်အထည်ဖော်ဆောင်ရွက်ရန် kernel MTPဒရိုင်ဘာအား သုံးစွဲခွင့်ပြုမည်။"</string>
<string name="permlab_hardware_test" msgid="4148290860400659146">"စက်ပစ္စည်းများကိုစမ်းသပ်ခြင်း"</string>
- <string name="permdesc_hardware_test" msgid="6597964191208016605">"appအယဒ ဟာ့ဒ်ဝဲကို စမ်းသပ်ရန် ရည်ရွယ်ချက်ဖြင့် သာမည အစိတ်အပိုင်း အမျိုးမျိုးကို ထိန်းချုပ်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_hardware_test" msgid="6597964191208016605">"appအယဒ ဟာ့ဒ်ဝဲကို စမ်းသပ်ရန် ရည်ရွယ်ချက်ဖြင့် သာမည အစိတ်အပိုင်း အမျိုးမျိုးကို ထိန်းချုပ်ခွင့် ပြုသည်။"</string>
<string name="permlab_fm" msgid="8749504526866832">"FM ရေဒီယိုကို ရယူသုံးရန်"</string>
- <string name="permdesc_fm" msgid="4145699441237962818">"appအား FM ရေဒီယို ဖွင့်လျက် နားထောင်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_fm" msgid="4145699441237962818">"appအား FM ရေဒီယို ဖွင့်လျက် နားထောင်ခွင့် ပြုသည်။"</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"ဖုန်းနံပါတ်များကိုတိုက်ရိုက်ခေါ်ဆိုခြင်း"</string>
<string name="permdesc_callPhone" msgid="3740797576113760827">"အပလီကေးရှင်းအား အလိုအလျောက် ဖုန်းခေါ်ခွင့် ပြုပါ။ မလိုအပ်သော ဖုန်းခ များ ဖြစ်ပေါ်နိုင်ပါသည်။ ဒီခွင့်ပြုခြင်းမှာ အရေးပေါ်ဖုန်းခေါ်ခြင်း မပါဝင်ပါ။ သံသယဖြစ်စရာ အပလီကေးရှင်းများက သင့်မသိပဲ ဖုန်းခေါ်ခြင်းဖြင့် ဖုန်းခ ပိုမိုကျနိုင်ပါသည်။"</string>
- <string name="permlab_callPrivileged" msgid="4198349211108497879">"မည်သည့်ဖုန်းနံပါတ်မဆိုအားတိုက်ရိုက်ခေါ်ဆိုခြင်း"</string>
- <string name="permdesc_callPrivileged" msgid="1689024901509996810">"appအား ဘယ် ဖုန်း နံပါတ်ကိုမဆို၊ အရေးပေါ် နံပါတ်များ အပါအဝင်ကို၊ သင်၏ စွက်ဖက်မှု မပါဘဲ၊ ခေါ်ဆိုခွင့် ပြုသည်။ အကြံအဖန် appများက အရေးပေါ် ဝန်ဆောင်မှုများ ထံသို့ မလိုလားအပ်သော သို့မဟုတ် တရားမဝင်သော ခေါ်ဆိုမှုများ ပြုလုပ်လာနိုင်ကြမည်။"</string>
+ <string name="permlab_callPrivileged" msgid="4198349211108497879">"မည်သည့်ဖုန်းနံပါတ်မဆိုအားတိုက်ရိုက်ခေါ်ဆိုခြင်း"</string>
+ <string name="permdesc_callPrivileged" msgid="1689024901509996810">"appအား ဘယ် ဖုန်း နံပါတ်ကိုမဆို၊ အရေးပေါ် နံပါတ်များ အပါအဝင်ကို၊ သင်၏ စွက်ဖက်မှု မပါဘဲ၊ ခေါ်ဆိုခွင့် ပြုသည်။ အကြံအဖန် appများက အရေးပေါ် ဝန်ဆောင်မှုများ ထံသို့ မလိုလားအပ်သော သို့မဟုတ် တရားမဝင်သော ခေါ်ဆိုမှုများ ပြုလုပ်လာနိုင်ကြမည်။"</string>
<string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"CDMAတက်ပလက်အစသတ်မှတ်ခြင်းကို တိုက်ရိုက်စတင်ရန်"</string>
<string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"CDMAဖုန်း အစသတ်မှတ်ခြင်းကို တိုက်ရိုက်စတင်ရန်"</string>
- <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"appအား CDMA အတွက် စီမံလုပ်ကိုင်မှုကို စတင်ခွင့် ပြုသည်။ ကြံဖန် appများက မလိုအပ်ဘဲနှင့် CDMA အတွက် စီမံလုပ်ကိုင်မှုကို စတင်နိုင်ကြသည်။"</string>
- <string name="permlab_locationUpdates" msgid="7785408253364335740">"တည်နေရာအဆင့်မြှင့်ခြင်းသတိပေးချက်အားထိန်းချုပ်ရန်"</string>
- <string name="permdesc_locationUpdates" msgid="1120741557891438876">"appအား ရေဒီယိုထံမှ တည်နေရာ မွမ်းမံမှု အကြောင်းကြားစာများကို ပိတ်/ဖွင့်ခွင့် ပြုသည်။ သာမန် appများ အသုံးပြုရန် မဟုတ်နိုင်ပါ။"</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"appအား CDMA အတွက် စီမံလုပ်ကိုင်မှုကို စတင်ခွင့် ပြုသည်။ ကြံဖန် appများက မလိုအပ်ဘဲနှင့် CDMA အတွက် စီမံလုပ်ကိုင်မှုကို စတင်နိုင်ကြသည်။"</string>
+ <string name="permlab_locationUpdates" msgid="7785408253364335740">"တည်နေရာအဆင့်မြှင့်ခြင်းသတိပေးချက်အားထိန်းချုပ်ရန်"</string>
+ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"appအား ရေဒီယိုထံမှ တည်နေရာ မွမ်းမံမှု အကြောင်းကြားစာများကို ပိတ်/ဖွင့်ခွင့် ပြုသည်။ သာမန် appများ အသုံးပြုရန် မဟုတ်နိုင်ပါ။"</string>
<string name="permlab_checkinProperties" msgid="7855259461268734914">"ချက်ခ်အင်ဂုဏ်သတ္တိများအား ဝင်ရောက်ချိတ်ဆက်ခြင်း"</string>
- <string name="permdesc_checkinProperties" msgid="4024526968630194128">"appအား စစ်ဆေးရေး ဝန်ဆောင်မှုက အာပ်လုဒ် လုပ်ခဲ့သည့် အရည်အချင်းများကို ရယူသုံးလျက် ရေး/ဖတ် ခွင့် ပြုသည်။ သာမန် appများ သုံးရန် မဟုတ်ပါ။"</string>
+ <string name="permdesc_checkinProperties" msgid="4024526968630194128">"appအား စစ်ဆေးရေး ဝန်ဆောင်မှုက အာပ်လုဒ် လုပ်ခဲ့သည့် အရည်အချင်းများကို ရယူသုံးလျက် ရေး/ဖတ် ခွင့် ပြုသည်။ သာမန် appများ သုံးရန် မဟုတ်ပါ။"</string>
<string name="permlab_bindGadget" msgid="776905339015863471">"ဝဒ်ဂျက်အား ရွေးရန်"</string>
- <string name="permdesc_bindGadget" msgid="8261326938599049290">"appအား မည်သည့် ဝီဂျက်ကို မည်သည့် app သုံးနိုင်ကြောင်းကို စနစ်များ ပြောခွင့် ပေးသည်။ ယင်း ခွင့်ပြုချက်မျိုး ရှိသော appသည် အခြား appများအား ကိုယ်ရေး ဒေတာများကို ရယူသုံးခွင့် ပေးနိုင်သည်။ သာမန် appများ သုံးရန် မဟုတ်ပါ။"</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"appအား မည်သည့် ဝီဂျက်ကို မည်သည့် app သုံးနိုင်ကြောင်းကို စနစ်များ ပြောခွင့် ပေးသည်။ ယင်း ခွင့်ပြုချက်မျိုး ရှိသော appသည် အခြား appများအား ကိုယ်ရေး ဒေတာများကို ရယူသုံးခွင့် ပေးနိုင်သည်။ သာမန် appများ သုံးရန် မဟုတ်ပါ။"</string>
<string name="permlab_modifyPhoneState" msgid="8423923777659292228">"ဖုန်းအခြေအနေအား မွမ်းမံခြင်း"</string>
- <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"appအား ဖုန်း၏ အင်္ဂါရပ်များကို ထိန်းချုပ်ခွင့် ပြုသည်။ ယင်း ခွင့်ပြုချက် ရှိသော appသည် ကွန်ရက်များကို ပြောင်းလဲခြင်း၊ ဖုန်း ရေဒီယိုကို ပိတ်ဖွင့်ခြင်း နှင့် အလားတူများကို သင့်ကို အကြောင်းတောင် မကြားဘဲ ပြုလုပ်နိုင်သည်။"</string>
+ <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"appအား ဖုန်း၏ အင်္ဂါရပ်များကို ထိန်းချုပ်ခွင့် ပြုသည်။ ယင်း ခွင့်ပြုချက် ရှိသော appသည် ကွန်ရက်များကို ပြောင်းလဲခြင်း၊ ဖုန်း ရေဒီယိုကို ပိတ်ဖွင့်ခြင်း နှင့် အလားတူများကို သင့်ကို အကြောင်းတောင် မကြားဘဲ ပြုလုပ်နိုင်သည်။"</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"ဖုန်းရဲ့ အခြေအနေ နှင့် အမှတ်သညာအား ဖတ်ခြင်း"</string>
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"အပလီကေးရှင်းအား ဖုန်းရဲ့ စွမ်းဆောင်ချက်များအား သုံးခွင့်ပြုပါ။ အပလီကေးရှင်းအနေဖြင့် ဖုန်းနံပါတ်၊ စက်နံပါတ်၊ ဖုန်းခေါ်နေမှု ရှိမရှိနှင့် တဖက်မှ ဖုန်းနံပါတ် များအား သိရှိနိုင်ပါသည်"</string>
<string name="permlab_readPrecisePhoneState" msgid="5476483020282007597">"ဖုန်းရဲ့ တိကျသော အခြေအနေအား ဖတ်ရှုခြင်း"</string>
<string name="permdesc_readPrecisePhoneState" msgid="6648009074263855418">"အပလီကေးရှင်းအား ဖုန်းရဲ့ အခြေအနေအတိအကျကို ယူသုံးခွင့် ပြုခြင်း။. ဒီအခွင့်အရေးက အပလီကေးရှင်း ကို ဖုန်းခေါ်ဆိုမှု အခြေအနေ၊ လက်ရှိ ဖုန်းခေါ်နေမှု ရှိမရှိ၊ ဒါမှမဟုတ် နောက်ခံမှာ ဖုန်းခေါ်နေမှု၊ ဖုန်းခေါ်ဆိုအောင်မြင်မှု၊ ဒေတာဆက်သွယ်မှု အခြေအနေ နဲ့ မအောင်မြင်မှု တွေကို သိရှိစေပါသည်။"</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"တက်ပလက်အား ပိတ်ခြင်းမှ ကာကွယ်ခြင်း"</string>
<string name="permlab_wakeLock" product="default" msgid="573480187941496130">"ဖုန်းအနားယူခြင်းမပြုလုပ်စေရန်"</string>
- <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"appအား တက်ဘလက်ကို အနားမယူနိုင်အောင် ဟန့်တားခွင့် ပြုသည်။"</string>
- <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"appအား ဖုန်းကို အနားမယူနိုင်အောင် ဟန့်တားခွင့် ပြုသည်။"</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"appအား တက်ဘလက်ကို အနားမယူနိုင်အောင် ဟန့်တားခွင့် ပြုသည်။"</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"appအား ဖုန်းကို အနားမယူနိုင်အောင် ဟန့်တားခွင့် ပြုသည်။"</string>
<string name="permlab_transmitIr" msgid="7545858504238530105">"အနီအောက်ရောင်ခြည် ထုတ်လွှတ်ခြင်း"</string>
<string name="permdesc_transmitIr" product="tablet" msgid="5358308854306529170">"အပလီကေးရှင်းအား တက်ဘလက်ရဲ့ အနီအောက်ရောင်ခြည် ထုတ်လွှတ်ခြင်းအား သုံးခွင့်ပေးခြင်း"</string>
<string name="permdesc_transmitIr" product="default" msgid="7957763745020300725">"အပလီကေးရှင်းအား ဖုန်းရဲ့ အနီအောက်ရောင်ခြည် ထုတ်လွှတ်ခြင်းအား သုံးခွင့်ပေးခြင်း"</string>
- <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"တက်ဘလက် အဖွင့်အပိတ်"</string>
- <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"ဖုန်းဖွင့် (သို့)ပိတ်"</string>
- <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"appအား တက်ဘလက်ကို ဖွင့် သို့မဟုတ် ပိတ်ခွင့် ပြုသည်။"</string>
- <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"appအား ဖုန်းကို ဖွင့် သို့မဟုတ် ပိတ်ခွင့် ပြုသည်။"</string>
+ <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"တက်ဘလက် အဖွင့်အပိတ်"</string>
+ <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"ဖုန်းဖွင့် (သို့)ပိတ်"</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"appအား တက်ဘလက်ကို ဖွင့် သို့မဟုတ် ပိတ်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"appအား ဖုန်းကို ဖွင့် သို့မဟုတ် ပိတ်ခွင့် ပြုသည်။"</string>
<string name="permlab_userActivity" msgid="1677844893921729548">"မျက်နှာပြင်မှိန်ချိန် ပြန်ညှိရန်"</string>
<string name="permdesc_userActivity" msgid="651746160252248024">"မျက်နှာပြင်မှိန်ချိန် ပြန်ညှိရန် app ကိုခွင့်ပြုပါ။"</string>
- <string name="permlab_factoryTest" msgid="3715225492696416187">"စက်ရုံစမ်းသပ်စနစ်ဖြင့် အလုပ်လုပ်ဆောင်စေရန်"</string>
- <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"ထုတ်လုပ်သူ၏အနိမ့်စားအဆင့်စမ်းသပ်မှုအနေဖြင့်လုပ်ဆောင်စေမည် တက်ပလက်စက်အား လုံးဝဝင်ရောက်ကြည့်ရှုရန်ခွင့်ပြုမည်။ တက်ပလက်မှာ ထုတ်လုပ်သူ၏စမ်းသပ်မှုစနစ်ဖြင့် လုပ်ဆောင်နေစဥ်သာ ရရှိမည်။"</string>
- <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"ထုတ်လုပ်သူ၏အနိမ့်စားအဆင့်စမ်းသပ်မှုအနေဖြင့်လုပ်ဆောင်စေမည် ဖုန်းစက်အား လုံးဝဝင်ရောက်ကြည့်ရှုရန်ခွင့်ပြုမည် ဖုန်းမှာ ထုတ်လုပ်သူ၏စမ်းသပ်မှုစနစ်ဖြင့် လုပ်ဆောင်နေစဥ်သာ ရရှိမည်"</string>
+ <string name="permlab_factoryTest" msgid="3715225492696416187">"စက်ရုံစမ်းသပ်စနစ်ဖြင့် အလုပ်လုပ်ဆောင်စေရန်"</string>
+ <string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"ထုတ်လုပ်သူ၏အနိမ့်စားအဆင့်စမ်းသပ်မှုအနေဖြင့်လုပ်ဆောင်စေမည် တက်ပလက်စက်အား လုံးဝဝင်ရောက်ကြည့်ရှုရန်ခွင့်ပြုမည်။ တက်ပလက်မှာ ထုတ်လုပ်သူ၏စမ်းသပ်မှုစနစ်ဖြင့် လုပ်ဆောင်နေစဥ်သာ ရရှိမည်။"</string>
+ <string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"ထုတ်လုပ်သူ၏အနိမ့်စားအဆင့်စမ်းသပ်မှုအနေဖြင့်လုပ်ဆောင်စေမည် ဖုန်းစက်အား လုံးဝဝင်ရောက်ကြည့်ရှုရန်ခွင့်ပြုမည် ဖုန်းမှာ ထုတ်လုပ်သူ၏စမ်းသပ်မှုစနစ်ဖြင့် လုပ်ဆောင်နေစဥ်သာ ရရှိမည်"</string>
<string name="permlab_setWallpaper" msgid="6627192333373465143">"နောက်ခံအား သတ်မှတ်ရန်"</string>
- <string name="permdesc_setWallpaper" msgid="7373447920977624745">"appအား စနစ် နောက်ခံပုံကို သတ်မှတ်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"appအား စနစ် နောက်ခံပုံကို သတ်မှတ်ခွင့် ပြုသည်။"</string>
<string name="permlab_setWallpaperHints" msgid="3278608165977736538">"နောက်ခံပုံအား အရွယ်အစားပြောင်းရန်"</string>
- <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"appအား စနစ် နောက်ခံပုံ ဆိုက်ဆိုင်ရာ ညွှန်းချက်များကို သတ်မှတ်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"appအား စနစ် နောက်ခံပုံ ဆိုက်ဆိုင်ရာ ညွှန်းချက်များကို သတ်မှတ်ခွင့် ပြုသည်။"</string>
<string name="permlab_masterClear" msgid="2315750423139697397">"စနစ်အား မူလစက်ရုံအခြအေနေထံ ပြန်လည်သတ်မှတ်ရန်"</string>
- <string name="permdesc_masterClear" msgid="3665380492633910226">"appအား စနစ်ကို စက်ရုံအတိုင်း လုံးဝ ပြန်ညှိခြင်း၊ ဒေတာများ၊ စီစင်ဖွဲ့စည်းမှု နှင့် တပ်ဆင်ပြီး appများ အားလုံးကို ဖျက်ပစ်ခြင်း လုပ်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_masterClear" msgid="3665380492633910226">"appအား စနစ်ကို စက်ရုံအတိုင်း လုံးဝ ပြန်ညှိခြင်း၊ ဒေတာများ၊ စီစင်ဖွဲ့စည်းမှု နှင့် တပ်ဆင်ပြီး appများ အားလုံးကို ဖျက်ပစ်ခြင်း လုပ်ခွင့် ပြုသည်။"</string>
<string name="permlab_setTime" msgid="2021614829591775646">"အချိန်သတ်မှတ်ရန်"</string>
- <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"appအား တက်ဘလက်၏ နာရီ အချိန်ကို ပြောင်းလဲခွင့် ပြုသည်။"</string>
- <string name="permdesc_setTime" product="default" msgid="1855702730738020">"appအား ဖုန်း၏ နာရီ အချိန်ကို ပြောင်းလဲခွင့် ပြုသည်။"</string>
+ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"appအား တက်ဘလက်၏ နာရီ အချိန်ကို ပြောင်းလဲခွင့် ပြုသည်။"</string>
+ <string name="permdesc_setTime" product="default" msgid="1855702730738020">"appအား ဖုန်း၏ နာရီ အချိန်ကို ပြောင်းလဲခွင့် ပြုသည်။"</string>
<string name="permlab_setTimeZone" msgid="2945079801013077340">"အချိန်ဇုန်းအား သတ်မှတ်ခြင်း"</string>
- <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"appအား တက်ဘလက်၏ နာရီ ဇုန်ကို ပြောင်းလဲခွင့် ပြုသည်။"</string>
- <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"appအား ဖုန်း၏ နာရီ ဇုန်ကို ပြောင်းလဲခွင့် ပြုသည်။"</string>
- <string name="permlab_accountManagerService" msgid="4829262349691386986">"AccountManagerServiceအနေဖြင့်ပြုမူရန်"</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"appအား တက်ဘလက်၏ နာရီ ဇုန်ကို ပြောင်းလဲခွင့် ပြုသည်။"</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"appအား ဖုန်း၏ နာရီ ဇုန်ကို ပြောင်းလဲခွင့် ပြုသည်။"</string>
+ <string name="permlab_accountManagerService" msgid="4829262349691386986">"AccountManagerServiceအနေဖြင့်ပြုမူရန်"</string>
<string name="permdesc_accountManagerService" msgid="1948455552333615954">"အပလီကေးရှင်းအား အကောင့် စစ်ဆေးသော အရာများအား ဖုန်းခေါ်ခွင့်ပြုပါ"</string>
<string name="permlab_getAccounts" msgid="1086795467760122114">"စက်ပေါ်မှာ အကောင့်များ ရှာဖွေခြင်း"</string>
<string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"အပလီကေးရှင်းအား တက်ဘလက်မှ သိရှိထားသော အကောင့်များအား ရယူခွင့်ပေးပါ။ ဒီထဲတွင် သင် ထည့်သွင်းထားသော အပလီကေးရှင်းများမှတဆင့် ပြုလုပ်ထားသော အကောင့်များပါ ပါဝင်နိုင်ပါသည်။"</string>
<string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"အပလီကေးရှင်းအား ဖုန်းမှ သိရှိထားသော အကောင့်စာရင်းများအား ရယူခွင့်ပေးပါ။ ဒီထဲတွင် သင် ထည့်သွင်းထားသော အပလီကေးရှင်းများမှတဆင့် ပြုလုပ်ထားသော အကောင့်များပါ ပါဝင်နိုင်ပါသည်။"</string>
<string name="permlab_authenticateAccounts" msgid="5265908481172736933">"အကောင့်များ ဖန်တီးရန်နှင့် စကားဝှက်များ ရွေးချယ်ရန်"</string>
- <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"appအား အကောင့် မန်နေဂျာ၏ အကောင့် စိစစ်ရေး လုပ်နိုင်စွမ်းများကို၊ အကောင့်များ ဖန်တီးခြင်း နှင့် ၎င်းတို့၏ စကားဝှက်များကို ရယူခြင်း နှင့် သတ်မှတ်ခြင်း အပါအဝင်ကို၊ အသုံးချခွင့် ပြုသည်။"</string>
+ <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"appအား အကောင့် မန်နေဂျာ၏ အကောင့် စိစစ်ရေး လုပ်နိုင်စွမ်းများကို၊ အကောင့်များ ဖန်တီးခြင်း နှင့် ၎င်းတို့၏ စကားဝှက်များကို ရယူခြင်း နှင့် သတ်မှတ်ခြင်း အပါအဝင်ကို၊ အသုံးချခွင့် ပြုသည်။"</string>
<string name="permlab_manageAccounts" msgid="4983126304757177305">"အကောင့်များအား ထည့် သို့ ထုတ်ပါ"</string>
- <string name="permdesc_manageAccounts" msgid="8698295625488292506">"appအား အကောင့်များ ထည့်ခြင်း နှင့် ဖယ်ရှားခြင်း နှင့် ၎င်းတို့၏ စကားဝှက်များကို ဖျက်ခြင်းလို လုပ်ရပ်များကို လုပ်ကိုင်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"appအား အကောင့်များ ထည့်ခြင်း နှင့် ဖယ်ရှားခြင်း နှင့် ၎င်းတို့၏ စကားဝှက်များကို ဖျက်ခြင်းလို လုပ်ရပ်များကို လုပ်ကိုင်ခွင့် ပြုသည်။"</string>
<string name="permlab_useCredentials" msgid="235481396163877642">"စက်ပေါ်ရှိ သုံးစွဲသူအကောင့်များ"</string>
- <string name="permdesc_useCredentials" msgid="7984227147403346422">"appအား အထောက်အထား စိစစ်ရေး တိုကင်များကို တောင်းဆိုခွင့် ပြုသည်။"</string>
+ <string name="permdesc_useCredentials" msgid="7984227147403346422">"appအား အထောက်အထား စိစစ်ရေး တိုကင်များကို တောင်းဆိုခွင့် ပြုသည်။"</string>
<string name="permlab_accessNetworkState" msgid="4951027964348974773">"ကွန်ရက် ချိတ်ဆက်မှုများအား ကြည့်ရန်"</string>
<string name="permdesc_accessNetworkState" msgid="8318964424675960975">"အပလီကေးရှင်းအား မည်သည့်ကွန်ရက်နက်ဝဘ်ရှိသလဲ၊ မည်သည့်ကွန်ရက်နှင့် ချိတ်ဆက်ထားလဲ စသည်ဖြင့် ကွန်ရက်ချိတ်ဆက်မှုများ၏ သတင်းအချက်အလက်များကို ကြည့်ခွင့်ပေးရန်"</string>
<string name="permlab_createNetworkSockets" msgid="8018758136404323658">"အပြည့်အ၀ ကွန်ရက်သုံးခွင့်ရရန်"</string>
<string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"အပလီကေးရှင်းအား ကွန်ရက်ဆော့ကတ်များ တည်ဆောက်ခွင့်၊ တသီးတသန့် ကွန်ရက် ပရိုတိုကောလ်များ သုံးခွင့် ပြုပါ။ အင်တာနက်မှ အချက်အလက်များ ပေးပို့ခြင်းကို ဘရောက်ဇာနှင့် တခြား အပလီကေးရှင်းများက လုပ်ဆောင်ပေးသောကြောင့် ဒီခွင့်ပြုချက်က အင်တာနက်မှ အချက်အလက် ပေးပို့ခြင်း မလိုအပ်ပါ"</string>
- <string name="permlab_writeApnSettings" msgid="505660159675751896">"ကွန်ယက်အပြင်အဆင်နှင့် အသွားအလာများကို ပြောင်းလဲ/ကြားဖြတ်စေခြင်း"</string>
- <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"appအား ကွန်ရက် ဆက်တင်များကို ပြောင်းလဲလျက် ကွန်ရက် ဆက်သွယ်မှုများ အားလုံးကို ကြားဖြတ်ယူခြင်း နှင့် စုံစမ်းစစ်ဆေးခြင်း၊ ဥပမာ၊ မည်သည့် APN ၏ ပရော့က်စီ နှင့် ပို့တ်များကို ပြောင်းလဲခြင်း၊ ပြုလုပ်ခွင့် ပြုသည်။ ကြံဖန် appများက သင် မသိရဘဲနှင့် ကွန်ရက် အထုပ်များကို စောင့်ကြည့်ခြင်း၊ အခြားသို့ ညွှန်းပို့ခြင်း၊ သို့မဟုတ် မွမ်းမံခြင်းကို ပြုလုပ်နိုင်သည်။"</string>
+ <string name="permlab_writeApnSettings" msgid="505660159675751896">"ကွန်ယက်အပြင်အဆင်နှင့် အသွားအလာများကို ပြောင်းလဲ/ကြားဖြတ်စေခြင်း"</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"appအား ကွန်ရက် ဆက်တင်များကို ပြောင်းလဲလျက် ကွန်ရက် ဆက်သွယ်မှုများ အားလုံးကို ကြားဖြတ်ယူခြင်း နှင့် စုံစမ်းစစ်ဆေးခြင်း၊ ဥပမာ၊ မည်သည့် APN ၏ ပရော့က်စီ နှင့် ပို့တ်များကို ပြောင်းလဲခြင်း၊ ပြုလုပ်ခွင့် ပြုသည်။ ကြံဖန် appများက သင် မသိရဘဲနှင့် ကွန်ရက် အထုပ်များကို စောင့်ကြည့်ခြင်း၊ အခြားသို့ ညွှန်းပို့ခြင်း၊ သို့မဟုတ် မွမ်းမံခြင်းကို ပြုလုပ်နိုင်သည်။"</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"ကွန်ယက်ဆက်သွယ်မှုအားပြောင်းခြင်း"</string>
- <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"appအား ကွန်ရက် ချိတ်ဆက်နိုင်စွမ်း အခြေအနေကို ပြောင်းလဲခွင့် ပြုသည်။"</string>
- <string name="permlab_changeTetherState" msgid="5952584964373017960">"တစ်ဆင့်ပွါးဆက်သွယ်မှုအားပြောင်းခြင်း"</string>
- <string name="permdesc_changeTetherState" msgid="1524441344412319780">"appအား ချိတ်တွဲထားသည့် ကွန်ရက် ချိတ်ဆက်နိုင်စွမ်း အခြေအနေကို ပြောင်းလဲခွင့် ပြုသည်။"</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"appအား ကွန်ရက် ချိတ်ဆက်နိုင်စွမ်း အခြေအနေကို ပြောင်းလဲခွင့် ပြုသည်။"</string>
+ <string name="permlab_changeTetherState" msgid="5952584964373017960">"တစ်ဆင့်ပွါးဆက်သွယ်မှုအားပြောင်းခြင်း"</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"appအား ချိတ်တွဲထားသည့် ကွန်ရက် ချိတ်ဆက်နိုင်စွမ်း အခြေအနေကို ပြောင်းလဲခွင့် ပြုသည်။"</string>
<string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"နောက်ခံဒေတာအသုံးပြုခြင်းဆက်တင်အား ပြောင်းခြင်း"</string>
- <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"appအား နောက်ခံ ဒေတာ သုံးစွဲမှု ဆက်တင်ကို ပြောင်းလဲခွင့် ပြုသည်။"</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"appအား နောက်ခံ ဒေတာ သုံးစွဲမှု ဆက်တင်ကို ပြောင်းလဲခွင့် ပြုသည်။"</string>
<string name="permlab_accessWifiState" msgid="5202012949247040011">"ဝိုင်ဖိုင် ချိတ်ဆက်မှများအား ကြည့်ရန်"</string>
<string name="permdesc_accessWifiState" msgid="5002798077387803726">"အပလီကေးရှင်းအား ဝိုင်ဖိုင် ဖွင့်ထား မထား၊ ချိတ်ဆက်ထားသော ပိုင်ဖိုင် စက်ပစ္စည်း စသဖြင့် ဝိုင်ဖိုင်နှင့် သက်ဆိုင်သော အချက်အလက် ကြည့်ခွင့်ပေးရန်"</string>
<string name="permlab_changeWifiState" msgid="6550641188749128035">"ဝိုင်ဖိုင်အား ချိတ်ဆက်ရန် နှင့် ဆက်သွယ်မှု ဖြတ်တောက်ရန်"</string>
<string name="permdesc_changeWifiState" msgid="7137950297386127533">"အပလီကေးရှင်းအား ဝိုင်ဖိုင်တည်နေရာများအား ဆက်သွယ်ခြင်း၊ ဆက်သွယ်မှု ရပ်ဆိုင်းခြင်း၊ ဝိုင်ဖိုင်ကွန်ရက်အတွက် စက်အပြင်အဆင်များ ပြုလုပ်ခြင်း ခွင့်ပြုပါ"</string>
- <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Wi-Fi Multicastလက်ခံခြင်းကိုခွင့်ပြုရန်"</string>
+ <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Wi-Fi Multicastလက်ခံခြင်းကိုခွင့်ပြုရန်"</string>
<string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"အပလီကေးရှင်းအား ဝိုင်ဖိုင်ကွန်ရက်ပေါ်တွင် သင့်တက်ဘလက်တစ်ခုထဲအားမဟုတ်ပဲ multicast လိပ်စာအား သုံးပြီး လွှင့်ထုတ်သော အချက်အလက်များ လက်ခံခွင့် ပြုပါ။ ဒီလိုသုံးခြင်းမှာ non-multicast ထက် ဘက်ထရီ ပိုကုန်ပါသည်။"</string>
<string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"အပလီကေးရှင်းအား ဝိုင်ဖိုင်နက်ဘ်ပေါ်တွင် သင့်ဖုန်းတစ်ခုထဲအားမဟုတ်ပဲ multicast လိပ်စာအား သုံးပြီး လွှင့်ထုတ်သော အချက်အလက်များ လက်ခံခွင့် ပြုပါ။ ဒီလိုသုံးခြင်းမှာ non-multicast ထက် ဘက်ထရီ ပိုကုန်ပါသည်။"</string>
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"ဘလူးတု ဆက်တင်များအား သုံးခွင့်ပေးရန်"</string>
- <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"appအား ဒေသန္တရ ဘလူးတုသ် တက်ဘလက်ကို စီစဉ်ဖွဲ့စည်းခွင့်ကို၎င်း၊ အဝေးထိန်း ကိရိယာများကို ရှာကြံလျက် ချိတ်တွဲခွင့်ကို၎င်း ပေးထားသည်။"</string>
- <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"appအား ဒေသန္တရ ဘလူးတုသ် ဖုန်းကို စီစဉ်ဖွဲ့စည်းခွင့်ကို၎င်း၊ အဝေးထိန်း ကိရိယာများကို ရှာကြံလျက် ချိတ်တွဲခွင့်ကို၎င်း ပေးထားသည်။"</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"appအား ဒေသန္တရ ဘလူးတုသ် တက်ဘလက်ကို စီစဉ်ဖွဲ့စည်းခွင့်ကို၎င်း၊ အဝေးထိန်း ကိရိယာများကို ရှာကြံလျက် ချိတ်တွဲခွင့်ကို၎င်း ပေးထားသည်။"</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"appအား ဒေသန္တရ ဘလူးတုသ် ဖုန်းကို စီစဉ်ဖွဲ့စည်းခွင့်ကို၎င်း၊ အဝေးထိန်း ကိရိယာများကို ရှာကြံလျက် ချိတ်တွဲခွင့်ကို၎င်း ပေးထားသည်။"</string>
<string name="permlab_bluetoothPriv" msgid="4009494246009513828">"အပလီကေးရှင်းသုံးပြီး ဘလူးတုသ်နှင့် ပူးတွဲချိတ်ဆက်ခြင်း အား ခွင့်ပြုရန်"</string>
<string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"အပလီကေးရှင်းကို အဝေးက စက်များနဲ့ ကိုင်ထားသူ မလုပ်ဆောင်ပဲ ပူးတွဲခွင့်ပေးခြင်း"</string>
<string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"အပလီကေးရှင်းကို အဝေးက စက်များနဲ့ ကိုင်ထားသူ မလုပ်ဆောင်ပဲ ပူးတွဲခွင့်ပေးခြင်း"</string>
<string name="permlab_bluetoothMap" msgid="6372198338939197349">"ဘလူးတုသ် MAP ဒေတာကို ရယူသုံးရန်"</string>
- <string name="permdesc_bluetoothMap" product="tablet" msgid="5784090105926959958">"appအား ဘလူးတုသ် MAP ဒေတာကို ရယူသုံးခွင့် ပြုသည်။"</string>
- <string name="permdesc_bluetoothMap" product="default" msgid="5784090105926959958">"appအား ဘလူးတုသ် MAP ဒေတာကို ရယူသုံးခွင့် ပြုသည်။"</string>
+ <string name="permdesc_bluetoothMap" product="tablet" msgid="5784090105926959958">"appအား ဘလူးတုသ် MAP ဒေတာကို ရယူသုံးခွင့် ပြုသည်။"</string>
+ <string name="permdesc_bluetoothMap" product="default" msgid="5784090105926959958">"appအား ဘလူးတုသ် MAP ဒေတာကို ရယူသုံးခွင့် ပြုသည်။"</string>
<string name="permlab_accessWimaxState" msgid="4195907010610205703">"ဝိုင်မက်စ် နှင့် ချိတ်ဆက်ရန်နှင့် ဆက်သွယ်မှု ဖြတ်တောက်ရန်"</string>
<string name="permdesc_accessWimaxState" msgid="6360102877261978887">"အပလီကေးရှင်းအား ဝိုင်မက်စ် အခြေအနေ ကြည့်ခွင့်ပေးရန် ဥပမာ ဝိုင်မက်စ် ဖွင့်ထား မထား၊ ဝိုင်မက်စ် ချိတ်ဆက်ထားသော ကွန်ရက်အခြေအနေ"</string>
<string name="permlab_changeWimaxState" msgid="2405042267131496579">"ဝိုက်မက်စ် အခြေအနေအား ပြင်ရန်"</string>
<string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"အပလီကေးရှင်းအား တက်ဘလက်ကို ဝိုင်မက်စ် ကွန်ရက်များနဲ့ ဆက်သွယ်ခြင်း၊ ဆက်သွယ်မှု ရပ်ဆိုင်းခြင်းများ လုပ်ခွင့်ပြုပါ"</string>
<string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"အပလီကေးရှင်းအား ဖုန်းကို ဝိုင်မက်စ် ကွန်ရက်များနဲ့ ဆက်သွယ်ခြင်း၊ ဆက်သွယ်မှု ရပ်ဆိုင်းခြင်းများ လုပ်ခွင့်ပြုပါ"</string>
<string name="permlab_scoreNetworks" msgid="6445777779383587181">"ကွန်ရက်များကို အမှတ်ပေးခြင်း"</string>
- <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"appအား ကွန်ရက်များကို အဆင့်အတန်း သတ်မှတ်ခွင့် ပြုကာ တက်ဘလက် အနေနှင့် မည်သည့် ကွန်ရက်ကို ပိုနှစ်ခြိုက်သင့်ကြောင်းကို ဆုံးဖြတ်စေနိုင်သည်။"</string>
- <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"appအား ကွန်ရက်များကို အဆင့်အတန်း သတ်မှတ်ခွင့် ပြုကာ ဖုန်း အနေနှင့် မည်သည့် ကွန်ရက်ကို ပိုနှစ်ခြိုက်သင့်ကြောင်းကို ဆုံးဖြတ်စေနိုင်သည်။"</string>
+ <string name="permdesc_scoreNetworks" product="tablet" msgid="1304304745850215556">"appအား ကွန်ရက်များကို အဆင့်အတန်း သတ်မှတ်ခွင့် ပြုကာ တက်ဘလက် အနေနှင့် မည်သည့် ကွန်ရက်ကို ပိုနှစ်ခြိုက်သင့်ကြောင်းကို ဆုံးဖြတ်စေနိုင်သည်။"</string>
+ <string name="permdesc_scoreNetworks" product="default" msgid="1831501848178651379">"appအား ကွန်ရက်များကို အဆင့်အတန်း သတ်မှတ်ခွင့် ပြုကာ ဖုန်း အနေနှင့် မည်သည့် ကွန်ရက်ကို ပိုနှစ်ခြိုက်သင့်ကြောင်းကို ဆုံးဖြတ်စေနိုင်သည်။"</string>
<string name="permlab_bluetooth" msgid="6127769336339276828">"ဘလူးတု စက်များနှင့် အတူတွဲချိတ်ရန်"</string>
<string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"အပလီကေးရှင်းအား တက်ဘလက်ပေါ်မှ ဘလူးတုသ် အပြင်အဆင်အား ကြည့်ခွင့်၊ တခြားစက်များနဲ့ ဆက်သွယ်ခြင်း၊ ဆက်သွယ်ခြင်းကို လက်ခံခွင့်ပြုပါ။"</string>
<string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"အပလီကေးရှင်းအား ဖုန်းမှဘလူးတု အပြင်အဆင်အား ကြည့်ခွင့်၊ တခြားစက်များနဲ့ ဆက်သွယ်ခြင်း၊ ဆက်သွယ်ခြင်းကို လက်ခံခွင့်ပြုပါ။"</string>
<string name="permlab_nfc" msgid="4423351274757876953">"Near Field Communicationအား ထိန်းချုပ်ရန်"</string>
- <string name="permdesc_nfc" msgid="7120611819401789907">"appအား တာတို စက်ကွင်း ဆက်သွယ်ရေး (NFC) တဲဂ်များ၊ ကဒ်များ နှင့် ဖတ်ကြသူတို့နှင့် ဆက်သွယ်ပြောဆိုခွင့် ပြုသည်။"</string>
+ <string name="permdesc_nfc" msgid="7120611819401789907">"appအား တာတို စက်ကွင်း ဆက်သွယ်ရေး (NFC) တဲဂ်များ၊ ကဒ်များ နှင့် ဖတ်ကြသူတို့နှင့် ဆက်သွယ်ပြောဆိုခွင့် ပြုသည်။"</string>
<string name="permlab_disableKeyguard" msgid="3598496301486439258">"ဖန်သားပြင် သော့ချခြင်းအား မလုပ်နိုင်အောင် ပိတ်ရန်"</string>
<string name="permdesc_disableKeyguard" msgid="6034203065077122992">"အပလီကေးရှင်းအား သော့ချခြင်းနှင့် သက်ဆိုင်ရာ စကားဝှက်သတ်မှတ်ခြင်းများအား မသုံးနိုင်အောင် ပိတ်ခြင်းကို ခွင့်ပြုရန်။ ဥပမာ ဖုန်းလာလျှင် သော့ပိတ်ခြင်း ပယ်ဖျက်ခြင်း၊ ဖုန်းပြောပြီးလျှင် သော့ကို အလိုအလျောက် ပြန်ပိတ်ခြင်း"</string>
<string name="permlab_readSyncSettings" msgid="6201810008230503052">"ထပ်တူပြုအဆင်အပြင်အားဖတ်ခြင်း"</string>
@@ -690,42 +690,42 @@
<string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"အကောင့်တစ်ခုအတွက် ထပ်တူညီအောင်လုပ်သော ဆက်တင်များကို ပြင်ရန် အပလီကေးရှင်းကို ခွင့်ပြုရန်။ ဥပမာ People အပလီကေးရှင်း က အကောင့်တစ်ခုနှင့် ထပ်တူညီအောင် လုပ်ဆောင်ခြင်းအား ဖွင့်ရန် သုံးနိုင်သည်။"</string>
<string name="permlab_readSyncStats" msgid="7396577451360202448">"ထပ်တူကူးခြင်း ကိန်းဂဏန်းအချက်အလက်များကို ဖတ်ခြင်း"</string>
<string name="permdesc_readSyncStats" msgid="1510143761757606156">"အပလီကေးရှင်းအား အကောင့်တစ်ခု၏ ထပ်တူညီအောင် လုပ်ဆောင်မှု အခြေအနေ (ပြီးခဲ့သော အဖြစ်အပျက်၊ ဒေတာ ပမာဏ ပါဝင်မှု များအပါအဝင်)ကို ဖတ်ရှုခွင့် ပြုပါ။"</string>
- <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"အမည်သွင်းထားသောဖိဖ့်များကို ဖတ်ခြင်း"</string>
- <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"appအား လောလောဆယ် စင့်က် လုပ်ပြီးသား ထည့်သွင်းမှုများ ဆိုင်ရာ အသေးစိတ်များကို ရယူခွင့်ပြုသည်။"</string>
- <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"အမည်သွင်းထားသောဖိဖ့်များကို ရေးခြင်း"</string>
- <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"appအား လောလောဆယ် စင့်က် လုပ်ပြီးသား ထည့်သွင်းမှုများကို မွမ်းမံခွင့် ပြုသည်။ ကြံဖန် appများက သင်၏ စင့်က် လုပ်ပြီးသား ထည့်သွင်းမှုများကို ပြောင်းပစ်နိုင်သည်။"</string>
+ <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"အမည်သွင်းထားသောဖိဖ့်များကို ဖတ်ခြင်း"</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"appအား လောလောဆယ် စင့်က် လုပ်ပြီးသား ထည့်သွင်းမှုများ ဆိုင်ရာ အသေးစိတ်များကို ရယူခွင့်ပြုသည်။"</string>
+ <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"အမည်သွင်းထားသောဖိဖ့်များကို ရေးခြင်း"</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"appအား လောလောဆယ် စင့်က် လုပ်ပြီးသား ထည့်သွင်းမှုများကို မွမ်းမံခွင့် ပြုသည်။ ကြံဖန် appများက သင်၏ စင့်က် လုပ်ပြီးသား ထည့်သွင်းမှုများကို ပြောင်းပစ်နိုင်သည်။"</string>
<string name="permlab_readDictionary" msgid="4107101525746035718">"အဘိဓာန်သို့ သင့် ထည့်ထားသည်များအား ဖတ်ခြင်း"</string>
<string name="permdesc_readDictionary" msgid="659614600338904243">"အပလီကေးရှင်းအား အဘိဓာန်တွင် သိမ်းဆည်းထားသော စာလုံးအားလုံး၊ နာမည်များနှင့် စာစုများ ဖတ်ရှုခွင့် ပြုရန်"</string>
<string name="permlab_writeDictionary" msgid="2183110402314441106">"သုံးစွဲသူ၏ အဘိဓာန် ထဲသို့ စာလုံးများ ထည့်ခြင်း"</string>
- <string name="permdesc_writeDictionary" msgid="8185385716255065291">"အသုံးပြုသူ အဘိဓာန်ထဲသို့ စာလုံး အသစ်များကို ရေးခွင့် ပြုသည်။"</string>
+ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"အသုံးပြုသူ အဘိဓာန်ထဲသို့ စာလုံး အသစ်များကို ရေးခွင့် ပြုသည်။"</string>
<string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"USB သိုလှောင်မှုမှ အချက်အလက်များအား ဖတ်ခြင်း"</string>
<string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"SD ကဒ်မှ အချက်အလက်များအား ဖတ်ခြင်း"</string>
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"အပလီကေးရှင်းအား USB သိုလှောင်မှုပေါ်မှ ဒေတာများ ဖတ်ရှုခွင့်ပြုခြင်း"</string>
<string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"အပလီကေးရှင်းအား အက်စ်ဒီ ကဒ်ပေါ်မှ ဒေတာများ ဖတ်ရှုခွင့်ပြုခြင်း"</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USBမှဒေတာအား ပြင် သို့ ဖျက်ရန်"</string>
<string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD ကဒ်ပေါ်မှ အချက်အလက်များအား ပြင်ဆင်ခြင်း သို့ ဖျက်ပစ်ခြင်း"</string>
- <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"appအား USB သိုလှောင်ခန်းသို့ ရေးခွင့် ပြုသည်။"</string>
- <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"appအား SD ကဒ်သို့ ရေးခွင့် ပြုသည်။"</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"appအား USB သိုလှောင်ခန်းသို့ ရေးခွင့် ပြုသည်။"</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"appအား SD ကဒ်သို့ ရေးခွင့် ပြုသည်။"</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"စက်တွင်းမီဒီယာသိမ်းဆည်းမှုအကြောင်းအရာများကို မွမ်းမံ/ပယ်ဖျက်ရန်"</string>
- <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"appအား အတွင်းပိုင်း မီဒီယာ သိုလှော်ခန်း အကြေင်းအရာများကို မွမ်းမံခွင့် ပြုသည်။"</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"appအား အတွင်းပိုင်း မီဒီယာ သိုလှော်ခန်း အကြေင်းအရာများကို မွမ်းမံခွင့် ပြုသည်။"</string>
<string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"စာရွက်စာတန်းများ သိုလှောင်မှုကို ထိန်းသိမ်းခြင်း"</string>
<string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"အပလီကေးရှင်းအား စာရွက်စာတမ်းများအား ထိန်းချုပ်ခွင့်ပေးခြင်း"</string>
<string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"အသုံးပြုသူ အားလုံး၏ ပြင်ပသိုလှောင်ရာအား အသုံးပြုရန်"</string>
<string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"အပလီကေးရှင်းအား သုံးစွဲသူ အားလုံးအတွက် ပြင်ပသိမ်းဆည်မှုအား သုံးခွင့် ပြုပါ။"</string>
<string name="permlab_cache_filesystem" msgid="5656487264819669824">"cache ဖိုင်စနစ်အား ဝင်ရောက်ချိတ်ဆက်ခြင်း"</string>
- <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"appအား ဖိုင်စနစ်၏ကက်ရှကို ဖတ် နှင့် ရေး ခွင့်ပြုသည်။"</string>
+ <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"appအား ဖိုင်စနစ်၏ကက်ရှကို ဖတ် နှင့် ရေး ခွင့်ပြုသည်။"</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"SIP ခေါ်ဆိုမှုများ ခေါ်ရန်/လက်ခံရန်"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"SIP ခေါ်ဆိုမှုများ ခေါ်ရန်နှင့် လက်ခံနိုင်ရန် app ကို ခွင့်ပြုပါ။"</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"ခေါ်ဆိုမှု-အဝင် မျက်နှာပြင်နဲ့ တုံ့ပြန်လုပ်ကိုင်ရန်"</string>
<string name="permdesc_bind_incall_service" msgid="8343471381323215005">"appအား အသုံးပြုသူက ခေါ်ဆိုမှုအဝင် မျက်နှာပြင် ဘယ်အချိန်မှာ ဘယ်လို မြင်ရမှာကို ထိန်းချုပ်ခွင့်ပေးရန်"</string>
- <string name="permlab_bind_connection_service" msgid="3557341439297014940">"တယ်လီဖုန်း ဝန်ဆောင်မှုများနှင့် အပြန်အလှန် တုံ့ပြန်မှု"</string>
- <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"appအား ခေါ်ဆိုမှုများ လုပ်ခြင်း/လက်ခံခြင်း ပြုလုပ်နိုင်ရန် တယ်လီဖုန်း ဝန်ဆောင်မှုများနှင့် အပြန်အလှန် တုံ့ပြန်မှုကို ခွင့်ပြုသည်။"</string>
+ <string name="permlab_bind_connection_service" msgid="3557341439297014940">"တယ်လီဖုန်း ဝန်ဆောင်မှုများနှင့် အပြန်အလှန် တုံ့ပြန်မှု"</string>
+ <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"appအား ခေါ်ဆိုမှုများ လုပ်ခြင်း/လက်ခံခြင်း ပြုလုပ်နိုင်ရန် တယ်လီဖုန်း ဝန်ဆောင်မှုများနှင့် အပြန်အလှန် တုံ့ပြန်မှုကို ခွင့်ပြုသည်။"</string>
<string name="permlab_control_incall_experience" msgid="9061024437607777619">"အသုံးပြုသူ အတွက် ခေါ်ဆိုမှုအဝင် လုပ်ကိုင်ပုံကို စီစဉ်ပေးခြင်း"</string>
- <string name="permdesc_control_incall_experience" msgid="915159066039828124">"appအား အသုံးပြုသူ အတွက် ခေါ်ဆိုမှုအဝင် လုပ်ကိုင်ပုံကို စီစဉ်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_control_incall_experience" msgid="915159066039828124">"appအား အသုံးပြုသူ အတွက် ခေါ်ဆိုမှုအဝင် လုပ်ကိုင်ပုံကို စီစဉ်ခွင့် ပြုသည်။"</string>
<string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ရာဇဝင်အလိုက် ကွန်ယက်သုံစွဲမှုအား ဖတ်ခြင်း"</string>
- <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"appအား အထူး ကွန်ရက်များ နှင့် appများ အတွက် ကွန်ရက် အသုံးပြုမှု မှတ်တမ်းကို ဖတ်ကြားခွင့် ပြုသည်။"</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"appအား အထူး ကွန်ရက်များ နှင့် appများ အတွက် ကွန်ရက် အသုံးပြုမှု မှတ်တမ်းကို ဖတ်ကြားခွင့် ပြုသည်။"</string>
<string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"ကွန်ယက်မူဝါဒအား စီမံခြင်း"</string>
- <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"appအား ကွန်ရက် မူဝါဒများကို စီမံခန့်ခွဲခွင့် နှင့် app-ဆိုင်ရာ စည်းကမ်းချက်များကို ပြဌာန်းခွင့် ပြုသည်။"</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"appအား ကွန်ရက် မူဝါဒများကို စီမံခန့်ခွဲခွင့် နှင့် app-ဆိုင်ရာ စည်းကမ်းချက်များကို ပြဌာန်းခွင့် ပြုသည်။"</string>
<string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"ကွန်ယက်အသုံးပြုမှုစာရင်းအား မွမ်းမံခြင်း"</string>
<string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"အပလီကေးရှင်းအား တခြားအပလီကေးရှင်းများမှ ကွန်ရက်အသုံးပြုမှု တွက်ချက်ခြင်းအား ပြင်ဆင်ခွင့် ပြုပါ။ ပုံမှန် အပလီကေးရှင်းများအတွက် မလိုအပ်ပါ။"</string>
<string name="permlab_accessNotifications" msgid="7673416487873432268">"သတိပေးချက်များအား အသုံးပြုခွင့်"</string>
@@ -733,35 +733,35 @@
<string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"သတိပေးချက် နားထောင်ခြင်း ဆားဗစ် နှင့် ပူးပေါင်းခြင်း"</string>
<string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"ဖုန်းကိုင်ထားသူနှင့် အကြောင်းကြားချက် နားစွင့်သော ဆားဗစ်မှ ထိပ်ပိုင်းအင်တာဖေ့စ် ကို ပူးပေါင်းခွင့်ပေးခြင်း။ ပုံမှန် အပလီကေးရှင်းများမှာ မလိုအပ်ပါ"</string>
<string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"အခြေအနေ စီမံပေးရေး ဝန်ဆောင်မှု တစ်ခုဆီသို့ ချိတ်တွဲခြင်း"</string>
- <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"စွဲကိုင်ထားသူအား အခြေအနေကို စီမံပေးသူ၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"စွဲကိုင်ထားသူအား အခြေအနေကို စီမံပေးသူ၏ ထိပ်သီး အဆင့် အင်တာဖေ့စ်သို့ ချိတ်တွဲခွင့်ကို ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_bindDreamService" msgid="4153646965978563462">"အိပ်မက် ဝန်ဆောင်မှုသို့ ပေါင်းစည်းမည်"</string>
<string name="permdesc_bindDreamService" msgid="7325825272223347863">"အိမ်မက်ဝန်ဆောင်မှု၏ ထိပ်တန်းအဆင့် မျက်နှာပြင်အား ကိုင်ဆောင်သူမှ ပေါင်းစည်းရန် ခွင့်ပြုမည်။ သာမန် အပလီကေးရှင်းများတွင် မလိုအပ်ပါ။"</string>
<string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"မိုဘိုင်းဆက်သွယ်ရေးဝန်ဆောင်မှုဌာန မှ ထည့်သွင်းပေးသော အခြေအနေများအား ပယ်ဖျက်ခြင်း"</string>
<string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"ကိုင်ဆောင်သူအားမိုဘိုင်းဆက်သွယ်ရေးဝန်ဆောင်မှုဌာနမှ ထည့်သွင်းထားတဲ့ အပြင်အဆင်အား ပယ်ဖျက်ခွင့် ပေးခြင်း။ ပုံမှန် အပလီကေးရှင်းများမှာ မလိုပါ"</string>
<string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"ကွန်ယက်အခြေအနေအား လေ့လာနေမှုအား နားထောင်ခွင့်"</string>
<string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"အပလီကေးရှင်းကို နက်ဝေါ့ ပေါ်က အခြေအနေကို သတိထားခွင့် ပေးခြင်း၊. ပုံမှန် အပလီကေးရှင်း များတွင် မလိုအပ်ပါ"</string>
- <string name="permlab_setInputCalibration" msgid="4902620118878467615">"change ထည့်သွင်းရေး ကိရိယာ တိုင်းထွာညှိနှိုင်းမှု ပြောင်းလဲခြင်း"</string>
- <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"appအား တို့ထိရေး မျက်နှာပြင် တိုင်းထွာစံညှိမှုကို မွမ်းမံခွင့် ပြုသည်။ သာမန် appများ ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permlab_setInputCalibration" msgid="4902620118878467615">"change ထည့်သွင်းရေး ကိရိယာ တိုင်းထွာညှိနှိုင်းမှု ပြောင်းလဲခြင်း"</string>
+ <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"appအား တို့ထိရေး မျက်နှာပြင် တိုင်းထွာစံညှိမှုကို မွမ်းမံခွင့် ပြုသည်။ သာမန် appများ ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"DRM လက်မှတ်များကို ရယူသုံးခြင်း"</string>
- <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"အပလီကေးရှင်း တစ်ခုအား စီမံလုပ်ကိုင်ခွင့် DRM လက်မှတ်များ သုံးခွင့် ပြုသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"အပလီကေးရှင်း တစ်ခုအား စီမံလုပ်ကိုင်ခွင့် DRM လက်မှတ်များ သုံးခွင့် ပြုသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_handoverStatus" msgid="1159132046126626731">"အန်ဒရွိုက်၏ အလင်းတန်းထိုး လွှဲပြောင်းမှု အခြေအနေကို ရယူရန်"</string>
- <string name="permdesc_handoverStatus" msgid="4788144087245714948">"ဒီအပလီကေးရှင်းအား အန်ဒရွိုက်၏ လက်ရှိ အလင်းတန်းထိုး လွှဲပြောင်းမှု အကြောင်း အချက်အလက်ကို ရယူခွင့် ပြုသည်"</string>
+ <string name="permdesc_handoverStatus" msgid="4788144087245714948">"ဒီအပလီကေးရှင်းအား အန်ဒရွိုက်၏ လက်ရှိ အလင်းတန်းထိုး လွှဲပြောင်းမှု အကြောင်း အချက်အလက်ကို ရယူခွင့် ပြုသည်"</string>
<string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"DRM လက်မှတ်များ ဖယ်ရှားရန်"</string>
- <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"အပလီကေးရှင်းအား DRM လက်မှတ်များကို ဖယ်ရှားခွင့် ပြုသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"အပလီကေးရှင်းအား DRM လက်မှတ်များကို ဖယ်ရှားခွင့် ပြုသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="policylab_limitPassword" msgid="4497420728857585791">"စကားဝှက်စည်းမျဥ်းကိုသတ်မှတ်ရန်"</string>
<string name="policydesc_limitPassword" msgid="3252114203919510394">"မျက်နှာပြင် သော့ဖွင့်ရန် လိုအပ်သော စကားလုံးအရေအတွက်နှင့် အမျိုးအစားအား ထိန်းချုပ်ရန်"</string>
- <string name="policylab_watchLogin" msgid="914130646942199503">"မော်နီတာမျက်နှာပြင်ဖွင့်ရန် ကြိုးစားခွင့်များ"</string>
- <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"မျက်နှာပြင်ကို သော့ဖွင့်ရန် အတွက် စကားဝှက် မမှန်မကန် ထည့်သွင်းမှု အရေအတွက်ကို စောင့်ကြည့်လျက်၊ စကားဝှက် ရိုက်ထည့်မှု သိပ်များနေလျှင် တက်ဘလက်ကို သော့ခတ်ရန် သို့မဟုတ် တက်ဘလက် ဒေတာ အားလုံးကို ဖျက်ပစ်ရန်။"</string>
- <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"မျက်နှာပြင်ကို သော့ဖွင့်ရန် အတွက် စကားဝှက် မမှန်မကန် ထည့်သွင်းမှု အရေအတွက်ကို စောင့်ကြည့်လျက်၊ စကားဝှက် ရိုက်ထည့်မှု သိပ်များနေလျှင် ဖုန်းကို သော့ခတ်ရန် သို့မဟုတ် ဖုန်း ဒေတာ အားလုံးကို ဖျက်ပစ်ရန်။"</string>
- <string name="policylab_resetPassword" msgid="2620077191242688955">"မျက်နှာပြင်ဖွင့်ရန်စကားဝှက်အား ပြောင်းခြင်း"</string>
- <string name="policydesc_resetPassword" msgid="605963962301904458">"မျက်နှာပြင်ဖွင့်ရန်စကားဝှက်အား ပြောင်းခြင်း"</string>
+ <string name="policylab_watchLogin" msgid="914130646942199503">"မော်နီတာမျက်နှာပြင်ဖွင့်ရန် ကြိုးစားခွင့်များ"</string>
+ <string name="policydesc_watchLogin" product="tablet" msgid="3215729294215070072">"မျက်နှာပြင်ကို သော့ဖွင့်ရန် အတွက် စကားဝှက် မမှန်မကန် ထည့်သွင်းမှု အရေအတွက်ကို စောင့်ကြည့်လျက်၊ စကားဝှက် ရိုက်ထည့်မှု သိပ်များနေလျှင် တက်ဘလက်ကို သော့ခတ်ရန် သို့မဟုတ် တက်ဘလက် ဒေတာ အားလုံးကို ဖျက်ပစ်ရန်။"</string>
+ <string name="policydesc_watchLogin" product="default" msgid="5712323091846761073">"မျက်နှာပြင်ကို သော့ဖွင့်ရန် အတွက် စကားဝှက် မမှန်မကန် ထည့်သွင်းမှု အရေအတွက်ကို စောင့်ကြည့်လျက်၊ စကားဝှက် ရိုက်ထည့်မှု သိပ်များနေလျှင် ဖုန်းကို သော့ခတ်ရန် သို့မဟုတ် ဖုန်း ဒေတာ အားလုံးကို ဖျက်ပစ်ရန်။"</string>
+ <string name="policylab_resetPassword" msgid="2620077191242688955">"မျက်နှာပြင်ဖွင့်ရန်စကားဝှက်အား ပြောင်းခြင်း"</string>
+ <string name="policydesc_resetPassword" msgid="605963962301904458">"မျက်နှာပြင်ဖွင့်ရန်စကားဝှက်အား ပြောင်းခြင်း"</string>
<string name="policylab_forceLock" msgid="2274085384704248431">"မျက်နှာပြင်အားသော့ချရန်"</string>
<string name="policydesc_forceLock" msgid="1141797588403827138">"မည်သည့်အချိန်တွင် ဖန်သားပြင်အား မည်ကဲ့သို့နည်းဖြင် သော့ချရန် ထိန်းချုပ်ခြင်း"</string>
<string name="policylab_wipeData" msgid="3910545446758639713">"ဒေတာအားလုံးအားဖျက်ခြင်း"</string>
<string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"စက်ရုံထုတ် အခြေအနေအား ပြန်ပြောင်းခြင်းဖြင့် တက်ဘလက်ရှိ အချက်အလက်များအား ကြိုတင်သတိပေးမှုမရှိပဲ ဖျက်စီးရန်"</string>
<string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"စက်ရုံထုတ် အခြေအနေအား ပြန်ပြောင်းခြင်းဖြင့် ဖုန်းရှိ အချက်အလက်များအား ကြိုတင်သတိပေးမှုမရှိပဲ ဖျက်စီးရန်"</string>
<string name="policylab_setGlobalProxy" msgid="2784828293747791446">"တကမာ္ဘလုံးဆိုင်ရာပရော်စီကို သတ်မှတ်ခြင်း"</string>
- <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"မူဝါဒအသုံးပြုခွင့်ရလျှင် စက်ပစ္စည်းတကမ္ဘာလုံးဆိုင်ရာပရော်စီအားသုံးရန် သတ်မှတ်ခြင်း။ ပထမဦးဆုံးသောစက်၏ထိန်းချုပ်သူသာ တကမ္ဘာလုံးဆိုင်ရာပရော်စီသာအားအကျိုးသက်ရောက်စေရန် သတ်မှတ်နိုင်သည်။"</string>
+ <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"မူဝါဒအသုံးပြုခွင့်ရလျှင် စက်ပစ္စည်းတကမ္ဘာလုံးဆိုင်ရာပရော်စီအားသုံးရန် သတ်မှတ်ခြင်း။ ပထမဦးဆုံးသောစက်၏ထိန်းချုပ်သူသာ တကမ္ဘာလုံးဆိုင်ရာပရော်စီသာအားအကျိုးသက်ရောက်စေရန် သတ်မှတ်နိုင်သည်။"</string>
<string name="policylab_expirePassword" msgid="885279151847254056">"စကားဝှက်သက်တမ်းသတ်မှတ်ရန်"</string>
<string name="policydesc_expirePassword" msgid="1729725226314691591">"ဖန်သားပြင်သော့ချခြင်း စကားဝှက် ပြင်ဆင်ခွင့် အကြိမ်ရေအား ထိန်းချုပ်ခြင်း"</string>
<string name="policylab_encryptedStorage" msgid="8901326199909132915">"သိုလှောင်လျို့ဝှက်ခြင်းသတ်မှတ်"</string>
@@ -884,21 +884,21 @@
<string name="sipAddressTypeWork" msgid="6920725730797099047">"အလုပ်အကိုင်"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"တခြား"</string>
<string name="quick_contacts_not_available" msgid="746098007828579688">"ဒီအဆက်အသွယ်အား ကြည့်ရှုရန် အပလီကေးရှင်း မတွေ့ပါ"</string>
- <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN ကုဒ် ရိုက်ထည့်ပါ"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK နှင့် PIN ကုဒ် အသစ်ကို ရိုက်ထည့်ပါ"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN ကုဒ် ရိုက်ထည့်ပါ"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK နှင့် PIN ကုဒ် အသစ်ကို ရိုက်ထည့်ပါ"</string>
<string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK နံပါတ်"</string>
<string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"PIN ကုဒ် အသစ်"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"စကားဝှက် ရိုက်ရန် ထိပါ"</font></string>
- <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"သော့ဖွင့်ရန် စကားဝှက်ကို ရိုက်ထည့်ပါ"</string>
- <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"သော့ဖွင့်ရန် PIN ကို ရိုက်ထည့်ပါ"</string>
+ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"သော့ဖွင့်ရန် စကားဝှက်ကို ရိုက်ထည့်ပါ"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"သော့ဖွင့်ရန် PIN ကို ရိုက်ထည့်ပါ"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"ပင်နံပါတ်မှားနေပါသည်"</string>
- <string name="keyguard_label_text" msgid="861796461028298424">"သော့ဖွင့်ရန် Menu ထိုနောက်0ကိုနှိပ်ပါ"</string>
+ <string name="keyguard_label_text" msgid="861796461028298424">"သော့ဖွင့်ရန် Menu ထိုနောက်0ကိုနှိပ်ပါ"</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"အရေးပေါ်နံပါတ်"</string>
<string name="lockscreen_carrier_default" msgid="8963839242565653192">"ဆားဗစ် မရှိပါ"</string>
<string name="lockscreen_screen_locked" msgid="7288443074806832904">"မျက်နှာပြင်အားသော့ချထားသည်"</string>
- <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"ဖွင့်ရန်သို့မဟုတ်အရေးပေါ်ခေါ်ဆိုခြင်းပြုလုပ်ရန် မီနူးကိုနှိပ်ပါ"</string>
+ <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"ဖွင့်ရန်သို့မဟုတ်အရေးပေါ်ခေါ်ဆိုခြင်းပြုလုပ်ရန် မီနူးကိုနှိပ်ပါ"</string>
<string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"မီးနူးကို နှိပ်ခြင်းဖြင့် သော့ဖွင့်ပါ"</string>
- <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"ဖွင့်ရန်ပုံစံဆွဲပါ"</string>
+ <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"ဖွင့်ရန်ပုံစံဆွဲပါ"</string>
<string name="lockscreen_emergency_call" msgid="5347633784401285225">"အရေးပေါ်ခေါ်ဆိုရန်"</string>
<string name="lockscreen_return_to_call" msgid="5244259785500040021">"ခေါ်ဆိုမှုထံပြန်သွားရန်"</string>
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"မှန်ပါသည်"</string>
@@ -908,10 +908,10 @@
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"ဆင်းကဒ် မရှိပါ"</string>
<string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"တက်ပလက်ထဲတွင်း ဆင်းကဒ် မရှိပါ"</string>
<string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"ဖုန်းထဲတွင် ဆင်းကဒ် မရှိပါ"</string>
- <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"ဆင်းမ်ကဒ် ထည့်ပါ"</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"ဆင်းမ်ကဒ် ထည့်ပါ"</string>
<string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"ဆင်းမ်ကဒ် မရှိဘူး သို့မဟုတ် ဖတ်မရပါ။ ဆင်းမ်ကဒ် တစ်ခုကို ထည့်ပါ။"</string>
<string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"သုံးစွဲ မရတော့သော ဆင်းကဒ်"</string>
- <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"သင့် ဆင်းမ်ကဒ်ကို ထာဝရ ပိတ်လိုက်ပါပြီ။\n နောက် ဆင်းမ်ကဒ် တစ်ခု အတွက် သင်၏ ကြိုးမဲ့ ဝန်ဆောင်မှု စီမံပေးသူကို ဆက်သွယ်ပါ"</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"သင့် ဆင်းမ်ကဒ်ကို ထာဝရ ပိတ်လိုက်ပါပြီ။\n နောက် ဆင်းမ်ကဒ် တစ်ခု အတွက် သင်၏ ကြိုးမဲ့ ဝန်ဆောင်မှု စီမံပေးသူကို ဆက်သွယ်ပါ"</string>
<string name="lockscreen_transport_prev_description" msgid="6300840251218161534">"ယခင် တစ်ပုဒ်"</string>
<string name="lockscreen_transport_next_description" msgid="573285210424377338">"နောက် တစ်ပုဒ်"</string>
<string name="lockscreen_transport_pause_description" msgid="3980308465056173363">"ခဏရပ်ရန်"</string>
@@ -922,21 +922,21 @@
<string name="emergency_calls_only" msgid="6733978304386365407">"အရေးပေါ်ခေါ်ဆိုမှုသာ"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"ကွန်ရက် သော့ကျနေခြင်း"</string>
<string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"ဆင်းမ်ကဒ် ရဲ့ ပင်နံပါတ် ပြန်ဖွင့်သည့် ကုဒ် သော့ကျနေပါသည်"</string>
- <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"သုံးစွဲသူ လမ်းညွှန်ကို ကြည့်ပါ သို့မဟုတ် ဖောက်သည်များ စောင့်ရှောက်ရေး ဌာနကို ဆက်သွယ်ပါ။"</string>
+ <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"သုံးစွဲသူ လမ်းညွှန်ကို ကြည့်ပါ သို့မဟုတ် ဖောက်သည်များ စောင့်ရှောက်ရေး ဌာနကို ဆက်သွယ်ပါ။"</string>
<string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"ဆင်းမ်ကဒ် သော့ကျနေပါသည်"</string>
<string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"ဆင်းမ်ကဒ် ကို သော့ဖွင့်နေပါသည်"</string>
- <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"သင်သည် သော့ဖွင့် ပုံစံကို<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="2725973286239344555">"သင်သည် စကားဝှက်ကို <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="6216672706545696955">"သင်သည် သင်၏ PIN <xliff:g id="NUMBER_0">%d</xliff:g>ကို ကြိမ် မမှန်မကန် ရိုက်ခဲ့ပြီ။ \n\n ထပ်ပြီးတော့ <xliff:g id="NUMBER_1">%d</xliff:g> စက္ကန့်အကြာ စမ်းကြည့်ပါ။"</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"သင်သည် သော့ဖွင့် ပုံစံကို<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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"သင်သည် သော့ဖွင့် ပုံစံကို <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"သင့်Tabletအား မှားယွင်းစွာ <xliff:g id="NUMBER_0">%d</xliff:g>ကြိမ်ဖွင့်ရန် ကြိုးစားနေပါသည်။ နောက်ထပ်<xliff:g id="NUMBER_1">%d</xliff:g>ကြိမ်မအောင်မြင်ပါက မူလစက်ရုံ အနေအထားသို့ပြန်လည်ရောက်ရှိကာ အသုံးပြုသူ၏ဒေတာအားလုံးဆုံးရှုံးပါမည်။"</string>
- <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"သင့်ဖုန်းအား မှားယွင်းစွာ <xliff:g id="NUMBER_0">%d</xliff:g>ကြိမ်ဖွင့်ရန် ကြိုးစားနေပါသည်။ နောက်ထပ်<xliff:g id="NUMBER_1">%d</xliff:g>ကြိမ်မအောင်မြင်ပါက မူလစက်ရုံ အနေအထားသို့ပြန်လည်ရောက်ရှိကာ အသုံးပြုသူ၏ဒေတာအားလုံးဆုံးရှုံးပါမည်။"</string>
- <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"သင့်Tabletအား မှားယွင်းစွာ <xliff:g id="NUMBER">%d</xliff:g>ကြိမ်ဖွင့်ရန် ကြိုးစားခဲ့ပါသည်။ယခုဖုန်းကိုမူလစက်ရုံအနေအထားသို့ပြန်လည်ရောက်ရှိပါမည်။"</string>
- <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"သင့်ဖုန်းအား မှားယွင်းစွာ <xliff:g id="NUMBER">%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_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"သင်သည် သော့ဖွင့် ပုံစံကို<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="2725973286239344555">"သင်သည် စကားဝှက်ကို <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="6216672706545696955">"သင်သည် သင်၏ PIN <xliff:g id="NUMBER_0">%d</xliff:g>ကို ကြိမ် မမှန်မကန် ရိုက်ခဲ့ပြီ။ \n\n ထပ်ပြီးတော့ <xliff:g id="NUMBER_1">%d</xliff:g> စက္ကန့်အကြာ စမ်းကြည့်ပါ။"</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"သင်သည် သော့ဖွင့် ပုံစံကို<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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"သင်သည် သော့ဖွင့် ပုံစံကို <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"သင့်Tabletအား မှားယွင်းစွာ <xliff:g id="NUMBER_0">%d</xliff:g>ကြိမ်ဖွင့်ရန် ကြိုးစားနေပါသည်။ နောက်ထပ်<xliff:g id="NUMBER_1">%d</xliff:g>ကြိမ်မအောင်မြင်ပါက မူလစက်ရုံ အနေအထားသို့ပြန်လည်ရောက်ရှိကာ အသုံးပြုသူ၏ဒေတာအားလုံးဆုံးရှုံးပါမည်။"</string>
+ <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"သင့်ဖုန်းအား မှားယွင်းစွာ <xliff:g id="NUMBER_0">%d</xliff:g>ကြိမ်ဖွင့်ရန် ကြိုးစားနေပါသည်။ နောက်ထပ်<xliff:g id="NUMBER_1">%d</xliff:g>ကြိမ်မအောင်မြင်ပါက မူလစက်ရုံ အနေအထားသို့ပြန်လည်ရောက်ရှိကာ အသုံးပြုသူ၏ဒေတာအားလုံးဆုံးရှုံးပါမည်။"</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"သင့်Tabletအား မှားယွင်းစွာ <xliff:g id="NUMBER">%d</xliff:g>ကြိမ်ဖွင့်ရန် ကြိုးစားခဲ့ပါသည်။ယခုဖုန်းကိုမူလစက်ရုံအနေအထားသို့ပြန်လည်ရောက်ရှိပါမည်။"</string>
+ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"သင့်ဖုန်းအား မှားယွင်းစွာ <xliff:g id="NUMBER">%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>
- <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"အကောင့်ဖွင့်ရန်"</string>
+ <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"အကောင့်ဖွင့်ရန်"</string>
<string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"အကြိမ်ရေ များစွာ ပုံဆွဲသော့ဖွင့်ရန် ကြိုးစားခြင်း"</string>
<string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"သော့ဖွင့်ရန် ဂူဂဲလ် အကောင့်ဖြင့် ဝင်ပါ"</string>
<string name="lockscreen_glogin_username_hint" msgid="8846881424106484447">"သုံးစွဲသူ အမှတ် (အီးမေးလ်)"</string>
@@ -946,7 +946,7 @@
<string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"သုံးစွဲသူ အမည် သို့ စကားဝှင်ကို မေ့နေပါသလား။ \n"<b>"google.com/accounts/recovery"</b>" ကို သွားရောက်ပါ။"</string>
<string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"စစ်ဆေးနေပါသည်…"</string>
<string name="lockscreen_unlock_label" msgid="737440483220667054">"ဆင်းမ်ကဒ် ဖွင့်ပါ"</string>
- <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"အသံဖွင့်ထားသည်"</string>
+ <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"အသံဖွင့်ထားသည်"</string>
<string name="lockscreen_sound_off_label" msgid="996822825154319026">"အသံပိတ်ထားသည်"</string>
<string name="lockscreen_access_pattern_start" msgid="3941045502933142847">"ပုံစံစတင်ခြင်း"</string>
<string name="lockscreen_access_pattern_cleared" msgid="5583479721001639579">"ပုံစံရှင်းလင်းခြင်း"</string>
@@ -983,9 +983,9 @@
<string name="hour_ampm" msgid="4584338083529355982">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%P</xliff:g>"</string>
<string name="hour_cap_ampm" msgid="2083465992940444366">"<xliff:g id="HOUR">%-l</xliff:g><xliff:g id="AMPM">%p</xliff:g>"</string>
<string name="factorytest_failed" msgid="5410270329114212041">"စက်ရုံစမ်းသပ်ခြင်းမအောင်မြင်ပါ"</string>
- <string name="factorytest_not_system" msgid="4435201656767276723">"စက်ရုံစမ်းသပ်မှုမှာ စနစ်/အပ်ပလီကေးရှင်း ထည့်သွင်းထားသောpackageများကိုသာ ပံ့ပိုးမှုပေးသည်။."</string>
- <string name="factorytest_no_action" msgid="872991874799998561">"စက်ရုံစမ်းသပ်မှုအားလုပ်ဆောင်ရန် မည်သည့်packageမှ မတွေ့ပါ။"</string>
- <string name="factorytest_reboot" msgid="6320168203050791643">"လုပ်ငန်းစနစ်ထည့်သွင်းပြီး ပြန်လည်စတင်ရန်"</string>
+ <string name="factorytest_not_system" msgid="4435201656767276723">"စက်ရုံစမ်းသပ်မှုမှာ စနစ်/အပ်ပလီကေးရှင်း ထည့်သွင်းထားသောpackageများကိုသာ ပံ့ပိုးမှုပေးသည်။."</string>
+ <string name="factorytest_no_action" msgid="872991874799998561">"စက်ရုံစမ်းသပ်မှုအားလုပ်ဆောင်ရန် မည်သည့်packageမှ မတွေ့ပါ။"</string>
+ <string name="factorytest_reboot" msgid="6320168203050791643">"လုပ်ငန်းစနစ်ထည့်သွင်းပြီး ပြန်လည်စတင်ရန်"</string>
<string name="js_dialog_title" msgid="1987483977834603872">"ဒီ \"<xliff:g id="TITLE">%s</xliff:g>\" က စာမျက်နှာက ပြောဆိုတာက:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
<string name="js_dialog_before_unload_title" msgid="2619376555525116593">"သေချာကြောင်း လုပ်ပါ"</string>
@@ -1018,21 +1018,21 @@
<string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"အပလီကေးရှင်းအား ဘရောင်ဇာမှ မှတ်တမ်း သို့ မှတ်သားမှု အမှတ်များအား ပြင်ဆင်ခွင့် ပေးခြင်း။ အပလီကေးရှင်းမှ ဘရောင်ဇာ မှတ်တမ်းများကို ဖျက်ပစ်ခွင့် သို့ ပြင်ဆင်ခွင့် ရှိပါမည်။ မှတ်ချက်။ ဤခွင့်ပြုချက်ကို တတိယပါတီ ဘရောင်ဇာများ၊ တခြား အပလီကေးရှင်းများမှ သုံးမည် မဟုတ်ပါ။"</string>
<string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"အပလီကေးရှင်းအား ဘရောင်ဇာမှ မှတ်တမ်း သို့ မှတ်သားမှု အမှတ်များအား ပြင်ဆင်ခွင့် ပေးခြင်း။ အပလီကေးရှင်းမှ ဘရောင်ဇာ မှတ်တမ်းများကို ဖျက်ပစ်ခွင့် သို့ ပြင်ဆင်ခွင့် ရှိပါမည်။ မှတ်ချက်။ ဒီခွင့်ပြုချက်ကို တတိယပါတီ ဘရောင်ဇာများ၊ တခြား အပလီကေးရှင်းများမှ သုံးမည် မဟုတ်ပါ။"</string>
<string name="permlab_setAlarm" msgid="1379294556362091814">"နှိုးစက်သတ်မှတ်ရန်"</string>
- <string name="permdesc_setAlarm" msgid="316392039157473848">"appအား တပ်ဆင်ထားသည့် နှိုးစက်နာရီ app ထဲတွင် နှိုးစက်ကို သတ်မှတ်ခွင့် ပြုသည်။ အချို့ နှိုးစက် appများက ထိုအင်္ဂါရပ်ကို ပြီးမြောက်အောင် မလုပ်နိုင်ကြပါ။"</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"appအား တပ်ဆင်ထားသည့် နှိုးစက်နာရီ app ထဲတွင် နှိုးစက်ကို သတ်မှတ်ခွင့် ပြုသည်။ အချို့ နှိုးစက် appများက ထိုအင်္ဂါရပ်ကို ပြီးမြောက်အောင် မလုပ်နိုင်ကြပါ။"</string>
<string name="permlab_writeVoicemail" msgid="7309899891683938100">"အသံမေးလ်ကို ရေးရန်"</string>
- <string name="permdesc_writeVoicemail" msgid="6592572839715924830">"appအား သင်၏ အသံမေးလ် ဝင်စာများကို မွမ်းမံခွင့် နှင့် ဖယ်ရှားခွင့် ပြုသည်။"</string>
- <string name="permlab_addVoicemail" msgid="5525660026090959044">"အသံစာပို့စနစ်အားထည့်ရန်"</string>
- <string name="permdesc_addVoicemail" msgid="6604508651428252437">"appအား သင့် အသံမေးလ် ဝင်စာသို့ စာများကို ထည့်ခွင့် ပြုသည်။"</string>
+ <string name="permdesc_writeVoicemail" msgid="6592572839715924830">"appအား သင်၏ အသံမေးလ် ဝင်စာများကို မွမ်းမံခွင့် နှင့် ဖယ်ရှားခွင့် ပြုသည်။"</string>
+ <string name="permlab_addVoicemail" msgid="5525660026090959044">"အသံစာပို့စနစ်အားထည့်ရန်"</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"appအား သင့် အသံမေးလ် ဝင်စာသို့ စာများကို ထည့်ခွင့် ပြုသည်။"</string>
<string name="permlab_readVoicemail" msgid="8415201752589140137">"အသံမေးလ်ကို ဖတ်ရန်"</string>
- <string name="permdesc_readVoicemail" msgid="8926534735321616550">"appအား သင်၏ အသံမေးလ်များကို ဖတ်ခွင့် ပြုရန်"</string>
- <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"ဘရောင်ဇာ ဘူမိဇုန်သတ်မှတ်မှု ခွင့်ပြုချက်များကို မွမ်းမံခြင်း"</string>
- <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"appအား ဘရောင်ဇာ၏ ဘူမိဇုန်သတ်မှတ်ရေး ခွင့်ပြုချက်များကို မွမ်းမံခွင့် ပြုသည်။ ကြံဖန် appများက ၎င်းကို အသုံးချပြီး လိုရာ ဝက်ဘ်ဆိုက်များသို့ တည်နေရာ အချက်အလက် ပို့မှုကို လုပ်နိုင်သည်။"</string>
+ <string name="permdesc_readVoicemail" msgid="8926534735321616550">"appအား သင်၏ အသံမေးလ်များကို ဖတ်ခွင့် ပြုရန်"</string>
+ <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"ဘရောင်ဇာ ဘူမိဇုန်သတ်မှတ်မှု ခွင့်ပြုချက်များကို မွမ်းမံခြင်း"</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"appအား ဘရောင်ဇာ၏ ဘူမိဇုန်သတ်မှတ်ရေး ခွင့်ပြုချက်များကို မွမ်းမံခွင့် ပြုသည်။ ကြံဖန် appများက ၎င်းကို အသုံးချပြီး လိုရာ ဝက်ဘ်ဆိုက်များသို့ တည်နေရာ အချက်အလက် ပို့မှုကို လုပ်နိုင်သည်။"</string>
<string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"packages များကိုအတည်ပြုစိစစ်ခြင်း"</string>
- <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"appအား အထုပ် တစ်ခု၏ မတည်ငြိမ်မှုကို စိစစ်ခွင့် ပြုသည်။"</string>
- <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"package အတည်ပြုခြင်းနှင့် ပူးပေါင်းရန်"</string>
- <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"စွဲကိုင်ထားသူအား အထုပ်များအား စိစစ်ရေး တောင်းဆိုချက်များကို ပြုလုပ်ခွင့် ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"appအား အထုပ် တစ်ခု၏ မတည်ငြိမ်မှုကို စိစစ်ခွင့် ပြုသည်။"</string>
+ <string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"package အတည်ပြုခြင်းနှင့် ပူးပေါင်းရန်"</string>
+ <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"စွဲကိုင်ထားသူအား အထုပ်များအား စိစစ်ရေး တောင်းဆိုချက်များကို ပြုလုပ်ခွင့် ပေးသည်။ သာမန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_serialPort" msgid="546083327654631076">"အစဥ်လိုက်ပို့များကို ဝင်ရောက်ချိတ်ဆက်ခြင်း"</string>
- <string name="permdesc_serialPort" msgid="2991639985224598193">"SerialManager APIအားအသုံးပြုကာ ကိုင်ဆောင်သူကို စီရီယာပို့မျာကို ဝင်ရောက်အသုံးပြုခြင်းအား ခွင့်ပြုသည်။"</string>
+ <string name="permdesc_serialPort" msgid="2991639985224598193">"SerialManager APIအားအသုံးပြုကာ ကိုင်ဆောင်သူကို စီရီယာပို့မျာကို ဝင်ရောက်အသုံးပြုခြင်းအား ခွင့်ပြုသည်။"</string>
<string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"အချက်အလက်များ ပံ့ပိုသူများအား အပြင်ဖက်မှ ရယူခြင်း"</string>
<string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"ကိုင်ဆောင်ထားသူကို အချက်အလက်ပံ့ပိုးမှုများကို ကွန်ဆိုးလ်မှ ရယူခွင့် ပြုပါ။ ပုံမှန်အပလီကေးရှင်းအတွက် မလိုအပ်ပါ။"</string>
<string name="permlab_updateLock" msgid="3527558366616680889">"စက်အလိုအလျောက်အဆင်မြှင့်ခြင်း အားမပေးရန်"</string>
@@ -1040,8 +1040,8 @@
<string name="save_password_message" msgid="767344687139195790">"ဤလျှို့ဝှက်စကားဝှက်အား ဘရောင်ဇာကိုမှတ်ခိုင်းမည်လား"</string>
<string name="save_password_notnow" msgid="6389675316706699758">"ယခုမဟုတ်ပါ"</string>
<string name="save_password_remember" msgid="6491879678996749466">"မှတ်ထားရန်"</string>
- <string name="save_password_never" msgid="8274330296785855105">"မည်သည့်အခါမှ"</string>
- <string name="open_permission_deny" msgid="7374036708316629800">"သင့်ဆီမှာ ဒီစာမျက်နှာကို ဖွင့်ရန် ခွင့်ပြုချက် မရှိပါ။"</string>
+ <string name="save_password_never" msgid="8274330296785855105">"မည်သည့်အခါမှ"</string>
+ <string name="open_permission_deny" msgid="7374036708316629800">"သင့်ဆီမှာ ဒီစာမျက်နှာကို ဖွင့်ရန် ခွင့်ပြုချက် မရှိပါ။"</string>
<string name="text_copied" msgid="4985729524670131385">"clipboardထံ စာသားအားကူးယူမည်"</string>
<string name="more_item_label" msgid="4650918923083320495">"နောက်ထပ်"</string>
<string name="prepend_shortcut_label" msgid="2572214461676015642">"Menu+"</string>
@@ -1060,8 +1060,8 @@
<string name="oneMonthDurationPast" msgid="7396384508953779925">"လွန်ခဲ့သော၁လက"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"လွန်ခဲ့သော၁လမတိုင်မီက"</string>
<plurals name="num_seconds_ago">
- <item quantity="one" msgid="4869870056547896011">"လွန်ခဲ့သော ၁စက္ကန့်က"</item>
- <item quantity="other" msgid="3903706804349556379">"လွန်ခဲ့သော <xliff:g id="COUNT">%d</xliff:g> စက္ကန့်က"</item>
+ <item quantity="one" msgid="4869870056547896011">"လွန်ခဲ့သော ၁စက္ကန့်က"</item>
+ <item quantity="other" msgid="3903706804349556379">"လွန်ခဲ့သော <xliff:g id="COUNT">%d</xliff:g> စက္ကန့်က"</item>
</plurals>
<plurals name="num_minutes_ago">
<item quantity="one" msgid="3306787433088810191">"လွန်ခဲ့သော ၁မိနစ်က"</item>
@@ -1081,8 +1081,8 @@
<item quantity="other" msgid="2479586466153314633">"လွန်ခဲ့သော <xliff:g id="COUNT">%d</xliff:g> ရက်တွင်"</item>
</plurals>
<plurals name="in_num_seconds">
- <item quantity="one" msgid="2729745560954905102">"နောက် ၁စက္ကန့်တွင်"</item>
- <item quantity="other" msgid="1241926116443974687">"နောက် <xliff:g id="COUNT">%d</xliff:g> စက္ကန့်တွင်"</item>
+ <item quantity="one" msgid="2729745560954905102">"နောက် ၁စက္ကန့်တွင်"</item>
+ <item quantity="other" msgid="1241926116443974687">"နောက် <xliff:g id="COUNT">%d</xliff:g> စက္ကန့်တွင်"</item>
</plurals>
<plurals name="in_num_minutes">
<item quantity="one" msgid="8793095251325200395">"နောက်၁မီနစ်တွင်"</item>
@@ -1097,8 +1097,8 @@
<item quantity="other" msgid="5109449375100953247">"နောက် <xliff:g id="COUNT">%d</xliff:g> ရက်တွင်"</item>
</plurals>
<plurals name="abbrev_num_seconds_ago">
- <item quantity="one" msgid="1849036840200069118">"လွန်ခဲ့သော ၁စက္ကန့်က"</item>
- <item quantity="other" msgid="3699169366650930415">"လွန်ခဲ့သော <xliff:g id="COUNT">%d</xliff:g> စက္ကန့်က"</item>
+ <item quantity="one" msgid="1849036840200069118">"လွန်ခဲ့သော ၁စက္ကန့်က"</item>
+ <item quantity="other" msgid="3699169366650930415">"လွန်ခဲ့သော <xliff:g id="COUNT">%d</xliff:g> စက္ကန့်က"</item>
</plurals>
<plurals name="abbrev_num_minutes_ago">
<item quantity="one" msgid="6361490147113871545">"လွန်ခဲ့သော ၁မိနစ်က"</item>
@@ -1113,8 +1113,8 @@
<item quantity="other" msgid="3453342639616481191">"လွန်ခဲ့သော <xliff:g id="COUNT">%d</xliff:g> ရက်တွင်"</item>
</plurals>
<plurals name="abbrev_in_num_seconds">
- <item quantity="one" msgid="5842225370795066299">"နောက် ၁စက္ကန့်တွင်"</item>
- <item quantity="other" msgid="5495880108825805108">"နောက် <xliff:g id="COUNT">%d</xliff:g> စက္ကန့်တွင်"</item>
+ <item quantity="one" msgid="5842225370795066299">"နောက် ၁စက္ကန့်တွင်"</item>
+ <item quantity="other" msgid="5495880108825805108">"နောက် <xliff:g id="COUNT">%d</xliff:g> စက္ကန့်တွင်"</item>
</plurals>
<plurals name="abbrev_in_num_minutes">
<item quantity="one" msgid="562786149928284878">"နောက်၁မိနစ်တွင်"</item>
@@ -1137,8 +1137,8 @@
<string name="hours" msgid="894424005266852993">"နာရီများ"</string>
<string name="minute" msgid="9148878657703769868">"မိနစ်"</string>
<string name="minutes" msgid="5646001005827034509">"မိနစ်"</string>
- <string name="second" msgid="3184235808021478">"စက္ကန့်"</string>
- <string name="seconds" msgid="3161515347216589235">"စက္ကန့်"</string>
+ <string name="second" msgid="3184235808021478">"စက္ကန့်"</string>
+ <string name="seconds" msgid="3161515347216589235">"စက္ကန့်"</string>
<string name="week" msgid="5617961537173061583">"အပတ်"</string>
<string name="weeks" msgid="6509623834583944518">"အပတ်"</string>
<string name="year" msgid="4001118221013892076">"နှစ်"</string>
@@ -1156,12 +1156,12 @@
<item quantity="other" msgid="3863962854246773930">"<xliff:g id="COUNT">%d</xliff:g> နာရီ"</item>
</plurals>
<string name="VideoView_error_title" msgid="3534509135438353077">"ဗီဒီယို ပြဿနာ"</string>
- <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"ဒီဗိဒီယိုမှာ ဒီကိရိယာ ပေါ်မှာ ဖွင့်ကြည့်၍ မရနိုင်ပါ။"</string>
+ <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"ဒီဗိဒီယိုမှာ ဒီကိရိယာ ပေါ်မှာ ဖွင့်ကြည့်၍ မရနိုင်ပါ။"</string>
<string name="VideoView_error_text_unknown" msgid="3450439155187810085">"ဒီဗီဒီယိုကို ပြသလို့ မရပါ"</string>
<string name="VideoView_error_button" msgid="2822238215100679592">"ကောင်းပြီ"</string>
<string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
- <string name="noon" msgid="7245353528818587908">"မွန်းတည့်"</string>
- <string name="Noon" msgid="3342127745230013127">"မွန်းတည့်"</string>
+ <string name="noon" msgid="7245353528818587908">"မွန်းတည့်"</string>
+ <string name="Noon" msgid="3342127745230013127">"မွန်းတည့်"</string>
<string name="midnight" msgid="7166259508850457595">"ညသန်းခေါင်"</string>
<string name="Midnight" msgid="5630806906897892201">"ညသန်းခေါင်"</string>
<string name="elapsed_time_short_format_mm_ss" msgid="4431555943828711473">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
@@ -1177,11 +1177,11 @@
<string name="textSelectionCABTitle" msgid="5236850394370820357">"စာတိုရွေးချယ်မှု"</string>
<string name="addToDictionary" msgid="4352161534510057874">"အဘိဓာန်ထဲ ထည့်ပါ"</string>
<string name="deleteText" msgid="6979668428458199034">"ဖျက်ပစ်ရန်"</string>
- <string name="inputMethod" msgid="1653630062304567879">"ထည့်သွင်းရန်နည်းလမ်း"</string>
+ <string name="inputMethod" msgid="1653630062304567879">"ထည့်သွင်းရန်နည်းလမ်း"</string>
<string name="editTextMenuTitle" msgid="4909135564941815494">"စာတို လုပ်ဆောင်ချက်"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"သိမ်းဆည်သော နေရာ နည်းနေပါသည်"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"တချို့ စနစ်လုပ်ငန်းများ အလုပ် မလုပ်ခြင်း ဖြစ်နိုင်ပါသည်"</string>
- <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"စနစ်အတွက် သိုလှောင်ခန်း မလုံလောက်ပါ။ သင့်ဆီမှာ နေရာလွတ် ၂၅၀ MB ရှိတာ စစ်ကြည့်ပြီး စတင်ပါ။"</string>
+ <string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"စနစ်အတွက် သိုလှောင်ခန်း မလုံလောက်ပါ။ သင့်ဆီမှာ နေရာလွတ် ၂၅၀ MB ရှိတာ စစ်ကြည့်ပြီး စတင်ပါ။"</string>
<string name="app_running_notification_title" msgid="8718335121060787914">"<xliff:g id="APP_NAME">%1$s</xliff:g> က အလုပ်လုပ်နေသည်။"</string>
<string name="app_running_notification_text" msgid="4653586947747330058">"အချက်အလက်များ ပိုသိရန် သို့မဟုတ် အပလီကေးရှင်းကို ရပ်ရန် တို့ထိလိုက်ပါ။"</string>
<string name="ok" msgid="5970060430562524910">"ကောင်းပြီ"</string>
@@ -1196,10 +1196,10 @@
<string name="whichApplicationNamed" msgid="8260158865936942783">"%1$s ကို သုံးပြီး လုပ်ဆောင်ချက် ပြီးဆုံးပါစေ"</string>
<string name="whichViewApplication" msgid="3272778576700572102">"...ဖြင့် ဖွင့်မည်"</string>
<string name="whichViewApplicationNamed" msgid="2286418824011249620">"%1$s ဖြင့် ဖွင့်မည်"</string>
- <string name="whichEditApplication" msgid="144727838241402655">"...နှင့် တည်းဖြတ်ရန်"</string>
- <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s နှင့် တည်းဖြတ်ရန်"</string>
- <string name="whichSendApplication" msgid="6902512414057341668">"...နှင့် မျှဝေရန်"</string>
- <string name="whichSendApplicationNamed" msgid="2799370240005424391">"%1$sနှင့် မျှဝေရန်"</string>
+ <string name="whichEditApplication" msgid="144727838241402655">"...နှင့် တည်းဖြတ်ရန်"</string>
+ <string name="whichEditApplicationNamed" msgid="1775815530156447790">"%1$s နှင့် တည်းဖြတ်ရန်"</string>
+ <string name="whichSendApplication" msgid="6902512414057341668">"...နှင့် မျှဝေရန်"</string>
+ <string name="whichSendApplicationNamed" msgid="2799370240005424391">"%1$sနှင့် မျှဝေရန်"</string>
<string name="whichHomeApplication" msgid="4307587691506919691">"ပင်မ appကို ရွေးပါ"</string>
<string name="whichHomeApplicationNamed" msgid="4493438593214760979">"%1$sကို ပင်မအဖြစ် သုံးပါ"</string>
<string name="alwaysUse" msgid="4583018368000610438">"ဤလှုပ်ရှားမှုအတွက် မူရင်းအတိုင်း အသုံးပြုပါ။"</string>
@@ -1209,8 +1209,8 @@
<string name="chooseUsbActivity" msgid="6894748416073583509">"USB ကိရိယာ အတွက် app တစ်ခု ရွေးပါ"</string>
<string name="noApplications" msgid="2991814273936504689">"ဘယ် appကမှ ဒီ လုပ်ဆောင်ချက်ကို မလုပ်ကိုင်နိုင်ပါ။"</string>
<string name="aerr_title" msgid="1905800560317137752"></string>
- <string name="aerr_application" msgid="932628488013092776">"ဝမ်းနည်းစွာဖြင့်<xliff:g id="APPLICATION">%1$s</xliff:g>မှာ ရပ်ဆိုင်းသွားသည်။"</string>
- <string name="aerr_process" msgid="4507058997035697579">"ဝမ်းနည်းစွာဖြင့် လုပ်ဆောင်ချက်<xliff:g id="PROCESS">%1$s</xliff:g>မှာ ရပ်ဆိုင်းသွားသည်။"</string>
+ <string name="aerr_application" msgid="932628488013092776">"ဝမ်းနည်းစွာဖြင့်<xliff:g id="APPLICATION">%1$s</xliff:g>မှာ ရပ်ဆိုင်းသွားသည်။"</string>
+ <string name="aerr_process" msgid="4507058997035697579">"ဝမ်းနည်းစွာဖြင့် လုပ်ဆောင်ချက်<xliff:g id="PROCESS">%1$s</xliff:g>မှာ ရပ်ဆိုင်းသွားသည်။"</string>
<string name="anr_title" msgid="4351948481459135709"></string>
<string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> က မတုံ့ပြန်ပါ။ \n\n၎င်းကို သင် ပိတ်လိုပါသလား?"</string>
<string name="anr_activity_process" msgid="5776209883299089767">"လှုပ်ရှားမှု <xliff:g id="ACTIVITY">%1$s</xliff:g>က မတုံ့ပြန်ပါ။\n\n၎င်းကို သင် ပိတ်လိုပါသလား?"</string>
@@ -1218,35 +1218,35 @@
<string name="anr_process" msgid="6513209874880517125">"ဖြစ်စဉ်<xliff:g id="PROCESS">%1$s</xliff:g> က မတုံ့ပြန်ပါ။ \n\n၎င်းကို သင် ပိတ် ချင်သလား?"</string>
<string name="force_close" msgid="8346072094521265605">"ကောင်းပြီ"</string>
<string name="report" msgid="4060218260984795706">"သတင်းပို့ပါ"</string>
- <string name="wait" msgid="7147118217226317732">"စောင့်ဆိုင်းရန်"</string>
+ <string name="wait" msgid="7147118217226317732">"စောင့်ဆိုင်းရန်"</string>
<string name="webpage_unresponsive" msgid="3272758351138122503">"စာမျက်နှာမှာ ပြန်လည် တုံ့ပြန်မှု မရှိတော့ပါ။\n\nပိတ်လိုက်ချင်ပါသလား?"</string>
<string name="launch_warning_title" msgid="1547997780506713581">"App ပြန်ညွှန်းခဲ့"</string>
<string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် ယခုအလုပ်လုပ်နေသည်"</string>
- <string name="launch_warning_original" msgid="188102023021668683">"မူလ <xliff:g id="APP_NAME">%1$s</xliff:g> တွင် ထုတ်လွင့်သည်"</string>
+ <string name="launch_warning_original" msgid="188102023021668683">"မူလ <xliff:g id="APP_NAME">%1$s</xliff:g> တွင် ထုတ်လွင့်သည်"</string>
<string name="screen_compat_mode_scale" msgid="3202955667675944499">"စကေး"</string>
<string name="screen_compat_mode_show" msgid="4013878876486655892">"အမြဲပြသရန်"</string>
- <string name="screen_compat_mode_hint" msgid="1064524084543304459">"ဒါကို စနစ် ဆက်တင်များထဲ ပြန်ဖွင့်ပေးရန် > Apps > ဒေါင်းလုဒ် လုပ်ပြီး။"</string>
- <string name="smv_application" msgid="3307209192155442829">"app <xliff:g id="APPLICATION">%1$s</xliff:g> (လုပ်ငန်းစဉ် <xliff:g id="PROCESS">%2$s</xliff:g>) က ကိုယ်တိုင် ပြဌာန်းခဲ့သည့် StrictMode မူဝါဒကို ချိုးဖောက်ခဲ့သည်။"</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"ဒါကို စနစ် ဆက်တင်များထဲ ပြန်ဖွင့်ပေးရန် > Apps > ဒေါင်းလုဒ် လုပ်ပြီး။"</string>
+ <string name="smv_application" msgid="3307209192155442829">"app <xliff:g id="APPLICATION">%1$s</xliff:g> (လုပ်ငန်းစဉ် <xliff:g id="PROCESS">%2$s</xliff:g>) က ကိုယ်တိုင် ပြဌာန်းခဲ့သည့် StrictMode မူဝါဒကို ချိုးဖောက်ခဲ့သည်။"</string>
<string name="smv_process" msgid="5120397012047462446">"ဤ<xliff:g id="PROCESS">%1$s</xliff:g>ဖြစ်စဥ်မှာ ကိုယ်တိုင်အကျိုးသက်ရောက်သော StrictModeမူဝါဒအား ချိုးဖောက်သည်"</string>
<string name="android_upgrading_title" msgid="1584192285441405746">"အန်ဒရွိုက်ကို မွမ်းမံနေ…"</string>
<string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g> ထဲက app<xliff:g id="NUMBER_1">%2$d</xliff:g>ကို ဆီလျော်အောင် လုပ်နေ"</string>
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"appများကို စတင်နေ"</string>
- <string name="android_upgrading_complete" msgid="1405954754112999229">"လုပ်ငန်းစနစ်ထည့်သွင်း၍ ပြန်လည်စတင်ရန် ပြီးပါပြီ"</string>
+ <string name="android_upgrading_complete" msgid="1405954754112999229">"လုပ်ငန်းစနစ်ထည့်သွင်း၍ ပြန်လည်စတင်ရန် ပြီးပါပြီ"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> က အလုပ်လုပ်နေသည်"</string>
<string name="heavy_weight_notification_detail" msgid="1721681741617898865">"ppဆီ ပြောင်းရန် ထိပါ"</string>
<string name="heavy_weight_switcher_title" msgid="7153167085403298169">"appများကို ပြောင်းမလား?"</string>
<string name="heavy_weight_switcher_text" msgid="7022631924534406403">"အခြား app တစ်ခု အလုပ်လုပ်နေ၍ သင်က အသစ် တစ်ခုကို မစမီ ၎င်းကို ရပ်ပစ်ရမည်။"</string>
<string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>သို့ပြန်သွားရန်"</string>
- <string name="old_app_description" msgid="2082094275580358049">"pp အသစ်ကို မစတင်ပါနှင့်။"</string>
+ <string name="old_app_description" msgid="2082094275580358049">"pp အသစ်ကို မစတင်ပါနှင့်။"</string>
<string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g>စတင်ပါ"</string>
<string name="new_app_description" msgid="1932143598371537340">"app အဟောင်းကို မသိမ်းဆည်းဘဲ ရပ်လိုက်ပါ။"</string>
<string name="sendText" msgid="5209874571959469142">"စာတိုအတွက် လုပ်ဆောင်ချက် ရေးပါ"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"ဖုန်းမြည်သံအတိုးအကျယ်"</string>
<string name="volume_music" msgid="5421651157138628171">"မီဒီယာအသံအတိုးအကျယ်"</string>
- <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"ဘလူးတူးသ်မှတဆင့်ဖွင့်ရန်"</string>
+ <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"ဘလူးတူးသ်မှတဆင့်ဖွင့်ရန်"</string>
<string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"အသံတိတ် မြည်သံ သတ်မှတ်ရန်"</string>
<string name="volume_call" msgid="3941680041282788711">"ခေါ်ဆိုနေခြင်းအသံအတိုးအကျယ်"</string>
- <string name="volume_bluetooth_call" msgid="2002891926351151534">"ဘလူးတုသ်ဖြင့် ခေါ်ဆိုနေခြင်းအသံအတိုးအကျယ်"</string>
+ <string name="volume_bluetooth_call" msgid="2002891926351151534">"ဘလူးတုသ်ဖြင့် ခေါ်ဆိုနေခြင်းအသံအတိုးအကျယ်"</string>
<string name="volume_alarm" msgid="1985191616042689100">"နှိုးစက်သံအတိုးအကျယ်"</string>
<string name="volume_notification" msgid="2422265656744276715">"အကြောင်းကြားသံအတိုးအကျယ်"</string>
<string name="volume_unknown" msgid="1400219669770445902">"အသံအတိုးအကျယ်"</string>
@@ -1265,8 +1265,8 @@
<item quantity="other" msgid="4192424489168397386">"ဝိုင်ဖိုင်ကွန်ယက်များရှိသည်"</item>
</plurals>
<plurals name="wifi_available_detailed">
- <item quantity="one" msgid="1634101450343277345">"ဖွင့်ထားသောဝိုင်ဖိုင်ကွန်ယက်ရှိသည်"</item>
- <item quantity="other" msgid="7915895323644292768">"ဖွင့်ထားသောဝိုင်ဖိုင်ကွန်ယက်များရှိသည်"</item>
+ <item quantity="one" msgid="1634101450343277345">"ဖွင့်ထားသောဝိုင်ဖိုင်ကွန်ယက်ရှိသည်"</item>
+ <item quantity="other" msgid="7915895323644292768">"ဖွင့်ထားသောဝိုင်ဖိုင်ကွန်ယက်များရှိသည်"</item>
</plurals>
<string name="wifi_available_sign_in" msgid="4029489716605255386">"ဝိုင်ဖိုင်ကွန်ရက်သို့ ဝင်ပါ"</string>
<string name="network_available_sign_in" msgid="8495155593358054676">"ကွန်ရက်သို့ ဝင်ပါ"</string>
@@ -1277,7 +1277,7 @@
<string name="wifi_p2p_dialog_title" msgid="97611782659324517">"တိုက်ရိုက် ဝိုင်ဖိုင်"</string>
<string name="wifi_p2p_turnon_message" msgid="2909250942299627244">"တိုက်ရိုက်ဝိုင်ဖိုင်ကို စတင်ပါ။ ၎င်းသည် ဝိုင်ဖိုင် ဟော့စပေါ့ကို ရပ်ဆိုင်းစေမှာ ဖြစ်ပါသည်။"</string>
<string name="wifi_p2p_failed_message" msgid="3763669677935623084">"တိုက်ရိုက်ဝိုင်ဖိုင်ကို စတင်လို့ မရပါ"</string>
- <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"ဝိုင်ဖိုင် တိုက်ရိုက် ကိုဖွင့်ထားသည်"</string>
+ <string name="wifi_p2p_enabled_notification_title" msgid="2068321881673734886">"ဝိုင်ဖိုင် တိုက်ရိုက် ကိုဖွင့်ထားသည်"</string>
<string name="wifi_p2p_enabled_notification_message" msgid="1638949953993894335">"အပြင်အဆင်များအတွက်ထိပါ"</string>
<string name="accept" msgid="1645267259272829559">"လက်ခံရန်"</string>
<string name="decline" msgid="2112225451706137894">"လက်မခံပါ"</string>
@@ -1289,14 +1289,14 @@
<string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"ပင် နံပါတ်:"</string>
<string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> နှင့် ဆက်သွယ်ထားစဉ် တက်ဘလက်ဟာ ဝိုင်ဖိုင် နှင့် ဆက်သွယ်မှု ရပ်ဆိုင်းထားမှာ ဖြစ်ပါတယ်"</string>
<string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ကို ဆက်သွယ်ထားစဉ် ဖုန်းအား ဝိုင်ဖိုင်မှ ဆက်သွယ်မှု ရပ်ဆိုင်းထားပါမည်"</string>
- <string name="select_character" msgid="3365550120617701745">"စာရိုက်ထည့်ရန်"</string>
- <string name="sms_control_title" msgid="7296612781128917719">"စာတိုပို့စနစ်(SMS)ဖြင့် စာများ ပို့သည်"</string>
+ <string name="select_character" msgid="3365550120617701745">"စာရိုက်ထည့်ရန်"</string>
+ <string name="sms_control_title" msgid="7296612781128917719">"စာတိုပို့စနစ်(SMS)ဖြင့် စာများ ပို့သည်"</string>
<string name="sms_control_message" msgid="3867899169651496433">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> မှ စာ အမြောက်အများ ပို့နေပါသည်။ ဒီအပလီကေးရှင်းကို ဆက်လက်ပြီး လုပ်ဆောင်ရန် ခွင့်ပြုပါမလား"</string>
<string name="sms_control_yes" msgid="3663725993855816807">"ခွင့်ပြုရန်"</string>
<string name="sms_control_no" msgid="625438561395534982">"ငြင်းပယ်ခြင်း"</string>
<string name="sms_short_code_confirm_message" msgid="1645436466285310855">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> မှ <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b> ကို စာတို ပို့ချင်ပါသည်"</string>
- <string name="sms_short_code_details" msgid="5873295990846059400"><b>"ဒါက သင့် မိုဘိုင်း အကောင့် အတွက် "</b>" ကုန်ကျမှု ရှိလာနိုင်သည်။"</string>
- <string name="sms_premium_short_code_details" msgid="7869234868023975"><b>"ဒါက သင့် မိုဘိုင်း အကောင့် အတွက် ကုန်ကျမှု ရှိလာနိုင်သည်။"</b></string>
+ <string name="sms_short_code_details" msgid="5873295990846059400"><b>"ဒါက သင့် မိုဘိုင်း အကောင့် အတွက် "</b>" ကုန်ကျမှု ရှိလာနိုင်သည်။"</string>
+ <string name="sms_premium_short_code_details" msgid="7869234868023975"><b>"ဒါက သင့် မိုဘိုင်း အကောင့် အတွက် ကုန်ကျမှု ရှိလာနိုင်သည်။"</b></string>
<string name="sms_short_code_confirm_allow" msgid="4458878637111023413">"ပို့ရန်"</string>
<string name="sms_short_code_confirm_deny" msgid="2927389840209170706">"ထားတော့"</string>
<string name="sms_short_code_remember_choice" msgid="5289538592272218136">"ကျွန်ပ်၏ရွေးချယ်မှုကို မှတ်ထားရန်"</string>
@@ -1304,10 +1304,10 @@
<string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"အမြဲခွင့်ပြုရန်"</string>
<string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"ဘယ်တော့မှခွင့်မပြုပါ"</string>
<string name="sim_removed_title" msgid="6227712319223226185">"SIMကဒ်ဖယ်ရှားခြင်း"</string>
- <string name="sim_removed_message" msgid="5450336489923274918">"သင်က မှန်ကန်သည့် ဆင်းမ် ကဒ် တစ်ခုနှင့် ပြန်မစမချင်း ဆယ်လူလာ ကွန်ရက်ကို ရှာတွေ့မည် မဟုတ်ပါ။"</string>
+ <string name="sim_removed_message" msgid="5450336489923274918">"သင်က မှန်ကန်သည့် ဆင်းမ် ကဒ် တစ်ခုနှင့် ပြန်မစမချင်း ဆယ်လူလာ ကွန်ရက်ကို ရှာတွေ့မည် မဟုတ်ပါ။"</string>
<string name="sim_done_button" msgid="827949989369963775">"ပြီးပါပြီ"</string>
- <string name="sim_added_title" msgid="3719670512889674693">"ဆင်းမ်ကဒ် ထည့်ပါသည်"</string>
- <string name="sim_added_message" msgid="7797975656153714319">"ဆယ်လူလာ ကွန်ရက်ကို ရယူသုံးရန် သင့် ကိရိယာကို ပြန်ဖွင့်ပေးပါ။"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"ဆင်းမ်ကဒ် ထည့်ပါသည်"</string>
+ <string name="sim_added_message" msgid="7797975656153714319">"ဆယ်လူလာ ကွန်ရက်ကို ရယူသုံးရန် သင့် ကိရိယာကို ပြန်ဖွင့်ပေးပါ။"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"အစက ပြန်စရန်"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"အချိန်သတ်မှတ်ရန်"</string>
<string name="date_picker_dialog_title" msgid="5879450659453782278">"ရက်စွဲ အတည်ပြုရန်"</string>
@@ -1315,13 +1315,13 @@
<string name="date_time_done" msgid="2507683751759308828">"ပြီးပါပြီ"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"အသစ်: "</font></string>
<string name="perms_description_app" msgid="5139836143293299417">"<xliff:g id="APP_NAME">%1$s</xliff:g> မှ ထောက်ပံ့သည်"</string>
- <string name="no_permissions" msgid="7283357728219338112">"ခွင့်ပြုချက်မလိုအပ်ပါ"</string>
+ <string name="no_permissions" msgid="7283357728219338112">"ခွင့်ပြုချက်မလိုအပ်ပါ"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"သင့်အတွက် ပိုက်ဆံကုန်ကျနိုင်ပါသည်"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB ဖြင့်အချက်အလက်မြောက်များစွာ သိမ်းဆည်းနိုင်သော နေရာ"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB ချိန်ဆက်ထားပြီး"</string>
<string name="usb_storage_message" product="nosdcard" msgid="3308538094316477839">"သင့်ကွန်ပျူတာကို USB မှ တဆင့် ဆက်သွယ်ထားပါသည်။ ကွန်ပျူတာနဲ့ အန်းဒရွိုက်၏ USB သိုလှောင်မှု အကြား အချက်အလက် လွှဲပြောင်းရန် တို့ထိပါ"</string>
<string name="usb_storage_message" product="default" msgid="805351000446037811">"သင့်ကွန်ပျူတာကို USB မှ တဆင့် ဆက်သွယ်ထားပါသည်။ ကွန်ပျူတာနဲ့ အန်းဒရွိုက်၏ SD ကဒ် အကြား အချက်အလက် လွှဲပြောင်းရန် တို့ထိပါ"</string>
- <string name="usb_storage_button_mount" msgid="1052259930369508235">"USBသိမ်းဆည်းခြင်းကိုဖွင့်ရန်"</string>
+ <string name="usb_storage_button_mount" msgid="1052259930369508235">"USBသိမ်းဆည်းခြင်းကိုဖွင့်ရန်"</string>
<string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"USB ကို သုံးပြီး USB ဖြင့်အချက်အလက်မြောက်များစွာ သိမ်းဆည်းနိုင်သော နေရာတွင် ပြသနာ ဖြစ်နေပါသည်"</string>
<string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"SD card ကို သုံးပြီး USB ဖြင့်အချက်အလက်မြောက်များစွာ သိမ်းဆည်းနိုင်သော နေရာတွင် ပြသနာ ဖြစ်နေပါသည်"</string>
<string name="usb_storage_notification_title" msgid="8175892554757216525">"USB ချိန်ဆက်ထားပြီး"</string>
@@ -1333,19 +1333,19 @@
<string name="usb_storage_stop_message" product="default" msgid="8043969782460613114">"USB သိုလှောင်မှုကို မပိတ်ခင်, ကွန်ပျူတာမှ Android ၏ SD ကဒ်ကို ဖြုတ်ပါ (\"eject\")"</string>
<string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"USBသိမ်းဆည်းခြင်းကိုပိတ်ရန်"</string>
<string name="usb_storage_stop_error_message" msgid="1970374898263063836">"USB သိုလှောင်မှု ပိတ်ရာတွင် ပြသနာရှိပါသည်။ USB လာရာအား မဆက်သွယ်ထားကြောင်း စစ်ဆေးပြီး ပြန်လည်ကြိုးစားပါ"</string>
- <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USBသိမ်းဆည်းခြင်းကိုဖွင့်ရန်"</string>
+ <string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"USBသိမ်းဆည်းခြင်းကိုဖွင့်ရန်"</string>
<string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"သင် ယူအက်စ်ဘီ နဲ့ သိမ်းဆည်းမှုကို ဖွင့်လိုက်ပါက တချို့ အပလီကေးရှင်းများ က ယူအက်စ်ဘီ နဲ့ သိမ်းဆည်းမှု ပြန်ပိတ်သည်အထိ အလုပ်မလုပ် သို့ သုံးစွဲရန် ရှိနေမည် မဟုတ်ပါ"</string>
<string name="dlg_error_title" msgid="7323658469626514207">"USBဆောင်ရွက်မှုမအောင်မြင်ပါ"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ကောင်းပြီ"</string>
- <string name="usb_mtp_notification_title" msgid="3699913097391550394">"မီဒီယာစက်အနေဖြင့် ချိတ်ဆက်သည်"</string>
- <string name="usb_ptp_notification_title" msgid="1960817192216064833">"ကင်မရာအနေဖြင့်ဆက်သွယ်ခြင်း"</string>
- <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"installerအနေဖြင့် ချိတ်ဆက်သည်"</string>
+ <string name="usb_mtp_notification_title" msgid="3699913097391550394">"မီဒီယာစက်အနေဖြင့် ချိတ်ဆက်သည်"</string>
+ <string name="usb_ptp_notification_title" msgid="1960817192216064833">"ကင်မရာအနေဖြင့်ဆက်သွယ်ခြင်း"</string>
+ <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"installerအနေဖြင့် ချိတ်ဆက်သည်"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"USBတွဲဖက်ပစ္စည်းအား ချိတ်ဆက်ထားသည်"</string>
<string name="usb_notification_message" msgid="2290859399983720271">"အခြား USB စိတ်ကြိုက်ရွေးချယ်ခွင့်များ အတွက် တို့ထိပါ။"</string>
<string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"USB သိုလှောင်ခန်းကို ပုံစံပြန်ချမလား?"</string>
<string name="extmedia_format_title" product="default" msgid="3648415921526526069">"SD ကဒ်ကို ပုံစံပြန်ချမလား?"</string>
- <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"သင်၏ USB သိုလှောင်ခန်းထဲ သိုလှောင်ထားသည့် ဖိုင်အားလုံး ဖျက်ခံရမည်။ ဒီလုပ်ရပ်ကို ပြန်ပြီး ပြောင်းလဲ မရနိုင်ပါ။"</string>
- <string name="extmedia_format_message" product="default" msgid="14131895027543830">"သင့် ကဒ် ထဲက ဒေတာ အားလုံး ဆုံးသွားမည်။"</string>
+ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"သင်၏ USB သိုလှောင်ခန်းထဲ သိုလှောင်ထားသည့် ဖိုင်အားလုံး ဖျက်ခံရမည်။ ဒီလုပ်ရပ်ကို ပြန်ပြီး ပြောင်းလဲ မရနိုင်ပါ။"</string>
+ <string name="extmedia_format_message" product="default" msgid="14131895027543830">"သင့် ကဒ် ထဲက ဒေတာ အားလုံး ဆုံးသွားမည်။"</string>
<string name="extmedia_format_button_format" msgid="4131064560127478695">"ပုံစံချရန်ပြင်ဆင်သည်"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB အမှားစစ်ခြင်းအား ချိတ်ဆက်ထားသည်"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB ဒီဘာဂင် ပိတ်ရန် ထိပါ။"</string>
@@ -1357,9 +1357,9 @@
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"လက်ကွက် အပြင်အဆင်ရွေးရန် တို့ထိပါ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
- <string name="candidates_style" msgid="4333913089637062257"><u>"ရွေးချယ်ခံမည့်သူ"</u></string>
- <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"USBသိမ်းဆည်းသည့်အရာအားအဆင်သင့်စေရန်ပြုလုပ်ခြင်း"</string>
- <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"SDကဒ်အအဆင်သင့်စေရန်ပြုလုပ်ခြင်း"</string>
+ <string name="candidates_style" msgid="4333913089637062257"><u>"ရွေးချယ်ခံမည့်သူ"</u></string>
+ <string name="ext_media_checking_notification_title" product="nosdcard" msgid="3449816005351468560">"USBသိမ်းဆည်းသည့်အရာအားအဆင်သင့်စေရန်ပြုလုပ်ခြင်း"</string>
+ <string name="ext_media_checking_notification_title" product="default" msgid="5457603418970994050">"SDကဒ်အအဆင်သင့်စေရန်ပြုလုပ်ခြင်း"</string>
<string name="ext_media_checking_notification_message" msgid="8287319882926737053">"မှားယွင်းမှုရှိမရှိစစ်ခြင်း"</string>
<string name="ext_media_nofs_notification_title" product="nosdcard" msgid="7788040745686229307">"USBသိမ်းဆည်းမှု၌ ဘာမှမရှိပါ"</string>
<string name="ext_media_nofs_notification_title" product="default" msgid="780477838241212997">"SDကဒ်ထဲ၌ဘာမှမရှိပါ"</string>
@@ -1371,19 +1371,19 @@
<string name="ext_media_unmountable_notification_message" product="default" msgid="1753898567525568253">"SD ကဒ် ပျက်စီးနေပါသည်။ ပြန်လည် ဖောမက် ချကြည့်ပါ"</string>
<string name="ext_media_badremoval_notification_title" product="nosdcard" msgid="1661683031330951073">"မရည်ရွယ်ပဲ USBသိုလှောင်ကိရိယာဖယ်ရှားသည်"</string>
<string name="ext_media_badremoval_notification_title" product="default" msgid="6872152882604407837">"မထင်မှတ်ပဲSDကဒ်ဖြုတ်သည်"</string>
- <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"ဒေတာမဆုံးရှုံးစေရန် မပြုတ်ခင် USB သိမ်းဆည်းခြင်းအား မဖြုတ်ပါနှင့်"</string>
+ <string name="ext_media_badremoval_notification_message" product="nosdcard" msgid="4329848819865594241">"ဒေတာမဆုံးရှုံးစေရန် မပြုတ်ခင် USB သိမ်းဆည်းခြင်းအား မဖြုတ်ပါနှင့်"</string>
<string name="ext_media_badremoval_notification_message" product="default" msgid="7260183293747448241">"ဒေတာမဆုံးရှုံးစေရန် မပြုတ်ခင် SDကဒ်အားမတပ်ရန်"</string>
<string name="ext_media_safe_unmount_notification_title" product="nosdcard" msgid="3967973893270360230">"USB ကိရိယာအား ဖြုတ်နိုင်သည်"</string>
<string name="ext_media_safe_unmount_notification_title" product="default" msgid="6729801130790616200">"အန္တရာယ်ကင်းစွာSDကဒ်အား ဖယ်နိုင်ပါပြီ"</string>
- <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"USBသိမ်းဆည်းသည့်အရာအား အန္တရာယ်ကင်းစွာဖယ်နိုင်ပါပြီ"</string>
+ <string name="ext_media_safe_unmount_notification_message" product="nosdcard" msgid="6142195361606493530">"USBသိမ်းဆည်းသည့်အရာအား အန္တရာယ်ကင်းစွာဖယ်နိုင်ပါပြီ"</string>
<string name="ext_media_safe_unmount_notification_message" product="default" msgid="568841278138377604">"SDကဒ်အား အန္တရာယ်ကင်းစွာဖယ်နိုင်ပါပြီ"</string>
<string name="ext_media_nomedia_notification_title" product="nosdcard" msgid="4486377230140227651">"USBသိုလှောင်ကိရိယာအား ဖြုတ်သည်"</string>
<string name="ext_media_nomedia_notification_title" product="default" msgid="8902518030404381318">"SDကဒ်ဖယ်ထားသည်"</string>
- <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USBသိမ်းဆည်းသည့်အရာ ဖယ်ရှားလိုက်သည်။ နောက်မီဒီယာအသစ်တခုအားထည့်ပါ။"</string>
- <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SDကဒ်အားဖယ်ရှားလိုက်သည်။ နောက်အသစ်တခုအားထည့်ပါ။"</string>
+ <string name="ext_media_nomedia_notification_message" product="nosdcard" msgid="6921126162580574143">"USBသိမ်းဆည်းသည့်အရာ ဖယ်ရှားလိုက်သည်။ နောက်မီဒီယာအသစ်တခုအားထည့်ပါ။"</string>
+ <string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"SDကဒ်အားဖယ်ရှားလိုက်သည်။ နောက်အသစ်တခုအားထည့်ပါ။"</string>
<string name="activity_list_empty" msgid="1675388330786841066">"တိုက်ဆိုင်သော ပြုလုပ်ချက် ရှာမတွေ့ပါ"</string>
- <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"အစိတ်အပိုင်းများသုံစွဲခြင်း ကိန်းဂဏန်းအချက်အလက်များကို အဆင်မြှင့်ရန်ပြုလုပ်ခြင်း"</string>
- <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"appအား စုစည်းထားသည့် အစိတ်အပိုင်း၏ သုံးစွဲမှု စာရင်းအင်းများကို မွမ်းမံခွင့် ပြုသည်။ သာမန် appများ အသုံးပြုရန် မဟုတ်ပါ။"</string>
+ <string name="permlab_pkgUsageStats" msgid="8787352074326748892">"အစိတ်အပိုင်းများသုံစွဲခြင်း ကိန်းဂဏန်းအချက်အလက်များကို အဆင်မြှင့်ရန်ပြုလုပ်ခြင်း"</string>
+ <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"appအား စုစည်းထားသည့် အစိတ်အပိုင်း၏ သုံးစွဲမှု စာရင်းအင်းများကို မွမ်းမံခွင့် ပြုသည်။ သာမန် appများ အသုံးပြုရန် မဟုတ်ပါ။"</string>
<string name="permlab_copyProtectedData" msgid="4341036311211406692">"အကြောင်းအရာ ကော်ပီ လုပ်ရန်"</string>
<string name="permdesc_copyProtectedData" msgid="4390697124288317831">"appအား ပုံသေ ကွန်တင်နား ဝန်ဆောင်မှု၏ အကြောင်းအရာကို ကူးယူရန် တောင်းခံနိုင်သည်။ သာမန် appများ သုံးရန် မဟုတ်ပါ။"</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"မီဒီယာထွက်ပေါက်အား လမ်းလွှဲပြောင်းခြင်း"</string>
@@ -1393,19 +1393,19 @@
<string name="permlab_control_keyguard" msgid="172195184207828387">"keyguard အား ပြသခြင်း ကွယ်ဖျောက်ခြင်းများအား ထိန်းချုပ်ခြင်း"</string>
<string name="permdesc_control_keyguard" msgid="3043732290518629061">"အပလီကေးရှင်း ကို keguard secure storage အား ထိန်းချုပ်ခွင့်ပေးခြင်း"</string>
<string name="permlab_trust_listener" msgid="1765718054003704476">"ယုံကြည်မှု အခြေအနေ ပြောင်းလဲမှုများကို စူးစမ်းခြင်း။"</string>
- <string name="permdesc_trust_listener" msgid="8233895334214716864">"အပလီကေးရှင်းအား ယုံကြည်မှု အခြေအနေ ထဲက အပြောင်းအလဲများကို စူးစမ်းခွင့် ပြုသည်။"</string>
- <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"ယုံကြည်မှု အေဂျင့် စီစဉ်ပေးသည်။"</string>
- <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"အပလီကေးရှင်းအား ယုံကြည်မှု အေဂျင့် စီစဉ်ခွင့် ပေးသည်။"</string>
- <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"ယုံကြည်ရ အေဂျင့် ဆက်တင် မီနူး ဖွင့်တင်ပါ။"</string>
- <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"အပလီကေးရှင်း တစ်ခုအား ယုံကြည်ရ အေဂျင့်၏ ပြုမူပုံကို ပြောင်းလဲစေနိုင်သည့် လှုပ်ရှားမှု တစ်ခုကို ဖွင့်တင်ခွင့် ပြုသည်။"</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"ယုံကြည်မှု အေဂျင့် ဝန်ဆောင်မှု တစ်ခုဆီသို့ ချိတ်တွဲခြင်း"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"စွဲကိုင်ထားသူအား ယုံကြည်မှု အေဂျင့် ဝန်ဆောင်မှုသို့ ချိတ်တွဲခွင့်ကို ပေးသည်။"</string>
+ <string name="permdesc_trust_listener" msgid="8233895334214716864">"အပလီကေးရှင်းအား ယုံကြည်မှု အခြေအနေ ထဲက အပြောင်းအလဲများကို စူးစမ်းခွင့် ပြုသည်။"</string>
+ <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"ယုံကြည်မှု အေဂျင့် စီစဉ်ပေးသည်။"</string>
+ <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"အပလီကေးရှင်းအား ယုံကြည်မှု အေဂျင့် စီစဉ်ခွင့် ပေးသည်။"</string>
+ <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"ယုံကြည်ရ အေဂျင့် ဆက်တင် မီနူး ဖွင့်တင်ပါ။"</string>
+ <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"အပလီကေးရှင်း တစ်ခုအား ယုံကြည်ရ အေဂျင့်၏ ပြုမူပုံကို ပြောင်းလဲစေနိုင်သည့် လှုပ်ရှားမှု တစ်ခုကို ဖွင့်တင်ခွင့် ပြုသည်။"</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"ယုံကြည်မှု အေဂျင့် ဝန်ဆောင်မှု တစ်ခုဆီသို့ ချိတ်တွဲခြင်း"</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"စွဲကိုင်ထားသူအား ယုံကြည်မှု အေဂျင့် ဝန်ဆောင်မှုသို့ ချိတ်တွဲခွင့်ကို ပေးသည်။"</string>
<string name="permlab_recovery" msgid="3157024487744125846">"အဆင့်မြှင့်ခြင်းနဲ့ ပြန်လည် ထိန်းသိမ်းခြင်း များနှင့် ဆက်ဆံစေခြင်း"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"အပလီကေးရှင်းအား စစ်စတန်အား ပြန်လည် ကယ်ဆယ်မှု နဲ့ အဆင့်မြှင့်ခြင်းများအား လုပ်ဆောင်ခွင့် ပေးခြင်း"</string>
<string name="permlab_manageMediaProjection" msgid="1120495449419929218">"မီဒီယာ ပရိုဂျက် ချိတ်ဆက်မှုများကို စီမံကွပ်ကဲခြင်း"</string>
- <string name="permdesc_manageMediaProjection" msgid="8053759147529492856">"အပလီကေးရှင်းအား မီဒီယာ ပရိုဂျက် ချိတ်ဆက်မှုများကို စီမံကွပ်ကဲခွင့် ပြုသည်။ ယင်း ချိတ်ဆက်မှုများ အတွင်းမှာ အပလီကေးရှင်း အတွက် ပြသမှု နှင့် အသံ အကြောင်းအရာများကို ဖမ်းယူရေး အခွင့်အလမ်းများကို စီမံပေးနိုင်သည်။ ပုံမှန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
+ <string name="permdesc_manageMediaProjection" msgid="8053759147529492856">"အပလီကေးရှင်းအား မီဒီယာ ပရိုဂျက် ချိတ်ဆက်မှုများကို စီမံကွပ်ကဲခွင့် ပြုသည်။ ယင်း ချိတ်ဆက်မှုများ အတွင်းမှာ အပလီကေးရှင်း အတွက် ပြသမှု နှင့် အသံ အကြောင်းအရာများကို ဖမ်းယူရေး အခွင့်အလမ်းများကို စီမံပေးနိုင်သည်။ ပုံမှန် appများ အတွက် ဘယ်တော့မှ မလိုအပ်နိုင်ပါ။"</string>
<string name="permlab_readInstallSessions" msgid="6165432407628065939">"တပ်ဆင်ရေး ချိတ်ဆက်မှုများကို ဖတ်ရန်"</string>
- <string name="permdesc_readInstallSessions" msgid="2049771699626019849">"အပလီကေးရှင်းအား တပ်ဆင်ရေး ချိတ်ဆက်မှုများကို ဖတ်ခွင့်ပြုသည်။ ၎င်းသည် ဖွင့်သုံးနေသည့် အထုပ်အား တပ်ဆင်မှုဆိုင်ရာ အသေးိစတ်များကို ကြည့်ရှုခွင့် ပြုသည်။"</string>
+ <string name="permdesc_readInstallSessions" msgid="2049771699626019849">"အပလီကေးရှင်းအား တပ်ဆင်ရေး ချိတ်ဆက်မှုများကို ဖတ်ခွင့်ပြုသည်။ ၎င်းသည် ဖွင့်သုံးနေသည့် အထုပ်အား တပ်ဆင်မှုဆိုင်ရာ အသေးိစတ်များကို ကြည့်ရှုခွင့် ပြုသည်။"</string>
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"ချုံ့ချဲ့မှုကို ထိန်းချုပ်ရန် အတွက် နှစ်ကြိမ် ထိပါ"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"ဝဒ်ဂျက်ထည့်လို့ မရပါ"</string>
<string name="ime_action_go" msgid="8320845651737369027">"သွားပါ"</string>
@@ -1416,9 +1416,9 @@
<string name="ime_action_previous" msgid="1443550039250105948">"အနောက်သို့"</string>
<string name="ime_action_default" msgid="2840921885558045721">"လုပ်ဆောင်ချက်"</string>
<string name="dial_number_using" msgid="5789176425167573586">\n"အား အသုံးပြု၍ <xliff:g id="NUMBER">%s</xliff:g>နံပါတ်ခေါ်ဆိုပါ"</string>
- <string name="create_contact_using" msgid="4947405226788104538">\n"အား အသုံးပြု၍<xliff:g id="NUMBER">%s</xliff:g>ဆက်သွယ်မည့်သူများအား ဖန်တီးခြင်း"</string>
- <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"အောက်ပါထဲက app တစ်ခု သို့မဟုတ် ပိုလျက် သင်၏ အကောင့်ကို၊ ယခု နှင့် အနာဂတ်မှာ ရယူအသုံးချရန် ခွင့်ပြုချက်ကို တောင်းထားသည်။"</string>
- <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"ဤတောင်းခံမှုအားခွင့်ပြုမည်လား"</string>
+ <string name="create_contact_using" msgid="4947405226788104538">\n"အား အသုံးပြု၍<xliff:g id="NUMBER">%s</xliff:g>ဆက်သွယ်မည့်သူများအား ဖန်တီးခြင်း"</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"အောက်ပါထဲက app တစ်ခု သို့မဟုတ် ပိုလျက် သင်၏ အကောင့်ကို၊ ယခု နှင့် အနာဂတ်မှာ ရယူအသုံးချရန် ခွင့်ပြုချက်ကို တောင်းထားသည်။"</string>
+ <string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"ဤတောင်းခံမှုအားခွင့်ပြုမည်လား"</string>
<string name="grant_permissions_header_text" msgid="6874497408201826708">"သုံးစွဲခွင့် တောင်းဆိုရန်"</string>
<string name="allow" msgid="7225948811296386551">"ခွင့်ပြုသည်"</string>
<string name="deny" msgid="2081879885755434506">"ငြင်းပယ်သည်"</string>
@@ -1426,7 +1426,7 @@
<string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"အကောင့် <xliff:g id="ACCOUNT">%s</xliff:g> အတွက် \n ခွင့်ပြုချက် တောင်းခံထားပြီး"</string>
<string name="forward_intent_to_owner" msgid="1207197447013960896">"သင်သည် ဒီappကို သင့်အလုပ်ပရိုဖိုင် ပြင်ပတွင် အသုံးပြုနေ၏"</string>
<string name="forward_intent_to_work" msgid="621480743856004612">"သင်သည် ဒီappကို သင်၏ အလုပ် ပရိုဖိုင် ထဲမှာ အသုံးပြုနေသည်"</string>
- <string name="input_method_binding_label" msgid="1283557179944992649">"ထည့်သွင်းရန်နည်းလမ်း"</string>
+ <string name="input_method_binding_label" msgid="1283557179944992649">"ထည့်သွင်းရန်နည်းလမ်း"</string>
<string name="sync_binding_label" msgid="3687969138375092423">"ထပ်တူ ကိုက်ညီခြင်း"</string>
<string name="accessibility_binding_label" msgid="4148120742096474641">"အသုံးပြုခွင့်"</string>
<string name="wallpaper_binding_label" msgid="1240087844304687662">"နောက်ခံ"</string>
@@ -1442,12 +1442,12 @@
<string name="vpn_lockdown_error" msgid="6009249814034708175">"အမြဲတမ်းဖွင့်ထား VPN အမှား"</string>
<string name="vpn_lockdown_config" msgid="6415899150671537970">"ပြင်ဆင်ရန် ထိလိုက်ပါ"</string>
<string name="upload_file" msgid="2897957172366730416">"ဖိုင်ရွေးချယ်ရန်"</string>
- <string name="no_file_chosen" msgid="6363648562170759465">"မည်သည့်ဖိုင်ကိုမှမရွေးပါ"</string>
+ <string name="no_file_chosen" msgid="6363648562170759465">"မည်သည့်ဖိုင်ကိုမှမရွေးပါ"</string>
<string name="reset" msgid="2448168080964209908">"ပြန်လည်စတင်စေရန်"</string>
- <string name="submit" msgid="1602335572089911941">"တင်ပြရန်"</string>
+ <string name="submit" msgid="1602335572089911941">"တင်ပြရန်"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"ကားထဲတွင်အသုံးပြုနိုင်သောစနစ် ရရှိနိုင်သည်"</string>
<string name="car_mode_disable_notification_message" msgid="8035230537563503262">"ကားပေါ်ရောက် အခြေအနေမှ ထွက်ရန် ထိလိုက်ပါ"</string>
- <string name="tethered_notification_title" msgid="3146694234398202601">"တဆင့်ပြန်လည်လွှင့်ခြင်း သို့မဟုတ် ဟော့စပေါ့ ဖွင့်ထားသည်"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"တဆင့်ပြန်လည်လွှင့်ခြင်း သို့မဟုတ် ဟော့စပေါ့ ဖွင့်ထားသည်"</string>
<string name="tethered_notification_message" msgid="6857031760103062982">"အပြင်အဆင်ပြုလုပ်ရန် ပိုမိုသိနားလည်စေရန် တို့ထိပါ။"</string>
<string name="back_button_label" msgid="2300470004503343439">"နောက်သို့"</string>
<string name="next_button_label" msgid="1080555104677992408">"နောက်"</string>
@@ -1482,14 +1482,14 @@
<string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>)မှတောင်းခံသည်"</string>
<string name="gpsVerifYes" msgid="2346566072867213563">"ဟုတ်ကဲ့"</string>
<string name="gpsVerifNo" msgid="1146564937346454865">"မဟုတ်ပါ"</string>
- <string name="sync_too_many_deletes" msgid="5296321850662746890">"ပယ်ဖျက်မည့်ကန့်သတ်နှုန်းကျော်လွန်သည်"</string>
+ <string name="sync_too_many_deletes" msgid="5296321850662746890">"ပယ်ဖျက်မည့်ကန့်သတ်နှုန်းကျော်လွန်သည်"</string>
<string name="sync_too_many_deletes_desc" msgid="496551671008694245">"<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>၊ account <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> အတွက် စုစုပေါင်း <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> အရာဖျက်ထားပါသည်။ သင်ဘာလုပ်ချင်ပါလဲ?"</string>
<string name="sync_really_delete" msgid="2572600103122596243">"ဤအရာများကိုဖျက်ပါ"</string>
<string name="sync_undo_deletes" msgid="2941317360600338602">"ဖျက်ပီးသည်များကို ပယ်ဖျက်ရန်"</string>
<string name="sync_do_nothing" msgid="3743764740430821845">"လက်ရှိ ဘာမှမလုပ်ရန်"</string>
- <string name="choose_account_label" msgid="5655203089746423927">"အကောင့် တစ်ခု ရွေးပါ"</string>
- <string name="add_account_label" msgid="2935267344849993553">"အကောင့် ထပ်ဖြည့်ပါ"</string>
- <string name="add_account_button_label" msgid="3611982894853435874">"အကောင့်ထပ်ထည့်ရန်"</string>
+ <string name="choose_account_label" msgid="5655203089746423927">"အကောင့် တစ်ခု ရွေးပါ"</string>
+ <string name="add_account_label" msgid="2935267344849993553">"အကောင့် ထပ်ဖြည့်ပါ"</string>
+ <string name="add_account_button_label" msgid="3611982894853435874">"အကောင့်ထပ်ထည့်ရန်"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"တိုးရန်"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"လျှော့ရန်"</string>
<string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> ကြာကြာ ဖိ ကိုင်ထားပါ"</string>
@@ -1509,15 +1509,15 @@
<string name="keyboardview_keycode_alt" msgid="4856868820040051939">"Altခလုတ်"</string>
<string name="keyboardview_keycode_cancel" msgid="1203984017245783244">"ပယ်ဖျက်ရန်ခလုတ်"</string>
<string name="keyboardview_keycode_delete" msgid="3337914833206635744">"ဖျက်ရန်ခလုတ်"</string>
- <string name="keyboardview_keycode_done" msgid="1992571118466679775">"ပြီးဆုံးသည့်ခလုတ်"</string>
+ <string name="keyboardview_keycode_done" msgid="1992571118466679775">"ပြီးဆုံးသည့်ခလုတ်"</string>
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"စနစ်ပြောင်းခြင်းခလုတ်"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Shiftခလုတ်"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enterခလုတ်"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"app တစ်ခုကို ရွေးရန်"</string>
<string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"<xliff:g id="APPLICATION_NAME">%s</xliff:g> ကို စတင်လို့ မရပါ"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"မျှဝေဖို့ ရွေးပါ"</string>
- <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>နှင့် မျှဝေပါမည်"</string>
- <string name="content_description_sliding_handle" msgid="415975056159262248">"ဆွဲယူနိုင်သည့် လက်ကိုင်။ ထိပါ & ကိုင်ထားပါ။"</string>
+ <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>နှင့် မျှဝေပါမည်"</string>
+ <string name="content_description_sliding_handle" msgid="415975056159262248">"ဆွဲယူနိုင်သည့် လက်ကိုင်။ ထိပါ & ကိုင်ထားပါ။"</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"သော့ဖွင့်ရန် ပွတ်ဆွဲပါ"</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"စကားဝှက်ပြောဆိုမှုကို ကြားနိုင်ရန် မိုက်ခွက်ပါနားကြပ် တပ်ပြီး နားထောင်ပါ"</string>
<string name="keyboard_password_character_no_headset" msgid="2859873770886153678">"ဒေါ့"</string>
@@ -1528,21 +1528,21 @@
<string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s ၊ %2$s ၊ %3$s"</string>
<string name="storage_internal" msgid="4891916833657929263">"စက်တွင်း သိုလှောင်ထားမှု"</string>
<string name="storage_sd_card" msgid="3282948861378286745">"SD ကဒ်"</string>
- <string name="storage_usb" msgid="3017954059538517278">"USBဖြင့် သိမ်းဆည်း"</string>
+ <string name="storage_usb" msgid="3017954059538517278">"USBဖြင့် သိမ်းဆည်း"</string>
<string name="extract_edit_menu_button" msgid="8940478730496610137">"ပြင်ဆင်ရန်"</string>
<string name="data_usage_warning_title" msgid="1955638862122232342">"ဒေတာအသုံးပြုမှုသတိပေးချက်"</string>
<string name="data_usage_warning_body" msgid="2814673551471969954">"ဆက်တင်နှင့်သုံးစွဲမှုကြည့်ရန်ထိပါ"</string>
- <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G ဒေတာ ကန့်သတ်ချက် ပြည့်မီသွားပြီ"</string>
- <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G ဒေတာ ကန့်သတ်ချက် ပြည့်မီသွားပြီ"</string>
- <string name="data_usage_mobile_limit_title" msgid="557158376602636112">"ဆယ်လူလာ ဒေတာ ကန့်သတ်ချက် ပြည့်မီသွားပြီ"</string>
- <string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"ကြိုးမဲ့ ဒေတာ ကန့်သတ်ချက် ပြည့်မီသွားပြီ"</string>
+ <string name="data_usage_3g_limit_title" msgid="4361523876818447683">"2G-3G ဒေတာ ကန့်သတ်ချက် ပြည့်မီသွားပြီ"</string>
+ <string name="data_usage_4g_limit_title" msgid="4609566827219442376">"4G ဒေတာ ကန့်သတ်ချက် ပြည့်မီသွားပြီ"</string>
+ <string name="data_usage_mobile_limit_title" msgid="557158376602636112">"ဆယ်လူလာ ဒေတာ ကန့်သတ်ချက် ပြည့်မီသွားပြီ"</string>
+ <string name="data_usage_wifi_limit_title" msgid="5803363779034792676">"ကြိုးမဲ့ ဒေတာ ကန့်သတ်ချက် ပြည့်မီသွားပြီ"</string>
<string name="data_usage_limit_body" msgid="291731708279614081">"ကျန် စက်ဝန်း အတွက် ဒေတာကို ဆိုင်းငံ့ထား"</string>
<string name="data_usage_3g_limit_snoozed_title" msgid="7026739121138005231">"သတ်မှတ်ထားသော2G-3Gဒေတာအားကျော်လွန်နေသည်"</string>
<string name="data_usage_4g_limit_snoozed_title" msgid="1106562779311209039">"သတ်မှတ်ထားသော4Gဒေတာအားကျော်လွန်နေသည်"</string>
- <string name="data_usage_mobile_limit_snoozed_title" msgid="4941346653729943789">"ဆယ်လူလာ ကန့်သတ်ချက် ကျော်လွန်သွားပြီ"</string>
+ <string name="data_usage_mobile_limit_snoozed_title" msgid="4941346653729943789">"ဆယ်လူလာ ကန့်သတ်ချက် ကျော်လွန်သွားပြီ"</string>
<string name="data_usage_wifi_limit_snoozed_title" msgid="8743856006384825974">"သတ်မှတ်ဝိုင်ဖိုင်ဒေတာထက်ကျော်နေ"</string>
<string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"သက်မှတ်နှုန်းထက် <xliff:g id="SIZE">%s</xliff:g> ကျော်နေပါသည်"</string>
- <string name="data_usage_restricted_title" msgid="5965157361036321914">"နောက်ခံဒေတာ ကန့်သတ်ထားသည်"</string>
+ <string name="data_usage_restricted_title" msgid="5965157361036321914">"နောက်ခံဒေတာ ကန့်သတ်ထားသည်"</string>
<string name="data_usage_restricted_body" msgid="6741521330997452990">"ကန့်သတ်ထားမှု ဖျက်ရန် ထိလိုက်ပါ"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"လုံခြံုမှုဆိုင်ရာ အသိအမှတ်ပြုလက်မှတ်"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"ဤအသိအမှတ်ပြုလက်မှတ်မှာ တရားဝင်သည်"</string>
@@ -1560,7 +1560,7 @@
<string name="sha1_fingerprint" msgid="7930330235269404581">"SHA-1 လက်ပွေ"</string>
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"အားလုံးကို ကြည့်ရန်"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"လှုပ်ရှားမှုကို ရွေးရန်"</string>
- <string name="share_action_provider_share_with" msgid="5247684435979149216">"...နှင့် မျှဝေရန်"</string>
+ <string name="share_action_provider_share_with" msgid="5247684435979149216">"...နှင့် မျှဝေရန်"</string>
<string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"ပေးပို့နေစဉ်…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ဘရောက်ဇာ ဖွင့်မည်လား။"</string>
@@ -1630,7 +1630,7 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"သင် ပုံဖော်၍သော့ဖွင့်ခြင်းကို <xliff:g id="NUMBER_0">%d</xliff:g> အကြိမ် မှန်ကန်စွာ မပြုလုပ်နိုင်ပါ။ နောက်ထပ် <xliff:g id="NUMBER_1">%d</xliff:g> အကြိမ် မမှန်ကန်ပါက သင့်ဖုန်းအား အီးမေးလ်အသုံးပြု၍ သော့ဖွင့်ရန် တောင်းဆိုပါလိမ့်မည်။ \n\n <xliff:g id="NUMBER_2">%d</xliff:g> စက္ကန့်အကြာတွင် ပြန်လည် ကြိုးစားပါ"</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ဖယ်ရှားရန်"</string>
- <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"အသံကို အကြံပြုထားသည့် ပမာဏထက် မြှင့်ပေးရမလား?\n\nအသံကို မြင့်သည့် အဆင့်မှာ ကြာရှည်စွာ နားထောင်ခြင်းက သင်၏ နားကို ထိခိုက်စေနိုင်သည်။"</string>
+ <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"အသံကို အကြံပြုထားသည့် ပမာဏထက် မြှင့်ပေးရမလား?\n\nအသံကို မြင့်သည့် အဆင့်မှာ ကြာရှည်စွာ နားထောင်ခြင်းက သင်၏ နားကို ထိခိုက်စေနိုင်သည်။"</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"လက်နှစ်ချောင်းကို ထိကိုင်ထားခြင်းဖြင့် သုံးစွဲနိုင်မှုကို ခွင့်ပြုပါ"</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"သုံးစွဲခွင့် ကို ဖွင့်ထားသည်"</string>
<string name="enable_accessibility_canceled" msgid="3833923257966635673">"အသုံးပြုခွင့် ဖျက်လိုက်သည်"</string>
@@ -1638,7 +1638,7 @@
<string name="user_switching_message" msgid="2871009331809089783">"<xliff:g id="NAME">%1$s</xliff:g>သို့ ပြောင်းနေ…"</string>
<string name="owner_name" msgid="2716755460376028154">"ပိုင်ရှင်"</string>
<string name="error_message_title" msgid="4510373083082500195">"အမှား"</string>
- <string name="error_message_change_not_allowed" msgid="1347282344200417578">"ဒီအပြောင်းအလဲမျိုးကို သင့် စီမံအုပ်ချုပ်သူမှ ခွင့်မပြုပါ"</string>
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"ဒီအပြောင်းအလဲမျိုးကို သင့် စီမံအုပ်ချုပ်သူမှ ခွင့်မပြုပါ"</string>
<string name="app_not_found" msgid="3429141853498927379">"ဤလုပ်ဆောင်ချက်ကို ပြုလုပ်ပေးမည့် အပလီကေးရှင်း မရှိပါ။"</string>
<string name="revoke" msgid="5404479185228271586">"ထားတော့"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"အိုက်အက်စ်အို အေ ဝ"</string>
@@ -1757,26 +1757,26 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> ခုရွေးချယ်ထားပြီး"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> ကို ဖျက်ပြီးပါပြီ"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"အလုပ် <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="7570091317001980053">"ဒီမျက်နှာပြင် ပင်ထိုးမှုကို ဖြုတ်ရန်၊ နောက်သို့ နှင့် ခြုံကြည့်မှု ခလုတ်များကို တစ်ချိန်တည်း ထိကိုင်ထားပါ။"</string>
- <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ဒီမျက်နှာပြင် ပင်ထိုးမှုကို ဖြုတ်ရန် ခြုံကြည့်မှု ခလုတ်ကို ထိကိုင်ထားပါ။"</string>
- <string name="lock_to_app_toast_locked" msgid="8739004135132606329">"မျက်နှာပြင်ကို ပင်ထိုးထားသည်။ ပင်ထိုးထားမှု ဖြုတ်ခြင်းကို သင့် အဖွဲ့အစည်းက ခွင့် မပြုပါ။"</string>
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"ဒီမျက်နှာပြင် ပင်ထိုးမှုကို ဖြုတ်ရန်၊ နောက်သို့ နှင့် ခြုံကြည့်မှု ခလုတ်များကို တစ်ချိန်တည်း ထိကိုင်ထားပါ။"</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ဒီမျက်နှာပြင် ပင်ထိုးမှုကို ဖြုတ်ရန် ခြုံကြည့်မှု ခလုတ်ကို ထိကိုင်ထားပါ။"</string>
+ <string name="lock_to_app_toast_locked" msgid="8739004135132606329">"မျက်နှာပြင်ကို ပင်ထိုးထားသည်။ ပင်ထိုးထားမှု ဖြုတ်ခြင်းကို သင့် အဖွဲ့အစည်းက ခွင့် မပြုပါ။"</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"မျက်နှာပြင် ပင်ထိုးမှုကို သုံးမလား?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"မျက်နှာပြင် ပင်ထိုးမှုက ပြကွက်ကို တစ်ခုတည်းသော မြင်ကွင်းအဖြစ် သော့ပိတ်ထားမည်။ \n\n ပင်ထိုးမှုကို ဖြုတ်ရန်၊ နောက်သို့ နှင့် ခြုံကြည့်မှု ခလုတ်များကို တစ်ချိန်တည်း ထိကိုင်ထားပါ။"</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"မျက်နှာပြင် ပင်ထိုးမှုက ပြကွက်ကို တစ်ခုတည်းသော မြင်ကွင်းအဖြစ် သော့ပိတ်ထားမည်။ \n\n ပင်ထိုးမှုကို ဖြုတ်ရန်၊ ခြုံကြည့်မှု ခလုတ်ကို ထိကိုင်ထားပါ။"</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"မျက်နှာပြင် ပင်ထိုးမှုက ပြကွက်ကို တစ်ခုတည်းသော မြင်ကွင်းအဖြစ် သော့ပိတ်ထားမည်။ \n\n ပင်ထိုးမှုကို ဖြုတ်ရန်၊ နောက်သို့ နှင့် ခြုံကြည့်မှု ခလုတ်များကို တစ်ချိန်တည်း ထိကိုင်ထားပါ။"</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"မျက်နှာပြင် ပင်ထိုးမှုက ပြကွက်ကို တစ်ခုတည်းသော မြင်ကွင်းအဖြစ် သော့ပိတ်ထားမည်။ \n\n ပင်ထိုးမှုကို ဖြုတ်ရန်၊ ခြုံကြည့်မှု ခလုတ်ကို ထိကိုင်ထားပါ။"</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"မလို၊ ကျေးဇူးပါပဲ"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"စတင်ရန်"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"မျက်နှာပြင်ကို ပင်ထိုးထား"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"မျက်နှာပြင် ပင်ထိုးမှု ဖြတ်လိုက်ပြီ"</string>
- <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ပင်မဖြုတ်မီမှာ PIN ကို မေးကြည့်ရန်"</string>
- <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ပင်မဖြုတ်မီမှာ သော့ဖွင့် ရေးဆွဲမှုပုံစံကို မေးကြည့်ရန်"</string>
- <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ပင်မဖြုတ်မီမှာ စကားဝှက်ကို မေးကြည့်ရန်"</string>
+ <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ပင်မဖြုတ်မီမှာ PIN ကို မေးကြည့်ရန်"</string>
+ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ပင်မဖြုတ်မီမှာ သော့ဖွင့် ရေးဆွဲမှုပုံစံကို မေးကြည့်ရန်"</string>
+ <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ပင်မဖြုတ်မီမှာ စကားဝှက်ကို မေးကြည့်ရန်"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"ဘက်ထရီသက်တမ်း ကြာရှည်ခံရန်အတွက်၊ ဘက်ထရီချွေတာရေးအပိုင်းမှ သင့် စက်ပစ္စည်း၏ဆောင်ရွက်ချက်များကို လျော့ချပေးပြီး တုန်ခါမှုနှင့် နောက်ခံအချက်အလက်အများစုကို ကန့်သတ်ပေးသည်။ အီးမေး၊ စာပို့ခြင်း နှင့် တခြားapp များကို သင်ဖွင့်မထားပါက အချိန်နှင့်တပြေးညီ ညှိမပေးပါ။ \n\n စက်ပစ္စည်း အားသွင်းနေစဉ် ဘက်ထရီချွေတာရေးအပိုင်းသည် အလိုအလျောက်ပင် အလုပ်မလုပ်ပါ။"</string>
- <string name="downtime_condition_summary" msgid="8761776337475705749">"သင်၏ စက်ရပ်ချိန် <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> မှာ ပြီးဆုံးသည့် အထိ။"</string>
+ <string name="downtime_condition_summary" msgid="8761776337475705749">"သင်၏ စက်ရပ်ချိန် <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> မှာ ပြီးဆုံးသည့် အထိ။"</string>
<plurals name="zen_mode_duration_minutes">
<item quantity="one" msgid="9040808414992812341">"တစ်မိနစ် အတွင်း"</item>
<item quantity="other" msgid="6924190729213550991">"%d မိနစ် အတွင်း"</item>
</plurals>
<!-- String.format failed for translation -->
<!-- no translation found for zen_mode_duration_hours:other (5408537517529822157) -->
- <string name="zen_mode_forever" msgid="4316804956488785559">"အကန့်အသတ်မရှိစွာ"</string>
+ <string name="zen_mode_forever" msgid="4316804956488785559">"အကန့်အသတ်မရှိစွာ"</string>
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 7ae95c4..a9d8b11 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"endre ditt eget kontaktkort"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Lar appen endre eller legge til personlig profilinformasjon som er lagret på enheten din, som for eksempel navn og kontaktinformasjon. Dette betyr at appen kan identifisere deg og sende profilinformasjonen din til andre."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"kroppssensorer (som pulsmålere)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Gir appen tillatelse til å bruke data fra sensorer du bruker til å måle det som skjer i kroppen din, som f.eks. pulsen."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Gir appen tilgang til data fra sensorer som overvåker den fysiske tilstanden din, for eksempel hjertefrekvensen din."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"lese din sosiale strøm"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Lar appen lese og synkronisere sosiale oppdateringer fra deg selv og vennene dine. Vær forsiktig når du deler informasjon - med denne tillatelsen kan appen lese kommunikasjon mellom deg og vennene dine på sosiale nettverk, uavhengig av konfidensialitet. Vær oppmerksom på at denne tillatelsen kanskje ikke gjelder for alle sosiale nettverk."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"skrive i din sosiale strøm"</string>
@@ -1757,10 +1757,10 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> er valgt"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> er slettet"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Jobb-<xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="7570091317001980053">"Hvis du vil avslutte modusen for denne skjermen, trykker og holder du på Tilbake og Oversikt samtidig."</string>
- <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Hvis du vil avslutte modusen for denne skjermen, trykker og holder du på Oversikt."</string>
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Hvis du vil avslutte én-appsmodusen for denne skjermen, trykker og holder du på Tilbake og Oversikt samtidig."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Hvis du vil avslutte én-appsmodusen for denne skjermen, trykker og holder du på Oversikt."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Skjermen er festet. Løsning er ikke tillatt av organisasjonen din."</string>
- <string name="lock_to_app_title" msgid="1682643873107812874">"Vil du bruke skjermfesting?"</string>
+ <string name="lock_to_app_title" msgid="1682643873107812874">"Vil du bruke én-appsmodus?"</string>
<string name="lock_to_app_description" msgid="4120623404152035221">"Én-appsmodus låser skjermen til én bestemt side.\n\nHvis du vil avslutte modusen, trykker og holder du på Tilbake og Oversikt samtidig."</string>
<string name="lock_to_app_description_accessible" msgid="199664191087836099">"Én-appsmodus låser skjermen til én bestemt side.\n\nHvis du vil avslutte modusen, trykker og holder du på Oversikt."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"NEI TAKK"</string>
diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml
index 6c83475..fd1173c 100644
--- a/core/res/res/values-ne-rNP/strings.xml
+++ b/core/res/res/values-ne-rNP/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"तपाईँको आफ्नै सम्पर्क कार्ड परिमार्जन गर्नुहोस्"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"तपाईँको उपकरणमा भण्डार भएको व्याक्तिगत प्रोफाइल जानकारी, जस्तै तपाईँको नाम वा सम्पर्क जानकारीलाई परिवर्तन गर्न वा थप्नको लागि अनुप्रयोगलाई अनुमति दिन्छ। यसको मतलब अन्य अनुप्रयोगले तपाईँलाई चिन्न सक्छन् र सायद अन्यलाई तपाईँको प्रोफाइल जानकारी पठाउन सक्छन्।"</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"शरीर सेन्सर (हृदयदर मोनिटर जस्तै)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"हृदयदर झैं तपाईँको आफ्नो शरीरभित्र के भइरहेकोछ मापन गर्न प्रयोग सेन्सर द्वारा डेटा पहुँच गर्न अनुप्रयोगलाई अनुमति दिन्छ।"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"तपाईँको हृदय गति जस्तो सेंसर बाट डेटा पहुँचको लागि अनुप्रयोग अनुमति दिन्छ जसले तपाईँको भौतिक अवस्था अनुगमन गर्छ।"</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"तपाईंको सामाजिक स्ट्रिम पढ्नुहोस्"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"तपाईँ र तपाईँका साथीहरूबाट सामाजिक अपडेटलाई पहुँच र सिंक गर्नको लागि अनुप्रयोगलाई अनुमति दिन्छ। जानकारी साझेदारी गर्दा सावधान रहनुहोस् -- समाजिक नेटवर्कहरूमा तपाईँ र तपाईँको साथीको बिचमा भएका संचारलाई पढ्न विश्वासनीयता बेगरै यसले अनुप्रयोगलाई अनुमति दिन्छ। नोट: यो अनुमति बलपूर्वक सबै सामाजिक नेटवर्कहरूमा सायद नगर्न सकिन्छ।"</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"तपाईँको सामाजिक प्रवाहमा लेख्नुहोस्"</string>
@@ -1765,16 +1765,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> चयन गरियो"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> हटाइयो"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"कार्य <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"यो पर्दा अनपिन गर्न, छुनुहोस् र पछाडि पकड्नुहोस् र सोही समयमा अवलोकन गर्नुहोस्।"</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"यो पर्दा अनपिन गर्न, छुनुहोस् र अवलोकन पकड्नुहोस्।"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"स्क्रिन अनपिन हुँदैछ। अनपिन गर्ने तपाईँको संगठन द्वारा समर्थित छैन।"</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"स्क्रिन पिन गर्ने प्रयोग गर्नुहुन्छ?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"पर्दा पिन गर्नाले एकल दृश्यमा प्रदर्शन बन्द हुन्छ।\n\nअनपिन गर्न, छुनुहोस् र पछाडि पकड्नुहोस् र सोही समयमा अवलोकन गर्नुहोस्।"</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"पर्दा पिन गर्नाले एकल दृश्यमा प्रदर्शन बन्द हुन्छ।\n\nअनपिन गर्न, छुनुहोस् र अवलोकन पकड्नुहोस्।"</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"होइन, धन्यवाद"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"START"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"स्क्रिन पिन गरियो"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 228587a..97744bb 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"uw eigen contactkaart aanpassen"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Hiermee kan de app persoonlijke profielgegevens wijzigen of toevoegen die op uw apparaat zijn opgeslagen, zoals uw naam en contactgegevens. Dit betekent dat de app u kan identificeren en uw profielgegevens naar anderen kan verzenden."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"lichaamssensoren (zoals hartslagmeters)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Toestaan dat de app toegang krijgt tot gegevens van sensoren die u gebruikt om te meten wat er gebeurt in uw lichaam, zoals de hartslag."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Hiermee kan de app toegang krijgen tot gegevens van sensoren die uw lichamelijke conditie controleren, zoals uw hartslag."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"uw sociale stream lezen"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Hiermee kan de app toegang krijgen tot sociale updates van u en uw vrienden en deze synchroniseren. Wees voorzichtig bij het delen van informatie: hiermee kan de app communicatie lezen tussen u en uw vrienden op sociale netwerken, ongeacht de vertrouwelijkheid. Opmerking: deze toestemming kan niet worden afgedwongen voor alle sociale netwerken."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"schrijven naar sociale streams"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 84c2343..f52f405 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"zmiana własnej karty kontaktu"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Pozwala aplikacji na zmianę lub dodanie osobistych informacji przechowywanych w Twoim profilu na urządzeniu (np. imienia i nazwiska lub adresu). Oznacza to, że aplikacja może Cię zidentyfikować i wysłać informacje z Twojego profilu do innych osób."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"czujniki ciała (np. monitorujące tętno)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Zezwala aplikacji na dostęp do danych z czujników mierzących procesy zachodzące w ciele, np. bicie serca (tętno)."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Pozwala aplikacji na dostęp do danych z czujników, które monitorują Twój stan fizyczny (np. tętno)."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"odczyt sieci społecznościowych"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Pozwala aplikacji na odczyt i synchronizację informacji publikowanych przez Ciebie i Twoich znajomych w sieciach społecznościowych. Zachowaj ostrożność, udostępniając informacje. Aplikacja z tym uprawnieniem może odczytać całą komunikację, którą prowadzisz ze swoimi znajomymi w sieciach społecznościowych, niezależnie od jej poufności. Uwaga: to uprawnienie może nie być egzekwowane we wszystkich sieciach społecznościowych."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"zapis sieci społecznościowych"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index fc2bb37..48a8f2f 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"modificar o próprio cartão de contacto"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Permite que a aplicação altere ou adicione dados de perfil pessoais guardados no dispositivo, tais como o seu nome e informações de contacto. Isto significa que outras aplicações podem identificá-lo e enviar os seus dados de perfil a terceiros."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"sensores corporais (como monitores do ritmo cardíaco)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Permite à aplicação aceder a dados de sensores que o utilizador usa para medir o que está a acontecer no seu corpo, por exemplo o ritmo cardíaco."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Permite que a aplicação aceda a dados de sensores que monitorizam a sua condição física, como o ritmo cardíaco."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"ler o seu fluxo social"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Permite que a aplicação aceda e sincronize atualizações de redes sociais suas e dos seus amigos. Tenha cuidado ao partilhar informações, pois esta ação permite que a aplicação leia comunicações entre si e os seus amigos nas redes sociais, independentemente do grau de confidencialidade. Nota: esta autorização pode não ser aplicada a todas as redes sociais."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"escrever para o seu fluxo social"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index b4491e9..708f526 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"mod. próprio cartão contato"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Permite que o app altere ou adicione informações pessoais de perfil armazenadas em seu dispositivo, como seu nome e informações de contato. Isso significa que o app pode identificá-lo e enviar as informações de seus perfil para terceiros."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"sensores corporais"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Permite que o app acesse dados de sensores usados para medir o que acontece em seu corpo, como seus batimentos cardíacos."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Permite que o app acesse dados de sensores que monitoram sua condição física, como a frequência cardíaca."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"ler suas transmissões sociais"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Permite que o app acesse e sincronize suas atualizações sociais e as de seus amigos. Tenha cuidado ao compartilhar informações: isto permite que o app leia as mensagens trocadas por você e seus amigos em redes sociais, independentemente de sua confidencialidade. Obsservaç: pode não ser aplicável a todas as redes sociais."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"escrever p/ suas transm. soc."</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> selecionado"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> excluído"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Trabalho: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Para liberar esta tela, toque e mantenha pressionados \"Voltar\" e \"Visão geral\" ao mesmo tempo."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Para liberar esta tela, toque e mantenha pressionado \"Visão geral\"."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"A tela está fixada. A liberação não é permitida por sua organização."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Usar fixação de tela?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"A fixação de tela bloqueia a tela em uma visualização única.\n\nPara liberar a tela, toque e mantenha pressionados \"Voltar\" e \"Visão geral\" ao mesmo tempo."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"A fixação de tela bloqueia a tela em uma visualização única.\n\nPara liberar a tela, toque e mantenha pressionado \"Visão geral\"."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"NÃO, OBRIGADO"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"INICIAR"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Tela fixada"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 36e3a02..6413218 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"modifică cartea dvs. de vizită"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Permite aplicaţiei să schimbe sau să adauge conţinut în informaţiile personale din profil stocate pe dispozitivul dvs., cum ar fi numele şi informaţiile dvs. de contact. Aceasta înseamnă că aplicaţia vă poate identifica şi poate trimite informaţiile din profilul dvs. altor persoane."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"senzori (ex.: senzori de ritm cardiac)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Permite aplicației să acceseze datele de la senzorii pe care îi utilizați pentru a măsura funcțiile corpului, cum ar fi ritmul cardiac."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Permite aplicației să acceseze date de la senzorii care vă monitorizează starea fizică, cum ar fi ritmul cardiac."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"citeşte fluxul social"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Permite aplicaţiei să acceseze şi să sincronizeze actualizările sociale de la dvs. şi de la prietenii dvs. Daţi dovadă de precauţie când distribuiţi informaţii - cu această permisiune aplicaţia citeşte comunicările realizate între dvs. şi prietenii dvs. în reţelele sociale, indiferent de gradul de confidenţialitate a acestora. Notă: această permisiune nu poate fi aplicată pentru toate reţelele sociale."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"scrie în fluxul social"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> selectat"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> a fost șters"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> de serviciu"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Pentru a anula fixarea pe ecran, apăsați lung, simultan, pe Înapoi și pe Vizualizare generală."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Pentru a anula fixarea pe ecran, apăsați lung pe Vizualizare generală."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Ecranul este fixat. Anularea fixării nu este permisă de organizația dvs."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Utilizați fixarea ecranului?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Fixarea pe ecran blochează afișarea într-o singură vizualizare.\n\nPentru a anula fixarea, apăsați lung, simultan, pe Înapoi și pe Vizualizare generală."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Fixarea pe ecran blochează afișarea într-o singură vizualizare.\n\nPentru a anula fixarea, apăsați lung pe Vizualizare generală."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"NU, MULȚUMESC"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"PORNIȚI"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ecran fixat"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index ea263d4..344e408 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"Изменение ваших контактных данных"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Приложение сможет изменять вашу личную информацию (например, имя и контактные данные), сохраненную на устройстве. Получив эти данные, приложение сможет отправить их другим пользователям."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"датчики (например, пульсометр)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Приложение получит доступ к данным приборов, используемых для измерения ваших физиологических показателей (например, пульса)."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Приложение сможет получить доступ к данным датчиков, размещенных на теле, например измеряющих частоту сердцебиения."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"Просмотр записей в вашей социальной ленте"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Приложение сможет просматривать и синхронизировать записи, публикуемые вами и вашими друзьями в социальных сетях. Будьте осторожны при передаче информации! С этим разрешением приложение сможет просматривать вашу переписку с друзьями в социальных сетях независимо от настроек конфиденциальности. Примечание. Это разрешение может применяться не во всех социальных сетях."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"Добавление записей в вашу социальную ленту"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"Выбран элемент <xliff:g id="ITEM">%1$s</xliff:g>"</string>
<string name="deleted_key" msgid="7659477886625566590">"Цифра <xliff:g id="KEY">%1$s</xliff:g> удалена"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Рабочий <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Чтобы открепить экран, нажмите и удерживайте кнопки \"Назад\" и \"Обзор\" одновременно."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Чтобы открепить экран, нажмите и удерживайте кнопку \"Обзор\"."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Блокировка включена. Ее отключение запрещено правилами организации."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Использовать блокировку в приложении?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Функция блокировки в приложении позволяет зафиксировать текущий экран.\n\nЧтобы снять блокировку, нажмите и удерживайте кнопки \"Назад\" и \"Обзор\" одновременно."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Функция блокировки в приложении позволяет зафиксировать текущий экран.\n\nЧтобы снять блокировку, нажмите и удерживайте кнопку \"Обзор\"."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"НЕТ"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"ДА"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Блокировка включена"</string>
@@ -1775,7 +1771,7 @@
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Запрашивать графический ключ для отключения блокировки"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Запрашивать пароль для отключения блокировки"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"Чтобы продлить время работы устройства от батареи, в режиме энергосбережения снижается производительность, а также ограничивается использование вибросигнала и фоновой передачи данных. Данные, требующие синхронизации, могут обновляться только когда вы откроете приложение.\n\nРежим энергосбережения автоматически отключается во время зарядки устройства."</string>
- <string name="downtime_condition_summary" msgid="8761776337475705749">"Когда период простоя завершится (в <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>)"</string>
+ <string name="downtime_condition_summary" msgid="8761776337475705749">"До отключения режима (в <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>)"</string>
<plurals name="zen_mode_duration_minutes">
<item quantity="one" msgid="9040808414992812341">"1 мин."</item>
<item quantity="other" msgid="6924190729213550991">"%d мин."</item>
diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml
index 68d61ef..5b54939 100644
--- a/core/res/res/values-si-rLK/strings.xml
+++ b/core/res/res/values-si-rLK/strings.xml
@@ -176,7 +176,7 @@
<string name="global_actions" product="tablet" msgid="408477140088053665">"ටැබ්ලට් විකල්ප"</string>
<string name="global_actions" product="default" msgid="2406416831541615258">"දුරකථන විකල්ප"</string>
<string name="global_action_lock" msgid="2844945191792119712">"තිර අගුල"</string>
- <string name="global_action_power_off" msgid="4471879440839879722">"බලය අක්රිය කරමින්"</string>
+ <string name="global_action_power_off" msgid="4471879440839879722">"බලය අක්රිය කරන්න"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"දෝෂ වර්තාව"</string>
<string name="bugreport_title" msgid="2667494803742548533">"දෝෂ වාර්තාවක් ගන්න"</string>
<string name="bugreport_message" msgid="398447048750350456">"ඊ-තැපැල් පණිවිඩයක් ලෙස යැවීමට මෙය ඔබගේ වත්මන් උපාංග තත්වය ගැන තොරතුරු එකතු කරනු ඇත. දෝෂ වාර්තාව ආරම්භ කර එය යැවීමට සූදානම් කරන තෙක් එයට කිසියම් කාලයක් ගතවනු ඇත; කරුණාකර ඉවසන්න."</string>
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"ඔබගේ සම්බන්ධතා පත වෙනස් කිරීම"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"ඔබගේ නම සහ සම්බන්ධතා තොරතුරු වැනි ඔබගේ උපාංගයේ ආචයනය කරන ලද පුද්ගලික පැතිකඩ තොරතුරු වෙනස් කිරීමට හෝ එකතු කිරීමට යෙදුමට අවසර දෙන්න. මෙමගින් යෙදුමට ඔබව හඳුනා ගත හැකි අතර අනෙක් අයට ඔබගේ පැතිකඩ තොරතුරු යැවිය හැකි බව කියවෙයි."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"සිරුර සංවේදකයන් (හෘද ස්පන්දන වේගය නිරීක්ෂණය කිරීම වැනි)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"හෘද ස්පන්දන වේගය වැනි ඔබගේ සිරුර තුළ සිදුවන්නේ කුමක් දැයි මැනීමට ඔබ භාවිත කරන සංවේදකයන්ගෙන් දත්ත ලබාගැනීමට යෙදුමට ඉඩ ලබාදෙන්න."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"හෘද ස්පන්දන වේගය වැනි ඔබගේ ශාරීරික තත්ත්වය නිරීක්ෂණය කරන සංවේදක වලින් දත්ත ලබාගැනීමට යෙදුමට ඉඩ දෙන්න."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"ඔබගේ සමාජ ප්රවාහය කියවන්න"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"ඔබගේ සහ ඔබගේ යහළුවන්ගේ සමාජ යාවත්කාලීනයන් වෙත පිවිසීමට හෝ සමමුහුර්ත කිරීමට යෙදුමට අවසර දෙන්න. තොරතුරු බෙදා ගැනීමේ දී සැලකිලිමත් වන්න -- විශ්වාසයකින් තොරව සමාජ ජාලවල ඔබගේ සහ ඔබගේ යහළුවන් අතර සන්නිවේදන කියවීමට මෙමගින් යෙදුමට අවසර දෙයි. සටහන: සියලු සමාජ ජාලවල මෙම අවසරය බල නොකරයි."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"ඔබගේ සමාජ ප්රවාහය වෙත ලිවීම"</string>
@@ -1759,16 +1759,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> තෝරාගෙන ඇත"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> මකා දමන ලදි"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"වැඩ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"මෙම තීරයේ ඇමුණුම ඉවත් කිරීමට, Back සහ Overview එකම වේලාවේ ස්පර්ශ කර අල්ලා සිටින්න."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"මෙම තීරයේ ඇමුණුම ඉවත් කිරීමට, Overview ස්පර්ශ කර අල්ලා සිටින්න."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"තිරය අගුළු දමා ඇත. ඔබගේ සංවිධානය විසින් අගුළු ඇරීමට ඉඩ නොදෙයි."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"තිරය අගුළු දැමීම භාවිත කරනවාද?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"තනි පෙනුම තුළ දර්ශනය තීර ඇමුණුමෙන් අගුළු දමයි.\n\nඇමුණුම ඉවත් කිරීමට, Back සහ Overview එකම වේලාවේ ස්පර්ශ කර අල්ලා සිටින්න."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"තනි පෙනුම තුළ දර්ශනය තීර ඇමුණුමෙන් අගුළු දමයි.\n\nඇමුණුම ඉවත් කිරීමට, Overview ස්පර්ශ කර අල්ලා සිටින්න."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"නැත, ස්තූතියි"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"ආරම්භය"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"තිරය අගුළු දමා ඇත"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 7e6fd76..53d6aea 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"upraviť vlastnú kartu kontaktu"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Umožňuje aplikácii zmeniť alebo pridať do osobného profilu informácie uložené vo vašom zariadení, ako je vaše meno a kontaktné informácie. Znamená to, že vás aplikácia môže identifikovať a odoslať informácie o vašom profile ostatným aplikáciám."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"telesné senzory (napr. snímače tepu)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Umožňuje aplikácii pristupovať k údajom zo senzorov, pomocou ktorých meriate činnosť svojho tela, napríklad tep."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Umožňuje aplikácii získať prístup k údajom senzorov monitorujúcich vašu fyzickú kondíciu (napríklad pulz)."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"čítať váš sociálny stream"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Umožňuje aplikácii pristupovať k sociálnym aktualizáciám od vás a vašich priateľov a synchronizovať ich. Pri zdieľaní informácií dávajte pozor – toto povolenie umožňuje aplikácii čítať komunikáciu medzi vami a vašimi priateľmi v sociálnych sieťach, a to bez ohľadu na jej dôvernosť. Poznámka: Toto povolenie nie je možné vynucovať v prípade všetkých sociálnych sietí."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"písať do vášho sociálneho streamu"</string>
@@ -1761,8 +1761,8 @@
<string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Ak chcete uvoľniť túto obrazovku, klepnite na tlačidlo Prehľad a podržte ho."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Obrazovka je pripnutá. Uvoľnenie vaša organizácia nepovoľuje."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Použiť pripnutie k obrazovke?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Pripnutie k obrazovke uzamkne obrazovku v jednom zobrazení.\n\nAk ju chcete uvoľniť, súčasne klepnite na tlačidlá Späť a Prehľad a podržte ich."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Pripnutie k obrazovke uzamkne obrazovku v jednom zobrazení.\n\nAk ju chcete uvoľniť, klepnite na tlačidlo Prehľad a podržte ho."</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Pripnutie obrazovky uzamkne obrazovku v jednom zobrazení.\n\nAk ju chcete uvoľniť, súčasne klepnite na tlačidlá Späť a Prehľad a podržte ich."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Pripnutie obrazovky uzamkne obrazovku v jednom zobrazení.\n\nAk ju chcete uvoľniť, klepnite na tlačidlo Prehľad a podržte ho."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"NIE, ĎAKUJEM"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"SPUSTIŤ"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Obrazovka bola pripnutá"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 4512a14..b76757f 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -172,7 +172,7 @@
<string name="reboot_safemode_title" msgid="7054509914500140361">"Vnovičen zagon v varnem načinu"</string>
<string name="reboot_safemode_confirm" msgid="55293944502784668">"Ali želite znova zagnati v varnem načinu? S tem onemogočite vse nameščene aplikacije drugih ponudnikov. Obnovljene bodo pri naslednjem vnovičnem zagonu."</string>
<string name="recent_tasks_title" msgid="3691764623638127888">"Nedavno"</string>
- <string name="no_recent_tasks" msgid="8794906658732193473">"Ni nedavnih programov"</string>
+ <string name="no_recent_tasks" msgid="8794906658732193473">"Ni nedavnih aplikacij"</string>
<string name="global_actions" product="tablet" msgid="408477140088053665">"Možnosti tabličnega računalnika"</string>
<string name="global_actions" product="default" msgid="2406416831541615258">"Možnosti telefona"</string>
<string name="global_action_lock" msgid="2844945191792119712">"Zaklep zaslona"</string>
@@ -248,7 +248,7 @@
<string name="permgrouplab_systemTools" msgid="4652191644082714048">"Sistemska orodja"</string>
<string name="permgroupdesc_systemTools" msgid="8162102602190734305">"Dostop nižje ravni in nadzor sistema."</string>
<string name="permgrouplab_developmentTools" msgid="3446164584710596513">"Razvojna orodja"</string>
- <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"Funkcije, ki jih potrebujejo le razvijalci programa."</string>
+ <string name="permgroupdesc_developmentTools" msgid="7058828032358142018">"Funkcije, ki jih potrebujejo le razvijalci aplikacije."</string>
<string name="permgrouplab_display" msgid="4279909676036402636">"Uporabniški vmesnik druge aplikacije"</string>
<string name="permgroupdesc_display" msgid="6051002031933013714">"Vpliv na uporabniški vmesnik drugih aplikacij."</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Prostor za shranjevanje"</string>
@@ -265,11 +265,11 @@
<string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Opazovanje besedila, ki ga natipkate"</string>
<string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Vključuje osebne podatke, kot so številke kreditnih kartic in gesla."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"onemogočanje ali spreminjanje vrstice stanja"</string>
- <string name="permdesc_statusBar" msgid="8434669549504290975">"Programom omogoča onemogočenje vrstice stanja ali dodajanje in odstranjevanje ikon sistema."</string>
+ <string name="permdesc_statusBar" msgid="8434669549504290975">"Aplikacijam omogoča onemogočenje vrstice stanja ali dodajanje in odstranjevanje ikon sistema."</string>
<string name="permlab_statusBarService" msgid="7247281911387931485">"vrstica stanja"</string>
- <string name="permdesc_statusBarService" msgid="716113660795976060">"Programu omogoča, da postane vrstica stanja."</string>
+ <string name="permdesc_statusBarService" msgid="716113660795976060">"Aplikaciji omogoča, da postane vrstica stanja."</string>
<string name="permlab_expandStatusBar" msgid="1148198785937489264">"razširjanje/strnjevanje vrstice stanja"</string>
- <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Programu omogoča razširjanje ali strnjevanje vrstice stanja."</string>
+ <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Aplikaciji omogoča razširjanje ali strnjevanje vrstice stanja."</string>
<string name="permlab_install_shortcut" msgid="4279070216371564234">"nameščanje bližnjic"</string>
<string name="permdesc_install_shortcut" msgid="8341295916286736996">"Aplikaciji omogoča dodajanje bližnjic na začetni zaslon brez posredovanja uporabnika."</string>
<string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"odstranjevanje bližnjic"</string>
@@ -281,7 +281,7 @@
<string name="permlab_receiveMms" msgid="1821317344668257098">"prejemanje sporočil (MMS)"</string>
<string name="permdesc_receiveMms" msgid="533019437263212260">"Aplikaciji omogoča prejemanje in obdelavo MMS-ov. S tem lahko aplikacija nadzoruje ali izbriše sporočila, poslana v napravo, ne da bi vam jih pokazala."</string>
<string name="permlab_receiveEmergencyBroadcast" msgid="1803477660846288089">"prejemanje oddaj v sili"</string>
- <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Programu omogoča prejemanje in obdelavo sporočil za oddajanje v sili. To dovoljenje je na voljo samo sistemskim programom."</string>
+ <string name="permdesc_receiveEmergencyBroadcast" msgid="848524070262431974">"Aplikaciji omogoča prejemanje in obdelavo sporočil za oddajanje v sili. To dovoljenje je na voljo samo sistemskim aplikacijam."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"branje sporočil oddaje v celici"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Omogoča aplikaciji branje sporočil oddaje v celici, ki jih prejme naprava. Opozorila oddaje v celici so dostavljena na nekaterih lokacijah, da vas opozorijo na izredne razmere. Zlonamerne aplikacije lahko vplivajo na delovanje naprave, ko dobi sporočilo oddaje v celici."</string>
<string name="permlab_sendSms" msgid="5600830612147671529">"pošiljanje sporočil SMS"</string>
@@ -298,7 +298,7 @@
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"Aplikaciji omogoča prejemanje in obdelavo sporočil WAP. S tem lahko aplikacija nadzoruje ali izbriše sporočila, poslana v napravo, ne da bi vam jih pokazala."</string>
<string name="permlab_receiveBluetoothMap" msgid="7593811487142360528">"prejemanje sporočil Bluetooth (MAP)"</string>
<string name="permdesc_receiveBluetoothMap" msgid="8656755936919466345">"Aplikaciji omogoča prejemanje in obdelavo sporočil Bluetooth MAP. To pomeni, da lahko aplikacija nadzira in izbriše sporočila, poslana v napravo, ne da bi vam jih prikazala."</string>
- <string name="permlab_getTasks" msgid="6466095396623933906">"dobivanje programov, ki se izvajajo"</string>
+ <string name="permlab_getTasks" msgid="6466095396623933906">"dobivanje aplikacij, ki se izvajajo"</string>
<string name="permdesc_getTasks" msgid="7454215995847658102">"Aplikaciji omogoča prejemanje podatkov o trenutnih in nedavno izvajajočih se opravilih. S tem lahko aplikacija odkrije podatke o aplikacijah, ki se uporabljajo v napravi."</string>
<string name="permlab_startTasksFromRecents" msgid="8990073877885690623">"zagon opravila iz nedavnih"</string>
<string name="permdesc_startTasksFromRecents" msgid="7382133554871222235">"Aplikaciji omogoča, da uporablja predmet ActivityManager.RecentTaskInfo za zagon zaprtega opravila, ki ga je vrnil predmet ActivityManager.getRecentTaskList()."</string>
@@ -310,32 +310,32 @@
<string name="permdesc_manageUsers" msgid="8409306667645355638">"Aplikacijam omogoča upravljanje uporabnikov v napravi, vključno z iskanjem, ustvarjanjem in brisanjem."</string>
<string name="permlab_getDetailedTasks" msgid="6229468674753529501">"prejemanje podrobnosti o aplikacijah, ki se izvajajo"</string>
<string name="permdesc_getDetailedTasks" msgid="153824741440717599">"Aplikaciji omogoča, da dobi podatke o trenutnih in nedavno izvajajočih se opravilih. Zlonamerne aplikacije lahko odkrijejo zasebne podatke o drugih aplikacijah."</string>
- <string name="permlab_reorderTasks" msgid="2018575526934422779">"preurejanje programov, ki se izvajajo"</string>
+ <string name="permlab_reorderTasks" msgid="2018575526934422779">"preurejanje aplikacij, ki se izvajajo"</string>
<string name="permdesc_reorderTasks" msgid="7734217754877439351">"Aplikaciji omogoča premikanje opravil v ospredje in ozadje. Aplikacija lahko to naredi brez vašega nadzora."</string>
- <string name="permlab_removeTasks" msgid="6821513401870377403">"ustavitev programov, ki se izvajajo"</string>
- <string name="permdesc_removeTasks" msgid="1394714352062635493">"Programu omogoča odstranjevanje opravil in zapiranje njihovih programov. Zlonamerni programi lahko motijo delovanje drugih programov."</string>
+ <string name="permlab_removeTasks" msgid="6821513401870377403">"ustavitev aplikacij, ki se izvajajo"</string>
+ <string name="permdesc_removeTasks" msgid="1394714352062635493">"Aplikaciji omogoča odstranjevanje opravil in zapiranje njihovih aplikacij. Zlonamerne aplikacije lahko motijo delovanje drugih aplikacij."</string>
<string name="permlab_manageActivityStacks" msgid="7391191384027303065">"upravljanje skladov dejavnosti"</string>
<string name="permdesc_manageActivityStacks" msgid="1615881933034084440">"Aplikaciji omogoča dodajanje, odstranjevanje in spreminjanje skladov dejavnosti, v katerih se izvajajo druge aplikacije. Zlonamerne aplikacije lahko motijo delovanje drugih aplikacij."</string>
<string name="permlab_startAnyActivity" msgid="2918768238045206456">"zagon poljubne dejavnosti"</string>
<string name="permdesc_startAnyActivity" msgid="997823695343584001">"Omogoča aplikaciji zagon poljubne dejavnosti, ne glede na zaščito dovoljenj ali izvoženo stanje."</string>
<string name="permlab_setScreenCompatibility" msgid="6975387118861842061">"nastavitev združljivosti zaslona"</string>
- <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Programu omogoča nadzor združljivostnega načina zaslona drugih programov. Zlonamerni programi lahko prekinejo delovanje drugih programov."</string>
- <string name="permlab_setDebugApp" msgid="3022107198686584052">"omogočanje iskanja in odpravljanja napak v programu"</string>
- <string name="permdesc_setDebugApp" msgid="4474512416299013256">"Programu omogoča vklop funkcije za odpravljanje napak za drug program. Zlonamerni programi lahko to uporabijo za zapiranje drugih programov."</string>
+ <string name="permdesc_setScreenCompatibility" msgid="692043618693917374">"Aplikaciji omogoča nadzor združljivostnega načina zaslona drugih aplikacij. Zlonamerne aplikacije lahko prekinejo delovanje drugih aplikacij."</string>
+ <string name="permlab_setDebugApp" msgid="3022107198686584052">"omogočanje iskanja in odpravljanja napak v aplikaciji"</string>
+ <string name="permdesc_setDebugApp" msgid="4474512416299013256">"Aplikaciji omogoča vklop funkcije za odpravljanje napak za drugo aplikacijo. Zlonamerne aplikacije lahko to uporabijo za zapiranje drugih aplikacij."</string>
<string name="permlab_changeConfiguration" msgid="4162092185124234480">"spreminjanje sistemskih nastavitev prikaza"</string>
- <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"Programu omogoča spreminjanje trenutne konfiguracije, kot so na primer območne nastavitve ali splošna velikost pisave."</string>
+ <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"Aplikaciji omogoča spreminjanje trenutne konfiguracije, kot so na primer območne nastavitve ali splošna velikost pisave."</string>
<string name="permlab_enableCarMode" msgid="5684504058192921098">"omogočanje načina delovanja v avtomobilu"</string>
- <string name="permdesc_enableCarMode" msgid="4853187425751419467">"Programu dovoljuje omogočanje načina za avto."</string>
+ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"Aplikaciji dovoljuje omogočanje načina za avto."</string>
<string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"zapiranje drugih aplikacij"</string>
<string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Aplikaciji omogoča, da konča procese v ozadju drugih aplikacij. S tem lahko druge aplikacije nehajo delovati."</string>
- <string name="permlab_forceStopPackages" msgid="2329627428832067700">"vsiljena zaustavitev drugih programov"</string>
- <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"Omogoča, da program na silo zaustavi druge programe."</string>
- <string name="permlab_forceBack" msgid="652935204072584616">"vsiljeno zapiranje programa"</string>
- <string name="permdesc_forceBack" msgid="3892295830419513623">"Programu omogoča, da vsili zaprtje dejavnosti v ospredju. Tega ni treba nikoli uporabiti za navadne programe."</string>
+ <string name="permlab_forceStopPackages" msgid="2329627428832067700">"vsiljena zaustavitev drugih aplikacij"</string>
+ <string name="permdesc_forceStopPackages" msgid="5253157296183940812">"Omogoča, da aplikacija na silo zaustavi druge aplikacije."</string>
+ <string name="permlab_forceBack" msgid="652935204072584616">"vsiljeno zapiranje aplikacije"</string>
+ <string name="permdesc_forceBack" msgid="3892295830419513623">"Aplikaciji omogoča, da vsili zaprtje dejavnosti v ospredju. Tega ni treba nikoli uporabiti za navadne aplikacije."</string>
<string name="permlab_dump" msgid="1681799862438954752">"pridobivanje notranjega stanja sistema"</string>
- <string name="permdesc_dump" msgid="1778299088692290329">"Programu omogoča prejemanje notranjega stanja sistema. Zlonamerni programi lahko na ta način dobijo različne zasebne in varnostne podatke, ki jih običajno ne potrebujejo."</string>
+ <string name="permdesc_dump" msgid="1778299088692290329">"Aplikaciji omogoča prejemanje notranjega stanja sistema. Zlonamerne aplikacije lahko na ta način dobijo različne zasebne in varnostne podatke, ki jih običajno ne potrebujejo."</string>
<string name="permlab_retrieve_window_content" msgid="8022588608994589938">"prenos vsebine zaslona"</string>
- <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"Programu omogoča dostop do vsebine aktivnega okna. Zlonamerni programi lahko dobijo vso vsebino okna in pregledajo njeno besedilo razen gesel."</string>
+ <string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"Aplikaciji omogoča dostop do vsebine aktivnega okna. Zlonamerne aplikacije lahko dobijo vso vsebino okna in pregledajo njeno besedilo razen gesel."</string>
<string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"začasno omogoči pripomočke za ljudi s posebnimi potrebami"</string>
<string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"Aplikaciji omogoča, da v napravi začasno omogoči pripomočke za ljudi s posebnimi potrebami. Zlonamerne aplikacije jih lahko omogočijo brez soglasja uporabnika."</string>
<string name="permlab_retrieveWindowToken" msgid="7154762602367758602">"pridobivanje žetona okna"</string>
@@ -346,22 +346,22 @@
<string name="permdesc_filter_events" msgid="8006236315888347680">"Omogoča, da aplikacija registrira vhodni filter, ki pred razpošiljanjem filtrira tok vseh uporabniških dogodkov. Zlonamerne aplikacije lahko nadzirajo uporabniški vmesnik sistema brez posega uporabnika."</string>
<string name="permlab_shutdown" msgid="7185747824038909016">"delna zaustavitev"</string>
<string name="permdesc_shutdown" msgid="7046500838746291775">"Upravitelja dejavnosti preklopi v stanje za zaustavitev. Ne izvede celotne zaustavitve."</string>
- <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"preprečevanje preklopa programov"</string>
- <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Uporabniku preprečuje preklop v drug program."</string>
+ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"preprečevanje preklopa aplikacij"</string>
+ <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"Uporabniku preprečuje preklop v drugo aplikacijo."</string>
<string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"pridobivanje podatkov o trenutni aplikaciji"</string>
<string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"Omogoča imetniku pridobivanje zasebnih podatkov o trenutni aplikaciji v ospredju zaslona."</string>
- <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"spremljanje in nadzor vseh zagonov programov"</string>
- <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Programu omogoča spremljanje in nadziranje načina, kako sistem zažene dejavnosti. Zlonamerni programi lahko v celoti ogrozijo varnost sistema. To dovoljenje je potrebno samo za razvoj, vendar nikoli za običajno uporabo."</string>
+ <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"spremljanje in nadzor vseh zagonov aplikacij"</string>
+ <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"Aplikaciji omogoča spremljanje in nadziranje načina, kako sistem zažene dejavnosti. Zlonamerne aplikacije lahko v celoti ogrozijo varnost sistema. To dovoljenje je potrebno samo za razvoj, vendar nikoli za običajno uporabo."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"pošiljanje oddaje brez paketa"</string>
- <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"Programu omogoča oddajanje obvestila, da je paket programa odstranjen. Zlonamerni programi lahko to uporabijo za zaustavitev drugih programov, ki se izvajajo."</string>
+ <string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"Aplikaciji omogoča oddajanje obvestila, da je paket aplikacije odstranjen. Zlonamerne aplikacije lahko to uporabijo za zaustavitev drugih aplikacij, ki se izvajajo."</string>
<string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"pošiljanje oddaje, prejete prek SMS-a"</string>
- <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Programu omogoča oddajo obvestila o prejetih sporočilih SMS. Zlonamerni programi lahko to uporabijo za ponarejanje dohodnih SMS-ov."</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"Aplikaciji omogoča oddajo obvestila o prejetih sporočilih SMS. Zlonamerne aplikacije lahko to uporabijo za ponarejanje dohodnih SMS-ov."</string>
<string name="permlab_broadcastWapPush" msgid="3145347413028582371">"pošiljanje oddaje, prejete s potisnim sporočilom WAP"</string>
- <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Programu omogoča oddajo obvestila, da je bilo potisno sporočilo WAP prejeto. Zlonamerni programi lahko to uporabijo za ponarejanje potrdila o prejemu sporočila MMS ali za neopazno menjavo vsebine poljubne spletne strani z zlonamernimi različicami."</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"Aplikaciji omogoča oddajo obvestila, da je bilo potisno sporočilo WAP prejeto. Zlonamerne aplikacije lahko to uporabijo za ponarejanje potrdila o prejemu sporočila MMS ali za neopazno menjavo vsebine poljubne spletne strani z zlonamernimi različicami."</string>
<string name="permlab_setProcessLimit" msgid="2451873664363662666">"omejevanje števila izvajajočih se procesov"</string>
- <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Programu omogoča nadzor največjega števila postopkov, ki se bodo izvajali. Tega nikoli ni treba uporabiti za navadne programe."</string>
+ <string name="permdesc_setProcessLimit" msgid="7318061314040879542">"Aplikaciji omogoča nadzor največjega števila postopkov, ki se bodo izvajali. Tega nikoli ni treba uporabiti za navadne aplikacije."</string>
<string name="permlab_setAlwaysFinish" msgid="550958507798796965">"vsiljeno zapiranje aplikacij v ozadju"</string>
- <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"Programu omogoča, da nadzoruje, ali so dejavnosti zaključene takoj, ko so premaknjene v ozadje. Tega ni treba nikoli uporabiti za navadne programe."</string>
+ <string name="permdesc_setAlwaysFinish" msgid="7471310652868841499">"Aplikaciji omogoča, da nadzoruje, ali so dejavnosti zaključene takoj, ko so premaknjene v ozadje. Tega ni treba nikoli uporabiti za navadne aplikacije."</string>
<string name="permlab_batteryStats" msgid="2789610673514103364">"branje statističnih podatkov o akumulatorju"</string>
<string name="permdesc_batteryStats" msgid="5897346582882915114">"Aplikaciji omogoča branje podatkov o trenutni nizki napolnjenosti akumulatorja. Aplikaciji lahko tudi dovoli dostop do podrobnosti o tem, katere aplikacije uporabljate."</string>
<string name="permlab_updateBatteryStats" msgid="3719689764536379557">"spreminjanje statističnih podatkov o akumulatorju"</string>
@@ -371,26 +371,26 @@
<string name="permlab_updateAppOpsStats" msgid="8829097373851521505">"spreminjanje statističnih podatkov o delovanju aplikacije"</string>
<string name="permdesc_updateAppOpsStats" msgid="50784596594403483">"Aplikaciji dovoli spreminjanje zbranih statističnih podatkov o delovanju aplikacij. Ni za uporabo v navadnih aplikacijah."</string>
<string name="permlab_backup" msgid="470013022865453920">"nadzor varnostnega kopiranja sistema in obnovitev"</string>
- <string name="permdesc_backup" msgid="6912230525140589891">"Programu omogoča nadzor mehanizma za varnostno kopiranje in obnovitev sistema. Ni za uporabo z navadnimi programi."</string>
+ <string name="permdesc_backup" msgid="6912230525140589891">"Aplikaciji omogoča nadzor mehanizma za varnostno kopiranje in obnovitev sistema. Ni za uporabo z navadnimi aplikacijami."</string>
<string name="permlab_confirm_full_backup" msgid="5557071325804469102">"potrditev popolnega varnostnega kopiranja ali obnovitve"</string>
- <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Programu omogoča zagon uporabniškega vmesnika za potrditev popolnega varnostnega kopiranja. Ni za uporabo s programi."</string>
+ <string name="permdesc_confirm_full_backup" msgid="1748762171637699562">"Aplikaciji omogoča zagon uporabniškega vmesnika za potrditev popolnega varnostnega kopiranja. Ni za uporabo z aplikacijami."</string>
<string name="permlab_internalSystemWindow" msgid="2148563628140193231">"prikazovanje nepooblaščenih oken"</string>
- <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Programu omogoča ustvarjanje oken, ki jih bo uporabljal uporabniški vmesnik notranjega sistema. Ni za uporabo z navadnimi programi."</string>
+ <string name="permdesc_internalSystemWindow" msgid="7458387759461466397">"Aplikaciji omogoča ustvarjanje oken, ki jih bo uporabljal uporabniški vmesnik notranjega sistema. Ni za uporabo z navadnimi aplikacijami."</string>
<string name="permlab_systemAlertWindow" msgid="3543347980839518613">"prekrivanje drugih aplikacij"</string>
<string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Aplikaciji omogoča risanje na vrhu drugih aplikacij ali delov uporabniškega vmesnika. To lahko vpliva na vašo uporabo vmesnika v kateri koli aplikaciji ali vas zavede pri prikazu v drugih aplikacijah."</string>
<string name="permlab_setAnimationScale" msgid="2805103241153907174">"spreminjanje splošne hitrosti animacij"</string>
- <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"Programu omogoča, da kadar koli spremeni splošno hitrost animacije (hitrejše ali počasnejše animacije)."</string>
- <string name="permlab_manageAppTokens" msgid="1286505717050121370">"upravljanje žetonov programa"</string>
- <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"Programu omogoča, da ustvari in upravlja svoje žetone ter obide navadno razvrščanje Z. Tega ni treba nikoli uporabiti za navadne programe."</string>
+ <string name="permdesc_setAnimationScale" msgid="7690063428924343571">"Aplikaciji omogoča, da kadar koli spremeni splošno hitrost animacije (hitrejše ali počasnejše animacije)."</string>
+ <string name="permlab_manageAppTokens" msgid="1286505717050121370">"upravljanje žetonov aplikacije"</string>
+ <string name="permdesc_manageAppTokens" msgid="8043431713014395671">"Aplikaciji omogoča, da ustvari in upravlja svoje žetone ter obide navadno razvrščanje Z. Tega ni treba nikoli uporabiti za navadne aplikacije."</string>
<string name="permlab_freezeScreen" msgid="4708181184441880175">"zamrzovanje zaslona"</string>
<string name="permdesc_freezeScreen" msgid="8558923789222670064">"Omogoča aplikaciji začasno zamrznitev zaslona za prehod na celozaslonski način."</string>
<string name="permlab_injectEvents" msgid="1378746584023586600">"pritiskanje tipk in gumbov za nadzor"</string>
- <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"Programu omogoča, da svoje dogodke vnosa (pritiske tipk ipd.) dostavi drugim programom. Zlonamerni programi lahko s tem prevzamejo nadzor nad tabličnim računalnikom."</string>
- <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"Programu omogoča, da svoje dogodke vnosa (pritiske tipk ipd.) dostavi drugim programom. Zlonamerni programi lahko s tem prevzamejo nadzor nad telefonom."</string>
+ <string name="permdesc_injectEvents" product="tablet" msgid="206352565599968632">"Aplikaciji omogoča, da svoje dogodke vnosa (pritiske tipk ipd.) dostavi drugim aplikacijam. Zlonamerne aplikacije lahko s tem prevzamejo nadzor nad tabličnim računalnikom."</string>
+ <string name="permdesc_injectEvents" product="default" msgid="653128057572326253">"Aplikaciji omogoča, da svoje dogodke vnosa (pritiske tipk ipd.) dostavi drugim aplikacijam. Zlonamerne aplikacije lahko s tem prevzamejo nadzor nad telefonom."</string>
<string name="permlab_readInputState" msgid="469428900041249234">"snemanje vnesenega besedila in dejanj, ki jih izvedete"</string>
- <string name="permdesc_readInputState" msgid="8387754901688728043">"Programu omogoča spremljanje tipk, ki jih pritisnete med interakcijo z drugim programom (na primer vnos gesla). Navadni programi tega nikoli ne potrebujejo."</string>
+ <string name="permdesc_readInputState" msgid="8387754901688728043">"Aplikaciji omogoča spremljanje tipk, ki jih pritisnete med interakcijo z drugo aplikacijo (na primer vnos gesla). Navadne aplikacije tega nikoli ne potrebujejo."</string>
<string name="permlab_bindInputMethod" msgid="3360064620230515776">"povezovanje z načinom vnosa"</string>
- <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Lastniku omogoča, da se poveže z vmesnikom načina vnosa najvišje ravni. Tega nikoli ni treba uporabiti za navadne programe."</string>
+ <string name="permdesc_bindInputMethod" msgid="3250440322807286331">"Lastniku omogoča, da se poveže z vmesnikom načina vnosa najvišje ravni. Tega nikoli ni treba uporabiti za navadne aplikacije."</string>
<string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"povezovanje s storitvijo za ljudi s posebnimi potrebami"</string>
<string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Lastniku omogoča povezovanje z vmesnikom najvišje ravni storitve za ljudi s posebnimi potrebami. Tega nikoli ni treba uporabiti za navadne aplikacije."</string>
<string name="permlab_bindPrintService" msgid="8462815179572748761">"povezava s storitvijo tiskanja"</string>
@@ -400,11 +400,11 @@
<string name="permlab_bindNfcService" msgid="2752731300419410724">"povezava s storitvijo NFC"</string>
<string name="permdesc_bindNfcService" msgid="6120647629174066862">"Dovoljuje, da se lastnik poveže z aplikacijami, ki posnemajo kartice za NFC. Pri navadnih aplikacijah to ne bi smelo biti potrebno."</string>
<string name="permlab_bindTextService" msgid="7358378401915287938">"poveži z besedilno storitvijo"</string>
- <string name="permdesc_bindTextService" msgid="8151968910973998670">"Dovoljuje, da se lastnik poveže z vmesnikom besedilne storitve najvišje ravni (npr. SpellCheckerService). Tega nikoli ni treba uporabiti za navadne programe."</string>
+ <string name="permdesc_bindTextService" msgid="8151968910973998670">"Dovoljuje, da se lastnik poveže z vmesnikom besedilne storitve najvišje ravni (npr. SpellCheckerService). Tega nikoli ni treba uporabiti za navadne aplikacije."</string>
<string name="permlab_bindVpnService" msgid="4708596021161473255">"povezava s storitvijo navideznega zasebnega omrežja"</string>
- <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Lastniku omogoča povezovanje z vmesnikom storitve navideznega zasebnega omrežja najvišje ravni. Ne uporabljajte za navadne programe."</string>
+ <string name="permdesc_bindVpnService" msgid="2067845564581693905">"Lastniku omogoča povezovanje z vmesnikom storitve navideznega zasebnega omrežja najvišje ravni. Ne uporabljajte za navadne aplikacije."</string>
<string name="permlab_bindWallpaper" msgid="8716400279937856462">"povezovanje z ozadjem"</string>
- <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Imetniku omogoča povezavo z vmesnikom ozadja najvišje ravni. Tega nikoli ni treba uporabiti za navadne programe."</string>
+ <string name="permdesc_bindWallpaper" msgid="7108428692595491668">"Imetniku omogoča povezavo z vmesnikom ozadja najvišje ravni. Tega nikoli ni treba uporabiti za navadne aplikacije."</string>
<string name="permlab_bindVoiceInteraction" msgid="5334852580713715068">"povezovanje z glasovnim interaktorjem"</string>
<string name="permdesc_bindVoiceInteraction" msgid="2345721766501778101">"Imetniku omogoča povezovanje z vmesnikom storitve glasovne interakcije najvišje ravni. Tega ni treba nikoli uporabiti za navadne aplikacije."</string>
<string name="permlab_manageVoiceKeyphrases" msgid="1252285102392793548">"upravljanje glasovnih ključnih besednih zvez"</string>
@@ -412,9 +412,9 @@
<string name="permlab_bindRemoteDisplay" msgid="1782923938029941960">"povezava z oddaljenim prikazom"</string>
<string name="permdesc_bindRemoteDisplay" msgid="1261242718727295981">"Imetniku omogoča povezovanje z vmesnikom oddaljenega prikaza najvišje ravni. Tega ni treba nikoli uporabiti za navadne aplikacije."</string>
<string name="permlab_bindRemoteViews" msgid="5697987759897367099">"poveži s storitvijo pripomočka"</string>
- <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Lastniku omogoča povezovanje z vmesnikom storitve pripomočka najvišje ravni. Tega ni treba nikoli uporabiti za navadne programe."</string>
+ <string name="permdesc_bindRemoteViews" msgid="4717987810137692572">"Lastniku omogoča povezovanje z vmesnikom storitve pripomočka najvišje ravni. Tega ni treba nikoli uporabiti za navadne aplikacije."</string>
<string name="permlab_bindDeviceAdmin" msgid="8704986163711455010">"interakcija s skrbnikom naprave"</string>
- <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Omogoča lastniku, da pošlje namere skrbniku naprave. Nikoli se ne uporablja za navadne programe."</string>
+ <string name="permdesc_bindDeviceAdmin" msgid="569715419543907930">"Omogoča lastniku, da pošlje namere skrbniku naprave. Nikoli se ne uporablja za navadne aplikacije."</string>
<string name="permlab_bindTvInput" msgid="5601264742478168987">"povezava s TV-vhodom"</string>
<string name="permdesc_bindTvInput" msgid="2371008331852001924">"Imetniku omogoča povezovanje z vmesnikom TV-vhoda najvišje ravni. Tega ni treba nikoli uporabiti za navadne aplikacije."</string>
<string name="permlab_modifyParentalControls" msgid="4611318225997592242">"spreminjanje nastavitev starševskega nadzora"</string>
@@ -422,58 +422,58 @@
<string name="permlab_manageDeviceAdmins" msgid="4248828900045808722">"dodajanje ali odstranjevanje skrbnikov naprave"</string>
<string name="permdesc_manageDeviceAdmins" msgid="5025608167709942485">"Imetniku omogoča, da doda ali odstrani aktivne skrbnike naprave. Normalne aplikacije tega načeloma ne potrebujejo."</string>
<string name="permlab_setOrientation" msgid="3365947717163866844">"spreminjanje usmerjenosti zaslona"</string>
- <string name="permdesc_setOrientation" msgid="3046126619316671476">"Programu omogoča, da kadar koli zasuka zaslon. Ne uporabljajte za navadne programe."</string>
+ <string name="permdesc_setOrientation" msgid="3046126619316671476">"Aplikaciji omogoča, da kadar koli zasuka zaslon. Ne uporabljajte za navadne aplikacije."</string>
<string name="permlab_setPointerSpeed" msgid="9175371613322562934">"spreminjanje hitrosti kazalca"</string>
- <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"Programu omogoča spreminjanje hitrosti kazalca miške ali sledilne ploščice. Tega ni treba nikoli uporabiti za navadne programe."</string>
+ <string name="permdesc_setPointerSpeed" msgid="6866563234274104233">"Aplikaciji omogoča spreminjanje hitrosti kazalca miške ali sledilne ploščice. Tega ni treba nikoli uporabiti za navadne aplikacije."</string>
<string name="permlab_setKeyboardLayout" msgid="4778731703600909340">"spreminjanje postavitve tipkovnice"</string>
<string name="permdesc_setKeyboardLayout" msgid="8480016771134175879">"Aplikaciji omogoča, da kadar koli spremeni postavitev tipkovnice. Običajne aplikacije tega ne potrebujejo."</string>
- <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"pošiljanje signalov Linuxa programom"</string>
- <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"Programu omogoča, da zahteva, da je posredovani signal poslan vsem trajnim procesom."</string>
- <string name="permlab_persistentActivity" msgid="8841113627955563938">"neprekinjeno izvajanje programov"</string>
+ <string name="permlab_signalPersistentProcesses" msgid="4539002991947376659">"pošiljanje signalov Linuxa aplikacijam"</string>
+ <string name="permdesc_signalPersistentProcesses" msgid="4896992079182649141">"Aplikaciji omogoča, da zahteva, da je posredovani signal poslan vsem trajnim procesom."</string>
+ <string name="permlab_persistentActivity" msgid="8841113627955563938">"neprekinjeno izvajanje aplikacij"</string>
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Aplikaciji omogoča, da nekatere svoje dele naredi trajne v pomnilniku. S tem je lahko pomnilnik omejen za druge aplikacije, zaradi česar je delovanje tabličnega računalnika upočasnjeno."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Aplikaciji omogoča, da nekatere svoje dele naredi trajne v pomnilniku. S tem je lahko pomnilnik omejen za druge aplikacije, zaradi česar je delovanje telefona upočasnjeno."</string>
- <string name="permlab_deletePackages" msgid="184385129537705938">"brisanje programov"</string>
- <string name="permdesc_deletePackages" msgid="7411480275167205081">"Programu omogoča brisanje paketov sistema Android. Zlonamerni programi lahko to uporabijo za izbris pomembnih programov."</string>
- <string name="permlab_clearAppUserData" msgid="274109191845842756">"brisanje podatkov drugih programov"</string>
- <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"Programu omogoča izbris podatkov uporabnika."</string>
- <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"brisanje predpomnilnika drugih programov"</string>
- <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"Programu omogoča izbris datotek predpomnilnika."</string>
- <string name="permlab_getPackageSize" msgid="7472921768357981986">"izračunavanje prostora za shranjevanje programa"</string>
- <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Programu omogoča, da pridobi njegovo kodo, podatke in velikosti predpomnilnika."</string>
- <string name="permlab_installPackages" msgid="2199128482820306924">"neposredno nameščanje programov"</string>
- <string name="permdesc_installPackages" msgid="5628530972548071284">"Programu omogoča namestitev novih ali posodobljenih paketov sistema Android. Zlonamerni programi lahko to uporabijo za dodajanje novih programov s poljubnimi zmogljivimi dovoljenji."</string>
- <string name="permlab_clearAppCache" msgid="7487279391723526815">"brisanje vseh podatkov predpomnilnika programa"</string>
+ <string name="permlab_deletePackages" msgid="184385129537705938">"brisanje aplikacij"</string>
+ <string name="permdesc_deletePackages" msgid="7411480275167205081">"Aplikaciji omogoča brisanje paketov sistema Android. Zlonamerne aplikacije lahko to uporabijo za izbris pomembnih aplikacij."</string>
+ <string name="permlab_clearAppUserData" msgid="274109191845842756">"brisanje podatkov drugih aplikacij"</string>
+ <string name="permdesc_clearAppUserData" msgid="4625323684125459488">"Aplikaciji omogoča izbris podatkov uporabnika."</string>
+ <string name="permlab_deleteCacheFiles" msgid="3128665571837408675">"brisanje predpomnilnika drugih aplikacij"</string>
+ <string name="permdesc_deleteCacheFiles" msgid="3812998599006730196">"Aplikaciji omogoča izbris datotek predpomnilnika."</string>
+ <string name="permlab_getPackageSize" msgid="7472921768357981986">"izračunavanje prostora za shranjevanje aplikacije"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Aplikaciji omogoča, da pridobi njeno kodo, podatke in velikosti predpomnilnika."</string>
+ <string name="permlab_installPackages" msgid="2199128482820306924">"neposredno nameščanje aplikacij"</string>
+ <string name="permdesc_installPackages" msgid="5628530972548071284">"Aplikaciji omogoča namestitev novih ali posodobljenih paketov sistema Android. Zlonamerne aplikacije lahko to uporabijo za dodajanje novih aplikacij s poljubnimi zmogljivimi dovoljenji."</string>
+ <string name="permlab_clearAppCache" msgid="7487279391723526815">"brisanje vseh podatkov predpomnilnika aplikacije"</string>
<string name="permdesc_clearAppCache" product="tablet" msgid="8974640871945434565">"Aplikaciji omogoča sproščanje pomnilnika v tabličnem računalniku, tako da izbriše imenike predpomnilnika drugih aplikacij. To lahko povzroči počasnejši zagon drugih aplikacij, saj morajo znova prenesti svoje podatke."</string>
<string name="permdesc_clearAppCache" product="default" msgid="2459441021956436779">"Aplikaciji omogoča sproščanje pomnilnika telefona, tako da izbriše datoteke v imenikih predpomnilnika drugih aplikacij. To lahko povzroči počasnejši zagon drugih aplikacij, saj morajo znova prenesti svoje podatke."</string>
- <string name="permlab_movePackage" msgid="3289890271645921411">"premikanje sredstev programa"</string>
- <string name="permdesc_movePackage" msgid="319562217778244524">"Programu omogoča premikanje sredstev programa iz notranjih medijev v zunanje in obratno."</string>
+ <string name="permlab_movePackage" msgid="3289890271645921411">"premikanje sredstev aplikacije"</string>
+ <string name="permdesc_movePackage" msgid="319562217778244524">"Aplikaciji omogoča premikanje sredstev aplikacije iz notranjih medijev v zunanje in obratno."</string>
<string name="permlab_readLogs" msgid="6615778543198967614">"branje občutljivih dnevniških podatkov"</string>
- <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Programu omogoča branje različnih sistemskih dnevniških datotek. To mu omogoča dostop do splošnih podatkov v tabličnem računalniku, lahko tudi do osebnih podatkov."</string>
- <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Programu omogoča branje različnih sistemskih dnevniških datotek. To mu omogoča dostop do splošnih podatkov v telefonu, lahko tudi do osebnih podatkov."</string>
+ <string name="permdesc_readLogs" product="tablet" msgid="82061313293455151">"Aplikaciji omogoča branje različnih sistemskih dnevniških datotek. To ji omogoča dostop do splošnih podatkov v tabličnem računalniku, lahko tudi do osebnih podatkov."</string>
+ <string name="permdesc_readLogs" product="default" msgid="2063438140241560443">"Aplikaciji omogoča branje različnih sistemskih dnevniških datotek. To ji omogoča dostop do splošnih podatkov v telefonu, lahko tudi do osebnih podatkov."</string>
<string name="permlab_anyCodecForPlayback" msgid="715805555823881818">"uporaba katerega koli predstavnostnega dekodirnika za predvajanje"</string>
- <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Programu omogoča, da uporabi kateri koli dekodirnik večpredstavnosti za predvajanje."</string>
+ <string name="permdesc_anyCodecForPlayback" msgid="8283912488433189010">"Aplikaciji omogoča, da uporabi kateri koli dekodirnik večpredstavnosti za predvajanje."</string>
<string name="permlab_manageCaCertificates" msgid="1678391896786882014">"upravljanje preverjenih poverilnic"</string>
<string name="permdesc_manageCaCertificates" msgid="4015644047196937014">"Aplikaciji dovoli nameščanje in odstranjevanje potrdil overitelja potrdil kot preverjenih poverilnic."</string>
<string name="permlab_bindJobService" msgid="3637568367978271086">"izvajanje načrtovanega dela aplikacije v ozadju"</string>
<string name="permdesc_bindJobService" msgid="3473288460524119838">"To dovoljenje sistemu Android omogoča, da na zahtevo izvaja aplikacijo v ozadju."</string>
<string name="permlab_diagnostic" msgid="8076743953908000342">"branje/pisanje v sredstva, ki so v lasti skupine za diagnostiko"</string>
- <string name="permdesc_diagnostic" msgid="6608295692002452283">"Programu omogoča branje in pisanje na poljuben vir, ki je v lasti skupine za diagnostiko; na primer datoteke v mapi /dev. To lahko vpliva na stabilnost in varnost sistema. To naj uporablja SAMO izdelovalec ali operater za diagnostiko, specifično za strojno opremo."</string>
- <string name="permlab_changeComponentState" msgid="6335576775711095931">"omogočanje ali onemogočanje komponent programa"</string>
- <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Programu omogoča, da spremeni, ali je komponenta drugega programa omogočena ali ne. Zlonamerni programi lahko to uporabijo za onemogočanje pomembnih zmožnosti tabličnega računalnika. Pri dodeljevanju dovoljenja je treba biti previden, saj lahko komponente programa nastavite tako, da jih ni mogoče uporabiti, da niso dosledne ali da niso stabilne."</string>
- <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Programu omogoča, da spremeni, ali je komponenta drugega programa omogočena ali ne. Zlonamerni programi lahko to uporabijo za onemogočanje pomembnih zmožnosti telefona. Pri dodeljevanju dovoljenja je treba biti previden, saj lahko komponente programa nastavite tako, da jih ni mogoče uporabiti, da niso dosledne ali da niso stabilne."</string>
+ <string name="permdesc_diagnostic" msgid="6608295692002452283">"Aplikaciji omogoča branje in pisanje na poljuben vir, ki je v lasti skupine za diagnostiko; na primer datoteke v mapi /dev. To lahko vpliva na stabilnost in varnost sistema. To naj uporablja SAMO izdelovalec ali operater za diagnostiko, specifično za strojno opremo."</string>
+ <string name="permlab_changeComponentState" msgid="6335576775711095931">"omogočanje ali onemogočanje komponent aplikacije"</string>
+ <string name="permdesc_changeComponentState" product="tablet" msgid="8887435740982237294">"Aplikaciji omogoča, da spremeni, ali je komponenta druge aplikacije omogočena ali ne. Zlonamerne aplikacije lahko to uporabijo za onemogočanje pomembnih zmožnosti tabličnega računalnika. Pri dodeljevanju dovoljenja je treba biti previden, saj lahko komponente aplikacije nastavite tako, da jih ni mogoče uporabiti, da niso dosledne ali da niso stabilne."</string>
+ <string name="permdesc_changeComponentState" product="default" msgid="1827232484416505615">"Aplikaciji omogoča, da spremeni, ali je komponenta druge aplikacije omogočena ali ne. Zlonamerne aplikacije lahko to uporabijo za onemogočanje pomembnih zmožnosti telefona. Pri dodeljevanju dovoljenja je treba biti previden, saj lahko komponente aplikacije nastavite tako, da jih ni mogoče uporabiti, da niso dosledne ali da niso stabilne."</string>
<string name="permlab_grantRevokePermissions" msgid="4627315351093508795">"dodeljevanje ali preklic dovoljenj"</string>
<string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Aplikaciji omogoča dodeljevanje ali preklic posebnih dovoljenj zanjo ali za druge aplikacije. Zlonamerne aplikacije lahko to uporabijo za dostop do funkcij, za katere jim niste dodelili pravic."</string>
- <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"nastavitev prednostnih programov"</string>
- <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Programu omogoča spreminjanje priljubljenih programov. Zlonamerni programi lahko s tem neopazno spremenijo programe, ki se izvajajo, tako da se izdajajo za obstoječe programe in zbirajo osebne podatke."</string>
+ <string name="permlab_setPreferredApplications" msgid="8463181628695396391">"nastavitev prednostnih aplikacij"</string>
+ <string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Aplikaciji omogoča spreminjanje priljubljenih aplikacij. Zlonamerne aplikacije lahko s tem neopazno spremenijo aplikacije, ki se izvajajo, tako da se izdajajo za obstoječe aplikacije in zbirajo osebne podatke."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"spreminjanje sistemskih nastavitev"</string>
- <string name="permdesc_writeSettings" msgid="7775723441558907181">"Programu omogoča spreminjanje podatkov nastavitev sistema. Zlonamerni programi lahko poškodujejo konfiguracijo sistema."</string>
+ <string name="permdesc_writeSettings" msgid="7775723441558907181">"Aplikaciji omogoča spreminjanje podatkov nastavitev sistema. Zlonamerne aplikacije lahko poškodujejo konfiguracijo sistema."</string>
<string name="permlab_writeSecureSettings" msgid="204676251876718288">"spreminjanje varnih sistemskih nastavitev"</string>
- <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"Programu omogoča spreminjanje podatkov varnostnih nastavitev sistema. Ni za uporabo z navadnimi programi."</string>
+ <string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"Aplikaciji omogoča spreminjanje podatkov varnostnih nastavitev sistema. Ni za uporabo z navadnimi aplikacijami."</string>
<string name="permlab_writeGservices" msgid="2149426664226152185">"spreminjanje zemljevidov Googlovih storitev"</string>
- <string name="permdesc_writeGservices" msgid="1287309437638380229">"Programu omogoča spreminjanje zemljevidov Googlovih storitev. Ni za uporabo z navadnimi programi."</string>
+ <string name="permdesc_writeGservices" msgid="1287309437638380229">"Aplikaciji omogoča spreminjanje zemljevidov Googlovih storitev. Ni za uporabo z navadnimi aplikacijami."</string>
<string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"izvedba ob zagonu"</string>
- <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Programu omogoča, da se samodejno zažene po zagonu sistema. To lahko povzroči daljši zagon tabličnega računalnika in programu omogoči, da s stalnim izvajanjem upočasni delovanje tabličnega računalnika."</string>
- <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Programu omogoča, da se zažene takoj, ko sistem dokonča zagon. Zato lahko zagon telefona traja nekoliko dlje, program pa lahko upočasni splošno delovanje telefona, ker se vedno izvaja."</string>
+ <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Aplikaciji omogoča, da se samodejno zažene po zagonu sistema. To lahko povzroči daljši zagon tabličnega računalnika in aplikaciji omogoči, da s stalnim izvajanjem upočasni delovanje tabličnega računalnika."</string>
+ <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Aplikaciji omogoča, da se zažene takoj, ko sistem dokonča zagon. Zato lahko zagon telefona traja nekoliko dlje, aplikacija pa lahko upočasni splošno delovanje telefona, ker se vedno izvaja."</string>
<string name="permlab_broadcastSticky" msgid="7919126372606881614">"pošiljanje fiksne oddaje"</string>
<string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Aplikaciji omogoča hitro pošiljanje fiksnih oddaj, ki ostanejo po koncu oddajanja. Zaradi prekomerne uporabe je delovanje tabličnega računalnika lahko počasno ali nestabilno, ker porabi preveč pomnilnika."</string>
<string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Aplikaciji omogoča hitro pošiljanje fiksnih oddaj, ki ostanejo po koncu oddajanja. Zaradi prekomerne uporabe je delovanje telefona lahko počasno ali nestabilno, ker porabi preveč pomnilnika."</string>
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"spreminj. vaše osebne vizitke"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Aplikaciji omogoča spreminjanje ali dodajanje osebnih podatkov v profilu, ki so shranjeni v napravi, na primer ime in podatki za stik. To pomeni, da vas lahko aplikacija prepozna in vaše podatke v profilu pošlje drugim."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"tipala telesnih funkcij (npr. merilniki srčnega utripa)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Aplikaciji dovoli dostop do podatkov tipal, ki jih uporabljate za merjenje procesov v telesu, kot je srčni utrip."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Aplikaciji omogoča dostop do podatkov tipal, ki nadzirajo vaše fizično stanje, med drugim vaš srčni utrip."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"branje vašega družabnega toka"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Aplikaciji omogoča dostop do vaših objav in objav vaših prijateljev v družabnih omrežjih ter njihovo sinhronizacijo. Previdno pri objavljanju informacij – aplikacija lahko s tem bere komunikacijo med vami in prijatelji v družabnih omrežjih, ne glede na zasebnost. Opomba: Tega dovoljenja ni mogoče uveljaviti v vseh družabnih omrežjih."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"pisanje v vaš družabni tok"</string>
@@ -516,9 +516,9 @@
<string name="permlab_accessCoarseLocation" msgid="4887895362354239628">"približna lokacija (na podlagi omrežja)"</string>
<string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Aplikaciji omogoča, da določi vašo približno lokacijo na podlagi lokacijskih storitev z omrežnimi lokacijskimi viri, kot so bazne postaje mobilne telefonije in Wi-Fi. Te lokacijske storitve morajo biti vklopljene in na voljo v napravi, če želite, da jih aplikacija uporablja. Aplikacije lahko na podlagi tega določijo vašo približno lokacijo."</string>
<string name="permlab_accessSurfaceFlinger" msgid="2363969641792388947">"dostop do storitve SurfaceFlinger"</string>
- <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Programu omogoča uporabo funkcij nizke ravni SurfaceFlinger."</string>
+ <string name="permdesc_accessSurfaceFlinger" msgid="1041619516733293551">"Aplikaciji omogoča uporabo funkcij nizke ravni SurfaceFlinger."</string>
<string name="permlab_readFrameBuffer" msgid="6690504248178498136">"branje grafičnega/slikovnega medpomnilnika"</string>
- <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Programu omogoča branje vsebine grafičnega/slikovnega medpomnilnika."</string>
+ <string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"Aplikaciji omogoča branje vsebine grafičnega/slikovnega medpomnilnika."</string>
<string name="permlab_accessInputFlinger" msgid="5348635270689553857">"dostop do funkcij InputFlinger"</string>
<string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"Aplikaciji dovoljuje uporabo funkcij InputFlinger nizke ravni."</string>
<string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"konfiguriranje zaslonov Wi-Fi"</string>
@@ -549,110 +549,110 @@
<string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Dovoli že nameščeni sistemski aplikaciji, da onemogoči LED-indikator uporabe fotoaparata."</string>
<string name="permlab_brick" product="tablet" msgid="2961292205764488304">"trajno onemogočenje tabličnega računalnika"</string>
<string name="permlab_brick" product="default" msgid="8337817093326370537">"trajno onemogočenje telefona"</string>
- <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Programu omogoča trajno onemogočenje celotnega tabličnega računalnika. To je zelo nevarno dejanje."</string>
- <string name="permdesc_brick" product="default" msgid="5788903297627283099">"Programu omogoča trajno onemogočenje celotnega telefona. To je zelo nevarno."</string>
+ <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Aplikaciji omogoča trajno onemogočenje celotnega tabličnega računalnika. To je zelo nevarno dejanje."</string>
+ <string name="permdesc_brick" product="default" msgid="5788903297627283099">"Aplikaciji omogoča trajno onemogočenje celotnega telefona. To je zelo nevarno."</string>
<string name="permlab_reboot" product="tablet" msgid="3436634972561795002">"vsiljeni vnovični zagon"</string>
<string name="permlab_reboot" product="default" msgid="2898560872462638242">"vsiljevanje vnovičnega zagona telefona"</string>
- <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"Programu omogoča, da vsili vnovični zagon tabličnega računalnika."</string>
- <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"Dovoljuje, da program vsili vnovični zagon telefona."</string>
+ <string name="permdesc_reboot" product="tablet" msgid="8172056180063700741">"Aplikaciji omogoča, da vsili vnovični zagon tabličnega računalnika."</string>
+ <string name="permdesc_reboot" product="default" msgid="5326008124289989969">"Dovoljuje, da aplikacija vsili vnovični zagon telefona."</string>
<string name="permlab_mount_unmount_filesystems" product="nosdcard" msgid="2927361537942591841">"dostop do dat. sist. pomn. USB"</string>
<string name="permlab_mount_unmount_filesystems" product="default" msgid="4402305049890953810">"dostop do datotečnega sistema kartice SD"</string>
- <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"Programu omogoča vpenjanje in izpenjanje datotečnih sistemov za izmenljive pomnilnike."</string>
+ <string name="permdesc_mount_unmount_filesystems" msgid="1829290701658992347">"Aplikaciji omogoča vpenjanje in izpenjanje datotečnih sistemov za izmenljive pomnilnike."</string>
<string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"brisanje pomnilnika USB"</string>
<string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"brisanje kartice SD"</string>
- <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"Programu omogoča formatiranje shrambe za izmenljive medije."</string>
+ <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"Aplikaciji omogoča formatiranje shrambe za izmenljive medije."</string>
<string name="permlab_asec_access" msgid="3411338632002193846">"informacije o notranjem pomnilniku"</string>
- <string name="permdesc_asec_access" msgid="3094563844593878548">"Programu omogoča dobivanje podatkov o notranjem pomnilniku."</string>
+ <string name="permdesc_asec_access" msgid="3094563844593878548">"Aplikaciji omogoča dobivanje podatkov o notranjem pomnilniku."</string>
<string name="permlab_asec_create" msgid="6414757234789336327">"ustvarjanje notranje shrambe"</string>
- <string name="permdesc_asec_create" msgid="4558869273585856876">"Programu omogoča ustvarjanje notranjega pomnilnika."</string>
+ <string name="permdesc_asec_create" msgid="4558869273585856876">"Aplikaciji omogoča ustvarjanje notranjega pomnilnika."</string>
<string name="permlab_asec_destroy" msgid="526928328301618022">"uničenje notranje shrambe"</string>
- <string name="permdesc_asec_destroy" msgid="7218749286145526537">"Programu omogoča uničenje notranjega pomnilnika."</string>
+ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"Aplikaciji omogoča uničenje notranjega pomnilnika."</string>
<string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"vpenjanje in izpenjanje notranjega pomnilnika"</string>
- <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"Programu omogoča vpenjanje in izpenjanje notranjega pomnilnika."</string>
+ <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"Aplikaciji omogoča vpenjanje in izpenjanje notranjega pomnilnika."</string>
<string name="permlab_asec_rename" msgid="7496633954080472417">"preimenovanje notranje shrambe"</string>
- <string name="permdesc_asec_rename" msgid="1794757588472127675">"Programu omogoča preimenovanje notranjega pomnilnika."</string>
+ <string name="permdesc_asec_rename" msgid="1794757588472127675">"Aplikaciji omogoča preimenovanje notranjega pomnilnika."</string>
<string name="permlab_vibrate" msgid="7696427026057705834">"nadzor vibriranja"</string>
- <string name="permdesc_vibrate" msgid="6284989245902300945">"Programu omogoča nadzor vibriranja."</string>
+ <string name="permdesc_vibrate" msgid="6284989245902300945">"Aplikaciji omogoča nadzor vibriranja."</string>
<string name="permlab_flashlight" msgid="2155920810121984215">"nadzor svetilke"</string>
- <string name="permdesc_flashlight" msgid="6522284794568368310">"Programu omogoča nadzor svetilke."</string>
+ <string name="permdesc_flashlight" msgid="6522284794568368310">"Aplikaciji omogoča nadzor svetilke."</string>
<string name="permlab_manageUsb" msgid="1113453430645402723">"upravljanje nastavitev in dovoljenj za naprave USB"</string>
- <string name="permdesc_manageUsb" msgid="7776155430218239833">"Omogoči programu upravljanje nastavitev in dovoljenj za naprave USB."</string>
+ <string name="permdesc_manageUsb" msgid="7776155430218239833">"Omogoči aplikaciji upravljanje nastavitev in dovoljenj za naprave USB."</string>
<string name="permlab_accessMtp" msgid="4953468676795917042">"uveljavitev protokola MTP"</string>
<string name="permdesc_accessMtp" msgid="6532961200486791570">"Omogoča dostop do gonilnika jedra MTP za uveljavitev protokola MTP USB."</string>
<string name="permlab_hardware_test" msgid="4148290860400659146">"preskušanje strojne opreme"</string>
- <string name="permdesc_hardware_test" msgid="6597964191208016605">"Programu omogoča nadzor različnih zunanjih naprav za preskušanje strojne opreme."</string>
+ <string name="permdesc_hardware_test" msgid="6597964191208016605">"Aplikaciji omogoča nadzor različnih zunanjih naprav za preskušanje strojne opreme."</string>
<string name="permlab_fm" msgid="8749504526866832">"dostop do radia FM"</string>
<string name="permdesc_fm" msgid="4145699441237962818">"Aplikaciji dovoli dostop do radia FM za poslušanje programov."</string>
<string name="permlab_callPhone" msgid="3925836347681847954">"neposredno klicanje telefonskih številk"</string>
<string name="permdesc_callPhone" msgid="3740797576113760827">"Aplikaciji omogoča klicanje telefonskih številk brez vašega posredovanja. Zaradi tega lahko pride do nepričakovanih stroškov ali klicev. Aplikaciji to ne dovoljuje opravljanja klicev v sili. Zlonamerne aplikacije lahko kličejo brez vaše potrditve, kar vas lahko drago stane."</string>
<string name="permlab_callPrivileged" msgid="4198349211108497879">"neposredno klicanje poljubnih telefonskih številk"</string>
- <string name="permdesc_callPrivileged" msgid="1689024901509996810">"Programu omogoča, da brez vas pokliče katero koli telefonsko številko, tudi klic v sili. Zlonamerni programi lahko brez potrebe in nezakonito kličejo intervencijske službe."</string>
+ <string name="permdesc_callPrivileged" msgid="1689024901509996810">"Aplikaciji omogoča, da brez vas pokliče katero koli telefonsko številko, tudi klic v sili. Zlonamerne aplikacije lahko brez potrebe in nezakonito kličejo intervencijske službe."</string>
<string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"neposredni zagon namestitve tabličnega računalnika CDMA"</string>
<string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"neposredni zagon nastavitve telefona CDMA"</string>
- <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"Programu omogoča zagon omogočanja uporabe CDMA. Zlonamerni programi lahko po nepotrebnem zaženejo omogočanje uporabe CDMA."</string>
+ <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"Aplikaciji omogoča zagon omogočanja uporabe CDMA. Zlonamerne aplikacije lahko po nepotrebnem zaženejo omogočanje uporabe CDMA."</string>
<string name="permlab_locationUpdates" msgid="7785408253364335740">"nadzor obvestil o posodobitvi lokacije"</string>
- <string name="permdesc_locationUpdates" msgid="1120741557891438876">"Programu dovoljuje omogočanje ali onemogočanje obvestil o posodobitvi lokacije radia. Ni za uporabo z navadnimi programi."</string>
+ <string name="permdesc_locationUpdates" msgid="1120741557891438876">"Aplikaciji dovoljuje omogočanje ali onemogočanje obvestil o posodobitvi lokacije radia. Ni za uporabo z navadnimi aplikacijami."</string>
<string name="permlab_checkinProperties" msgid="7855259461268734914">"dostop do lastnosti sprostitve"</string>
- <string name="permdesc_checkinProperties" msgid="4024526968630194128">"Programu omogoča dostop za branje/pisanje do lastnosti, prenesenih s storitvijo za sprostitev. Ni za uporabo z navadnimi programi."</string>
+ <string name="permdesc_checkinProperties" msgid="4024526968630194128">"Aplikaciji omogoča dostop za branje/pisanje do lastnosti, prenesenih s storitvijo za sprostitev. Ni za uporabo z navadnimi aplikacijami."</string>
<string name="permlab_bindGadget" msgid="776905339015863471">"izbiranje pripomočkov"</string>
- <string name="permdesc_bindGadget" msgid="8261326938599049290">"Programu omogoča, da sistemu ukaže, katere pripomočke je mogoče uporabiti s katerim programom. S tem dovoljenjem lahko programi drugim programom dajo dostop do osebnih podatkov. Ni za uporabo z navadnimi programi."</string>
+ <string name="permdesc_bindGadget" msgid="8261326938599049290">"Aplikaciji omogoča, da sistemu ukaže, katere pripomočke je mogoče uporabiti s katero aplikacijo. S tem dovoljenjem lahko aplikacije drugim aplikacijam dajo dostop do osebnih podatkov. Ni za uporabo z navadnimi aplikacijami."</string>
<string name="permlab_modifyPhoneState" msgid="8423923777659292228">"spreminjanje stanja telefona"</string>
- <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Programu omogoča nadziranje telefonskih funkcij naprave. Program lahko s tem dovoljenjem preklaplja omrežja, vklopi ali izklopi radio v telefonu, ne da bi vas obvestil."</string>
+ <string name="permdesc_modifyPhoneState" msgid="1029877529007686732">"Aplikaciji omogoča nadziranje telefonskih funkcij naprave. Aplikacija lahko s tem dovoljenjem preklaplja omrežja, vklopi ali izklopi radio v telefonu, ne da bi vas obvestila."</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"branje stanja in identitete telefona"</string>
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Aplikaciji omogoča dostop do funkcij telefona v napravi. S tem dovoljenjem lahko aplikacija določi telefonsko številko in ID-je naprave, določi lahko tudi, ali je klic aktiven, in oddaljeno številko, s katero je klic povezan."</string>
<string name="permlab_readPrecisePhoneState" msgid="5476483020282007597">"branje natančnih stanj telefona"</string>
<string name="permdesc_readPrecisePhoneState" msgid="6648009074263855418">"Aplikaciji dovoli dostop do natančnih stanj telefona. To dovoljenje aplikaciji omogoča ugotoviti pravo stanje klica; ali je klic aktiven ali v ozadju; neuspele klice; natančno stanje podatkovne povezave in neuspele podatkovne povezave."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"preprečitev prehoda tabličnega računalnika v stanje pripravljenosti"</string>
<string name="permlab_wakeLock" product="default" msgid="573480187941496130">"preprečevanje prehoda v stanje pripravljenosti telefona"</string>
- <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Omogoča, da program prepreči prehod tabličnega računalnika v stanje pripravljenosti."</string>
- <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Programu omogoča, da v telefonu prepreči prehod v stanje pripravljenosti."</string>
+ <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Omogoča, da aplikacija prepreči prehod tabličnega računalnika v stanje pripravljenosti."</string>
+ <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Aplikaciji omogoča, da v telefonu prepreči prehod v stanje pripravljenosti."</string>
<string name="permlab_transmitIr" msgid="7545858504238530105">"prenašanje z infrardečim oddajnikom"</string>
<string name="permdesc_transmitIr" product="tablet" msgid="5358308854306529170">"Aplikaciji dovoljuje uporabo infrardečega oddajnika tabličnega računalnika."</string>
<string name="permdesc_transmitIr" product="default" msgid="7957763745020300725">"Aplikaciji dovoljuje uporabo infrardečega oddajnika telefona."</string>
<string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"vklop ali izklop tabličnega računalnika"</string>
<string name="permlab_devicePower" product="default" msgid="4928622470980943206">"vklop ali izklop telefona"</string>
- <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"Programu omogoča vklop ali izklop tabličnega računalnika."</string>
- <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"Programu omogoča vklop ali izklop telefona."</string>
+ <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"Aplikaciji omogoča vklop ali izklop tabličnega računalnika."</string>
+ <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"Aplikaciji omogoča vklop ali izklop telefona."</string>
<string name="permlab_userActivity" msgid="1677844893921729548">"ponastavitev časovne omejitve za zaslon"</string>
<string name="permdesc_userActivity" msgid="651746160252248024">"Aplikaciji omogoča ponastavitev časovne omejitve za zaslon."</string>
<string name="permlab_factoryTest" msgid="3715225492696416187">"izvajanje v preskusnem načinu delovanja"</string>
<string name="permdesc_factoryTest" product="tablet" msgid="3952059318359653091">"Izvajanje kot proizvajalčev preskus na najnižjem nivoju, kar omogoča popoln dostop do strojne opreme tabličnega računalnika. Dovoljenje je na voljo, samo če se tablični računalnik izvaja v načinu proizvajalčevega preskusa."</string>
<string name="permdesc_factoryTest" product="default" msgid="8136644990319244802">"Se izvaja kot preskus izdelovalca nizke ravni, ki dovoljuje popoln dostop do strojne opreme telefona. Na voljo le, ko se telefon izvaja v načinu preskusa izdelovalca."</string>
<string name="permlab_setWallpaper" msgid="6627192333373465143">"nastavljanje ozadja"</string>
- <string name="permdesc_setWallpaper" msgid="7373447920977624745">"Programu omogoča nastavitev ozadja sistema."</string>
+ <string name="permdesc_setWallpaper" msgid="7373447920977624745">"Aplikaciji omogoča nastavitev ozadja sistema."</string>
<string name="permlab_setWallpaperHints" msgid="3278608165977736538">"prilagajanje velikosti slike za ozadje"</string>
- <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Programu omogoča nastavitev namigov o velikosti ozadja sistema."</string>
+ <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Aplikaciji omogoča nastavitev namigov o velikosti ozadja sistema."</string>
<string name="permlab_masterClear" msgid="2315750423139697397">"ponastavitev sistema na privzete tovarniške nastavitve"</string>
- <string name="permdesc_masterClear" msgid="3665380492633910226">"Programu omogoča, da v celoti ponastavi sistema na tovarniške nastavitve, izbriše vse podatke, konfiguracijo in nameščene programe."</string>
+ <string name="permdesc_masterClear" msgid="3665380492633910226">"Aplikaciji omogoča, da v celoti ponastavi sistema na tovarniške nastavitve, izbriše vse podatke, konfiguracijo in nameščene aplikacije."</string>
<string name="permlab_setTime" msgid="2021614829591775646">"nastavljanje ure"</string>
- <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"Programu omogoča spreminjanje ure tabličnega računalnika."</string>
- <string name="permdesc_setTime" product="default" msgid="1855702730738020">"Programu dovoljuje spreminjanje ure telefona."</string>
+ <string name="permdesc_setTime" product="tablet" msgid="1896341438151152881">"Aplikaciji omogoča spreminjanje ure tabličnega računalnika."</string>
+ <string name="permdesc_setTime" product="default" msgid="1855702730738020">"Aplikaciji dovoljuje spreminjanje ure telefona."</string>
<string name="permlab_setTimeZone" msgid="2945079801013077340">"nastavitev časovnega pasu"</string>
- <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Programu omogoča spreminjanje časovnega pasu v tabličnem računalniku."</string>
- <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Programu omogoča spreminjanje časovnega pasu v telefonu."</string>
+ <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Aplikaciji omogoča spreminjanje časovnega pasu v tabličnem računalniku."</string>
+ <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Aplikaciji omogoča spreminjanje časovnega pasu v telefonu."</string>
<string name="permlab_accountManagerService" msgid="4829262349691386986">"opravljanje vloge AccountManagerService"</string>
- <string name="permdesc_accountManagerService" msgid="1948455552333615954">"Programu omogoča, da pokliče overovitelje računa."</string>
+ <string name="permdesc_accountManagerService" msgid="1948455552333615954">"Aplikaciji omogoča, da pokliče overovitelje računa."</string>
<string name="permlab_getAccounts" msgid="1086795467760122114">"iskanje računov v napravi"</string>
<string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Aplikaciji omogoča prejemanje seznama računov, ki jih pozna tablični računalnik.To lahko vključuje račune, ki so jih ustvarile nameščene aplikacije."</string>
<string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Aplikaciji omogoča prejemanje seznama računov, ki jih pozna telefon.To lahko vključuje račune, ki so jih ustvarile nameščene aplikacije."</string>
<string name="permlab_authenticateAccounts" msgid="5265908481172736933">"ustvarjanje računov in nastavitev gesel"</string>
- <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Programu omogoča uporabo zmožnosti overovitelja računa storitve AccountManager, vključno z ustvarjanjem računov ter s pridobivanjem in nastavljanjem njihovih gesel."</string>
+ <string name="permdesc_authenticateAccounts" msgid="5472124296908977260">"Aplikaciji omogoča uporabo zmožnosti overovitelja računa storitve AccountManager, vključno z ustvarjanjem računov ter s pridobivanjem in nastavljanjem njihovih gesel."</string>
<string name="permlab_manageAccounts" msgid="4983126304757177305">"dodajanje ali odstranjevanje računov"</string>
- <string name="permdesc_manageAccounts" msgid="8698295625488292506">"Programu omogoča izvajanje operacij, kot je dodajanje in odstranjevanje računov ter brisanje njihovih gesel."</string>
+ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"Aplikaciji omogoča izvajanje operacij, kot je dodajanje in odstranjevanje računov ter brisanje njihovih gesel."</string>
<string name="permlab_useCredentials" msgid="235481396163877642">"uporaba računov v napravi"</string>
- <string name="permdesc_useCredentials" msgid="7984227147403346422">"Programu omogoča, da zahteva žetone za preverjanje pristnosti."</string>
+ <string name="permdesc_useCredentials" msgid="7984227147403346422">"Aplikaciji omogoča, da zahteva žetone za preverjanje pristnosti."</string>
<string name="permlab_accessNetworkState" msgid="4951027964348974773">"prikaz omrežnih povezav"</string>
<string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Aplikaciji omogoča ogled podatkov o omrežnih povezavah, na primer o obstoječih in povezanih omrežjih."</string>
<string name="permlab_createNetworkSockets" msgid="8018758136404323658">"poln dostop do omrežja"</string>
<string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Aplikaciji omogoča ustvarjanje vtičnic omrežja in uporabo omrežnih protokolov po meri. Brskalnik in druge aplikacije omogočajo pošiljanje podatkov v internet, zato to dovoljenje ni potrebno za pošiljanje podatkov v internet."</string>
<string name="permlab_writeApnSettings" msgid="505660159675751896">"spreminjanje/prestrezanje omrežnih nastavitev in prometa"</string>
- <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"Programu omogoča spreminjanje omrežnih nastavitev ter prestrezanje in nadziranje omrežnega prometa, na primer spreminjanje proxyja in vrat katerega koli imena dostopne točke. Zlonamerni programi lahko nadziorajo, preusmerjajo ali spreminjajo omrežne pakete brez vaše vednosti."</string>
+ <string name="permdesc_writeApnSettings" msgid="5333798886412714193">"Aplikaciji omogoča spreminjanje omrežnih nastavitev ter prestrezanje in nadziranje omrežnega prometa, na primer spreminjanje proxyja in vrat katerega koli imena dostopne točke. Zlonamerne aplikacije lahko nadziorajo, preusmerjajo ali spreminjajo omrežne pakete brez vaše vednosti."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"spreminjanje povezljivosti omrežja"</string>
- <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Programu omogoča spreminjanje stanja povezljivosti omrežja."</string>
+ <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Aplikaciji omogoča spreminjanje stanja povezljivosti omrežja."</string>
<string name="permlab_changeTetherState" msgid="5952584964373017960">"Spreminjanje posredniške povezljivosti"</string>
- <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Programu dovoljuje spreminjanje stanja povezljivosti posredniškega omrežja."</string>
+ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Aplikaciji dovoljuje spreminjanje stanja povezljivosti posredniškega omrežja."</string>
<string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"spreminjanje nastavitev porabe podatkov ozadja"</string>
- <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Programu omogoča spreminjanje nastavitev uporabe podatkov ozadja."</string>
+ <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Aplikaciji omogoča spreminjanje nastavitev uporabe podatkov ozadja."</string>
<string name="permlab_accessWifiState" msgid="5202012949247040011">"prikaz povezav Wi-Fi"</string>
<string name="permdesc_accessWifiState" msgid="5002798077387803726">"Aplikaciji omogoča ogled podatkov o omrežjih Wi-Fi, na primer o tem, ali je Wi-Fi omogočen, in imen povezanih naprav Wi-Fi."</string>
<string name="permlab_changeWifiState" msgid="6550641188749128035">"vzpostavitev povezave z omrežjem Wi-Fi in prekinitev povezave z njim"</string>
@@ -661,8 +661,8 @@
<string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Aplikaciji omogoča prejemanje paketov, poslanih v vse naprave v omrežju Wi-Fi z večvrstnimi naslovi, ne samo v vaš tablični računalnik. Poraba je večja kot v načinu delovanja brez večvrstnega oddajanja."</string>
<string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Aplikaciji omogoča prejemanje paketov, poslanih v vse naprave v omrežju Wi-Fi z večvrstnimi naslovi, ne samo v vaš telefon. Poraba je večja kot v načinu delovanja brez večvrstnega oddajanja."</string>
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"dostop do nastavitev Bluetooth"</string>
- <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Programu omogoča konfiguriranje lokalnega tabličnega računalnika Bluetooth ter zaznavanje oddaljenih naprav in združevanje z njimi."</string>
- <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Programu omogoča konfiguriranje lokalnega telefona s tehnologijo Bluetooth ter odkrivanje oddaljenih naprav in povezovanje z njimi."</string>
+ <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Aplikaciji omogoča konfiguriranje lokalnega tabličnega računalnika Bluetooth ter zaznavanje oddaljenih naprav in združevanje z njimi."</string>
+ <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Aplikaciji omogoča konfiguriranje lokalnega telefona s tehnologijo Bluetooth ter odkrivanje oddaljenih naprav in povezovanje z njimi."</string>
<string name="permlab_bluetoothPriv" msgid="4009494246009513828">"aplikaciji dovoli seznanjanje prek povezave Bluetooth"</string>
<string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Aplikaciji dovoljuje seznanjanje z oddaljenimi napravami brez interakcije uporabnika."</string>
<string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Aplikaciji dovoljuje seznanjanje z oddaljenimi napravami brez interakcije uporabnika."</string>
@@ -691,13 +691,13 @@
<string name="permlab_readSyncStats" msgid="7396577451360202448">"branje statističnih podatkov sinhronizacije"</string>
<string name="permdesc_readSyncStats" msgid="1510143761757606156">"Aplikaciji omogoča branje statističnih podatkov o sinhronizaciji za račun, vključno z zgodovino dogodkov sinhronizacije in količino sinhroniziranih podatkov."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"branje naročenih virov"</string>
- <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Programu omogoča dobivanje podrobnosti o trenutno sinhroniziranih virih."</string>
+ <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Aplikaciji omogoča dobivanje podrobnosti o trenutno sinhroniziranih virih."</string>
<string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"pisanje naročenih virov"</string>
- <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"Programu omogoča spreminjanje trenutno sinhroniziranih virov. Zlonamerni programi lahko s tem spremenijo sinhronizirane vire."</string>
+ <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"Aplikaciji omogoča spreminjanje trenutno sinhroniziranih virov. Zlonamerne aplikacije lahko s tem spremenijo sinhronizirane vire."</string>
<string name="permlab_readDictionary" msgid="4107101525746035718">"branje izrazov, ki ste jih dodali v slovar"</string>
<string name="permdesc_readDictionary" msgid="659614600338904243">"Aplikaciji omogoča, da prebere vse besede, imena in besedne zveze, ki jih je uporabnik morda shranil v uporabniški slovar."</string>
<string name="permlab_writeDictionary" msgid="2183110402314441106">"dodajanje besed v uporabniški slovar"</string>
- <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Programu omogoča pisanje nove besede v uporabniški slovar."</string>
+ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Aplikaciji omogoča pisanje nove besede v uporabniški slovar."</string>
<string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"branje vsebine pomnilnika USB"</string>
<string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"branje vsebine kartice SD"</string>
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"Aplikaciji omogoča branje vsebine shrambe USB."</string>
@@ -705,15 +705,15 @@
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"spreminjanje ali brisanje vsebine shrambe USB"</string>
<string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"spreminjanje ali brisanje vsebine kartice SD"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Aplikaciji omogoča zapisovanje v pomnilnik USB."</string>
- <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Programu omogoča pisanje na kartico SD."</string>
+ <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Aplikaciji omogoča pisanje na kartico SD."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"spreminjanje/brisanje vsebine notranje shrambe nosilca podatkov"</string>
- <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"Programu omogoča spreminjanje vsebine notranje shrambe nosilca podatkov."</string>
+ <string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"Aplikaciji omogoča spreminjanje vsebine notranje shrambe nosilca podatkov."</string>
<string name="permlab_manageDocs" product="default" msgid="5778318598448849829">"upravljanje shranjevanja dokumentov"</string>
<string name="permdesc_manageDocs" product="default" msgid="8704323176914121484">"Aplikaciji omogoči upravljanje shranjevanja dokumentov."</string>
<string name="permlab_sdcardAccessAll" msgid="8150613823900460576">"dostop do zunanje naprave za shranjevanje za vse uporabnike"</string>
<string name="permdesc_sdcardAccessAll" msgid="3215208357415891320">"Aplikaciji omogoča dostop do zunanje naprave za shranjevanje za vse uporabnike."</string>
<string name="permlab_cache_filesystem" msgid="5656487264819669824">"dostop do datotečnega sistema predpomnilnika"</string>
- <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Programu omogoča branje in pisanje v datotečni sistem predpomnilnika."</string>
+ <string name="permdesc_cache_filesystem" msgid="5578967642265550955">"Aplikaciji omogoča branje in pisanje v datotečni sistem predpomnilnika."</string>
<string name="permlab_use_sip" msgid="2052499390128979920">"opravljanje/sprejemanje klicev SIP"</string>
<string name="permdesc_use_sip" msgid="2297804849860225257">"Aplikaciji omogoča opravljanje in sprejemanje klicev SIP."</string>
<string name="permlab_bind_incall_service" msgid="6773648341975287125">"interakcija z zaslonom pri klicu"</string>
@@ -723,11 +723,11 @@
<string name="permlab_control_incall_experience" msgid="9061024437607777619">"zagotavljanje uporabniške izkušnje med klicem"</string>
<string name="permdesc_control_incall_experience" msgid="915159066039828124">"Aplikaciji omogoča zagotavljanje uporabniške izkušnje med klicem."</string>
<string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"branje prejšnje uporabe omrežja"</string>
- <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Programu omogoča branje pretekle uporabe omrežja za določena omrežja in programe."</string>
+ <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Aplikaciji omogoča branje pretekle uporabe omrežja za določena omrežja in aplikacije."</string>
<string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"upravljanje pravilnika o omrežju"</string>
- <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Programu omogoča upravljanje pravilnikov o omrežju in določanje pravil za program."</string>
+ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Aplikaciji omogoča upravljanje pravilnikov o omrežju in določanje pravil za aplikacijo."</string>
<string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"spremeni obračunavanje uporabe omrežja"</string>
- <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Programu omogoča, da spremeni uporabo omrežja na podlagi programov. Ni za uporabo z navadnimi programi."</string>
+ <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Aplikaciji omogoča, da spremeni uporabo omrežja na podlagi aplikacij. Ni za uporabo z navadnimi aplikacijami."</string>
<string name="permlab_accessNotifications" msgid="7673416487873432268">"dostop do obvestil"</string>
<string name="permdesc_accessNotifications" msgid="458457742683431387">"Dovoli aplikaciji, da prenese, razišče in izbriše obvestila, tudi tista, ki so jih objavile druge aplikacije."</string>
<string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"poveži se s storitvijo poslušalca obvestil"</string>
@@ -765,7 +765,7 @@
<string name="policylab_expirePassword" msgid="885279151847254056">"Nastavitev poteka gesla za zaklepanje zaslona"</string>
<string name="policydesc_expirePassword" msgid="1729725226314691591">"Nadzor nad tem, kako pogosto je treba spremeniti geslo za zaklepanje zaslona."</string>
<string name="policylab_encryptedStorage" msgid="8901326199909132915">"Nastavitev šifriranja shrambe"</string>
- <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Shranjeni podatki programa morajo biti šifrirani."</string>
+ <string name="policydesc_encryptedStorage" msgid="2637732115325316992">"Shranjeni podatki aplikacije morajo biti šifrirani."</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"Onemogoči fotoaparate"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"Prepreči uporabo vseh fotoaparatov v napravi."</string>
<string name="policylab_disableKeyguardFeatures" msgid="266329104542638802">"Onemogočanje funkcij tipkov."</string>
@@ -1018,23 +1018,23 @@
<string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Aplikaciji omogoča spreminjanje zgodovine ali zaznamkov brskalnika v tabličnem računalniku. S tem lahko aplikacija izbriše ali spremeni podatke v brskalniku. Opomba: Tega dovoljenja ne morejo uveljavljati drugi brskalniki ali aplikacije, s katerimi je mogoče brskati po spletu."</string>
<string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"Aplikaciji omogoča spreminjanje zgodovine ali zaznamkov brskalnika v telefonu. S tem lahko aplikacija izbriše ali spremeni podatke v brskalniku. Opomba: Tega dovoljenja ne morejo uveljavljati drugi brskalniki ali aplikacije, s katerimi je mogoče brskati po spletu."</string>
<string name="permlab_setAlarm" msgid="1379294556362091814">"nastavitev alarma"</string>
- <string name="permdesc_setAlarm" msgid="316392039157473848">"Programu omogoča nastavitev alarma v nameščenem programu budilke. Nekateri programi budilke morda nimajo te funkcije."</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"Aplikaciji omogoča nastavitev alarma v nameščeni aplikaciji budilke. Nekatere aplikacije budilke morda nimajo te funkcije."</string>
<string name="permlab_writeVoicemail" msgid="7309899891683938100">"snemanje sporočil v odzivniku"</string>
<string name="permdesc_writeVoicemail" msgid="6592572839715924830">"Aplikaciji omogoča spreminjanje in odstranjevanje sporočil iz odzivnika."</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"dodajanje odzivnika"</string>
- <string name="permdesc_addVoicemail" msgid="6604508651428252437">"Programu omogoča dodajanje sporočil prejetim sporočilom odzivnika."</string>
+ <string name="permdesc_addVoicemail" msgid="6604508651428252437">"Aplikaciji omogoča dodajanje sporočil prejetim sporočilom odzivnika."</string>
<string name="permlab_readVoicemail" msgid="8415201752589140137">"branje sporočil v odzivniku"</string>
<string name="permdesc_readVoicemail" msgid="8926534735321616550">"Aplikaciji omogoča branje sporočil v odzivniku."</string>
<string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"Spreminjanje dovoljenj za geolokacijo brskalnika"</string>
- <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Programu omogoča spreminjanje geolokacijskih dovoljenj v brskalniku. Zlonamerni programi lahko to izkoristijo za pošiljanje podatkov o lokaciji poljubnim spletnim mestom."</string>
+ <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Aplikaciji omogoča spreminjanje geolokacijskih dovoljenj v brskalniku. Zlonamerne aplikacije lahko to izkoristijo za pošiljanje podatkov o lokaciji poljubnim spletnim mestom."</string>
<string name="permlab_packageVerificationAgent" msgid="5568139100645829117">"preveri pakete"</string>
- <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"Programu omogoča, da preveri, ali je paket mogoče namestiti."</string>
+ <string name="permdesc_packageVerificationAgent" msgid="8437590190990843381">"Aplikaciji omogoča, da preveri, ali je paket mogoče namestiti."</string>
<string name="permlab_bindPackageVerifier" msgid="4187786793360326654">"poveži s preverjanjem paketov"</string>
- <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"Imetniku omogoča zahtevanje preverjanja paketov. Tega nikoli ni treba uporabiti za navadne programe."</string>
+ <string name="permdesc_bindPackageVerifier" msgid="3180741773233862126">"Imetniku omogoča zahtevanje preverjanja paketov. Tega nikoli ni treba uporabiti za navadne aplikacije."</string>
<string name="permlab_serialPort" msgid="546083327654631076">"dostop do serijskih vrat"</string>
<string name="permdesc_serialPort" msgid="2991639985224598193">"Imetniku omogoča, da z API-jem za SerialManager dostopa do serijskih vrat."</string>
<string name="permlab_accessContentProvidersExternally" msgid="5077774297943409285">"zunanji dostop do ponudnikov vsebine"</string>
- <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"Omogoča imetniku, da dostopa do ponudnikov vsebine iz lupine. Nikoli naj ne bi bilo potrebno za običajne programe"</string>
+ <string name="permdesc_accessContentProvidersExternally" msgid="4544346486697853685">"Omogoča imetniku, da dostopa do ponudnikov vsebine iz lupine. Nikoli naj ne bi bilo potrebno za običajne aplikacije."</string>
<string name="permlab_updateLock" msgid="3527558366616680889">"odvrnitev samodejnih posodobitev naprave"</string>
<string name="permdesc_updateLock" msgid="1655625832166778492">"Dovoli, da lastnik sistemu ponudi informacije o tem, kdaj je primeren čas za neinteraktiven vnovični zagon, s katerim nadgradi napravo."</string>
<string name="save_password_message" msgid="767344687139195790">"Ali želite, da si brskalnik zapomni to geslo?"</string>
@@ -1204,42 +1204,42 @@
<string name="whichHomeApplicationNamed" msgid="4493438593214760979">"Uporaba aplikacije %1$s na začetnem zaslonu"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Privzeta uporaba za to dejanje."</string>
<string name="use_a_different_app" msgid="8134926230585710243">"Uporaba druge aplikacije"</string>
- <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Izbrišite privzeti program v sistemskih nastavitvah > Programi > Preneseno."</string>
+ <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Izbrišite privzet aplikacijo v sistemskih nastavitvah > Aplikacije > Preneseno."</string>
<string name="chooseActivity" msgid="7486876147751803333">"Izberite dejanje"</string>
- <string name="chooseUsbActivity" msgid="6894748416073583509">"Izberite program za napravo USB"</string>
- <string name="noApplications" msgid="2991814273936504689">"Tega dejanja ne more izvesti noben program."</string>
+ <string name="chooseUsbActivity" msgid="6894748416073583509">"Izberite aplikacijo za napravo USB"</string>
+ <string name="noApplications" msgid="2991814273936504689">"Tega dejanja ne more izvesti nobena aplikacija."</string>
<string name="aerr_title" msgid="1905800560317137752"></string>
- <string name="aerr_application" msgid="932628488013092776">"Žal se je program <xliff:g id="APPLICATION">%1$s</xliff:g> ustavil."</string>
+ <string name="aerr_application" msgid="932628488013092776">"Žal se je aplikacija <xliff:g id="APPLICATION">%1$s</xliff:g> ustavila."</string>
<string name="aerr_process" msgid="4507058997035697579">"Žal se je postopek <xliff:g id="PROCESS">%1$s</xliff:g> ustavil."</string>
<string name="anr_title" msgid="4351948481459135709"></string>
- <string name="anr_activity_application" msgid="1904477189057199066">"Program <xliff:g id="APPLICATION">%2$s</xliff:g> se ne odziva.\n\nAli ga želite zapreti?"</string>
+ <string name="anr_activity_application" msgid="1904477189057199066">"Aplikacija <xliff:g id="APPLICATION">%2$s</xliff:g> se ne odziva.\n\nAli jo želite zapreti?"</string>
<string name="anr_activity_process" msgid="5776209883299089767">"Dejavnost <xliff:g id="ACTIVITY">%1$s</xliff:g> se ne odziva.\n\nAli jo želite zapreti?"</string>
- <string name="anr_application_process" msgid="8941757607340481057">"Program <xliff:g id="APPLICATION">%1$s</xliff:g> se ne odziva. Ali ga želite zapreti?"</string>
+ <string name="anr_application_process" msgid="8941757607340481057">"Aplikacija <xliff:g id="APPLICATION">%1$s</xliff:g> se ne odziva. Ali jo želite zapreti?"</string>
<string name="anr_process" msgid="6513209874880517125">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> se ne odziva.\n\nAli ga želite zapreti?"</string>
<string name="force_close" msgid="8346072094521265605">"V redu"</string>
<string name="report" msgid="4060218260984795706">"Poročaj"</string>
<string name="wait" msgid="7147118217226317732">"Čakaj"</string>
<string name="webpage_unresponsive" msgid="3272758351138122503">"Stran se ne odziva.\n \nAli jo želite zapreti?"</string>
- <string name="launch_warning_title" msgid="1547997780506713581">"Program preusmerjen"</string>
+ <string name="launch_warning_title" msgid="1547997780506713581">"Aplikacija preusmerjena"</string>
<string name="launch_warning_replace" msgid="6202498949970281412">"<xliff:g id="APP_NAME">%1$s</xliff:g> se izvaja."</string>
- <string name="launch_warning_original" msgid="188102023021668683">"Prvotno je bil zagnan program <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
+ <string name="launch_warning_original" msgid="188102023021668683">"Prvotno je bila zagnana aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="screen_compat_mode_scale" msgid="3202955667675944499">"Lestvica"</string>
<string name="screen_compat_mode_show" msgid="4013878876486655892">"Vedno pokaži"</string>
- <string name="screen_compat_mode_hint" msgid="1064524084543304459">"Znova omogočite to v sistemskih nastavitvah > Programi > Preneseno."</string>
- <string name="smv_application" msgid="3307209192155442829">"Program <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) krši svoj samouveljavljiv pravilnik o strogem načinu."</string>
+ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"Znova omogočite to v sistemskih nastavitvah > Aplikacije > Preneseno."</string>
+ <string name="smv_application" msgid="3307209192155442829">"Aplikacija <xliff:g id="APPLICATION">%1$s</xliff:g> (proces <xliff:g id="PROCESS">%2$s</xliff:g>) krši svoj samouveljavljiv pravilnik o strogem načinu."</string>
<string name="smv_process" msgid="5120397012047462446">"Proces <xliff:g id="PROCESS">%1$s</xliff:g> krši svoj samoizvedljivi pravilnik o strogem načinu."</string>
<string name="android_upgrading_title" msgid="1584192285441405746">"Poteka nadgradnja Androida ..."</string>
- <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimiranje programa <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
- <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Zagon programov."</string>
+ <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimiranje aplikacije <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string>
+ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Zagon aplikacij."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Dokončevanje zagona."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> se izvaja"</string>
- <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"Dotaknite se, da preklopite na program"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Želite preklopiti programe?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Preden zaženete nov program, ustavite izvajanega."</string>
+ <string name="heavy_weight_notification_detail" msgid="1721681741617898865">"Dotaknite se, da preklopite na aplikacijo"</string>
+ <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Želite preklopiti aplikacije?"</string>
+ <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Preden zaženete novo aplikacijo, ustavite izvajano."</string>
<string name="old_app_action" msgid="493129172238566282">"Vrni se na <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Ne zaženite novega programa."</string>
+ <string name="old_app_description" msgid="2082094275580358049">"Ne zaženite nove aplikacije."</string>
<string name="new_app_action" msgid="5472756926945440706">"Začni <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Ustavi prejšnji program brez shranjevanja."</string>
+ <string name="new_app_description" msgid="1932143598371537340">"Ustavi prejšnjo aplikacijo brez shranjevanja."</string>
<string name="sendText" msgid="5209874571959469142">"Izberite dejanje za besedilo"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Glasnost zvonjenja"</string>
<string name="volume_music" msgid="5421651157138628171">"Glasnost predstavnosti"</string>
@@ -1334,7 +1334,7 @@
<string name="usb_storage_stop_button_mount" msgid="7060218034900696029">"Izklopi shrambo USB"</string>
<string name="usb_storage_stop_error_message" msgid="1970374898263063836">"Težava pri izklopu pomnilnika USB. Preverite, ali ste izpeli gostitelja USB, nato poskusite znova."</string>
<string name="dlg_confirm_kill_storage_users_title" msgid="963039033470478697">"Vklop shrambe USB"</string>
- <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"Če vklopite pomnilnik USB, se bodo nekateri programi, ki jih uporabljate, ustavili in ne bodo na voljo, dokler ne izklopite pomnilnika USB."</string>
+ <string name="dlg_confirm_kill_storage_users_text" msgid="5100428757107469454">"Če vklopite pomnilnik USB, se bodo nekatere aplikacije, ki jih uporabljate, ustavile in ne bodo na voljo, dokler ne izklopite pomnilnika USB."</string>
<string name="dlg_error_title" msgid="7323658469626514207">"Operacija v pomnilniku USB ni uspela"</string>
<string name="dlg_ok" msgid="7376953167039865701">"V redu"</string>
<string name="usb_mtp_notification_title" msgid="3699913097391550394">"Povezan kot predstavnostna naprava"</string>
@@ -1383,9 +1383,9 @@
<string name="ext_media_nomedia_notification_message" product="default" msgid="3870120652983659641">"Kartica SD je odstranjena. Vstavite novo."</string>
<string name="activity_list_empty" msgid="1675388330786841066">"Ni ustreznih dejavnosti."</string>
<string name="permlab_pkgUsageStats" msgid="8787352074326748892">"posodobitev statističnih podatkov uporabe komponent"</string>
- <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"Programu omogoča spreminjanje zbranih statističnih podatkov uporabe komponent. Ni za uporabo z navadnimi programi."</string>
+ <string name="permdesc_pkgUsageStats" msgid="1106612424254277630">"Aplikaciji omogoča spreminjanje zbranih statističnih podatkov uporabe komponent. Ni za uporabo z navadnimi aplikacijami."</string>
<string name="permlab_copyProtectedData" msgid="4341036311211406692">"kopiranje vsebine"</string>
- <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"Programu omogoča pozivanje privzete storitve vsebnika, da kopira vsebino. Ni za uporabo z navadnimi programi."</string>
+ <string name="permdesc_copyProtectedData" msgid="4390697124288317831">"Aplikaciji omogoča pozivanje privzete storitve vsebnika, da kopira vsebino. Ni za uporabo z navadnimi aplikacijami."</string>
<string name="permlab_route_media_output" msgid="1642024455750414694">"Preusmeritev predstavnosti"</string>
<string name="permdesc_route_media_output" msgid="4932818749547244346">"Aplikaciji omogoča preusmerjanje predstavnosti v druge zunanje naprave."</string>
<string name="permlab_access_keyguard_secure_storage" msgid="7565552237977815047">"Dostop do varne shrambe Keyguard."</string>
@@ -1417,7 +1417,7 @@
<string name="ime_action_default" msgid="2840921885558045721">"Izvedi"</string>
<string name="dial_number_using" msgid="5789176425167573586">"Pokliči številko\ns številko <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Ustvari stik\ns številko <xliff:g id="NUMBER">%s</xliff:g>"</string>
- <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"Ti programi zahtevajo dovoljenje za dostop do računa zdaj in v prihodnje."</string>
+ <string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"Te aplikacije zahtevajo dovoljenje za dostop do računa zdaj in v prihodnje."</string>
<string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Ali želite to zahtevo dovoliti?"</string>
<string name="grant_permissions_header_text" msgid="6874497408201826708">"Zahteva za dostop"</string>
<string name="allow" msgid="7225948811296386551">"Dovoli"</string>
@@ -1434,7 +1434,7 @@
<string name="notification_listener_binding_label" msgid="2014162835481906429">"Poslušalec obvestil"</string>
<string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Ponudnik pogojev"</string>
<string name="vpn_title" msgid="19615213552042827">"VPN aktiviran"</string>
- <string name="vpn_title_long" msgid="6400714798049252294">"VPN je aktiviral program <xliff:g id="APP">%s</xliff:g>"</string>
+ <string name="vpn_title_long" msgid="6400714798049252294">"VPN je aktivirala aplikacija <xliff:g id="APP">%s</xliff:g>"</string>
<string name="vpn_text" msgid="3011306607126450322">"Dotaknite se, če želite upravljati omrežje."</string>
<string name="vpn_text_long" msgid="6407351006249174473">"Vzpostavljena povezava s sejo <xliff:g id="SESSION">%s</xliff:g>. Dotaknite se, če želite upravljati omrežje."</string>
<string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Povezovanje v stalno vklopljeno navidezno zasebno omrežje ..."</string>
@@ -1513,10 +1513,10 @@
<string name="keyboardview_keycode_mode_change" msgid="4547387741906537519">"Sprememba načina"</string>
<string name="keyboardview_keycode_shift" msgid="2270748814315147690">"Tipka Shift"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Tipka Enter"</string>
- <string name="activitychooserview_choose_application" msgid="2125168057199941199">"Izberite program"</string>
+ <string name="activitychooserview_choose_application" msgid="2125168057199941199">"Izberite aplikacijo"</string>
<string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Aplikacije <xliff:g id="APPLICATION_NAME">%s</xliff:g> ni bilo mogoče zagnati"</string>
<string name="shareactionprovider_share_with" msgid="806688056141131819">"Delite z"</string>
- <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Delite s programom <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
+ <string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Delite z aplikacijo <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Drsna ročica. Dotaknite se in pridržite."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Povlecite, če želite odkleniti."</string>
<string name="keyboard_headset_required_to_hear_password" msgid="7011927352267668657">"Priključite slušalke, če želite slišati izgovorjene tipke gesla."</string>
@@ -1757,12 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"Izbrano: <xliff:g id="ITEM">%1$s</xliff:g>"</string>
<string name="deleted_key" msgid="7659477886625566590">"Številka <xliff:g id="KEY">%1$s</xliff:g> je izbrisana"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> za delo"</string>
- <string name="lock_to_app_toast" msgid="7570091317001980053">"Če želite odpeti ta zaslon, se hkrati dotaknite tipk za nazaj in za pregled ter ju pridržite."</string>
- <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Če želite odpeti ta zaslon, se dotaknite tipke za pregled in jo pridržite."</string>
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Če želite odpeti ta zaslon, se hkrati dotaknite tipk Nazaj in Pregled ter ju pridržite."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Če želite odpeti ta zaslon, se dotaknite tipke Pregled in jo pridržite."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Zaslon je pripet. Vaša organizacija ne dovoli odpenjanja."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Želite uporabljati pripenjanje zaslona?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Pripenjanje zaslonov zaklene zaslon v enojnem pogledu.\n\nČe ga želite odpeti, se hkrati dotaknite tipk za nazaj in za pregled ter ju pridržite."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Pripenjanje zaslonov zaklene zaslon v enojnem pogledu.\n\nČe ga želite odpeti, se dotaknite tipke za pregled in jo pridržite."</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Pripenjanje zaslonov zaklene zaslon v enojnem pogledu.\n\nČe ga želite odpeti, se hkrati dotaknite tipk Nazaj in Pregled ter ju pridržite."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Pripenjanje zaslonov zaklene zaslon v enojnem pogledu.\n\nČe ga želite odpeti, se dotaknite tipke Pregled in jo pridržite."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"NE, HVALA"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"ZAŽENI"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Zaslon je pripet"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index fe19510..de0f5b1 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"измена ваше контакт картице"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Дозвољава апликацији да мења или додаје нове личне информације о профилу ускладиштене на уређају, као што су име и контакт информације. То значи да апликација може да вас идентификује и шаље другима информације о профилу."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"телесни сензори (нпр. срчани монитор)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Дозвољава апликацији да приступа подацима сензора које користите за мерење телесних функција, као што је срчани пулс."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Дозвољава апликацији да приступа подацима са сензора који надгледају физичку кондицију, као што је број откуцаја срца."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"читање друштвеног стрима"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Дозвољава апликацији да приступа вашим друштвеним ажурирањима и друштвеним ажурирањима пријатеља и да их синхронизује. Будите опрезни када делите информације – ово омогућава апликацији да чита преписке између вас и пријатеља на друштвеним мрежама, без обзира на поверљивост. Напомена: Ова дозвола се можда не примењује на све друштвене мреже."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"писање у друштвени стрим"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 14a00a4..d39a722 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"ändra ditt eget kontaktkort"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Tillåter att appen ändrar eller lägger till personliga profiluppgifter som sparats på din enhet, till exempel ditt namn och dina kontaktuppgifter. Det innebär att appen kan identifiera dig och skicka profiluppgifter till andra."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"kroppssens. (för hjärtat m.m.)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Tillåter att appen får åtkomst till data från sensorer som används för att mäta vad som sker inuti kroppen, till exempel hjärtfrekvens."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Ger appen åtkomst till information från sensorer om ditt fysiska tillstånd, till exempel din puls."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"läs mitt sociala flöde"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Tillåter att appen kommer åt och synkroniserar sociala uppdateringar från dig och dina vänner. Var försiktig när du delar information – med den här behörigheten tillåts appen att läsa kommunikation mellan dig och dina vänner på sociala nätverk oavsett sekretessnivå. Observera att den här behörigheten kanske inte är tillämplig på alla sociala nätverk."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"skriv till mitt sociala flöde"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 727e6b5..00a45b4 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"rekebisha kadi yako mwenyewe ya mawasiliano"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Inaruhusu programu kubadilisha au kuongeza taarifa ya maelezo mafupi ya kibinafsi yaliyohifadhiwa kwenye kifaa chako, kama vile jina lako na taarifa ya anwani. Hii inamaanisha kuwa programu inaweza kukutambua na inaweza kutuma taarifa ya maelezo yako mafupi kwa wengine."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"vipima hali ya mwili (kama mpigo wa moyo)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Huruhusu programu kufikia data kutoka kwenye vipima mawimbi unavyotumia kupima kinachoendelea mwilini mwako kama vile mpigo wa moyo."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Huruhusu programu kufikia data kutoka vihisi vinavyofuatilia hali yako ya kimwili, kama vile mapigo ya moyo."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"soma mipasho yako wa kijamii"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Huruhusu programu kufikia na kupatanisha masasisho ya kijamii kutoka kwa marafiki zako. Kuwa makini wakati unashiriki taarifa -- hii huruhusu programu kusoma mawasiliano kati yako na marafiki zako kwenye mitandao jamii, bila kujali usiri. Kumbuka: idhini hii haiwezi kutekelezwa kwenye mitandao yote ya jamii."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"kuandikia mipasho yako wa kijamii"</string>
diff --git a/core/res/res/values-sw600dp/bools.xml b/core/res/res/values-sw600dp/bools.xml
index ddc48c5..00f45c1 100644
--- a/core/res/res/values-sw600dp/bools.xml
+++ b/core/res/res/values-sw600dp/bools.xml
@@ -19,7 +19,6 @@
<bool name="show_ongoing_ime_switcher">true</bool>
<bool name="kg_share_status_area">false</bool>
<bool name="kg_sim_puk_account_full_screen">false</bool>
- <bool name="kg_show_ime_at_screen_on">false</bool>
<!-- No camera for you, tablet user -->
<bool name="kg_enable_camera_default_widget">false</bool>
<bool name="kg_center_small_widgets_vertically">true</bool>
diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml
index 76762f7..821de0c 100644
--- a/core/res/res/values-ta-rIN/strings.xml
+++ b/core/res/res/values-ta-rIN/strings.xml
@@ -297,7 +297,7 @@
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"உரைச் செய்திகளைப் (WAP) பெறுதல்"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP செய்திகளைப் பெற, செயற்படுத்தப் பயன்பாட்டை அனுமதிக்கிறது. உங்களுக்கு அனுப்பப்படும் செய்திகளை உங்களுக்குக் காட்டாமல் கண்காணிக்க அல்லது நீக்குவதற்கான திறன் இந்த அனுமதியில் உள்ளடங்கும்."</string>
<string name="permlab_receiveBluetoothMap" msgid="7593811487142360528">"Bluetooth செய்திகளைப் (MAP) பெறுதல்"</string>
- <string name="permdesc_receiveBluetoothMap" msgid="8656755936919466345">"Bluetooth MAP செய்திகளைப் பெற மற்றும் செயல்படுத்த பயன்பாட்டை அனுமதிக்கிறது. அதாவது பயன்பாட்டால் சாதனத்திற்கு அனுப்பப்பட்ட செய்திகளை, உங்களிடம் காட்டாமலே கண்காணிக்கவோ, நீக்கவோ முடியும்."</string>
+ <string name="permdesc_receiveBluetoothMap" msgid="8656755936919466345">"Bluetooth MAP செய்திகளைப் பெற மற்றும் செயல்படுத்த பயன்பாட்டை அனுமதிக்கிறது. அதாவது பயன்பாட்டால் சாதனத்திற்கு அனுப்பிய செய்திகளை, உங்களிடம் காட்டாமலே கண்காணிக்கவோ, நீக்கவோ முடியும்."</string>
<string name="permlab_getTasks" msgid="6466095396623933906">"இயங்கும் பயன்பாடுகளை மீட்டெடுத்தல்"</string>
<string name="permdesc_getTasks" msgid="7454215995847658102">"நடப்பில் மற்றும் சமீபத்தில் இயங்கும் காரியங்களின் தகவலைப் பெற பயன்பாட்டை அனுமதிக்கிறது. சாதனத்தில் எந்தப் பயன்பாடுகள் பயன்படுத்தப்படுகின்றன என்பது குறித்த தகவலைக் கண்டறிய பயன்பாட்டை இது அனுமதிக்கலாம்."</string>
<string name="permlab_startTasksFromRecents" msgid="8990073877885690623">"சமீபத்தியவற்றிலிருந்து செயலைத் தொடங்கு"</string>
@@ -354,10 +354,10 @@
<string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"முறைமை செயல்பாடுகளை எப்படித் துவக்குகிறது என்பதைக் கண்காணிக்க மற்றும் கட்டுப்படுத்த, பயன்பாட்டை அனுமதிக்கிறது. தீங்குவிளைவிக்கும் பயன்பாடுகள் முறைமையுடன் முழுவதுமாக இணங்கலாம். இந்த அனுமதி மேம்பாட்டிற்காக மட்டுமே தேவைப்படும், வழக்கமான பயன்பாட்டிற்காக எப்போதும் தேவைப்படாது."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"தொகுப்பு அகற்றப்பட்ட வலைபரப்பை அனுப்புதல்"</string>
<string name="permdesc_broadcastPackageRemoved" msgid="6621901216207931089">"பயன்பாட்டு தொகுப்பில் அகற்றப்பட்ட அறிவிப்பை அனுப்ப, பயன்பாட்டை அனுமதிக்கிறது. தீங்கு விளைவிக்கும் பயன்பாடுகள் இயங்கிக்கொண்டிருக்கும் பிற பயன்பாட்டை முடக்குவதற்கு இதைப் பயன்படுத்தலாம்."</string>
- <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS பெறப்பட்ட வலைபரப்பை அனுப்புதல்"</string>
- <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"SMS செய்தி பெறப்பட்ட அறிவிப்பை அனுப்ப, பயன்பாட்டை அனுமதிக்கிறது. உள்வரும் SMS செய்திகளைப் போலியாக்கம் செய்ய, தீங்குவிளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்."</string>
- <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH பெறப்பட்ட வலைபரப்பை அனுப்புதல்"</string>
- <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"WAP PUSH செய்தி பெறப்பட்ட அறிவிப்பை அனுப்ப, பயன்பாட்டை அனுமதிக்கிறது. உள்வரும் SMS செய்திகளைப் போலியாக்கம் செய்ய அல்லது இணையப்பக்கத்தின் எந்தவொரு உள்ளடக்கத்தையும் தீங்குவிளைவிக்கும் உள்ளடக்கத்துடன் எந்தவித தகவலும் இல்லாமல் மாற்றியமைக்க, தீங்குவிளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்."</string>
+ <string name="permlab_broadcastSmsReceived" msgid="5689095009030336593">"SMS பெற்ற வலைபரப்பை அனுப்புதல்"</string>
+ <string name="permdesc_broadcastSmsReceived" msgid="4152037720034365492">"SMS செய்தி பெற்ற அறிவிப்பை அனுப்ப, பயன்பாட்டை அனுமதிக்கிறது. உள்வரும் SMS செய்திகளைப் போலியாக்கம் செய்ய, தீங்குவிளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்."</string>
+ <string name="permlab_broadcastWapPush" msgid="3145347413028582371">"WAP-PUSH பெற்ற வலைபரப்பை அனுப்புதல்"</string>
+ <string name="permdesc_broadcastWapPush" msgid="4783402525039442729">"WAP PUSH செய்தி பெற்ற அறிவிப்பை அனுப்ப, பயன்பாட்டை அனுமதிக்கிறது. உள்வரும் SMS செய்திகளைப் போலியாக்கம் செய்ய அல்லது இணையப்பக்கத்தின் எந்தவொரு உள்ளடக்கத்தையும் தீங்குவிளைவிக்கும் உள்ளடக்கத்துடன் எந்தவித தகவலும் இல்லாமல் மாற்றியமைக்க, தீங்குவிளைவிக்கும் பயன்பாடுகள் இதைப் பயன்படுத்தலாம்."</string>
<string name="permlab_setProcessLimit" msgid="2451873664363662666">"செயலில் இருக்கும் செயல்முறைகளின் எண்ணிக்கையைக் கட்டுப்படுத்துதல்"</string>
<string name="permdesc_setProcessLimit" msgid="7318061314040879542">"இயங்கும் செயல்பாடுகளின் அதிகபட்ச எண்ணிக்கையைக் கட்டுப்படுத்த, பயன்பாட்டை அனுமதிக்கிறது. சாதாரண பயன்பாடுகளுக்குத் தேவைப்படாது."</string>
<string name="permlab_setAlwaysFinish" msgid="550958507798796965">"பின்புலப் பயன்பாடுகளை மூட வலியுறுத்துதல்"</string>
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"உங்கள் சொந்த தொடர்பு அட்டையை மாற்றுதல்"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"உங்கள் சாதனத்தில் சேமிக்கப்பட்ட உங்கள் பெயர் மற்றும் தொடர்பு தகவல் போன்ற தனிப்பட்ட சுயவிவரத் தகவலை மாற்ற அல்லது சேர்க்க பயன்பாட்டை அனுமதிக்கிறது. அதாவது பயன்பாடு உங்களை அடையாளப்படுத்தலாம், உங்கள் சுயவிவரத் தகவலை மற்றவர்களுக்கு அனுப்பலாம்."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"உடல் உணர்விகள் (இதயத்துடிப்பு கண்காணித்தல் போன்றவை)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"இதயத் துடிப்பு போன்று உங்கள் உடலில் நிகழும் மாற்றங்களை அளவிட, நீங்கள் பயன்படுத்தும் உணர்விகளிடமிருந்து தரவை அணுக, பயன்பாட்டை அனுமதிக்கிறது."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"உங்கள் இதயத்துடிப்பு விகிதம் போன்ற உங்கள் உடல்நிலையைக் கண்காணிக்கும் உணர்விகளில் இருந்து தரவை அணுக பயன்பாடுகளை அனுமதிக்கும்."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"எனது சமூக ஸ்ட்ரீமைப் படித்தல்"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"உங்களிடமிருந்தும், உங்கள் நண்பர்களிடமிருந்தும் வரும் சமூகப் புதுப்பிப்புகளை அணுகி ஒத்திசைக்கப் பயன்பாட்டை அனுமதிக்கிறது. தகவலைப் பகிரும்போது எச்சரிக்கையாக இருக்கவும் -- ரகசியத்தன்மையைப் பொருட்படுத்தாமல், சமூக நெட்வொர்க்குகளில் உங்களுக்கும், உங்கள் நண்பர்களுக்கிடையேயும் உள்ள தொடர்புகளைப் படிக்க பயன்பாட்டை அனுமதிக்கிறது. குறிப்பு: இந்த அனுமதி எல்லா சமூக நெட்வொர்க்குகளிலும் செயல்படுத்தப்படாமல் இருக்கலாம்."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"உங்கள் சமூக ஸ்ட்ரீமில் எழுதுக"</string>
@@ -658,8 +658,8 @@
<string name="permlab_changeWifiState" msgid="6550641188749128035">"வைஃபை உடன் இணைக்கவும் மற்றும் அதனுடனான தொடர்பைத் துண்டித்தல்"</string>
<string name="permdesc_changeWifiState" msgid="7137950297386127533">"வைஃபை ஆக்சஸ் பாயிண்ட்களில் இணைக்கவும், அவற்றிலிருந்து துண்டிக்கவும் மற்றும் வைஃபை நெட்வொர்க்குகளுக்கான சாதன உள்ளமைவில் மாற்றங்களைச் செய்யவும் பயன்பாட்டை அனுமதிக்கிறது."</string>
<string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"வைஃபை பலமுகவரி பெறுதலை இயக்குதல்"</string>
- <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"உங்கள் டேப்லெட் மட்டுமல்லாமல், பலமுகவரி பயன்முறையின் முகவரிகளைப் பயன்படுத்தி வைஃபை நெட்வொர்க்கில் எல்லா சாதனங்களுக்கும் அனுப்பப்பட்ட தொகுப்பைப் பெற பயன்பாட்டை அனுமதிக்கிறது. பலமுகவரியற்ற பயன்முறையை விட இது அதிகமான சக்தியைப் பயன்படுத்துகிறது."</string>
- <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"உங்கள் மொபைல் மட்டுமல்லாமல், பலமுகவரி பயன்முறையின் முகவரிகளைப் பயன்படுத்தி வைஃபை நெட்வொர்க்கில் எல்லா சாதனங்களுக்கும் அனுப்பப்பட்ட தொகுப்பைப் பெற பயன்பாட்டை அனுமதிக்கிறது. பலமுகவரியற்ற பயன்முறையை விட இது அதிகமான சக்தியைப் பயன்படுத்துகிறது."</string>
+ <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"உங்கள் டேப்லெட் மட்டுமல்லாமல், பலமுகவரி பயன்முறையின் முகவரிகளைப் பயன்படுத்தி வைஃபை நெட்வொர்க்கில் எல்லா சாதனங்களுக்கும் அனுப்பிய தொகுப்பைப் பெற பயன்பாட்டை அனுமதிக்கிறது. பலமுகவரியற்ற பயன்முறையை விட இது அதிகமான சக்தியைப் பயன்படுத்துகிறது."</string>
+ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"உங்கள் மொபைல் மட்டுமல்லாமல், பலமுகவரி பயன்முறையின் முகவரிகளைப் பயன்படுத்தி வைஃபை நெட்வொர்க்கில் எல்லா சாதனங்களுக்கும் அனுப்பிய தொகுப்பைப் பெற பயன்பாட்டை அனுமதிக்கிறது. பலமுகவரியற்ற பயன்முறையை விட இது அதிகமான சக்தியைப் பயன்படுத்துகிறது."</string>
<string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"புளூடூத் அமைப்புகளை அணுகுதல்"</string>
<string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"டேப்லெட்டில் அக புளூடூத் ஐ உள்ளமைக்க, தொலைநிலை சாதனங்களைக் கண்டறிந்து இணைக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
<string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"மொபைலில் அக புளூடூத் ஐ உள்ளமைக்க, தொலைநிலை சாதனங்களைக் கண்டறிந்து இணைக்க, பயன்பாட்டை அனுமதிக்கிறது."</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> தேர்ந்தெடுக்கப்பட்டது"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> நீக்கப்பட்டது"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"பணியிடம் <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"இந்தத் திரையை விலக்க, பின் மற்றும் மேலோட்டப் பார்வையை ஒரே நேரத்தில் தொட்டுப் பிடித்திருக்கவும்."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"இந்தத் திரையை விலக்க, மேலோட்டப் பார்வையைத் தொட்டுப் பிடித்திருக்கவும்."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"திரை பின் செய்யப்பட்டது. பின்னை அகற்ற உங்கள் நிறுவனம் ஆதரிக்கவில்லை."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"திரையை பின் செய்தலைப் பயன்படுத்தவா?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"திரை பொருத்துதல், ஒரே காட்சியில் தோன்றுமாறு திரையைப் பூட்டும்.\n\nஅதை விலக்க, பின் மற்றும் மேலோட்டப் பார்வையை ஒரே நேரத்தில் தொட்டுப் பிடித்திருக்கவும்."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"திரை பொருத்துதல், ஒரே காட்சியில் தோன்றுமாறு திரையைப் பூட்டும்.\n\nஅதை விலக்க, மேலோட்டப் பார்வையைத் தொட்டுப் பிடித்திருக்கவும்."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"வேண்டாம், நன்றி"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"தொடங்கு"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"திரை பின் செய்யப்பட்டது"</string>
diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml
index 05217cf..ea1260f 100644
--- a/core/res/res/values-te-rIN/strings.xml
+++ b/core/res/res/values-te-rIN/strings.xml
@@ -54,17 +54,17 @@
<string name="serviceErased" msgid="1288584695297200972">"ఎరేజ్ చేయడం విజయవంతమైంది."</string>
<string name="passwordIncorrect" msgid="7612208839450128715">"చెల్లని పాస్వర్డ్."</string>
<string name="mmiComplete" msgid="8232527495411698359">"MMI పూర్తయింది."</string>
- <string name="badPin" msgid="9015277645546710014">"మీరు టైప్ చేసిన పాత PIN చెల్లదు."</string>
+ <string name="badPin" msgid="9015277645546710014">"మీరు టైప్ చేసిన పాత పిన్ చెల్లదు."</string>
<string name="badPuk" msgid="5487257647081132201">"మీరు టైప్ చేసిన PUK చెల్లదు."</string>
<string name="mismatchPin" msgid="609379054496863419">"మీరు టైప్ చేసిన PINలు సరిపోలలేదు."</string>
- <string name="invalidPin" msgid="3850018445187475377">"4 నుండి 8 సంఖ్యలు ఉండే PINను టైప్ చేయండి."</string>
+ <string name="invalidPin" msgid="3850018445187475377">"4 నుండి 8 సంఖ్యలు ఉండే పిన్ను టైప్ చేయండి."</string>
<string name="invalidPuk" msgid="8761456210898036513">"8 సంఖ్యలు లేదా అంతకంటే పొడవు ఉండే PUKని టైప్ చేయండి."</string>
- <string name="needPuk" msgid="919668385956251611">"మీ SIM కార్డు PUK-లాక్ చేయబడింది. దీన్ని అన్లాక్ చేయడానికి PUK కోడ్ను టైప్ చేయండి."</string>
- <string name="needPuk2" msgid="4526033371987193070">"SIM కార్డును అన్బ్లాక్ చేయడానికి PUK2ని టైప్ చేయండి."</string>
- <string name="enablePin" msgid="209412020907207950">"వైఫల్యం, SIM/RUIM లాక్ను ప్రారంభించండి."</string>
+ <string name="needPuk" msgid="919668385956251611">"మీ సిమ్ కార్డు PUK-లాక్ చేయబడింది. దీన్ని అన్లాక్ చేయడానికి PUK కోడ్ను టైప్ చేయండి."</string>
+ <string name="needPuk2" msgid="4526033371987193070">"సిమ్ కార్డును అన్బ్లాక్ చేయడానికి PUK2ని టైప్ చేయండి."</string>
+ <string name="enablePin" msgid="209412020907207950">"వైఫల్యం, సిమ్/RUIM లాక్ను ప్రారంభించండి."</string>
<plurals name="pinpuk_attempts">
- <item quantity="one" msgid="6596245285809790142">"SIM లాక్ కాకుండా ఉండటానికి మీకు <xliff:g id="NUMBER">%d</xliff:g> ప్రయత్నం మిగిలి ఉంది."</item>
- <item quantity="other" msgid="7530597808358774740">"SIM లాక్ కాకుండా ఉండటానికి మీకు <xliff:g id="NUMBER">%d</xliff:g> ప్రయత్నాలు మిగిలి ఉన్నాయి."</item>
+ <item quantity="one" msgid="6596245285809790142">"సిమ్ లాక్ కాకుండా ఉండటానికి మీకు <xliff:g id="NUMBER">%d</xliff:g> ప్రయత్నం మిగిలి ఉంది."</item>
+ <item quantity="other" msgid="7530597808358774740">"సిమ్ లాక్ కాకుండా ఉండటానికి మీకు <xliff:g id="NUMBER">%d</xliff:g> ప్రయత్నాలు మిగిలి ఉన్నాయి."</item>
</plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
@@ -76,7 +76,7 @@
<string name="CwMmi" msgid="9129678056795016867">"కాల్ నిరీక్షణ"</string>
<string name="BaMmi" msgid="455193067926770581">"కాల్ బేరింగ్"</string>
<string name="PwdMmi" msgid="7043715687905254199">"పాస్వర్డ్ మార్పు"</string>
- <string name="PinMmi" msgid="3113117780361190304">"PIN మార్పు"</string>
+ <string name="PinMmi" msgid="3113117780361190304">"పిన్ మార్పు"</string>
<string name="CnipMmi" msgid="3110534680557857162">"కాలింగ్ నంబర్ అందుబాటులో ఉంది"</string>
<string name="CnirMmi" msgid="3062102121430548731">"కాలింగ్ నంబర్ పరిమితం చేయబడింది"</string>
<string name="ThreeWCMmi" msgid="9051047170321190368">"మూడు మార్గాల కాలింగ్"</string>
@@ -289,11 +289,11 @@
<string name="permlab_sendRespondViaMessageRequest" msgid="8713889105305943200">"సందేశం ద్వారా ప్రతిస్పందించే ఈవెంట్లను పంపడం"</string>
<string name="permdesc_sendRespondViaMessageRequest" msgid="7107648548468778734">"ఇన్కమింగ్ కాల్ల కోసం సందేశం ద్వారా ప్రతిస్పందించే ఈవెంట్లను నిర్వహించడానికి ఇతర సందేశ విధాన అనువర్తనాలకు అభ్యర్థనలను పంపడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permlab_readSms" msgid="8745086572213270480">"మీ వచన సందేశాలు (SMS లేదా MMS) చదవడం"</string>
- <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"మీ టాబ్లెట్ లేదా SIM కార్డులో నిల్వ చేయబడిన SMS సందేశాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఇది కంటెంట్ లేదా గోప్యతతో సంబంధం లేకుండా అన్ని SMS సందేశాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
- <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"మీ ఫోన్ లేదా SIM కార్డులో నిల్వ చేయబడిన SMS సందేశాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఇది కంటెంట్ లేదా గోప్యతతో సంబంధం లేకుండా అన్ని SMS సందేశాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
+ <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"మీ టాబ్లెట్ లేదా సిమ్ కార్డులో నిల్వ చేయబడిన SMS సందేశాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఇది కంటెంట్ లేదా గోప్యతతో సంబంధం లేకుండా అన్ని SMS సందేశాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
+ <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"మీ ఫోన్ లేదా సిమ్ కార్డులో నిల్వ చేయబడిన SMS సందేశాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఇది కంటెంట్ లేదా గోప్యతతో సంబంధం లేకుండా అన్ని SMS సందేశాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permlab_writeSms" msgid="3216950472636214774">"మీ వచన సందేశాలను (SMS లేదా MMS) సవరించడం"</string>
- <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"మీ టాబ్లెట్లో లేదా SIM కార్డులో నిల్వ చేసిన SMS సందేశాలను వ్రాయడానికి అనువర్తనాన్ని అనుమతిస్తుంది. హానికరమైన అనువర్తనాలు మీ సందేశాలను తొలగించవచ్చు."</string>
- <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"మీ ఫోన్లో లేదా SIM కార్డులో నిల్వ చేసిన SMS సందేశాలను వ్రాయడానికి అనువర్తనాన్ని అనుమతిస్తుంది. హానికరమైన అనువర్తనాలు మీ సందేశాలను తొలగించవచ్చు."</string>
+ <string name="permdesc_writeSms" product="tablet" msgid="5160413947794501538">"మీ టాబ్లెట్లో లేదా సిమ్ కార్డులో నిల్వ చేసిన SMS సందేశాలను వ్రాయడానికి అనువర్తనాన్ని అనుమతిస్తుంది. హానికరమైన అనువర్తనాలు మీ సందేశాలను తొలగించవచ్చు."</string>
+ <string name="permdesc_writeSms" product="default" msgid="7268668709052328567">"మీ ఫోన్లో లేదా సిమ్ కార్డులో నిల్వ చేసిన SMS సందేశాలను వ్రాయడానికి అనువర్తనాన్ని అనుమతిస్తుంది. హానికరమైన అనువర్తనాలు మీ సందేశాలను తొలగించవచ్చు."</string>
<string name="permlab_receiveWapPush" msgid="5991398711936590410">"వచన సందేశాలను (WAP) స్వీకరించడం"</string>
<string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP సందేశాలను స్వీకరించడానికి మరియు ప్రాసెస్ చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఈ అనుమతి మీకు పంపబడిన సందేశాలను మీకు చూపకుండానే పర్యవేక్షించగల లేదా తొలగించగల సామర్థ్యాన్ని కలిగి ఉంటుంది."</string>
<string name="permlab_receiveBluetoothMap" msgid="7593811487142360528">"బ్లూటూత్ సందేశాల స్వీకరణ (MAP)"</string>
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"మీ స్వంత సంప్రదింపు కార్డును సవరించడం"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"మీ పరికరంలో నిల్వ చేయబడిన వ్యక్తిగత ప్రొఫైల్ సమాచారాన్ని అనగా మీ పేరు మరియు సంప్రదింపు సమాచారం వంటివి మార్చడానికి లేదా జోడించడానికి అనువర్తనాన్ని అనుమతిస్తుంది. అనువర్తనం మిమ్మల్ని గుర్తించగలదని మరియు మీ ప్రొఫైల్ సమాచారాన్ని ఇతరులకు పంపగలదని దీని అర్థం."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"శరీర సెన్సార్లు (హృదయ స్పందన మానిటర్లు వంటివి)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"మీ శరీరం లోపల జరిగే వాటిని అంటే హృదయ స్పందన వంటివి కొలవడానికి మీరు ఉపయోగించే సెన్సార్ల నుండి డేటాను ప్రాప్యత చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"మీ శారీరక పరిస్థితిని అనగా మీ గుండె స్పందన రేటు వంటి వాటిని పర్యవేక్షించే సెన్సార్ల నుండి డేటాను ప్రాప్యత చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"మీ సామాజిక ప్రసారాన్ని చదవడం"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"మీరు మరియు మీ స్నేహితులు సమర్పించిన తాజా సామాజిక విషయాలను ప్రాప్యత చేయడానికి మరియు సమకాలీకరించడానికి అనువర్తనాన్ని అనుమతిస్తుంది. సమాచారాన్ని భాగస్వామ్యం చేస్తున్నప్పుడు జాగ్రత్తగా ఉండండి -- ఇది గోప్యతతో సంబంధం లేకుండా, మీ మధ్య మరియు మీ స్నేహితుల మధ్య జరిగిన కమ్యూనికేషన్లను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. గమనిక: ఈ అనుమతి అన్ని సామాజిక నెట్వర్క్ల్లో అమలు చేయబడకపోవచ్చు."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"మీ సామాజిక ప్రసారానికి వ్రాయడం"</string>
@@ -521,10 +521,10 @@
<string name="permdesc_readFrameBuffer" msgid="4937405521809454680">"ఫ్రేమ్ బఫర్ యొక్క కంటెంట్ను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permlab_accessInputFlinger" msgid="5348635270689553857">"InputFlingerను ప్రాప్యత చేయడం"</string>
<string name="permdesc_accessInputFlinger" msgid="2104864941201226616">"InputFlinger తక్కువ స్థాయి లక్షణాలను ఉపయోగించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
- <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"Wifi డిస్ప్లేలను కాన్ఫిగర్ చేయడం"</string>
- <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"Wifi డిస్ప్లేలను కాన్ఫిగర్ చేయడానికి మరియు వాటికి కనెక్ట్ చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
- <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"Wifi డిస్ప్లేలను నియంత్రించడం"</string>
- <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"Wifi డిస్ప్లేల యొక్క తక్కువ-స్థాయి లక్షణాలను నియంత్రించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
+ <string name="permlab_configureWifiDisplay" msgid="5595661694746742168">"వైఫై డిస్ప్లేలను కాన్ఫిగర్ చేయడం"</string>
+ <string name="permdesc_configureWifiDisplay" msgid="7916815158690218065">"వైఫై డిస్ప్లేలను కాన్ఫిగర్ చేయడానికి మరియు వాటికి కనెక్ట్ చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
+ <string name="permlab_controlWifiDisplay" msgid="393641276723695496">"వైఫై డిస్ప్లేలను నియంత్రించడం"</string>
+ <string name="permdesc_controlWifiDisplay" msgid="4543912292681826986">"వైఫై డిస్ప్లేల యొక్క తక్కువ-స్థాయి లక్షణాలను నియంత్రించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permlab_captureAudioOutput" msgid="6857134498402346708">"ఆడియో అవుట్పుట్ను క్యాప్చర్ చేయడం"</string>
<string name="permdesc_captureAudioOutput" msgid="6210597754212208853">"ఆడియో అవుట్పుట్ను క్యాప్చర్ చేసి, దారి మళ్లించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permlab_captureAudioHotword" msgid="1890553935650349808">"హాట్వర్డ్ గుర్తింపు"</string>
@@ -541,8 +541,8 @@
<string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"వాల్యూమ్ మరియు అవుట్పుట్ కోసం ఉపయోగించాల్సిన స్పీకర్ వంటి సార్వజనీన ఆడియో సెట్టింగ్లను సవరించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permlab_recordAudio" msgid="3876049771427466323">"ఆడియోను రికార్డ్ చేయడం"</string>
<string name="permdesc_recordAudio" msgid="4906839301087980680">"మైక్రోఫోన్తో ఆడియోను రికార్డ్ చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఈ అనుమతి మీ నిర్ధారణ లేకుండానే ఎప్పుడైనా ఆడియోను రికార్డ్ చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
- <string name="permlab_sim_communication" msgid="1180265879464893029">"sim కమ్యూనికేషన్"</string>
- <string name="permdesc_sim_communication" msgid="5725159654279639498">"SIMకు ఆదేశాలను పంపడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఇది చాలా ప్రమాదకరం."</string>
+ <string name="permlab_sim_communication" msgid="1180265879464893029">"సిమ్ కమ్యూనికేషన్"</string>
+ <string name="permdesc_sim_communication" msgid="5725159654279639498">"సిమ్కు ఆదేశాలను పంపడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఇది చాలా ప్రమాదకరం."</string>
<string name="permlab_camera" msgid="3616391919559751192">"చిత్రాలు మరియు వీడియోలు తీయడం"</string>
<string name="permdesc_camera" msgid="8497216524735535009">"కెమెరాతో చిత్రాలు మరియు వీడియోలను తీయడానికి అనువర్తనాన్ని అనుమతిస్తుంది. ఈ అనుమతి మీ నిర్ధారణ లేకుండానే ఎప్పుడైనా కెమెరాను ఉపయోగించడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"కెమెరా ఉపయోగంలో ఉన్నప్పుడు ప్రసరణ సూచీ LEDని నిలిపివేయడం"</string>
@@ -884,14 +884,14 @@
<string name="sipAddressTypeWork" msgid="6920725730797099047">"కార్యాలయం"</string>
<string name="sipAddressTypeOther" msgid="4408436162950119849">"ఇతరం"</string>
<string name="quick_contacts_not_available" msgid="746098007828579688">"ఈ పరిచయాన్ని వీక్షించడానికి అనువర్తనం కనుగొనబడలేదు."</string>
- <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"PIN కోడ్ను టైప్ చేయండి"</string>
- <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK మరియు కొత్త PIN కోడ్ను టైప్ చేయండి"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"పిన్ కోడ్ను టైప్ చేయండి"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="4800725266925845333">"PUK మరియు కొత్త పిన్ కోడ్ను టైప్ చేయండి"</string>
<string name="keyguard_password_enter_puk_prompt" msgid="1341112146710087048">"PUK కోడ్"</string>
- <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"కొత్త PIN కోడ్"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8027680321614196258">"కొత్త పిన్ కోడ్"</string>
<string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"పాస్వర్డ్ను టైప్ చేయడానికి తాకండి"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"అన్లాక్ చేయడానికి పాస్వర్డ్ను టైప్ చేయండి"</string>
- <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"అన్లాక్ చేయడానికి PINను టైప్ చేయండి"</string>
- <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"చెల్లని PIN కోడ్."</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"అన్లాక్ చేయడానికి పిన్ను టైప్ చేయండి"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"చెల్లని పిన్ కోడ్."</string>
<string name="keyguard_label_text" msgid="861796461028298424">"అన్లాక్ చేయడానికి, మెను ఆపై 0ని నొక్కండి."</string>
<string name="emergency_call_dialog_number_for_display" msgid="696192103195090970">"అత్యవసర నంబర్"</string>
<string name="lockscreen_carrier_default" msgid="8963839242565653192">"సేవ లేదు."</string>
@@ -905,13 +905,13 @@
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"మళ్లీ ప్రయత్నించండి"</string>
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"మళ్లీ ప్రయత్నించండి"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"ముఖంతో అన్లాక్ ప్రయత్నాల గరిష్ట పరిమితి మించిపోయారు"</string>
- <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"SIM కార్డు లేదు"</string>
- <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"టాబ్లెట్లో SIM కార్డు లేదు."</string>
- <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"ఫోన్లో SIM కార్డు లేదు."</string>
- <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"SIM కార్డును చొప్పించండి."</string>
- <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SIM కార్డు లేదు లేదా చదవగలిగేలా లేదు. SIM కార్డును చొప్పించండి."</string>
- <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"నిరుపయోగ SIM కార్డు."</string>
- <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"మీ SIM కార్డు శాశ్వతంగా నిలిపివేయబడింది.\n మరో SIM కార్డు కోసం మీ వైర్లెస్ సేవా ప్రదాతను సంప్రదించండి."</string>
+ <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"సిమ్ కార్డు లేదు"</string>
+ <string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"టాబ్లెట్లో సిమ్ కార్డు లేదు."</string>
+ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"ఫోన్లో సిమ్ కార్డు లేదు."</string>
+ <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"సిమ్ కార్డును చొప్పించండి."</string>
+ <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"సిమ్ కార్డు లేదు లేదా చదవగలిగేలా లేదు. సిమ్ కార్డును చొప్పించండి."</string>
+ <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"నిరుపయోగ సిమ్ కార్డు."</string>
+ <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"మీ సిమ్ కార్డు శాశ్వతంగా నిలిపివేయబడింది.\n మరో సిమ్ కార్డు కోసం మీ వైర్లెస్ సేవా ప్రదాతను సంప్రదించండి."</string>
<string name="lockscreen_transport_prev_description" msgid="6300840251218161534">"మునుపటి ట్రాక్"</string>
<string name="lockscreen_transport_next_description" msgid="573285210424377338">"తదుపరి ట్రాక్"</string>
<string name="lockscreen_transport_pause_description" msgid="3980308465056173363">"పాజ్ చేయి"</string>
@@ -921,13 +921,13 @@
<string name="lockscreen_transport_ffw_description" msgid="42987149870928985">"వేగంగా ఫార్వార్డ్ చేయి"</string>
<string name="emergency_calls_only" msgid="6733978304386365407">"అత్యవసర కాల్లు మాత్రమే"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"నెట్వర్క్ లాక్ చేయబడింది"</string>
- <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM కార్డు PUK-లాక్ చేయబడింది."</string>
+ <string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"సిమ్ కార్డు PUK-లాక్ చేయబడింది."</string>
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"వినియోగదారు గైడ్ను చూడండి లేదా కస్టమర్ కేర్ను సంప్రదించండి."</string>
- <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM కార్డు లాక్ చేయబడింది."</string>
- <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM కార్డును అన్లాక్ చేస్తోంది…"</string>
+ <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"సిమ్ కార్డు లాక్ చేయబడింది."</string>
+ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"సిమ్ కార్డును అన్లాక్ చేస్తోంది…"</string>
<string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"మీరు మీ అన్లాక్ నమూనాను <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="2725973286239344555">"మీరు మీ పాస్వర్డ్ను <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="6216672706545696955">"మీరు మీ PINను <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="6216672706545696955">"మీరు మీ పిన్ను <xliff:g id="NUMBER_0">%d</xliff:g> సార్లు తప్పుగా టైప్ చేసారు. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి."</string>
<string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"మీరు మీ అన్లాక్ నమూనాని <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_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"మీరు మీ అన్లాక్ నమూనాని <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_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"మీరు టాబ్లెట్ను అన్లాక్ చేయడానికి <xliff:g id="NUMBER_0">%d</xliff:g> సార్లు తప్పుగా ప్రయత్నించారు. మరో <xliff:g id="NUMBER_1">%d</xliff:g> వైఫల్య ప్రయత్నాల తర్వాత, టాబ్లెట్ ఫ్యాక్టరీ డిఫాల్ట్కు రీసెట్ చేయబడుతుంది మరియు మొత్తం వినియోగదారు డేటాను కోల్పోవడం సంభవిస్తుంది."</string>
@@ -1285,8 +1285,8 @@
<string name="wifi_p2p_invitation_to_connect_title" msgid="4958803948658533637">"కనెక్ట్ చేయడానికి ఆహ్వానం"</string>
<string name="wifi_p2p_from_message" msgid="570389174731951769">"వీరి నుండి:"</string>
<string name="wifi_p2p_to_message" msgid="248968974522044099">"వీరికి:"</string>
- <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"అవసరమైన PINను టైప్ చేయండి:"</string>
- <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string>
+ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"అవసరమైన పిన్ను టైప్ చేయండి:"</string>
+ <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"పిన్:"</string>
<string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"టాబ్లెట్ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>కు కనెక్ట్ చేయబడినప్పుడు Wi-Fi నుండి తాత్కాలికంగా డిస్కనెక్ట్ చేయబడుతుంది"</string>
<string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"ఫోన్ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>కి కనెక్ట్ అయినప్పుడు అది Wi-Fi నుండి తాత్కాలికంగా డిస్కనెక్ట్ చేయబడుతుంది"</string>
<string name="select_character" msgid="3365550120617701745">"అక్షరాన్ని చొప్పించండి"</string>
@@ -1303,10 +1303,10 @@
<string name="sms_short_code_remember_undo_instruction" msgid="4960944133052287484">"మీరు దీన్ని తర్వాత సెట్టింగ్లు > అనువర్తనాలులో మార్చవచ్చు"</string>
<string name="sms_short_code_confirm_always_allow" msgid="3241181154869493368">"ఎల్లప్పుడూ అనుమతించు"</string>
<string name="sms_short_code_confirm_never_allow" msgid="446992765774269673">"ఎప్పటికీ అనుమతించవద్దు"</string>
- <string name="sim_removed_title" msgid="6227712319223226185">"SIM కార్డు తీసివేయబడింది"</string>
- <string name="sim_removed_message" msgid="5450336489923274918">"మీరు చెల్లుబాటు అయ్యే SIM కార్డును చొప్పించి, దాన్ని పునఃప్రారంభించే వరకు సెల్యులార్ నెట్వర్క్ అందుబాటులో ఉండదు."</string>
+ <string name="sim_removed_title" msgid="6227712319223226185">"సిమ్ కార్డు తీసివేయబడింది"</string>
+ <string name="sim_removed_message" msgid="5450336489923274918">"మీరు చెల్లుబాటు అయ్యే సిమ్ కార్డును చొప్పించి, దాన్ని పునఃప్రారంభించే వరకు సెల్యులార్ నెట్వర్క్ అందుబాటులో ఉండదు."</string>
<string name="sim_done_button" msgid="827949989369963775">"పూర్తయింది"</string>
- <string name="sim_added_title" msgid="3719670512889674693">"SIM కార్డు జోడించబడింది"</string>
+ <string name="sim_added_title" msgid="3719670512889674693">"సిమ్ కార్డు జోడించబడింది"</string>
<string name="sim_added_message" msgid="7797975656153714319">"సెల్యులార్ నెట్వర్క్ను ప్రాప్యత చేయడానికి మీ పరికరాన్ని పునఃప్రారంభించండి."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"పునఃప్రారంభించు"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"సమయాన్ని సెట్ చేయండి"</string>
@@ -1596,21 +1596,21 @@
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"నమూనాను మర్చిపోయాను"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"నమూనా తప్పు"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"పాస్వర్డ్ తప్పు"</string>
- <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN తప్పు"</string>
+ <string name="kg_wrong_pin" msgid="1131306510833563801">"పిన్ తప్పు"</string>
<string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి."</string>
<string name="kg_pattern_instructions" msgid="398978611683075868">"మీ నమూనాను గీయండి"</string>
- <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM PINను నమోదు చేయండి"</string>
- <string name="kg_pin_instructions" msgid="2377242233495111557">"PINను నమోదు చేయండి"</string>
+ <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"సిమ్ పిన్ను నమోదు చేయండి"</string>
+ <string name="kg_pin_instructions" msgid="2377242233495111557">"పిన్ను నమోదు చేయండి"</string>
<string name="kg_password_instructions" msgid="5753646556186936819">"పాస్వర్డ్ని నమోదు చేయండి"</string>
- <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM ఇప్పుడు నిలిపివేయబడింది. కొనసాగడానికి PUK కోడ్ను నమోదు చేయండి. వివరాల కోసం క్యారియర్ను సంప్రదించండి."</string>
- <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"కోరుకునే PIN కోడ్ను నమోదు చేయండి"</string>
- <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"కావల్సిన PIN కోడ్ను నిర్ధారించండి"</string>
- <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"SIM కార్డును అన్లాక్ చేస్తోంది…"</string>
- <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"చెల్లని PIN కోడ్."</string>
- <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4 నుండి 8 సంఖ్యలు ఉండే PINను టైప్ చేయండి."</string>
+ <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"సిమ్ ఇప్పుడు నిలిపివేయబడింది. కొనసాగడానికి PUK కోడ్ను నమోదు చేయండి. వివరాల కోసం క్యారియర్ను సంప్రదించండి."</string>
+ <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"కోరుకునే పిన్ కోడ్ను నమోదు చేయండి"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"కావల్సిన పిన్ కోడ్ను నిర్ధారించండి"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"సిమ్ కార్డును అన్లాక్ చేస్తోంది…"</string>
+ <string name="kg_password_wrong_pin_code" msgid="1139324887413846912">"చెల్లని పిన్ కోడ్."</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"4 నుండి 8 సంఖ్యలు ఉండే పిన్ను టైప్ చేయండి."</string>
<string name="kg_invalid_sim_puk_hint" msgid="6025069204539532000">"PUK కోడ్ 8 సంఖ్యలు ఉండాలి."</string>
- <string name="kg_invalid_puk" msgid="3638289409676051243">"సరైన PUK కోడ్ను మళ్లీ నమోదు చేయండి. పునరావృత ప్రయత్నాల వలన SIM శాశ్వతంగా నిలిపివేయబడుతుంది."</string>
- <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN కోడ్లు సరిపోలలేదు"</string>
+ <string name="kg_invalid_puk" msgid="3638289409676051243">"సరైన PUK కోడ్ను మళ్లీ నమోదు చేయండి. పునరావృత ప్రయత్నాల వలన సిమ్ శాశ్వతంగా నిలిపివేయబడుతుంది."</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"పిన్ కోడ్లు సరిపోలలేదు"</string>
<string name="kg_login_too_many_attempts" msgid="6486842094005698475">"చాలా ఎక్కువ నమూనా ప్రయత్నాలు చేసారు"</string>
<string name="kg_login_instructions" msgid="1100551261265506448">"అన్లాక్ చేయడానికి, మీ Google ఖాతాతో సైన్ ఇన్ చేయండి."</string>
<string name="kg_login_username_hint" msgid="5718534272070920364">"వినియోగదారు పేరు (ఇమెయిల్)"</string>
@@ -1619,7 +1619,7 @@
<string name="kg_login_invalid_input" msgid="5754664119319872197">"చెల్లని వినియోగదారు పేరు లేదా పాస్వర్డ్."</string>
<string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"మీ వినియోగదారు పేరు లేదా పాస్వర్డ్ను మర్చిపోయారా?\n"<b>"google.com/accounts/recovery"</b>"ని సందర్శించండి."</string>
<string name="kg_login_checking_password" msgid="1052685197710252395">"ఖాతాను తనిఖీ చేస్తోంది…"</string>
- <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"మీరు మీ PINను <xliff:g id="NUMBER_0">%d</xliff:g> సార్లు తప్పుగా టైప్ చేసారు. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి."</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"మీరు మీ పిన్ను <xliff:g id="NUMBER_0">%d</xliff:g> సార్లు తప్పుగా టైప్ చేసారు. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"మీరు మీ పాస్వర్డ్ను <xliff:g id="NUMBER_0">%d</xliff:g> సార్లు తప్పుగా టైప్ చేసారు. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి."</string>
<string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"మీరు మీ అన్లాక్ నమూనాను <xliff:g id="NUMBER_0">%d</xliff:g> సార్లు తప్పుగా గీసారు. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"మీరు టాబ్లెట్ను అన్లాక్ చేయడానికి <xliff:g id="NUMBER_0">%d</xliff:g> చెల్లని ప్రయత్నాలు చేసారు. మరో <xliff:g id="NUMBER_1">%d</xliff:g> విఫల ప్రయత్నాల తర్వాత, టాబ్లెట్ ఫ్యాక్టరీ డిఫాల్ట్కు రీసెట్ చేయబడుతుంది మరియు మొత్తం వినియోగదారు డేటాను కోల్పోవడం సంభవిస్తుంది."</string>
@@ -1730,15 +1730,15 @@
<string name="reason_service_unavailable" msgid="7824008732243903268">"ముద్రణ సేవ ప్రారంభించబడలేదు"</string>
<string name="print_service_installed_title" msgid="2246317169444081628">"<xliff:g id="NAME">%s</xliff:g> సేవ ఇన్స్టాల్ చేయబడింది"</string>
<string name="print_service_installed_message" msgid="5897362931070459152">"ప్రారంభించడానికి నొక్కండి"</string>
- <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"నిర్వాహకుని PINను నమోదు చేయండి"</string>
- <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PINను నమోదు చేయండి"</string>
+ <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"నిర్వాహకుని పిన్ను నమోదు చేయండి"</string>
+ <string name="restr_pin_enter_pin" msgid="3395953421368476103">"పిన్ను నమోదు చేయండి"</string>
<string name="restr_pin_incorrect" msgid="8571512003955077924">"తప్పు"</string>
- <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"ప్రస్తుత PIN"</string>
- <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"కొత్త PIN"</string>
- <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"కొత్త PINను నిర్ధారించండి"</string>
- <string name="restr_pin_create_pin" msgid="8017600000263450337">"నియంత్రణలను సవరించడానికి PINను రూపొందించండి"</string>
+ <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"ప్రస్తుత పిన్"</string>
+ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"కొత్త పిన్"</string>
+ <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"కొత్త పిన్ను నిర్ధారించండి"</string>
+ <string name="restr_pin_create_pin" msgid="8017600000263450337">"నియంత్రణలను సవరించడానికి పిన్ను రూపొందించండి"</string>
<string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PINలు సరిపోలలేదు. మళ్లీ ప్రయత్నించండి."</string>
- <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN చాలా చిన్నదిగా ఉంది. తప్పనిసరిగా కనీసం 4 అంకెలు ఉండాలి."</string>
+ <string name="restr_pin_error_too_short" msgid="8173982756265777792">"పిన్ చాలా చిన్నదిగా ఉంది. తప్పనిసరిగా కనీసం 4 అంకెలు ఉండాలి."</string>
<plurals name="restr_pin_countdown">
<item quantity="one" msgid="311050995198548675">"1 సెకనులో మళ్లీ ప్రయత్నించండి"</item>
<item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> సెకన్లలో మళ్లీ ప్రయత్నించండి"</item>
@@ -1757,17 +1757,17 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> ఎంచుకోబడింది"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> తొలగించబడింది"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"కార్యాలయం <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="7570091317001980053">"ఈ స్క్రీన్ను అన్పిన్ చేయడానికి, వెనుకకు మరియు స్థూలదృష్టి బటన్లను ఒకేసారి నొక్కి, ఉంచండి."</string>
- <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ఈ స్క్రీన్ని అన్పిన్ చేయడానికి, స్థూలదృష్టిని నొక్కి, ఉంచండి."</string>
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"ఈ స్క్రీన్ను అన్పిన్ చేయడానికి, వెనుకకు మరియు అవలోకనం బటన్లను ఒకేసారి నొక్కి, ఉంచండి."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"ఈ స్క్రీన్ని అన్పిన్ చేయడానికి, అవలోకనం నొక్కి, ఉంచండి."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"స్క్రీన్ పిన్ చేయబడింది. మీ సంస్థలో అన్పిన్ చేయడానికి అనుమతి లేదు."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"స్క్రీన్ పిన్నింగ్ను ఉపయోగించాలా?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"స్క్రీన్ పిన్నింగ్ ఒక్క వీక్షణలో డిస్ప్లేను లాక్ చేస్తుంది.\n\nఅన్పిన్ చేయడానికి, వెనుకకు మరియు స్థూలదృష్టి బటన్లను ఒకేసారి నొక్కి, ఉంచండి."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"స్క్రీన్ పిన్నింగ్ ఒక్క వీక్షణలో డిస్ప్లేను లాక్ చేస్తుంది.\n\nఅన్పిన్ చేయడానికి, స్థూలదృష్టిని నొక్కి, ఉంచండి."</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"స్క్రీన్ పిన్నింగ్ ఒక్క వీక్షణలో డిస్ప్లేను లాక్ చేస్తుంది.\n\nఅన్పిన్ చేయడానికి, వెనుకకు మరియు అవలోకనం బటన్లను ఒకేసారి నొక్కి, ఉంచండి."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"స్క్రీన్ పిన్నింగ్ ఒక్క వీక్షణలో డిస్ప్లేను లాక్ చేస్తుంది.\n\nఅన్పిన్ చేయడానికి, అవలోకనం నొక్కి, ఉంచండి."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"వద్దు, ధన్యవాదాలు"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"ప్రారంభించు"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"స్క్రీన్ పిన్ చేయబడింది"</string>
<string name="lock_to_app_exit" msgid="8598219838213787430">"స్క్రీన్ అన్పిన్ చేయబడింది"</string>
- <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"అన్పిన్ చేయడానికి ముందు PIN కోసం అడుగు"</string>
+ <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"అన్పిన్ చేయడానికి ముందు పిన్ కోసం అడుగు"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"అన్పిన్ చేయడానికి ముందు అన్లాక్ నమూనా కోసం అడుగు"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"అన్పిన్ చేయడానికి ముందు పాస్వర్డ్ కోసం అడుగు"</string>
<string name="battery_saver_description" msgid="2510530476513605742">"బ్యాటరీ సామర్థ్యాన్ని మెరుగుపరచడంలో సహాయపడటానికి, బ్యాటరీ సేవర్ మీ పరికరం పనితీరుని తగ్గిస్తుంది మరియు వైబ్రేషన్ను మరియు అత్యధిక నేపథ్య డేటాను పరిమితపరుస్తుంది. అలాగే సమకాలీకరణపై ఆధారపడే ఇమెయిల్, సందేశ సేవ మరియు ఇతర అనువర్తనాలు మీరు వాటిని తెరిస్తే మినహా నవీకరించబడకపోవచ్చు.\n\nమీ పరికరం ఛార్జింగ్లో ఉన్నప్పుడు బ్యాటరీ సేవర్ స్వయంచాలకంగా ఆఫ్ చేయబడుతుంది."</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index a143cdd..e5a4e9c 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"แก้ไขบัตรผู้ติดต่อของคุณเอง"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"อนุญาตให้แอปพลิเคชันเปลี่ยนแปลงหรือเพิ่มข้อมูลโปรไฟล์ส่วนตัวที่จัดเก็บไว้บนอุปกรณ์ของคุณ เช่น ชื่อและข้อมูลติดต่อ ซึ่งหมายความว่าแอปพลิเคชันจะสามารถระบุตัวตนของคุณและส่งข้อมูลโปรไฟล์ของคุณให้แก่ผู้อื่นได้"</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"เซ็นเซอร์ร่างกาย (เช่น วัดอัตราการเต้นของหัวใจ)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"ช่วยให้แอปสามารถเข้าถึงข้อมูลจากเซ็นเซอร์ที่คุณใช้เพื่อวัดความเป็นไปภายในร่างกายของคุณ เช่น อัตราการเต้นของหัวใจ"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"อนุญาตให้แอปเข้าถึงข้อมูลจากเซ็นเซอร์ที่ตรวจสอบสภาพทางกายภาพ เช่น อัตราการเต้นของหัวใจ"</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"อ่านสตรีมเครือข่ายสังคม"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"อนุญาตให้แอปพลิเคชันเข้าถึงและซิงค์การอัปเดตทางสังคมจากคุณและเพื่อน โปรดแชร์ข้อมูลอย่างระมัดระวังเนื่องจากการอนุญาตนี้ทำให้แอปพลิเคชันสามารถอ่านการติดต่อระหว่างคุณและเพื่อนในเครือข่ายสังคมได้ ไม่ว่าจะมีการรักษาข้อมูลที่เป็นความลับแบบใดก็ตาม หมายเหตุ: การอนุญาตนี้อาจไม่สามารถใช้งานได้กับทุกเครือข่ายสังคม"</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"เขียนในสตรีมเครือข่ายสังคม"</string>
@@ -704,7 +704,7 @@
<string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"อนุญาตให้แอปอ่านเนื้อหาในการ์ด SD"</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"แก้ไขหรือลบเนื้อหาใน USB"</string>
<string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"แก้ไขหรือลบเนื้อหาในการ์ด SD ของคุณ"</string>
- <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"อนุญาตให้แอปฯ เขียนลงใน USB"</string>
+ <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"อนุญาตให้แอปเขียนลงใน USB"</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"อนุญาตให้แอปพลิเคชันเขียนลงบนการ์ด SD"</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"แก้/ลบเนื้อหาข้อมูลสื่อภายใน"</string>
<string name="permdesc_mediaStorageWrite" product="default" msgid="8189160597698529185">"อนุญาตให้แอปพลิเคชันแก้ไขเนื้อหาของที่เก็บข้อมูลสื่อภายใน"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"เลือก <xliff:g id="ITEM">%1$s</xliff:g>"</string>
<string name="deleted_key" msgid="7659477886625566590">"ลบ <xliff:g id="KEY">%1$s</xliff:g> แล้ว"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g>ที่ทำงาน"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"หากต้องการเลิกตรึงหน้าจอนี้ แตะ \"กลับ\" และ \"ภาพรวม\" ค้างไว้พร้อมกัน"</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"หากต้องการเลิกตรึงหน้าจอ แตะ \"ภาพรวม\" ค้างไว้"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"ตรึงหน้าจอแล้ว องค์กรของคุณไม่อนุญาตให้เลิกตรึง"</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"ใช้การตรึงหน้าจอไหม"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"การตรึงหน้าจอล็อกหน้าจอให้อยู่ในมุมมองเดียว\n\nหากต้องการเลิกตรึง ให้แตะ \"กลับ\" และ \"ภาพรวม\" ค้างไว้พร้อมกัน"</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"การตรึงหน้าจอล็อกหน้าจอให้อยู่ในมุมมองเดียว\n\nหากต้องการเลิกตรึง ให้แตะ \"ภาพรวม\" ค้างไว้"</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"ไม่เป็นไร ขอบคุณ"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"เริ่มต้น"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"ตรึงหน้าจอแล้ว"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 90391a6..8360eb1 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"baguhin sarili mo contact card"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Pinapayagan ang app na baguhin ang o magdagdag sa personal na impormasyon ng profile na naka-imbak sa iyong device, gaya ng iyong pangalan at impormasyon sa pakikipag-ugnay. Nangangahulugan ito na makikilala ka ng app at maaari nitong ipadala ang impormasyon ng iyong profile sa iba."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"mga sensor sa katawan (gaya ng mga heart rate monitor)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Pinapayagan ang app na i-access ang data mula sa mga sensor na ginagamit mo upang sukatin kung anong nangyayari sa iyong katawan, gaya ng heart rate."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Pinapayagan ang app na i-access ang data mula sa mga sensor na sumusubaybay sa iyong pisikal na kundisyon, tulad ng iyong heart rate."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"basahin ang iyong social stream"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Pinapayagan ang app na mag-access at mag-sync ng mga social na update mula sa iyo at sa iyong mga kaibigan. Maging maingat kapag nagbabahagi ng impormasyon -- pinapayagan nito ang app na magbasa ng mga pakikipag-ugnayan sa pagitan mo at ng iyong mga kaibigan sa mga social network, ano pa man ang katayuan sa pagiging kumpedensyal nito. Tandaan: hindi maaaring ipatupad ang pahintulot na ito sa lahat ng social network."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"magsulat sa iyong social stream"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"Napili ang <xliff:g id="ITEM">%1$s</xliff:g>"</string>
<string name="deleted_key" msgid="7659477886625566590">"Tinanggal ang <xliff:g id="KEY">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> sa Trabaho"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Upang i-unpin ang screen na ito, pindutin nang matagal ang Bumalik at Overview nang sabay-sabay."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Upang i-unpin ang screen na ito, pindutin nang matagal ang Overview."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Naka-pin ang screen. Hindi pinapayagan ng iyong organisasyon ang pag-a-unpin."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Gamitin ang pagpi-pin ng screen?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Nila-lock ng pagpi-pin ng screen ang display sa iisang view.\n\nUpang i-unpin, pindutin nang matagal ang Bumalik at Overview nang sabay-sabay."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Nila-lock ng pagpi-pin ng screen ang display sa iisang view.\n\nUpang i-unpin, pindutin nang matagal ang Overview."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"HINDI, SALAMAT NA LANG"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"SIMULAN"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Naka-pin ang screen"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index a786101..e6f78c6 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"kendi kişi kartınızı değiştirme"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Uygulamaya adınız ve iletişim bilgileriniz gibi cihazınızda saklanan kişisel profil bilgilerini değiştirme veya bunlara ekleme yapma izni verir. Bu izin, uygulamanın sizi tanımlayabileceği ve profil bilgilerinizi başkalarına gönderebileceği anlamına gelir."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"vücut sensörleri (kalp atış hızı takip cihazları gibi)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Uygulamanın, kalp atış hızınız gibi vücudunuzla ilgili olayları ölçmek için kullandığınız sensörlerden gelen verilere erişmesine izin verir."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Uygulamanın, nabzınız gibi fiziksel durumunuzu izleyen sensörlerin gönderdiği verilere erişmesine izin verir."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"sosyal akışınızı okuma"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Uygulamaya size veya arkadaşlarınıza ait sosyal güncellemelere erişme ve bunları senkronize etme izni verir. Bilgi paylaşırken dikkatli olun. Bu izin, uygulamanın sosyal ağlarda sizinle arkadaşlarınız arasındaki iletişimi, gizliliğine bakılmaksızın okumasına olanak sağlar. Not: Bu izin tüm sosyal ağlar için geçerli olmayabilir."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"sosyal akışınıza yazma"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 093844b..925ec80 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"змінювати картки контактів"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Дозволяє програмі змінювати чи додавати особисту інформацію профілю, збережену на пристрої, як-от ваше ім’я та контактну інформацію. Це означає, що програма може ідентифікувати вашу особу та надсилати дані вашого профілю іншим."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"датчики на тілі (як-от пульсометр)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Дозволяє додатку отримувати дані з датчиків, які вимірюють фізіологічні процеси, як-от пульс."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Додаток має доступ до даних із датчиків, які відстежують фізичний стан, зокрема пульс."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"читати ваш соціальний потік"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Дозволяє програмі отримувати доступ до оновлень із соціальних мереж від вас і ваших друзів та синхронізувати їх. Будьте обережні, надаючи доступ до інформації – це дозволяє програмі читати повідомлення, якими ви та ваші друзі обмінювалися в соціальних мережах, незалежно від конфіденційності. Зауважте: цей дозвіл не можна застосовувати в усіх соціальних мережах."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"писати у ваш соціальний потік"</string>
diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml
index ea81344..ddfd85d 100644
--- a/core/res/res/values-ur-rPK/strings.xml
+++ b/core/res/res/values-ur-rPK/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"اپنے رابطہ کارڈ میں ترمیم کریں"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"ایپ کو آپ کے آلے پر اسٹور کردہ ذاتی پروفائل کی معلومات، جیسے آپ کا نام اور رابطے کی معلومات تبدیل یا اس میں شامل کرنے کی اجازت دیتا ہے۔ اس کا مطلب یہ ہے کہ ایپ آپ کی نشاندہی کرسکتی اور آپ کے پروفائل کی معلومات دوسروں کو بھیج سکتی ہے۔"</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"باڈی سینسرز (جیسے دل کی دھڑکن کے مانیٹرز)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"ایپ کو ان سینسرز سے ڈیٹا تک رسائی کی اجازت دیتا ہے، جنہیں آپ اپنے جسم کے اندر چل رہی چیزوں کی پیمائش کیلئے استعمال کرتے ہیں، جیسے کہ دل کی دھڑکن۔"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"ان سینسرز سے ڈیٹا تک رسائی حاصل کرنے کی اجازت دیتی ہے جو آپ کی حرکت قلب کی شرح جیسی آپ کی فزیکل صورتحال کو مانیٹر کرتے ہیں۔"</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"اپنا سوشل سلسلہ پڑھیں"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"ایپ کو آپ اور آپ کے دوستوں کے سماجی اپ ڈیٹس تک رسائی حاصل کرنے اور انہیں مطابقت پذیر بنانے کی اجازت دیتا ہے۔ معلومات کا اشتراک کرتے وقت محتاط رہیں -- رازداری سے قطع نظر، یہ سماجی نیٹ ورکس پر آپ اور آپ کے دوستوں کے بیچ مواصلتوں کو پڑھنے کی اجازت دیتا ہے۔ نوٹ: یہ اجازت سبھی سماجی نیٹ ورکس پر نافذ نہیں کی جاسکتی ہے۔"</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"اپنے سوشل سلسلہ میں لکھیں"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> کو منتخب کیا گیا"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> کو حذف کر دیا گیا"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"دفتر <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"اس اسکرین سے پن ہٹانے کیلئے، واپس جائیں اور مجموعی جائزہ کو ایک ساتھ ٹچ کریں اور دبا کر رکھیں۔"</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"اس اسکرین سے پن ہٹانے کیلئے، مجموعی جائزہ کو ٹچ کریں اور دبا کر رکھیں۔"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"اسکرین کو پن کر دیا گیا ہے۔ آپ کی تنظیم کی جانب سے پن ہٹانے کی اجازت نہیں ہے۔"</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"اسکرین پننگ کا استعمال کریں؟"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"اسکرین پن کرنا ڈسپلے کو ایک منظر میں مقفل کر دیتا ہے۔\n\nپن ہٹانے کیلئے، واپس جائیں اور مجموعی جائزہ کو ایک ساتھ ٹچ کریں اور دبا کر رکھیں۔"</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"اسکرین پن کرنا ڈسپلے کو ایک منظر میں مقفل کر دیتا ہے۔\n\nپن ہٹانے کیلئے، مجموعی جائزہ کو ٹچ کریں اور دبا کر رکھیں۔"</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"نہیں، شکریہ"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"شروع کریں"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"اسکرین کو پن کر دیا گیا"</string>
diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml
index c21f2b2..6d6f36e 100644
--- a/core/res/res/values-uz-rUZ/strings.xml
+++ b/core/res/res/values-uz-rUZ/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"shaxsiy kontaktlar kartangizni o‘zgartirish"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Ilovaga qurilmangizga zaxiralangan ismingiz va aloqa ma’lumotlaringiz kabi shaxsiy profillingiz ma’lumotlarini o‘zgartirish yoki ularga ma’lumot qo‘shish imkonini beradi. Bu ilova sizni tanib olishi va profil ma’lumotlaringizni boshqalarga jo‘natishi mumkinligini bildiradi."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"sezgichlar (m-n, yurak urishi)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Ilova sizning jismoniy ko‘rsatkichlaringizni (m-n, yurak urishi) o‘lchaydigan sezgich ma’lumotlariga kirish vakolatini oladi."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Ilovaga sezgichlardan olingan jismoniy holatingiz haqidagi ma’lumotlarni, masalan, yurak urishini kuzatish uchun ruxsat beradi."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"ijtimoiy uzatishni o‘qish"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Ilovaga siz va do‘stlaringizning ijtimoiy tarmoqlaridagi yangiliklarga kirish va ularni sinxronlashga ruxsat beradi. Ma’lumot ulashayotganda ehtiyot bo‘ling -- u ilovaga ijtimoiy tarmoqlarda maxfiyligidan qat’iy nazar siz va do‘stlaringiz o‘rtasidagi yozishmalarni o‘qish imkonini beradi. Diqqat qiling: ushbu ruxsat na barcha ijtimoiy tarmoqlarda talab qilinishi mumkin."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"ijtimoiy uzatishga yozish"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> tanlandi"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> o‘chirildi"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Ish <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Ushbu ekrandan chiqish uchun “Orqaga” va “Umumiy nazar” tugmalarini bir vaqtda bosib turing."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Ushbu ekrandan chiqish uchun “Umumiy nazar” tugmasini bosib turing."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Ekran qadab qo‘yildi. Uni bo‘shatishga tashkilotingiz ruxsat bermagan."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Ekranni qadab qo‘yish funksiyasidan foydalanilsinmi?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Ekranni qadab qo‘yish funksiyasi ekranni faqat bitta narsa ko‘rinadigan bo‘lib qulflaydi.\n\nUndan chiqish uchun “Orqaga” va “Umumiy nazar” tugmalarini bir vaqtda bosib turing."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Ekranni qadab qo‘yish funksiyasi ekranni faqat bitta narsa ko‘rinadigan bo‘lib qulflaydi.\n\nUndan chiqish uchun “Umumiy nazar” tugmasini bosib turing."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"YO‘Q, KERAK EMAS"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"ISHGA TUSHIRISH"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Ekran qadab qo‘yildi"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 5729ed9..f56f8e7 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"sửa đổi thẻ liên hệ của riêng bạn"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Cho phép ứng dụng thay đổi hoặc thêm vào thông tin tiểu sử cá nhân được lưu trữ trên thiết bị, chẳng hạn như tên và thông tin liên hệ của bạn. Điều này có nghĩa là ứng dụng có thể xác định danh tính của bạn và gửi thông tin tiểu sử của bạn cho người khác."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"cảm biến cơ thể (như máy đo nhịp tim)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Cho phép ứng dụng truy cập dữ liệu từ cảm biến mà bạn sử dụng để đo những gì đang diễn ra bên trong cơ thể của bạn, chẳng hạn như nhịp tim."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Cho phép ứng dụng truy cập dữ liệu từ bộ cảm biến giám sát tình trạng thể chất của bạn, ví dụ như nhịp tim."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"đọc luồng xã hội của bạn"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Cho phép ứng dụng truy cập và đồng bộ hóa các cập nhật xã hội của bạn và bạn bè bạn. Hãy cẩn trọng khi chia sẻ thông tin -- việc này có thể cho phép ứng dụng đọc thông tin liên lạc giữa bạn và bạn bè bạn trên các mạng xã hội, bất kể tính bí mật là gì. Lưu ý: quyền này có thể không được thực thi trên tất cả các mạng xã hội."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"ghi luồng xã hội của bạn"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"Đã chọn <xliff:g id="ITEM">%1$s</xliff:g>"</string>
<string name="deleted_key" msgid="7659477886625566590">"Đã xóa <xliff:g id="KEY">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> làm việc"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Để bỏ khóa màn hình này, chạm và giữ Quay lại và Tổng quan cùng lúc."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Để bỏ khóa màn hình này, chạm và giữ Tổng quan."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Màn hình đã được ghim. Tổ chức của bạn không cho phép bỏ ghim."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Sử dụng ghim màn hình?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Khóa màn hình sẽ khóa hiển thị trong một chế độ xem.\n\nĐể bỏ khóa, chạm và giữ Quay lại và Tổng quan cùng lúc."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Khóa màn hình sẽ khóa hiển thị trong một chế độ xem.\n\nĐể bỏ khóa, chạm và giữ Tổng quan."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"KHÔNG, CẢM ƠN"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"BẮT ĐẦU"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Đã ghim màn hình"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 7508023..82c9fe1 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"修改您自己的名片"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"允许该应用更改或添加您设备上存储的个人资料信息,例如您的姓名和联系信息。这意味着该应用可以识别您的身份,并可能将您的个人资料信息发送给他人。"</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"人体传感器(如心跳速率检测器)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"允许应用访问您用于测量身体状况(如心跳速率)的传感器中的数据。"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"允许该应用存取监测您身体状况的传感器所收集的数据,例如您的心率。"</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"读取您的社交信息流"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"允许该应用访问并同步您和朋友的社交动态信息。在分享信息时一定要小心,因为此权限可让该应用读取您与社交网络上的朋友之间的交流信息。"</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"写入您的社交信息流"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"已选择<xliff:g id="ITEM">%1$s</xliff:g>"</string>
<string name="deleted_key" msgid="7659477886625566590">"已删除<xliff:g id="KEY">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"工作<xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"要取消固定此屏幕,请同时触摸并按住“返回”和“概览”按钮。"</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"要取消固定此屏幕,请触摸并按住概览按钮。"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"屏幕处于固定状态。您所属的单位不允许取消固定。"</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"要固定屏幕吗?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"固定屏幕后,设备会一直显示某一个屏幕。\n\n要取消固定屏幕,请同时触摸并按住“返回”和“概览”按钮。"</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"固定屏幕后,设备会一直显示某一个屏幕。\n\n要取消固定屏幕,请触摸并按住概览按钮。"</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"不用了"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"固定"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"已固定屏幕"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 09d5ae7..880380a 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -254,7 +254,7 @@
<string name="permgrouplab_storage" msgid="1971118770546336966">"儲存空間"</string>
<string name="permgroupdesc_storage" product="nosdcard" msgid="7442318502446874999">"存取 USB 儲存裝置。"</string>
<string name="permgroupdesc_storage" product="default" msgid="9203302214915355774">"存取 SD 卡。"</string>
- <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"協助工具功能"</string>
+ <string name="permgrouplab_accessibilityFeatures" msgid="7919025602283593907">"無障礙功能"</string>
<string name="permgroupdesc_accessibilityFeatures" msgid="4205196881678144335">"輔助技術可要求的功能。"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"擷取視窗內容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"檢查您使用中的視窗內容。"</string>
@@ -336,8 +336,8 @@
<string name="permdesc_dump" msgid="1778299088692290329">"允許應用程式擷取系統內部狀態。惡意應用程式可能會擷取他們通常不需要的各類私密資訊。"</string>
<string name="permlab_retrieve_window_content" msgid="8022588608994589938">"取得螢幕內容"</string>
<string name="permdesc_retrieve_window_content" msgid="3193269069469700265">"允許應用程式擷取使用中的視窗內容。惡意應用程式可能會擷取整個視窗的內容,以及檢視密碼除外的所有文字。"</string>
- <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"暫時啟用協助工具"</string>
- <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"允許應用程式在裝置上暫時啟用協助工具。惡意應用程式可能藉此在未經使用者同意的情況下擅自啟用協助工具。"</string>
+ <string name="permlab_temporary_enable_accessibility" msgid="2312612135127310254">"暫時啟用無障礙功能"</string>
+ <string name="permdesc_temporary_enable_accessibility" msgid="8079456293182975464">"允許應用程式在裝置上暫時啟用無障礙功能。惡意應用程式可能藉此在未經使用者同意的情況下擅自啟用無障礙功能。"</string>
<string name="permlab_retrieveWindowToken" msgid="7154762602367758602">"擷取視窗憑證"</string>
<string name="permdesc_retrieveWindowToken" msgid="668173747687795074">"允許應用程式擷取視窗憑證。惡意應用程式可能會在未經授權的情況下,與冒充系統的應用程式視窗互動。"</string>
<string name="permlab_frameStats" msgid="7056374987314361639">"擷取畫格統計資料"</string>
@@ -391,8 +391,8 @@
<string name="permdesc_readInputState" msgid="8387754901688728043">"允許應用程式監看您的按鍵操作,包括使用其他應用程式時的按鍵操作 (例如輸入密碼) (不建議一般應用程式使用)。"</string>
<string name="permlab_bindInputMethod" msgid="3360064620230515776">"限定輸入法"</string>
<string name="permdesc_bindInputMethod" msgid="3250440322807286331">"允許應用程式繫結至輸入法的頂層介面 (不建議一般應用程式使用)。"</string>
- <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"繫結至協助工具服務"</string>
- <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"允許應用程式繫結至協助工具服務的頂層介面 (不建議一般應用程式使用)。"</string>
+ <string name="permlab_bindAccessibilityService" msgid="5357733942556031593">"繫結至無障礙服務"</string>
+ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"允許應用程式繫結至無障礙服務的頂層介面 (不建議一般應用程式使用)。"</string>
<string name="permlab_bindPrintService" msgid="8462815179572748761">"繫結至列印服務"</string>
<string name="permdesc_bindPrintService" msgid="7960067623209111135">"允許應用程式繫結至列印服務的頂層介面 (不建議一般應用程式使用)。"</string>
<string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"繫結至列印多工緩衝處理器服務"</string>
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"修改自己的聯絡資料"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"允許應用程式新增或更改裝置上儲存的個人資料,例如您的姓名和聯絡資訊。這表示應用程式可以識別您的身份,並將您的個人資料傳送給他人。"</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"身體感應器 (例如心跳監視器)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"允許應用程式存取用於測量身體狀況感應器的資料,例如心跳。"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"允許應用程式存取感應器所收集的資料 (這類感應器可監測您的體能狀態,例如您的心跳速率)。"</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"讀取您的社交串流"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"允許應用程式存取並同步處理您和好友的最新動態。當您分享資訊時,請務必小心,因為這項權限允許應用程式讀取您和好友在社交網絡上的私人通訊,不論是否機密。注意:這項權限可能不適用於所有社交網絡。"</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"寫入您的社交串流"</string>
@@ -1428,7 +1428,7 @@
<string name="forward_intent_to_work" msgid="621480743856004612">"您目前透過公司檔案使用這個應用程式"</string>
<string name="input_method_binding_label" msgid="1283557179944992649">"輸入法"</string>
<string name="sync_binding_label" msgid="3687969138375092423">"同步處理"</string>
- <string name="accessibility_binding_label" msgid="4148120742096474641">"協助工具"</string>
+ <string name="accessibility_binding_label" msgid="4148120742096474641">"無障礙功能"</string>
<string name="wallpaper_binding_label" msgid="1240087844304687662">"桌布"</string>
<string name="chooser_wallpaper" msgid="7873476199295190279">"變更桌布"</string>
<string name="notification_listener_binding_label" msgid="2014162835481906429">"通知接聽器"</string>
@@ -1631,9 +1631,9 @@
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"移除"</string>
<string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"要調高音量 (比建議的音量更大聲) 嗎?\n\n長時間聆聽高分貝音量可能會導致您的聽力受損。"</string>
- <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"以兩隻手指按住不放,即可啟用協助工具。"</string>
- <string name="accessibility_enabled" msgid="1381972048564547685">"協助工具已啟用。"</string>
- <string name="enable_accessibility_canceled" msgid="3833923257966635673">"協助工具已取消。"</string>
+ <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"以兩隻手指按住不放,即可啟用無障礙功能。"</string>
+ <string name="accessibility_enabled" msgid="1381972048564547685">"無障礙功能已啟用。"</string>
+ <string name="enable_accessibility_canceled" msgid="3833923257966635673">"無障礙功能已取消。"</string>
<string name="user_switched" msgid="3768006783166984410">"目前的使用者是<xliff:g id="NAME">%1$s</xliff:g>。"</string>
<string name="user_switching_message" msgid="2871009331809089783">"正在切換至<xliff:g id="NAME">%1$s</xliff:g>…"</string>
<string name="owner_name" msgid="2716755460376028154">"擁有者"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"已選取<xliff:g id="ITEM">%1$s</xliff:g>"</string>
<string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> 已刪除"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"公司<xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"如要取消固定這個畫面,請同時輕觸並按住 [返回] 和 [概覽]。"</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"如要取消固定這個畫面,請輕觸並按住 [概覽]。"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"螢幕已固定,而您的機構不允許取消固定。"</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"使用螢幕固定功能?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"螢幕鎖定功能可鎖定螢幕,讓單一畫面持續顯示。\n\n如要取消固定單一畫面,請同時輕觸並按住 [返回] 和 [概覽]。"</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"螢幕鎖定功能可鎖定螢幕,讓單一畫面持續顯示。\n\n如要取消固定單一畫面,請輕觸並按住 [概覽]。"</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"不用了,謝謝"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"啟動"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"螢幕已固定"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 80ed358..70cb87e 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"修改自己的聯絡資訊"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"允許應用程式新增或變更裝置上儲存的個人資料,例如您的姓名和聯絡資訊。這項設定可讓應用程式識別您的身分,並可能將您的個人資料傳送給他人。"</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"身體感應器 (例如心律監測器)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"允許應用程式存取感應器從您的身體測得的資料,例如心跳頻率。"</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"允許應用程式存取感測器所收集的資料 (這類感測器可監測您的體能狀態,例如您的心跳速率)。"</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"讀取您的社交串流"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"允許應用程式存取並同步處理您和好友的最新動態。因此,當您分享資訊時請小心,因為這項權限可讓應用程式讀取您和好友在社交網路上的私人通訊,包括機密通訊。注意:並非所有社交網路皆適用於這項權限。"</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"寫入您的社交串流"</string>
@@ -1757,16 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"已選取 <xliff:g id="ITEM">%1$s</xliff:g>"</string>
<string name="deleted_key" msgid="7659477886625566590">"已刪除 <xliff:g id="KEY">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"公司<xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
- <skip />
- <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
- <skip />
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"如要取消固定這個畫面,請同時輕觸並按住返回按鈕和總覽按鈕。"</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"如要取消固定這個畫面,請輕觸並按住總覽按鈕。"</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"螢幕已固定,且貴機構不允許取消固定。"</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"使用螢幕固定功能?"</string>
- <!-- no translation found for lock_to_app_description (4120623404152035221) -->
- <skip />
- <!-- no translation found for lock_to_app_description_accessible (199664191087836099) -->
- <skip />
+ <string name="lock_to_app_description" msgid="4120623404152035221">"螢幕固定功能可鎖定螢幕,讓單一畫面持續顯示。\n\n如要取消固定單一畫面,請同時輕觸並按住返回按鈕和總覽按鈕。"</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"螢幕固定功能可鎖定螢幕,讓單一畫面持續顯示。\n\n如要取消固定單一畫面,請輕觸並按住總覽按鈕。"</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"不用了,謝謝"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"啟動"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"已固定螢幕"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index c5e8c49..65bd617 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -494,7 +494,7 @@
<string name="permlab_writeProfile" msgid="907793628777397643">"guqula ikhadi lakho lokuxhumana"</string>
<string name="permdesc_writeProfile" product="default" msgid="5552084294598465899">"Ivumela uhlelo lokusebenza ukushintsha noma ingeze ulwazi lomuntu siqu lwephrofayela olulondolozwe kudivayisi yakho, njengegama lakho kanye nolwazi lokuxhumana. Lokhu kuchaza ukuthi ezinye izinhlelo zokusebenza zingakuhlonza bese zithumelela abanye ulwazi lephrofayela yakho."</string>
<string name="permlab_bodySensors" msgid="4871091374767171066">"izinzwa zomzimba (njengeziqaphi zokulinganisela inhliziyo)"</string>
- <string name="permdesc_bodySensors" product="default" msgid="2998865085124153531">"Ivumela uhlelo lokusebenza ukuze lufinyelele kudatha esuka kuzinzwa ozisebenzisayo ukuze lulinganise ukuthi kwenzakalani phakathi komzimba wakho, njengokulinganisela kwenhliziyo."</string>
+ <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Ivumela uhlelo lokusebenza ukuthi lufinyelele kudatha kusukela kuzinzwa eziqapha isimo sakho somzimba, esifana nesilinganiso senhliziyo yakho."</string>
<string name="permlab_readSocialStream" product="default" msgid="1268920956152419170">"funda ngezindlela zakho zokuxhumana nabanye abantu"</string>
<string name="permdesc_readSocialStream" product="default" msgid="4255706027172050872">"Ivumela uhlelo lokusebenza ukufinyelela nokuvumelanisa izibuyekezo zomphakathi ezivela kuwe nakubangani bakho. Qaphela uma waba ulwazi -- lokhu kuvumela uhlelo lokusebenza ukufunda ukuxhumana phakathi kwakho nabangani bakho kumanethiwekhi omphakathi, ngaphandle kokugcinwa kuyimfihlo. Qaphela: le mvume ingaphoqelelwa kuwo onke amanethiwekhi omphakathi."</string>
<string name="permlab_writeSocialStream" product="default" msgid="3504179222493235645">"bhala indlela yakho yokuxhumana nabantu"</string>
@@ -1757,12 +1757,12 @@
<string name="item_is_selected" msgid="949687401682476608">"I-<xliff:g id="ITEM">%1$s</xliff:g> ekhethiwe"</string>
<string name="deleted_key" msgid="7659477886625566590">"I-<xliff:g id="KEY">%1$s</xliff:g> isusiwe"</string>
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Umsebenzi <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="7570091317001980053">"Ukuze ususe ukuphina kulesi sikrini, thinta uphinde ubambe i-Emuva ne-Ukubuka konke ngesikhathi esisodwa."</string>
- <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Ukuze ususe ukuphina lesi sikrini, thinta uphinde ubambe Ukubuka konke."</string>
+ <string name="lock_to_app_toast" msgid="7570091317001980053">"Ukuze ususe ukuphina kulesi sikrini, thinta uphinde ubambe i-Emuva ne-Buka konke ngesikhathi esisodwa."</string>
+ <string name="lock_to_app_toast_accessible" msgid="8239120109365070664">"Ukuze ususe ukuphina lesi sikrini, thinta uphinde ubambe Buka konke."</string>
<string name="lock_to_app_toast_locked" msgid="8739004135132606329">"Isikrini siphiniwe. Ukususa ukuphina akuvumelekile inhlangano yakho."</string>
<string name="lock_to_app_title" msgid="1682643873107812874">"Sebenzisa ukuphina isikrini?"</string>
- <string name="lock_to_app_description" msgid="4120623404152035221">"Ukuphina isikrini kukhiyela isibonisi ekubukeni okukodwa.\n\nUkuze ususe ukuphina, thinta uphinde ubambe i-Ngemuva ne-Ukubuka konke ngesikhathi esisodwa."</string>
- <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Ukuphina isikrini kukhiya isikrini ngokubuka okukodwa.\n\nUkuze ususe ukuphina, thinta uphinde ubambe Ukubuka konke."</string>
+ <string name="lock_to_app_description" msgid="4120623404152035221">"Ukuphina isikrini kukhiyela isibonisi ekubukeni okukodwa.\n\nUkuze ususe ukuphina, thinta uphinde ubambe i-Ngemuva ne-Buka konke ngesikhathi esisodwa."</string>
+ <string name="lock_to_app_description_accessible" msgid="199664191087836099">"Ukuphina isikrini kukhiya isikrini ngokubuka okukodwa.\n\nUkuze ususe ukuphina, thinta uphinde ubambe Buka konke."</string>
<string name="lock_to_app_negative" msgid="2259143719362732728">"CHA, NGIYABONGA"</string>
<string name="lock_to_app_positive" msgid="7085139175671313864">"QALA"</string>
<string name="lock_to_app_start" msgid="6643342070839862795">"Isikrini siphiniwe"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 747cb14..7b4df49 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -4911,7 +4911,7 @@
<!-- Y coordinate of the origin of the gradient within the shape. -->
<attr name="centerY" format="float|fraction" />
<!-- Radius of the gradient, used only with radial gradient. -->
- <attr name="gradientRadius" format="float|fraction" />
+ <attr name="gradientRadius" format="float|fraction|dimension" />
</declare-styleable>
<!-- Used to fill the shape of GradientDrawable with a solid color. -->
@@ -5702,6 +5702,17 @@
<attr name="reparent" format="boolean"/>
</declare-styleable>
+ <!-- Use <code>changeBounds</code>as the root tag of the XML resource that
+ describes a {@link android.transition.ChangeBounds} transition.
+ The attributes of the {@link android.R.styleable#Transition Transition}
+ resource are available in addition to the specific attributes of ChangeBounds
+ described here. -->
+ <declare-styleable name="ChangeBounds">
+ <!-- Resize the view by adjusting the clipBounds rather than changing the
+ dimensions of the view itself. The default value is false. -->
+ <attr name="resizeClip" format="boolean"/>
+ </declare-styleable>
+
<!-- Use <code>transitionManager</code> as the root tag of the XML resource that
describes a {@link android.transition.TransitionManager
TransitionManager}. -->
diff --git a/core/res/res/values/bools.xml b/core/res/res/values/bools.xml
index 18e4f2f..457131a 100644
--- a/core/res/res/values/bools.xml
+++ b/core/res/res/values/bools.xml
@@ -18,7 +18,6 @@
<bool name="kg_enable_camera_default_widget">true</bool>
<bool name="kg_center_small_widgets_vertically">false</bool>
<bool name="kg_top_align_page_shrink_on_bouncer_visible">true</bool>
- <bool name="kg_show_ime_at_screen_on">true</bool>
<bool name="action_bar_embed_tabs">true</bool>
<bool name="action_bar_embed_tabs_pre_jb">false</bool>
<bool name="split_action_bar_is_narrow">true</bool>
diff --git a/core/res/res/values/colors_material.xml b/core/res/res/values/colors_material.xml
index 5773b94..46ec838 100644
--- a/core/res/res/values/colors_material.xml
+++ b/core/res/res/values/colors_material.xml
@@ -22,7 +22,7 @@
<color name="background_floating_material_light">#ffeeeeee</color>
<color name="primary_material_dark">#ff212121</color>
- <color name="primary_material_light">#ffbdbdbd</color>
+ <color name="primary_material_light">#ffe0e0e0</color>
<color name="primary_dark_material_dark">#ff000000</color>
<color name="primary_dark_material_light">#ff757575</color>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index a0ac3af..e50eb0c 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -390,7 +390,7 @@
<integer translatable="false" name="config_wifi_framework_scan_interval">300000</integer>
<!-- Integer indicating associated partial scan interval in milliseconds -->
- <integer translatable="false" name="config_wifi_framework_associated_scan_interval">10000</integer>
+ <integer translatable="false" name="config_wifi_framework_associated_scan_interval">20000</integer>
<!-- Integer indicating associated full scan backoff, representing a fraction: xx/8 -->
<integer translatable="false" name="config_wifi_framework_associated_full_scan_backoff">12</integer>
@@ -453,6 +453,26 @@
<!-- If this is true, key chords can be used to take a screenshot on the device. -->
<bool name="config_enableScreenshotChord">true</bool>
+ <!-- If this is true, allow wake from theater mode when plugged in or unplugged. -->
+ <bool name="config_allowTheaterModeWakeFromUnplug">false</bool>
+ <!-- If this is true, allow wake from theater mode from gesture. -->
+ <bool name="config_allowTheaterModeWakeFromGesture">false</bool>
+ <!-- If this is true, allow wake from theater mode from camera lens cover is switched. -->
+ <bool name="config_allowTheaterModeWakeFromCameraLens">false</bool>
+ <!-- If this is true, allow wake from theater mode from power key press. -->
+ <bool name="config_allowTheaterModeWakeFromPowerKey">true</bool>
+ <!-- If this is true, allow wake from theater mode from regular key press. Setting this value to
+ true implies config_allowTheaterModeWakeFromPowerKey is also true-->
+ <bool name="config_allowTheaterModeWakeFromKey">false</bool>
+ <!-- If this is true, allow wake from theater mode from motion. -->
+ <bool name="config_allowTheaterModeWakeFromMotion">false</bool>
+ <!-- If this is true, allow wake from theater mode from lid switch. -->
+ <bool name="config_allowTheaterModeWakeFromLidSwitch">false</bool>
+ <!-- If this is true, allow wake from theater mode when docked. -->
+ <bool name="config_allowTheaterModeWakeFromDock">false</bool>
+ <!-- If this is true, allow wake from theater mode from window layout flag. -->
+ <bool name="config_allowTheaterModeWakeFromWindowLayout">false</bool>
+
<!-- Auto-rotation behavior -->
<!-- If true, enables auto-rotation features using the accelerometer.
@@ -1767,13 +1787,21 @@
be disabled) but individual Features can be disabled using ImsConfig.setFeatureValue() -->
<bool name="imsServiceAllowTurnOff">true</bool>
- <!-- Flag specifying whether VoLTE & VT is availasble on device -->
- <bool name="config_device_volte_vt_available">false</bool>
+ <!-- Flag specifying whether VoLTE is available on device -->
+ <bool name="config_device_volte_available">false</bool>
- <!-- Flag specifying whether VoLTE & VT should be available for carrier: independent of
+ <!-- Flag specifying whether VoLTE should be available for carrier: independent of
carrier provisioning. If false: hard disabled. If true: then depends on carrier
provisioning, availability etc -->
- <bool name="config_carrier_volte_vt_available">false</bool>
+ <bool name="config_carrier_volte_available">false</bool>
+
+ <!-- Flag specifying whether VT is available on device -->
+ <bool name="config_device_vt_available">false</bool>
+
+ <!-- Flag specifying whether VT should be available for carrier: independent of
+ carrier provisioning. If false: hard disabled. If true: then depends on carrier
+ provisioning, availability etc -->
+ <bool name="config_carrier_vt_available">false</bool>
<bool name="config_networkSamplingWakesDevice">true</bool>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 7568252..45208ab 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2589,5 +2589,6 @@
<!-- @hide -->
<public-padding type="attr" name="private_resource_pad" end="0x01010500" />
+ <public type="attr" name="resizeClip"/>
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 3d30792..56cf56d 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1449,9 +1449,8 @@
<string name="permlab_bodySensors">body sensors (like heart rate monitors)
</string>
<!-- Description of the body sensors permission, listed so the user can decide whether to allow the application to access data from body sensors. [CHAR LIMIT=NONE] -->
- <string name="permdesc_bodySensors" product="default">Allows the app to
- access data from sensors you use to measure what’s happening inside your
- body, such as heart rate.</string>
+ <string name="permdesc_bodySensors" product="default">Allows the app to access data from sensors
+ that monitor your physical condition, such as your heart rate.</string>
<!-- Title of the read social stream permission, listed so the user can decide whether to allow the application to read information from the user's social stream. [CHAR LIMIT=30] -->
<string name="permlab_readSocialStream" product="default">read your social stream</string>
diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml
index f9fca00..6e03b3d 100644
--- a/core/res/res/values/styles_material.xml
+++ b/core/res/res/values/styles_material.xml
@@ -320,49 +320,47 @@
<item name="textColor">?attr/textColorPrimaryDisableOnly</item>
</style>
- <style name="TextAppearance.Material.Widget.ActionMode"/>
- <style name="TextAppearance.Material.Widget.ActionMode.Title"
- parent="TextAppearance.Material.Title">
- <item name="textSize">@dimen/text_size_title_material_toolbar</item>
- </style>
- <style name="TextAppearance.Material.Widget.ActionMode.Title.Inverse"
- parent="TextAppearance.Material.Title.Inverse">
- <item name="textSize">@dimen/text_size_title_material_toolbar</item>
- </style>
- <style name="TextAppearance.Material.Widget.ActionMode.Subtitle"
- parent="TextAppearance.Material.Subhead">
- <item name="textSize">@dimen/text_size_subtitle_material_toolbar</item>
- </style>
- <style name="TextAppearance.Material.Widget.ActionMode.Subtitle.Inverse"
- parent="TextAppearance.Material.Subhead.Inverse">
- <item name="textSize">@dimen/text_size_subtitle_material_toolbar</item>
- </style>
<style name="TextAppearance.Material.Widget.ActionBar.Title"
parent="TextAppearance.Material.Title">
<item name="textSize">@dimen/text_size_title_material_toolbar</item>
+ <item name="textColor">?attr/textColorPrimary</item>
</style>
<style name="TextAppearance.Material.Widget.ActionBar.Title.Inverse"
parent="TextAppearance.Material.Title.Inverse">
<item name="textSize">@dimen/text_size_title_material_toolbar</item>
+ <item name="textColor">?attr/textColorPrimaryInverse</item>
</style>
<style name="TextAppearance.Material.Widget.ActionBar.Subtitle"
parent="TextAppearance.Material.Subhead">
<item name="textSize">@dimen/text_size_subtitle_material_toolbar</item>
+ <item name="textColor">?attr/textColorSecondary</item>
</style>
<style name="TextAppearance.Material.Widget.ActionBar.Subtitle.Inverse"
parent="TextAppearance.Material.Subhead.Inverse">
<item name="textSize">@dimen/text_size_subtitle_material_toolbar</item>
+ <item name="textColor">?attr/textColorSecondaryInverse</item>
</style>
- <style name="TextAppearance.Material.Widget.ActionBar.Menu" parent="TextAppearance.Material.Menu">
+ <style name="TextAppearance.Material.Widget.ActionBar.Menu"
+ parent="TextAppearance.Material.Menu">
+ <item name="textColor">?attr/actionMenuTextColor</item>
+ <item name="textAllCaps">@bool/config_actionMenuItemAllCaps</item>
+ </style>
+ <style name="TextAppearance.Material.Widget.ActionBar.Menu.Inverse"
+ parent="TextAppearance.Material.Menu.Inverse">
<item name="textColor">?attr/actionMenuTextColor</item>
<item name="textAllCaps">@bool/config_actionMenuItemAllCaps</item>
</style>
- <style name="TextAppearance.Material.Widget.ActionBar.Menu.Inverse" parent="TextAppearance.Material.Menu.Inverse">
- <item name="textColor">?attr/actionMenuTextColor</item>
- <item name="textAllCaps">@bool/config_actionMenuItemAllCaps</item>
- </style>
+ <style name="TextAppearance.Material.Widget.ActionMode"/>
+ <style name="TextAppearance.Material.Widget.ActionMode.Title"
+ parent="TextAppearance.Material.Widget.ActionBar.Title" />
+ <style name="TextAppearance.Material.Widget.ActionMode.Title.Inverse"
+ parent="TextAppearance.Material.Widget.ActionBar.Title.Inverse" />
+ <style name="TextAppearance.Material.Widget.ActionMode.Subtitle"
+ parent="TextAppearance.Material.Widget.ActionBar.Subtitle" />
+ <style name="TextAppearance.Material.Widget.ActionMode.Subtitle.Inverse"
+ parent="TextAppearance.Material.Widget.ActionBar.Subtitle.Inverse" />
<style name="TextAppearance.Material.Widget.Toolbar.Title"
parent="TextAppearance.Material.Widget.ActionBar.Title" />
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 71f0642..a11fdbc 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1571,6 +1571,15 @@
<java-symbol type="bool" name="config_enableNetworkLocationOverlay" />
<java-symbol type="bool" name="config_sf_limitedAlpha" />
<java-symbol type="bool" name="config_unplugTurnsOnScreen" />
+ <java-symbol type="bool" name="config_allowTheaterModeWakeFromUnplug" />
+ <java-symbol type="bool" name="config_allowTheaterModeWakeFromGesture" />
+ <java-symbol type="bool" name="config_allowTheaterModeWakeFromCameraLens" />
+ <java-symbol type="bool" name="config_allowTheaterModeWakeFromPowerKey" />
+ <java-symbol type="bool" name="config_allowTheaterModeWakeFromKey" />
+ <java-symbol type="bool" name="config_allowTheaterModeWakeFromMotion" />
+ <java-symbol type="bool" name="config_allowTheaterModeWakeFromLidSwitch" />
+ <java-symbol type="bool" name="config_allowTheaterModeWakeFromDock" />
+ <java-symbol type="bool" name="config_allowTheaterModeWakeFromWindowLayout" />
<java-symbol type="bool" name="config_wifi_background_scan_support" />
<java-symbol type="bool" name="config_wifi_dual_band_support" />
<java-symbol type="bool" name="config_wimaxEnabled" />
@@ -2031,8 +2040,10 @@
<java-symbol type="attr" name="preferenceFragmentStyle" />
<java-symbol type="bool" name="skipHoldBeforeMerge" />
<java-symbol type="bool" name="imsServiceAllowTurnOff" />
- <java-symbol type="bool" name="config_device_volte_vt_available" />
- <java-symbol type="bool" name="config_carrier_volte_vt_available" />
+ <java-symbol type="bool" name="config_device_volte_available" />
+ <java-symbol type="bool" name="config_carrier_volte_available" />
+ <java-symbol type="bool" name="config_device_vt_available" />
+ <java-symbol type="bool" name="config_carrier_vt_available" />
<java-symbol type="bool" name="useImsAlwaysForEmergencyCall" />
<java-symbol type="attr" name="touchscreenBlocksFocus" />
<java-symbol type="layout" name="resolver_list_with_default" />
diff --git a/core/res/res/values/themes_micro.xml b/core/res/res/values/themes_micro.xml
index 7e0467b..f1bc5da 100644
--- a/core/res/res/values/themes_micro.xml
+++ b/core/res/res/values/themes_micro.xml
@@ -24,6 +24,8 @@
<item name="windowBackground">@color/black</item>
<item name="windowContentOverlay">@null</item>
<item name="windowIsFloating">false</item>
+ <!-- We need the windows to be translucent for SwipeToDismiss layout
+ to work properly. -->
<item name="windowIsTranslucent">true</item>
<item name="windowSwipeToDismiss">true</item>
</style>
@@ -38,6 +40,8 @@
<item name="windowBackground">@color/white</item>
<item name="windowContentOverlay">@null</item>
<item name="windowIsFloating">false</item>
+ <!-- We need the windows to be translucent for SwipeToDismiss layout
+ to work properly. -->
<item name="windowIsTranslucent">true</item>
<item name="windowSwipeToDismiss">true</item>
</style>
diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestBase.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestBase.java
index 80d5668..64fed7f 100644
--- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestBase.java
+++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestBase.java
@@ -49,7 +49,8 @@
*/
public class ConnectivityManagerTestBase extends InstrumentationTestCase {
- private static final String PING_IP_ADDR = "8.8.8.8";
+ private static final String[] PING_HOST_LIST = {
+ "www.google.com", "www.yahoo.com", "www.bing.com", "www.facebook.com", "www.ask.com"};
protected static final int WAIT_FOR_SCAN_RESULT = 10 * 1000; //10 seconds
protected static final int WIFI_SCAN_TIMEOUT = 50 * 1000; // 50 seconds
@@ -281,22 +282,14 @@
}
/**
- * @param pingServerList a list of servers that can be used for ping test, can be null
* @return true if the ping test is successful, false otherwise.
*/
- protected boolean pingTest(String[] pingServerList) {
- String[] hostList = {"www.google.com", "www.yahoo.com",
- "www.bing.com", "www.facebook.com", "www.ask.com"};
- if (pingServerList != null) {
- hostList = pingServerList;
- }
-
+ protected boolean pingTest() {
long startTime = System.currentTimeMillis();
while ((System.currentTimeMillis() - startTime) < PING_TIMER) {
try {
// assume the chance that all servers are down is very small
- for (int i = 0; i < hostList.length; i++ ) {
- String host = hostList[i];
+ for (String host : PING_HOST_LIST) {
logv("Start ping test, ping " + host);
Process p = Runtime.getRuntime().exec("ping -c 10 -w 100 " + host);
int status = p.waitFor();
@@ -312,6 +305,7 @@
} catch (InterruptedException e) {
logv("Ping test Fail: InterruptedException");
}
+ SystemClock.sleep(SHORT_TIMEOUT);
}
// ping test timeout
return false;
@@ -458,14 +452,7 @@
// use ping request against Google public DNS to verify connectivity
protected boolean checkNetworkConnectivity() {
assertTrue("no active network connection", waitForActiveNetworkConnection(LONG_TIMEOUT));
- try {
- Process proc = Runtime.getRuntime().exec(new String[]{
- "/system/bin/ping", "-W", "30", "-c", "1", PING_IP_ADDR});
- return proc.waitFor() == 0;
- } catch (InterruptedException | IOException e) {
- Log.e(mLogTag, "Ping failed", e);
- }
- return false;
+ return pingTest();
}
@Override
diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/ConnectivityManagerMobileTest.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/ConnectivityManagerMobileTest.java
index d5051df..2d291ff 100644
--- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/ConnectivityManagerMobileTest.java
+++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/functional/ConnectivityManagerMobileTest.java
@@ -72,16 +72,6 @@
super.tearDown();
}
- // help function to verify 3G connection
- public void verifyCellularConnection() {
- NetworkInfo extraNetInfo = mCm.getActiveNetworkInfo();
- assertEquals("network type is not MOBILE", ConnectivityManager.TYPE_MOBILE,
- extraNetInfo.getType());
- assertTrue("not connected to cellular network", extraNetInfo.isConnected());
- }
-
-
-
// Test case 1: Test enabling Wifi without associating with any AP, no broadcast on network
// event should be expected.
@LargeTest
@@ -336,4 +326,12 @@
assertTrue("wifi state not disabled", waitForWifiState(
WifiManager.WIFI_STATE_DISABLED, LONG_TIMEOUT));
}
+
+ // help function to verify 3G connection
+ private void verifyCellularConnection() {
+ NetworkInfo extraNetInfo = mCm.getActiveNetworkInfo();
+ assertEquals("network type is not MOBILE", ConnectivityManager.TYPE_MOBILE,
+ extraNetInfo.getType());
+ assertTrue("not connected to cellular network", extraNetInfo.isConnected());
+ }
}
diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiApStress.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiApStress.java
index 41f01e6..de934b9 100644
--- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiApStress.java
+++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiApStress.java
@@ -112,7 +112,7 @@
} catch (Exception e) {
// ignore
}
- assertTrue("no uplink data connection after Wi-Fi tethering", pingTest(null));
+ assertTrue("no uplink data connection after Wi-Fi tethering", pingTest());
// disable wifi hotspot
assertTrue("failed to disable wifi hotspot",
mWifiManager.setWifiApEnabled(config, false));
diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java
index fbd4669..f3d5c87 100644
--- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java
+++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java
@@ -216,7 +216,7 @@
assertTrue("wifi not connected", waitForNetworkState(ConnectivityManager.TYPE_WIFI,
State.CONNECTED, WIFI_CONNECTION_TIMEOUT));
// Run ping test to verify the data connection
- assertTrue("Wi-Fi is connected, but no data connection.", pingTest(null));
+ assertTrue("Wi-Fi is connected, but no data connection.", pingTest());
long i, sum = 0, avgReconnectTime = 0;
for (i = 1; i <= mReconnectIterations; i++) {
@@ -264,7 +264,7 @@
} else {
assertEquals("mobile not connected", State.CONNECTED,
mCm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState());
- assertTrue("no connectivity over mobile", pingTest(null));
+ assertTrue("no connectivity over mobile", pingTest());
}
// Turn screen on again
@@ -281,7 +281,7 @@
avgReconnectTime = sum / i;
logv("average reconnection time is: " + avgReconnectTime);
- assertTrue("Reconnect to Wi-Fi network, but no data connection.", pingTest(null));
+ assertTrue("Reconnect to Wi-Fi network, but no data connection.", pingTest());
}
Bundle result = new Bundle();
result.putLong("actual-iterations", i - 1);
diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml
index b524177..226717e 100644
--- a/core/tests/coretests/AndroidManifest.xml
+++ b/core/tests/coretests/AndroidManifest.xml
@@ -1252,6 +1252,13 @@
</intent-filter>
</activity>
+ <activity android:name="android.content.res.ResourceCacheActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" />
+ </intent-filter>
+ </activity>
+
</application>
<instrumentation android:name="android.test.InstrumentationTestRunner"
diff --git a/core/tests/coretests/res/anim/reset_state_anim.xml b/core/tests/coretests/res/anim/reset_state_anim.xml
index 918d0a3..4bbbe62 100644
--- a/core/tests/coretests/res/anim/reset_state_anim.xml
+++ b/core/tests/coretests/res/anim/reset_state_anim.xml
@@ -1,4 +1,18 @@
<?xml version="1.0"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator android:propertyName="x" android:duration="100" android:valueTo="0" android:valueType="floatType"/>
<objectAnimator android:propertyName="y" android:duration="100" android:valueTo="0" android:valueType="floatType"/>
diff --git a/core/tests/coretests/res/anim/test_animator.xml b/core/tests/coretests/res/anim/test_animator.xml
new file mode 100644
index 0000000..49afc3f
--- /dev/null
+++ b/core/tests/coretests/res/anim/test_animator.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- if you change this, you should also change AnimatorInflaterTest#testLoadAnimator-->
+ <objectAnimator android:propertyName="x" android:duration="100" android:valueTo="0" android:valueType="floatType"/>
+ <objectAnimator android:propertyName="y" android:duration="100" android:valueTo="1" android:valueType="floatType"/>
+ <objectAnimator android:propertyName="left" android:duration="100" android:valueTo="2" android:valueType="intType"/>
+</set>
\ No newline at end of file
diff --git a/core/tests/coretests/res/anim/test_state_anim.xml b/core/tests/coretests/res/anim/test_state_anim.xml
index 9e08f68..b6a4822 100644
--- a/core/tests/coretests/res/anim/test_state_anim.xml
+++ b/core/tests/coretests/res/anim/test_state_anim.xml
@@ -1,4 +1,18 @@
<?xml version="1.0"?>
+<!-- Copyright (C) 2014 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="true">
<set>
diff --git a/core/tests/coretests/res/values-land/dimens.xml b/core/tests/coretests/res/values-land/dimens.xml
new file mode 100644
index 0000000..1ee9f1d
--- /dev/null
+++ b/core/tests/coretests/res/values-land/dimens.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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>
+ <dimen name="resource_cache_test_orientation_dependent">3dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/core/tests/coretests/res/values/dimens.xml b/core/tests/coretests/res/values/dimens.xml
new file mode 100644
index 0000000..00fc414
--- /dev/null
+++ b/core/tests/coretests/res/values/dimens.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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>
+ <dimen name="resource_cache_test_generic">10dp</dimen>
+ <dimen name="resource_cache_test_orientation_dependent">20dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/core/tests/coretests/src/android/animation/AnimatorInflaterTest.java b/core/tests/coretests/src/android/animation/AnimatorInflaterTest.java
new file mode 100644
index 0000000..3c81853
--- /dev/null
+++ b/core/tests/coretests/src/android/animation/AnimatorInflaterTest.java
@@ -0,0 +1,61 @@
+/*
+* Copyright (C) 2014 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.animation;
+
+import android.test.ActivityInstrumentationTestCase2;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import com.android.frameworks.coretests.R;
+
+public class AnimatorInflaterTest extends ActivityInstrumentationTestCase2<BasicAnimatorActivity> {
+ Set<Integer> identityHashes = new HashSet<Integer>();
+
+ public AnimatorInflaterTest() {
+ super(BasicAnimatorActivity.class);
+ }
+
+ private void assertUnique(Object object) {
+ assertUnique(object, "");
+ }
+
+ private void assertUnique(Object object, String msg) {
+ final int code = System.identityHashCode(object);
+ assertTrue("object should be unique " + msg + ", obj:" + object, identityHashes.add(code));
+
+ }
+
+ public void testLoadStateListAnimator() {
+ StateListAnimator sla1 = AnimatorInflater.loadStateListAnimator(getActivity(),
+ R.anim.test_state_anim);
+ sla1.setTarget(getActivity().mAnimatingButton);
+ StateListAnimator sla2 = AnimatorInflater.loadStateListAnimator(getActivity(),
+ R.anim.test_state_anim);
+ assertNull(sla2.getTarget());
+ for (StateListAnimator sla : new StateListAnimator[]{sla1, sla2}) {
+ assertUnique(sla);
+ assertEquals(3, sla.getTuples().size());
+ for (StateListAnimator.Tuple tuple : sla.getTuples()) {
+ assertUnique(tuple);
+ assertUnique(tuple.getAnimator());
+ }
+ }
+ }
+
+}
diff --git a/core/tests/coretests/src/android/animation/BasicAnimatorActivity.java b/core/tests/coretests/src/android/animation/BasicAnimatorActivity.java
index 93808d9..6bcf8fc 100644
--- a/core/tests/coretests/src/android/animation/BasicAnimatorActivity.java
+++ b/core/tests/coretests/src/android/animation/BasicAnimatorActivity.java
@@ -19,11 +19,14 @@
import android.app.Activity;
import android.os.Bundle;
+import android.widget.Button;
public class BasicAnimatorActivity extends Activity {
+ public Button mAnimatingButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.animator_basic);
+ mAnimatingButton = (Button) findViewById(R.id.animatingButton);
}
}
diff --git a/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java b/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java
new file mode 100644
index 0000000..e9fd5fb
--- /dev/null
+++ b/core/tests/coretests/src/android/content/res/ConfigurationBoundResourceCacheTest.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2014 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.content.res;
+
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.TypedValue;
+
+import com.android.frameworks.coretests.R;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+public class ConfigurationBoundResourceCacheTest
+ extends ActivityInstrumentationTestCase2<ResourceCacheActivity> {
+
+ ConfigurationBoundResourceCache<Float> mCache;
+
+ Method mCalcConfigChanges;
+
+ public ConfigurationBoundResourceCacheTest() {
+ super(ResourceCacheActivity.class);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mCache = new ConfigurationBoundResourceCache<Float>(getActivity().getResources());
+ }
+
+ public void testGetEmpty() {
+ assertNull(mCache.get(-1, null));
+ }
+
+ public void testSetGet() {
+ mCache.put(1, null, new DummyFloatConstantState(5f));
+ assertEquals(5f, mCache.get(1, null));
+ assertNotSame(5f, mCache.get(1, null));
+ assertEquals(null, mCache.get(1, getActivity().getTheme()));
+ }
+
+ public void testSetGetThemed() {
+ mCache.put(1, getActivity().getTheme(), new DummyFloatConstantState(5f));
+ assertEquals(null, mCache.get(1, null));
+ assertEquals(5f, mCache.get(1, getActivity().getTheme()));
+ assertNotSame(5f, mCache.get(1, getActivity().getTheme()));
+ }
+
+ public void testMultiThreadPutGet() {
+ mCache.put(1, getActivity().getTheme(), new DummyFloatConstantState(5f));
+ mCache.put(1, null, new DummyFloatConstantState(10f));
+ assertEquals(10f, mCache.get(1, null));
+ assertNotSame(10f, mCache.get(1, null));
+ assertEquals(5f, mCache.get(1, getActivity().getTheme()));
+ assertNotSame(5f, mCache.get(1, getActivity().getTheme()));
+ }
+
+ public void testVoidConfigChange()
+ throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+ TypedValue staticValue = new TypedValue();
+ long key = 3L;
+ final Resources res = getActivity().getResources();
+ res.getValue(R.dimen.resource_cache_test_generic, staticValue, true);
+ float staticDim = TypedValue.complexToDimension(staticValue.data, res.getDisplayMetrics());
+ mCache.put(key, getActivity().getTheme(),
+ new DummyFloatConstantState(staticDim, staticValue.changingConfigurations));
+ final Configuration cfg = res.getConfiguration();
+ Configuration newCnf = new Configuration(cfg);
+ newCnf.orientation = cfg.orientation == Configuration.ORIENTATION_LANDSCAPE ?
+ Configuration.ORIENTATION_PORTRAIT
+ : Configuration.ORIENTATION_LANDSCAPE;
+ int changes = calcConfigChanges(res, newCnf);
+ assertEquals(staticDim, mCache.get(key, getActivity().getTheme()));
+ mCache.onConfigurationChange(changes);
+ assertEquals(staticDim, mCache.get(key, getActivity().getTheme()));
+ }
+
+ public void testEffectiveConfigChange()
+ throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+ TypedValue changingValue = new TypedValue();
+ long key = 4L;
+ final Resources res = getActivity().getResources();
+ res.getValue(R.dimen.resource_cache_test_orientation_dependent, changingValue, true);
+ float changingDim = TypedValue.complexToDimension(changingValue.data,
+ res.getDisplayMetrics());
+ mCache.put(key, getActivity().getTheme(),
+ new DummyFloatConstantState(changingDim, changingValue.changingConfigurations));
+
+ final Configuration cfg = res.getConfiguration();
+ Configuration newCnf = new Configuration(cfg);
+ newCnf.orientation = cfg.orientation == Configuration.ORIENTATION_LANDSCAPE ?
+ Configuration.ORIENTATION_PORTRAIT
+ : Configuration.ORIENTATION_LANDSCAPE;
+ int changes = calcConfigChanges(res, newCnf);
+ assertEquals(changingDim, mCache.get(key, getActivity().getTheme()));
+ mCache.onConfigurationChange(changes);
+ assertNull(mCache.get(key, getActivity().getTheme()));
+ }
+
+ public void testConfigChangeMultipleResources()
+ throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+ TypedValue staticValue = new TypedValue();
+ TypedValue changingValue = new TypedValue();
+ final Resources res = getActivity().getResources();
+ res.getValue(R.dimen.resource_cache_test_generic, staticValue, true);
+ res.getValue(R.dimen.resource_cache_test_orientation_dependent, changingValue, true);
+ float staticDim = TypedValue.complexToDimension(staticValue.data, res.getDisplayMetrics());
+ float changingDim = TypedValue.complexToDimension(changingValue.data,
+ res.getDisplayMetrics());
+ mCache.put(R.dimen.resource_cache_test_generic, getActivity().getTheme(),
+ new DummyFloatConstantState(staticDim, staticValue.changingConfigurations));
+ mCache.put(R.dimen.resource_cache_test_orientation_dependent, getActivity().getTheme(),
+ new DummyFloatConstantState(changingDim, changingValue.changingConfigurations));
+ final Configuration cfg = res.getConfiguration();
+ Configuration newCnf = new Configuration(cfg);
+ newCnf.orientation = cfg.orientation == Configuration.ORIENTATION_LANDSCAPE ?
+ Configuration.ORIENTATION_PORTRAIT
+ : Configuration.ORIENTATION_LANDSCAPE;
+ int changes = calcConfigChanges(res, newCnf);
+ assertEquals(staticDim, mCache.get(R.dimen.resource_cache_test_generic,
+ getActivity().getTheme()));
+ assertEquals(changingDim, mCache.get(R.dimen.resource_cache_test_orientation_dependent,
+ getActivity().getTheme()));
+ mCache.onConfigurationChange(changes);
+ assertEquals(staticDim, mCache.get(R.dimen.resource_cache_test_generic,
+ getActivity().getTheme()));
+ assertNull(mCache.get(R.dimen.resource_cache_test_orientation_dependent,
+ getActivity().getTheme()));
+ }
+
+ public void testConfigChangeMultipleThemes()
+ throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+ TypedValue[] staticValues = new TypedValue[]{new TypedValue(), new TypedValue()};
+ TypedValue[] changingValues = new TypedValue[]{new TypedValue(), new TypedValue()};
+ float staticDim = 0;
+ float changingDim = 0;
+ final Resources res = getActivity().getResources();
+ for (int i = 0; i < 2; i++) {
+ res.getValue(R.dimen.resource_cache_test_generic, staticValues[i], true);
+ staticDim = TypedValue
+ .complexToDimension(staticValues[i].data, res.getDisplayMetrics());
+
+ res.getValue(R.dimen.resource_cache_test_orientation_dependent, changingValues[i],
+ true);
+ changingDim = TypedValue.complexToDimension(changingValues[i].data,
+ res.getDisplayMetrics());
+ final Resources.Theme theme = i == 0 ? getActivity().getTheme() : null;
+ mCache.put(R.dimen.resource_cache_test_generic, theme,
+ new DummyFloatConstantState(staticDim, staticValues[i].changingConfigurations));
+ mCache.put(R.dimen.resource_cache_test_orientation_dependent, theme,
+ new DummyFloatConstantState(changingDim,
+ changingValues[i].changingConfigurations));
+ }
+ final Configuration cfg = res.getConfiguration();
+ Configuration newCnf = new Configuration(cfg);
+ newCnf.orientation = cfg.orientation == Configuration.ORIENTATION_LANDSCAPE ?
+ Configuration.ORIENTATION_PORTRAIT
+ : Configuration.ORIENTATION_LANDSCAPE;
+ int changes = calcConfigChanges(res, newCnf);
+ for (int i = 0; i < 2; i++) {
+ final Resources.Theme theme = i == 0 ? getActivity().getTheme() : null;
+ assertEquals(staticDim, mCache.get(R.dimen.resource_cache_test_generic, theme));
+ assertEquals(changingDim,
+ mCache.get(R.dimen.resource_cache_test_orientation_dependent, theme));
+ }
+ mCache.onConfigurationChange(changes);
+ for (int i = 0; i < 2; i++) {
+ final Resources.Theme theme = i == 0 ? getActivity().getTheme() : null;
+ assertEquals(staticDim, mCache.get(R.dimen.resource_cache_test_generic, theme));
+ assertNull(mCache.get(R.dimen.resource_cache_test_orientation_dependent, theme));
+ }
+ }
+
+ private int calcConfigChanges(Resources resources, Configuration configuration)
+ throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
+ if (mCalcConfigChanges == null) {
+ mCalcConfigChanges = Resources.class.getDeclaredMethod("calcConfigChanges",
+ Configuration.class);
+ mCalcConfigChanges.setAccessible(true);
+ }
+ return (Integer) mCalcConfigChanges.invoke(resources, configuration);
+
+ }
+
+ static class DummyFloatConstantState extends
+ ConstantState<Float> {
+
+ final Float mObj;
+
+ int mChangingConf = 0;
+
+ DummyFloatConstantState(Float obj) {
+ mObj = obj;
+ }
+
+ DummyFloatConstantState(Float obj, int changingConf) {
+ mObj = obj;
+ mChangingConf = changingConf;
+ }
+
+ @Override
+ public int getChangingConfigurations() {
+ return mChangingConf;
+ }
+
+ @Override
+ public Float newInstance() {
+ return new Float(mObj);
+ }
+ }
+}
diff --git a/core/tests/coretests/src/android/content/res/ResourceCacheActivity.java b/core/tests/coretests/src/android/content/res/ResourceCacheActivity.java
new file mode 100644
index 0000000..f37e549
--- /dev/null
+++ b/core/tests/coretests/src/android/content/res/ResourceCacheActivity.java
@@ -0,0 +1,37 @@
+/*
+* Copyright (C) 2014 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.content.res;
+
+import android.annotation.Nullable;
+import android.app.Activity;
+import android.os.Bundle;
+
+import java.lang.ref.WeakReference;
+
+public class ResourceCacheActivity extends Activity {
+ static WeakReference<ResourceCacheActivity> lastCreatedInstance;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ lastCreatedInstance = new WeakReference<ResourceCacheActivity>(this);
+ }
+
+ public static ResourceCacheActivity getLastCreatedInstance() {
+ return lastCreatedInstance == null ? null : lastCreatedInstance.get();
+ }
+}
diff --git a/docs/html/about/about_toc.cs b/docs/html/about/about_toc.cs
index 95688a9..c025b61 100644
--- a/docs/html/about/about_toc.cs
+++ b/docs/html/about/about_toc.cs
@@ -7,7 +7,7 @@
</ul>
</li>
<li class="nav-section">
- <div class="nav-section-header"><a href="<?cs var:toroot ?>about/versions/android-5.0.html">
+ <div class="nav-section-header"><a href="<?cs var:toroot ?>about/versions/lollipop.html">
<span class="en">Lollipop</span></a></div>
<ul>
<li><a href="<?cs var:toroot ?>about/versions/android-5.0.html">Android 5.0 APIs</a></li>
@@ -39,23 +39,6 @@
</ul>
</li>
<li class="nav-section">
- <div class="nav-section-header"><a href="<?cs var:toroot ?>about/versions/android-3.0-highlights.html">
- <span class="en">Honeycomb</span></a></div>
- <ul>
- <li><a href="<?cs var:toroot ?>about/versions/android-3.2.html">Android 3.2 APIs</a></li>
- <li><a href="<?cs var:toroot ?>about/versions/android-3.1.html">Android 3.1 APIs</a></li>
- <li><a href="<?cs var:toroot ?>about/versions/android-3.0.html">Android 3.0 APIs</a> </li>
- </ul>
- </li>
- <li class="nav-section">
- <div class="nav-section-header"><a href="<?cs var:toroot ?>about/versions/android-2.3-highlights.html">
- <span class="en">Gingerbread</span></a></div>
- <ul>
- <li><a href="<?cs var:toroot ?>about/versions/android-2.3.4.html">Android 2.3.4 APIs</a></li>
- <li><a href="<?cs var:toroot ?>about/versions/android-2.3.3.html">Android 2.3.3 APIs</a></li>
- </ul>
- </li>
- <li class="nav-section">
<div class="nav-section-header empty"><a href="<?cs
var:toroot?>about/dashboards/index.html">Dashboards</a></div>
</li>
diff --git a/docs/html/about/versions/android-5.0.jd b/docs/html/about/versions/android-5.0.jd
index d9084b6..a438420 100644
--- a/docs/html/about/versions/android-5.0.jd
+++ b/docs/html/about/versions/android-5.0.jd
@@ -23,6 +23,7 @@
<li><a href="#BehaviorGetRecentTasks">If your app uses getRecentTasks()...</a></li>
<li><a href="#64BitSupport">If you are using the Android Native Development Kit (NDK)...</a></li>
<li><a href="#BindService">If your app binds to a Service...</a></li>
+<li><a href="#BehaviorWebView">If your app uses a WebView...</a></li>
</ol>
</li>
<li><a href="#UI">User Interface</a>
@@ -106,10 +107,10 @@
</li>
</ol>
-<h2>See also</h2>
+<h2>API Differences</h2>
<ol>
-<li><a href="{@docRoot}sdk/api_diff/21/changes.html">API
-Differences Report »</a> </li>
+<li><a href="{@docRoot}sdk/api_diff/21/changes.html">API level 20 to 21 »</a> </li>
+<li><a href="{@docRoot}sdk/api_diff/preview-21/changes.html">L Developer Preview to 21 »</a> </li>
</ol>
</div>
@@ -117,16 +118,32 @@
<p>API Level: {@sdkPlatformApiLevel}</p>
-<p>Android 5.0 (<a href="{@docRoot}reference/android/os/Build.VERSION_CODES.html#L">Lollipop</a>)
+<p>Android 5.0 (<a href="{@docRoot}reference/android/os/Build.VERSION_CODES.html#LOLLIPOP">LOLLIPOP</a>)
offers new features for users and app developers. This document provides an
introduction to the most notable new APIs.</p>
-<p>As an app developer, you should download the Android 5.0 system image and
-SDK platform from the <a href="{@docRoot}tools/help/sdk-manager.html">SDK Manager</a>
-as soon as possible. If you don’t have a device running Android 5.0 on which to
-test your app, use the Android 5.0 system image to test your app on the
-<a href="{@docRoot}tools/devices/emulator.html">Android emulator</a>. Then
-build your apps against the Android 5.0 platform to begin using the latest APIs.</p>
+<p>For a high-level look at the new platform features, instead
+see the
+<a href="{@docRoot}about/versions/lollipop.html">Android Lollipop
+highlights</a>.</p>
+
+
+<h3 id="Start">Start developing</h3>
+
+<p>To start building apps for Android 5.0, you must first <a href="{@docRoot}sdk/index.html">get
+the Android SDK</a>. Then use the <a href="{@docRoot}tools/help/sdk-manager.html">SDK Manager</a>
+to download the Android 5.0 SDK Platform and System Images.</p>
+
+<p style="
+ padding: 10px;
+ background: #eee;
+ width: 445px;
+ border: 1px solid #ccc;
+ margin-top: 20px;
+">To test your apps on a real device, flash a Nexus 5 or Nexus 7 with the <br>
+<a href="/preview/index.html#Start"><b>ANDROID PREVIEW SYSTEM IMAGE</b></a>.</p>
+
+
<h3 id="ApiLevel">Update your target API level</h3>
@@ -218,9 +235,11 @@
vibration.</p>
<p>Setting the device to
-{@link android.media.AudioManager#RINGER_MODE_SILENT RINGER_MODE_SILENT} now
-causes the device to enter the new priority mode. The device stays in priority
-mode when you leave silent mode.</p>
+{@link android.media.AudioManager#RINGER_MODE_SILENT RINGER_MODE_SILENT} causes
+the device to enter the new priority mode. The device leaves priority
+mode if you set it to
+{@link android.media.AudioManager#RINGER_MODE_NORMAL RINGER_MODE_NORMAL} or
+{@link android.media.AudioManager#RINGER_MODE_NORMAL RINGER_MODE_VIBRATE}.</p>
<p>Previously, Android used {@link android.media.AudioManager#STREAM_MUSIC STREAM_MUSIC}
as the master stream to control volume on tablet devices. In Android 5.0, the
@@ -242,15 +261,6 @@
{@link android.app.Notification#VISIBILITY_PUBLIC VISIBILITY_PUBLIC}.
</p>
-<div class="figure" style="width:320px">
- <img src="{@docRoot}images/android-5.0/hun-example.png"
- srcset="{@docRoot}images/android-5.0/hun-example@2x.png 2x"
- alt="" width="320" height="541" id="figure1" />
- <p class="img-caption">
- <strong>Figure 1.</strong> Fullscreen activity showing a heads-up notification
- </p>
-</div>
-
<h4 id="NotificationsMediaPlayback">Media playback</h4>
<p>If you are implementing notifications that present media playback
status or transport controls, consider using the new
@@ -357,6 +367,31 @@
To ensure your app is secure, use an explicit intent when starting or binding
your {@link android.app.Service}, and do not declare intent filters for the service.</p>
+<h3 id="BehaviorWebView">If your app uses WebView...</h3>
+
+<p>Android 5.0 changes the default behavior for your app.</p>
+<ul>
+<li><strong>If your app targets API level 21 or higher:</strong>
+ <ul>
+ <li>The system
+ blocks <a href="https://developer.mozilla.org/en-US/docs/Security/MixedContent"
+ class="external-link">mixed content</a> and third party cookies by default. To allow mixed
+ content and third party cookies, use the
+ {@link android.webkit.WebSettings#setMixedContentMode(int) setMixedContentMode()}
+and {@link android.webkit.CookieManager#setAcceptThirdPartyCookies(android.webkit.WebView, boolean) setAcceptThirdPartyCookies()}
+methods respectively.</li>
+ <li>The system now intelligently chooses portions of the HTML
+ document to draw. This new default behavior helps to reduce memory
+ footprint and increase performance. If you want to
+ render the whole document at once, disable this optimization by calling
+ {@link android.webkit.WebView#enableSlowWholeDocumentDraw()}.</li>
+ </ul>
+</li>
+<li><strong>If your app targets API levels lower than 21:</strong> The system
+ allows mixed content and third party cookies, and always renders the whole
+ document at once.</li>
+</ul>
+
<h2 id="UI">User Interface</h2>
<h3 id="MaterialDesign">Material design support</h3>
@@ -413,12 +448,9 @@
<a href="{@docRoot}reference/android/R.attr.html#persistableMode">android:persistableMode</a>
attribute. You can also change
the visual properties of an activity in the recents screen, such as the
-activity’s color, label, and icon. To do this, make sure the
-<a href="{@docRoot}reference/android/R.attr.html#relinquishTaskIdentity">android:relinquishTaskIdentity</a>
-attribute of the task’s root activity is set
-to {@code true}. You can then use the
+activity’s color, label, and icon, by calling the
{@link android.app.Activity#setTaskDescription(android.app.ActivityManager.TaskDescription) setTaskDescription()}
-method to set its appearance properties.</p>
+method.</p>
<h3 id="WebView">WebView updates</h3>
<p>Android 5.0 updates the {@link android.webkit.WebView}
@@ -464,7 +496,7 @@
method.</p>
<p>For an example of how to use the new APIs, see the {@code MediaProjectionDemo}
-class in the {@code ApiDemos} sample project.</p>
+class in the sample project.</p>
<h2 id="Notifications">Notifications</h2>
@@ -923,16 +955,6 @@
<h2 id="Enterprise">Android in the Workplace and in Education</h2>
<h3 id="ManagedProvisioning">Managed provisioning</h3>
-<div class="figure" style="width:360px">
- <img src="../../images/android-5.0/managed_apps_launcher.png"
- srcset="../../images/android-5.0/managed_apps_launcher@2x.png 2x"
- alt="" width="360" height="609" id="figure3" />
- <p class="img-caption">
- <strong>Figure 2.</strong> Launcher screen showing managed apps (marked with
- a lock badge)
- </p>
-</div>
-
<p>Android 5.0 provides new functionality for running apps within
an enterprise environment. A
<a href="{@docRoot}guide/topics/admin/device-admin.html">device administrator</a> can
@@ -1168,7 +1190,7 @@
<h3 id="Permissions">User permissions</h3>
-<p>The following permissions are now supported in the
+<p>The following permission is now supported in the
<a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">{@code <uses-permission>}</a>
element to declare the permissions your app requires to access certain APIs.</p>
@@ -1177,13 +1199,4 @@
level 21 and higher, this permission is required by a
<a href="{@docRoot}about/versions/android-4.2.html#Daydream">Daydream</a> service,
to ensure that only the system can bind to it.</li>
-
-<li>{@link android.Manifest.permission#READ_VOICEMAIL}: Required to allow your
- app to read voicemails in the system.</li>
-
-<li>{@link android.Manifest.permission#WRITE_VOICEMAIL}: Required to allow your
- app to modify and remove existing voicemails in the system.</li>
-</ul>
-
-<p class="note">For a detailed view of all API changes in Android 5.0, see the
-<a href="{@docRoot}sdk/api_diff/21/changes.html">API Differences Report</a>.</p>
+</ul>
\ No newline at end of file
diff --git a/docs/html/about/versions/lollipop.jd b/docs/html/about/versions/lollipop.jd
new file mode 100644
index 0000000..3ee0a86
--- /dev/null
+++ b/docs/html/about/versions/lollipop.jd
@@ -0,0 +1,286 @@
+page.title=Android Lollipop
+
+@jd:body
+
+
+
+
+
+
+
+
+
+
+ <div style="padding:0px 0px 0px 20px;float:right;margin:0 -10px 0 0">
+ <img src="{@docRoot}images/home/l-hero_2x.png" srcset="{@docRoot}images/home/l-hero.png 1x, {@docRoot}images/home/l-hero_2x.png 2x" width="460" height="300" >
+ </div>
+
+ <div class="landing-docs" style="float:right;clear:both;margin:68px 0 2em 3em;">
+ <div class="col-4 normal-links highlights" style="font-size:12px;">
+ <h3 id="thisd" >Key Developer Features</h3>
+ <ul style="list-style-type:none;">
+ <li><a href="#Material">Material design</a></li>
+ <li><a href="#Perf">Performance focus</a></li>
+ <li><a href="#Notifications">Notifications</a></li>
+ <li><a href="#TV">Your apps on the big screen</a></li>
+ <li><a href="#Documents">Document-centric apps</a></li>
+ <li><a href="#Connectivity">Advanced connectivity</a></li>
+ <li><a href="#Graphics">High-performance graphics</a></li>
+ <li><a href="#Audio">More powerful audio</a></li>
+ <li><a href="#Camera">Enhanced camera & video</a></li>
+ <li><a href="#Work">Android in the workplace</a></li>
+ <li><a href="#ScreenCapture">Screen capturing and sharing</a></li>
+ <li><a href="#Sensors">New types of sensors</a></li>
+ <li><a href="#WebView">Chromium WebView</a></li>
+ <li><a href="#Accessibility">Accessibility & input</a></li>
+ <li><a href="#Battery">Tools for battery-efficient apps</a></li>
+ </ul>
+ </div>
+</div>
+
+
+
+
+
+
+
+<p>Welcome to Android 5.0 Lollipop—the largest and most ambitious release for Android yet!</p>
+
+<p>This release is packed with new features for users and thousands of new APIs for developers. It extends Android even further, from phones, tablets, and wearables, to TVs and cars.</p>
+
+<p>For a closer look at the new developer APIs, see the
+<a href="{@docRoot}about/versions/android-5.0.html">Android
+5.0 API Overview</a>. Or, read more
+about Android 5.0 for consumers at
+<a href="http://www.android.com/versions/lollipop-5-0/"
+>www.android.com</a>.</p>
+
+
+
+<p style="
+ padding: 10px;
+ background: #eee;
+ width: 250px;
+ border: 1px solid #ccc;
+ margin-top: 20px;
+">To test your apps on a real device, flash a Nexus 5 or Nexus 7 with the <br>
+<a href="/preview/index.html#Start"><b>ANDROID PREVIEW SYSTEM IMAGE</b></a>.</p>
+
+
+<h2 id="Material">Material design</h2>
+
+<p>Android 5.0 brings <a href="http://www.google.com/design/spec">Material design</a> to Android and gives you an expanded UI toolkit for integrating the new design patterns easily in your apps. </p>
+
+
+
+<p>New <strong>3D views</strong> let you set a z-level to raise elements off of the view hierarchy and cast <strong>realtime shadows</strong>, even as they move.</p>
+
+
+<p>Built-in <strong>activity transitions</strong> take the user seamlessly from one state to another with beautiful, animated motion. The material theme adds transitions for your activities, including the ability to use <strong>shared visual elements</strong> across activities.</p>
+
+
+
+<div style="width:290px;margin-right:35px;float:left">
+ <div class="framed-nexus5-port-span-5">
+ <video class="play-on-hover" autoplay="">
+ <source src="/design/material/videos/ContactsAnim.mp4">
+ <source src="/design/videos/ContactsAnim.webm">
+ <source src="/design/videos/ContactsAnim.ogv">
+ </video>
+ </div>
+ <div style="font-size:10pt;margin-left:20px;margin-bottom:30px">
+ <em>To replay the movie, click on the device screen</em>
+ </div>
+</div>
+
+
+<p>Ripple animations are available for buttons, checkboxes, and other touch controls in your app.
+
+<p>You can also define vector drawables in XML and animate them in a variety of ways. Vector drawables scale without losing definition, so they are perfect for single-color in-app icons.</p>
+
+<p>A new system-managed processing thread called <strong>RenderThread</strong> keeps animations smooth even when there are delays in the main UI thread. </p>
+
+
+<h2 id="Perf">Performance focus</h2>
+
+<p>Android 5.0 provides a faster, smoother and more powerful computing experience.</p>
+
+<p>Android now runs exclusively on the new <strong>ART runtime</strong>, built from the ground up to support a mix of ahead-of-time (AOT), just-in-time (JIT), and interpreted code. It’s supported on ARM, x86, and MIPS architectures and is fully 64-bit compatible.</p>
+
+<p>ART improves app performance and responsiveness. Efficient garbage collection reduces the number and duration of pauses for GC events, which fit comfortably within the v-sync window so your app doesn’t skip frames. ART also dynamically moves memory to optimize performance for foreground uses. </p>
+
+<p>Android 5.0 introduces platform support for <strong>64-bit architectures</strong>—used by the Nexus 9's NVIDIA Tegra K1. Optimizations provide larger address space and improved performance for certain compute workloads. Apps written in the Java language run as 64-bit apps automatically—no modifications are needed. If your app uses native code, we’ve extended the NDK to support new ABIs for ARM v8, and x86-64, and MIPS-64.</p>
+
+<p>Continuing the focus on smoother performance, Android 5.0 offers improved A/V sync. The audio and graphics pipelines have been instrumented for more accurate timestamps, enabling
+video apps and games to display smooth synchronized content.</p>
+
+
+<h2 id="Notifications">Notifications</h2>
+
+<p>Notifications in Android 5.0 are more visible, accessible, and configurable. </p>
+
+<img src="{@docRoot}images/versions/notification-headsup.png" style="float:right; margin:0 0 40px 60px" width="300" height="224" />
+
+<p>Varying notification details may appear <strong>on the lock screen</strong> if desired by the user. Users may elect to allow none, some, or all notification content to be shown on a secure lock screen. </p>
+
+<p>Key notification alerts such as incoming calls appear in a <strong>heads-up notification</strong>—a small floating window that allows the user to respond or dismiss without leaving the current app.</p>
+
+<p>You can now add <strong>new metadata</strong> to notifications to collect associated contacts (for ranking), category, and priority.</p>
+
+<p>A new media notification template provides consistent media controls for notifications with up to 6 action buttons, including custom controls such as "thumbs up"—no more need for RemoteViews!</p>
+
+
+
+<h2 id="TV">Your apps on the big screen</h2>
+
+<p><a href="http://developer.android.com/tv/index.html">Android TV</a> provides a complete TV platform for your app's big screen experience. Android TV is centered around a simplified home screen experience that allows users to discover content easily, with personalized recommendations and voice search.</p>
+
+<p>With Android TV you can now <strong>create big, bold experiences</strong> for your app or game content and support interactions with game controllers and other input devices. To help you build cinematic, 10-foot UIs for television, Android provides a <strong>leanback UI framework</strong> in the <a href="{@docRoot}tools/support-library/features.html#v17-leanback">v17 support library</a>.</p>
+
+<p>The <strong>Android TV Input Framework</strong> (TIF) allows TV apps to handle video streams from sources such as HDMI inputs, TV tuners, and IPTV receivers. It also enables live TV search and recommendations via metadata published by the TV Input and includes an HDMI-CEC Control Service to handle multiple devices with a single remote. </p>
+
+<p>The TV Input Framework provides access to a wide variety of live TV input sources and brings them together in a single user interface for users to browse, view, and enjoy content. Building a TV input service for your content can help make your content more accessible on TV devices.</p>
+
+
+
+<img src="{@docRoot}images/versions/recents_screen_2x.png" srcset="{@docRoot}images/versions/recents_screen.png 1x, {@docRoot}images/versions/recents_screen_2x.png 2x" style="float:right; margin:0 0 40px 60px" width="300" height="521" />
+
+<h2 id="Documents">Document-centric apps</h2>
+
+<p>Android 5.0 introduces a redesigned Overview space (formerly called Recents) that’s more versatile and useful for multitasking.</p>
+
+<p>New APIs allow you to show separate activities in your app as individual documents alongside other recent screens.</p>
+
+<p>You can take advantage of concurrent documents to provide users instant access to more of your content or services. For example, you might use concurrent documents to represent files in a productivity app, player matches in a game, or chats in a messaging app. </p>
+
+
+
+<h2 id="Connectivity">Advanced connectivity</h2>
+
+<p>Android 5.0 adds new APIs that allow apps to perform concurrent operations with <strong>Bluetooth Low Energy</strong> (BLE), allowing both scanning (central mode) and advertising (peripheral mode).</p>
+
+<p>New <strong>multi-networking</strong> features allow apps to query available networks for available features such as whether they are Wi-Fi, cellular, metered, or provide certain network features. Then the app can request a connection and respond to connectivity loss or other network changes.</p>
+
+<p><strong>NFC</strong> APIs now allow apps to register an NFC application ID (AID) dynamically. They can also set the preferred card emulation service per active service and create an NDEF record containing UTF-8 text data.</p>
+
+
+
+<h2 id="Graphics">High-performance graphics</h2>
+
+<p>Support for <strong><a href="http://www.khronos.org/opengles/3_X/">Khronos OpenGL ES 3.1</a></strong> now provides games and other apps the highest-performance 2D and 3D graphics capabilities on supported devices. </p>
+
+<p>OpenGL ES 3.1 adds compute shaders, stencil textures, accelerated visual effects, high quality ETC2/EAC texture compression, advanced texture rendering, standardized texture size and render-buffer formats, and more.</p>
+
+
+<div class="figure" style="width:350px; margin:0 0 0 60px">
+<img src="{@docRoot}images/versions/rivalknights.png" style="float:right;" width="350" height="525" />
+<p class="img-caption">Gameloft's Rival Knights uses ASTC (Adaptive Scalable Texture Compression) from AEP and Compute Shaders from ES 3.1 to deliver HDR (High Dynamic Range) Bloom effects and provide more graphical detail.</p>
+</div>
+
+<p>Android 5.0 also introduces the <strong>Android Extension Pack</strong> (AEP), a set of OpenGL ES extensions that give you access to features like tessellation shaders, geometry shaders, ASTC texture compression, per-sample interpolation and shading, and other advanced rendering capabilities. With AEP you can deliver high-performance graphics across a range of GPUs.</p>
+
+
+<h2 id="Audio">More powerful audio</h2>
+
+<p>A new audio-capture design offers <strong>low-latency audio input</strong>. The new design includes: a fast capture thread that never blocks except during a read; fast track capture clients at native sample rate, channel count, and bit depth; and normal capture clients offer resampling, up/down channel mix, and up/down bit depth.</p>
+
+<p>Multi-channel <strong>audio stream mixing</strong> allows professional audio apps to mix up to eight channels including 5.1 and 7.1 channels.</p>
+
+<p>Apps can expose their media content and <strong>browse media</strong> from other apps, then request playback. Content is exposed through a queryable interface and does not need to reside on the device.</p>
+
+<p>Apps have finer-grain control over <strong>text-to-speech synthesis</strong> through voice profiles that are associated with specific locales, quality and latency rating. New APIs also improve support for synthesis error checking, network synthesis, language discovery, and network fallback.</p>
+
+<p>Android now includes support for standard <strong>USB audio</strong> peripherals, allowing users to connect USB headsets, speakers, microphones, or other high performance digital peripherals. Android 5.0 also adds support for <strong>Opus</strong> audio codecs.</p>
+
+<p>New <strong>{@link android.media.session.MediaSession}</strong> APIs for controlling media playback now make it easier to provide consistent media controls across screens and other controllers.</p>
+
+
+<h2 id="Camera">Enhanced camera & video</h2>
+
+<p>Android 5.0 introduces <strong>all new camera APIs</strong> that let you capture raw formats such as YUV and Bayer RAW, and control parameters such as exposure time, ISO sensitivity, and frame duration on a per-frame basis. The new fully-synchronized camera pipeline allows you to capture uncompressed full-resolution YUV images at 30 FPS on supported devices.</p>
+
+<p>Along with images, you can also capture metadata like noise models and optical information from the camera.</p>
+
+<p>Apps sending video streams over the network can now take advantage of H.265 <strong>High Efficiency Video Coding (HEVC)</strong> for optimized encoding and decoding of video data. </p>
+
+<p>Android 5.0 also adds support for <strong>multimedia tunneling</strong> to provide the best experience for ultra-high definition (4K) content and the ability to play compressed audio and video data together. </p>
+
+
+
+<div class="figure" style="width:320px; margin:1em 0 0 20px;padding-left:2em;">
+<img style="float:right; margin:0 1em 1em 2em"
+ src="{@docRoot}images/android-5.0/managed_apps_launcher@2x.png"
+ srcset="{@docRoot}images/android-5.0/managed_apps_launcher@2x.png 2x"
+ alt="" width="300" />
+<p class="img-caption">Users have a unified view of their personal and work apps, which are
+badged for easy identification.</p>
+</div>
+
+
+<h2 id="Work">Android in the workplace</h2>
+
+<p>To enable bring-your-own-device for enterprise environments, a new
+<a href="{@docRoot}about/versions/android-5.0.html#Enterprise">managed provisioning process</a>
+creates a secure work profile on the device. In the launcher, apps are shown with a Work badge to
+indicate that the app and its data are administered inside of the work profile by an IT
+administrator.</p>
+
+<p>Notifications for both the personal and work profile are visible in a unified view. The data
+for each profile is always kept separate and secure from each other, including when the same
+app is used by both profiles.</p>
+
+<p>For company-owned devices, IT administrators can start with a new device and configure it with a
+<a href="{@docRoot}about/versions/android-5.0.html#DeviceOwner">device owner</a>. Employers can
+issue these devices with a device owner app already installed that
+can configure global device settings.</p>
+
+
+
+<h2 id="ScreenCapture">Screen capturing and sharing</h2>
+
+<p>Android 5.0 lets you add screen capturing and screen sharing capabilities to your app. </p>
+
+<p>With user permission, you can capture non-secure video from the display and deliver it over the network if you choose.</p>
+
+
+<h2 id="Sensors">New types of sensors</h2>
+
+<p>In Android 5.0, a new <strong>tilt detector</strong> sensor helps improve activity recognition on supported devices, and a <strong>heart rate sensor</strong> reports the heart rate of the person touching the device. </p>
+
+<p>New <strong>interaction composite sensors</strong> are now available to detect special interactions such as a <em>wake up</em> gesture, a <em>pick up</em> gesture, and a <em>glance</em> gesture.</p>
+
+
+
+<h2 id="WebView">Chromium WebView</h2>
+
+<div style="float:right;margin:1em 2em 1em 2em;">
+ <img src="/images/kk-chromium-icon.png" alt="" height="160" style="margin-bottom:0em;">
+</div>
+
+<p>The initial release for Android 5.0 includes a version of Chromium for {@link android.webkit.WebView} based on the Chromium M37 release, adding support for <strong>WebRTC</strong>, <strong>WebAudio</strong>, and <strong>WebGL</strong>. </p>
+
+<p>Chromium M37 also includes native support for all of the <strong>Web Components</strong> specifications: Custom Elements, Shadow DOM, HTML Imports, and Templates. This means you can use <a href="http://polymer-project.org/">Polymer</a> and its <a href="https://www.polymer-project.org/docs/elements/material.html">material design elements</a> in a WebView without needing polyfills.</p>
+
+<p>Although WebView has been based on Chromium since Android 4.4, the Chromium layer is now updatable from Google Play.</p>
+
+<p>As new versions of Chromium become available, users can update from Google Play to ensure they get the latest enhancements and bug fixes for WebView, providing the latest web APIs and bug fixes for apps using WebView on Android 5.0 and higher.</p>
+
+
+
+<h2 id="Accessibility">Accessibility & input</h2>
+
+<p>New accessibility APIs can retrieve detailed information about the properties of windows on the screen that sighted users can interact with and define standard or customized input actions for UI elements.</p>
+
+<p>New Input method editor (IME) APIs enable faster switching to other IMEs directly from the input method.</p>
+
+
+
+<h2 id="Battery">Tools for building battery-efficient apps</h2>
+
+<p>New <strong>job scheduling</strong> APIs allow you optimize battery life by deferring jobs for the system to run at a later time or under specified conditions, such as when the device is charging or connected to Wi-Fi.</p>
+
+<p>A new <code>dumpsys batterystats</code> command generates <strong>battery usage statistics</strong> that you can use to understand system-wide power use and understand the impact of your app on the device battery. You can look at a history of power events, approximate power use per UID and system component, and more.</p>
+
+<img src="{@docRoot}images/versions/battery_historian.png" srcset="{@docRoot}images/versions/battery_historian@2x.png 2x" alt="" width="760" height="462" />
+<p class="img-caption">Battery Historian is a new tool to convert the statistics from <code>dumpsys batterystats</code> into a visualization for battery-related debugging. You can find it at <a href="https://github.com/google/battery-historian"
+>https://github.com/google/battery-historian</a>.</p>
diff --git a/docs/html/auto/overview.jd b/docs/html/auto/overview.jd
index cf63b98..ae1efec 100644
--- a/docs/html/auto/overview.jd
+++ b/docs/html/auto/overview.jd
@@ -207,7 +207,7 @@
<p>The Android Auto app uses a car-specific UI model to display content and user interaction
opportunities. Android Auto provides you with a standard UI designed to minimize driver
-distraction. You do not have to test a custom UI for for driver distraction, which is a
+distraction. You do not have to test a custom UI for driver distraction, which is a
lengthy and expensive process involving multiple legislations across the globe and different
standards for each vehicle OEM.</p>
@@ -217,7 +217,7 @@
<h3 id="launchapp">Launcher</h3>
<p>The launcher shows all the compatible media apps installed on the user’s
-Android device and lets users select one of them from an scrollable list:</p>
+Android device and lets users select one of them from a scrollable list:</p>
<div class="auto-img-container-single">
<div class="auto-img-container">
diff --git a/docs/html/design/design_toc.cs b/docs/html/design/design_toc.cs
index 1a6ee7a..52c7c52 100644
--- a/docs/html/design/design_toc.cs
+++ b/docs/html/design/design_toc.cs
@@ -9,6 +9,10 @@
</li>
<li class="nav-section">
+ <div class="nav-section-header empty"><a href="<?cs var:toroot ?>design/material/index.html">Material Design</a></div>
+ </li>
+
+ <li class="nav-section">
<div class="nav-section-header"><a href="<?cs var:toroot ?>design/devices.html">Devices</a></div>
<ul>
<li><a href="<?cs var:toroot ?>design/handhelds/index.html">Phones & Tablets</a></li>
diff --git a/docs/html/design/index.jd b/docs/html/design/index.jd
index 27e3169..47e8d26 100644
--- a/docs/html/design/index.jd
+++ b/docs/html/design/index.jd
@@ -28,20 +28,20 @@
<span itemprop="description">Welcome to <strong>Android Design</strong>, your place for
learning how to design exceptional Android apps.</span>
<br><br>
- Want to know what <strong>Android 4.4 KitKat</strong> has for designers? See <a href="{@docRoot}design/patterns/new.html">New in Android</a>.<br><br>
+ Want to know what <strong>Android 5.0</strong> has for designers? See <a href="{@docRoot}design/patterns/new.html">New in Android</a>.<br><br>
<a href="/design/get-started/creative-vision.html" class="landing-page-link">Creative Vision</a>
</div>
<a id="hero-image" href="/design/get-started/creative-vision.html">
- <img src="/design/media/index_landing_page.png">
+ <img src="{@docRoot}design/media/index_landing_page.png" width="760" height="600" alt=""
+ srcset="{@docRoot}design/media/index_landing_page_2x.png 2x"/>
</a>
<div style="background: hsl(8, 70%, 54%); margin: 0; padding: 20px 20px 10px 20px;color: #fff; position: absolute;top: 255px;width: 179px;">
-<h2 style="color: #fff;margin:0 0 10px; font-size:18px" class="norule">L Developer Preview</h2>
-<p> The next version of Android uses a design
-metaphor inspired by paper and ink that provides a reassuring sense of tactility. Before it arrives for users, you can get an early
-look at the new Material design.
+<h2 style="color: #fff;margin:0 0 10px; font-size:18px" class="norule">Material Design</h2>
+<p>Android 5.0 introduces a design
+metaphor inspired by paper and ink that provides a reassuring sense of tactility.
</p>
-<p><a class="white" href="{@docRoot}preview/material/index.html">Learn more about Material</a></p>
+<p><a class="white" href="{@docRoot}design/material/index.html">Learn more</a></p>
</div>
</div>
diff --git a/docs/html/preview/material/images/MaterialDark.png b/docs/html/design/material/images/MaterialDark.png
similarity index 100%
rename from docs/html/preview/material/images/MaterialDark.png
rename to docs/html/design/material/images/MaterialDark.png
Binary files differ
diff --git a/docs/html/preview/material/images/MaterialLight.png b/docs/html/design/material/images/MaterialLight.png
similarity index 100%
rename from docs/html/preview/material/images/MaterialLight.png
rename to docs/html/design/material/images/MaterialLight.png
Binary files differ
diff --git a/docs/html/preview/material/images/card_travel.png b/docs/html/design/material/images/card_travel.png
similarity index 100%
rename from docs/html/preview/material/images/card_travel.png
rename to docs/html/design/material/images/card_travel.png
Binary files differ
diff --git a/docs/html/preview/material/images/list_mail.png b/docs/html/design/material/images/list_mail.png
similarity index 100%
rename from docs/html/preview/material/images/list_mail.png
rename to docs/html/design/material/images/list_mail.png
Binary files differ
diff --git a/docs/html/design/material/index.jd b/docs/html/design/material/index.jd
new file mode 100644
index 0000000..db18a83
--- /dev/null
+++ b/docs/html/design/material/index.jd
@@ -0,0 +1,152 @@
+page.title=Material Design
+page.tags=Material,design
+page.type=design
+page.image=design/material/images/MaterialLight.png
+
+@jd:body
+
+<p itemprop="description">Material design is a comprehensive guide for visual, motion, and
+interaction design across platforms and devices. Android now includes support for
+material design apps. To use material design in your Android apps, follow the guidelines defined
+in the <a href="http://www.google.com/design/spec">material design specification</a> and use the
+new components and functionality available in Android 5.0 (API level 21) and above.</p>
+
+<p>Android provides the following elements for you to build material design apps:</p>
+
+<ul>
+ <li>A new theme</li>
+ <li>New widgets for complex views</li>
+ <li>New APIs for custom shadows and animations</li>
+</ul>
+
+<p>For more information about implementing material design on Android, see
+<a href="{@docRoot}training/material/index.html">Creating Apps with Material Design</a>.</p>
+
+
+<h3>Material Theme</h3>
+
+<p>The material theme provides a new style for your app, system widgets that let you set
+their color palette, and default animations for touch feedback and activity transitions.</p>
+
+<!-- two columns -->
+<div style="width:700px;margin-top:25px;margin-bottom:20px">
+<div style="float:left;width:250px;margin-left:40px;margin-right:60px;">
+ <img src="{@docRoot}design/material/images/MaterialDark.png" width="500" height="238"/>
+ <div style="width:140px;margin:0 auto">
+ <p style="margin-top:8px">Dark material theme</p>
+ </div>
+</div>
+<div style="float:left;width:250px;margin-right:0px;">
+ <img src="{@docRoot}design/material/images/MaterialLight.png" width="500" height="238"/>
+ <div style="width:140px;margin:0 auto">
+ <p style="margin-top:8px">Light material theme</p>
+ </div>
+</div>
+<br style="clear:left"/>
+</div>
+
+<p>For more information, see <a href="{@docRoot}training/material/theme.html">Using the Material
+Theme</a>.</p>
+
+
+<h3>Lists and Cards</h3>
+
+<p>Android provides two new widgets for displaying cards and lists with material design styles
+and animations:</p>
+
+<!-- two columns -->
+<div style="width:700px;margin-top:25px;margin-bottom:20px">
+<div style="float:left;width:250px;margin-left:40px;margin-right:60px;">
+ <img src="{@docRoot}design/material/images/list_mail.png" width="500" height="426"/>
+ <p>The new <code>RecyclerView</code> widget is a more pluggable version of <code>ListView</code>
+ that supports different layout types and provides performance improvements.</p>
+</div>
+<div style="float:left;width:250px;margin-right:0px;">
+ <img src="{@docRoot}design/material/images/card_travel.png" width="500" height="426"/>
+ <p>The new <code>CardView</code> widget lets you display important pieces of information inside
+ cards that have a consistent look and feel.</p>
+</div>
+<br style="clear:left"/>
+</div>
+
+<p>For more information, see <a href="{@docRoot}training/material/lists-cards.html">Creating Lists
+and Cards</a>.</p>
+
+
+<h3>View Shadows</h3>
+
+<p>In addition to the X and Y properties, views in Android now have a Z
+property. This new property represents the elevation of a view, which determines:</p>
+
+<ul>
+<li>The size of the shadow: views with higher Z values cast bigger shadows.</li>
+<li>The drawing order: views with higher Z values appear on top of other views.</li>
+</ul>
+
+<div style="width:290px;margin-left:35px;float:right">
+ <div class="framed-nexus5-port-span-5">
+ <video class="play-on-hover" autoplay>
+ <source src="{@docRoot}design/material/videos/ContactsAnim.mp4"/>
+ <source src="{@docRoot}design/videos/ContactsAnim.webm"/>
+ <source src="{@docRoot}design/videos/ContactsAnim.ogv"/>
+ </video>
+ </div>
+ <div style="font-size:10pt;margin-left:20px;margin-bottom:30px">
+ <em>To replay the movie, click on the device screen</em>
+ </div>
+</div>
+
+<p>For more information, see <a href="{@docRoot}training/material/shadows-clipping.html">Defining
+Shadows and Clipping Views</a>.</p>
+
+
+<h3>Animations</h3>
+
+<p>The new animation APIs let you create custom animations for touch feedback in UI controls,
+changes in view state, and activity transitions.</p>
+
+<p>These APIs let you:</p>
+
+<ul>
+<li style="margin-bottom:15px">
+Respond to touch events in your views with <strong>touch feedback</strong> animations.
+</li>
+<li style="margin-bottom:15px">
+Hide and show views with <strong>circular reveal</strong> animations.
+</li>
+<li style="margin-bottom:15px">
+Switch between activities with custom <strong>activity transition</strong> animations.
+</li>
+<li style="margin-bottom:15px">
+Create more natural animations with <strong>curved motion</strong>.
+</li>
+<li style="margin-bottom:15px">
+Animate changes in one or more view properties with <strong>view state change</strong> animations.
+</li>
+<li style="margin-bottom:15px">
+Show animations in <strong>state list drawables</strong> between view state changes.
+</li>
+</ul>
+
+<p>Touch feedback animations are built into several standard views, such as buttons. The new APIs
+let you customize these animations and add them to your custom views.</p>
+
+<p>For more information, see <a href="{@docRoot}training/material/animations.html">Defining Custom
+Animations</a>.</p>
+
+
+<h3>Drawables</h3>
+
+<p>These new capabilities for drawables help you implement material design apps:</p>
+
+<ul>
+<li><strong>Vector drawables</strong> are scalable without losing definition and are perfect
+for single-color in-app icons.</li>
+<li><strong>Drawable tinting</strong> lets you define bitmaps as an alpha mask and tint them with
+a color at runtime.</li>
+<li><strong>Color extraction</strong> lets you automatically extract prominent colors from a
+bitmap image.</li>
+</ul>
+
+<p>For more information, see <a href="{@docRoot}training/material/drawables.html">Working with
+Drawables</a>.</p>
diff --git a/docs/html/preview/material/videos/ContactsAnim.mp4 b/docs/html/design/material/videos/ContactsAnim.mp4
similarity index 100%
rename from docs/html/preview/material/videos/ContactsAnim.mp4
rename to docs/html/design/material/videos/ContactsAnim.mp4
Binary files differ
diff --git a/docs/html/preview/material/videos/ContactsAnim.ogv b/docs/html/design/material/videos/ContactsAnim.ogv
similarity index 100%
rename from docs/html/preview/material/videos/ContactsAnim.ogv
rename to docs/html/design/material/videos/ContactsAnim.ogv
Binary files differ
diff --git a/docs/html/preview/material/videos/ContactsAnim.webm b/docs/html/design/material/videos/ContactsAnim.webm
similarity index 100%
rename from docs/html/preview/material/videos/ContactsAnim.webm
rename to docs/html/design/material/videos/ContactsAnim.webm
Binary files differ
diff --git a/docs/html/design/media/index_landing_page.png b/docs/html/design/media/index_landing_page.png
index 078eb4d..36d3828f 100644
--- a/docs/html/design/media/index_landing_page.png
+++ b/docs/html/design/media/index_landing_page.png
Binary files differ
diff --git a/docs/html/design/media/index_landing_page_2x.png b/docs/html/design/media/index_landing_page_2x.png
new file mode 100644
index 0000000..1cd97ab
--- /dev/null
+++ b/docs/html/design/media/index_landing_page_2x.png
Binary files differ
diff --git a/docs/html/design/patterns/new.jd b/docs/html/design/patterns/new.jd
index d672e46..1523cea 100644
--- a/docs/html/design/patterns/new.jd
+++ b/docs/html/design/patterns/new.jd
@@ -3,7 +3,24 @@
@jd:body
-<p>A quick look at the new patterns and styles you can use to build beautiful Android apps…
+<p>A quick look at the new patterns and styles you can use to build beautiful Android apps…
+
+
+<h2 id="Android5">Android 5.0 Lollipop</h2>
+
+<h3>Material design</h3>
+
+<p><a href="{@docRoot}design/material/index.html">Material design</a> is a comprehensive guide for
+visual, motion, and interaction design across platforms and devices. Android 5.0 provides a new
+theme, new widgets for complex views, and new APIs for shadows and animations that help you
+implement material design patterns in your apps.</p>
+
+<h3>Notifications</h3>
+
+<p><a href="{@docRoot}design/patterns/notifications.html">Notifications</a> receive important
+updates in Android 5.0, with material design visual changes, notification availability in the
+lockscreen, priority notifications, and cloud-synced notifications.</p>
+
<h2 id="kitkat">Android 4.4 KitKat</h2>
@@ -30,7 +47,7 @@
see it in every screen of your app.
</p>
<p>
- <a href="{@docRoot}design/style/branding.html">Your Branding</a> highlights
+ <a href="{@docRoot}design/style/branding.html">Your Branding</a> highlights
these and other pointers on how to incorporate elements of your brand into your
app's visual language — highly encouraged!
</p>
@@ -60,7 +77,7 @@
<img src="{@docRoot}design/media/touch_feedback_reaction_response.png" style="padding-top:1em;">
<h3>
- Full screen
+ Full screen
</h3>
<p>
@@ -73,7 +90,7 @@
<img src="{@docRoot}design/media/fullscreen_landing.png" style="margin:1em auto 2em auto;">
<h3>
- Gestures
+ Gestures
</h3>
<div class="layout-content-row">
<div class="layout-content-col span-6">
diff --git a/docs/html/design/patterns/notifications.jd b/docs/html/design/patterns/notifications.jd
index 41f9190..467dbb2 100644
--- a/docs/html/design/patterns/notifications.jd
+++ b/docs/html/design/patterns/notifications.jd
@@ -1,253 +1,887 @@
page.title=Notifications
+page.tags="notifications","design","L"
@jd:body
-<a class="notice-developers" href="{@docRoot}training/notify-user/index.html">
+ <a class="notice-developers" href="{@docRoot}training/notify-user/index.html">
<div>
<h3>Developer Docs</h3>
<p>Notifying the User</p>
</div>
</a>
-<p itemprop="description">The notification system allows your app to keep the user informed about events, such as new chat messages or a calendar event. Think of notifications as a news channel that alerts the user to important events as they happen or a log that chronicles events while the user is not paying attention.</p>
+<a class="notice-designers" href="notifications_k.html">
+ <div>
+ <h3>Notifications in Android 4.4 and Lower</h3>
+ </div>
+</a>
-<h4>New in Jelly Bean</h4>
-<p>In Jelly Bean, notifications received their most important structural and functional update since the beginning of Android.</p>
+<style>
+ .col-5, .col-6, .col-7 {
+ margin-left:0px;
+ }
+</style>
+
+<p>The notification system allows users to keep informed about relevant and
+timely
+events in your app, such as new chat messages from a friend or a calendar event.
+Think of notifications as a news channel that alerts the user to important
+events as
+they happen or a log that chronicles events while the user is not paying
+attention—and one that is synced as appropriate across all their Android devices.</p>
+
+<h4 id="New"><strong>New in Android 5.0</strong></h4>
+
+<p>In Android 5.0, notifications receive important updates: structurally,
+visually, and functionally:</p>
+
<ul>
- <li>Notifications can include actions that enable the user to immediately act on a notification from the notification drawer.</li>
- <li>Notifications are now more flexible in size and layout. They can be expanded to show additional information details.</li>
- <li>A priority flag was introduced that helps to sort notifications by importance rather than time only.</li>
+ <li>Notifications have undergone visual changes consistent with the new
+material design theme.</li>
+ <li> Notifications are now available on the device lock screen, while
+sensitive content can still
+ be hidden behind it.</li>
+ <li>High-priority notifications received while the device is in use now use a new format called
+ heads-up notifications.</li>
+ <li>Cloud-synced notifications: Dismissing a notification on one of your
+Android devices dismisses it
+ on the others, as well.</li>
</ul>
-<h2>Anatomy of a notification</h2>
+<p class="note"><strong>Note:</strong> Notification design in this version of
+Android is a significant
+departure from that of previous versions. For information about notification design in previous
+versions, see <a href="./notifications_k.html">Notifications in Android 4.4 and lower</a>.</p>
-<div class="layout-content-row">
- <div class="layout-content-col span-6">
- <h4>Base Layout</h4>
- <p>At a minimum, all notifications consist of a base layout, including:</p>
- <ul>
- <li>the sending application's notification icon or the sender's photo</li>
- <li>a notification title and message</li>
- <li>a timestamp</li>
- <li>a secondary icon to identify the sending application when the senders image is shown for the main icon</li>
- </ul>
- <p>The information arrangement of the base layout has not changed in Jelly Bean, so app notifications designed for versions earlier than Jelly Bean still look and work the same.</p>
+<h2 id="Anatomy">Anatomy of a Notification</h2>
+
+<p>This section goes over basic parts of a notification and how they can
+appear on different types of devices.</p>
+
+<h3 id="BaseLayout">Base layout</h3>
+
+<p>At a minimum, all notifications consist of a base layout, including:</p>
+
+<ul>
+ <li> The notification's <strong>icon</strong>. The icon symbolizes the
+originating app. It may also
+ potentially indicate notification type if the app generates more than one
+type.</li>
+ <li> A notification <strong>title</strong> and additional
+<strong>text</strong>.</li>
+ <li> A <strong>timestamp</strong>.</li>
+</ul>
+
+<p>Notifications created with {@link android.app.Notification.Builder Notification.Builder}
+for previous platform versions look and work the same in Android
+5.0, with only minor stylistic changes that the system handles
+for you. For more information about notifications on previous versions of
+Android, see
+<a href="./notifications_k.html">Notifications in Android 4.4 and lower</a>.</p></p>
+
+
+ <img style="margin:20px 0 0 0"
+src="{@docRoot}images/android-5.0/notifications/basic_combo.png"
+ alt="" width="700px" />
+
+
+<div style="clear:both;margin-top:20px">
+ <p class="img-caption">
+ Base layout of a handheld notification (left) and the same notification on Wear (right),
+ with a user photo and a notification icon
+ </p>
</div>
- <div class="layout-content-col span-6">
- <img src="{@docRoot}design/media/notifications_pattern_anatomy.png">
- <div class="figure-caption">
- Base layout of a notification
- </div>
- </div>
+
+<h3 id="ExpandedLayouts">Expanded layouts</h3>
+
+
+<p>You can choose how much detail your app's notifications should
+provide. They can show the first
+few lines of a message or show a larger image preview. The additional
+information provides the user with more
+context, and—in some cases—may allow the user to read a message in its
+entirety. The user can
+pinch-zoom or perform a single-finger glide to toggle between compact
+and expanded layouts.
+ For single-event notifications, Android provides three expanded layout
+templates (text, inbox, and
+ image) for you to use in your application. The following images show you how
+single-event notifications look on
+ handhelds (left) and wearables (right).</p>
+
+<img style="margin-top:30px"
+src="{@docRoot}images/android-5.0/notifications/expandedtext_combo.png"
+ alt="" width="700px" height;="284px" />
+<img style="margin-top:30px"
+src="{@docRoot}images/android-5.0/notifications/stack_combo.png"
+ alt="" width="700px" height;="284px" />
+<img style="margin-top:30px"
+src="{@docRoot}images/android-5.0/notifications/ExpandedImage.png"
+ alt="" width="311px" height;="450px" />
+
+<h3 id="actions" style="clear:both; margin-top:40px">Actions</h3>
+
+<p>Android supports optional actions that are displayed at the bottom
+of the notification.
+With actions, users can handle the most common tasks for a particular
+notification from within the notification shade without having to open the
+originating application.
+This speeds up interaction and, in conjunction with swipe-to-dismiss, helps users focus on
+notifications that matter to them.</p>
+
+
+ <img src="{@docRoot}images/android-5.0/notifications/action_combo.png"
+ alt="" width="700px" />
+
+
+
+<p style="clear:both">Be judicious with how many actions you include with a
+notification. The more
+actions you include, the more cognitive complexity you create. Limit yourself
+to the smallest number
+of actions possible by only including the most imminently important and
+meaningful actions.</p>
+
+<p>Good candidates for actions on notifications are actions that:</p>
+
+<ul>
+ <li> Are essential, frequent, and typical for the content type you're
+displaying
+ <li> Allow the user to accomplish tasks quickly
+</ul>
+
+<p>Avoid actions that are:</p>
+
+<ul>
+ <li> Ambiguous
+ <li> The same as the default action of the notification (such as "Read" or
+"Open")
+</ul>
+
+
+
+<p>You can specify a maximum of three actions, each consisting of an action
+icon and name.
+ Adding actions to a simple base layout makes the notification expandable,
+even if the
+ notification doesn't have an expanded layout. Since actions are only shown for
+expanded
+ notifications and are otherwise hidden, make sure that any action a
+user can invoke from
+ a notification is available from within the associated application, as
+well.</p>
+
+<h2 style="clear:left">Heads-up Notification</h2>
+<div class="figure" style="width:311px">
+ <img src="{@docRoot}images/android-5.0/notifications/hun-example.png"
+ alt="" width="311px" />
+ <p class="img-caption">
+ Example of a heads-up notification (incoming phone call, high priority)
+appearing on top of an
+ immersive app
+ </p>
</div>
-<h4>Expanded layouts</h4>
-<p>With Jelly Bean you have the option to provide more event detail. You can use this to show the first few lines of a message or show a larger image preview. This provides the user with additional context, and - in some cases - may allow the user to read a message in its entirety. The user can pinch-zoom or two-finger glide in order to toggle between base and expanded layouts. For single event notifications, Android provides two expanded layout templates (text and image) for you to re-use in your application.</p>
+<p>When a high-priority notification arrives (see right), it is presented
+to users for a
+short period of time with an expanded layout exposing possible actions.</p>
+<p> After this period of time, the notification retreats to the notification
+shade. If a notification's <a href="#correctly_set_and_manage_notification_priority">priority</a> is
+flagged as High, Max, or full-screen, it gets a heads-up notification.</p>
-<img src="{@docRoot}design/media/notifications_pattern_expandable.png">
+<p><b>Good examples of heads-up notifications</b></p>
-<h4>Actions</h4>
-<div class="layout-content-row">
- <div class="layout-content-col span-6">
- <p>Starting with Jelly Bean, Android supports optional actions that are displayed at the bottom of the notification. With actions, users can handle the most common tasks for a particular notification from within the notification shade without having to open the originating application. This speeds up interaction and, in conjunction with "swipe-to-dismiss", helps users to streamline their notification triaging experience.</p>
- <p>Be judicious with how many actions you include with a notification. The more actions you include, the more cognitive complexity you create. Limit yourself to the fewest number of actions possible by only including the most imminently important and meaningful ones.</p>
- <p>Good candidates for actions on notifications are actions that are:</p>
- <ul>
- <li>essential, frequent and typical for the content type you're displaying</li>
- <li>time-critical</li>
- <li>not overlapping with neighboring actions</li>
- </ul>
- <p>Avoid actions that are:</p>
- <ul>
- <li>ambiguous</li>
- <li>duplicative of the default action of the notification (such as "Read" or "Open")</li>
- </ul>
- </div>
- <div class="layout-content-col span-7">
- <img src="{@docRoot}design/media/notifications_pattern_two_actions.png">
- <div class="figure-caption">
- Calendar reminder notification with two actions
- </div>
- </div>
-</div>
+<ul>
+ <li> Incoming phone call when using a device</li>
+ <li> Alarm when using a device</li>
+ <li> New SMS message</li>
+ <li> Low battery</li>
+</ul>
-<p>You can specify a maximum of three actions, each consisting of an action icon and an action name. Adding actions to a simple base layout will make the notification expandable, even if the notification doesn't have an expanded layout. Since actions are only shown for expanded notifications and are otherwise hidden, you must make sure that any action a user can invoke from a notification is available from within the associated application as well.</p>
+<h2 style="clear:both" id="guidelines">Guidelines</h2>
-<h2>Design guidelines</h2>
-<div class="layout-content-row">
- <div class="layout-content-col span-6">
- <img src="{@docRoot}design/media/notifications_pattern_personal.png">
- </div>
- <div class="layout-content-col span-7">
- <h4>Make it personal</h4>
- <p>For notifications of items sent by another user (such as a message or status update), include that person's image.</p>
- <p>Remember to include the app icon as a secondary icon in the notification, so that the user can still identify which app posted it.</p>
- </div>
-</div>
-<h4>Navigate to the right place</h4>
-<p>When the user touches the body of a notification (outside of the action buttons), open your app to the place where the user can consume and act upon the data referenced in the notification. In most cases this will be the detail view of a
-single data item such as a message, but it might also be a summary view if the notification is stacked (see <em>Stacked notifications</em> below) and references multiple items. If in any of those cases the user is taken to a hierarchy level below your app's top-level, insert navigation into your app's back stack to allow them to navigate to your app's top level using the system back key. For more
-information, see the chapter on <em>System-to-app navigation</em> in the <a href="{@docRoot}design/patterns/navigation.html">Navigation</a> design pattern.</p>
+<h3 id="MakeItPersonal">Make it personal</h3>
-<h4>Correctly set and manage notification priority</h4>
-<p>Starting with Jelly Bean, Android now supports a priority flag for notifications. It allows you to influence where your notification will appear in comparison to other notifications and help to make sure that users always see their most important notifications first. You can choose from the following priority levels when posting a notification:</p>
+<p>For notifications of items sent by another person (such as a message or
+status update), include that person's image using
+{@link android.app.Notification.Builder#setLargeIcon setLargeIcon()}. Also attach information about
+the person to the notification's metadata (see {@link android.app.Notification#EXTRA_PEOPLE}).</p>
+<p>Your notification's main icon is still shown, so the user can associate
+it with the icon
+visible in the status bar.</p>
+
+
+<img src="{@docRoot}images/android-5.0/notifications/Triggered.png"
+ alt="" width="311px"/>
+<p style="margin-top:10px" class="img-caption">
+ Notification that shows the person who triggered it and the content they sent.
+</p>
+
+
+<h3 id="navigate_to_the_right_place">Navigate to the right place</h3>
+
+<p>When the user touches the body of a notification (outside of the action
+buttons), open your app
+to the place where the user can view and act upon the data referenced in the
+notification. In most cases, this will be the detailed view of a single data item such as a message,
+but it might also be a
+summary view if the notification is stacked. If your app takes the
+user anywhere below your app's top level, insert navigation into your app's back stack so that the
+user can press the system back button to return to the top level. For more information, see
+<em>Navigation into Your App via Home Screen Widgets and Notifications</em> in the <a
+href="{@docRoot}design/patterns/navigation.html#into-your-app">Navigation</a>
+design pattern.</p>
+
+<h3 id="correctly_set_and_manage_notification_priority">Correctly set and
+manage notification
+priority</h3>
+
+<p>Android supports a priority flag for notifications. This flag allows you to
+influence where your notification appears, relative to other notifications, and
+helps ensure
+that users always see their most important notifications first. You can choose
+from the
+following priority levels when posting a notification:</p>
<table>
- <tr>
- <th><strong>Priority</strong></th>
- <th><strong>Use</strong></th>
- </tr>
- <tr>
- <td>MAX</td>
- <td>Use for critical and urgent notifications that alert the user to a condition that is time-critical or needs to be resolved before they can continue with a particular task.</td>
- </tr>
- <tr>
- <td>HIGH</td>
- <td>Use high priority notifications primarily for important communication, such as message or chat events with content that is particularly interesting for the user.</td>
- </tr>
- <tr>
- <td>DEFAULT</td>
- <td>The default priority. Keep all notifications that don't fall into any of the other categories at this priority level.</td>
- </tr>
- <tr>
- <td>LOW</td>
- <td>Use for notifications that you still want the user to be informed about, but that rate low in urgency.</td>
- </tr>
- <tr>
- <td>MIN</td>
- <td>Contextual/background information (e.g. weather information, contextual location information). Minimum priority notifications will not show in the status bar. The user will only discover them when they expand the notification tray.</td>
- </tr>
+ <tr>
+ <td class="tab0">
+<p><strong>Priority</strong></p>
+</td>
+ <td class="tab0">
+<p><strong>Use</strong></p>
+</td>
+ </tr>
+ <tr>
+ <td class="tab1">
+<p><code>MAX</code></p>
+</td>
+ <td class="tab1">
+<p>Use for critical and urgent notifications that alert the user to a condition
+that is
+time-critical or needs to be resolved before they can continue with a
+particular task.</p>
+</td>
+ </tr>
+ <tr>
+ <td class="tab1">
+<p><code>HIGH</code></p>
+</td>
+ <td class="tab1">
+<p>Use primarily for important communication, such as message or chat
+events with content that is particularly interesting for the user.
+High-priority notifications trigger the heads-up notification display.</p>
+</td>
+ </tr>
+ <tr>
+ <td class="tab1">
+<p><code>DEFAULT</code></p>
+</td>
+ <td class="tab1">
+<p>Use for all notifications that don't fall into any of the other priorities described here.</p>
+</td>
+ </tr>
+ <tr>
+ <td class="tab1">
+<p><code>LOW</code></p>
+</td>
+ <td class="tab1">
+<p>Use for notifications that you want the user to be informed about, but
+that are less urgent. Low-priority notifications tend to show up at the bottom of the list,
+which makes them a good
+choice for things like public or undirected social updates: The user has asked to
+be notified about
+them, but these notifications should never take precedence over urgent or direct
+communication.</p>
+</td>
+ </tr>
+ <tr>
+ <td class="tab1">
+<p><code>MIN</code></p>
+</td>
+ <td class="tab1">
+<p>Use for contextual or background information such as weather information or contextual
+location information.
+Minimum-priority notifications do not appear in the status bar. The user
+discovers them on expanding the notification shade.</p>
+</td>
+ </tr>
</table>
-<img src="{@docRoot}design/media/notifications_pattern_priority.png">
-<h4>Stack your notifications</h4>
-<p>If your app creates a notification while another of the same type is still pending, avoid creating
-an altogether new notification object. Instead, stack the notification.</p>
-<p>A stacked notification builds a summary description and allows the user to understand how many
-notifications of a particular kind are pending.</p>
-<p><strong>Don't</strong>:</p>
-<img src="{@docRoot}design/media/notifications_pattern_additional_fail.png">
+<h4 id="how_to_choose_an_appropriate_priority"><strong>How to choose an
+appropriate
+priority</strong></h4>
-<p><strong>Do</strong>:</p>
+<p><code>DEFAULT</code>, <code>HIGH</code>, and <code>MAX</code> are interruptive priority levels, and risk
+interrupting the user
+in mid-activity. To avoid annoying your app's users, reserve interruptive priority levels for
+notifications that:</p>
-<img src="{@docRoot}design/media/notifications_pattern_additional_win.png">
-
-<p>You can provide more detail about the individual notifications that make up a stack by using the expanded digest layout. This allows users to gain a better sense of which notifications are pending and if they are interesting enough to be read in detail within the associated app.</p>
-
-<img src="{@docRoot}design/media/notifications_expand_contract_msg.png">
-
-<h4>Make notifications optional</h4>
-<p>Users should always be in control of notifications. Allow the user to disable your apps notifications or change their alert properties, such as alert sound and whether to use vibration, by adding a notification settings item to your application settings.</p>
-<h4>Use distinct icons</h4>
-<p>By glancing at the notification area, the user should be able to discern what kinds of notifications are currently pending.</p>
-
-<div class="do-dont-label good"><strong>Do</strong></div>
-<p style="margin-top:0;">Look at the notification icons the Android apps already provide and create notification icons for your app that are sufficiently distinct in appearance.</p>
-<div class="do-dont-label good"><strong>Do</strong></div>
-<p style="margin-top:0;">Use the proper <a href="{@docRoot}design/style/iconography.html#notification">notification icon style</a> for small icons, and the Holo Dark <a href="{@docRoot}design/style/iconography.html#action-bar">action bar icon style</a> for your action icons.</p>
-<div class="do-dont-label good"><strong>Do</strong></div>
-<p style="margin-top:0;">Keep your icons visually simple and avoid excessive detail that is hard to discern.</p>
-<div class="do-dont-label bad"><strong>Don't</strong></div>
-<p style="margin-top:0;">Use color to distinguish your app from others.</p>
-
-<h4>Pulse the notification LED appropriately</h4>
-<p>Many Android devices contain a tiny lamp, called the notification <acronym title="Light-Emitting Diode">LED</acronym>, which is used to keep the user informed about events while the screen is off. Notifications with a priority level of MAX, HIGH, or DEFAULT should cause the LED to glow, while those with lower priority (LOW and MIN) should not.</p>
-
-<p>The user's control over notifications should extend to the LED. By default, the LED will glow with a white color. Your notifications shouldn't use a different color unless the user has explicitly customized it.</p>
-
-<h2>Building notifications that users care about</h2>
-<p>To create an app that feels streamlined, pleasant, and respectful, it is important to design your notifications carefully. Notifications embody your app's voice, and contribute to your app's personality. Unwanted or unimportant notifications can annoy the user, so use them judiciously.</p>
-
-<h4>When to display a notification</h4>
-<p>To create an application that people love, it's important to recognize that the user's attention and
-focus is a resource that must be protected. While Android's notification system has been designed
-to minimize the impact of notifications on the users attention, it is nonetheless still important
-to be aware of the fact that notifications are potentially interrupting the users task flow. As you
-plan your notifications, ask yourself if they are important enough to warrant an interruption. If
-you are unsure, allow the user to opt into a notification using your apps notification settings or
-adjust the notifications priority flag.</p>
-<p>While well behaved apps generally only speak when spoken to, there are some limited cases where an
-app actually should interrupt the user with an unprompted notification.</p>
-<p>Notifications should be used primarily for <strong>time sensitive events</strong>, and especially if these
-synchronous events <strong>involve other people</strong>. For instance, an incoming chat is a real time and
-synchronous form of communication: there is another user actively waiting on you to respond.
-Calendar events are another good example of when to use a notification and grab the user's
-attention, because the event is imminent, and calendar events often involve other people.</p>
-
-<img src="{@docRoot}design/media/notifications_pattern_real_time_people.png">
-
-<div class="vspace size-2"> </div>
-
-<div class="layout-content-row">
- <div class="layout-content-col span-7">
-
-<h4>When not to display a notification</h4>
-<p>There are however many other cases where notifications should not be used:</p>
<ul>
-<li>
-<p>Avoid notifying the user of information that is not directed specifically at them, or information that is not truly time sensitive. For instance the asynchronous and undirected updates flowing through a social network generally do not warrant a real time interruption. For the users that do care about them, allow them to opt-in.</p>
-</li>
-<li>
-<p>Don't create a notification if the relevant new information is currently on screen. Instead, use the UI of the application itself to notify the user of new information directly in context. For instance, a chat application should not create system notifications while the user is actively chatting with another user.</p>
-</li>
-<li>
-<p>Don't interrupt the user for low level technical operations, like saving or syncing information, or updating an application, if it is possible for the system to simply take care of itself without involving the user.</p>
-</li>
-<li>
-<p>Don't interrupt the user to inform them of an error if it is possible for the application to quickly recover from the error on its own without the user taking any action.</p>
-</li>
-<li>
-<p>Don't create notifications that have no true notification content and merely advertise your app. A notification should inform the user about a state and should not be used to merely launch an app.</p>
-</li>
-<li>
-<p>Don't create superfluous notifications just to get your brand in front of users. Such
-notifications will only frustrate and likely alienate your audience. The best way to provide the
-user with a small amount of updated information and to keep them engaged with your application is to
-develop a widget that they can choose to place on their home screen.</p>
-</li>
+ <li> Involve another person</li>
+ <li> Are time-sensitive</li>
+ <li> Might immediately change the user's behavior in the real world</li>
</ul>
- </div>
- <div class="layout-content-col span-6">
- <img src="{@docRoot}design/media/notifications_pattern_social_fail.png">
- </div>
+<p>Notifications set to <code>LOW</code> and <code>MIN</code> can still be
+valuable for the user: Many, if not most, notifications just don't need to command the user's
+immediate attention, or vibrate the user's wrist, yet contain information that the user will find
+valuable when they choose to
+look for notifications. Criteria for <code>LOW</code> and <code>MIN</code>
+priority notifications include:</p>
+
+<ul>
+ <li> Don't involve other people</li>
+ <li> Aren't time sensitive</li>
+ <li> Contain content the user might be interested in but could choose to
+browse at their leisure</li>
+</ul>
+
+
+ <img
+src="{@docRoot}images/android-5.0/notifications/notifications_pattern_priority.png"
+ alt="" width="700"/>
+
+
+<h3 style="clear:both" id="set_a_notification_category">Set a notification
+category</h3>
+
+<p>If your notification falls into one of the predefined categories (see
+below), assign it
+accordingly. Aspects of the system UI such as the notification shade (or any
+other notification
+listener) may use this information to make ranking and filtering decisions.</p>
+<table>
+ <tr>
+ <td>
+<p><code><a
+href="/reference/android/app/Notification.html#CATEGORY_CALL">CATEGORY_CALL</a></code></p>
+</td>
+ <td>
+<p>Incoming call (voice or video) or similar synchronous communication
+request</p>
+</td>
+ </tr>
+ <tr>
+ <td>
+<p><code><a
+href="/reference/android/app/Notification.html#CATEGORY_MESSAGE">CATEGORY_MESSAGE</a></code></p>
+</td>
+ <td>
+<p>Incoming direct message (SMS, instant message, etc.)</p>
+</td>
+ </tr>
+ <tr>
+ <td>
+<p><code><a
+href="/reference/android/app/Notification.html#CATEGORY_EMAIL">CATEGORY_EMAIL</a></code></p>
+</td>
+ <td>
+<p>Asynchronous bulk message (email)</p>
+</td>
+ </tr>
+ <tr>
+ <td>
+<p><code><a
+href="/reference/android/app/Notification.html#CATEGORY_EVENT">CATEGORY_EVENT</a></code></p>
+</td>
+ <td>
+<p>Calendar event</p>
+</td>
+ </tr>
+ <tr>
+ <td>
+<p><code><a
+href="/reference/android/app/Notification.html#CATEGORY_PROMO">CATEGORY_PROMO</a></code></p>
+</td>
+ <td>
+<p>Promotion or advertisement</p>
+</td>
+ </tr>
+ <tr>
+ <td>
+<p><code><a
+href="/reference/android/app/Notification.html#CATEGORY_ALARM">CATEGORY_ALARM</a></code></p>
+</td>
+ <td>
+<p>Alarm or timer</p>
+</td>
+ </tr>
+ <tr>
+ <td>
+<p><code><a
+href="/reference/android/app/Notification.html#CATEGORY_PROGRESS">CATEGORY_PROGRESS</a></code></p>
+</td>
+ <td>
+<p>Progress of a long-running background operation</p>
+</td>
+ </tr>
+ <tr>
+ <td>
+<p><code><a
+href="/reference/android/app/Notification.html#CATEGORY_SOCIAL">CATEGORY_SOCIAL</a></code></p>
+</td>
+ <td>
+<p>Social network or sharing update</p>
+</td>
+ </tr>
+ <tr>
+ <td>
+<p><code><a
+href="/reference/android/app/Notification.html#CATEGORY_ERROR">CATEGORY_ERROR</a></code></p>
+</td>
+ <td>
+<p>Error in background operation or authentication status</p>
+</td>
+ </tr>
+ <tr>
+ <td>
+<p><code><a
+href="/reference/android/app/Notification.html#CATEGORY_TRANSPORT">CATEGORY_TRANSPORT</a></code></p>
+</td>
+ <td>
+<p>Media transport control for playback</p>
+</td>
+ </tr>
+ <tr>
+ <td>
+<p><code><a
+href="/reference/android/app/Notification.html#CATEGORY_SYSTEM">CATEGORY_SYSTEM</a></code></p>
+</td>
+ <td>
+<p>System or device status update. Reserved for system use.</p>
+</td>
+ </tr>
+ <tr>
+ <td>
+<p><code><a
+href="/reference/android/app/Notification.html#CATEGORY_SERVICE">CATEGORY_SERVICE</a></code></p>
+</td>
+ <td>
+<p>Indication of running background service</p>
+</td>
+ </tr>
+ <tr>
+ <td>
+<p><code><a
+href="/reference/android/app/Notification.html#CATEGORY_RECOMMENDATION">CATEGORY_RECOMMENDATION</a></code></p>
+</td>
+ <td>
+<p>A specific, timely recommendation for a single thing. For example, a news
+app might want to
+recommend a news story it believes the user will want to read next.</p>
+</td>
+ </tr>
+ <tr>
+ <td>
+<p><code><a
+href="/reference/android/app/Notification.html#CATEGORY_STATUS">CATEGORY_STATUS</a></code></p>
+</td>
+ <td>
+<p>Ongoing information about device or contextual status</p>
+</td>
+ </tr>
+</table>
+
+<h3 id="summarize_your_notifications">Summarize your notifications</h3>
+
+<p>If a notification of a certain type is already pending when your app tries to send a new
+notification of the same type, combine them into a single summary notification for the app. Do not
+create a new object.</p>
+
+<p>A summary notification builds a summary description and allows the user to
+understand how many
+notifications of a particular kind are pending.</p>
+
+<div class="col-6">
+
+<p><strong>Don't</strong></p>
+ <img src="{@docRoot}images/android-5.0/notifications/Summarise_Dont.png"
+ alt="" width="311px" />
</div>
-<h2 id="interacting-with-notifications">Interacting With Notifications</h2>
+<div>
+<p><strong>Do</strong></p>
-<div class="layout-content-row">
- <div class="layout-content-col span-6">
-
- <img src="{@docRoot}design/media/notifications_pattern_phone_icons.png">
-
- </div>
- <div class="layout-content-col span-6">
-
- <p>Notifications are indicated by icons in the notification area and can be accessed by opening the notification drawer.</p>
- <p>Inside the drawer, notifications are chronologically sorted with the latest one on top. Touching a notification opens the associated app to detailed content matching the notification. Swiping left or right on a notification removes it from the drawer.</p>
-
- </div>
+ <img src="{@docRoot}images/android-5.0/notifications/Summarise_Do.png"
+ alt="" width="311px"/>
</div>
-<div class="layout-content-row">
- <div class="layout-content-col span-6">
-
-<p><h4>Ongoing notifications</h4>
-<p>Ongoing notifications keep users informed about an ongoing process in the background. For example, music players announce the currently playing track in the notification system and continue to do so until the user stops the playback. They can also be used to show the user feedback for longer tasks like downloading a file, or encoding a video. Ongoing notifications cannot be manually removed from the notification drawer.</p></p>
-
- </div>
- <div class="layout-content-col span-6">
-
- <img src="{@docRoot}design/media/notifications_pattern_ongoing_music.png">
-
- </div>
+<p style="clear:left; padding-top:30px; padding-bottom:20px">You can provide
+more detail about the individual notifications that make up a
+ summary by using the expanded digest layout. This approach allows users to gain a
+better sense of which
+ notifications are pending and if they are interesting enough to read in
+detail within the
+ associated app.</p>
+<div class="col-6">
+ <img src="{@docRoot}images/android-5.0/notifications/Stack.png"
+style="margin-bottom:20px"
+ alt="" width="311px" />
+ <p class="img-caption">
+ Expanded and contracted notification that is a summary (using <code>InboxStyle</code>)
+ </p>
</div>
-<div class="layout-content-row">
- <div class="layout-content-col span-12">
- <h4>Dialogs and toasts are for feedback not notification</h4>
- <p>Your app should not create a dialog or toast if it is not currently on screen. Dialogs and Toasts should only be displayed as the immediate response to the user taking an action inside of your app. For further guidance on the use of dialogs and toasts, refer to <a href="{@docRoot}design/patterns/confirming-acknowledging.html">Confirming & Acknowledging</a>.</p>
- </div>
+<h3 style="clear:both" id="make_notifications_optional">Make notifications
+optional</h3>
+
+<p>Users should always be in control of notifications. Allow the user to
+disable your app's
+notifications or change their alert properties, such as alert sound and whether
+to use vibration,
+by adding a notification settings item to your application settings.</p>
+
+<h3 id="use_distinct_icons">Use distinct icons</h3>
+<p>By glancing at the notification area, the user should be able to discern
+what kinds of
+notifications are currently pending.</p>
+
+<div class="figure">
+ <img src="{@docRoot}images/android-5.0/notifications/ProductIcons.png"
+ alt="" width="420" />
</div>
+ <div><p><strong>Do</strong></p>
+ <p>Look at the notification icons Android apps already provide and create
+notification icons for
+ your app that are sufficiently distinct in appearance.</p>
+
+ <p><strong>Do</strong></p>
+ <p>Use the proper <a
+href="/design/style/iconography.html#notification">notification icon style</a>
+ for small icons, and the Material Light
+ <a href="/design/style/iconography.html#action-bar">action bar icon
+style</a> for your action
+ icons.</p>
+<p ><strong>Do</strong></p>
+<p >Keep your icons visually simple, avoiding excessive detail that is hard to
+discern.</p>
+
+ <div><p><strong>Don't</strong></p>
+ <p>Place any additional alpha (dimming or fading) into your
+small icons and action
+ icons; they can have anti-aliased edges, but because Android uses these
+icons as masks (that is, only
+ the alpha channel is used), the image should generally be drawn at full
+opacity.</p>
+
+</div>
+<p style="clear:both"><strong>Don't</strong></p>
+
+<p>Use color to distinguish your app from others. Notification icons should
+only be a white-on-transparent background image.</p>
+
+
+<h3 id="pulse_the_notification_led_appropriately">Pulse the notification LED
+appropriately</h3>
+
+<p>Many Android devices contain a notification LED, which is used to keep the
+user informed about
+events while the screen is off. Notifications with a priority level of <code>MAX</code>,
+<code>HIGH</code>, or <code>DEFAULT</code> should
+cause the LED to glow, while those with lower priority (<code>LOW</code> and
+<code>MIN</code>) should not.</p>
+
+<p>The user's control over notifications should extend to the LED. When you use
+DEFAULT_LIGHTS, the
+LED will glow white. Your notifications shouldn't use a different
+color unless the
+user has explicitly customized it.</p>
+
+<h2 id="building_notifications_that_users_care_about">Building Notifications
+That Users Care About</h2>
+
+<p>To create an app that users love, it is important to design your
+notifications carefully.
+Notifications embody your app's voice, and contribute to your app's
+personality. Unwanted or
+unimportant notifications can annoy the user or make them resent how much
+attention the app wants
+from them, so use notifications judiciously.</p>
+
+<h3 id="when_to_display_a_notification">When to display a notification</h3>
+
+<p>To create an application that people enjoy using, it's important to
+recognize that the user's
+attention and focus is a resource that must be protected. While Android's
+notification system has
+been designed to minimize the impact of notifications on the user's attention,
+it is
+still important to be aware of the fact that notifications are interrupting the
+user's task flow.
+As you plan your notifications, ask yourself if they are important enough to
+warrant an interruption. If you are unsure, allow the user to opt into a
+notification using your apps notification settings, or adjust
+the notifications priority flag to <code>LOW</code> or <code>MIN</code> to
+avoid distracting the user while they are doing
+something else.</p>
+
+ <img src="{@docRoot}images/android-5.0/notifications/TimeSensitive.png"
+ alt="" width="311px" />
+ <p style="margin-top:10px" class="img-caption">
+ Examples of time-sensitive notification
+ </p>
+
+<p>While well-behaved apps generally only speak when spoken to, a few cases
+do merit an app's interrupting the user with an unprompted notification.</p>
+
+<p>Use notifications primarily for <strong>time-sensitive events</strong>, especially
+ if these synchronous events <strong>involve other people</strong>. For
+instance, an incoming chat
+ is a real-time and synchronous form of communication: Another user
+actively waiting on your response. Calendar events are another good example of when to use a
+notification and grab the
+ user's attention, because the event is imminent, and calendar events often
+involve other people.</p>
+
+<h3 style="clear:both" id="when_not_to_display_a_notification">When not to
+display a notification</h3>
+
+<div class="figure" style="margin-top:60px">
+ <img src="{@docRoot}images/android-5.0/notifications/AntiSample1.png"
+ alt="" width="311px" />
+</div>
+
+<p>In many other cases, notifications aren't appropriate:</p>
+
+<ul>
+ <li> Avoid notifying the user of information that is not directed
+specifically at them, or
+ information that is not truly time-sensitive. For instance, the asynchronous
+and undirected updates
+ flowing through a social network generally do not warrant a real-time
+interruption. For the users
+ who do care about them, allow them to opt-in.</li>
+ <li> Don't create a notification if the relevant new information is currently
+on screen. Instead,
+ use the UI of the application itself to notify the user of new information
+directly in context.
+ For instance, a chat application should not create system notifications while
+the user is actively chatting with another user.</li>
+ <li> Don't interrupt the user for low-level technical operations, like saving
+or syncing information, or updating an application if the app or system can resolve the issue
+without involving the user.</li>
+ <li> Don't interrupt the user to inform them of an error if it is possible
+for the application to recover from the error on its own without the user
+taking any action.</li>
+ <li> Don't create notifications that have no true notification content and
+merely advertise your
+ app. A notification should provide useful, timely, new information and should
+not be used
+ merely to launch an app.</li>
+ <li> Don't create superfluous notifications just to get your brand in front
+of users.
+ Such notifications frustrate and likely alienate your audience. The
+best way to provide
+ small amounts of updated information and keep them engaged
+with your
+ app is to develop a widget that they can choose to place on their
+home screen.</li>
+</ul>
+
+<h2 style="clear:left" id="interacting_with_notifications">Interacting with
+Notifications</h2>
+
+<p>Notifications are indicated by icons in the status bar, and can be accessed
+by opening the
+notification drawer.</p>
+
+<p>Touching a notification opens the associated app to detailed content
+that matches the notification.
+Swiping left or right on a notification removes it from the drawer.</p>
+
+<h3 id="ongoing_notifications">Ongoing notifications</h3>
+<div class="figure" style="width:311px">
+ <img src="{@docRoot}images/android-5.0/notifications/MusicPlayback.png"
+ alt="" width="311px" />
+ <p class="img-caption">
+ Ongoing notification due to music playback
+ </p>
+</div>
+<p>Ongoing notifications keep users informed about an ongoing process in the
+background.
+For example, music players announce the currently playing track in the
+notification system and
+continue to do so until the user stops the playback. Ongoing notifications can also
+show the user
+feedback for longer tasks like downloading a file, or encoding a video. A user cannot manually
+remove an ongoing notification from the notification drawer.</p>
+
+<h3 id="ongoing_notifications">Media playback</h3>
+<p>In Android 5.0, the lock screen doesn't show transport controls for the deprecated
+{@link android.media.RemoteControlClient} class. But it <em>does</em> show notifications, so each
+app's playback notification is now the primary
+way for users to control playback from a locked state. This behavior gives apps more
+control over which
+buttons to show, and in what way, while providing a consistent experience for
+the user whether or not the screen is locked.</p>
+
+<h3 style="clear:both"
+id="dialogs_and_toasts_are_for_feedback_not_notification">Dialogs
+and toasts</h3>
+
+<p>Your app should not create a dialog or toast if it is not currently on
+screen. A dialog or toast
+ should only be displayed as an immediate response to the user taking an action
+inside of your app.
+For further guidance on the use of dialogs and toasts, refer to
+<a href="/design/patterns/confirming-acknowledging.html">Confirming & Acknowledging</a>.</p>
+
+<h3>Ranking and ordering</h3>
+
+<p>Notifications are news, and so are essentially shown in
+reverse-chronological order, with
+special consideration given to the app's stated notification
+<a href="#correctly_set_and_manage_notification_priority">priority</a>.</p>
+
+<p>Notifications are a key part of the lock screen, and are featured prominently
+every
+time the device display comes on. Space on the lock screen is tight, so it
+is more important
+than ever to identify the most urgent or relevant notifications. For this
+reason, Android has a
+more sophisticated sorting algorithm for notifications, taking into account:</p>
+
+<ul>
+ <li> The timestamp and application's stated priority.</li>
+ <li> Whether the notification has recently disturbed the user with sound or
+vibration. (That is,
+ if the phone just made a noise, and the user wants to know "What just
+happened?", the lock screen
+ should answer that at a glance.)</li>
+ <li> Any people attached to the notification using {@link android.app.Notification#EXTRA_PEOPLE},
+ and, in particular, whether they are starred contacts.</li>
+</ul>
+
+<p>To best take advantage of this sorting, focus on the user
+experience you want
+to create, rather than aiming for any particular spot on the list.</p>
+
+ <img src="{@docRoot}images/android-5.0/notifications/AntiSample3.png"
+ alt="" width="700px" />
+
+ <p class="img-caption" style="margin-top:10px">Gmail notifications are
+default priority, so they
+ normally sort below messages from an instant messaging app like Hangouts, but
+get a
+ temporary bump when new messages come in.
+ </p>
+
+
+<h3>On the lock screen</h3>
+
+<p>Because notifications are visible on the lock screen, user privacy is an
+especially
+important consideration. Notifications often contain sensitive information, and
+should not necessarily be visible
+to anyone who picks up the device and turns on the display.</p>
+
+<ul>
+ <li> For devices that have a secure lock screen (PIN, pattern, or password), the interface has
+ public and private parts. The public interface can be displayed on a secure lock screen and
+ therefore seen by anyone. The private interface is the world behind that lock screen, and
+ is only revealed once the user has signed into the device.</li>
+</ul>
+
+<h3>User control over information displayed on the secure lock screen</h3>
+<div class="figure" style="width:311px">
+ <img src="{@docRoot}images/android-5.0/notifications/LockScreen.png"
+ alt="" width="311px" />
+ <p class="img-caption">
+ Notifications on the lock screen, with contents revealed after the user unlocks the device.
+ </p>
+</div>
+
+<p>When setting up a secure lock screen, the user can choose to conceal
+sensitive details from the secure lock screen. In this case the System UI
+considers the notification's <em>visibility level</em> to figure out what can
+safely be shown.</p>
+<p> To control the visibility level, call
+<code><a
+href="/reference/android/app/Notification.Builder.html#setVisibility(int)">Notification.Builder.setVisibility()</a></code>,
+and specify one of these values:</p>
+
+<ul>
+ <li><code><a
+href="/reference/android/app/Notification.html#VISIBILITY_PUBLIC">VISIBILITY_PUBLIC</a></code>.
+Shows the notification's full content.
+ This is the system default if visibility is left unspecified.</li>
+ <li><code><a
+href="/reference/android/app/Notification.html#VISIBILITY_PRIVATE">VISIBILITY_PRIVATE</a></code>.
+On the lock screen, shows basic information about the existence of this notification, including its
+icon and the name of the app that posted it. The rest of the notification's details are not displayed.
+A couple of good points to keep in mind are as follows:
+ <ul>
+ <li> If you want to provide a different public version of your notification
+for the system to display on a secure lock screen, supply a replacement
+Notification object in the <code><a
+href="/reference/android/app/Notification.html#publicVersion">Notification.publicVersion</a></code>
+field.
+ <li> This setting gives your app an opportunity to create a redacted version of the
+content that is still useful but does not reveal personal information. Consider the example of an
+SMS app whose notifications include the text of the SMS and the sender's name and contact icon.
+This notification should be <code>VISIBILITY_PRIVATE</code>, but <code>publicVersion</code> could still
+contain useful information like "3 new messages" without any other identifying
+details.
+ </ul>
+ </li>
+ <li><code><a
+href="/reference/android/app/Notification.html#VISIBILITY_SECRET">Notification.VISIBILITY_SECRET</A></code>. Shows only the most minimal information, excluding
+even the notification's icon.</li>
+</ul>
+<h2 style="clear:both" id="notifications_on_android_wear">Notifications on
+Android Wear</h2>
+
+<p>Notifications and their <em>actions</em> are bridged over to Wear devices by default.
+Developers can control which notifications bridge from the
+phone to the watch,
+and vice-versa. Developers can also control which actions bridge, as well. If
+your app includes
+actions that can't be accomplished with a single tap, either hide these actions
+on your Wear
+notification or consider hooking them up to a Wear app, thus allowing the user to
+finish the action on
+their watch.</p>
+
+<h4>Bridging notifications and actions</h4>
+
+<p>A connected device, such as a phone, can bridge notifications to a Wear device, so that the
+notifications are displayed there. Similarly, it can bridge actions, so that the user can act
+on the notifications right from the Wear device.</p>
+
+<p><strong>Bridge</strong></p>
+
+<ul>
+ <li> New instant messages</li>
+ <li> Single-tap actions such as +1, Like, Heart</li>
+</ul>
+
+<img src="{@docRoot}images/android-5.0/notifications/WearBasic.png" width="156px"
+height="156px"
+ alt="" />
+
+<p><strong>Don't bridge</strong></p>
+
+<ul>
+ <li> Notifications of newly arrived podcasts</li>
+ <li> Actions that map to features that aren't possible on the watch</li>
+</ul>
+
+
+
+<p><h4>Unique actions to define for Wear</h4></p>
+
+<p>There are some actions that you can perform only on Wear. These include the following:</p>
+
+<ul>
+ <li> Quick lists of canned responses such as "Be right back"</li>
+ <li> Open on the phone</li>
+ <li> A "Comment" or "Reply" action that brings up the speech input screen</li>
+ <li> Actions that launch Wear-specific apps</li>
+</ul>
+
+<img src="{@docRoot}images/android-5.0/notifications/ReplyAction.png" width="156px"
+height="156px"
+ alt="" />
diff --git a/docs/html/design/patterns/notifications_k.jd b/docs/html/design/patterns/notifications_k.jd
new file mode 100644
index 0000000..c8ef50b
--- /dev/null
+++ b/docs/html/design/patterns/notifications_k.jd
@@ -0,0 +1,369 @@
+page.title=Notifications in Android 4.4 and Lower
+@jd:body
+
+<a class="notice-developers" href="{@docRoot}training/notify-user/index.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Notifying the User</p>
+ </div>
+</a>
+
+<a class="notice-designers" href="notifications.html">
+ <div>
+ <h3>Notifications in Android 5.0</h3>
+ </div>
+</a>
+
+<p itemprop="description">The notification system allows your app to keep the
+user informed about events, such as new chat messages or a calendar event.
+Think of notifications as a news channel that alerts the user to important
+events as they happen or a log that chronicles events while the user is not
+paying attention.</p>
+
+<h2>Anatomy of a notification</h2>
+
+<div class="layout-content-row">
+ <div class="layout-content-col span-6">
+ <h4>Base Layout</h4>
+ <p>At a minimum, all notifications consist of a base layout, including:</p>
+ <ul>
+ <li>the sending application's notification icon or the sender's photo</li>
+ <li>a notification title and message</li>
+ <li>a timestamp</li>
+ <li>a secondary icon to identify the sending application when the sender's
+image is shown for the main icon</li>
+ </ul>
+ </div>
+ <div class="layout-content-col span-6">
+ <img src="{@docRoot}design/media/notifications_pattern_anatomy.png">
+ <div class="figure-caption">
+ Base layout of a notification
+ </div>
+ </div>
+</div>
+
+<h4>Expanded layouts</h4>
+<p>You have the option to provide more event detail. You can use this to show
+the first few lines of a message or show a larger image preview. This provides
+the user with additional context, and - in some cases - may allow the user to
+read a message in its entirety. The user can pinch-zoom or two-finger glide in
+order to toggle between base and expanded layouts. For single event
+notifications, Android provides two expanded layout templates (text and image)
+for you to re-use in your application.</p>
+
+<img src="{@docRoot}design/media/notifications_pattern_expandable.png">
+
+<h4>Actions</h4>
+<div class="layout-content-row">
+ <div class="layout-content-col span-6">
+ <p>Android supports optional actions that are displayed at the bottom of
+the notification. With actions, users can handle the most common tasks for a
+particular notification from within the notification shade without having to
+open the originating application. This speeds up interaction and, in
+conjunction with "swipe-to-dismiss", helps users to streamline their
+notification triaging experience.</p>
+ <p>Be judicious with how many actions you include with a notification. The
+more actions you include, the more cognitive complexity you create. Limit
+yourself to the fewest number of actions possible by only including the most
+imminently important and meaningful ones.</p>
+ <p>Good candidates for actions on notifications are actions that are:</p>
+ <ul>
+ <li>essential, frequent and typical for the content type you're
+displaying</li>
+ <li>time-critical</li>
+ <li>not overlapping with neighboring actions</li>
+ </ul>
+ <p>Avoid actions that are:</p>
+ <ul>
+ <li>ambiguous</li>
+ <li>duplicative of the default action of the notification (such as "Read"
+or "Open")</li>
+ </ul>
+ </div>
+ <div class="layout-content-col span-7">
+ <img src="{@docRoot}design/media/notifications_pattern_two_actions.png">
+ <div class="figure-caption">
+ Calendar reminder notification with two actions
+ </div>
+ </div>
+</div>
+
+<p>You can specify a maximum of three actions, each consisting of an action
+icon and an action name. Adding actions to a simple base layout will make the
+notification expandable, even if the notification doesn't have an expanded
+layout. Since actions are only shown for expanded notifications and are
+otherwise hidden, you must make sure that any action a user can invoke from a
+notification is available from within the associated application as well.</p>
+
+<h2>Design guidelines</h2>
+<div class="layout-content-row">
+ <div class="layout-content-col span-6">
+ <img src="{@docRoot}design/media/notifications_pattern_personal.png">
+ </div>
+ <div class="layout-content-col span-7">
+ <h4>Make it personal</h4>
+ <p>For notifications of items sent by another user (such as a message or
+status update), include that person's image.</p>
+ <p>Remember to include the app icon as a secondary icon in the
+notification, so that the user can still identify which app posted it.</p>
+ </div>
+</div>
+
+<h4>Navigate to the right place</h4>
+<p>When the user touches the body of a notification (outside of the action
+buttons), open your app to the place where the user can consume and act upon
+the data referenced in the notification. In most cases this will be the detail
+view of a
+single data item such as a message, but it might also be a summary view if the
+notification is stacked (see <em>Stacked notifications</em> below) and
+references multiple items. If in any of those cases the user is taken to a
+hierarchy level below your app's top-level, insert navigation into your app's
+back stack to allow them to navigate to your app's top level using the system
+back key. For more
+information, see the chapter on <em>System-to-app navigation</em> in the <a
+href="{@docRoot}design/patterns/navigation.html">Navigation</a> design
+pattern.</p>
+
+<h4>Correctly set and manage notification priority</h4>
+<p>Starting with Jelly Bean, Android supports a priority flag for
+notifications. This flag allows you to influence where your notification will
+appear in comparison to other notifications and help to make sure that users
+always see their most important notifications first. You can choose from the
+following priority levels when posting a notification:</p>
+
+<table>
+ <tr>
+ <th><strong>Priority</strong></th>
+ <th><strong>Use</strong></th>
+ </tr>
+ <tr>
+ <td>MAX</td>
+ <td>Use for critical and urgent notifications that alert the user to a
+condition that is time-critical or needs to be resolved before they can
+continue with a particular task.</td>
+ </tr>
+ <tr>
+ <td>HIGH</td>
+ <td>Use high priority notifications primarily for important communication,
+such as message or chat events with content that is particularly interesting
+for the user.</td>
+ </tr>
+ <tr>
+ <td>DEFAULT</td>
+ <td>The default priority. Keep all notifications that don't fall into any
+of the other categories at this priority level.</td>
+ </tr>
+ <tr>
+ <td>LOW</td>
+ <td>Use for notifications that you still want the user to be informed
+about, but that rate low in urgency.</td>
+ </tr>
+ <tr>
+ <td>MIN</td>
+ <td>Contextual/background information (e.g. weather information, contextual
+location information). Minimum priority notifications will not show in the
+status bar. The user will only discover them when they expand the notification
+tray.</td>
+ </tr>
+</table>
+<img src="{@docRoot}design/media/notifications_pattern_priority.png">
+
+<h4>Stack your notifications</h4>
+<p>If your app creates a notification while another of the same type is still
+pending, avoid creating
+an altogether new notification object. Instead, stack the notification.</p>
+<p>A stacked notification builds a summary description and allows the user to
+understand how many
+notifications of a particular kind are pending.</p>
+<p><strong>Don't</strong>:</p>
+
+<img src="{@docRoot}design/media/notifications_pattern_additional_fail.png">
+
+<p><strong>Do</strong>:</p>
+
+<img src="{@docRoot}design/media/notifications_pattern_additional_win.png">
+
+<p>You can provide more detail about the individual notifications that make up
+a stack by using the expanded digest layout. This allows users to gain a better
+sense of which notifications are pending and if they are interesting enough to
+be read in detail within the associated app.</p>
+
+<img src="{@docRoot}design/media/notifications_expand_contract_msg.png">
+
+<h4>Make notifications optional</h4>
+<p>Users should always be in control of notifications. Allow the user to
+disable your apps notifications or change their alert properties, such as alert
+sound and whether to use vibration, by adding a notification settings item to
+your application settings.</p>
+<h4>Use distinct icons</h4>
+<p>By glancing at the notification area, the user should be able to discern
+what kinds of notifications are currently pending.</p>
+
+<div class="do-dont-label good"><strong>Do</strong></div>
+<p style="margin-top:0;">Look at the notification icons the Android apps
+already provide and create notification icons for your app that are
+sufficiently distinct in appearance.</p>
+<div class="do-dont-label good"><strong>Do</strong></div>
+<p style="margin-top:0;">Use the proper <a
+href="{@docRoot}design/style/iconography.html#notification">notification icon
+style</a> for small icons, and the Holo Dark <a
+href="{@docRoot}design/style/iconography.html#action-bar">action bar icon
+style</a> for your action icons.</p>
+<div class="do-dont-label good"><strong>Do</strong></div>
+<p style="margin-top:0;">Keep your icons visually simple and avoid excessive
+detail that is hard to discern.</p>
+<div class="do-dont-label bad"><strong>Don't</strong></div>
+<p style="margin-top:0;">Use color to distinguish your app from others.</p>
+
+<h4>Pulse the notification LED appropriately</h4>
+<p>Many Android devices contain a tiny lamp, called the notification <acronym
+title="Light-Emitting Diode">LED</acronym>, which is used to keep the user
+informed about events while the screen is off. Notifications with a priority
+level of MAX, HIGH, or DEFAULT should cause the LED to glow, while those with
+lower priority (LOW and MIN) should not.</p>
+
+<p>The user's control over notifications should extend to the LED. By default,
+the LED will glow with a white color. Your notifications shouldn't use a
+different color unless the user has explicitly customized it.</p>
+
+<h2>Building notifications that users care about</h2>
+<p>To create an app that feels streamlined, pleasant, and respectful, it is
+important to design your notifications carefully. Notifications embody your
+app's voice, and contribute to your app's personality. Unwanted or unimportant
+notifications can annoy the user, so use them judiciously.</p>
+
+<h4>When to display a notification</h4>
+<p>To create an application that people love, it's important to recognize that
+the user's attention and
+focus is a resource that must be protected. While Android's notification system
+has been designed
+to minimize the impact of notifications on the users attention, it is
+nonetheless still important
+to be aware of the fact that notifications are potentially interrupting the
+users task flow. As you
+plan your notifications, ask yourself if they are important enough to warrant
+an interruption. If
+you are unsure, allow the user to opt into a notification using your apps
+notification settings or
+adjust the notifications priority flag.</p>
+<p>While well behaved apps generally only speak when spoken to, there are some
+limited cases where an
+app actually should interrupt the user with an unprompted notification.</p>
+<p>Notifications should be used primarily for <strong>time sensitive
+events</strong>, and especially if these
+synchronous events <strong>involve other people</strong>. For instance, an
+incoming chat is a real time and
+synchronous form of communication: there is another user actively waiting on
+you to respond.
+Calendar events are another good example of when to use a notification and grab
+the user's
+attention, because the event is imminent, and calendar events often involve
+other people.</p>
+
+<img src="{@docRoot}design/media/notifications_pattern_real_time_people.png">
+
+<div class="vspace size-2"> </div>
+
+<div class="layout-content-row">
+ <div class="layout-content-col span-7">
+
+<h4>When not to display a notification</h4>
+<p>There are however many other cases where notifications should not be
+used:</p>
+<ul>
+<li>
+<p>Avoid notifying the user of information that is not directed specifically at
+them, or information that is not truly time sensitive. For instance the
+asynchronous and undirected updates flowing through a social network generally
+do not warrant a real time interruption. For the users that do care about them,
+allow them to opt-in.</p>
+</li>
+<li>
+<p>Don't create a notification if the relevant new information is currently on
+screen. Instead, use the UI of the application itself to notify the user of new
+information directly in context. For instance, a chat application should not
+create system notifications while the user is actively chatting with another
+user.</p>
+</li>
+<li>
+<p>Don't interrupt the user for low level technical operations, like saving or
+syncing information, or updating an application, if it is possible for the
+system to simply take care of itself without involving the user.</p>
+</li>
+<li>
+<p>Don't interrupt the user to inform them of an error if it is possible for
+the application to quickly recover from the error on its own without the user
+taking any action.</p>
+</li>
+<li>
+<p>Don't create notifications that have no true notification content and merely
+advertise your app. A notification should inform the user about a state and
+should not be used to merely launch an app.</p>
+</li>
+<li>
+<p>Don't create superfluous notifications just to get your brand in front of
+users. Such
+notifications will only frustrate and likely alienate your audience. The best
+way to provide the
+user with a small amount of updated information and to keep them engaged with
+your application is to
+develop a widget that they can choose to place on their home screen.</p>
+</li>
+</ul>
+
+ </div>
+ <div class="layout-content-col span-6">
+ <img src="{@docRoot}design/media/notifications_pattern_social_fail.png">
+ </div>
+</div>
+
+<h2 id="interacting-with-notifications">Interacting With Notifications</h2>
+
+<div class="layout-content-row">
+ <div class="layout-content-col span-6">
+
+ <img src="{@docRoot}design/media/notifications_pattern_phone_icons.png">
+
+ </div>
+ <div class="layout-content-col span-6">
+
+ <p>Notifications are indicated by icons in the notification area and can be
+accessed by opening the notification drawer.</p>
+ <p>Inside the drawer, notifications are chronologically sorted with the
+latest one on top. Touching a notification opens the associated app to detailed
+content matching the notification. Swiping left or right on a notification
+removes it from the drawer.</p>
+
+ </div>
+</div>
+
+<div class="layout-content-row">
+ <div class="layout-content-col span-6">
+
+<p><h4>Ongoing notifications</h4>
+<p>Ongoing notifications keep users informed about an ongoing process in the
+background. For example, music players announce the currently playing track in
+the notification system and continue to do so until the user stops the
+playback. They can also be used to show the user feedback for longer tasks like
+downloading a file, or encoding a video. Ongoing notifications cannot be
+manually removed from the notification drawer.</p></p>
+
+ </div>
+ <div class="layout-content-col span-6">
+
+ <img src="{@docRoot}design/media/notifications_pattern_ongoing_music.png">
+
+ </div>
+</div>
+
+<div class="layout-content-row">
+ <div class="layout-content-col span-12">
+ <h4>Dialogs and toasts are for feedback not notification</h4>
+ <p>Your app should not create a dialog or toast if it is not currently on
+screen. Dialogs and Toasts should only be displayed as the immediate response
+to the user taking an action inside of your app. For further guidance on the
+use of dialogs and toasts, refer to <a
+href="{@docRoot}design/patterns/confirming-acknowledging.html">Confirming &
+Acknowledging</a>.</p>
+ </div>
+</div>
diff --git a/docs/html/design/tv/images/apps-games-rows.jpg b/docs/html/design/tv/images/apps-games-rows.jpg
index 5023655..d18ac6a 100644
--- a/docs/html/design/tv/images/apps-games-rows.jpg
+++ b/docs/html/design/tv/images/apps-games-rows.jpg
Binary files differ
diff --git a/docs/html/design/tv/images/atv-home.jpg b/docs/html/design/tv/images/atv-home.jpg
index 4b25bab..6040a49 100644
--- a/docs/html/design/tv/images/atv-home.jpg
+++ b/docs/html/design/tv/images/atv-home.jpg
Binary files differ
diff --git a/docs/html/design/tv/images/recommendations.png b/docs/html/design/tv/images/recommendations.png
index 942cd10..fb6562f 100644
--- a/docs/html/design/tv/images/recommendations.png
+++ b/docs/html/design/tv/images/recommendations.png
Binary files differ
diff --git a/docs/html/design/tv/images/settings.jpg b/docs/html/design/tv/images/settings.jpg
index 1c5bf31..d96fed4 100644
--- a/docs/html/design/tv/images/settings.jpg
+++ b/docs/html/design/tv/images/settings.jpg
Binary files differ
diff --git a/docs/html/design/tv/patterns.jd b/docs/html/design/tv/patterns.jd
index 51bb699..768dcfc 100644
--- a/docs/html/design/tv/patterns.jd
+++ b/docs/html/design/tv/patterns.jd
@@ -29,7 +29,7 @@
The visual specifications for these icons are shown below.</p>
-<h3>Banners</h3>
+<h3 id="banner">Banners</h3>
<p>App Banners represent your app on the home screen of TV devices and serve and as a way for
users to launch your app. Here are specific requirements for a banner image:
diff --git a/docs/html/design/tv/style.jd b/docs/html/design/tv/style.jd
index 6e2704b..dd10a8a 100644
--- a/docs/html/design/tv/style.jd
+++ b/docs/html/design/tv/style.jd
@@ -70,7 +70,7 @@
exaggerated contrast, causing them to be indistinguishable.</p>
-<h2>Typography</h2>
+<h2 id="typography">Typography</h2>
<p>The text and controls in a TV application's UI should be easily visible and navigable from a
distance. The minimum recommended font size for TV is 12sp. The default text size setting should
diff --git a/docs/html/develop/index.jd b/docs/html/develop/index.jd
index bb90cca..e89e228 100644
--- a/docs/html/develop/index.jd
+++ b/docs/html/develop/index.jd
@@ -37,6 +37,28 @@
<li class="item carousel-home">
<div class="col-8">
+ <img
+ style="max-height: 250px; margin-top:5px;
+ margin-left: 30px; max-width: 451px;"
+src="{@docRoot}design/tv/images/focus.png"
+class="play no-shadow no-transform" />
+ </div>
+ <div class="content-right col-6">
+ <h2>Create Quality Apps for TV</h2>
+ <p>Now that the Android platform has
+ extended to TVs, your apps on Google Play have
+ a new opportunity for engagement in the
+ living room. To provide the best
+ "leanback" experience on the couch, follow
+ this quality checklist.</p>
+ <p><a
+href="{@docRoot}distribute/essentials/quality/tv.html" class="button">Read
+more</a></p>
+ </div>
+ </li>
+
+ <li class="item carousel-home">
+ <div class="col-8">
<img
src="//lh4.ggpht.com/-lfjzgG5Dqrk/UHMThRtpRwI/AAAAAAAABpk/h4d3nsmkgPM/s400/mint.png"
class="play no-shadow no-transform" />
diff --git a/docs/html/distribute/essentials/essentials_toc.cs b/docs/html/distribute/essentials/essentials_toc.cs
index d0a1114..a1c9575 100644
--- a/docs/html/distribute/essentials/essentials_toc.cs
+++ b/docs/html/distribute/essentials/essentials_toc.cs
@@ -11,6 +11,18 @@
</div>
</li>
<li class="nav-section">
+ <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/essentials/quality/tv.html">
+ <span class="en">TV App Quality</span>
+ </a>
+ </div>
+ </li>
+ <li class="nav-section">
+ <div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/essentials/quality/wear.html">
+ <span class="en">Wear App Quality</span>
+ </a>
+ </div>
+ </li>
+ <li class="nav-section">
<div class="nav-section empty" style="font-weight:normal"><a href="<?cs var:toroot?>distribute/essentials/optimizing-your-app.html">
<span class="en">Optimize Your App</span>
</a>
diff --git a/docs/html/distribute/essentials/quality/tv.jd b/docs/html/distribute/essentials/quality/tv.jd
new file mode 100644
index 0000000..b13307e
--- /dev/null
+++ b/docs/html/distribute/essentials/quality/tv.jd
@@ -0,0 +1,514 @@
+page.title=TV App Quality
+page.metaDescription=TV is a growing segment of Android devices that requires specific attention to app design and functionality in order to create a great experience.
+page.image=/distribute/images/gp-tv-quality.png
+@jd:body
+
+<div id="qv-wrapper"><div id="qv">
+<h2>Quality Criteria</h2>
+ <ol>
+ <li><a href="#ux">Design and Interaction</a></li>
+ <li><a href="#fn">Functionality</a></li>
+ <li><a href="#faq">Frequently Asked Questions</a></li>
+ </ol>
+
+ <h2>You Should Also Read</h2>
+ <ol>
+ <li><a href="{@docRoot}distribute/essentials/quality/core.html">
+ Core App Quality</a></li>
+ <li><a href="{@docRoot}distribute/essentials/optimizing-your-app.html">
+ Optimize Your App</a></li>
+ </ol>
+</div>
+</div>
+
+<div class="top-right-float" style="padding-right:0;margin-bottom:1em;">
+ <img src="{@docRoot}distribute/images/gp-tv-quality.png" style="width:480px;">
+</div>
+
+<p>
+ Users have a different set of expectations when watching TV, compared to using a phone or tablet.
+ A typical TV user sits about 10 feet away from the screen, so small details are less noticeable
+ and small text is hard to read. Since users sit away from a TV, they must use a remote
+ control device to navigate and make selections rather than touching elements on screen. These
+ differences significantly change the requirements for what makes a good TV user experience.
+</p>
+
+<p>
+ The first step toward creating a great experience for TV users is to review and follow the
+ <a href="{@docRoot}design/tv/index.html">Android TV design guidelines</a>, which provides
+ instructions on how to build the best user experience for TV apps. You should also review the
+ <a href="{@docRoot}training/tv/start/index.html">Building TV Apps</a> training, to understand the
+ basic implementation requirements for a TV app.
+</p>
+
+<p class="caution">
+ <strong>Important:</strong> To ensure a great user experience, apps for TV devices must meet some
+ specific requirements for usability. Only apps that meet the following quality criteria will
+ qualify as an Android TV app on Google Play.
+</p>
+
+<p class="note">
+ <strong>Note:</strong> You will be able to submit TV apps to Google Play with the public release
+ of Android 5.0 on November 3. Stay tuned for more information about how to submit your TV apps
+ through the Google Play Developer Console.
+</p>
+
+
+<div class="headerLine">
+ <h2 id="ux">
+ Visual Design and User Interaction
+ </h2>
+
+
+</div>
+
+<p>
+ These criteria ensure that your app follows critical design and interaction patterns
+ to ensure a consistent, intuitive, and enjoyable user experience on TV devices.
+</p>
+
+<table>
+
+<tr>
+ <th style="width:2px;">
+ Type
+ </th>
+ <th style="width:54px;">
+ Test
+ </th>
+ <th>
+ Description
+ </th>
+</tr>
+
+<tr>
+ <td rowspan="4" id="launcher">
+ Launcher
+ </td>
+
+ <td id="TV-LM">
+ TV-LM
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App displays a launcher icon in the Android TV Launcher after installation.
+ (<a href="{@docRoot}training/tv/start/start.html#tv-activity">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="TV-LB">
+ TV-LB
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App displays a 320px x 180px full-size banner as its launcher icon in the Android TV Launcher.
+ (<a href="{@docRoot}design/tv/patterns.html#banner">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="TV-BN">
+ TV-BN
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App launch banner contains the name of the app.
+ (<a href="{@docRoot}design/tv/patterns.html#banner">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="TV-LG">
+ TV-LG
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ If the app is a game, it appears in the Games row in the Android TV Launcher.<br>
+ (<a href="{@docRoot}training/tv/games/index.html#manifest">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td rowspan="5" id="layout">
+ Layout
+ </td>
+
+ <td id="TV-LO">
+ TV-LO
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ All app interfaces are presented in landscape orientation.
+ (<a href="{@docRoot}training/tv/start/layouts.html#structure">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="TV-TC">
+ TV-TC
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App displays core text at 16sp or higher in size.
+ (<a href="{@docRoot}design/tv/style.html#typography">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="TV-TA">
+ TV-TA
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App displays all text at 12sp or higher in size.
+ (<a href="{@docRoot}design/tv/style.html#typography">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="TV-OV">
+ TV-OV
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App does not display any text or functionality that is partially cut off by the
+ edges of the screen.
+ (<a href="{@docRoot}training/tv/start/layouts.html#overscan">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="TV-TR">
+ TV-TR
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App does not partially obscure other apps. App fills the entire screen and has a
+ non-transparent background.
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td rowspan="3" id="navigation">
+ Navigation
+ </td>
+
+ <td id="TV-DP">
+ TV-DP
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App functionality is navigable using 5-way D-pad controls, unless the app
+ requires a gamepad controller as specified in <a href="#TV-GP">TV-GP</a>.
+ (<a href="{@docRoot}training/tv/start/navigation.html#d-pad-navigation">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="TV-DK">
+ TV-DK
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ If the app requires a game controller, as specified in <a href="#TV-GP">TV-GP</a>, all
+ functionality is navigable using standard Android game controller keys.
+ (<a href="{@docRoot}training/game-controllers/controller-input.html#button">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="TV-DM">
+ TV-DM
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App does not depend on a remote controller having a Menu button to access user interface
+ controls.
+ (<a href="{@docRoot}training/tv/start/navigation.html#d-pad-navigation">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+
+</table>
+
+
+<h3 class="rel-resources clearfloat">Related resources</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query=
+"collection:distribute/essentials/tvqualityguidelines/visualdesign"
+data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
+</div>
+
+
+
+<div class="headerLine">
+ <h2 id="fn">
+ Functionality
+ </h2>
+
+
+</div>
+
+<p>
+ These criteria ensure that your app is configured correctly and provides expected
+ functional behavior.
+</p>
+
+
+<table>
+<tr>
+ <th style="width:2px;">
+ Type
+ </th>
+ <th style="width:54px;">
+ Test
+ </th>
+ <th>
+ Description
+ </th>
+</tr>
+
+<tr>
+ <td rowspan="2" id="manifest">
+ Manifest
+ </td>
+
+ <td id="TV-ML">
+ TV-ML
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App manifest sets an intent type of {@link android.content.Intent#ACTION_MAIN} with category
+ {@link android.content.Intent#CATEGORY_LEANBACK_LAUNCHER}.
+ (<a href="{@docRoot}training/tv/start/start.html#tv-activity">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+</tr>
+ <td id="TV-MT">
+ TV-MT
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App manifest sets the hardware feature {@code android.hardware.touchscreen} to not required.
+ (<a href="{@docRoot}training/tv/start/hardware.html#declare-hardware-requirements">Learn
+ how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td rowspan="2" id="game-controllers">
+ Game Controllers
+ </td>
+
+ <td id="TV-GP">
+ TV-GP
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ If the app uses a game controller as it's primary input method, it declares the appropriate
+ requirement with the <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html"
+ >{@code <uses-feature>}</a> manifest tag.
+ (<a href="{@docRoot}training/tv/games/index.html#gamepad">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="TV-GC">
+ TV-GC
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ If the app provides visual instructions for using game controllers, the instructions should
+ be free of branding and show a compatible button layout.
+ (<a href="{@docRoot}training/tv/games/index.html#ControllerHelp">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td rowspan="4" id="advertising">
+ Advertising
+ </td>
+
+ <td id="TV-AP">
+ TV-AP
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App allows interaction with advertising using D-pad controls.
+ (<a href="{@docRoot}training/tv/start/navigation.html#d-pad-navigation">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="TV-AD">
+ TV-AD
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ For advertising that uses fullscreen, non-video ads, the app allows the user to
+ immediately dismiss the ad with D-pad controls.
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="TV-AU">
+ TV-AU
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ For advertising that uses clickable, non-fullscreen, non-video ads, the app does not allow
+ ads to link to a web URL.
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="TV-AA">
+ TV-AA
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ For advertising that uses clickable, non-fullscreen, non-video ads, the app does not allow
+ ads to link to another app that is not available on TV devices.
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td rowspan="1" id="web">
+ Web Content
+ </td>
+
+ <td id="TV-WB">
+ TV-WB
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ For web content, the app uses {@link android.webkit.WebView} components and does not attempt
+ to launch a web browser app.
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td rowspan="3" id="media-playback">
+ Media Playback
+ </td>
+
+ <td id="TV-NP">
+ TV-NP
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ If the app continues to play sound after the user has left, the app provides a <em>Now
+ Playing</em> card on the home screen recommendation row so users can return to the app to
+ control playback.
+ (<a href="{@docRoot}training/tv/playback/now-playing.html">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="TV-PA">
+ TV-PA
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ If the app provides a <em>Now Playing</em> card, selecting this card takes the user to
+ a screen that allows playback to be paused.
+ (<a href="{@docRoot}training/tv/playback/now-playing.html">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="TV-PP">
+ TV-PP
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ If the app plays video or music content, the app toggles between play and pause of media
+ playback when a play or pause key event is sent during playback.<br>
+ (<a href="{@docRoot}reference/android/view/KeyEvent.html#KEYCODE_MEDIA_PLAY_PAUSE">Learn
+ how</a>)
+ </p>
+ </td>
+</tr>
+
+
+</table>
+
+
+<h3 class="rel-resources clearfloat">Related resources</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query=
+"collection:distribute/essentials/tvqualityguidelines/functionality"
+data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
+</div>
+
+
+<div class="headerLine">
+ <h2 id="faq">
+ Frequently Asked Questions
+ </h2>
+</div>
+
+<p style="margin-top:30px;">
+ <strong>After I submit my app, how will find out if my app does not meet all the requirements for
+ TV devices?</strong>
+</p>
+<p>
+ If your app does not meet the usability requirements described on this page, the Play Store team
+ will contact you through the email address specified in main <a href=
+ "https://play.google.com/apps/publish/">Google Play Developer Console</a> account associated with
+ the app.
+</p>
+<p class="caution">
+ <strong>Caution:</strong> Make sure your app includes the <a href=
+ "{@docRoot}preview/tv/start/index.html#tv-activity">required manifest entries</a> for TV devices,
+ otherwise your app will not be considered a TV app and will not be reviewed for TV usability
+ requirements.
+</p>
+
+
+<p style="margin-top:30px;">
+ <strong>My app targets more than just TV devices. If my app does not meet the TV device
+ requirements, will my new or updated app still appear on Google Play for phones and
+ tablets?</strong>
+</p>
+<p>
+ Yes. The requirements described above only restrict distribution to the Google Play Store on TV
+ devices. Distribution to other device types, such as phones, tablets and other devices, is not
+ affected.
+</p>
+
+
+<p style="margin-top:30px;">
+ <strong>If my app meets the publishing requirements, when will it be available in the Google
+ Play Store on TV devices?</strong>
+</p>
+
+<p>
+ Apps that meet the requirements for TV will appear in the Google Play Store on TV devices
+ <em>after</em> the official release of Android 5.0.
+</p>
\ No newline at end of file
diff --git a/docs/html/distribute/essentials/quality/wear.jd b/docs/html/distribute/essentials/quality/wear.jd
new file mode 100644
index 0000000..4125027
--- /dev/null
+++ b/docs/html/distribute/essentials/quality/wear.jd
@@ -0,0 +1,416 @@
+page.title=Wear App Quality
+page.tags="wear","wearables","quality","guidelines"
+page.metaDescription=Wearables are smaller devices that are built for glanceability and require unique apps to provide just the right information at the the right time.
+page.image=/distribute/images/gp-wear-quality.png
+@jd:body
+
+<div id="qv-wrapper"><div id="qv">
+<h2>Quality Criteria</h2>
+ <ol>
+ <li><a href="#ux">Design and Interaction</a></li>
+ <li><a href="#fn">Functionality</a></li>
+ <li><a href="#faq">Frequently Asked Questions</a></li>
+ </ol>
+
+ <h2>You Should Also Read</h2>
+ <ol>
+ <li><a href="{@docRoot}distribute/essentials/quality/core.html">
+ Core App Quality</a></li>
+ <li><a href="{@docRoot}distribute/essentials/optimizing-your-app.html">
+ Optimize Your App</a></li>
+ <li><a href="{@docRoot}design/patterns/notifications.html">
+ Notifications</a></li>
+ </ol>
+</div>
+</div>
+
+<img src="{@docRoot}distribute/images/gp-wear-quality.png" style="width:480px;">
+
+<p>
+ Android Wear aims to provide users with just the right information at just the right time. Great
+ Android Wear experiences are launched automatically, glanceable, and require zero or low user
+ interaction. Designing apps for wearables is substantially different than designing for phones or
+ tablets. There are different strengths and weaknesses, different use cases, and different
+ ergonomics to take into consideration.
+</p>
+
+<p>
+ The first step toward creating a great experience for users on Wear is to read the
+ <a href="{@docRoot}design/wear/index.html">Android Wear design guidelines</a>, which provides
+ instructions on how to build the best user experience for Wear apps. You should also review the
+ <a href="{@docRoot}training/building-wearables.html">Building Apps for Wearables</a> training, to
+ understand the basic implementation requirements for a Wear app.
+</p>
+
+<p class="caution">
+ <strong>Important:</strong> To ensure a great user experience, apps for wearables must meet
+ specific requirements for usability. Only apps that meet the following quality criteria will
+ qualify as an Android Wear app on Google Play. Qualifying as a Wear app will make it easier for
+ Android Wear users to discover your app on Google Play.
+</p>
+
+<p class="note">
+ <strong>Note:</strong> You will be able to submit your apps for Android Wear review when the
+ public release of Android 5.0 launches on November 3. Stay tuned for more information about how to
+ submit your apps for Android Wear review through the <a href="https://play.google.com/apps/publish/signup/">Google Play Developer Console</a>.
+</p>
+
+<div class="headerLine">
+ <h2 id="fn">
+ Functionality
+ </h2>
+
+
+</div>
+
+<p>
+ These criteria ensure that your app is configured correctly and provides the expected
+ functional behavior.
+</p>
+
+
+<table>
+<tr>
+ <th style="width:2px;">
+ Type
+ </th>
+ <th style="width:54px;">
+ ID
+ </th>
+ <th>
+ Description
+ </th>
+</tr>
+
+<tr>
+ <td rowspan="1" id="general">
+ General
+ </td>
+
+ <td id="WR-GL">
+ WR-GL
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ Handheld app includes either notifications with wearable-specific functionality or a wearable
+ app that runs directly on the Wear device.
+ (<a href="{@docRoot}training/building-wearables.html">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td rowspan="1" id="packaging">
+ Packaging
+ </td>
+
+ <td id="WR-PK">
+ WR-PK
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ Wearable apps that run directly on the device are packaged inside the primary handheld app.
+ (<a href="{@docRoot}training/wearables/apps/packaging.html">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+
+<tr>
+ <td rowspan="3" id="functional-notifications">
+ Notifications
+ </td>
+
+ <td id="WR-FW">
+ WR-FW
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ Notifications with wearable-specific functionality use a {@code RemoteInput} or
+ {@code WearableExtender}.
+ (<a href="{@docRoot}training/wearables/notifications/index.html">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="WR-FR">
+ WR-FR
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ Notifications for messaging apps allow users to reply via voice input or quick responses.
+ (<a href="{@docRoot}training/wearables/notifications/voice-input.html">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="WR-FG">
+ WR-FG
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ Similar notifications are grouped together in a stack.
+ (<a href="{@docRoot}training/wearables/notifications/stacks.html">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td rowspan="2" id="gestures">
+ Gestures
+ </td>
+
+ <td id="WR-GP">
+ WR-GP
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ Full-screen activities use long press for the sole purpose of prompting to quit.
+ <br/>
+ (<a href="{@docRoot}training/wearables/ui/exit.html">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="WR-GD">
+ WR-GD
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ If the app disables the swipe-to-dismiss gesture in a full-screen activity, it responds to the
+ long-press-to-dismiss gesture in that activity.
+ (<a href="{@docRoot}training/wearables/ui/exit.html">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+</table>
+
+
+<h3 class="rel-resources clearfloat">Related resources</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query=
+"collection:distribute/essentials/wearqualityguidelines/functionality"
+data-sortorder="-timestamp" data-cardsizes="6x2" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="ux">
+ Visual Design and User Interaction
+ </h2>
+
+
+</div>
+
+<p>
+ These criteria ensure that your app follows critical design and interaction patterns to provide a
+ consistent, intuitive, and enjoyable user experience on wearables.
+</p>
+
+<table>
+
+<tr>
+ <th style="width:2px;">
+ Type
+ </th>
+ <th style="width:54px;">
+ ID
+ </th>
+ <th>
+ Description
+ </th>
+</tr>
+
+<tr>
+ <td rowspan="3" id="layout">
+ Layout
+ </td>
+
+ <td id="WR-LS">
+ WR-LS
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App user interface is formatted appropriately for square displays. App content fits within
+ the physical display area and no text or controls are cut off by the screen edges.
+ <br/>
+ (<a href="{@docRoot}training/wearables/ui/layouts.html">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="WR-LR">
+ WR-LR
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App user interface is formatted appropriately for round displays. App content fits within
+ the physical display area and no text or controls are cut off by the screen edges.
+ <br/>
+ (<a href="{@docRoot}training/wearables/ui/layouts.html">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="WR-TC">
+ WR-TC
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App text is large and glanceable with a suggested minimum size of 16sp.
+ (<a href="{@docRoot}design/wear/style.html#Typography">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td rowspan="1" id="launcher">
+ Launcher
+ </td>
+
+ <td id="WR-LN">
+ WR-LN
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App launcher string is the app name, not a command phrase.
+ (<a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td rowspan="5" id="notifications">
+ Notifications
+ </td>
+
+ <td id="WR-NC">
+ WR-NC
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App displays confirmation animations when appropriate.
+ (<a href="{@docRoot}design/wear/patterns.html#Countdown">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="WR-NR">
+ WR-NR
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ Notification cards have the app icon visible at the top right edge. The one exception is if the
+ notification card has single-action controls, for example a media playback card.
+ <br/>
+ (<a href="{@docRoot}design/wear/style.html#Assets">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="WR-WI">
+ WR-WI
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ Notification actions have a white icon, action title, and transparent background.
+ <br/>
+ (<a href="{@docRoot}training/wearables/notifications/creating.html#ActionButtons">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="WR-PB">
+ WR-PB
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ Notification photo backgrounds are used only to convey information, not to brand a card.
+ (<a href="{@docRoot}design/wear/style.html#Branding">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td id="WR-PR">
+ WR-PR
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ Notification photo backgrounds have a resolution of at least 400x400.
+ (<a href="{@docRoot}training/wearables/notifications/creating.html#AddWearableFeatures">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+<tr>
+ <td rowspan="1" id="googleplay">
+ Google Play
+ </td>
+
+ <td id="WR-GS">
+ WR-GS
+ </td>
+ <td>
+ <p style="margin-bottom:.5em;">
+ App includes at least one Wear screenshot in its Play Store Listing.
+ (<a href="https://support.google.com/googleplay/android-developer/answer/1078870?hl=en">Learn how</a>)
+ </p>
+ </td>
+</tr>
+
+</table>
+
+
+<h3 class="rel-resources clearfloat">Related resources</h3>
+
+<div class="resource-widget resource-flow-layout col-13" data-query=
+"collection:distribute/essentials/wearqualityguidelines/visualdesign"
+data-sortorder="-timestamp" data-cardsizes="6x2" data-maxresults="6">
+</div>
+
+<div class="headerLine">
+ <h2 id="faq">
+ Frequently Asked Questions
+ </h2>
+</div>
+
+<p style="margin-top:30px;">
+ <strong>After I submit my app for Android Wear review, how will I find out if my app does not meet
+ all the requirements for Wear?</strong>
+</p>
+<p>
+ If your app does not meet the usability requirements described on this page, the Play Store team
+ will contact you through the email address specified in the <a href=
+ "https://play.google.com/apps/publish/">Google Play Developer Console</a> account associated with
+ the app.
+</p>
+<p class="caution">
+ <strong>Caution:</strong> Make sure your app meets the <a href="#fn">functionality
+ requirements</a>, otherwise your app will not be considered a Wear app and will not be reviewed
+ for Wear <a href="#ux">design and interaction</a>.
+</p>
+<p class="note">
+ <strong>Note:</strong> You will be able to submit your apps for additional Android Wear review when
+ the public release of Android 5.0 launches on November 3.
+</p>
+
+
+<p style="margin-top:30px;">
+ <strong>If my app does not meet the Wear requirements, will my new or updated app still appear on
+ Google Play for phones and tablets and still be installable on wearables?</strong>
+</p>
+<p>
+ Yes. The requirements described above only determine whether your app will be identified as an
+ Android Wear app on Google Play and easier for Android Wear users to discover. If your app is not
+ accepted as a Wear app, it will still be available to other device types, such as phones and
+ tablets, and it will still be installable on wearables.
+</p>
diff --git a/docs/html/distribute/images/gp-tv-quality.png b/docs/html/distribute/images/gp-tv-quality.png
new file mode 100644
index 0000000..44da11b
--- /dev/null
+++ b/docs/html/distribute/images/gp-tv-quality.png
Binary files differ
diff --git a/docs/html/distribute/images/gp-wear-quality.png b/docs/html/distribute/images/gp-wear-quality.png
new file mode 100644
index 0000000..a51a32c
--- /dev/null
+++ b/docs/html/distribute/images/gp-wear-quality.png
Binary files differ
diff --git a/docs/html/google/play/billing/billing_reference.jd b/docs/html/google/play/billing/billing_reference.jd
index 4d80964..902c2c6 100644
--- a/docs/html/google/play/billing/billing_reference.jd
+++ b/docs/html/google/play/billing/billing_reference.jd
@@ -52,6 +52,11 @@
<td>User pressed back or canceled a dialog</td>
</tr>
<tr>
+ <td>{@code BILLING_RESPONSE_RESULT_SERVICE_UNAVAILABLE}</td>
+ <td>2</td>
+ <td>Network connection is down</td>
+ </tr>
+ <tr>
<td>{@code BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE}</td>
<td>3</td>
<td>Billing API version is not supported for the type requested</td>
diff --git a/docs/html/google/play/billing/billing_testing.jd b/docs/html/google/play/billing/billing_testing.jd
index 10f5326..36456cc 100644
--- a/docs/html/google/play/billing/billing_testing.jd
+++ b/docs/html/google/play/billing/billing_testing.jd
@@ -10,7 +10,7 @@
<ol>
<li><a href="#testing-purchases">Testing In-app Purchases</a></li>
<li><a href="#billing-testing-static">Testing with Static Responses</a></li>
- <li><a href="#billing-testing-real">Setting Up for Test Purchases</a></li>
+ <li><a href="#billing-testing-test">Setting Up for Test Purchases</a></li>
<li><a href="#draft_apps">Draft Apps are No Longer Supported</a></li>
</ol>
<h2>See also</h2>
diff --git a/docs/html/guide/components/recents.jd b/docs/html/guide/components/recents.jd
new file mode 100644
index 0000000..78cc6ac
--- /dev/null
+++ b/docs/html/guide/components/recents.jd
@@ -0,0 +1,256 @@
+page.title=Overview Screen
+page.tags="recents","overview"
+
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+ <h2>In this document</h2>
+ <ol>
+ <li><a href="#adding">Adding Tasks to the Overview Screen</a>
+ <ol>
+ <li><a href="#flag-new-doc">Using the Intent flag to add a task</a></li>
+ <li><a href="#attr-doclaunch">Using the Activity attribute to add a task</a></li>
+ </ol>
+ </li>
+ <li><a href="#removing">Removing Tasks</a>
+ <ol>
+ <li><a href="#apptask-remove">Using the AppTask class to remove tasks</a></li>
+ <li><a href="#retain-finished">Retaining finished tasks</a></li>
+ </ol>
+ </li>
+ </ol>
+
+ <h2>Key classes</h2>
+ <ol>
+ <li>{@link android.app.ActivityManager.AppTask}</li>
+ <li>{@link android.content.Intent}</li>
+ </ol>
+
+ <h2>Sample code</h2>
+ <ol>
+ <li><a href="{@docRoot}samples/DocumentCentricApps/index.html">Document-centric Apps</a></li>
+ </ol>
+
+</div>
+</div>
+
+<p>The overview screen (also referred to as the recents screen, recent task list, or recent apps)
+is a system-level UI that lists recently accessed <a href="{@docRoot}guide/components/activities.html">
+activities</a> and <a href="{@docRoot}guide/components/tasks-and-back-stack.html">tasks</a>. The
+user can navigate through the list and select a task to resume, or the user can remove a task from
+the list by swiping it away. With the Android 5.0 release (API level 21), multiple instances of the
+same activity containing different documents may appear as tasks in the overview screen. For example,
+Google Drive may have a task for each of several Google documents. Each document appears as a
+task in the overview screen.</p>
+
+<img src="{@docRoot}images/components/recents.png" alt="" width="284" />
+<p class="img-caption"><strong>Figure 1.</strong> The overview screen showing three Google Drive
+documents, each represented as a separate task.</p>
+
+<p>Normally you should allow the system to define how your tasks and
+activities are represented in the overview screen, and you don't need to modify this behavior.
+However, your app can determine how and and when activities appear in the overview screen. The
+{@link android.app.ActivityManager.AppTask} class lets you manage tasks, and the activity flags of
+the {@link android.content.Intent} class let you specify when an activity is added or removed from
+the overview screen. Also, the <code><a href="{@docRoot}guide/topics/manifest/activity-element.html">
+<activity></a></code> attributes let you set the behavior in the manifest.</p>
+
+<h2 id="adding">Adding Tasks to the Overview Screen</h2>
+
+<p>Using the flags of the {@link android.content.Intent} class to add a task affords greater control
+over when and how a document gets opened or reopened in the overview screen. When you use the
+<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code>
+attributes you can choose between always opening the document in a new task or reusing an
+existing task for the document.</p>
+
+<h3 id="flag-new-doc">Using the Intent flag to add a task</h3>
+
+<p>When you create a new document for your activity, you call the
+{@link android.app.ActivityManager.AppTask#startActivity(android.content.Context, android.content.Intent, android.os.Bundle) startActivity()}
+method of the {@link android.app.ActivityManager.AppTask} class, passing to it the intent that
+launches the activity. To insert a logical break so that the system treats your activity as a new
+task in the overview screen, pass the {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} flag
+in the {@link android.content.Intent#addFlags(int) addFlags()} method of the {@link android.content.Intent}
+that launches the activity.</p>
+
+<p class="note"><strong>Note:</strong> The {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT}
+flag replaces the {@link android.content.Intent#FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET} flag,
+which is deprecated as of Android 5.0 (API level 21).</p>
+
+<p>If you set the {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} flag when you create
+the new document, the system always creates a new task with the target activity as the root.
+This setting allows the same document to be opened in more than one task. The following code demonstrates
+how the main activity does this:</p>
+
+<p class="code-caption"><a href="{@docRoot}samples/DocumentCentricApps/index.html">
+DocumentCentricActivity.java</a></p>
+<pre>
+public void createNewDocument(View view) {
+ final Intent newDocumentIntent = newDocumentIntent();
+ if (useMultipleTasks) {
+ newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
+ }
+ startActivity(newDocumentIntent);
+ }
+
+ private Intent newDocumentIntent() {
+ boolean useMultipleTasks = mCheckbox.isChecked();
+ final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class);
+ newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
+ newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, incrementAndGet());
+ return newDocumentIntent;
+ }
+
+ private static int incrementAndGet() {
+ Log.d(TAG, "incrementAndGet(): " + mDocumentCounter);
+ return mDocumentCounter++;
+ }
+}
+</pre>
+
+<p class="note"><strong>Note:</strong> Activities launched with the {@code FLAG_ACTIVITY_NEW_DOCUMENT}
+flag must have the {@code android:launchMode="standard"} attribute value (the default) set in the
+manifest.</p>
+
+<p>When the main activity launches a new activity, the system searches through existing tasks for
+one whose intent matches the intent component name and the Intent data for the activity. If the task
+is not found, or the intent contained the {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK}
+flag, a new task will be created with the activity as its root. If it finds one, it brings that task
+to the front and passes the new intent to {@link android.app.Activity#onNewIntent onNewIntent()}.
+The new activity gets the intent and creates a new document in the overview screen, as in the
+following example:</p>
+
+<p class="code-caption"><a href="{@docRoot}samples/DocumentCentricApps/index.html">
+NewDocumentActivity.java</a></p>
+<pre>
+@Override
+protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_new_document);
+ mDocumentCount = getIntent()
+ .getIntExtra(DocumentCentricActivity.KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0);
+ mDocumentCounterTextView = (TextView) findViewById(
+ R.id.hello_new_document_text_view);
+ setDocumentCounterText(R.string.hello_new_document_counter);
+}
+
+@Override
+protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ /* If FLAG_ACTIVITY_MULTIPLE_TASK has not been used, this activity
+ is reused to create a new document.
+ */
+ setDocumentCounterText(R.string.reusing_document_counter);
+}
+</pre>
+
+
+<h3 id="#attr-doclaunch">Using the activity attribute to add a task</h3>
+
+<p>An activity can also specify in its manifest that it always launches into a new task by using
+the <code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code>
+attribute, <a href="{@docRoot}guide/topics/manifest/activity-element.html#dlmode">
+{@code android:documentLaunchMode}</a>. This attribute has four values which produce the following
+effects when the user opens a document with the application:</p>
+
+<dl>
+ <dt>"{@code intoExisting}"</dt>
+ <dd>The activity reuses an existing task for the document. This is the same as setting the
+ {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} flag <em>without</em> setting the
+ {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} flag, as described in
+ <a href="#flag-new-doc">Using the Intent flag to add a task</a>, above.</dd>
+
+ <dt>"{@code always}"</dt>
+ <dd>The activity creates a new task for the document, even if the document is already opened. Using
+ this value is the same as setting both the {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT}
+ and {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} flags.</dd>
+
+ <dt>"{@code none”}"</dt>
+ <dd>The activity does not create a new task for the document. The overview screen treats the
+ activity as it would by default: it displays a single task for the app, which
+ resumes from whatever activity the user last invoked.</dd>
+
+ <dt>"{@code never}"</dt>
+ <dd>The activity does not create a new task for the document. Setting this value overrides the
+ behavior of the {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT}
+ and {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} flags, if either of these are set
+ in the intent, and the overview screen displays a single task for the app, which resumes from
+ whatever activity the user last invoked.</dd>
+</dl>
+
+<p class="note"><strong>Note:</strong> For values other than {@code none} and {@code never} the
+activity must be defined with {@code launchMode="standard"}. If this attribute is not specified,
+{@code documentLaunchMode="none"} is used.</p>
+
+<h2 id="removing">Removing Tasks</h2>
+
+<p>By default a document task is automatically removed from the overview screen when its activity
+finishes. You can override this behavior with the {@link android.app.ActivityManager.AppTask} class,
+with an {@link android.content.Intent} flag, or with an<code><a href="{@docRoot}guide/topics/manifest/activity-element.html">
+<activity></a></code> attribute.</p>
+
+<p>You can always exclude a task from the overview screen entirely by setting the
+<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code>
+attribute, <a href="{@docRoot}guide/topics/manifest/activity-element.html#exclude">
+{@code android:excludeFromRecents}</a> to {@code true}.</p>
+
+<p>You can set the maximum number of tasks that your app can include in the overview screen by setting
+the <code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code>
+attribute <a href="{@docRoot}guide/topics/manifest/activity-element.html#maxrecents">{@code android:maxRecents}
+</a> to an integer value. The default is 16. When the maximum number of tasks is reached, the least
+recently used task is removed from the overview screen. The {@code android:maxRecents} maximum value
+is 50 (25 on low memory devices); values less than 1 are not valid.</p>
+
+<h3 id="#apptask-remove">Using the AppTask class to remove tasks</h3>
+
+<p>In the activity that creates a new task in the overview screen, you can
+specify when to remove the task and finish all activities associated with it by calling
+the {@link android.app.ActivityManager.AppTask#finishAndRemoveTask() finishAndRemoveTask()} method.</p>
+
+<p class="code-caption"><a href="{@docRoot}samples/DocumentCentricApps/index.html">
+NewDocumentActivity.java</a></p>
+<pre>
+public void onRemoveFromRecents(View view) {
+ // The document is no longer needed; remove its task.
+ finishAndRemoveTask();
+}
+</pre>
+
+<p class="note"><strong>Note:</strong> Using the
+{@link android.app.ActivityManager.AppTask#finishAndRemoveTask() finishAndRemoveTask()} method
+overrides the use of the {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS} tag,
+discussed below.</p>
+
+<h3 id="#retain-finished">Retaining finished tasks</h3>
+
+<p>If you want to retain a task in the overview screen, even if its activity has finished, pass
+the {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS} flag in the
+{@link android.content.Intent#addFlags(int) addFlags()} method of the Intent that launches the activity.</p>
+
+<p class="code-caption"><a href="{@docRoot}samples/DocumentCentricApps/index.html">
+DocumentCentricActivity.java</a></p>
+<pre>
+private Intent newDocumentIntent() {
+ final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class);
+ newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT |
+ android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS);
+ newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, incrementAndGet());
+ return newDocumentIntent;
+}
+</pre>
+
+<p>To achieve the same effect, set the
+<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code>
+attribute <a href="{@docRoot}guide/topics/manifest/activity-element.html#autoremrecents">
+{@code android:autoRemoveFromRecents}</a> to {@code false}. The default value is {@code true}
+for document activities, and {@code false} for regular activities. Using this attribute overrides
+the {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS} flag, discussed previously.</p>
+
+
+
+
+
+
+
diff --git a/docs/html/guide/components/tasks-and-back-stack.jd b/docs/html/guide/components/tasks-and-back-stack.jd
index e054313..aaef10e 100644
--- a/docs/html/guide/components/tasks-and-back-stack.jd
+++ b/docs/html/guide/components/tasks-and-back-stack.jd
@@ -21,7 +21,8 @@
<h2>Articles</h2>
<ol>
- <li><a href="http://android-developers.blogspot.com/2010/04/multitasking-android-way.html">Multitasking the Android Way</a></li>
+ <li><a href="http://android-developers.blogspot.com/2010/04/multitasking-android-way.html">
+ Multitasking the Android Way</a></li>
</ol>
<h2>See also</h2>
@@ -31,6 +32,7 @@
<li><a
href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>} manifest
element</a></li>
+ <li><a href="{@docRoot}guide/components/recents.html">Overview Screen</a></li>
</ol>
</div>
</div>
@@ -39,12 +41,12 @@
<p>An application usually contains multiple <a
href="{@docRoot}guide/components/activities.html">activities</a>. Each activity
should be designed around a specific kind of action the user can perform and can start other
-activities. For example, an email application might have one activity to show a list of new email.
-When the user selects an email, a new activity opens to view that email.</p>
+activities. For example, an email application might have one activity to show a list of new messages.
+When the user selects a message, a new activity opens to view that message.</p>
<p>An activity can even start activities that exist in other applications on the device. For
-example, if your application wants to send an email, you can define an intent to perform a "send"
-action and include some data, such as an email address and a message. An activity from another
+example, if your application wants to send an email message, you can define an intent to perform a
+"send" action and include some data, such as an email address and a message. An activity from another
application that declares itself to handle this kind of intent then opens. In this case, the intent
is to send an email, so an email application's "compose" activity starts (if multiple activities
support the same intent, then the system lets the user select which one to use). When the email is
@@ -53,8 +55,8 @@
experience by keeping both activities in the same <em>task</em>.</p>
<p>A task is a collection of activities that users interact with
-when performing a certain job. The activities are arranged in a stack (the "back stack"), in the
-order in which each activity is opened.</p>
+when performing a certain job. The activities are arranged in a stack (the <em>back stack</em>), in
+the order in which each activity is opened.</p>
<!-- SAVE FOR WHEN THE FRAGMENT DOC IS ADDED
<div class="sidebox-wrapper">
@@ -134,7 +136,8 @@
foreground—all three activities in its stack are intact and the activity at the top of the
stack resumes. At
this point, the user can also switch back to Task B by going Home and selecting the application icon
-that started that task (or by selecting the app's task from the <em>recent apps</em> screen).
+that started that task (or by selecting the app's task from the
+<a href="{@docRoot}guide/components/recents.html">overview screen</a>).
This is an example of multitasking on Android.</p>
<p class="note"><strong>Note:</strong> Multiple tasks can be held in the background at once.
@@ -195,8 +198,8 @@
system still
knows that the activity has a place in the back stack, but when the activity is brought to the
top of the stack the system must recreate it (rather than resume it). In order to
-avoid losing the user's work, you should proactively retain it by implementing the {@link
-android.app.Activity#onSaveInstanceState onSaveInstanceState()} callback
+avoid losing the user's work, you should proactively retain it by implementing the
+{@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} callback
methods in your activity.</p>
<p>For more information about how to save your activity state, see the <a
@@ -218,27 +221,26 @@
activities except for the root activity when the user leaves the task.</p>
<p>You can do these things and more, with attributes in the
-<a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
-<activity>}</a> manifest element and with flags in the intent that you pass to {@link
-android.app.Activity#startActivity startActivity()}.</p>
+<a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a>
+manifest element and with flags in the intent that you pass to
+{@link android.app.Activity#startActivity startActivity()}.</p>
-<p>In this regard, the principal <a
-href="{@docRoot}guide/topics/manifest/activity-element.html">{@code <activity>}</a>
-attributes you can use are:</p>
+<p>In this regard, the principal <a href="{@docRoot}guide/topics/manifest/activity-element.html">
+{@code <activity>}</a> attributes you can use are:</p>
<ul class="nolist">
- <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#aff">{@code
-taskAffinity}</a></li>
- <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code
-launchMode}</a></li>
- <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#reparent">{@code
-allowTaskReparenting}</a></li>
- <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#clear">{@code
-clearTaskOnLaunch}</a></li>
- <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#always">{@code
-alwaysRetainTaskState}</a></li>
- <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#finish">{@code
-finishOnTaskLaunch}</a></li>
+ <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#aff">
+ {@code taskAffinity}</a></li>
+ <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">
+ {@code launchMode}</a></li>
+ <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#reparent">
+ {@code allowTaskReparenting}</a></li>
+ <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#clear">
+ {@code clearTaskOnLaunch}</a></li>
+ <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#always">
+ {@code alwaysRetainTaskState}</a></li>
+ <li><a href="{@docRoot}guide/topics/manifest/activity-element.html#finish">
+ {@code finishOnTaskLaunch}</a></li>
</ul>
<p>And the principal intent flags you can use are:</p>
@@ -250,15 +252,18 @@
</ul>
<p>In the following sections, you'll see how you can use these manifest attributes and intent
-flags to define how activities are associated with tasks and how the behave in the back stack.</p>
+flags to define how activities are associated with tasks and how they behave in the back stack.</p>
+<p>Also, discussed separately are the considerations for how tasks and activites may be represented
+and managed in the overview screen. See <a href="{@docRoot}guide/components/recents.html">Overview Screen</a>
+for more information. Normally you should allow the system to define how your task and
+activities are represented in the overview screen, and you don't need to modify this behavior.</p>
<p class="caution"><strong>Caution:</strong> Most applications should not interrupt the default
behavior for activities and tasks. If you determine that it's necessary for your activity to modify
the default behaviors, use caution and be sure to test the usability of the activity during
launch and when navigating back to it from other activities and tasks with the <em>Back</em> button.
-Be sure
-to test for navigation behaviors that might conflict with the user's expected behavior.</p>
+Be sure to test for navigation behaviors that might conflict with the user's expected behavior.</p>
<h3 id="TaskLaunchModes">Defining launch modes</h3>
@@ -389,7 +394,7 @@
<dt>{@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK}</dt>
<dd>Start the activity in a new task. If a task is already running for the activity you are now
starting, that task is brought to the foreground with its last state restored and the activity
-receives the new intent in {@link android.app.Activity#onNewIntent onNewIntent()}.
+receives the new intent in {@link android.app.Activity#onNewIntent onNewIntent()}.
<p>This produces the same behavior as the {@code "singleTask"} <a
href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code launchMode}</a> value,
discussed in the previous section.</p></dd>
@@ -408,11 +413,13 @@
<p>There is no value for the <a
href="{@docRoot}guide/topics/manifest/activity-element.html#lmode">{@code launchMode}</a>
attribute that produces this behavior.</p>
- <p>{@code FLAG_ACTIVITY_CLEAR_TOP} is most often used in conjunction with {@code
-FLAG_ACTIVITY_NEW_TASK}. When used together, these flags are a way of locating an existing activity
+ <p>{@code FLAG_ACTIVITY_CLEAR_TOP} is most often used in conjunction with
+ {@code FLAG_ACTIVITY_NEW_TASK}.
+When used together, these flags are a way of locating an existing activity
in another task and putting it in a position where it can respond to the intent. </p>
- <p class="note"><strong>Note:</strong> If the launch mode of the designated activity is {@code
-"standard"}, it too is removed from the stack and a new instance is launched in its place to handle
+ <p class="note"><strong>Note:</strong> If the launch mode of the designated activity is
+ {@code "standard"},
+it too is removed from the stack and a new instance is launched in its place to handle
the incoming intent. That's because a new instance is always created for a new intent when the
launch mode is {@code "standard"}. </p>
</dd>
@@ -439,21 +446,23 @@
<p>The <a
href="{@docRoot}guide/topics/manifest/activity-element.html#aff">{@code taskAffinity}</a>
attribute takes a string value, which must be unique from the default package name
-declared in the <a href="{@docRoot}guide/topics/manifest/manifest-element.html">{@code
-<manifest>}</a> element, because the system uses that name to identify the default task
+declared in the <a href="{@docRoot}guide/topics/manifest/manifest-element.html">
+{@code <manifest>}
+</a> element, because the system uses that name to identify the default task
affinity for the application.</p>
<p>The affinity comes into play in two circumstances:</p>
<ul>
- <li>When the intent that launches an activity contains the {@link
-android.content.Intent#FLAG_ACTIVITY_NEW_TASK} flag.
+ <li>When the intent that launches an activity contains the
+ {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK}
+ flag.
<p>A new activity is, by default, launched into the task of the activity
that called {@link android.app.Activity#startActivity startActivity()}. It's pushed onto the same
-back stack as the caller. However, if the intent passed to {@link
-android.app.Activity#startActivity startActivity()} contains the {@link
-android.content.Intent#FLAG_ACTIVITY_NEW_TASK}
-flag, the system looks for a different task to house the new activity. Often, it's a new task.
+back stack as the caller. However, if the intent passed to
+{@link android.app.Activity#startActivity startActivity()}
+contains the {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK}
+flag, the system looks for a different task to house the new activity. Often, it's a new task.
However, it doesn't have to be. If there's already an existing task with the same affinity as the
new activity, the activity is launched into that task. If not, it begins a new task.</p>
@@ -461,17 +470,17 @@
to leave
it, there must be some way for the user to navigate back to the task. Some entities (such as the
notification manager) always start activities in an external task, never as part of their own, so
-they always put {@code FLAG_ACTIVITY_NEW_TASK} in the intents they pass to {@link
-android.app.Activity#startActivity startActivity()}. If you have an activity that can be invoked by
+they always put {@code FLAG_ACTIVITY_NEW_TASK} in the intents they pass to
+{@link android.app.Activity#startActivity startActivity()}.
+If you have an activity that can be invoked by
an external entity that might use this flag, take care that the user has a independent way to get
back to the task that's started, such as with a launcher icon (the root activity of the task
has a {@link android.content.Intent#CATEGORY_LAUNCHER} intent filter; see the <a
href="#Starting">Starting a task</a> section below).</p>
</li>
- <li>When an activity has its <a
-href="{@docRoot}guide/topics/manifest/activity-element.html#reparent">{@code
-allowTaskReparenting}</a> attribute set to {@code "true"}.
+ <li>When an activity has its <a href="{@docRoot}guide/topics/manifest/activity-element.html#reparent">
+{@code allowTaskReparenting}</a> attribute set to {@code "true"}.
<p>In this case, the activity can move from the task it starts to the task it has an affinity
for, when that task comes to the foreground.</p>
<p>For example, suppose that an activity that reports weather conditions in selected cities is
@@ -511,9 +520,9 @@
href="{@docRoot}guide/topics/manifest/activity-element.html#clear">clearTaskOnLaunch</a></code></dt>
<dd>If this attribute is set to {@code "true"} in the root activity of a task,
the stack is cleared down to the root activity whenever the user leaves the task
-and returns to it. In other words, it's the opposite of <a
-href="{@docRoot}guide/topics/manifest/activity-element.html#always">{@code
-alwaysRetainTaskState}</a>. The user always returns to the task in its
+and returns to it. In other words, it's the opposite of
+<a href="{@docRoot}guide/topics/manifest/activity-element.html#always">
+{@code alwaysRetainTaskState}</a>. The user always returns to the task in its
initial state, even after a leaving the task for only a moment.</dd>
<dt><code><a
@@ -534,8 +543,9 @@
<h3 id="Starting">Starting a task</h3>
<p>You can set up an activity as the entry point for a task by giving it an intent filter with
-{@code "android.intent.action.MAIN"} as the specified action and {@code
-"android.intent.category.LAUNCHER"} as the specified category. For example:</p>
+{@code "android.intent.action.MAIN"} as the specified action and
+{@code "android.intent.category.LAUNCHER"}
+as the specified category. For example:</p>
<pre>
<activity ... >
@@ -553,27 +563,25 @@
</p>
<p>This second ability is important: Users must be able to leave a task and then come back to it
-later using this activity launcher. For this reason, the two <a href="#LaunchModes">launch
-modes</a> that mark activities as always initiating a task, {@code "singleTask"} and "{@code
-"singleInstance"}, should be used only when the activity has an {@link
-android.content.Intent#ACTION_MAIN}
-and a {@link android.content.Intent#CATEGORY_LAUNCHER}
-filter. Imagine, for example, what could happen if the filter is missing: An intent launches a
-{@code "singleTask"} activity, initiating a new task, and the user spends some time working in
-that task. The user then presses the <em>Home</em> button. The task is now sent to the background
-and is
-not visible. Now the user has no way to return to the task, because it is not represented in the
-application launcher.
-</p>
+later using this activity launcher. For this reason, the two <a href="#LaunchModes">launch
+modes</a> that mark activities as always initiating a task, {@code "singleTask"} and
+{@code "singleInstance"}, should be used only when the activity has an
+{@link android.content.Intent#ACTION_MAIN}
+and a {@link android.content.Intent#CATEGORY_LAUNCHER} filter. Imagine, for example, what could
+happen if the filter is missing: An intent launches a {@code "singleTask"} activity, initiating a
+new task, and the user spends some time working in that task. The user then presses the <em>Home</em>
+button. The task is now sent to the background and is not visible. Now the user has no way to return
+to the task, because it is not represented in the application launcher.</p>
<p>For those cases where you don't want the user to be able to return to an activity, set the
- <code><a
-href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> element's
-<a href="{@docRoot}guide/topics/manifest/activity-element.html#finish">{@code
-finishOnTaskLaunch}</a> to {@code "true"} (see <a
-href="#Clearing">Clearing the stack</a>).</p>
+<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code>
+element's
+<a href="{@docRoot}guide/topics/manifest/activity-element.html#finish">{@code finishOnTaskLaunch}</a>
+to {@code "true"} (see <a href="#Clearing">Clearing the stack</a>).</p>
-
+<p>Further information about how tasks and activites are represented and managed in
+the overview screen is available in <a href="{@docRoot}guide/components/recents.html">
+Overview Screen</a>.</p>
<!--
<h2>Beginner's Path</h2>
diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs
index ea36405..8d010a1 100644
--- a/docs/html/guide/guide_toc.cs
+++ b/docs/html/guide/guide_toc.cs
@@ -55,6 +55,9 @@
<li><a href="<?cs var:toroot ?>guide/components/tasks-and-back-stack.html">
<span class="en">Tasks and Back Stack</span>
</a></li>
+ <li><a href="<?cs var:toroot ?>guide/components/recents.html">
+ <span class="en">Overview Screen</span>
+ </a></li>
</ul>
</li>
<li class="nav-section">
diff --git a/docs/html/guide/topics/manifest/activity-element.jd b/docs/html/guide/topics/manifest/activity-element.jd
index f0e93b9..ade05c9 100644
--- a/docs/html/guide/topics/manifest/activity-element.jd
+++ b/docs/html/guide/topics/manifest/activity-element.jd
@@ -8,11 +8,14 @@
<dd><pre class="stx"><activity android:<a href="#embedded">allowEmbedded</a>=["true" | "false"]
android:<a href="#reparent">allowTaskReparenting</a>=["true" | "false"]
android:<a href="#always">alwaysRetainTaskState</a>=["true" | "false"]
+ android:<a href="#autoremrecents">autoRemoveFromRecents</a>=["true" | "false"]
android:<a href="#clear">clearTaskOnLaunch</a>=["true" | "false"]
android:<a href="#config">configChanges</a>=["mcc", "mnc", "locale",
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "screenLayout", "fontScale", "uiMode",
"orientation", "screenSize", "smallestScreenSize"]
+ android:<a href="#dlmode">documentLaunchMode</a>=["intoExisting", "always",
+ "none", "never"]
android:<a href="#enabled">enabled</a>=["true" | "false"]
android:<a href="#exclude">excludeFromRecents</a>=["true" | "false"]
android:<a href="#exported">exported</a>=["true" | "false"]
@@ -22,12 +25,14 @@
android:<a href="#label">label</a>="<i>string resource</i>"
android:<a href="#lmode">launchMode</a>=["multiple" | "singleTop" |
"singleTask" | "singleInstance"]
+ android:<a href="#maxRecents">maxRecents</a>="<i>integer</i>"
android:<a href="#multi">multiprocess</a>=["true" | "false"]
android:<a href="#nm">name</a>="<i>string</i>"
android:<a href="#nohist">noHistory</a>=["true" | "false"] <!-- ##api level 3## -->
android:<a href="#parent">parentActivityName</a>="<i>string</i>" <!-- api level 16 -->
android:<a href="#prmsn">permission</a>="<i>string</i>"
android:<a href="#proc">process</a>="<i>string</i>"
+ android:<a href="#relinquish">relinquishTaskIdentity</a>=["true" | "false"]
android:<a href="#screen">screenOrientation</a>=["unspecified" | "behind" |
"landscape" | "portrait" |
"reverseLandscape" | "reversePortrait" |
@@ -139,6 +144,15 @@
a lot of state (such as multiple open tabs) that users would not like to lose.
</p></dd>
+<dt><a name="autoremrecents"></a>{@code android:autoRemoveFromRecents}</dt>
+<dd>Whether or not tasks launched by activities with this attribute remains in the
+<a href="{@docRoot}guide/components/recents.html">overview screen</a> until the last activity in the
+task is completed. If {@code true}, the task is
+automatically removed from the overview screen. This overrides the caller's use of
+{@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS}. It must be a boolean value, either
+"{@code true}" or "{@code false}".</dd>
+
+
<dt><a name="clear"></a>{@code android:clearTaskOnLaunch}</dt>
<dd>Whether or not all activities will be removed from the task, except for
the root activity, whenever it is re-launched from the home screen —
@@ -177,7 +191,7 @@
<dd>Lists configuration changes that the activity will handle itself. When a configuration
change occurs at runtime, the activity is shut down and restarted by default, but declaring a
configuration with this attribute will prevent the activity from being restarted. Instead, the
-activity remains running and its <code>{@link android.app.Activity#onConfigurationChanged
+activity remains running and its <code>{@link android.app.Activity#onConfigurationChanged(android.content.res.Configuration)
onConfigurationChanged()}</code> method is called.
<p class="note"><strong>Note:</strong> Using this attribute should be
@@ -271,20 +285,67 @@
<p>
All of these configuration changes can impact the resource values seen by the
-application. Therefore, when <code>{@link android.app.Activity#onConfigurationChanged
+application. Therefore, when <code>{@link android.app.Activity#onConfigurationChanged(android.content.res.Configuration)
onConfigurationChanged()}</code> is called, it will generally be necessary to again
retrieve all resources (including view layouts, drawables, and so on) to correctly
handle the change.
</p></dd>
+<dt><a name="dlmode"></a>{@code android:documentLaunchMode}</dt>
+<dd>Specifies how a new instance of an activity should be added to a task each time it is
+launched. This attribute permits the user to have multiple documents from the same application
+appear in the <a href="{@docRoot}guide/components/recents.html">overview screen</a>.
+
+<p>This attribute has four values which produce the following effects when the user opens a document
+with the application:</p>
+
+<table>
+<tr>
+ <th>Value</th>
+ <th>Description</th>
+</tr><tr>
+ <td>"{@code intoExisting}"</td>
+ <td>The activity reuses the existing task for the document. Using this value is the same as setting
+ the {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} flag, <em>without</em> setting the
+ {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} flag, as described in
+ <a href="{@docRoot}guide/components/recents.html#flag-new-doc">Using the Intent flag to add a task
+ </a>.</td>
+</tr><tr>
+ <td>"{@code always}"</td>
+ <td>The activity creates a new task for the document, even if the document is already opened.
+ This is the same as setting both the {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT}
+ and {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} flags.</td>
+</tr><tr>
+ <td>"{@code none}"</td>
+ <td>The activity does not create a new task for the activity. This is the default value, which
+ creates a new task only when {@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK} is set.
+ The overview screen treats the activity as it would by default: it displays a single task for
+ the app, which resumes from whatever activity the user last invoked.</td>
+</tr><tr>
+ <td>"{@code never}"</td>
+ <td>This activity is not launched into a new document even if the Intent contains
+ {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT}. Setting this overrides the behavior
+ of the {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} and
+ {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} flags, if either of these are set in
+ the activity, and the overview screen displays a single task for the app, which resumes from
+ whatever activity the user last invoked.</td>
+</tr>
+</table>
+
+<p class="note"><strong>Note:</strong> For values other than "{@code none}" and "{@code never}" the
+activity must be defined with {@code launchMode="standard"}. If this attribute is not specified,
+{@code documentLaunchMode="none"} is used.</p>
+</dd>
+
<dt><a name="enabled"></a>{@code android:enabled}</dt>
<dd>Whether or not the activity can be instantiated by the system —
-"{@code true}" if it can be, and "{@code false}" if not. The default value
+{@code "true"} if it can be, and "{@code false}" if not. The default value
is "{@code true}".
<p>
-The <code><a href="{@docRoot}guide/topics/manifest/application-element.html"><application></a></code> element has its own
-<code><a href="{@docRoot}guide/topics/manifest/application-element.html#enabled">enabled</a></code>
+The <code><a href="{@docRoot}guide/topics/manifest/application-element.html"><application></a>
+</code> element has its own<code>
+<a href="{@docRoot}guide/topics/manifest/application-element.html#enabled">enabled</a></code>
attribute that applies to all application components, including activities. The
<code><a href="{@docRoot}guide/topics/manifest/application-element.html"><application></a></code>
and {@code <activity>} attributes must both be "{@code true}" (as they both
@@ -294,10 +355,11 @@
<dt><a name="exclude"></a>{@code android:excludeFromRecents}</dt>
<dd>Whether or not the task initiated by this activity should be excluded from the list of recently
-used applications ("recent apps"). That is, when this activity is the root activity of a new task,
-this attribute determines whether the task should not appear in the list of recent apps. Set "{@code
-true}" if the task should be <em>excluded</em> from the list; set "{@code false}" if it should be
-<em>included</em>. The default value is "{@code false}".
+used applications, the <a href="{@docRoot}guide/components/recents.html">
+overview screen</a>. That is, when this activity is the root activity of a new
+task, this attribute determines whether the task should not appear in the list of recent apps. Set
+"{@code true}" if the task should be <em>excluded</em> from the list; set "{@code false}" if it
+should be <em>included</em>. The default value is "{@code false}".
</p></dd>
<dt><a name="exported"></a>{@code android:exported}</dt>
@@ -550,6 +612,13 @@
</p>
</dd>
+<dt><a name="maxrecents"></a>{@code android:maxRecents}</dt>
+<dd>The maximum number of tasks rooted at this activity in the <a href="{@docRoot}guide/components/recents.html">
+overview screen</a>. When this number of entries is reached, the system removes the least-recently
+used instance from the overview screen. Valid values are 1 through 50 (25 on low memory devices);
+zero is invalid. This must be an integer value, such as 50. The default value is 16.
+</dd>
+
<dt><a name="multi"></a>{@code android:multiprocess}</dt>
<dd>Whether an instance of the activity can be launched into the process of the component
that started it — "{@code true}" if it can be, and "{@code false}" if not.
@@ -685,6 +754,20 @@
attribute can set a different default process name for all components.
</dd>
+<dt><a name="relinquish"></a>{@code android:relinquishTaskIdentity}</dt>
+<dd>Whether or not the activity relinquishes its task identifiers to an activity above it in the
+task stack. A task whose root activity has this attribute set to "{@code true}" replaces the base
+Intent with that of the next activity in the task. If the next activity also has this attribute set
+to "{@code true}" then it will yield the base Intent to any activity that it launches in the same
+task. This continues for each activity until an activity is encountered which has this attribute set
+to "{@code false}". The default value is "{@code false}".
+
+<p>This attribute set to "{@code true}" also permits the activity's use of the
+{@link android.app.ActivityManager.TaskDescription} to change labels, colors
+and icons in the <a href="{@docRoot}guide/components/recents.html">overview screen</a>.</p>
+</dd>
+
+
<dt><a name="screen"></a>{@code android:screenOrientation}</dt>
<dd>The orientation of the activity's display on the device.
diff --git a/docs/html/guide/topics/manifest/uses-sdk-element.jd b/docs/html/guide/topics/manifest/uses-sdk-element.jd
index 79a37f0..e5e64e5 100644
--- a/docs/html/guide/topics/manifest/uses-sdk-element.jd
+++ b/docs/html/guide/topics/manifest/uses-sdk-element.jd
@@ -227,6 +227,17 @@
<table>
<tr><th>Platform Version</th><th>API Level</th><th>VERSION_CODE</th><th>Notes</th></tr>
+ <tr><td><a href="{@docRoot}about/versions/android-5.0.html">Android 5.0</a></td>
+ <td><a href="{@docRoot}sdk/api_diff/21/changes.html" title="Diff Report">21</a></td>
+ <td>{@link android.os.Build.VERSION_CODES#LOLLIPOP}</td>
+ <td><a href="{@docRoot}about/versions/lollipop.html">Platform
+Highlights</a></td></tr>
+
+ <tr><td style="color:#bbb">Android 4.4W</td>
+ <td><a href="{@docRoot}sdk/api_diff/20/changes.html" title="Diff Report">20</a></td>
+ <td>{@link android.os.Build.VERSION_CODES#KITKAT_WATCH}</td>
+ <td style="color:#bbb">KitKat for Wearables Only</td></tr>
+
<tr><td><a href="{@docRoot}about/versions/android-4.4.html">Android 4.4</a></td>
<td><a href="{@docRoot}sdk/api_diff/19/changes.html" title="Diff Report">19</a></td>
<td>{@link android.os.Build.VERSION_CODES#KITKAT}</td>
diff --git a/docs/html/guide/topics/text/creating-input-method.jd b/docs/html/guide/topics/text/creating-input-method.jd
index 4b6b7b7..802b58a 100644
--- a/docs/html/guide/topics/text/creating-input-method.jd
+++ b/docs/html/guide/topics/text/creating-input-method.jd
@@ -6,45 +6,37 @@
<div id="qv">
<h2>In This Document</h2>
<ol>
- <li>
- <a href="#InputMethodLifecycle">The IME Lifecycle</a>
- </li>
- <li>
- <a href="#DefiningIME">Declaring IME Components in the Manifest</a>
- </li>
- <li>
- <a href="#IMEAPI">The Input Method API</a>
- </li>
- <li>
- <a href="#IMEUI">Designing the Input Method UI</a>
- </li>
- <li>
- <a href="#SendText">Sending Text to the Application</a>
- </li>
- <li>
- <a href="#IMESubTypes">Creating an IME Subtype</a>
- </li>
- <li>
- <a href="#GeneralDesign">General IME Considerations</a>
- </li>
+ <li><a href="#InputMethodLifecycle">The IME Lifecycle</a></li>
+ <li><a href="#DefiningIME">Declaring IME Components in the Manifest</a></li>
+ <li><a href="#IMEAPI">The Input Method API</a></li>
+ <li><a href="#IMEUI">Designing the Input Method UI</a></li>
+ <li><a href="#SendText">Sending Text to the Application</a></li>
+ <li><a href="#IMESubTypes">Creating an IME Subtype</a></li>
+ <li><a href="#Switching">Switching among IME Subtypes</a></li>
+ <li><a href="#GeneralDesign">General IME Considerations</a></li>
</ol>
<h2>See also</h2>
<ol>
<li>
<a href="http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html">Onscreen Input Methods</a>
</li>
- <li>
- <a href="{@docRoot}resources/samples/SoftKeyboard/index.html">Soft Keyboard sample</a>
+</ol>
+
+<h2>Sample</h2>
+<ol>
+ <li><a href="https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/">
+ SoftKeyboard</a>
</li>
</ol>
+
</div>
</div>
<p>
An input method editor (IME) is a user control that enables users to enter text. Android
- provides an extensible input method framework that allows applications to provide users
- alternative input methods, such as on-screen keyboards or even speech input. Once installed,
- users can select which IME they want to use from the system settings and use it across the
- entire system; only one IME may be enabled at a time.
+ provides an extensible input-method framework that allows applications to provide users
+ alternative input methods, such as on-screen keyboards or even speech input. After installing
+ the desired IMEs, a user can select which one to use from the system settings, and use it
+ across the entire system; only one IME may be enabled at a time.
</p>
<p>
To add an IME to the Android system, you create an Android application
@@ -52,37 +44,54 @@
addition, you usually create a "settings" activity that passes options to the IME
service. You can also define a settings UI that's displayed as part of the system settings.
</p>
+<p>This guide covers the following:</p>
+<ul>
+ <li>The IME lifecycle</li>
+ <li>Declaring IME components in the application manifest</li>
+ <li>The IME API</li>
+ <li>Designing an IME UI</li>
+ <li>Sending text from an IME to an application</li>
+ <li>Working with IME subtypes</li>
+</ul>
<p>
If you haven't worked with IMEs before, you should read the introductory article
- <a href="http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html">Onscreen Input Methods</a> first.
- Also, the Soft Keyboard sample app included in the SDK contains sample code that you can modify
- to start building your own IME.
+ <a href="http://android-developers.blogspot.com/2009/04/updating-applications-for-on-screen.html">Onscreen Input Methods</a>
+ first.
+ Also, the <a href="https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/">
+ SoftKeyboard</a> sample app included in the SDK contains sample code that you can modify to
+ start building your own IME.
</p>
<h2 id="InputMethodLifecycle">The IME Lifecycle</h2>
<p>
The following diagram describes the life cycle of an IME:
</p>
-<img src="{@docRoot}resources/articles/images/inputmethod_lifecycle_image.png" alt="" height="845"
- id="figure1" />
+<img src="{@docRoot}resources/articles/images/inputmethod_lifecycle_image.png" alt="" height="845" id="figure1" />
<p class="img-caption">
<strong>Figure 1.</strong> The life cycle of an IME.
</p>
<p>
- The following sections describe how to implement the UI and code associated with an IME that
+ The following sections describe how to implement the UI and code associated
+with an IME that
follows this lifecycle.
</p>
<h2 id="DefiningIME">Declaring IME Components in the Manifest</h2>
<p>
- In the Android system, an IME is an Android application that contains a special IME service.
- The application's manifest file must declare the service, request the necessary permissions,
- provide an intent filter that matches the action <code>action.view.InputMethod</code>, and
- provide metadata that defines characteristics of the IME. In addition, to provide a settings
- interface that allows the user to modify the behavior of the IME, you can define a "settings"
+ In the Android system, an IME is an Android application that contains a
+special IME service.
+ The application's manifest file must declare the service, request the
+necessary permissions,
+ provide an intent filter that matches the action
+<code>action.view.InputMethod</code>, and
+ provide metadata that defines characteristics of the IME. In addition, to
+provide a settings
+ interface that allows the user to modify the behavior of the IME, you can
+define a "settings"
activity that can be launched from System Settings.
</p>
<p>
- The following snippet declares IME service. It requests the permission {@link
- android.Manifest.permission#BIND_INPUT_METHOD} to allow the service to connect the IME to
+ The following snippet declares an IME service. It requests the permission
+{@link android.Manifest.permission#BIND_INPUT_METHOD} to allow the service to
+connect the IME to
the system, sets up an intent filter that matches the action
<code>android.view.InputMethod</code>, and defines metadata for the IME:
</p>
@@ -94,12 +103,15 @@
<intent-filter>
<action android:name="android.view.InputMethod" />
</intent-filter>
- <meta-data android:name="android.view.im" android:resource="@xml/method" />
+ <meta-data android:name="android.view.im"
+android:resource="@xml/method" />
</service>
</pre>
<p>
- This next snippet declares the settings activity for the IME. It has an intent filter for
- {@link android.content.Intent#ACTION_MAIN} that indicates this activity is the main entry point
+ This next snippet declares the settings activity for the IME. It has an
+intent filter for
+ {@link android.content.Intent#ACTION_MAIN} that indicates this activity is
+the main entry point
for the IME application:</p>
<pre>
<!-- Optional: an activity for controlling the IME settings -->
@@ -115,17 +127,22 @@
</p>
<h2 id="IMEAPI">The Input Method API</h2>
<p>
- Classes specific to IMEs are found in the {@link android.inputmethodservice} and {@link
- android.view.inputmethod} packages. The {@link android.view.KeyEvent} class is important for
- handling keyboard characters.
+ Classes specific to IMEs are found in the {@link android.inputmethodservice} and {@link android.view.inputmethod}
+ packages. The {@link android.view.KeyEvent} class is important for handling keyboard
+ characters.
</p>
<p>
The central part of an IME is a service component, a class that extends
- {@link android.inputmethodservice.InputMethodService}. In addition to implementing the
- normal service lifecycle, this class has callbacks for providing your IME's UI, handling user
- input, and delivering text to the field that currently has focus. By default, the
- {@link android.inputmethodservice.InputMethodService} class provides most of the implementation
- for managing the state and visibility of the IME and communicating with the current
+ {@link android.inputmethodservice.InputMethodService}. In addition to
+implementing the
+ normal service lifecycle, this class has callbacks for providing your IME's
+UI, handling user
+ input, and delivering text to the field that currently has focus. By
+default, the
+ {@link android.inputmethodservice.InputMethodService} class provides most
+of the implementation
+ for managing the state and visibility of the IME and communicating with the
+current
input field.
</p>
<p>
@@ -135,62 +152,84 @@
<dt>{@link android.view.inputmethod.BaseInputConnection}</dt>
<dd>
Defines the communication channel from an {@link android.view.inputmethod.InputMethod}
- back to the application that is receiving its input. You use it to read text around the
- cursor, commit text to the text box, and send raw key events to the application.
- Applications should extend this class rather than implementing the base interface
+ back to the application that is receiving its input. You use it to read
+text around the
+ cursor, commit text to the text box, and send raw key events to the
+application.
+ Applications should extend this class rather than implementing the base
+interface
{@link android.view.inputmethod.InputConnection}.
</dd>
<dt>{@link android.inputmethodservice.KeyboardView}</dt>
<dd>
- An extension of {@link android.view.View} that renders a keyboard and responds to user
+ An extension of {@link android.view.View} that renders a keyboard and
+responds to user
input events. The keyboard layout is specified by an instance of
- {@link android.inputmethodservice.Keyboard}, which you can define in an XML file.
+ {@link android.inputmethodservice.Keyboard}, which you can define in an
+XML file.
</dd>
</dl>
<h2 id="IMEUI">Designing the Input Method UI</h2>
<p>
- There are two main visual elements for an IME: the <strong>input</strong> view and the
- <strong>candidates</strong> view. You only have to implement the elements that are relevant to
+ There are two main visual elements for an IME: the <strong>input</strong>
+view and the
+ <strong>candidates</strong> view. You only have to implement the elements
+that are relevant to
the input method you're designing.
</p>
<h3 id="InputView">Input view</h3>
<p>
- The input view is the UI where the user inputs text, in the form of keyclicks, handwriting or
- gestures. When the iIME is displayed for the first time, the system calls the
- {@link android.inputmethodservice.InputMethodService#onCreateInputView()} callback. In your
- implementation of this method, you create the layout you want to display in the IME
- window and return the layout to the system. This snippet is an example of implementing the
- {@link android.inputmethodservice.InputMethodService#onCreateInputView()} method:
+ The input view is the UI where the user inputs text in the form of
+keyclicks, handwriting or
+ gestures. When the IME is displayed for the first time, the system calls
+the
+ {@link android.inputmethodservice.InputMethodService#onCreateInputView()}
+callback. In your
+ implementation of this method, you create the layout you want to display in
+the IME
+ window and return the layout to the system. This snippet is an example of
+implementing the
+ {@link android.inputmethodservice.InputMethodService#onCreateInputView()}
+method:
<pre>
@Override
public View onCreateInputView() {
MyKeyboardView inputView =
(MyKeyboardView) getLayoutInflater().inflate( R.layout.input, null);
- inputView.setOnKeyboardActionListener(this); inputView.setKeyboard(mLatinKeyboard);
+ inputView.setOnKeyboardActionListener(this);
+inputView.setKeyboard(mLatinKeyboard);
return mInputView;
}
</pre>
<p>
- In this example, {@code MyKeyboardView} is an instance of a custom implementation of
+ In this example, {@code MyKeyboardView} is an instance of a custom
+implementation of
{@link android.inputmethodservice.KeyboardView} that renders a
- {@link android.inputmethodservice.Keyboard}. If you’re building a traditional QWERTY keyboard,
- see the Soft Keyboard <a href="{@docRoot}tools/samples/index.html">sample
- app</a> for an example of how to extend the {@link android.inputmethodservice.KeyboardView} class.
+ {@link android.inputmethodservice.Keyboard}. If you’re building a
+traditional QWERTY keyboard,
+ see the <a href="https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/>
+ SoftKeyboard</a> sample app for an example of how to extend the {@link android.inputmethodservice.KeyboardView}
+ class.
</p>
<h3 id="CandidateView">Candidates view</h3>
<p>
- The candidates view is the UI where the IME displays potential word corrections or
+ The candidates view is the UI where the IME displays potential word
+corrections or
suggestions for the user to select. In the IME lifecycle, the system calls
- {@link android.inputmethodservice.InputMethodService#onCreateCandidatesView()} when it's ready
- to display the candidate view. In your implementation of this method, return a layout that shows
- word suggestions, or return null if you don’t want to show anything (a null response is the
- default behavior, so you don’t have to implement this if you don’t provide suggestions).</p>
+ {@link android.inputmethodservice.InputMethodService#onCreateCandidatesView()} when
+it's ready
+ to display the candidates view. In your implementation of this method,
+return a layout that shows
+ word suggestions, or return null if you don’t want to show anything. A
+null response is the
+ default behavior, so you don’t have to implement this if you don’t
+provide suggestions.</p>
<p>
For an example implementation that provides user suggestions, see the
- Soft Keyboard <a href="{@docRoot}tools/samples/index.html">sample
- app</a>.
+ <a href="https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/">
+ SoftKeyboard</a> sample app.
</p>
<h3 id="DesignConsiderations">UI design considerations</h3>
<p>
@@ -198,42 +237,54 @@
</p>
<h4>Handling multiple screen sizes</h4>
<p>
- The UI for your IME must be able to scale for different screen sizes, and it also
- must handle both landscape and portrait orientations. In non-fullscreen IME mode, leave
- sufficient space for the application to show the text field and any associated context, so that
- no more than half the screen is occupied by the IME. In fullscreen IME mode this is not an
+ The UI for your IME must be able to scale for different screen sizes, and
+it also
+ must handle both landscape and portrait orientations. In non-fullscreen IME
+mode, leave
+ sufficient space for the application to show the text field and any
+associated context, so that
+ no more than half the screen is occupied by the IME. In fullscreen IME mode
+this is not an
issue.
</p>
<h4>Handling different input types</h4>
<p>
- Android text fields allow you to set a specific input type, such as free form text, numbers,
- URLs, email addresses, and search strings. When you implement a new IME, you need to
- detect the input type of each field and provide the appropriate interface for it. However, you
- don't have to set up your IME to check that the user entered text that's valid for the
- input type; that's the responsibility of the application that owns the text field.
+ Android text fields allow you to set a specific input type, such as free
+form text, numbers,
+ URLs, email addresses, and search strings. When you implement a new IME,
+you need to
+ detect the input type of each field and provide the appropriate interface
+for it. However, you
+ don't have to set up your IME to check that the user entered text
+valid for the
+ input type; that's the responsibility of the application that owns the text
+field.
</p>
<p>
- For example, here are screenshots of the interfaces that the Latin IME provided with the
+ For example, here are screenshots of the interfaces that the Latin IME
+provided with the
Android platform provides for text and phone number inputs:
</p>
-<img src="{@docRoot}resources/articles/images/inputmethod_text_type_screenshot.png" alt=""
- height="142" id="figure2" />
-<img src="{@docRoot}resources/articles/images/inputmethod_numeric_type_screenshot.png" alt=""
- height="120" id="figure2a" />
+<img src="{@docRoot}resources/articles/images/inputmethod_text_type_screenshot.png" alt="" height="142" id="figure2" />
+<img src="{@docRoot}resources/articles/images/inputmethod_numeric_type_screenshot.png" alt="" height="120" id="figure2a" />
<p class="img-caption">
<strong>Figure 2.</strong> Latin IME input types.
</p>
<p>
When an input field receives focus and your IME starts, the system calls
- {@link android.inputmethodservice.InputMethodService#onStartInputView(EditorInfo, boolean)
- onStartInputView()}, passing in an {@link android.view.inputmethod.EditorInfo} object that
- contains details about the input type and other attributes of the text field. In this object,
- the {@link android.view.inputmethod.EditorInfo#inputType} field contains the text field's input
+ {@link android.inputmethodservice.InputMethodService#onStartInputView(EditorInfo, boolean) onStartInputView()},
+ passing in an {@link android.view.inputmethod.EditorInfo} object that
+ contains details about the input type and other attributes of the text
+field. In this object,
+ the {@link android.view.inputmethod.EditorInfo#inputType} field contains
+the text field's input
type.
</p>
<p>
- The {@link android.view.inputmethod.EditorInfo#inputType} field is an <code>int</code>
- that contains bit patterns for various input type settings. To test it for the text field's
+ The {@link android.view.inputmethod.EditorInfo#inputType} field is an
+<code>int</code>
+ that contains bit patterns for various input type settings. To test it for
+the text field's
input type, mask it with the constant {@link android.text.InputType#TYPE_MASK_CLASS}, like
this:
</p>
@@ -246,7 +297,8 @@
<dl>
<dt>{@link android.text.InputType#TYPE_CLASS_NUMBER}</dt>
<dd>
- A text field for entering numbers. As illustrated in the previous screen shot, the
+ A text field for entering numbers. As illustrated in the previous
+screen shot, the
Latin IME displays a number pad for fields of this type.
</dd>
<dt>{@link android.text.InputType#TYPE_CLASS_DATETIME}</dt>
@@ -263,91 +315,103 @@
</dd>
</dl>
<p>
- These constants are described in more detail in the reference documentation for
+ These constants are described in more detail in the reference documentation
+for
{@link android.text.InputType}.
</p>
<p>
- The {@link android.view.inputmethod.EditorInfo#inputType} field can contain other bits that
+ The {@link android.view.inputmethod.EditorInfo#inputType} field can contain
+other bits that
indicate a variant of the text field type, such as:
</p>
<dl>
<dt>{@link android.text.InputType#TYPE_TEXT_VARIATION_PASSWORD}</dt>
<dd>
- A variant of {@link android.text.InputType#TYPE_CLASS_TEXT} for entering passwords. The
+ A variant of {@link android.text.InputType#TYPE_CLASS_TEXT} for
+entering passwords. The
input method will display dingbats instead of the actual text.
</dd>
<dt>{@link android.text.InputType#TYPE_TEXT_VARIATION_URI}</dt>
<dd>
- A variant of {@link android.text.InputType#TYPE_CLASS_TEXT} for entering web URLs and
+ A variant of {@link android.text.InputType#TYPE_CLASS_TEXT} for
+entering web URLs and
other Uniform Resource Identifiers (URIs).
</dd>
<dt>{@link android.text.InputType#TYPE_TEXT_FLAG_AUTO_COMPLETE}</dt>
<dd>
- A variant of {@link android.text.InputType#TYPE_CLASS_TEXT} for entering text that the
- application "auto-completes" from a dictionary, search, or other facility.
+ A variant of {@link android.text.InputType#TYPE_CLASS_TEXT} for
+entering text that the
+ application "auto-completes" from a dictionary, search, or other
+facility.
</dd>
</dl>
<p>
- Remember to mask {@link android.view.inputmethod.EditorInfo#inputType} with the appropriate
- constant when you test for these variants. The available mask constants are listed in the
+ Remember to mask {@link android.view.inputmethod.EditorInfo#inputType} with
+the appropriate
+ constant when you test for these variants. The available mask constants are
+listed in the
reference documentation for {@link android.text.InputType}.
</p>
<p class="caution">
- <strong>Caution:</strong> In your own IME, make sure you handle text correctly when you send it
- to a password field. Hide the password in your UI both in the input view and in the candidates
- view. Also remember that you shouldn't store passwords on a device. To learn more, see the <a
- href="{@docRoot}guide/practices/security.html">Designing for Security</a> guide.
+ <strong>Caution:</strong> In your own IME, make sure you handle text
+correctly when you send it
+ to a password field. Hide the password in your UI both in the input view
+and in the candidates
+ view. Also remember that you shouldn't store passwords on a device. To
+learn more, see the <a href="{@docRoot}guide/practices/security.html">Designing for Security</a>
+ guide.
</p>
<h2 id="SendText">Sending Text to the Application</h2>
<p>
- As the user inputs text with your IME, you can send text to the application by
- sending individual key events or by editing the text around the cursor in the application's text
+ As the user inputs text with your IME, you can send text to the application
+by
+ sending individual key events or by editing the text around the cursor in
+the application's text
field. In either case, you use an instance of {@link android.view.inputmethod.InputConnection}
to deliver the text. To get this instance, call
- {@link android.inputmethodservice.InputMethodService#getCurrentInputConnection
- InputMethodService.getCurrentInputConnection()}.
+ {@link android.inputmethodservice.InputMethodService#getCurrentInputConnection InputMethodService.getCurrentInputConnection()}.
</p>
<h3 id="EditingCursor">Editing the text around the cursor</h3>
<p>
- When you're handling the editing of existing text in a text field, some of the more useful
+ When you're handling the editing of existing text in a text field, some of
+the more useful
methods in {@link android.view.inputmethod.BaseInputConnection} are:
</p>
<dl>
<dt>
- {@link android.view.inputmethod.BaseInputConnection#getTextBeforeCursor(int, int)
- getTextBeforeCursor()}</dt>
+ {@link android.view.inputmethod.BaseInputConnection#getTextBeforeCursor(int, int) getTextBeforeCursor()}</dt>
<dd>
- Returns a {@link java.lang.CharSequence} containing the number of requested characters
+ Returns a {@link java.lang.CharSequence} containing the number of
+requested characters
before the current cursor position.
</dd>
<dt>
- {@link android.view.inputmethod.BaseInputConnection#getTextAfterCursor(int, int)
- getTextAfterCursor()}
+ {@link android.view.inputmethod.BaseInputConnection#getTextAfterCursor(int, int) getTextAfterCursor()}
</dt>
<dd>
- Returns a {@link java.lang.CharSequence} containing the number of requested characters
- following the current cursor position.
+ Returns a {@link java.lang.CharSequence} containing the number of
+requested characters following the current cursor position.
</dd>
<dt>
- {@link android.view.inputmethod.BaseInputConnection#deleteSurroundingText(int, int)
- deleteSurroundingText()}
+ {@link android.view.inputmethod.BaseInputConnection#deleteSurroundingText(int, int) deleteSurroundingText()}
</dt>
<dd>
- Deletes the specified number of characters before and following the current cursor
+ Deletes the specified number of characters before and following the
+current cursor
position.
</dd>
<dt>
- {@link android.view.inputmethod.BaseInputConnection#commitText(CharSequence, int)
- commitText()}
+ {@link android.view.inputmethod.BaseInputConnection#commitText(CharSequence, int) commitText()}
</dt>
<dd>
- Commit a {@link java.lang.CharSequence} to the text field and set a new cursor
+ Commit a {@link java.lang.CharSequence} to the text field and set a new
+cursor
position.
</dd>
</dl>
<p>
- For example, the following snippet shows how to replace the text "Fell" to the left of the
- with the text "Hello!":
+ For example, the following snippet shows how to replace the four characters to
+the left of the cursor with the text "Hello!":
</p>
<pre>
InputConnection ic = getCurrentInputConnection();
@@ -360,10 +424,14 @@
</pre>
<h3 id="ComposeThenCommit">Composing text before committing</h3>
<p>
- If your IME does text prediction or requires multiple steps to compose a glyph or
- word, you can show the progress in the text field until the user commits the word, and then you
- can replace the partial composition with the completed text. You may give special treatment to
- the text by adding a "span" to it when you pass it to InputConnection#setComposingText().
+ If your IME does text prediction or requires multiple steps to compose a
+glyph or
+ word, you can show the progress in the text field until the user commits
+the word, and then you
+ can replace the partial composition with the completed text. You may give
+special treatment to
+ the text by adding a "span" to it when you pass it to
+{@link android.view.inputmethod.InputConnection#setComposingText setComposingText()}.
</p>
<p>
The following snippet shows how to show progress in a text field:
@@ -383,59 +451,77 @@
<p>
The following screenshots show how this appears to the user:
</p>
-<img src="{@docRoot}resources/articles/images/inputmethod_composing_text_1.png" alt="" height="54"
+<img src="{@docRoot}resources/articles/images/inputmethod_composing_text_1.png"
+alt="" height="54"
id="figure3a" />
-<img src="{@docRoot}resources/articles/images/inputmethod_composing_text_2.png" alt="" height="53"
+<img src="{@docRoot}resources/articles/images/inputmethod_composing_text_2.png"
+alt="" height="53"
id="figure3b" />
-<img src="{@docRoot}resources/articles/images/inputmethod_composing_text_3.png" alt="" height="31"
+<img src="{@docRoot}resources/articles/images/inputmethod_composing_text_3.png"
+alt="" height="31"
id="figure3c" />
<p class="img-caption">
<strong>Figure 3.</strong> Composing text before committing.
</p>
<h3 id="HardwareKeyEvents">Intercepting hardware key events</h3>
<p>
- Even though the input method window doesn't have explicit focus, it receives hardware key
- events first and can choose to consume them or forward them along to the application. For
- example, you may want to consume the directional keys to navigate within your UI for candidate
- selection during composition. You may also want to trap the back key to dismiss any popups
+ Even though the input method window doesn't have explicit focus, it
+receives hardware key
+ events first and can choose to consume them or forward them along to the
+application. For
+ example, you may want to consume the directional keys to navigate within
+your UI for candidate
+ selection during composition. You may also want to trap the back key to
+dismiss any popups
originating from the input method window.</p>
<p>
To intercept hardware keys, override
{@link android.inputmethodservice.InputMethodService#onKeyDown(int, KeyEvent) onKeyDown()}
and {@link android.inputmethodservice.InputMethodService#onKeyUp(int, KeyEvent) onKeyUp()}.
- See the Soft Keyboard <a href="{@docRoot}tools/samples/index.html">sample
- app</a> for an example.
+ See the
+ <a href="https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/">
+ SoftKeyboard</a> sample app for an example.
</p>
<p>
- Remember to call the <code>super()</code> method for keys you don't want to handle yourself.
+ Remember to call the <code>super()</code> method for keys you don't want to
+handle yourself.
</p>
<h2 id="IMESubTypes">Creating an IME Subtype</h2>
<p>
- Subtypes allow the IME to expose multiple input modes and languages supported by an IME. A
- subtype can represent:
+ Subtypes allow the IME to expose multiple input modes and languages
+supported by an IME. A subtype can represent:
</p>
<ul>
<li>A locale such as en_US or fr_FR</li>
<li>An input mode such as voice, keyboard, or handwriting</li>
<li>
- Other input styles, forms, or properties specific to the IME, such as 10-key or qwerty
+ Other input styles, forms, or properties specific to the IME, such as
+10-key or qwerty
keyboard layouts.
</li>
</ul>
<p>
- Basically, the mode can be any text such as "keyboard", "voice", and so forth.
+ Basically, the mode can be any text such as "keyboard", "voice", and so
+forth. A subtype can also expose a combination of these.
</p>
-<p>A subtype can also expose a combination of these.</p>
+
<p>
- Subtype information is used for an IME switcher dialog that's available from the notification
- bar and also for IME settings. The information also allows the framework to bring up a
- specific subtype of an IME directly. When you build an IME, use the subtype facility, because
- it helps the user identify and switch between different IME languages and modes.
+ Subtype information is used for an IME switcher dialog that's available
+from the notification
+ bar and also for IME settings. The information also allows the framework to
+bring up a
+ specific subtype of an IME directly. When you build an IME, use the subtype
+facility, because
+ it helps the user identify and switch between different IME languages and
+modes.
</p>
<p>
- You define subtypes in one of the input method's XML resource files, using the
- <code><subtype></code> element. The following snippet defines an IME with two
- subtypes: a keyboard subtype for the US English locale, and another keyboard subtype for the
+ You define subtypes in one of the input method's XML resource files, using
+the
+ <code><subtype></code> element. The following snippet defines an IME
+with two
+ subtypes: a keyboard subtype for the US English locale, and another
+keyboard subtype for the
French language locale for France:
</p>
<pre>
@@ -460,8 +546,10 @@
/>
</pre>
<p>
- To ensure that your subtypes are labeled correctly in the UI, use %s to get a subtype label
- that is the same as the subtype’s locale label. This is demonstrated in the next two snippets.
+ To ensure that your subtypes are labeled correctly in the UI, use %s to get
+a subtype label
+ that is the same as the subtype’s locale label. This is demonstrated in
+the next two snippets.
The first snippet shows part of the input method's XML file:
</p>
<pre>
@@ -472,47 +560,99 @@
android:imeSubtypeMode="keyboard" />
</pre>
<p>
- The next snippet is part of the IME's <code>strings.xml</code> file. The string
- resource <code>label_subtype_generic</code>, which is used by the input method UI definition to
+ The next snippet is part of the IME's <code>strings.xml</code> file. The
+string
+ resource <code>label_subtype_generic</code>, which is used by the input
+method UI definition to
set the subtype's label, is defined as:
</p>
<pre>
<string name="label_subtype_generic">%s</string>
</pre>
<p>
- This sets the subtype’s display name to “English (United States)” in any English language
- locale, or to the appropriate localization in other locales.
+ This setting causes the subtype’s display name to match the locale setting.
+ For example, in any English locale, the display name is “English (United States)”.
</p>
<h3 id="SubtypeProcessing">Choosing IME subtypes from the notification bar</h3>
<p>
- The Android system manages all subtypes exposed by all IMEs. IME subtypes are
- treated as modes of the IME they belong to. In the notification bar, a user can select an
- available subtype for the currently-set IME, as shown in the following screenshot:
+ The Android system manages all subtypes exposed by all IMEs. IME subtypes
+are
+ treated as modes of the IME they belong to. In the notification bar, a user
+can select an
+ available subtype for the currently-set IME, as shown in the following
+screenshot:
</p>
-<img src="{@docRoot}resources/articles/images/inputmethod_subtype_notification.png" alt=""
+<img
+src="{@docRoot}resources/articles/images/inputmethod_subtype_notification.png"
+alt=""
height="85" id="figure4" />
<p class="img-caption">
- <strong>Figure 4.</strong> Choosing an IME subtype from the notification bar.
+ <strong>Figure 4.</strong> Choosing an IME subtype from the notification
+bar.
</p>
-<img src="{@docRoot}resources/articles/images/inputmethod_subtype_preferences.png" alt=""
+<img
+src="{@docRoot}resources/articles/images/inputmethod_subtype_preferences.png"
+alt=""
height="165" id="figure5" />
<p class="img-caption">
<strong>Figure 5.</strong> Setting subtype preferences in System Settings.
</p>
<h3 id="SubtypeSettings">Choosing IME subtypes from System Settings</h3>
<p>
- A user can control how subtypes are used in the “Language & input” settings panel in the
- System Settings area. In the Soft Keyboard sample, the file
- <code>InputMethodSettingsFragment.java</code> contains an implementation that
- facilitates a subtype enabler in the IME settings. Please refer to the SoftKeyboard sample in
- the Android SDK for more information about how to support Input Method Subtypes in your IME.
+ A user can control how subtypes are used in the “Language & input”
+settings panel in the
+ System Settings area. In the <a href="https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/">
+ SoftKeyboard</a> sample app, the file <code>InputMethodSettingsFragment.java</code> contains an
+ implementation that facilitates a subtype enabler in the IME settings. Refer to the
+ <a href="https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/">
+ SoftKeyboard</a> sample app in the Android SDK for more information about how to support
+ Input Method Subtypes in your IME.
</p>
-<img src="{@docRoot}resources/articles/images/inputmethod_subtype_settings.png" alt=""
+<img src="{@docRoot}resources/articles/images/inputmethod_subtype_settings.png"
+alt=""
height="210" id="figure6" />
<p class="img-caption">
<strong>Figure 6.</strong> Choosing a language for the IME.
</p>
+<h2 id="Switching">Switching among IME Subtypes</h2>
+
+<p>You can allow users to switch easily among multiple IME subtypes by providing
+a switching key, such as the globe-shaped language icon, as part of the keyboard. Doing so greatly
+improves the keyboard's usability, and can help avoid user frustration.
+To enable such switching, perform the following steps:</p>
+<p>
+<ol>
+ <li>Declare <code>supportsSwitchingToNextInputMethod = "true"</code> in the
+input method's XML resource files. Your declaration
+ should look similar to the following snippet:
+ <pre>
+<input-method xmlns:android="http://schemas.android.com/apk/res/android"
+ android:settingsActivity="com.example.softkeyboard.Settings"
+ android:icon="@drawable/ime_icon"
+ android:supportsSwitchingToNextInputMethod="true">
+</pre></li>
+ <li>Call the {@link android.view.inputmethod.InputMethodManager#shouldOfferSwitchingToNextInputMethod shouldOfferSwitchingToNextInputMethod()} method.</li>
+ <li>If the method returns true, display a switching key.</li>
+ <li>When the user taps the switching key, call
+ {@link android.view.inputmethod.InputMethodManager#switchToNextInputMethod switchToNextInputMethod()},
+ passing false to the second parameter. A value of false tells the system to treat all subtypes
+ equally, regardless of what IME they belong to. Specifying true requires the system to cycle
+ through subtypes in the current IME.</li>
+</ol>
+</p>
+
+<p class="caution">
+ <strong>Caution:</strong> Prior to Android 5.0 (API level 21),
+{@link android.view.inputmethod.InputMethodManager#switchToNextInputMethod switchToNextInputMethod()}
+is not aware of the <code>supportsSwitchingToNextInputMethod</code> attribute. If the user switches
+into an IME without a switching key, he or she may get stuck in that IME, unable to switch out of it
+easily.</p>
+
+<p>
+
+</p>
+
<h2 id="GeneralDesign">General IME Considerations</h2>
<p>
Here are some other things to consider as you're implementing your IME:
@@ -522,23 +662,31 @@
Provide a way for users to set options directly from the IME's UI.
</li>
<li>
- Because multiple IMEs may be installed on the device, provide a way for the user to switch to a
+ Because multiple IMEs may be installed on the device, provide a way for the
+user to switch to a
different IME directly from the input method UI.
</li>
<li>
- Bring up the IME's UI quickly. Preload or load on demand any large resources so that users
- see the IME as soon as they tap on a text field. Cache resources and views for subsequent
+ Bring up the IME's UI quickly. Preload or load on demand any large
+resources so that users
+ see the IME as soon as they tap on a text field. Cache resources and views
+for subsequent
invocations of the input method.
</li>
<li>
- Conversely, you should release large memory allocations soon after the input method window is
- hidden, so that applications can have sufficient memory to run. Consider using a delayed message
+ Conversely, you should release large memory allocations soon after the
+input method window is
+ hidden, so that applications can have sufficient memory to run. Consider
+using a delayed message
to release resources if the IME is in a hidden state for a few seconds.
</li>
<li>
- Make sure that users can enter as many characters as possible for the language or locale
- associated with the IME. Remember that users may use punctuation in passwords or user
- names, so your IME has to provide many different characters to allow users to enter a
+ Make sure that users can enter as many characters as possible for the
+language or locale
+ associated with the IME. Remember that users may use punctuation in
+passwords or user
+ names, so your IME has to provide many different characters to allow users
+to enter a
password and get access to the device.
</li>
-</ul>
+</ul>
\ No newline at end of file
diff --git a/docs/html/guide/topics/ui/actionbar.jd b/docs/html/guide/topics/ui/actionbar.jd
index a61696a..d972c47 100644
--- a/docs/html/guide/topics/ui/actionbar.jd
+++ b/docs/html/guide/topics/ui/actionbar.jd
@@ -1427,7 +1427,7 @@
<p>Here's an example that defines a custom theme for an activity, {@code CustomActivityTheme},
that includes several styles to customize the action bar.</p>
-<p>Notice that there are two version for each action bar style property. The first one
+<p>Notice that there are two versions for each action bar style property. The first one
includes the {@code android:} prefix on the property name to support API levels 11 and higher
that include these properties in the framework. The second version does <em>not</em>
include the {@code android:} prefix and is for older versions of the platform, on which
diff --git a/docs/html/guide/topics/ui/notifiers/notifications.jd b/docs/html/guide/topics/ui/notifiers/notifications.jd
index 59c2269..e47c77e 100644
--- a/docs/html/guide/topics/ui/notifiers/notifications.jd
+++ b/docs/html/guide/topics/ui/notifiers/notifications.jd
@@ -5,12 +5,7 @@
<div id="qv">
<h2>In this document</h2>
<ol>
- <li><a href="#NotificationUI">Notification Display Elements</a>
- <ol>
- <li><a href="#NormalNotify">Normal view</a></li>
- <li><a href="#BigNotify">Big view</a></li>
- </ol>
- </li>
+ <li><a href="#Design">Design Considerations</a></li>
<li><a href="#CreateNotification">Creating a Notification</a>
<ol>
<li><a href="#Required">Required notification contents</a></li>
@@ -18,7 +13,7 @@
<li><a href="#Actions">Notification actions</a></li>
<li><a href="#Priority">Notification priority</a></li>
<li><a href="#SimpleNotification">Creating a simple notification</a></li>
- <li><a href="#ApplyStyle">Applying a big view style to a notification</a></li>
+ <li><a href="#ApplyStyle">Applying an expanded layout to a notification</a></li>
<li><a href="#Compatibility">Handling compatibility</a></li>
</ol>
</li>
@@ -40,6 +35,13 @@
<li><a href="#ActivityIndicator">Displaying a continuing activity indicator</a></li>
</ol>
</li>
+ <li><a href="#metadata">Notification Metadata</a></li>
+ <li><a href="#Heads-up">Heads-up Notifications</a></li>
+ <li><a href="#lockscreenNotification">Lock Screen Notifications</a></li>
+ <ol>
+ <li><a href="#visibility">Setting Visibility</a></li>
+ <li><a href="#controllingMedia">Controlling Media Playback on the Lock Screen</a></li>
+ </ol>
<li><a href="#CustomNotification">Custom Notification Layouts</a></li>
</ol>
@@ -72,167 +74,41 @@
</p>
<img
id="figure1"
- src="{@docRoot}images/ui/notifications/iconic_notification.png"
- height="120" alt="" />
+ src="{@docRoot}images/ui/notifications/notification_area.png"
+ height="" alt="" />
<p class="img-caption">
<strong>Figure 1.</strong> Notifications in the notification area.
</p>
-<img id="figure2" src="{@docRoot}images/ui/notifications/normal_notification.png"
- height="293" alt="" />
+<img id="figure2" src="{@docRoot}images/ui/notifications/notification_drawer.png"
+ width="280px" alt="" />
<p class="img-caption">
<strong>Figure 2.</strong> Notifications in the notification drawer.
</p>
-<div class="note design">
- <p>
- <strong>Notification Design</strong>
- </p>
- <p>
- Notifications, as an important part of the Android UI, have their own design guidelines. To
- learn how to design notifications and their interactions, read the Android Design Guide
- <a href="{@docRoot}design/patterns/notifications.html">Notifications</a> topic.
- </p>
-</div>
-<p class="note">
- <strong>Note:</strong> Except where noted, this guide refers to the
- {@link android.support.v4.app.NotificationCompat.Builder NotificationCompat.Builder} class
- in the version 4 <a href="{@docRoot}tools/support-library/index.html">Support Library</a>.
- The class {@link android.app.Notification.Builder Notification.Builder} was added in Android
- 3.0.
-</p>
-<!-- ------------------------------------------------------------------------------------------ -->
-<!-- ------------------------------------------------------------------------------------------ -->
-<h2 id="NotificationUI">Notification Display Elements</h2>
-<p>
- Notifications in the notification drawer can appear in one of two visual styles, depending on
- the version and the state of the drawer:
-</p>
-<dl>
- <dt>
- Normal view
- </dt>
- <dd>
- The standard view of the notifications in the notification drawer.
- </dd>
- <dt>
- Big view
- </dt>
- <dd>
- A large view that's visible when the notification is expanded. Big view is part of the
- expanded notification feature available as of Android 4.1.
- </dd>
-</dl>
-<p>
- These styles are described in the following sections.
-</p>
-<!-- ------------------------------------------------------------------------------------------ -->
-<h3 id="NormalNotify">Normal view</h3>
-<p>
- A notification in normal view appears in an area that's up to 64 dp tall. Even if you create a
- notification with a big view style, it will appear in normal view until it's expanded. This
- is an example of a normal view:
-</p>
-<img
- src="{@docRoot}images/ui/notifications/normal_notification_callouts.png"
- alt=""
- height="153"
- id="figure3" />
-<p class="img-caption">
- <strong>Figure 3.</strong> Notification in normal view.
-</p>
-<p>
- The callouts in the illustration refer to the following:
-</p>
-<ol>
- <li>Content title</li>
- <li>Large icon</li>
- <li>Content text</li>
- <li>Content info</li>
- <li>Small icon</li>
- <li>
- Time that the notification was issued. You can set an explicit value with
- {@link android.support.v4.app.NotificationCompat.Builder#setWhen setWhen()}; if you don't
- it defaults to the time that the system received the notification.
- </li>
-</ol>
-<!-- ------------------------------------------------------------------------------------------ -->
-<h3 id="BigNotify">Big view</h3>
-<p>
- A notification's big view appears only when the notification is expanded, which happens when the
- notification is at the top of the notification drawer, or when the user expands the
- notification with a gesture. Expanded notifications are available starting with Android 4.1.
-</p>
-<p>
- The following screenshot shows an inbox-style notification:
-</p>
-<img src="{@docRoot}images/ui/notifications/bigpicture_notification_callouts.png"
- alt=""
- height="240"
- id="figure4" />
-<p class="img-caption">
- <strong>Figure 4.</strong> Big view notification.
-</p>
-<p>
- Notice that the big view shares most of its visual elements with the normal view. The
- only difference is callout number 7, the details area. Each big view style sets this area in
- a different way. The available styles are:
-</p>
-<dl>
- <dt>
- Big picture style
- </dt>
- <dd>
- The details area contains a bitmap up to 256 dp tall in its detail section.
- </dd>
- <dt>
- Big text style
- </dt>
- <dd>
- Displays a large text block in the details section.
- </dd>
- <dt>
- Inbox style
- </dt>
- <dd>
- Displays lines of text in the details section.
- </dd>
-</dl>
-<p>
- All of the big view styles also have the following content options that aren't
- available in normal view:
-</p>
-<dl>
- <dt>
- Big content title
- </dt>
- <dd>
- Allows you to override the normal view's content title with a title that appears only in
- the expanded view.
- </dd>
- <dt>
- Summary text
- </dt>
- <dd>
- Allows you to add a line of text below the details area.
- </dd>
-</dl>
-<p>
- Applying a big view style to a notification is described in the section
- <a href="#ApplyStyle">Applying a big view style to a notification</a>.
-</p>
-<!-- ------------------------------------------------------------------------------------------ -->
-<!-- ------------------------------------------------------------------------------------------ -->
+
+<p class="note"><strong>Note:</strong> Except where noted, this guide refers to the
+{@link android.support.v4.app.NotificationCompat.Builder NotificationCompat.Builder} class
+in the version 4 <a href="{@docRoot}tools/support-library/index.html">Support Library</a>.
+The class {@link android.app.Notification.Builder Notification.Builder} was added in Android
+3.0 (API level 11).</p>
+
+<h2 id="Design">Design Considerations</h2>
+
+<p>Notifications, as an important part of the Android user interface, have their own design guidelines.
+The material design changes introduced in Android 5.0 (API level 21) are of particular
+importance, and you should review the <a href="{@docRoot}training/material/index.html">Material Design</a>
+training for more information. To learn how to design notifications and their interactions, read the
+<a href="{@docRoot}design/patterns/notifications.html">Notifications</a> design guide.</p>
+
<h2 id="CreateNotification">Creating a Notification</h2>
-<p>
- You specify the UI information and actions for a notification in a
- {@link android.support.v4.app.NotificationCompat.Builder NotificationCompat.Builder} object.
- To create the notification itself, you call
- {@link android.support.v4.app.NotificationCompat.Builder#build
- NotificationCompat.Builder.build()}, which returns a {@link android.app.Notification} object
- containing your specifications.
- To issue the notification, you pass the {@link android.app.Notification} object to the system
- by calling {@link android.app.NotificationManager#notify NotificationManager.notify()}.
-</p>
-<!-- ------------------------------------------------------------------------------------------ -->
+
+<p>You specify the UI information and actions for a notification in a
+{@link android.support.v4.app.NotificationCompat.Builder NotificationCompat.Builder} object.
+To create the notification itself, you call
+{@link android.support.v4.app.NotificationCompat.Builder#build NotificationCompat.Builder.build()},
+which returns a {@link android.app.Notification} object containing your specifications. To issue the
+notification, you pass the {@link android.app.Notification} object to the system by calling
+{@link android.app.NotificationManager#notify NotificationManager.notify()}.</p>
+
<h3 id="Required">Required notification contents</h3>
<p>
A {@link android.app.Notification} object <em>must</em> contain the following:
@@ -275,7 +151,8 @@
</p>
<p>
Inside a {@link android.app.Notification}, the action itself is defined by a
- {@link android.app.PendingIntent} containing an {@link android.content.Intent} that starts
+ {@link android.app.PendingIntent} containing an
+ {@link android.content.Intent} that starts
an {@link android.app.Activity} in your application. To associate the
{@link android.app.PendingIntent} with a gesture, call the appropriate method of
{@link android.support.v4.app.NotificationCompat.Builder}. For example, if you want to start
@@ -351,12 +228,12 @@
</pre>
<p>That's it. Your user has now been notified.</p>
<!-- ------------------------------------------------------------------------------------------ -->
-<h3 id="ApplyStyle">Applying a big view style to a notification</h3>
+<h3 id="ApplyStyle">Applying an expanded layout to a notification</h3>
<p>
- To have a notification appear in a big view when it's expanded, first create a
+ To have a notification appear in an expanded view, first create a
{@link android.support.v4.app.NotificationCompat.Builder} object with the normal view options
you want. Next, call {@link android.support.v4.app.NotificationCompat.Builder#setStyle
- Builder.setStyle()} with a big view style object as its argument.
+ Builder.setStyle()} with an expanded layout object as its argument.
</p>
<p>
Remember that expanded notifications are not available on platforms prior to Android 4.1. To
@@ -365,7 +242,7 @@
</p>
<p>
For example, the following code snippet demonstrates how to alter the notification created
- in the previous snippet to use the Inbox big view style:
+ in the previous snippet to use the expanded layout:
</p>
<pre>
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
@@ -375,20 +252,22 @@
NotificationCompat.InboxStyle inboxStyle =
new NotificationCompat.InboxStyle();
String[] events = new String[6];
-// Sets a title for the Inbox style big view
+// Sets a title for the Inbox in expanded layout
inboxStyle.setBigContentTitle("Event tracker details:");
...
-// Moves events into the big view
+// Moves events into the expanded layout
for (int i=0; i < events.length; i++) {
inboxStyle.addLine(events[i]);
}
-// Moves the big view style object into the notification object.
+// Moves the expanded layout object into the notification object.
mBuilder.setStyle(inBoxStyle);
...
// Issue the notification here.
</pre>
+
<h3 id="Compatibility">Handling compatibility</h3>
+
<p>
Not all notification features are available for a particular version, even though
the methods to set them are in the support library class
@@ -419,7 +298,8 @@
<li>
Ensure that all users can get to the functionality in the {@link android.app.Activity},
by having it start when users click the notification. To do this,
- create a {@link android.app.PendingIntent} for the {@link android.app.Activity}. Call
+ create a {@link android.app.PendingIntent}
+ for the {@link android.app.Activity}. Call
{@link android.support.v4.app.NotificationCompat.Builder#setContentIntent
setContentIntent()} to add the {@link android.app.PendingIntent} to the notification.
</li>
@@ -429,6 +309,8 @@
that starts when users click the notification.
</li>
</ol>
+
+
<!-- ------------------------------------------------------------------------------------------ -->
<!-- ------------------------------------------------------------------------------------------ -->
<h2 id="Managing">Managing Notifications</h2>
@@ -444,7 +326,7 @@
<a href="{@docRoot}design/patterns/notifications.html">Notifications</a> Design guide.
</p>
<p class="note">
- <strong>Note:</strong> This Gmail feature requires the "inbox" big view style, which is
+ <strong>Note:</strong> This Gmail feature requires the "inbox" expanded layout, which is
part of the expanded notification feature available starting in Android 4.1.
</p>
<p>
@@ -453,8 +335,8 @@
<h3 id="Updating">Updating notifications</h3>
<p>
To set up a notification so it can be updated, issue it with a notification ID by
- calling {@link android.app.NotificationManager#notify(int, Notification)
- NotificationManager.notify(ID, notification)}. To update this notification once you've issued
+ calling {@link android.app.NotificationManager#notify(int, android.app.Notification) NotificationManager.notify()}.
+ To update this notification once you've issued
it, update or create a {@link android.support.v4.app.NotificationCompat.Builder} object,
build a {@link android.app.Notification} object from it, and issue the
{@link android.app.Notification} with the same ID you used previously. If
@@ -487,17 +369,7 @@
mNotifyBuilder.build());
...
</pre>
-<p>
- This produces a notification that looks like this:
-</p>
-<img
- id="figure5"
- src="{@docRoot}images/ui/notifications/updated_notification.png"
- alt=""
- height="118"/>
-<p class="img-caption">
- <strong>Figure 5.</strong> Updated notification displayed in the notification drawer.
-</p>
+
<!-- ------------------------------------------------------------------------------------------ -->
<h3 id="Removing">Removing notifications</h3>
<p>
@@ -899,18 +771,7 @@
// Starts the thread by calling the run() method in its Runnable
).start();
</pre>
-<p>
- The resulting notifications are shown in figure 6. On the left side is a snapshot of the
- notification during the operation; on the right side is a snapshot of it after the operation
- has finished.
-</p>
-<img
- id="figure6"
- src="{@docRoot}images/ui/notifications/progress_bar_summary.png"
- height="84"
- alt="" />
-<p class="img-caption">
-<strong>Figure 6.</strong> The progress bar during and after the operation.</p>
+
<!-- ------------------------------------------------------------------------------------------ -->
<h3 id="ActivityIndicator">Displaying a continuing activity indicator</h3>
<p>
@@ -946,19 +807,123 @@
// Issues the notification
mNotifyManager.notify(0, mBuilder.build());
</pre>
-<p>
- The resulting indicator is shown in figure 7:
-</p>
-<img
- id="figure7"
- src="{@docRoot}images/ui/notifications/activity_indicator.png"
- height="99"
- alt="" />
-<p class="img-caption"><strong>Figure 7.</strong> An ongoing activity indicator.</p>
-<!-- ------------------------------------------------------------------------------------------ -->
-<!-- ------------------------------------------------------------------------------------------ -->
-<!-- ------------------------------------------------------------------------------------------ -->
+<h2 id="metadata">Notification Metadata</h2>
+
+<p>Notifications may be sorted according to metadata that you assign with the
+following {@link android.support.v4.app.NotificationCompat.Builder} methods:</p>
+
+<ul>
+ <li>{@link android.support.v4.app.NotificationCompat.Builder#setCategory(java.lang.String) setCategory()}
+ tells the system how to handle your app notifications when the device is in Priority mode
+ (for example, if your notification represents an incoming call, instant message, or alarm).</li>
+ <li>{@link android.support.v4.app.NotificationCompat.Builder#setPriority(int) setPriority()} causes
+ notifications with the priority field set to {@code PRIORITY_MAX} or {@code PRIORITY_HIGH} to
+ appear in a small floating window if the notification also has sound or vibration.</li>
+ <li>{@link android.support.v4.app.NotificationCompat.Builder#addPerson(java.lang.String) addPerson()}
+ allows you to add a list of people to a notification. Your app can use this to signal to the
+ system that it should group together notifications from the specified people, or rank notifications
+ from these people as being more important.</li>
+</ul>
+
+<div class="figure" style="width:230px">
+ <img src="{@docRoot}images/ui/notifications/heads-up.png"
+ alt="" width="" height="" id="figure3" />
+ <p class="img-caption">
+ <strong>Figure 3.</strong> Fullscreen activity showing a heads-up notification
+ </p>
+</div>
+
+<h2 id="Heads-up">Heads-up Notifications</h2>
+
+<p>With Android 5.0 (API level 21), notifications can appear in a small floating window
+(also called a <em>heads-up notification</em>) when the device is active
+(that is, the device is unlocked and its screen is on). These notifications
+appear similar to the compact form of your notification, except that the
+heads-up notification also shows action buttons. Users can act on, or dismiss,
+a heads-up notification without leaving the current app.</p>
+
+<p>Examples of conditions that may trigger heads-up notifications include:</p>
+
+<ul>
+ <li>The user's activity is in fullscreen mode (the app uses
+{@link android.app.Notification#fullScreenIntent}), or</li>
+ <li>The notification has high priority and uses ringtones or
+ vibrations</li>
+</ul>
+
+<h2 id="lockscreenNotification">Lock Screen Notifications</h2>
+
+<p>With the release of Android 5.0 (API level 21), notifications may now appear on the lock
+screen. Your app can use this functionality to provide media playback controls and other common
+actions. Users can choose via Settings whether to display notifications on the lock screen, and
+you can designate whether a notification from your app is visible on the lock screen.</p>
+
+<h3 id="visibility">Setting Visibility</h3>
+
+<p>Your app can control the level of detail visible in notifications displayed on a secure
+lock screen. You call {@link android.support.v4.app.NotificationCompat.Builder#setVisibility(int) setVisibility()}
+and specify one of the following values:</p>
+
+<ul>
+ <li>{@link android.support.v4.app.NotificationCompat#VISIBILITY_PUBLIC} shows the notification's
+ full content.</li>
+ <li>{@link android.support.v4.app.NotificationCompat#VISIBILITY_SECRET} doesn't show any part of
+ this notification on the lock screen.</li>
+ <li>{@link android.support.v4.app.NotificationCompat#VISIBILITY_PRIVATE} shows basic information,
+ such as the notification's icon and the content title, but hides the notification's full content.</li>
+</ul>
+
+<p>When {@link android.support.v4.app.NotificationCompat#VISIBILITY_PRIVATE} is set, you can also
+provide an alternate version of the notification content which hides certain details. For example,
+an SMS app might display a notification that shows <em>You have 3 new text messages</em>, but hides the
+message contents and senders. To provide this alternative notification, first create the replacement
+notification using {@link android.support.v4.app.NotificationCompat.Builder}. When you create the
+private notification object, attach the replacement notification to it through the
+{@link android.support.v4.app.NotificationCompat.Builder#setPublicVersion(android.app.Notification) setPublicVersion()}
+method.</p>
+
+<h3 id="controllingMedia">Controlling Media Playback on the Lock Screen</h3>
+
+<p>In Android 5.0 (API level 21) the lock screen no longer displays media controls
+based on the {@link android.media.RemoteControlClient}, which is now deprecated. Instead, use the
+{@link android.app.Notification.MediaStyle} template with the
+{@link android.app.Notification.Builder#addAction(android.app.Notification.Action) addAction()}
+method, which converts actions into clickable icons.</p>
+
+<p class="note"><strong>Note:</strong> The template and the {@link android.app.Notification.Builder#addAction(android.app.Notification.Action) addAction()}
+method are not included in the support library, so these features run in Android 5.0 and higher
+only.</p>
+
+<p>To display media playback controls on the lock screen in Android 5.0, set the visibility
+to {@link android.support.v4.app.NotificationCompat#VISIBILITY_PUBLIC}, as described above. Then add
+the actions and set the {@link android.app.Notification.MediaStyle} template, as described in the
+following sample code:</p>
+
+<pre>
+Notification notification = new Notification.Builder(context)
+ // Show controls on lock screen even when user hides sensitive content.
+ .setVisibility(Notification.VISIBILITY_PUBLIC)
+ .setSmallIcon(R.drawable.ic_stat_player)
+ // Add media control buttons that invoke intents in your media service
+ .addAction(R.drawable.ic_prev, "Previous", prevPendingIntent) // #0
+ .addAction(R.drawable.ic_pause, "Pause", pausePendingIntent) // #1
+ .addAction(R.drawable.ic_next, "Next", nextPendingIntent) // #2
+ // Apply the media style template
+ .setStyle(new Notification.MediaStyle()
+ .setShowActionsInCompactView(1 /* #1: pause button */)
+ .setMediaSession(mMediaSession.getSessionToken())
+ .setContentTitle("Wonderful music")
+ .setContentText("My Awesome Band")
+ .setLargeIcon(albumArtBitmap)
+ .build();
+</pre>
+
+<p class="note"><strong>Note:</strong> The deprecation of {@link android.media.RemoteControlClient}
+has further implications for controlling media. See
+<a href="{@docRoot}about/versions/android-5.0.html#MediaPlaybackControl">Media Playback Control</a>
+for more information about the new APIs for managing the media session and controlling playback.</p>
+
<!-- ------------------------------------------------------------------------------------------ -->
<h2 id="CustomNotification">Custom Notification Layouts</h2>
diff --git a/docs/html/images/android-5.0/managed_apps_launcher.png b/docs/html/images/android-5.0/managed_apps_launcher.png
index b5ef407..46e4c74 100644
--- a/docs/html/images/android-5.0/managed_apps_launcher.png
+++ b/docs/html/images/android-5.0/managed_apps_launcher.png
Binary files differ
diff --git a/docs/html/images/android-5.0/managed_apps_launcher@2x.png b/docs/html/images/android-5.0/managed_apps_launcher@2x.png
index 90d7d51..d7fdbce 100644
--- a/docs/html/images/android-5.0/managed_apps_launcher@2x.png
+++ b/docs/html/images/android-5.0/managed_apps_launcher@2x.png
Binary files differ
diff --git a/docs/html/images/android-5.0/notifications/hun-example.png b/docs/html/images/android-5.0/notifications/hun-example.png
new file mode 100644
index 0000000..f07004b
--- /dev/null
+++ b/docs/html/images/android-5.0/notifications/hun-example.png
Binary files differ
diff --git a/docs/html/images/android-5.0/notifications/hun-example@2x.png b/docs/html/images/android-5.0/notifications/hun-example@2x.png
new file mode 100644
index 0000000..cc6b840
--- /dev/null
+++ b/docs/html/images/android-5.0/notifications/hun-example@2x.png
Binary files differ
diff --git a/docs/html/images/components/recents.png b/docs/html/images/components/recents.png
new file mode 100644
index 0000000..9809f04
--- /dev/null
+++ b/docs/html/images/components/recents.png
Binary files differ
diff --git a/docs/html/images/games/game-controller-buttons.png b/docs/html/images/games/game-controller-buttons.png
new file mode 100644
index 0000000..b3e458a
--- /dev/null
+++ b/docs/html/images/games/game-controller-buttons.png
Binary files differ
diff --git a/docs/html/images/games/game-controller-buttons_2x.png b/docs/html/images/games/game-controller-buttons_2x.png
new file mode 100644
index 0000000..7a0ad0b
--- /dev/null
+++ b/docs/html/images/games/game-controller-buttons_2x.png
Binary files differ
diff --git a/docs/html/images/home/l-hero.png b/docs/html/images/home/l-hero.png
new file mode 100644
index 0000000..5104bca
--- /dev/null
+++ b/docs/html/images/home/l-hero.png
Binary files differ
diff --git a/docs/html/images/home/l-hero_2x.png b/docs/html/images/home/l-hero_2x.png
new file mode 100644
index 0000000..19ae6b3
--- /dev/null
+++ b/docs/html/images/home/l-hero_2x.png
Binary files differ
diff --git a/docs/html/preview/tv/images/home-recommendations.png b/docs/html/images/tv/home-recommendations.png
similarity index 100%
rename from docs/html/preview/tv/images/home-recommendations.png
rename to docs/html/images/tv/home-recommendations.png
Binary files differ
diff --git a/docs/html/images/ui/notifications/heads-up.png b/docs/html/images/ui/notifications/heads-up.png
new file mode 100644
index 0000000..42fbbcd
--- /dev/null
+++ b/docs/html/images/ui/notifications/heads-up.png
Binary files differ
diff --git a/docs/html/images/ui/notifications/notification_area.png b/docs/html/images/ui/notifications/notification_area.png
new file mode 100644
index 0000000..5836300
--- /dev/null
+++ b/docs/html/images/ui/notifications/notification_area.png
Binary files differ
diff --git a/docs/html/images/ui/notifications/notification_drawer.png b/docs/html/images/ui/notifications/notification_drawer.png
new file mode 100755
index 0000000..30da8fb
--- /dev/null
+++ b/docs/html/images/ui/notifications/notification_drawer.png
Binary files differ
diff --git a/docs/html/images/versions/battery_historian.png b/docs/html/images/versions/battery_historian.png
new file mode 100644
index 0000000..f1d4e40
--- /dev/null
+++ b/docs/html/images/versions/battery_historian.png
Binary files differ
diff --git a/docs/html/images/versions/battery_historian@2x.png b/docs/html/images/versions/battery_historian@2x.png
new file mode 100644
index 0000000..8c8a87f
--- /dev/null
+++ b/docs/html/images/versions/battery_historian@2x.png
Binary files differ
diff --git a/docs/html/images/versions/notification-headsup.png b/docs/html/images/versions/notification-headsup.png
new file mode 100644
index 0000000..7c374c8
--- /dev/null
+++ b/docs/html/images/versions/notification-headsup.png
Binary files differ
diff --git a/docs/html/images/versions/recents_screen.png b/docs/html/images/versions/recents_screen.png
new file mode 100644
index 0000000..04d4d74
--- /dev/null
+++ b/docs/html/images/versions/recents_screen.png
Binary files differ
diff --git a/docs/html/images/versions/recents_screen_2x.png b/docs/html/images/versions/recents_screen_2x.png
new file mode 100644
index 0000000..127f69a
--- /dev/null
+++ b/docs/html/images/versions/recents_screen_2x.png
Binary files differ
diff --git a/docs/html/images/versions/rivalknights.png b/docs/html/images/versions/rivalknights.png
new file mode 100644
index 0000000..6b467ef
--- /dev/null
+++ b/docs/html/images/versions/rivalknights.png
Binary files differ
diff --git a/docs/html/index.jd b/docs/html/index.jd
index 253a7a5..2838959 100644
--- a/docs/html/index.jd
+++ b/docs/html/index.jd
@@ -15,20 +15,21 @@
<div class="resource resource-card resource-card-18x6">
<div class="landing-section-header">
- <div class="col-10"><img src="{@docRoot}preview/images/l-dev-prev.png"
- style="margin:40px 60px 0 20px"></div>
+ <div class="col-10"><img src="{@docRoot}images/home/l-hero_2x.png"
+ srcset="{@docRoot}images/home/l-hero.png 1x, {@docRoot}images/home/l-hero_2x.png 2x"
+ width="510" style="margin:20px 30px 0 30px"></div>
<div class="col-5" style=" margin-top:70px ">
- <h3 stye="font-weight:300;">L Developer Preview</h3>
- <p>The L Developer Preview lets you design and develop against the next major
- release of Android. Take the time to test and build your app before the platform
- officially launches. </p>
- <a href="{@docRoot}preview/index.html" class="landing-button landing-primary">Learn More</a>
+ <h3 stye="font-weight:300;">Android 5.0 Lollipop</h3>
+ <p>The Android 5.0 update adds a variety of new
+ features for your apps, such as notifications on the lock screen, an all-new camera API,
+ OpenGL ES 3.1, the new Material design interface, and much more.</p>
+ <a href="{@docRoot}about/versions/lollipop.html" class="landing-button landing-primary">Learn More</a>
</div>
</div>
</div>
</div>
<h2> </h2>
- <div style="margin-top:20px" class="resource-widget resource-flow-layout wrap col-16
+ <div style="margin-top:20px;height:115px" class="resource-widget resource-flow-layout wrap col-16
no-section" data-query="collection:index/primary" data-resourcestyle="card"
data-sortorder="-timestamp" data-maxresults="3" data-cardsizes="6x2,6x2,6x2"></div> <!-- end .resource-widget -->
</div> <!-- end .wrap -->
@@ -53,7 +54,7 @@
<div class="landing-section">
<div class="wrap">
<div class="landing-section-header">
-
+
<div class="landing-h1" style="margin-top:0px">Build for a Multi-Screen World</div>
<div class="landing-subhead" style="margin-top: 20px;">
Android runs on hundreds of millions of handheld devices around the world, <br>
diff --git a/docs/html/jd_collections.js b/docs/html/jd_collections.js
index 15564e0..08c0090 100644
--- a/docs/html/jd_collections.js
+++ b/docs/html/jd_collections.js
@@ -3,8 +3,8 @@
"title": "",
"resources": [
"training/building-wearables.html",
- "preview/material/index.html",
- "sdk/installing/studio.html"
+ "training/material/index.html",
+ "sdk/installing/studio.html"
]
},
"distribute/edu/videos/stories": {
@@ -66,10 +66,10 @@
"resources": [
"distribute/essentials/quality/core.html",
"distribute/essentials/quality/tablets.html",
+ "distribute/essentials/quality/tv.html",
+ "distribute/essentials/quality/wear.html",
"https://developers.google.com/edu/guidelines",
- "distribute/essentials/optimizing-your-app.html",
- "distribute/essentials/best-practices/apps.html",
- "distribute/essentials/best-practices/games.html"
+ "distribute/essentials/optimizing-your-app.html"
]
},
"distribute/users": {
@@ -318,6 +318,36 @@
"training/basics/activity-lifecycle/recreating.html"
]
},
+ "distribute/essentials/tvqualityguidelines/visualdesign": {
+ "title": "",
+ "resources": [
+ "design/tv/index.html",
+ "training/tv/start/index.html"
+ ]
+ },
+ "distribute/essentials/tvqualityguidelines/functionality": {
+ "title": "",
+ "resources": [
+ "training/tv/start/hardware.html",
+ "training/tv/games/index.html"
+ ]
+ },
+ "distribute/essentials/wearqualityguidelines/visualdesign": {
+ "title": "",
+ "resources": [
+ "design/wear/index.html",
+ "training/building-wearables.html",
+ "training/wearables/ui/index.html"
+ ]
+ },
+ "distribute/essentials/wearqualityguidelines/functionality": {
+ "title": "",
+ "resources": [
+ "training/wearables/notifications/index.html",
+ "training/wearables/apps/index.html",
+ "training/wearables/notifications/voice-input.html"
+ ]
+ },
"distribute/essentials/core/performance": {
"title": "",
"resources": [
@@ -705,7 +735,7 @@
"google/play/billing/index.html",
"https://support.google.com/googleplay/android-developer/answer/4407611"
]
- },
+ },
"distribute/monetize/freemium": {
"title": "",
"resources": [
diff --git a/docs/html/legal.jd b/docs/html/legal.jd
index c6143da..5ee6b5c 100644
--- a/docs/html/legal.jd
+++ b/docs/html/legal.jd
@@ -4,9 +4,9 @@
@jd:body
<div class="wrap" style="width:940px;">
-
+
<h1>Legal Notice</h1>
-
+
<p>Android is an open platform that's freely available to you as an app developer. You can
immediately download the Android SDK, develop apps, and distribute them to the world without any
registration or fees.</p>
@@ -107,7 +107,7 @@
<p><a href="https://developers.google.com/android/c2dm/terms">Android Cloud to Device
Messaging Terms of Service</a></p>
</dd>
-
+
<dt>Android Backup Service</dt>
<dd>Android Backup Service is integrated with Android's data backup framework to perform data
backup and restore for most devices running Android 2.2 or greater, using Google servers and a
@@ -124,4 +124,8 @@
-</div>
\ No newline at end of file
+</div> <!-- end.class.wrap -->
+
+<div class="layout-content-col col-16" style="padding-top:1px">
+ <!-- layout div, so auto-gen footer sits correctly; do not remove -->
+</div>
diff --git a/docs/html/preview/images/material-layers.png b/docs/html/preview/images/material-layers.png
new file mode 100644
index 0000000..9b01ede
--- /dev/null
+++ b/docs/html/preview/images/material-layers.png
Binary files differ
diff --git a/docs/html/preview/index.html b/docs/html/preview/index.html
index ab959c7..ed78e4d1 100644
--- a/docs/html/preview/index.html
+++ b/docs/html/preview/index.html
@@ -1,88 +1,5 @@
<!DOCTYPE html>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
<html>
<head>
@@ -127,211 +44,555 @@
</head>
-<body class="gc-documentation
-" itemscope itemtype="http://schema.org/Article">
+<body class="gc-documentation" itemscope="" itemtype="http://schema.org/Article">
<a name="top"></a>
+<a name="download"></a>
<div id="body-content">
-<div class="fullpage" >
+<div class="fullpage">
<div id="jd-content">
<div class="jd-descr" itemprop="articleBody">
- <style>
+<style>
+body,html, #qv {background-color:#e9e9e9}
+
+#qv * { font-weight:bold;}
+
.fullpage>#footer,
#jd-content>.content-footer.wrap {
display:none;
}
-</style>
-<style>
-#footer {
- display: none;
-}
.content-footer {
display: none;
}
</style>
-
- <div style="height:20px"><!-- spacer to bump header down --></div>
- <div id="butterbar-wrapper">
- <div id="butterbar">
- <a href="http://googleblog.blogspot.com/" id="butterbar-message">
- The Android 5.0 SDK will be available on October 17th!
+ <div style="border-bottom: 1px solid #a5c43a; position: absolute; left: 0; right: 0; top: 0; z-index:99">
+ <div class="wrap" style="position: relative; height: 45px; padding: 0 20px;">
+ <a href="/index.html" style="position:absolute;top:8px">
+ <img src="/assets/images/dac_logo.png" srcset="/assets/images/dac_logo@2x.png 2x" width="123" height="25" alt="Android Developers home page">
</a>
</div>
</div>
- <div class="landing-rest-of-page">
- <div class="landing-section" style="padding-top:30px">
- <div class="wrap">
- <div class="landing-section-header">
+
+
+
+
+
+
+
+
+
+
+
+ <div class="landing-rest-of-page" style="position:relative;">
+
+
+
+
+
+
+
+
+ <div class="wrap" id="tos" style="display:none;padding-top:90px">
+
+ <p class="sdk-terms-intro">Before downloading the Android Preview system image,
+ you must agree to the following terms and conditions.</p>
+
+ <h2 class="norule">Terms and Conditions</h2>
+ <div class="sdk-terms" onfocus="this.blur()" style="width:100%">
+This is the Android SDK Preview License Agreement (the “License Agreement”).
+
+1. Introduction
+
+1.1 The Android SDK Preview (referred to in the License Agreement as the “Preview” and specifically including the Android system files, packaged APIs, and Preview library files, if and when they are made available) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the Preview.
+
+1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL: http://source.android.com/, as updated from time to time.
+
+1.3 "Google" means Google Inc., a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.
+
+2. Accepting the License Agreement
+
+2.1 In order to use the Preview, you must first agree to the License Agreement. You may not use the Preview if you do not accept the License Agreement.
+
+2.2 By clicking to accept and/or using the Preview, you hereby agree to the terms of the License Agreement.
+
+2.3 You may not use the Preview and may not accept the License Agreement if you are a person barred from receiving the Preview under the laws of the United States or other countries including the country in which you are resident or from which you use the Preview.
+
+2.4 If you will use the Preview internally within your company or organization you agree to be bound by the License Agreement on behalf of your employer or other entity, and you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the Preview on behalf of your employer or other entity.
+
+3. Preview License from Google
+
+3.1 Subject to the terms of the License Agreement, Google grants you a royalty-free, non-assignable, non-exclusive, non-sublicensable, limited, revocable license to use the Preview, personally or internally within your company or organization, solely to develop applications to run on the Android platform.
+
+3.2 You agree that Google or third parties owns all legal right, title and interest in and to the Preview, including any Intellectual Property Rights that subsist in the Preview. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you.
+
+3.3 You may not use the Preview for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not: (a) copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the Preview or any part of the Preview; or (b) load any part of the Preview onto a mobile handset or any other hardware device except a personal computer, combine any part of the Preview with other software, or distribute any software or device incorporating a part of the Preview.
+
+3.4 You agree that you will not take any actions that may cause or result in the fragmentation of Android, including but not limited to distributing, participating in the creation of, or promoting in any way a software development kit derived from the Preview.
+
+3.5 Use, reproduction and distribution of components of the Preview licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. You agree to remain a licensee in good standing in regard to such open source software licenses under all the rights granted and to refrain from any actions that may terminate, suspend, or breach such rights.
+
+3.6 You agree that the form and nature of the Preview that Google provides may change without prior notice to you and that future versions of the Preview may be incompatible with applications developed on previous versions of the Preview. You agree that Google may stop (permanently or temporarily) providing the Preview (or any features within the Preview) to you or to users generally at Google's sole discretion, without prior notice to you.
+
+3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features.
+
+3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the Preview.
+
+4. Use of the Preview by You
+
+4.1 Google agrees that nothing in the License Agreement gives Google any right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the Preview, including any intellectual property rights that subsist in those applications.
+
+4.2 You agree to use the Preview and write applications only for purposes that are permitted by (a) the License Agreement, and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries).
+
+4.3 You agree that if you use the Preview to develop applications, you will protect the privacy and legal rights of users. If users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If users provide you with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, each user has given you permission to do so.
+
+4.4 You agree that you will not engage in any activity with the Preview, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of Google or any third party.
+
+4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so.
+
+4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.
+
+4.7 The Preview is in development, and your testing and feedback are an important part of the development process. By using the Preview, you acknowledge that implementation of some features are still under development and that you should not rely on the Preview having the full functionality of a stable release. You agree not to publicly distribute or ship any application using this Preview as this Preview will no longer be supported after the official Android SDK is released.
+
+5. Your Developer Credentials
+
+5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.
+
+6. Privacy and Information
+
+6.1 In order to continually innovate and improve the Preview, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the Preview are being used and how they are being used. Before any of this information is collected, the Preview will notify you and seek your consent. If you withhold consent, the information will not be collected.
+
+6.2 The data collected is examined in the aggregate to improve the Preview and is maintained in accordance with Google's Privacy Policy located at http://www.google.com/policies/privacy/.
+
+7. Third Party Applications
+
+7.1 If you use the Preview to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources.
+
+7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners.
+
+7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party.
+
+8. Using Google APIs
+
+8.1 Google APIs
+
+8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service.
+
+8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.
+
+9. Terminating the License Agreement
+
+9.1 the License Agreement will continue to apply until terminated by either you or Google as set out below.
+
+9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the Preview and any relevant developer credentials.
+
+9.3 Google may at any time, terminate the License Agreement, with or without cause, upon notice to you.
+
+9.4 The License Agreement will automatically terminate without notice or other action upon the earlier of:
+(A) when Google ceases to provide the Preview or certain parts of the Preview to users in the country in which you are resident or from which you use the service; and
+(B) Google issues a final release version of the Android SDK.
+
+9.5 When the License Agreement is terminated, the license granted to you in the License Agreement will terminate, you will immediately cease all use of the Preview, and the provisions of paragraphs 10, 11, 12 and 14 shall survive indefinitely.
+
+10. DISCLAIMERS
+
+10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE PREVIEW IS AT YOUR SOLE RISK AND THAT THE PREVIEW IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE.
+
+10.2 YOUR USE OF THE PREVIEW AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE PREVIEW IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. WITHOUT LIMITING THE FOREGOING, YOU UNDERSTAND THAT THE PREVIEW IS NOT A STABLE RELEASE AND MAY CONTAIN ERRORS, DEFECTS AND SECURITY VULNERABILITIES THAT CAN RESULT IN SIGNIFICANT DAMAGE, INCLUDING THE COMPLETE, IRRECOVERABLE LOSS OF USE OF YOUR COMPUTER SYSTEM OR OTHER DEVICE.
+
+10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+
+11. LIMITATION OF LIABILITY
+
+11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.
+
+12. Indemnification
+
+12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys’ fees) arising out of or accruing from (a) your use of the Preview, (b) any application you develop on the Preview that infringes any Intellectual Property Rights of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you of the License Agreement.
+
+13. Changes to the License Agreement
+
+13.1 Google may make changes to the License Agreement as it distributes new versions of the Preview. When these changes are made, Google will make a new version of the License Agreement available on the website where the Preview is made available.
+
+14. General Legal Terms
+
+14.1 the License Agreement constitutes the whole legal agreement between you and Google and governs your use of the Preview (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the Preview.
+
+14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google.
+
+14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable.
+
+14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement.
+
+14.5 EXPORT RESTRICTIONS. THE PREVIEW IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE PREVIEW. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE.
+
+14.6 The License Agreement may not be assigned or transferred by you without the prior written approval of Google, and any attempted assignment without such approval will be void. You shall not delegate your responsibilities or obligations under the License Agreement without the prior written approval of Google.
+
+14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction.
+ </div><!-- sdk terms -->
+
+
+
+ <div id="sdk-terms-form">
+ <p>
+ <input id="agree" type="checkbox" name="agree" value="1" onclick="onAgreeChecked()" />
+ <label id="agreeLabel" for="agree">I have read and agree with the above terms and conditions</label>
+ </p>
+ <p><a href="" class="button disabled" id="downloadForRealz" onclick="return onDownloadForRealz(this);"></a></p>
+ </div>
+
+
+ </div><!-- end TOS -->
+
+
+
+
+
+
+
+ <div class="landing-section" id="landing-wrapper" style="padding:55px 10px 0">
+ <div class="landing-section-header" style="margin:0">
<div class="landing-h1">Android L Developer Preview</div>
- <div class="landing-subhead">
- Get an early look at the next release and get your apps ready when the
- platform officially launches.
- </div>
-
- <img src="/preview/images/l-dev-prev.png" style=" margin:0px 0 0 40px" width="860px"/>
- <div class="col-6" style="margin-left:660px; margin-top:-105px">
- <a href="/preview/setup-sdk.html" class="landing-button landing-primary" style="position:absolute;z-index:100;float:right;margin-top: 0px;">Get Started</a><!--
- <p>Set up your environment and check out all the docs to get up and running.</p>-->
-
-
+ <div class="landing-subhead" style="padding-bottom:40px">
+ Final APIs now available!
</div>
</div>
+ <div class="wrap" style="padding:20px; position:relative">
+
+ <img src="/images/home/l-hero_2x.png"
+ srcset="/images/home/l-hero.png 1x, /images/home/l-hero_2x.png 2x"
+ style=" margin:-5px -30px 0 0;float:right" alt="" width="510">
+
+ <a href="/about/versions/android-5.0.html" class="landing-button landing-primary"
+ style="position:absolute;z-index:100;right:215px;top:375px">Android 5.0 API Overview</a>
+
+ <div style="width:440px">
+<p>Android 5.0 (Lollipop) is almost here and users will begin receiving
+device updates in November. To help you prepare, the Android 5.0 SDK is now available
+with final APIs.</p>
+
+<p>Since the L Developer Preview began, various APIs and behaviors have changed,
+so if you've been using the Preview SDK
+you should update now to test your apps and take advantage of new features.</p>
+
+
+ <p>To get the latest Android 5.0 SDK:</p>
+ <ol>
+ <li>Start the <a href="/tools/help/sdk-manager.html">Android SDK Manager</a>.</li>
+ <li>In the <b>Tools</b> section, select the latest <b>SDK Tools</b>,
+ <b>SDK Platform-tools</b>, and <b>SDK Build-tools</b>.</li>
+ <!-- Android L not yet showing up in Android SDK Manager... -->
+ <li>Select everything under the <b>Android 5.0</b> section, then
+ click <b>Install packages...</b></li>
+ <li>Accept the licensing agreement for the packages, then click
+ <b>Install</b>.</li>
+ <li>If you previously installed the Android L Preview SDK, select all those
+ packages in the SDK Manager and click <strong>Delete packages</strong>.
+ </ol>
+ <p>Now you're ready to develop and test on Android 5.0 with your normal workflow
+ and begin publishing app updates to Google Play.
+ </div>
+
+ <h2 id="Start" class="norule" style="margin:60px 0 0 0">Get Started on Android 5.0</h2>
</div> <!-- end .wrap -->
+
+
+
+ <div class="wrap" style="background-color:#fff;padding:20px;position:relative">
+
+ <div id="qv-wrapper">
+ <div id="qv">
+ <h2>More about Android 5.0</h2>
+ <ul>
+ <li><a href="http://android-developers.blogspot.com/">Android 5.0 announcement</a></li>
+ <li><a href="/about/versions/android-5.0.html">Android 5.0 API Overview</a></li>
+ <li><a href="/sdk/api_diff/21/changes.html">Android 5.0 API Diff Report</a></li>
+ <li><a href="/samples/new/index.html">Android 5.0 API Samples</a></li>
+ </ul>
+ </div>
+ </div>
+
+ <p>Now that Android 5.0 APIs are final:</p>
+ <ul>
+ <li>The API level for Android 5.0 is 21, so be sure to update your
+ app's manifest file to set <a href="/guide/topics/manifest/uses-sdk-element.html#target"
+ ><code>targetSdkVersion</code></a> to
+ <code>"21"</code> when you begin testing:
+ <pre><uses-sdk android:targetSdkVersion="21" ... /></pre>
+ </li>
+ <li>Google Play now accepts APKs with <a
+ href="/guide/topics/manifest/uses-sdk-element.html#min"><code>minSdkVersion</code></a> or
+ <a href="/guide/topics/manifest/uses-sdk-element.html#target"
+ ><code>targetSdkVersion</code></a> set
+ to <code>"21"</code>, so you can upload your updated apps today.</li>
+ </ul>
+
+ <p>Although the APIs for Android 5.0 are now final, the system image for end-users
+ is not available yet. So the following preview system images are available for you to
+ test your apps on a Nexus 5 or Nexus 7. These are non-final
+ builds and their use is governed by the <a href="/preview/license.html">Android L
+ Preview License Agreement</a>.</p>
+
+ <table >
+ <tbody><tr>
+ <th scope="col">Device</th>
+ <th scope="col">Download</th>
+ <th scope="col">Checksum</th>
+ </tr>
+ <tr id="hammerhead">
+ <td>Nexus 5 (GSM/LTE) <br>"hammerhead"</td>
+ <td><a href="#download" onclick="onDownload(this)">hammerhead-lpx13d-preview-f7596f51.tgz</a></td>
+ <td>MD5: <code>8d92596aa038203fc6c8ff40a0e8b560</code>
+ <br>SHA-1: <code>f7596f518a8a429f03de5bf8152fa90e738228dd</code></td>
+ </tr>
+ <tr id="razor">
+ <td>Nexus 7 [2013] (Wi-Fi) <br>"razor"</td>
+ <td><a href="#download" onclick="onDownload(this)">razor-lpx13d-preview-ae4f461f.tgz</a></td>
+ <td>MD5: <code>b2c567518d203b487cb2ac28d25b0a54</code>
+ <br><nobr>SHA-1: <code>ae4f461fabae5ff92eae0c252c34bb26d877e528</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </li>
+
+ <p>For details about how to flash the system image to your device, see the
+ <a href="https://developers.google.com/android/nexus/images#instructions">flashing
+ instructions</a>.</p>
+
+ <p>If you want to uninstall the preview system image and flash your device to factory
+ specifications, download the appropriate image from
+ <a href="http://developers.google.com/android/nexus/images">Factory Images for Nexus
+ Devices</a> and follow the instructions on that page.</p>
+
+ <p class="note"><strong>Note:</strong> When the final Android 5.0 system image becomes
+ available, it will be posted on the
+ <a href="http://developers.google.com/android/nexus/images">Factory Images for Nexus
+ Devices</a> page. To continue development (and receive future system updates),
+ you should update your device with that image as soon as possible.</p>
+
+ </div> <!-- end .wrap -->
+
+
+
+
+
+
+
+
+ <div class="wrap" style="padding:20px; position:relative">
+ <h2 id="Material" class="norule" style="margin:40px 0 0 0">Design with Material</h2>
+ </div>
+
+ <div class="wrap" style="background-color:#fff;padding:20px;position:relative">
+ <img src="images/material-layers.png" width="240"
+ style="position:absolute;right:20px;top:-50px">
+
+ <div id="qv-wrapper" style="margin-top:120px">
+ <div id="qv">
+
+ <h2>More about Material Design</h2>
+ <ul>
+ <li><a href="http://www.google.com/design/spec/material-design/introduction.html">Material
+ Design Spec</a></li>
+ <li><a href="/design/material/index.html">Android Material Design</a></li>
+ <li><a href="/training/material/index.html">Creating Apps with Material Design</a>
+ </ul>
+ </div>
+ </div>
+
+
+<p>Material design is a complete design philosophy for visual, motion, and interaction design
+across platforms and devices. The <a href=
+"http://www.google.com/design/spec/material-design/introduction.html">material design specification
+(preview)</a> provides all the details for designers.</p>
+
+
+ <p>To get started with Material design in your Android app, update
+ your <a href="/guide/topics/manifest/uses-sdk-element.html#target"
+ ><code>targetSdkVersion</code></a> to <code>"21"</code> and apply the new
+ <a href="/reference/android/R.style.html#Theme_Material"
+ ><code>Material</code></a> theme. For example, when creating
+ a <a href="/guide/topics/ui/themes.html">custom theme</a>
+ for your app, open your project's <code>res/values/styles.xml</code> file
+ and extend the <a href="/reference/android/R.style.html#Theme_Material"
+ ><code>Material</code></a> theme:</p>
+<pre>
+<resources>
+ <style name="AppTheme" parent="android:Theme.Material">
+ <!-- Customize the Material elements here -->
+ </style>
+</resources>
+</pre>
+<p>Then apply your custom theme to your application in the manifest file:</p>
+<pre>
+<application android:theme="@style/AppTheme">
+</pre>
+<p>Material design is more than just the UI theme, though. It's also about the way the app
+ behaves—how elements move and transform when the user interacts with them. So Android 5.0
+ and the <a href="/tools/support-library/features.html#v7">v7 support library</a> provide new
+ widgets and animation APIs that allow you to
+ build interaction patterns described in the
+ <a href="http://www.google.com/design/spec/material-design/introduction.html">Material design
+ specification</a>.</p>
+
+<p>All the Material design elements and interaction patterns provided by the UI styles and widgets
+are flexible, so you can adopt only what's appropriate for your app and retain a unique identity
+and experience for your product.</p>
+
+<p>And Material design on Android isn't just for Android 5.0. The
+ <a href="/tools/support-library/features.html#v7">v7 support library</a> has been significantly
+ updated in revision 21 to make many of the Material design elements available when
+ running on older versions of the platform.</p>
+
+<p>For many more details about how to implement the Material look and feel,
+ see <a href="/training/material/index.html">Creating Apps with Material
+ Design</a>.</p>
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ <div class="wrap" style="padding:20px; position:relative">
+ <h2 id="TV" class="norule" style="margin:40px 0 0 0">Build for Android TV</h2>
+ </div>
+
+ <div class="wrap" style="background-color:#fff;padding:20px;position:relative">
+ <img src="/tv/images/components.png" width="240"
+ style="position:absolute;right:20px;top:-50px">
+
+ <div id="qv-wrapper" style="margin-top:120px">
+ <div id="qv">
+
+ <h2>More about Android TV</h2>
+ <ul>
+ <li><a href="/design/tv/index.html">Android TV Design</a></li>
+ <li><a href="/training/tv/start/index.html">Building Apps for Android TV</a></li>
+ <li><a href="/training/tv/games/index.html">Building TV Games</a></li>
+ <li><a href="/training/tv/playback/index.html">Building TV Playback Apps</a></li>
+ <li><a href="/distribute/essentials/quality/tv.html">TV App Quality</a></li>
+ </ul>
+ </div>
+ </div>
+
+<p>Android 5.0 provides a new platform for users to experience your app on a big screen. The
+Android TV experience is centered around a simplified home screen that allows users to discover
+your app's content with personalized recommendations and voice search, or select your app to launch
+into your fullscreen experience.</p>
+
+
+<p>Making your app available on Android TV does not require that you build an entirely new app.
+Android TV is simply another form factor for the Android platform, so you can deliver the same APK
+that you provide for phones and tablets to TVs through Google Play. However, to make your app
+available on Android TV, you'll need to make some optimizations such as adding layouts
+for the big screen and adding support for remote control input. For more information about design
+guidelines, see <a href="/distribute/essentials/quality/tv.html">TV App Quality</a>.</p>
+
+<p class="note"><strong>Note:</strong> Google Play for Android TV will officially
+open for apps on November 3.</p>
+
+<p>Android TV is also great new opportunity for Android games. If you'd like to make your games
+available on Android TV, be sure to optimize the user experience for the big screen by following
+the recommendations in <a href="/training/tv/games/index.html">Building TV Games</a>.</p>
+
+
+ <p>To get started on Android TV, you need:</p>
+ <ul>
+ <li>The Android 5.0 SDK packages from the
+ <a href="/tools/help/sdk-manager.html">Android SDK Manager</a>,
+ including the <strong>Android TV System Image</strong> so you can create an
+ Android TV emulator.</li>
+ <li>An activity that's launchable from the Android TV home screen. This requires that you
+ add the <a href="/reference/android/content/Intent.html#CATEGORY_LEANBACK_LAUNCHER"
+ ><code>LEANBACK_LAUNCHER</code></a> category to one of your activities. For example:
+<pre>
+<activity ... >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
+ </intent-filter>
+</activity>
+</pre>
+ </li>
+
+ <li>For a set of default styles that optimize your UI for the TV's
+ <em>leanback user experience</em>,
+ you should also apply the <a
+ href="/reference/android/support/v17/leanback/R.style.html#Theme_Leanback"
+ ><code>Leanback</code></a> theme to your activity:
+<pre>
+<activity android:theme="@style/Theme.Leanback" ... >
+</pre>
+ </li>
+
+ </ul>
+ <p>You should also take advantage of the <a
+ href="/tools/support-library/features.html#v17-leanback">v17 leanback library</a>, which
+ provides the <a href="/reference/android/support/v17/leanback/R.style.html#Theme_Leanback"
+ ><code>Leanback</code></a> theme shown above, plus several widgets designed to
+ make your UI beautiful and easy to navigate on the big screen, such as a widget that creates
+ a set of large horizontal card views.</p>
+
+ <p>For more information about setting up a project for your TV app, building
+ TV layouts, and handling controller input,
+ see <a href="/training/tv/start/index.html">Building
+ TV Apps</a>.</p>
+ </div>
+
+
+
+
+
+
+
+
</div> <!-- end .landing-section -->
-<div class="landing-section landing-gray-background" style="margin-top:-135px; padding-bottom:20px">
- <div class="wrap">
- <div class="cols">
-<div class="landing-body" style="margin-top:-80px" >
- <div class="landing-breakout cols">
- <div class="col-4">
- <p>A New UI Design</p>
- <p class="landing-small">
- Create a consistent experience across mobile and the web with
- <b>material design</b>, the new Google-wide standard.
- </p>
- <p class="landing-small">
- <a href="/preview/material/index.html">Learn about material</a>
- </p>
- </div>
- <div class="col-4">
- <p>A New Runtime</p>
- <p class="landing-small">
- Test your apps and get them ready for <b>ART</b> (<b>A</b>ndroid <b>R</b>un<b>t</b>ime),
- the default runtime in the next release.
- </p>
- <p class="landing-small">
- <a href="/preview/api-overview.html#ART">Learn about ART</a>
- </p>
- </div>
- <div class="col-4">
- <p style="width:230px">Enhanced Notifications</p>
- <p class="landing-small">
- Get control over where notifications appear,
- how they look, and how they sync to non-handheld devices.
- </p>
- <p class="landing-small">
- <a href="/preview/api-overview.html#UI">Learn about notifications</a>
- </p>
- </div>
- <div class="col-4">
- <p>Increased Efficiency</p>
- <p class="landing-small">
- <b>Project Volta</b> is our effort to make the platform energy efficient and
- to give you more control over resource usage.
- </p>
- <p class="landing-small">
- <a href="/preview/api-overview.html#Power">Learn about Project Volta</a>
- </p>
- </div>
- </div>
- <p style="margin-left:20px">See the <a href="/preview/api-overview.html">API overview</a> for more information
- on the rest of the new and updated features.</p>
- </div>
- </div></div></div>
- <div class="landing-section">
- <div class="wrap">
- <div class="cols">
- <div class="landing-body">
- <div class="col-3-wide">
- <a target="_blank" href="https://code.google.com/p/android-developer-preview/">
- <img class="landing-social-image" src="/preview/images/bugs.png" alt="">
- </a>
- <div class="landing-social-copy">
- <p>Issue Tracker</p>
- <p class="landing-small">
- Let us know when you encounter problems, so we can fix them and make
- the platform better for you and your users.
- </p><p class="landing-small">
- <a href="https://code.google.com/p/android-developer-preview/">
- Report Issues</a>
- </p>
- <p></p>
- </div>
- </div>
- <div class="col-3-wide">
- <a target="_blank" href="http://g.co/androidldevpreview">
- <img class="landing-social-image" src="//www.google.com/images/icons/product/gplus-128.png" alt="">
- </a>
- <div class="landing-social-copy">
- <p>Google+ </p>
- <p class="landing-small">
- Join the community of Android developers testing out the L Developer Preview and
- share your thoughts and experiences.
- </p><p class="landing-small">
- <a href="http://g.co/androidldevpreview">
- Discuss on Google+</a>
- </p>
- </div>
- </div>
- <div class="col-3-wide">
- <a target="_blank" href="/preview/support.html">
- <img class="landing-social-image" src="/preview/images/updates.png" alt="">
- </a>
- <div class="landing-social-copy">
- <p>Support and Updates</p>
- <p class="landing-small">
- Updates to the L Developer Preview are delivered
- in the Android SDK Manager. Check back periodically
- for news about the changes.
- </p>
- <p class="landing-small">
- <a href="/preview/support.html">Get Support</a>
- </p>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="content-footer wrap" itemscope="" itemtype="http://schema.org/SiteNavigationElement">
- <div class="layout-content-col col-16" style="padding-top:4px">
- <style>#___plusone_0 {float:right !important;}</style>
- <div class="g-plusone" data-size="medium"></div>
- </div>
+
+
+
+ <!-- spacer -->
+ <div class="wrap" style="padding:20px; position:relative">
+ <p> </p>
</div>
- <div id="footer" class="wrap" style="width:940px;position:relative;top:-35px;z-index:-1">
+
+
+
+ <div id="footer" class="wrap" style="width:940px;position:relative;">
<div id="copyright">
Except as noted, this content is
licensed under <a href="http://creativecommons.org/licenses/by/2.5/">
Creative Commons Attribution 2.5</a>. For details and
- restrictions, see the <a href="/license.html">Content
+ restrictions, see the <a href="https://developer.android.com/license.html">Content
License</a>.
</div>
</div>
</div> <!-- end landing-body-content -->
- <script>
- $("a.landing-down-arrow").on("click", function(e) {
- $("body").animate({
- scrollTop: $(".preview-hero").height() + 76
- }, 1000, "easeOutQuint");
- e.preventDefault();
- });
- </script>
</div>
- <div class="content-footer wrap"
- itemscope itemtype="http://schema.org/SiteNavigationElement">
+ <div class="content-footer wrap" itemscope=""
+ itemtype="http://schema.org/SiteNavigationElement">
<div class="paging-links layout-content-col col-10">
</div>
- <div class="layout-content-col plus-container col-2" >
- <style>#___plusone_0 {float:right !important;}</style>
- <div class="g-plusone" data-size="medium"></div>
-
- </div>
</div>
@@ -348,7 +609,7 @@
Except as noted, this content is
licensed under <a href="http://creativecommons.org/licenses/by/2.5/">
Creative Commons Attribution 2.5</a>. For details and
- restrictions, see the <a href="/license.html">Content
+ restrictions, see the <a href="https://developer.android.com/license.html">Content
License</a>.
</div>
@@ -359,14 +620,50 @@
</div> <!-- end body-content -->
+<script>
+ var urlRoot = "http://storage.googleapis.com/androiddevelopers/finalpreview/";
+ function onDownload(link) {
+
+ $("#downloadForRealz").html("Download " + $(link).text());
+ $("#downloadForRealz").attr('href', urlRoot + $(link).text());
+
+ $("#tos").show();
+ $("#landing-wrapper").hide();
+
+ return true;
+ }
+ function onAgreeChecked() {
+ /* verify that the TOS is agreed */
+ if ($("input#agree").is(":checked")) {
+ /* reveal the download button */
+ $("a#downloadForRealz").removeClass('disabled');
+ } else {
+ $("a#downloadForRealz").addClass('disabled');
+ }
+ }
- <script src="https://developer.android.com/ytblogger_lists_unified.js" type="text/javascript"></script>
- <script src="/jd_lists_unified.js" type="text/javascript"></script>
- <script src="/jd_extras.js" type="text/javascript"></script>
- <script src="/jd_collections.js" type="text/javascript"></script>
- <script src="/jd_tag_helpers.js" type="text/javascript"></script>
+ function onDownloadForRealz(link) {
+ if ($("input#agree").is(':checked')) {
+ $("#tos").fadeOut('fast');
+ $("#landing-wrapper").fadeIn('fast');
+ ga('send', 'event', 'L Preview', 'System Image', $("#downloadForRealz").html());
+ location.hash = "";
+ // reset the checkbox for future downloads
+ $("#agree").trigger('click');
+ $("a#downloadForRealz").addClass('disabled');
+ return true;
+ } else {
+ $("label#agreeLabel").parent().stop().animate({color: "#258AAF"}, 200,
+ function() {$("label#agreeLabel").parent().stop().animate({color: "#222"}, 200)}
+ );
+ return false;
+ }
+ }
+
+</script>
+
</body>
-</html>
+</html>
\ No newline at end of file
diff --git a/docs/html/preview/material/animations.jd b/docs/html/preview/material/animations.jd
deleted file mode 100644
index 353f0f2..0000000
--- a/docs/html/preview/material/animations.jd
+++ /dev/null
@@ -1,441 +0,0 @@
-page.title=Animations
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>In this document</h2>
-<ol>
- <li><a href="#touch">Touch Feedback</a></li>
- <li><a href="#reveal">Reveal Effect</a></li>
- <li><a href="#transitions">Activity Transitions</a></li>
- <li><a href="#curvedmotion">Curved Motion</a></li>
- <li><a href="#viewstate">Animating View State Changes</a></li>
- <li><a href="#drawabletint">Drawable Tinting</a></li>
- <li><a href="#colorextract">Extracting Colors from an Image</a></li>
-</ol>
-</div>
-</div>
-
-<p>Animations in material design give users feedback on their actions and provide visual
-continuity as users interact with your app. The material theme provides some default animations
-for buttons and activity transitions, and the Android L Developer Preview provides additional
-APIs that let you customize these animations and create new ones:</p>
-
-<ul>
-<li>Touch feedback</li>
-<li>Reveal effect</li>
-<li>Activity transitions</li>
-<li>Curved motion</li>
-<li>View state changes</li>
-</ul>
-
-
-<h2 id="touch">Touch Feedback</h2>
-
-<p>The default touch feedback animations for buttons use the new
-<code>RippleDrawable</code> class, which transitions between different states with a ripple
-effect.</p>
-
-<p>In most cases, this functionality should be applied in your view XML by specifying the
-background as <code>?android:attr/selectableItemBackground</code> for a bounded ripple or
-<code>?android:attr/selectableItemBackgroundBorderless</code> for a ripple that extends beyond
-the view bounds. You can also create a <code>RippleDrawable</code> and set
-it as the background of your view. Alternatively, you can define a <code>RippleDrawable</code>
-as an XML resource using the <code>ripple</code> element. The
-Android L Developer Preview animates the selection color with a ripple effect.</p>
-
-<p>You can assign a color to <code>RippleDrawable</code> objects. To change the default touch
-feedback color, use the theme's <code>android:colorControlHighlight</code> attribute.</p>
-
-
-<h2 id="reveal">Reveal Effect</h2>
-
-<p>The <code>ViewAnimationUtils.createCircularReveal</code> method enables you to animate a
-clipping circle to reveal or hide a view.</p>
-
-<p>To reveal a previously invisible view using this effect:</p>
-
-<pre>
-// previously invisible view
-View myView = findViewById(R.id.my_view);
-
-// get the center for the clipping circle
-int cx = (myView.getLeft() + myView.getRight()) / 2;
-int cy = (myView.getTop() + myView.getBottom()) / 2;
-
-// get the final radius for the clipping circle
-int finalRadius = myView.getWidth();
-
-// create and start the animator for this view
-// (the start radius is zero)
-ValueAnimator anim =
- ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius);
-anim.start();
-</pre>
-
-<p>To hide a previously visible view using this effect:</p>
-
-<pre>
-// previously visible view
-final View myView = findViewById(R.id.my_view);
-
-// get the center for the clipping circle
-int cx = (myView.getLeft() + myView.getRight()) / 2;
-int cy = (myView.getTop() + myView.getBottom()) / 2;
-
-// get the initial radius for the clipping circle
-int initialRadius = myView.getWidth();
-
-// create the animation (the final radius is zero)
-ValueAnimator anim =
- ViewAnimationUtils.createCircularReveal(myView, cx, cy, initialRadius, 0);
-
-// make the view invisible when the animation is done
-anim.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- myView.setVisibility(View.INVISIBLE);
- }
-});
-
-// start the animation
-anim.start();
-</pre>
-
-
-<h2 id="transitions">Activity Transitions</h2>
-
-<p>You can specify custom animations for enter and exit transitions and for
-transitions of shared elements between activities.</p>
-
-<ul>
-<li>An <strong>enter</strong> transition determines how views in an activity enter the scene.
-For example, in the <em>explode</em> enter transition, the views enter the scene from the outside
-and fly in towards the center of the screen.</li>
-
-<li>An <strong>exit</strong> transition determines how views in an activity exit the scene. For
- example, in the <em>explode</em> exit transition, the views exit the scene away from the
-center.</li>
-
-<li>A <strong>shared elements</strong> transition determines how views that are shared between
-two activities transition between these activities. For example, if two activities have the same
-image in different positions and sizes, the <em>moveImage</em> shared element transition
-translates and scales the image smoothly between these activities.</li>
-</ul>
-
-<p>The Android L Developer Preview supports these enter and exit transitions:</p>
-
-<ul>
-<li><em>explode</em> - Moves views in or out from the center of the scene.</li>
-<li><em>slide</em> - Moves views in or out from one of the edges of the scene.</li>
-<li><em>fade</em> - Moves views in or out of the scene.</li>
-</ul>
-
-<p>Any transition that extends the <code>android.transition.Visibility</code> class is supported
-as an enter or exit transition. For more information, see the API reference for the
-<code>android.transition.Transition</code> class.</p>
-
-<p>The Android L Developer Preview also supports these shared elements transitions:</p>
-
-<ul>
-<li><em>changeBounds</em> - Animates the changes in layout bounds of target views.</li>
-<li><em>changeClipBounds</em> - Animates the changes in clip bounds of target views.</li>
-<li><em>changeTransform</em> - Animates the changes in scale and rotation of target views.</li>
-<li><em>moveImage</em> - Animates changes in size and scale type for an image view.</li>
-</ul>
-
-<p>When you enable activity transitions in your app, the default cross-fading transition is
-activated between the entering and exiting activities.</p>
-
-<img src="/preview/material/images/SceneTransition.png" alt=""
- id="figure1" style="width:600px;margin-top:20px"/>
-<p class="img-caption">
- <strong>Figure 1</strong> - A scene transition with one shared element.
-</p>
-
-<h3>Specify custom transitions</h3>
-
-<p>First, enable window content transitions with the <code>android:windowContentTransitions</code>
-attribute when you define a style that inherits from the material theme. You can also specify
-enter, exit, and shared element transitions in your style definition:</p>
-
-<pre>
-<style name="BaseAppTheme" parent="android:Theme.Material">
- <!-- enable window content transitions -->
- <item name="android:windowContentTransitions">true</item>
-
- <!-- specify enter and exit transitions -->
- <item name="android:windowEnterTransition">@transition/explode</item>
- <item name="android:windowExitTransition">@transition/explode</item>
-
- <!-- specify shared element transitions -->
- <item name="android:windowSharedElementEnterTransition">
- @transition/move_image</item>
- <item name="android:windowSharedElementExitTransition">
- @transition/move_image</item>
-</style>
-</pre>
-
-<p>The <code>move_image</code> transition in this example is defined as follows:</p>
-
-<pre>
-<!-- res/transition/move_image.xml -->
-<!-- (see also Shared Transitions below) -->
-<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
- <moveImage/>
-</transitionSet>
-</pre>
-
-<p>The <code>moveImage</code> element corresponds to the <code>android.transition.MoveImage</code>
-class. For more information, see the API reference for <code>android.transition.Transition</code>.
-</p>
-
-<p>To enable window content transitions in your code instead, call the
-<code>Window.requestFeature</code> method:</p>
-
-<pre>
-// inside your activity (if you did not enable transitions in your theme)
-getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
-
-// set an exit transition
-getWindow().setExitTransition(new Explode());
-</pre>
-
-<p>To specify transitions in your code, call these methods with a <code>Transition</code>
-object:</p>
-
-<ul>
- <li><code>Window.setEnterTransition</code></li>
- <li><code>Window.setExitTransition</code></li>
- <li><code>Window.setSharedElementEnterTransition</code></li>
- <li><code>Window.setSharedElementExitTransition</code></li>
-</ul>
-
-<p>The <code>setExitTransition</code> and <code>setSharedElementExitTransition</code> methods
-define the exit transition for the calling activity. The <code>setEnterTransition</code> and
-<code>setSharedElementEnterTransition</code> methods define the enter transition for the called
-activity.</p>
-
-<p>To get the full effect of a transition, you must enable window content transitions on both the
-calling and called activities. Otherwise, the calling activity will start the exit transition,
-but then you'll see a window transition (like scale or fade).</p>
-
-<p>To start an enter transition as soon as possible, use the
-<code>Window.setAllowEnterTransitionOverlap</code> method on the called activity. This lets you
-have more dramatic enter transitions. The same applies for the calling activity and exit
-transitions with the <code>Window.setAllowExitTransitionOverlap</code> method.</p>
-
-<h3>Start an activity using transitions</h3>
-
-<p>If you enable transitions and set an exit transition for an activity, the transition is activated
-when you launch another activity with the <code>startActivity</code> method. If you have set an
-enter transition for the second activity, the transition is also activated when the activity
-starts.</p>
-
-<h3>Shared elements transitions</h3>
-
-<p>To make a screen transition animation between two activities that have a shared element:</p>
-
-<ol>
-<li>Enable window content transitions in your style.</li>
-<li>Specify a shared elements transition in your style.</li>
-<li>Define your transition as an XML resource.</li>
-<li>Assign a common name to the shared elements in both layouts with the
- <code>android:viewName</code> attribute.</li>
-<li>Use the <code>ActivityOptions.makeSceneTransitionAnimation</code> method.</li>
-</ol>
-
-<pre>
-// get the element that receives the click event
-final View imgContainerView = findViewById(R.id.img_container);
-
-// get the common element for the transition in this activity
-final View androidRobotView = findViewById(R.id.image_small);
-
-// define a click listener
-imgContainerView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- Intent intent = new Intent(this, Activity2.class);
- // create the transition animation - the images in the layouts
- // of both activities are defined with android:viewName="robot"
- ActivityOptions options = ActivityOptions
- .makeSceneTransitionAnimation(this, androidRobotView, "robot");
- // start the new activity
- startActivity(intent, options.toBundle());
- }
-});
-</pre>
-
-<p>For shared dynamic views that you generate in your code, use the <code>View.setViewName</code>
-method to specify a common element name in both activities.</p>
-
-<p>To reverse the scene transition animation when you finish the second activity, call the
-<code>Activity.finishAfterTransition</code> method instead of <code>Activity.finish</code>.</p>
-
-<h3>Multiple shared elements</h3>
-
-<p>To make a scene transition animation between two activities that have more than one shared
-element, define the shared elements in both layouts with the <code>android:viewName</code>
-attribute (or use the <code>View.setViewName</code> in both activities), and create an
-<code>ActivityOptions</code> object as follows:</p>
-
-<pre>
-ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
- Pair.create(view1, "agreedName1"),
- Pair.create(view2, "agreedName2"));
-</pre>
-
-
-<h2 id="curvedmotion">Curved Motion</h2>
-
-<p>Animations in material design rely on curves for time interpolation and spatial movement
-patterns. The Android L Developer Preview provides new APIs that enable you to define custom
-timing curves and curved motion patterns for animations.</p>
-
-<p>The <code>PathInterpolator</code> class is a new interpolator based on a Bézier curve or a
-<code>Path</code> object. This interpolator specifies a motion curve in a 1x1 square, with anchor
-points at (0,0) and (1,1) and control points as specified using the constructor arguments. You can
-also define a <code>PathInterpolator</code> as an XML resource:</p>
-
-<pre>
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:controlX1="0.4"
- android:controlY1="0"
- android:controlX2="1"
- android:controlY2="1"/>
-</pre>
-
-<p>The Android L Developer Preview provides XML resources for the three basic curves in the
-material design specification:</p>
-
-<ul>
- <li><code>@interpolator/fast_out_linear_in.xml</code></li>
- <li><code>@interpolator/fast_out_slow_in.xml</code></li>
- <li><code>@interpolator/linear_out_slow_in.xml</code></li>
-</ul>
-
-<p>You can pass a <code>PathInterpolator</code> object to the
-<code>Animator.setInterpolation</code> method.</p>
-
-<p>The <code>ObjectAnimator</code> class has new constructors that enable you to animate
-coordinates along a path using two or more properties at once. For example, the following animator
-uses a <code>Path</code> object to animate the X and Y properties of a view:</p>
-
-<pre>
-ObjectAnimator mAnimator;
-mAnimator = ObjectAnimator.ofFloat(view, View.X, View.Y, path);
-...
-mAnimator.start();
-</pre>
-
-
-<h2 id="viewstate">Animating View State Changes</h2>
-
-<p>The new <code>StateListAnimator</code> class lets you define animators that run when the state
-of a view changes. The following example shows how to define an <code>StateListAnimator</code> as
-an XML resource:</p>
-
-<pre>
-<!-- animate the translationZ property of a view when pressed -->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_pressed="true">
- <set>
- <objectAnimator android:propertyName="translationZ"
- android:duration="100"
- android:valueTo="2"
- android:valueType="floatType"/>
- <!-- you could have other objectAnimator elements
- here for "x" and "y", or other properties -->
- </set>
- </item>
- <item android:state_enabled="true"
- android:state_pressed="false"
- android:state_focused="true">
- <set>
- <objectAnimator android:propertyName="translationZ"
- android:duration="100"
- android:valueTo="2"
- android:valueType="floatType"/>
- </set>
- </item>
-</selector>
-</pre>
-
-<p class="note"><strong>Note:</strong> There is a known issue in the L Developer Preview release
-that requires valueFrom values to be provided in StateListAnimator animations to get the correct
-behavior.</p>
-
-<p>The new <code>AnimatedStateListDrawable</code> class lets you create drawables that show
-animations between state changes of the associated view. Some of the system widgets in the
-Android L Developer Preview use these animations by default. The following example shows how
-to define an <code>AnimatedStateListDrawable</code> as an XML resource:</p>
-
-<pre>
-<!-- res/drawable/myanimstatedrawable.xml -->
-<animated-selector
- xmlns:android="http://schemas.android.com/apk/res/android">
-
- <!-- provide a different drawable for each state-->
- <item android:id="@+id/pressed" android:drawable="@drawable/drawableP"
- android:state_pressed="true"/>
- <item android:id="@+id/focused" android:drawable="@drawable/drawableF"
- android:state_focused="true"/>
- <item android:id="@id/default"
- android:drawable="@drawable/drawableD"/>
-
- <!-- specify a transition -->
- <transition android:fromId="@+id/default" android:toId="@+id/pressed">
- <animation-list>
- <item android:duration="15" android:drawable="@drawable/dt1"/>
- <item android:duration="15" android:drawable="@drawable/dt2"/>
- ...
- </animation-list>
- </transition>
- ...
-</animated-selector>
-</pre>
-
-
-<h2 id="drawabletint">Drawable Tinting</h2>
-
-<p>The Android L Developer Preview enables you to define bitmaps or nine-patches as alpha masks and
-to tint them using a color resource or a theme attribute that resolves to a color resource (for
-example, <code>?android:attr/colorPrimary</code>). You can create these assets only once and color them
-automatically to match your theme.</p>
-
-<p>To apply a tint to a bitmap, use the <code>setTint</code> method or the <code>android:tint</code>
-attribute for <code>BitmapDrawable</code> and <code>NinePatchDrawable</code>.</p>
-
-<p>The <code>setTint</code> method also lets you set the Porter-Duff mode used to blend the
-tint color for <code>NinePatchDrawable</code> and <code>BitmapDrawable</code> objects in your code.
-To set the tint mode in your layouts, use the <code>android:tintMode</code> attribute.</p>
-
-
-<h2 id="colorextract">Extracting Prominent Colors from an Image</h2>
-
-<p>The Android L Developer Preview Support Library includes the <code>Palette</code> class,
-which lets you extract prominent colors from an image. This class extracts the following
-prominent colors:</p>
-
-<ul>
-<li>Vibrant</li>
-<li>Vibrant dark</li>
-<li>Vibrant light</li>
-<li>Muted</li>
-<li>Muted dark</li>
-<li>Muted light</li>
-</ul>
-
-<p>To extract these colors, pass a <code>Bitmap</code> object to the
-<code>Palette.generate</code> static method in the background thread where you load your images.
-If you can't use that thread, call the <code>Palette.generateAsync</code> method instead and
-provide a listener.</p>
-
-<p>To retrieve the prominent colors from the image, use the getter methods in the
-<code>Palette</code> class, such as <code>Palette.getVibrantColor</code>.</p>
-
-<p>For more information, see the API reference for the
-<code>android.support.v7.graphics.Palette</code> class.</p>
\ No newline at end of file
diff --git a/docs/html/preview/material/compatibility.jd b/docs/html/preview/material/compatibility.jd
deleted file mode 100644
index b4d26a7..0000000
--- a/docs/html/preview/material/compatibility.jd
+++ /dev/null
@@ -1,82 +0,0 @@
-page.title=Compatibility
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>In this document</h2>
-<ol>
- <li><a href="#materialtheme">Material Theme</a></li>
- <li><a href="#layouts">Layouts</a></li>
- <li><a href="#widgets">UI Widgets</a></li>
- <li><a href="#animation">Animation APIs</a></li>
-</ol>
-</div>
-</div>
-
-<p>The new material design features (like the material theme and activity transitions) are only
-available in the Android L Developer Preview. However, you can design your apps to make use of
-these features when running on devices with the Android L Developer Preview and still be
-compatible with previous releases of Android.</p>
-
-
-<h2 id="materialtheme">Material Theme</h2>
-
-<p>The material theme is only available in the Android L Developer Preview. To configure your
-app to use the material theme on devices running the Android L Developer Preview and an older
-theme on devices running earlier versions of Android:</p>
-
-<ol>
-<li>Define a theme that inherits from an older theme (like Holo) in
-<code>res/values/styles.xml</code>.</li>
-<li>Define a theme with the same name that inherits from the material theme in
-<code>res/values-v21/styles.xml</code>.</li>
-<li>Set this theme as your app's theme in the manifest file.</li>
-</ol>
-
-<p class="note"><strong>Note:</strong> If you do not provide an alternative theme in this manner,
-your app will not run on earlier versions of Android.</p>
-
-
-<h2 id="layouts">Layouts</h2>
-
-<p>If the layouts that you design according to the material design guidelines do not use any
-of the new XML attributes from the Android L Developer Preview, they will work on previous
-versions of Android. Otherwise, you can provide alternative layouts. You can also provide
-alternative layouts to customize how your app looks on earlier versions of Android.</p>
-
-<p>Create your layout files for the Android L Developer Preview inside <code>res/layout-v21/</code>
-and your alternative layout files for earlier versions of Android inside <code>res/layout/</code>.
-Alternative layouts have the same file name.</p>
-
-<p>To avoid duplication of code, define your styles inside <code>res/values/</code> and modify the
-styles in <code>res/values-v21/</code> for the new APIs.</p>
-
-
-<h2 id="widgets">UI Widgets</h2>
-
-<p>The <code>RecyclerView</code> and <code>CardView</code> widgets are included in the Android L
-Developer Preview Support Library, so they are available in earlier versions of Android with
-these limitations:</p>
-
-<ul>
-<li><code>CardView</code> falls back to a programmatic shadow implementation using additional padding.</li>
-<li><code>CardView</code> does not clip its children views that intersect with rounded corners.</li>
-</ul>
-
-<p>These limitations do not apply to the Android L Developer Preview.</p>
-
-
-<h2 id="animation">Animation APIs</h2>
-
-<p>The following new APIs are only available in the Android L Developer Preview:</p>
-
-<ul>
-<li>Activity transitions</li>
-<li>Touch feedback</li>
-<li>Reveal animations</li>
-<li>Path-based animations</li>
-</ul>
-
-<p>To preserve compatibility with earlier versions of Android, check the system version at
-runtime before you invoke these APIs.</p>
\ No newline at end of file
diff --git a/docs/html/preview/material/get-started.jd b/docs/html/preview/material/get-started.jd
deleted file mode 100644
index 7d0625e..0000000
--- a/docs/html/preview/material/get-started.jd
+++ /dev/null
@@ -1,147 +0,0 @@
-page.title=Get Started
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>In this document</h2>
-<ol>
- <li><a href="#applytheme">Apply the Material Theme</a></li>
- <li><a href="#layouts">Design Your Layouts</a></li>
- <li><a href="#depth">Specify Elevation in Your Views</a></li>
- <li><a href="#widgets">Use the New UI Widgets</a></li>
- <li><a href="#animations">Customize Your Animations</a></li>
-</ol>
-</div>
-</div>
-
-<p>To create apps with material design:</p>
-
-<ol>
- <li style="margin-bottom:10px">
- Take a look at the <a href="http://www.google.com/design/spec">material design
- specification</a>.</li>
- <li style="margin-bottom:10px">
- Apply the material <strong>theme</strong> to your app.</li>
- <li style="margin-bottom:10px">
- Define additional <strong>styles</strong> to customize the material theme.</li>
- <li style="margin-bottom:10px">
- Create your <strong>layouts</strong> following material design guidelines.</li>
- <li style="margin-bottom:10px">
- Specify the <strong>elevation</strong> of your views to cast appropriate shadows.</li>
- <li style="margin-bottom:10px">
- Use the new <strong>widgets</strong> for complex views, such as lists and cards.</li>
- <li style="margin-bottom:10px">
- Use the new APIs to customize the <strong>animations</strong> in your app.</li>
-</ol>
-
-<h3>Update Your App for the Android L Developer Preview</h3>
-
-<p>To update an existing app for the Android L Developer Preview, design new layouts following
-material design guidelines and consider how you can improve the user experience for your app by
-incorporating depth, touch feedback and animations in your UI.</p>
-
-<h3>Create New Apps for the Android L Developer Preview</h3>
-
-<p>If you are creating a new app for the Android L Developer Preview, the <a
-href="http://www.google.com/design/spec">material design guidelines</a> provide you with a
-cohesive design framework for your app. Follow these guidelines and
-use the new functionality in the Android framework to design and develop your app.</p>
-
-
-<h2 id="applytheme">Apply the Material Theme</h2>
-
-<p>To apply the material theme in your app, specify a style that inherits from
-<code>android:Theme.Material</code>:</p>
-
-<pre>
-<!-- res/values/styles.xml -->
-<resources>
- <!-- your app's theme inherits from the Material theme -->
- <style name="AppTheme" parent="android:Theme.Material">
- <!-- theme customizations -->
- </style>
-</resources>
-</pre>
-
-<p>The material theme provides new system widgets that let you set their color palette and default
-animations for touch feedback and activity transitions. For more details, see
-<a href="{@docRoot}preview/material/theme.html">Material Theme</a>.</p>
-
-
-<h2 id="layouts">Design Your Layouts</h2>
-
-<p>In addition to applying and customizing the material theme, your layouts should conform to
-the <a href="http://www.google.com/design/spec">material design guidelines</a>. When you design
-your layouts, pay special attention to the following:</p>
-
-<ul>
-<li>Baseline grids</li>
-<li>Keylines</li>
-<li>Spacing</li>
-<li>Touch target size</li>
-<li>Layout structure</li>
-</ul>
-
-
-<h2 id="depth">Specify Elevation in Your Views</h2>
-
-<p>Views can cast shadows, and the elevation value of a view
-determines the size of its shadow and its drawing order. To set the elevation of a view, use the
-<code>android:elevation</code> attribute in your layouts:</p>
-
-<pre>
-<TextView
- android:id="@+id/my_textview"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/next"
- android:background="@color/white"
- <strong>android:elevation</strong>="5dp" />
-</pre>
-
-<p>The new <code>translationZ</code> property lets you create animations that reflect temporary
-changes in the elevation of a view. For example, this is useful to respond to touch gestures.</p>
-
-<p>For more details, see <a href="{@docRoot}preview/material/views-shadows.html">Views and
-Shadows</a>.</p>
-
-
-<h2 id="widgets">Use the New UI Widgets</h2>
-
-<p><code>RecyclerView</code> is a more advanced version of <code>ListView</code> that provides
-performance improvements and is easier to use. <code>CardView</code> lets you show pieces of
-information inside cards with a consistent look across apps. To include a <code>CardView</code>
-in your layout:</p>
-
-<pre>
-<android.support.v7.widget.CardView
- android:id="@+id/card_view"
- android:layout_width="200dp"
- android:layout_height="200dp"
- card_view:cardCornerRadius="3dp">
- ...
-</android.support.v7.widget.CardView>
-</pre>
-
-<p>For more information, see <a href="{@docRoot}preview/material/ui-widgets.html">UI Widgets</a>.</p>
-
-
-<h2 id="animations">Customize Your Animations</h2>
-
-<p>The Android L Developer Preview includes new APIs to create custom animations in your app.
-For example, you can enable activity transitions and define an exit transition inside an
-activity:</p>
-
-<pre>
-// inside your activity
-getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
-
-// set an exit transition
-getWindow().setExitTransition(new Explode());
-</pre>
-
-<p>When you start another activity from this activity, the exit transition is activated.</p>
-
-<p>To learn about all the features in the new APIs, see <a
-href="{@docRoot}preview/material/animations.html">Animations</a>.</p>
\ No newline at end of file
diff --git a/docs/html/preview/material/images/SceneTransition.png b/docs/html/preview/material/images/SceneTransition.png
deleted file mode 100644
index ecaf472..0000000
--- a/docs/html/preview/material/images/SceneTransition.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/preview/material/index.jd b/docs/html/preview/material/index.jd
deleted file mode 100644
index 9628e3a..0000000
--- a/docs/html/preview/material/index.jd
+++ /dev/null
@@ -1,130 +0,0 @@
-page.title=Material Design
-page.type=design
-page.image=images/material.png
-page.metaDescription=Learn how to apply material design to your apps.
-
-@jd:body
-
-<p itemprop="description">The Android L Developer Preview includes support for material design
-apps. Material design is a comprehensive guide for visual, motion, and interaction design across
-platforms and devices. To use material design in your Android apps, follow the guidelines defined
-in the <a href="http://www.google.com/design/spec">material design specification</a> and use the
-new components and functionality available in the Android L Developer Preview.</p>
-
-<p>The Android L Developer Preview provides the following elements for you to build material
-design apps:</p>
-
-<ul>
- <li>A new theme</li>
- <li>New widgets for complex views</li>
- <li>New APIs for custom shadows and animations</li>
-</ul>
-
-
-<h3>Material Theme</h3>
-
-<p>The material theme provides a new style for your app, system widgets that let you set
-their color palette, and default animations for touch feedback and activity transitions.</p>
-
-<!-- two columns -->
-<div style="width:700px;margin-top:25px;margin-bottom:20px">
-<div style="float:left;width:250px;margin-left:40px;margin-right:60px;">
- <img src="{@docRoot}preview/material/images/MaterialDark.png" width="500" height="238"/>
- <div style="width:140px;margin:0 auto">
- <p style="margin-top:8px">Dark Material theme</p>
- </div>
-</div>
-<div style="float:left;width:250px;margin-right:0px;">
- <img src="{@docRoot}preview/material/images/MaterialLight.png" width="500" height="238"/>
- <div style="width:140px;margin:0 auto">
- <p style="margin-top:8px">Light Material theme</p>
- </div>
-</div>
-<br style="clear:left"/>
-</div>
-
-
-<h3>New Widgets</h3>
-
-<p>The Android L Developer Preview includes two new widgets for displaying complex views:</p>
-
-<!-- two columns -->
-<div style="width:700px;margin-top:25px;margin-bottom:20px">
-<div style="float:left;width:250px;margin-left:40px;margin-right:60px;">
- <img src="{@docRoot}preview/material/images/list_mail.png" width="500" height="426"/>
- <p>The new <code>RecyclerView</code> widget is a more advanced version of <code>ListView</code>
- that provides performance improvements for dynamic views and is easier to use.</p>
-</div>
-<div style="float:left;width:250px;margin-right:0px;">
- <img src="{@docRoot}preview/material/images/card_travel.png" width="500" height="426"/>
- <p>The new <code>CardView</code> widget lets you display important pieces of information inside
- cards that have a consistent look and feel.</p>
-</div>
-<br style="clear:left"/>
-</div>
-
-
-<h3>View Shadows</h3>
-
-<p>In addition to the X and Y properties, views in the Android L Developer Preview have a Z
-property. This new property represents the elevation of a view, which determines:</p>
-
-<ul>
-<li>The size of the shadow - Views with higher Z values cast bigger shadows.</li>
-<li>The drawing order - Views with higher Z values appear on top of other views.</li>
-</ul>
-
-<div style="width:290px;margin-left:35px;float:right">
- <div class="framed-nexus5-port-span-5">
- <video class="play-on-hover" autoplay>
- <source src="/preview/material/videos/ContactsAnim.mp4"/>
- <source src="/preview/material/videos/ContactsAnim.webm"/>
- <source src="/preview/material/videos/ContactsAnim.ogv"/>
- </video>
- </div>
- <div style="font-size:10pt;margin-left:20px;margin-bottom:30px">
- <em>Click on the device screen to replay the movie</em>
- </div>
-</div>
-
-<h3>Animations</h3>
-
-<p>The Android L Developer Preview provides new APIs that let you create custom animations for
-touch feedback in UI controls, view state changes, and activity transitions.</p>
-
-<p>The new animation APIs let you:</p>
-
-<ul>
-<li style="margin-bottom:15px">
-Respond to touch events in your views with <strong>touch feedback</strong> animations.
-</li>
-<li style="margin-bottom:15px">
-Hide and show views with <strong>reveal effect</strong> animations.
-</li>
-<li style="margin-bottom:15px">
-Switch between activities with custom <strong>activity transition</strong> animations.
-</li>
-<li style="margin-bottom:15px">
-Create more natural animations with <strong>curved motion</strong>.
-</li>
-<li style="margin-bottom:15px">
-Animate changes in one or more view properties with <strong>view state change</strong> animations.
-</li>
-<li style="margin-bottom:15px">
-Show animations in <strong>state list drawables</strong> between view state changes.
-</li>
-</ul>
-
-<p>Touch feedback animations are built into several standard views, such as buttons. The new APIs
-let you customize these animations and add animations to your custom views.</p>
-
-
-<h3>New Capabilities for Drawables</h3>
-
-<p>The Android L Developer Preview supports <strong>drawable tinting</strong>: you can define
-bitmaps as an alpha mask and tint them using a color resource. You create these assets only
-once and color each instance to match your theme. Drawables also now support specifying most XML
-properties as <strong>theme attributes</strong>.</p>
-
-<p>The Android L Developer Preview Support Library includes a <strong>color extraction</strong>
-library that lets you automatically extract prominent colors from a bitmap image.</p>
\ No newline at end of file
diff --git a/docs/html/preview/material/theme.jd b/docs/html/preview/material/theme.jd
deleted file mode 100644
index dceeb47..0000000
--- a/docs/html/preview/material/theme.jd
+++ /dev/null
@@ -1,102 +0,0 @@
-page.title=Material Theme
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>In this document</h2>
-<ol>
- <li><a href="#colorpalette">Customize the Color Palette</a></li>
- <li><a href="#statusbar">Customize the Status Bar</a></li>
- <li><a href="#inheritance">Theme Individual Views</a></li>
-</ol>
-</div>
-</div>
-
-<p>The new material theme provides:</p>
-
-<ul>
- <li>System widgets that let you set their color palette</li>
- <li>Touch feedback animations for the system widgets</li>
- <li>Activity transition animations</li>
-</ul>
-
-<p>You can customize the look of the material theme
-according to your brand identity with a color palette you control. You can tint the action bar and
-the status bar using theme attributes, as shown in Figure 1.</p>
-
-<div style="float:right;margin-left:25px;margin-top:-50px">
-<img src="{@docRoot}preview/material/images/ThemeColors.png" style="width:250px"/>
-<p class="img-caption" style="margin-bottom:0px">
-<strong>Figure 1.</strong> Customizing the material theme.</p>
-</div>
-
-<p>The system widgets have a new design and touch feedback animations. You can customize the
-color palette, the touch feedback animations, and the activity transitions for your app.</p>
-
-<p>The material theme is defined as:</p>
-
-<ul>
- <li><code>@android:style/Theme.Material</code> (dark version)</li>
- <li><code>@android:style/Theme.Material.Light</code> (light version)</li>
- <li><code>@android:style/Theme.Material.Light.DarkActionBar</code></li>
-</ul>
-
-<p>For a list of material styles that you can use, see the API reference for
-<code>android.R.style</code>.</p>
-
-<p class="note">
-<strong>Note:</strong> The material theme is only available in the Android L Developer Preview.
-For more information, see <a href="{@docRoot}preview/material/compatibility.html">Compatibility</a>.
-</p>
-
-
-<h2 id="colorpalette">Customize the Color Palette</h2>
-
-<p style="margin-bottom:30px">To customize the theme's base colors to fit your brand, define
-your custom colors using theme attributes when you inherit from the material theme:</p>
-
-<pre>
-<resources>
- <!-- inherit from the material theme -->
- <style name="AppTheme" parent="android:Theme.Material">
- <!-- Main theme colors -->
- <!-- your app's branding color (for the app bar) -->
- <item name="android:colorPrimary">@color/primary</item>
- <!-- darker variant of colorPrimary (for status bar, contextual app bars) -->
- <item name="android:colorPrimaryDark">@color/primary_dark</item>
- <!-- theme UI controls like checkboxes and text fields -->
- <item name="android:colorAccent">@color/accent</item>
- </style>
-</resources>
-</pre>
-
-
-<h2 id="statusbar">Customize the Status and Navigation Bar</h2>
-
-<p>The material theme lets you easily customize the status bar, so you can specify a
-color that fits your brand and provides enough contrast to show the white status icons. To
-set a custom color for the status bar, use the <code>android:statusBarColor</code> attribute when
-you extend the material theme. By default, <code>android:statusBarColor</code> inherits the
-value of <code>android:colorPrimaryDark</code>.</p>
-
-<p>To handle the color of the status bar yourself (for example, by adding a gradient in the
-background), set the <code>android:statusBarColor</code> attribute to
-<code>@android:color/transparent</code> and adjust the window flags as required. You can
-also use the <code>Window.setStatusBarColor</code> method for animations or fading.</p>
-
-<p class="note"><strong>Note:</strong>
-The status bar should almost always have a clear delineation from the primary toolbar, except for
-full-bleed imagery cases and when you use a gradient as a protection.
-</p>
-
-<p>When customizing the navigation and status bars, make them both transparent or modify only
-the status bar. The navigation bar should remain black in all other cases.</p>
-
-
-<h2 id="inheritance">Theme Individual Views</h3>
-
-<p>Elements in XML layout definitions can specify the <code>android:theme</code> attribute,
-which references a theme resource. This attribute modifies the theme for the element and any
-elements inflated below it, which is useful to alter theme color palettes in a specific portion
-of an interface.</p>
\ No newline at end of file
diff --git a/docs/html/preview/material/ui-widgets.jd b/docs/html/preview/material/ui-widgets.jd
deleted file mode 100644
index 69b7d2d..0000000
--- a/docs/html/preview/material/ui-widgets.jd
+++ /dev/null
@@ -1,198 +0,0 @@
-page.title=UI Widgets
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>In this document</h2>
-<ol>
- <li><a href="#recyclerview">RecyclerView</a></li>
- <li><a href="#cardview">CardView</a></li>
-</ol>
-</div>
-</div>
-
-<p>The support library in the Android L Developer Preview contains two new widgets,
-<code>RecyclerView</code> and <code>CardView</code>. Use these widgets to show complex lists
-and cards in your app. These widgets have material design style by default.</p>
-
-
-<h2 id="recyclerview">RecyclerView</h2>
-
-<p><code>RecyclerView</code> is a more advanced and flexible version of <code>ListView</code>.
-This widget is a container for large sets of views that can be recycled and scrolled very
-efficiently. Use the <code>RecyclerView</code> widget when you have lists with elements that
-change dynamically.</p>
-
-<p><code>RecyclerView</code> is easy to use, because it provides:</p>
-
-<ul>
- <li>A layout manager for positioning items</li>
- <li>Default animations for common item operations</li>
-</ul>
-
-<p>You also have the flexibility to define custom layout managers and animations for this
-widget.</p>
-
-<p>To use the <code>RecyclerView</code> widget, you have to specify an adapter and a layout
-manager. To create an adapter, you extend the <code>RecyclerView.Adapter</code> class. The details
-of the implementation depend on the specifics of your dataset and the type of views. For more
-information, see the <a href="#rvexamples">examples</a> below.</p>
-
-<img src="/preview/material/images/RecyclerView.png" alt="" id="figure1" style="width:550px"/>
-<p class="img-caption">
- <strong>Figure 1</strong> - The <code>RecyclerView</code> widget.
-</p>
-
-<p>A <strong>layout manager</strong> positions item views inside a <code>RecyclerView</code> and
-determines when to reuse item views that are no longer visible to the user. To reuse (or
-<em>recycle</em>) a view, a layout manager may ask the adapter to replace the content of the
-view with a different element from the dataset. Recycling views in this manner improves
-performance by avoiding the creation of unnecessary views or performing expensive
-<code>findViewById</code> lookups.
-</p>
-
-<p><code>RecyclerView</code> provides <code>LinearLayoutManager</code>, which shows the items in a
-vertical or horizontal scrolling list. To create a custom layout, you extend the
-<code>RecyclerView.LayoutManager</code> class.</p>
-
-<h3>Animations</h3>
-
-<p>Animations for adding and removing items are enabled by default in <code>RecyclerView</code>.
-To customize these animations, extend the <code>RecyclerView.ItemAnimator</code> class and use
-the <code>RecyclerView.setItemAnimator</code> method.</p>
-
-<h3 id="rvexamples">Examples</h3>
-
-<p>To include a <code>RecyclerView</code> in your layout:</p>
-
-<pre>
-<!-- A RecyclerView with some commonly used attributes -->
-<android.support.v7.widget.RecyclerView
- android:id="@+id/my_recycler_view"
- android:scrollbars="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
-</pre>
-
-<p>To get the <code>RecyclerView</code> object in your activity:</p>
-
-<pre>
-public class MyActivity extends Activity {
- private RecyclerView mRecyclerView;
- private RecyclerView.Adapter mAdapter;
- private RecyclerView.LayoutManager mLayoutManager;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.my_activity);
- mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
-
- // improve performance if you know that changes in content
- // do not change the size of the RecyclerView
- mRecyclerView.setHasFixedSize(true);
-
- // use a linear layout manager
- mLayoutManager = new LinearLayoutManager(this);
- mRecyclerView.setLayoutManager(mLayoutManager);
-
- // specify an adapter (see also next example)
- mAdapter = new MyAdapter(myDataset);
- mRecyclerView.setAdapter(mAdapter);
- }
- ...
-}
-</pre>
-
-<p>To create a simple adapter:</p>
-
-<pre>
-public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
- private String[] mDataset;
-
- // Provide a reference to the type of views that you are using
- // (custom viewholder)
- public static class ViewHolder extends RecyclerView.ViewHolder {
- public TextView mTextView;
- public ViewHolder(TextView v) {
- super(v);
- mTextView = v;
- }
- }
-
- // Provide a suitable constructor (depends on the kind of dataset)
- public MyAdapter(String[] myDataset) {
- mDataset = myDataset;
- }
-
- // Create new views (invoked by the layout manager)
- @Override
- public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
- int viewType) {
- // create a new view
- View v = LayoutInflater.from(parent.getContext())
- .inflate(R.layout.my_text_view, parent, false);
- // set the view's size, margins, paddings and layout parameters
- ...
- ViewHolder vh = new ViewHolder(v);
- return vh;
- }
-
- // Replace the contents of a view (invoked by the layout manager)
- @Override
- public void onBindViewHolder(ViewHolder holder, int position) {
- // - get element from your dataset at this position
- // - replace the contents of the view with that element
- holder.mTextView.setText(mDataset[position]);
-
- }
-
- // Return the size of your dataset (invoked by the layout manager)
- @Override
- public int getItemCount() {
- return mDataset.length;
- }
-}
-</pre>
-
-
-<h2 id="cardview">CardView</h2>
-
-<p><code>CardView</code> extends the <code>FrameLayout</code> class and lets you show information
-inside cards that have a consistent look on any app. <code>CardView</code> widgets can have
-shadows and rounded corners.</p>
-
-<p>To create a card with a shadow, use the <code>android:elevation</code> attribute.
-<code>CardView</code> uses real elevation and dynamic shadows
-and falls back to a programmatic shadow implementation on earlier versions. For more information,
-see <a href="{@docRoot}preview/material/compatibility.html">Compatibility</a>.</p>
-
-<p>Here's how to specify properties of <code>CardView</code>:</p>
-
-<ul>
- <li>To set the corner radius in your layouts, use the <code>card_view:cardCornerRadius</code>
- attribute.</li>
- <li>To set the corner radius in your code, use the <code>CardView.setRadius</code> method.</li>
- <li>To set the background color of a card, use the <code>card_view:cardBackgroundColor</code>
-attribute.</li>
-</ul>
-
-<p>To include a <code>CardView</code> in your layout:</p>
-
-<pre>
-<!-- A CardView that contains a TextView -->
-<android.support.v7.widget.CardView
- xmlns:card_view="http://schemas.android.com/apk/res-auto"
- android:id="@+id/card_view"
- android:layout_gravity="center"
- android:layout_width="200dp"
- android:layout_height="200dp"
- card_view:cardCornerRadius="4dp">
-
- <TextView
- android:id="@+id/info_text"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
-</android.support.v7.widget.CardView>
-</pre>
\ No newline at end of file
diff --git a/docs/html/preview/material/views-shadows.jd b/docs/html/preview/material/views-shadows.jd
deleted file mode 100644
index 78c0062..0000000
--- a/docs/html/preview/material/views-shadows.jd
+++ /dev/null
@@ -1,95 +0,0 @@
-page.title=Views and Shadows
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-<h2>In this document</h2>
-<ol>
- <li><a href="#elevation">View Elevation</a></li>
- <li><a href="#shadows">Shadows and Outlines</a></li>
- <li><a href="#clip">Clipping Views</a></li>
-</ol>
-</div>
-</div>
-
-<p>The elevation of a view determines the size of its shadow:
-views with higher Z values cast bigger shadows. Views only cast shadows on the Z=0 plane under an
-orthographic projection (the views do not scale for different values of Z).</p>
-
-<p>Elevation is also useful to create animations where widgets temporarily rise above the
-view plane when performing some action.</p>
-
-
-<h2 id="elevation">View Elevation</h2>
-
-<p>The Z value for a view has two components, elevation and translation. The elevation is the
-static component, and the translation is used for animations:</p>
-
-<p><code>Z = elevation + translationZ</code></p>
-
-<p>To set the elevation of a view:</p>
-
-<ul>
- <li>In a layout definition, use the <code>android:elevation</code> attribute.</li>
- <li>In the code of an activity, use the <code>View.setElevation</code> method.</li>
-</ul>
-
-<p>To set the translation of a view, use the <code>View.setTranslationZ</code> method.</p>
-
-<p>The new <code>ViewPropertyAnimator.z</code> and <code>ViewPropertyAnimator.translationZ</code>
-methods enable you to easily animate the elevation of views. For more information, see
-the API reference for <code>ViewPropertyAnimator</code> and the <a
-href="{@docRoot}guide/topics/graphics/prop-animation.html#object-animator">Property Animation</a>
-developer guide.</p>
-
-<p>The Z values are measured in the same units as the X and Y values.</p>
-
-
-<h2 id="shadows">Shadows and Outlines</h2>
-
-<p>The bounds of a view's background drawable determine the default shape of its shadow.
-<strong>Outlines</strong> represent the outer shape of a graphics object and define the ripple
-area for touch feedback.</p>
-
-<p>For example, if you define a view with a background drawable:</p>
-
-<pre>
-<TextView
- android:id="@+id/myview"
- ...
- android:elevation="2dp"
- android:background="@drawable/myrect" />
-</pre>
-
-<p>where the background drawable is defined as a rectangle with rounded corners:</p>
-
-<pre>
-<!-- res/drawable/myrect.xml -->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <solid android:color="#42000000" />
- <corners android:radius="5dp" />
-</shape>
-</pre>
-
-<p>Then this view and drawable cast the appropriate shadow.</p>
-
-<p>You can also create outlines in your code using the methods in the <code>Outline</code> class,
-and you can assign them to views with the <code>View.setOutline</code> method.</p>
-
-<p>To prevent a view from casting a shadow, set its outline to <code>null</code>.</p>
-
-
-<h2 id="clip">Clipping Views</h2>
-
-<p>Clip a view to its outline area using the
-<code>View.setClipToOutline</code> method. Only rectangle, circle, and round rectangle outlines
-support clipping, as determined by the <code>Outline.canClip</code> method.</p>
-
-<p>To clip a view to the shape of a drawable, set the drawable as the background of the view
-(as shown above) and call the <code>View.setClipToOutline</code> method.</p>
-
-<p>Because clipping views is an expensive operation, don't animate the shape you use to
-clip a view. To achieve this effect, use a <a
-href="{@docRoot}preview/material/animations.html#reveal">Reveal Effect</a> animation.</p>
\ No newline at end of file
diff --git a/docs/html/preview/tv/publish/index.jd b/docs/html/preview/tv/publish/index.jd
deleted file mode 100644
index f834493..0000000
--- a/docs/html/preview/tv/publish/index.jd
+++ /dev/null
@@ -1,205 +0,0 @@
-page.title=Publishing TV Apps
-page.tags="requirements","usability"
-
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
- <h2>In this document</h2>
- <ol>
- <li><a href="#requirements">Publishing Requirements for TV Apps</a>
- <ol>
- <li><a href="#requirements-manifest">Manifest Requirements</a></li>
- <li><a href="#requirements-usability">Usability Requirements</a></li>
- </ol>
- </li>
- <li><a href="#faq">Frequently Asked Questions</a></li>
- </ol>
-</div>
-</div>
-
-<p>
- Apps for TV devices can be published like other Android apps. You must prepare your app for
- release and then you can publish it through <a href=
- "{@docRoot}distribute/googleplay/index.html">Google Play</a>. In order for your app to be
- accepted as a TV app in Google Play, it must meet some additional requirements, which are covered
- in this document.
-</p>
-
-<p class="note">
- <strong>Note:</strong> You will not be able to publish apps to TV devices through <a href=
- "{@docRoot}distribute/googleplay/index.html">Google Play</a> until Android L SDK is released.
-</p>
-
-
-<h2 id="requirements">Publishing Requirements for TV Apps</h2>
-
-<p>
- Your app must provide specific manifest declarations and meet some minimum usability requirements
- before it can qualify as TV app on Google Play. Make sure your app meets these requirements to
- get your app ready for TV devices.
-</p>
-
-<p class="caution">
- <strong>Caution:</strong> Your app must meet all of the requirements described in this section in
- order to qualify as a TV app on Google Play. If your app does not meet the usability requirements
- described below, the Google Play team will contact you through the email address specified in main
- <a href="https://play.google.com/apps/publish/">Google Play Developer Console</a> account
- associated with the app.
-</p>
-
-<h3 id="requirements-manifest">Manifest Requirements</h3>
-
-<p>
- Developers who want their apps to be considered for publishing on TV devices <em>must</em>
- include a manifest entry that declares an activity which handles the {@code
- android.intent.category.LEANBACK_LAUNCHER} intent filter. For more information about including
- the required manifest entries, see <a href=
- "{@docRoot}preview/tv/start/index.html#tv-activity">Get Started with TV Apps</a>.
-</p>
-
-<p class="caution">
- <strong>Caution:</strong> If you do not include the <a href=
- "{@docRoot}preview/tv/start/index.html#tv-activity">required manifest entries</a> for TV devices,
- your app is not considered as a TV app. The app will not be reviewed for the TV app usability
- requirements and will not be able to qualify as a TV app on Google Play.
-</p>
-
-
-<h3 id="requirements-usability">Usability Requirements</h3>
-
-<p>
- Users bring a different set of expectations when watching TV. Apps for Android TV devices have a
- different interaction, look and feel from Android apps on the phone or tablet. How users interact
- with TVs (with a remote control device) and how they view them (sitting about 10 feet away),
- significantly changes the requirements for what makes a good user experience in an app.
-</p>
-
-<p>
- The first step toward creating a great experience for users on TV is to review and follow the
- <a href="{@docRoot}preview/tv/design/index.html">Design for TV</a> guidelines. These guidelines
- provide general directions for designing a TV app as well as some specific implementation
- instructions.
-</p>
-
-<p>
- Apps for TV devices must meet some specific requirements for usability. Only apps that meet the
- following usability criteria will qualify as an TV app on Google Play:
-</p>
-
-<ul>
- <li>App functionality must be navigable using 5-way D-pad controls, unless the app requires a
- game controller.
- (<a href="{@docRoot}preview/tv/ui/navigation.html#d-pad-navigation">details</a>)
- <ul>
- <li>If the app requires a game controller, all functionality must be navigable using
- standard Android game controller keys.
- (<a href="{@docRoot}training/game-controllers/controller-input.html#button">details</a>)
- </li>
- </ul>
- </li>
-
- <li>Layouts used on TV devices must be designed for landscape orientation.
- (<a href="{@docRoot}preview/tv/ui/layouts.html#structure">details</a>)</li>
-
- <li>Core text used in TV layouts must be at least 16sp in size and all text must be at least
- 12sp.</li>
-
- <li>Text and functionality should be placed inside an overscan margin of at least 27dp from the
- top and bottom edges and 48dp from the left and right edges of the TV screen.
- (<a href="{@docRoot}preview/tv/ui/layouts.html#overscan">details</a>)</li>
-
- <li>Apps that uses full-screen, non-video ads, must ensure that the ads are immediately
- dismissible by the user with D-pad controls.</li>
-
- <li>Apps must not depend on having a web browser app on TV devices. Apps can use <a href=
- "http://developer.android.com/reference/android/webkit/WebView.html">WebView components</a> to
- show web content where needed.</li>
-
- <li>Apps that uses clickable, non-full screen, non-video ads must ensure that the ads do not link
- to a web URL. These ads must also not link to an app or game that is not available on TV devices
- and, therefore, not available in the Google Play store for TV.</li>
-
- <li>Apps must display correctly on the Android TV launcher by doing the following:
- <ul>
- <li>Include in the app manifest an intent filter of type {@code ACTION_MAIN} with an intent
- category {@code CATEGORY_LEANBACK_LAUNCHER}.
- (<a href="{@docRoot}preview/tv/start/index.html#tv-activity">details</a>)
- </li>
-
- <li>Provide a 320x180px banner image resource and declare it in the manifest.</li>
-
- <li>If the app is a game, it must set the {@code isGame} property to {@code true} in the
- manifest. (<a href="{@docRoot}preview/tv/games/index.html#manifest">details</a>)
- </li>
- </ul>
- </li>
-
- <li>App must not partially obscure other apps. Apps must fill the entire screen and have a
- non-transparent background.
- </li>
-
- <li>Music and audio apps that continue to play sound after a user has left the app must provide
- a <strong>Now Playing</strong> card on the home screen recommendation row so users can easily
- control playback. Developers should use the {@code android.media.session.MediaSession} API
- to enable this card and link playback to a specific activity.
- </li>
-
- <li>Media apps that play video or music content must toggle between play and pause of media
- playback when a <a href="{@docRoot}reference/android/view/KeyEvent.html#KEYCODE_MEDIA_PLAY_PAUSE">
- play or pause key event</a> is sent during playback.
- </li>
-
- <li>Games that use a gamepad in order to play must define gamepad use in the app manifest.
- (<a href="{@docRoot}preview/tv/games/index.html#gamepad">details</a>)
- </li>
-
- <li>Games that provide in-game instructions for game controllers must show a generic controller
- layout that does not include any branding. You can download generic controller artwork from
- here: <a href="http://storage.googleapis.com/androiddevelopers/design/android_tv_gamepad_template-2014-10.zip">
- android_tv_gamepad_template_2014-10.zip</a>.
- </li>
-</ul>
-
-
-<h2 id="faq">Frequently Asked Questions</h2>
-
-<p>
- <strong>After I submit my app, how will find out if my app does not meet all the requirements for
- TV devices?</strong>
-</p>
-<p>
- If your app does not meet the usability requirements described on this page, the Play Store team
- will contact you through the email address specified in main <a href=
- "https://play.google.com/apps/publish/">Google Play Developer Console</a> account associated with
- the app.
-</p>
-<p class="caution">
- <strong>Caution:</strong> Make sure your app includes the <a href=
- "{@docRoot}preview/tv/start/index.html#tv-activity">required manifest entries</a> for TV devices,
- otherwise your app will not be considered a TV app and will not be reviewed for TV usability
- requirements.
-</p>
-
-
-<p>
- <strong>My app targets more than just TV devices. If my app does not meet the TV device
- requirements, will my new or updated app still appear on Google Play for phones and
- tablets?</strong>
-</p>
-<p>
- Yes. The requirements described above only restrict distribution to the Google Play Store on TV
- devices. Distribution to other device types, such as phones, tablets and other devices, is not
- affected.
-</p>
-
-
-<p>
- <strong>If my app meets the publishing requirements, when will it be available in the Google
- Play Store on TV devices?</strong>
-</p>
-
-<p>
- Apps that meet the requirements for TV will appear in the Google Play Store on TV devices
- <em>after</em> the official release of Android L.
-</p>
\ No newline at end of file
diff --git a/docs/html/samples/new/index.jd b/docs/html/samples/new/index.jd
index ca44775..330caa3 100644
--- a/docs/html/samples/new/index.jd
+++ b/docs/html/samples/new/index.jd
@@ -235,3 +235,131 @@
**description**
</p>
-->
+
+<h3 id="FloatingActionButtonBasic">FloatingActionButtonBasic</h3>
+
+<p>
+This sample shows the two sizes of Floating Action Buttons and how to interact with
+them.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-FloatingActionButtonBasic">Get it on GitHub</a></p>
+
+<h3 id="RevealEffectBasic">RevealEffectBasic</h3>
+
+<p>
+A sample demonstrating how to perform a reveal effect for UI elements within the Material Design framework.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-RevealEffectBasic">Get it on GitHub</a></p>
+
+<h3 id="RecyclerView">RecyclerView</h3>
+
+<p>
+Demonstration of using RecyclerView with a LayoutManager to create a vertical ListView.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-RecyclerView">Get it on GitHub</a></p>
+
+<h3 id="CardView">CardView</h3>
+
+<p>
+This sample demonstrates how to use the CardView UI widget introduced in Android 5.0, using the support library for backward compatibility.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-CardView">Get it on GitHub</a></p>
+
+<h3 id="LNotifications">LNotifications</h3>
+
+<p>
+This sample demonstrates how new features for notifications introduced in Android 5.0
+are used such as Heads-Up notifications, visibility, people, category and priority
+metadata. </p>
+<p><a href="http://github.com/googlesamples/android-LNotifications">Get it on GitHub</a></p>
+
+<h3 id="DrawableTinting">DrawableTinting</h3>
+
+<p>Sample that shows applying tinting and color filters to Drawables both programmatically
+and as Drawable resources in XML.</p>
+<p>Tinting is set on a nine-patch drawable through the "tint" and "tintMode" parameters.
+A color state list is referenced as the tint color, which defines colors for different
+states of a View (for example disabled/enabled, focused, pressed or selected).</p>
+<p>Programmatically, tinting is applied to a Drawable through its "setColorFilter" method,
+with a reference to a color and a PorterDuff blend mode. The color and blend mode can be
+changed from the UI to see the effect of different options.</p>
+
+<p><a href="http://github.com/googlesamples/android-DrawableTinting">Get it on GitHub</a></p>
+
+<h3 id="Interpolator">Interpolator</h3>
+
+<p>
+This sample demonstrates the use of animation interpolators and path animations for
+Material Design. It shows how an ObjectAnimator is used to animate two properties of a
+view (scale X and Y) along a path.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-Interpolator">Get it on GitHub</a></p>
+
+<h3 id="HdrViewfinder">HdrViewfinder</h3>
+
+<p>
+This demo implements a real-time high-dynamic-range camera viewfinder, by alternating
+the sensor's exposure time between two exposure values on even and odd frames, and then
+compositing together the latest two frames whenever a new frame is captured.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-HdrViewfinder">Get it on GitHub</a></p>
+
+<h3 id="DocumentCentricApps">DocumentCentricApps</h3>
+
+<p>
+This sample shows the basic usage of the new "Document Centric Apps" API.
+It let's you create new documents in the system overview menu and persists its
+state through reboots. If "Task per document" is checked a new task will be
+created for every new document in the overview menu.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-DocumentCentricApps">Get it on GitHub</a></p>
+
+<h3 id="DocumentCentricRelinquishIdentity">DocumentCentricRelinquishIdentity</h3>
+
+<p>
+This sample shows how to relinquish identity to activities above it in the task stack.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-DocumentCentricRelinquishIdentity">Get it on GitHub</a></p>
+
+<h3 id="AppRestrictionEnforcer">AppRestrictionEnforcer</h3>
+
+<p>
+This sample demonstrates how to set restrictions to other apps as a profile owner.
+Use AppRestrictionSchema sample as a app with available restrictions.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-AppRestrictionEnforcer">Get it on GitHub</a></p>
+
+<h3 id="AppRestrictionSchema">AppRestrictionSchema</h3>
+
+<p>
+This sample shows how to use app restrictions. This application has one boolean
+restriction with a key "can_say_hello" that defines whether the only feature of this
+app (press the button to show "Hello" message) is enabled or disabled. Use
+AppRestrictionEnforcer sample to toggle the restriction.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-AppRestrictionSchema">Get it on GitHub</a></p>
+
+<h3 id="SpeedTracker">Speed Tracker (Wear)</h3>
+
+<p>
+This sample uses the FusedLocation APIs of Google Play Services on Android Wear
+devices that have a hardware GPS built in. In those cases, this sample provides
+a simple screen that shows the current speed of the wearable device. User can
+set a speed limit and if the speed approaches that limit, it changes the color
+to yellow and if it exceeds the limit, it turns red. User can also enable
+recording of coordinates and when it pairs back with the phone, this data
+is synced with the phone component of the app and user can see a track
+made of those coordinates on a map on the phone.
+</p>
+
+<p><a href="http://github.com/googlesamples/android-SpeedTracker">Get it on GitHub</a></p>
diff --git a/docs/html/samples/wearable.jd b/docs/html/samples/wearable.jd
new file mode 100644
index 0000000..3114374
--- /dev/null
+++ b/docs/html/samples/wearable.jd
@@ -0,0 +1,11 @@
+page.title=Wearable
+@jd:body
+
+
+<div id="samples" class="wearable">
+</div>
+
+
+<script>
+ $(document).ready(showSamples);
+</script>
diff --git a/docs/html/sdk/index.jd b/docs/html/sdk/index.jd
index d91e7e8..a646795 100644
--- a/docs/html/sdk/index.jd
+++ b/docs/html/sdk/index.jd
@@ -243,7 +243,7 @@
<h1 style="margin-top:0">Get the Android SDK</h1>
-<p>The Android SDK provides you the API libraries and developer tools necessary to build, test,
+<p>The Android SDK provides the API libraries and developer tools necessary to build, test,
and debug apps for Android.</p>
<p>Download the ADT Bundle to quickly start developing apps. It includes the essential Android
@@ -352,17 +352,18 @@
<h5>Operating Systems</h5>
<ul>
<li>Windows XP (32-bit), Vista (32- or 64-bit), or Windows 7 (32- or 64-bit)</li>
- <li>Mac OS X 10.5.8 or later (x86 only)</li>
- <li>Linux (tested on Ubuntu Linux, Lucid Lynx)
+ <li>Mac OS X 10.8.5 or later</li>
+ <li>Linux
<ul>
- <li>GNU C Library (glibc) 2.7 or later is required.</li>
- <li>On Ubuntu Linux, version 8.04 or later is required.</li>
- <li>64-bit distributions must be capable of running 32-bit applications.</li>
+ <li>64-bit distribution capable of running 32-bit applications</li>
+ <li>GNU C Library (glibc) 2.11 or later is required.</li>
+ <li>Tested on Ubuntu 12.04, Precise Pangolin</li>
</ul>
</li>
</ul>
</div>
+
<div class="col-7 reqs" style="margin:0 0 80px 20px;display:none;">
<h5>Development tools</h5>
diff --git a/docs/html/sdk/installing/adding-packages.jd b/docs/html/sdk/installing/adding-packages.jd
index e6c0118..22d055c 100644
--- a/docs/html/sdk/installing/adding-packages.jd
+++ b/docs/html/sdk/installing/adding-packages.jd
@@ -1,5 +1,8 @@
page.title=Adding SDK Packages
+page.tags=studio, sdk tools, eclipse adt, sdk manager, google play services, support library
+helpoutsWidget=true
+
@jd:body
<style>
diff --git a/docs/html/sdk/installing/index.jd b/docs/html/sdk/installing/index.jd
index ec0e2f8..6a99952 100644
--- a/docs/html/sdk/installing/index.jd
+++ b/docs/html/sdk/installing/index.jd
@@ -1,5 +1,8 @@
page.title=Installing the Android SDK
+page.tags=studio, sdk tools, eclipse adt
+helpoutsWidget=true
+
@jd:body
<style>
diff --git a/docs/html/sdk/installing/studio.jd b/docs/html/sdk/installing/studio.jd
index 233213e..b0567e7 100644
--- a/docs/html/sdk/installing/studio.jd
+++ b/docs/html/sdk/installing/studio.jd
@@ -311,7 +311,7 @@
</td>
<td>
<ul>
- <li>Mac OS X 10.5 or higher, up to 10.9 (Mavericks)</li>
+ <li>Mac OS X 10.8.5 or higher, up to 10.9 (Mavericks)</li>
<li>1 GB of RAM minimum, 2 GB recommended</li>
<li>400 MB of disk space</li>
<li>At least 1 GB of additional disk space for the Android SDK, emulator system images, and caches</li>
@@ -324,6 +324,9 @@
</td>
<td>
<ul>
+ <li>64-bit distribution capable of running 32-bit applications</li>
+ <li>GNU C Library (glibc) 2.11 or later is required.</li>
+ <li>Tested on Ubuntu 12.04, Precise Pangolin</li>
<li>GNOME or KDE desktop</li>
<li>1 GB of RAM minimum, 2 GB recommended</li>
<li>400 MB of disk space</li>
diff --git a/docs/html/support.jd b/docs/html/support.jd
index 4271eee..bbed7df 100644
--- a/docs/html/support.jd
+++ b/docs/html/support.jd
@@ -3,6 +3,7 @@
fullpage=1
page.metaDescription=Resources available to help you report and resolve issues while you are developing apps for Android.
page.image=/images/android-support-card.png
+
@jd:body
<div class="wrap" style="width:940px;">
@@ -28,13 +29,20 @@
<a href="http://webchat.freenode.net/?channels=android">#android</a>, <a href="http://webchat.freenode.net/?channels=android-dev">#android-dev</a> <span style="color:#888">(IRC via irc.freenode.net)</span><br />
</p>
+<p><b>
+<a target="_blank"
+href="https://helpouts.google.com/partner/ask?vertical=programming&tags=android&origin=http:%2F%2Fdeveloper.android.com%2Fsupport.html">Ask a question in Google Helpouts</a>
+</b></p>
+
<h5>Send Feedback</h5>
<p>
<a href="http://code.google.com/p/android/issues/entry?template=Developer%20Documentation">Report documentation bug</a><br />
<a href="https://code.google.com/p/android/issues/entry?template=User%20bug%20report">Report device bug</a><br />
<a href="https://code.google.com/p/android/issues/entry?template=Developer%20bug%20report">Report platform bug</a><br />
-
+</p>
+
+
</div>
diff --git a/docs/html/tools/debugging/debugging-memory.jd b/docs/html/tools/debugging/debugging-memory.jd
index fccb67e..ae67b3c 100644
--- a/docs/html/tools/debugging/debugging-memory.jd
+++ b/docs/html/tools/debugging/debugging-memory.jd
@@ -243,7 +243,7 @@
Other mmap 107 0 8 8 324 68
Unknown 6994(4) 0 252 6992(4) 0 0
TOTAL 24358(1) 4188 9724 17972(2)16388 4260(2)16968 16595 336
-
+
Objects
Views: 426 ViewRootImpl: 3(8)
AppContexts: 6(7) Activities: 2(7)
@@ -251,7 +251,7 @@
Local Binders: 64 Proxy Binders: 34
Death Recipients: 0
OpenSSL Sockets: 1
-
+
SQL
MEMORY_USED: 1739
PAGECACHE_OVERFLOW: 1164 MALLOC_SIZE: 62
@@ -374,7 +374,7 @@
<p>To analyze your heap dump, you can use a standard tool like jhat or the <a href=
"http://www.eclipse.org/mat/downloads.php">Eclipse Memory Analyzer Tool</a> (MAT). However, first
you'll need to convert the HPROF file from Android's format to the J2SE HPROF format. You can do
-this using the <code>hprof-conv</code> tool provided in the <code><sdk>/tools/</code>
+this using the <code>hprof-conv</code> tool provided in the <code><sdk>/platform-tools/</code>
directory. Simply run the <code>hprof-conv</code> command with two arguments: the original HPROF
file and the location to write the converted HPROF file. For example:</p>
diff --git a/docs/html/tools/devices/managing-avds.jd b/docs/html/tools/devices/managing-avds.jd
index 10633d2..d3bbfdc 100644
--- a/docs/html/tools/devices/managing-avds.jd
+++ b/docs/html/tools/devices/managing-avds.jd
@@ -31,6 +31,12 @@
<p>From the main screen, you can create, delete, repair and start AVDs as well as see the details
of each AVD. </p>
+
+ <p class="note"><strong>Note:</strong> The emulator system images include experimental
+64-bit system images along with standard 32-bit system images. The 64-bit system images
+require the Intel x86 Emulator Accelerator (HAXM) Rev.5 which can be downloaded from the
+<a href="{@docRoot}tools/help/sdk-manager.html">SDK Manager</a> <em>Extras</em> folder.
+ </p>
<h2 id="createavd">Creating an AVD</h2>
diff --git a/docs/html/tools/revisions/build-tools.jd b/docs/html/tools/revisions/build-tools.jd
index fe78ce9..6f07755 100644
--- a/docs/html/tools/revisions/build-tools.jd
+++ b/docs/html/tools/revisions/build-tools.jd
@@ -77,6 +77,28 @@
<div class="toggle-content opened">
<p><a href="#" onclick="return toggleContent(this)">
<img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img"
+ alt=""/>Build Tools, Revision 21.0.2</a> <em>(October 2014)</em>
+ </p>
+ <div class="toggle-content-toggleme">
+ <p>Complete updates for Eclipse ADT to solve instability issues on Windows platforms.</p>
+ </div>
+</div>
+
+
+<div class="toggle-content closed">
+ <p><a href="#" onclick="return toggleContent(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img"
+ alt=""/>Build Tools, Revision 21.0.1</a> <em>(October 2014)</em>
+ </p>
+ <div class="toggle-content-toggleme">
+ <p>Initial updates for Eclipse ADT on Windows. Please use Revision 21.0.2.</p>
+ </div>
+</div>
+
+
+<div class="toggle-content closed">
+ <p><a href="#" onclick="return toggleContent(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img"
alt=""/>Build Tools, Revision 21.0.0</a> <em>(October 2014)</em>
</p>
<div class="toggle-content-toggleme">
@@ -96,6 +118,7 @@
</div>
</div>
+
<div class="toggle-content closed">
<p><a href="#" onclick="return toggleContent(this)">
<img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img"
diff --git a/docs/html/tools/revisions/platforms.jd b/docs/html/tools/revisions/platforms.jd
index 3fa1b9b..85b9c5e 100644
--- a/docs/html/tools/revisions/platforms.jd
+++ b/docs/html/tools/revisions/platforms.jd
@@ -80,6 +80,23 @@
<h2 id="4.4">Android 4.4W</h2>
+<div class="toggle-content open">
+ <p><a href="#" onclick="return toggleContent(this)">
+ <img src="{@docRoot}assets/images/triangle-open.png"
+class="toggle-content-img" alt="" />Revision 2</a> <em>(October 2014)</em>
+ </p>
+
+ <div class="toggle-content-toggleme">
+
+ <p>Added location APIs support for Wear.</p>
+
+ <p>Dependencies:</p>
+ <ul>
+ <li>Android SDK Platform-tools r20 or higher is required.</li>
+ <li>Android SDK Tools 23.0 or higher is required.</li>
+ </ul>
+ </div>
+
<div class="toggle-content closed">
<p><a href="#" onclick="return toggleContent(this)">
<img src="{@docRoot}assets/images/triangle-closed.png"
diff --git a/docs/html/tools/sdk/ndk/index.jd b/docs/html/tools/sdk/ndk/index.jd
index e75f451..06474dc 100644
--- a/docs/html/tools/sdk/ndk/index.jd
+++ b/docs/html/tools/sdk/ndk/index.jd
@@ -2,60 +2,32 @@
page.template=sdk
-ndk.mac64_download=android-ndk32-r10b-darwin-x86_64.tar.bz2
-ndk.mac64_bytes=413652124
-ndk.mac64_checksum=7ca4a84e9c56c38acdafb007e7cd33c5
+ndk.mac64_download=android-ndk-r10c-darwin-x86_64.bin
+ndk.mac64_bytes=436952863
+ndk.mac64_checksum=bc04ef44b920cf6cd2157b6f2c3531d6
-ndk.mac32_download=android-ndk32-r10b-darwin-x86.tar.bz2
-ndk.mac32_bytes=406998070
-ndk.mac32_checksum=db3626b2c5f3245d90e2724f7bcf4c3e
+ndk.mac32_download=android-ndk-r10c-darwin-x86.bin
+ndk.mac32_bytes=435858709
+ndk.mac32_checksum=6b3e143f7e64d5cd337b727513e27913
-ndk.linux64_download=android-ndk32-r10b-linux-x86_64.tar.bz2
-ndk.linux64_bytes=422237011
-ndk.linux64_checksum=5c0f301aa789a1a747d5d2aeb8c69ef3
+ndk.linux64_download=android-ndk-r10c-linux-x86_64.bin
+ndk.linux64_bytes=449013322
+ndk.linux64_checksum=792c61706cd9ec6713fa1b69b2f42996
-ndk.linux32_download=android-ndk32-r10b-linux-x86.tar.bz2
-ndk.linux32_bytes=421052081
-ndk.linux32_checksum=e8f55daa5c9de7ab79aaaf5d7d751b69
+ndk.linux32_download=android-ndk-r10c-linux-x86.bin
+ndk.linux32_bytes=438555265
+ndk.linux32_checksum=d1595d9ca5e15484e047f1ac326c4ceb
-ndk.win64_download=android-ndk32-r10b-windows-x86_64.zip
-ndk.win64_bytes=531912027
-ndk.win64_checksum=e4dd2e0c6f38e3ad936c366bdf6b1d4e
+ndk.win64_download=android-ndk-r10c-windows-x86_64.exe
+ndk.win64_bytes=458925419
+ndk.win64_checksum=af8edf5d316e1bf1a5a72e04a9faec41
-ndk.win32_download=android-ndk32-r10b-windows-x86.zip
-ndk.win32_bytes=502720425
-ndk.win32_checksum=9fa4f19bca7edd6eefa63fe788737987
+ndk.win32_download=android-ndk-r10c-windows-x86.exe
+ndk.win32_bytes=433102815
+ndk.win32_checksum=805a04810719886674d3c7bff5eca53f
-ndk.mac64_64_download=android-ndk64-r10b-darwin-x86_64.tar.bz2
-ndk.mac64_64_bytes=346423776
-ndk.mac64_64_checksum=5bae7feed20ebf0762c0baefe6b84b6d
-
-ndk.mac32_64_download=android-ndk64-r10b-darwin-x86.tar.bz2
-ndk.mac32_64_bytes=344052876
-ndk.mac32_64_checksum=4447049ac2b5877176b9b6b1cf3bcdb2
-
-ndk.linux64_64_download=android-ndk64-r10b-linux-x86_64.tar.bz2
-ndk.linux64_64_bytes=358835298
-ndk.linux64_64_checksum=2aa12a0d9a70bcab83e42d010a685136
-
-ndk.linux32_64_download=android-ndk64-r10b-linux-x86.tar.bz2
-ndk.linux32_64_bytes=358060577
-ndk.linux32_64_checksum=b77eb583626d8c7f5c11e49181fd5eac
-
-ndk.win64_64_download=android-ndk64-r10b-windows-x86_64.zip
-ndk.win64_64_bytes=437152652
-ndk.win64_64_checksum=df39185e6c5a4d72eb9fca3f9aaabc46
-
-ndk.win32_64_download=android-ndk64-r10b-windows-x86.zip
-ndk.win32_64_bytes=417290468
-ndk.win32_64_checksum=0f0324cb11f04e8b2641e5422ee39c81
-
-ndk.debug_info_download=android-ndk-r10b-cxx-stl-libs-with-debug-info.zip
-ndk.debug_info_bytes=227302317
-ndk.debug_info_checksum=bed1bb855a41bdb572a804dbf6d45aa6
-
page.title=Android NDK
@jd:body
@@ -407,12 +379,6 @@
$('#Downloads').after($('#download-table'));
</script>
-
-<p>With NDK revision 9 and higher, the release packages have been split to reduce download size.
- The first download for each platform contains the default NDK toolchain. The additional download
- contains legacy NDK toolchains for that platform, which is only required if you are not using
- the current, recommended toolchain for your NDK builds.</p>
-
<h2 id="Revisions">Revisions</h2>
<p>The following sections provide information about releases of the NDK.</p>
@@ -422,6 +388,196 @@
<p>
<a href="#" onclick="return toggleContent(this)"> <img
src="/assets/images/triangle-opened.png" class="toggle-content-img" alt=""
+ >Android NDK, Revision 10c</a> <em>(October 2014)</em>
+ </p>
+ <div class="toggle-content-toggleme">
+ <dl>
+ <dt>Important changes:</dt>
+ <dd>
+ <ul>
+ <li>Made the following changes to download structure:</li>
+ <ul>
+ <li>Each package now contains both the 32- and the 64-bit headers, libraries, and tools for
+ its respective platform.</li>
+ <li>STL libraries with debugging info no longer need be downloaded separately.</li>
+ </ul>
+ <li>Changed everything previously called <code>Android-L</code> to the official release
+ designation: <code>android-21</code>.</li>
+ <li>Updated GCC 4.9 by rebasing to the <code>google</code> branch
+ of the GCC repository. Major differences from the upstream version of GCC 4.9 include:</li>
+
+ <ul>
+ <li>The <code>-O2</code> option now turns on vectorization, without loop peeling but with more
+ aggressive unrolling.</li>
+ <li>Enhancements to FDO and <a href="https://gcc.gnu.org/wiki/LightweightIpo#LIPO_-_Profile_Feedback_Based_Lightweight_IPO">
+ LIPO</a></li>
+ <p>For more detailed information, see <em>Important bug fixes</em> below.</p>
+ </ul>
+
+ <li>Added Clang 3.5 support to all hosts: <code>NDK_TOOLCHAIN_VERSION=clang</code>
+ now picks Clang 3.5. Note that:</li>
+ <ul>
+
+ <li>ARM and x86 default to using the integrated assembler. If this causes issues, use
+ <code>-fno-integrated-as</code> as a workaround.</code>
+ <li>Clang 3.5 issues more warnings for unused flags, such as the <code>-finline-functions</code>
+ option that GCC supports.</li>
+ <p>When migrating from projects using GCC, you can use
+ <code>-Wno-invalid-command-line-argument</code> and <code>-Wno-unused-command-line-argument</code>
+ to ignore the unused flags until you're able decide on what to do with them longer-term.</p>
+
+ </ul>
+ <li>Made it possible to enter ART debugging mode, when debugging on an Android 5.0 device using
+ ART as its virtual machine, by specifying the <code>art-on</code> option. For more information,
+ see <code>prebuilt/common/gdb/common.setup</code> in the directory containing the NDK.</li>
+ <li>Removed support for Clang 3.3.</li>
+ <li>Deprecated GCC 4.6, and may remove it from future releases.</li>
+ <li>Updated mclinker to 2.8 with Identical Code Folding ("ICF") support. Specify ICF using the
+ <code>--icf</code> option.</li>
+ <li>Broadened <code>arm_neon.h</code> support in x86 and x86_64, attaining coverage of ~93% of
+ NEON intrinsics. For more information about NEON support:
+ <ul>
+ <li>Navigate to the NDK Programmer's Guide (<code>docs/Programmers_Guide/html/</code>), and see
+ Architectures and CPUs > Neon.</li>
+ <li>Examine the updated <code>hello-neon</code> sample in <code>samples/</code>.
+ <li>See Intel's guide to <a href="https://software.intel.com/en-us/blogs/2012/12/12/from-arm-neon-to-intel-mmxsse-automatic-porting-solution-tips-and-tricks"> porting from ARM NEON to Intel SSE.</a></li>
+ </ul>
+ <li>Documented support for <code>_FORTIFY_SOURCE</code> in <code>headers/libs/android-21</code>,
+ which appeared in r10 (when <code>android-21</code> was still called <code>Android-L</code>),
+ but had no documentation.</li>
+ </ul>
+ </dd>
+ <dl>
+
+
+ <dt>Important bug fixes:</dt>
+ <dd>
+ <ul>
+ <li>Fixed an internal compiler error with GCC4.9/aarch64 that was causing the following
+ error message (Issue <a href="http://b.android.com/77564">77564</a>):</li>
+<pre>
+internal compiler error: in simplify_const_unary_operation, at simplify-rtx.c:1539
+</pre>
+ <li>Fixed incorrect code generation from GCC4.9/arm. (Issue
+ <a href="http://b.android.com/77567">77567<a>)</li>
+ <li>Fixed an internal compiler error with GCC4.9/mips involving inline-assembly. (Issue
+ <a href="http://b.android.com/77568">77568</a>)</li>
+ <li>Fixed incorrect code that GCC4.9/arm was generating for <code>x = (cond) ? y : x</code>.
+ (Issue <a href="http://b.android.com/77569">77569</a>)</li>
+ <li>Fixed GCC4.9/aarch64 and Clang3.5/aarch64 to work around the
+ <a href="http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20141006/116322.html">
+ Cortex-A53 erratum (835769)</a> by default. Disable the workaround by specifying
+ <code>-mno-fix-cortex-a53-835769</code>.</li>
+ </ul>
+ </dd>
+
+
+ <dt>Other bug fixes:</dt>
+ <dd>
+ <ul>
+ <li>Made the following header and library fixes to <code>android-21</code>:
+ <ul>
+
+ <li>Added more TV keycodes: <code>android/keycodes.h</code></li>
+ <li>Added more constants and six new sensor functions to <code>android/sensor.h</code>:
+ <code>ASensorManager_getDefaultSensorEx</code>, <code>ASensor_getFifoMaxEventCount</code>,
+ <code>ASensor_getFifoReservedEventCount</code>, <code>ASensor_getStringType</code>,
+ <code>ASensor_getReportingMode</code>, and <code>ASensor_isWakeUpSensor</code>.</li>
+ <li>Fixed <code>stdatomic.h</code> to improve compatibility with GCC 4.6, and provide support
+ for the <code><atomic></code> header.</li>
+ <li>Added <code>sys/ucontext.h</code> and <code>sys/user.h</code> to all API levels. The
+ <code>signal.h</code> header now includes <code><sys/ucontext.h></code>. You may
+ remove any existing definition of <code>struct ucontext</code>.</li>
+ <li>Added <code>posix_memalign</code> to API levels 17, 18, and 19.</li>
+ <li>Added the following functions to all architectures:
+ <code>android_set_abort_message</code>, <code>posix_fadvise</code>,
+ <code>posix_fadvise64</code>, <code>pthread_gettid_np</code>.</li>
+ <li>Added the required permissions to the <code>native-media/AndroidManifest.xml</code>
+ sample.
+ (Issue <a href="https://android-review.googlesource.com/#/c/106640/">106640</a>)</li>
+ <li>Added <code>clock_nanosleep</code> and <code>clock_settime</code> to API level 21. (Issue
+ <a href="http://b.android.com/77372">77372</a>)
+ <li>Removed the following symbols from all architectures:
+ <code>get_malloc_leak_info</code>, <code>free_malloc_leak_info</code>,
+ <code>__srget</code>, <code>__swbuf</code>, <code>__srefill</code>, <code>__swsetup</code>,
+ <code>__sdidinit</code>, <code>__sflags</code>, <code>__sfp</code>,
+ <code>__sinit</code>, <code>__smakebuf</code>, <code>__sflush</code>, <code>__sread</code>,
+ <code>__swrite</code>, <code>__sseek</code>, <code>__sclose</code>,
+ <code>_fwalk</code>, <code>__sglue</code>, <code>__get_thread</code>, <code>__wait4</code>,
+ <code>__futex_wake</code>, <code>__open</code>, <code>__get_tls</code>,
+ <code>__getdents64</code>, and <code>dlmalloc</code>.</li>
+ <li>Removed the following functions from the 64-bit architectures: <code>basename_r</code>,
+ <code>dirname_r</code>, <code>__isthreaded</code>, <code>_flush_cache</code> (mips64).</li>
+ <li>Removed the following function from the 32-bit architectures:
+ <code>__signalfd4</code>.</li>
+ <li>Changed the type of the third argument from <code>size_t</code> to <code>int</code> in
+ the following functions: <code>strtoll_l</code>, <code>strtoull_l</code>,
+ <code>wcstoll_l</code>, and <code>wcstoull_l</code>.</li>
+ <li>Restored the following functions to the 64-bit architecture: <code>arc4random</code>,
+ <code>arc4random_buf</code>, and <code>arc4random_uniform</code>.</li>
+ <li>Moved <code>cxa_*</code> and the <code>new</code> and <code>delete</code> operators back
+ to <code>libstdc++.so</code>. This change restores r9d behavior; previous versions of r10
+ contained dummy files.</li>
+
+ </ul>
+ <li>Restored MXU support in GCC 4.8 and 4.9 for mips. This support had been absent from
+ r10 and r10b because those versions of GCC had been compiled with binutils-2.24, which did
+ not support MXU. It now does.</li>
+ <li>Fixed <code>--toolchain=</code> in <code>make-standalone-toolchain.sh</code> so that it
+ now properly supports use of a suffix specifying a version of Clang.</li>
+ <li>Fixed the libc++/armeabi <code>strtod()</code> functions.</li>
+ <li>Made fixes to NDK documentation in <code>docs/</code>.</li>
+ </ul>
+ </dd>
+
+ <dt>Other changes:</dt>
+ <dd>
+ <ul>
+ <li>Enhanced <code>cpu-features</code> to detect ARMv8 support for the following
+ instruction sets: AES, CRC32, SHA2, SHA1, and 64-bit PMULL/PMULL2. (Issue
+ <a href="https://android-review.googlesource.com/#/c/106360/">106360</a>)</li>
+
+ <li>Modified ndk-build to use <code>*-gcc-ar</code>, which is available in GCC 4.8, GCC 4.9, and
+ Clang. Clang specifies it, instead of <code>*-ar</code>. This setting brings improved LTO
+ support.</li>
+
+ <li>Removed the <code>include-fixed/linux/a.out.h</code> and
+ <code>include-fixed/linux/compiler.h</code> headers from the GCC compiler.
+ (Issue <a href ="http://b.android.com/73728">73728</a>)</li>
+
+ <li>Fixed an issue related to <code>-flto</code> with GCC 4.8 on Mac OS X. The error message
+ read:</li>
+
+ <pre>
+.../ld: error: .../libexec/gcc/arm-linux-androideabi/4.9/liblto_plugin.so
+Symbol not found: _environ
+</pre>
+
+ <li>Fixed a typo in <code>build-binary.mk.</code> (Issue
+ <a href="http://b.android.com/76992">76992</a>)</li>
+ </ul>
+ </dd>
+
+ <dt>Important known issues:</dt>
+ <dd>
+ <ul>
+ <li>Specifying -Os (<code>-fauto-profile</code>) in GCC4.9 may cause crashing.
+ (Issue <a href="http://b.android.com/77571">77571</a>)</li>
+ </ul>
+ </dd>
+
+ </dl>
+ </div>
+</div>
+
+
+
+
+
+<div class="toggle-content closed">
+ <p>
+ <a href="#" onclick="return toggleContent(this)"> <img
+ src="/assets/images/triangle-closed.png" class="toggle-content-img" alt=""
>Android NDK, Revision 10b</a> <em>(September 2014)</em>
</p>
<div class="toggle-content-toggleme">
@@ -484,20 +640,10 @@
</dd>
</ul>
-
-
</dl>
</div>
</div>
-
-
-
-
-
-
-
-
<div class="toggle-content closed">
<p>
<a href="#" onclick="return toggleContent(this)"> <img
@@ -3555,18 +3701,38 @@
Software Requirements</a>
for the NDK, if you haven't already.</p>
- <p>To install the NDK, follow these steps:</p>
-
- <ol>
- <li>From the table at the top of this page, select the NDK package that is appropriate for your
- development computer and download the package.</li>
-
- <li>Uncompress the NDK download package using tools available on your computer. When
- uncompressed, the NDK files are contained in a directory called
+ <p>To install the NDK, first download the appropriate package from the table at the top of this
+ page. Then, follow the procedure for your development platform:</p>
+ <ul>
+ <li>On Linux and Mac OS X (Darwin):
+ <ul>
+ <ol>
+ <li>Download the appropriate package from this page.</li>
+ <li>Open a terminal window.</li>
+ <li>Go to the directory to which you downloaded the package.</li>
+ <li>Run <code>chmod a+x</code> on the downloaded package.</li>
+ <li>Execute the package. For example:</li>
+ <pre>
+ndk$ chmod a+x android-ndk-r10c-darwin-x86_64.bin
+ndk$ ./android-ndk-r10c-darwin-x86_64.bin
+ </pre>
+ <p>The folder containing the NDK extracts itself.</p>
+ <p>Note that you can also use a program like 7z to extract the package.</p>
+ </ol>
+ </ul>
+ <li>On Windows:</li>
+ <ul>
+ <ol>
+ <li>Download the appropriate package from this page.</li>
+ <li>Navigate to the folder to which you downloaded the package.</li>
+ <li>Double-click the downloaded file. The folder containing the NDK extracts itself.</li>
+ </ol>
+ </ul>
+ </ul>When uncompressed, the NDK files are contained in a directory called
<code>android-ndk-<version></code>. You can rename the NDK directory if necessary and you
can move it to any location on your computer. This documentation refers to the NDK directory as
- <code><ndk></code>.</li>
- </ol>
+ <code><ndk></code>.
+
<p>You are now ready to start working with the NDK.</p>
@@ -3689,7 +3855,7 @@
<h3 id="Tools">Development tools</h3>
- <p>The NDK includes a set of cross-toolchains (compilers, linkers, etc..) that can generate
+ <p>The NDK includes a set of cross-toolchains (compilers, linkers, etc.) that can generate
native ARM binaries on Linux, OS X, and Windows (with Cygwin) platforms.</p>
<p>It provides a set of system headers for stable native APIs that are guaranteed to be supported
diff --git a/docs/html/tools/sdk/tools-notes.jd b/docs/html/tools/sdk/tools-notes.jd
index 20388be..3e3cb4b 100644
--- a/docs/html/tools/sdk/tools-notes.jd
+++ b/docs/html/tools/sdk/tools-notes.jd
@@ -13,7 +13,7 @@
of the SDK Tools, use the <em>Android SDK Manager</em> to get the
update, rather than downloading a new SDK starter package. For more information
about how to update, see <a
-href="{@docRoot}sdk/exploring.html#UpdatingComponents">Exploring the SDK</a>.</p>
+href="{@docRoot}tools/help/sdk-manager.html">SDK Manager</a>.</p>
<h2 id="notes">Revisions</h2>
diff --git a/docs/html/tools/support-library/features.jd b/docs/html/tools/support-library/features.jd
index 8311097..44c5045 100644
--- a/docs/html/tools/support-library/features.jd
+++ b/docs/html/tools/support-library/features.jd
@@ -139,10 +139,10 @@
<p>The Gradle build script dependency identifier for this library is as follows:</p>
<pre>
-com.android.support:support-v4:18.0.+
+com.android.support:support-v4:21.0.+
</pre>
-<p>This dependency notation specifies the release version 18.0.0 or higher.</p>
+<p>This dependency notation specifies the release version 21.0.0 or higher.</p>
<h2 id="v7">v7 Support Libraries</h2>
@@ -237,10 +237,10 @@
<p>The Gradle build script dependency identifier for this library is as follows:</p>
<pre>
-com.android.support:gridlayout-v7:18.0.+
+com.android.support:gridlayout-v7:21.0.+
</pre>
-<p>This dependency notation specifies the release version 18.0.0 or higher.</p>
+<p>This dependency notation specifies the release version 21.0.0 or higher.</p>
<h3 id="v7-mediarouter">v7 mediarouter library</h3>
@@ -271,10 +271,10 @@
<p>If you are using Android Studio, all you need to do is specify the Gradle build
script dependency identifier <code>com.android.support:support-v7-mediarouter:<revision></code>,
-where "18.0.0" is the minimum revision at which the library is available. For example:</p>
+where "<revision>" is the minimum revision at which the library is available. For example:</p>
<pre>
-com.android.support:mediarouter-v7:18.0.+
+com.android.support:mediarouter-v7:21.0.+
</pre>
<p class="caution">The v7 mediarouter library APIs introduced in Support Library
diff --git a/docs/html/training/articles/wear-location-detection.jd b/docs/html/training/articles/wear-location-detection.jd
new file mode 100644
index 0000000..b0d9755
--- /dev/null
+++ b/docs/html/training/articles/wear-location-detection.jd
@@ -0,0 +1,375 @@
+page.title=Detecting Location on Android Wear
+page.tags="gps"
+
+page.article=true
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+<h2>In this document</h2>
+<ol class="nolist">
+ <li><a href="#Connect">Connect to Google Play Services</a></li>
+ <li><a href="#Request">Request Location Updates</a></li>
+ <li><a href="#DetectGPS">Detect On-Board GPS</a></li>
+ <li><a href="#Disconnection">Handle Disconnection Events</a></li>
+ <li><a href="#Notify">Handle Location Not Found</a></li>
+ <li><a href="#Synchronize">Synchronize Data</a></li>
+</ol>
+<!-- Required platform, tools, add-ons, devices, knowledge, etc. -->
+<h2>Dependencies and prerequisites</h2>
+<ul>
+ <li>Android 4.3 (API Level 18) or higher on the handset device</li>
+ <li><a href="{@docRoot}google/play-services/index.html">Google Play services</a> 6.1 or higher</li>
+ <li>An Android Wear device</li>
+</ul>
+<h2>See also</h2>
+<ul>
+ <li><a href="{@docRoot}training/location/index.html">Making Your App Location-Aware
+ </a></li>
+</ul>
+</div></div>
+
+<p>Location awareness on wearable devices enables you to create apps that give users a better
+understanding of their geographic position, movement and what's around them. With the small form
+factor and glanceable nature of a wearable device, you can build low-friction apps that record and
+respond to location data.</p>
+
+<p>Some wearable devices include a GPS sensor that can retrieve location data without another
+tethered device. However, when you request location data in a wearable app, you don't have to worry
+about where the location data originates; the system retrieves the location updates using the most
+power-efficient method. Your app should be able to handle loss of location data, in case the wear
+device loses connection with its paired device and does not have a built-in GPS sensor.</p>
+
+<p>This document shows you how to check for on-device location sensors, receive location data, and
+monitor tethered data connections.</p>
+
+<p class="note"><b>Note:</b> The article assumes that you know how to use the Google Play services
+API to retrieve location data. For more information, see <a href="{@docRoot}training/
+location/index.html">Making Your App Location-Aware</a>.</p>
+
+<h2 id="Connect">Connect to Google Play Services</h2>
+
+<p>Location data on wearable devices is obtained though the Google Play services location APIs. You
+use the <a href="{@docRoot}reference/com/google/android/gms/location/FusedLocationProviderApi.html">
+<code>FusedLocationProviderApi</code></a> and its accompanying classes to obtain this data.
+To access location services, create an instance of
+<a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html">
+<code>GoogleApiClient</code></a>, which is
+the main entry point for any of the Google Play services APIs.
+</p>
+
+<p class="caution"><b>Caution:</b> Do not use the existing <a href="{@docRoot}reference/android/location/package-summary.html">Location</a>
+APIs in the Android framework. The best practice for retrieving location updates is through the
+Google Play services API as outlined in this article.</p>
+
+<p>To connect to Google Play services, configure your app to create an instance of
+<a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html">
+<code>GoogleApiClient</code></a>:</p>
+
+<ol>
+ <li>Create an activity that specifies an implementation for the interfaces <a
+href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.ConnectionCallbacks.html"
+>{@code ConnectionCallbacks}</a>, <a href="{@docRoot}reference/com/google/android/gms/common/api/
+GoogleApiClient.OnConnectionFailedListener.html">{@code OnConnectionFailedListener}</a>, and <a
+href="{@docRoot}reference/com/google/android/gms/location/LocationListener.html">{@code
+LocationListener}</a>.</li>
+ <li>In your activity's {@link android.app.Activity#onCreate onCreate()} method, create an instance
+of <a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html"><code>
+GoogleApiClient</code></a> and add the Location service.
+ </li>
+ <li>To gracefully manage the lifecycle of the connection, call <a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html#connect()">
+ {@code connect()}</a> in the {@link android.app.Activity#onResume onResume()} method and
+ <a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.html#disconnect()">
+ {@code disconnect()}</a> in the {@link android.app.Activity#onPause onPause()} method.
+ </li>
+</ol>
+
+<p>The following code example shows an implementation of an activity that implements the
+<a href="{@docRoot}reference/com/google/android/gms/location/LocationListener.html">
+{@code LocationListener}</a> interface:</p>
+
+<pre>
+public class WearableMainActivity extends Activity implements
+ GoogleApiClient.ConnectionCallbacks,
+ GoogleApiClient.OnConnectionFailedListener,
+ LocationListener {
+
+ private GoogleApiClient mGoogleApiClient;
+ ...
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ ...
+ mGoogleApiClient = new GoogleApiClient.Builder(this)
+ .addApi(LocationServices.API)
+ .addApi(Wearable.API) // used for data layer API
+ .addConnectionCallbacks(this)
+ .addOnConnectionFailedListener(this)
+ .build();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mGoogleApiClient.connect();
+ ...
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ ...
+ mGoogleApiClient.disconnect();
+ }
+}
+</pre>
+
+<p>For more information on connecting to Google Play services, see <a href="{@docRoot}google/auth
+/api-client.html">Accessing Google APIs</a>.</p>
+
+<h2 id="Request">Request Location Updates</h2>
+
+<p>After your app has connected to the Google Play services API, it is ready to start receiving
+location updates. When the system invokes the
+<a href="{@docRoot}reference/com/google/android/gms/common/api/GoogleApiClient.ConnectionCallbacks.html#onConnected(android.os.Bundle)">
+<code>onConnected()</code></a> callback for your client, you build the location data request as
+follows:</p>
+
+<ol>
+ <li>Create a <a
+href="{@docRoot}reference/com/google/android/gms/location/LocationRequest.html"
+>{@code LocationRequest}</a> object and set any options using methods like <a
+href="{@docRoot}reference/com/google/android/gms/location/LocationRequest.html#setPriority(int)"
+>{@code setPriority()}</a>.
+ </li>
+ <li>Request location updates using <a href="{@docRoot}reference/com/google/android/gms/location/FusedLocationProviderApi.html#requestLocationUpdates(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.location.LocationRequest, com.google.android.gms.location.LocationListener)">
+ <code>requestLocationUpdates()</code></a>.
+ </li>
+ <li>Remove location updates using <a href="{@docRoot}reference/com/google/android/gms/location/FusedLocationProviderApi.html#removeLocationUpdates(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.location.LocationListener)">
+ <code>removeLocationUpdates()</code></a> in the {@link android.app.Activity#onPause
+ onPause()} method.
+ </li>
+</ol>
+
+<p>The following example shows how to retrieve and remove location updates:</p>
+
+<pre>
+@Override
+public void onConnected(Bundle bundle) {
+ LocationRequest locationRequest = LocationRequest.create()
+ .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
+ .setInterval(UPDATE_INTERVAL_MS)
+ .setFastestInterval(FASTEST_INTERVAL_MS);
+
+ LocationServices.FusedLocationApi
+ .requestLocationUpdates(mGoogleApiClient, locationRequest, this)
+ .setResultCallback(new ResultCallback<Status>() {
+
+ @Override
+ public void onResult(Status status) {
+ if (status.getStatus().isSuccess()) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "Successfully requested location updates");
+ }
+ } else {
+ Log.e(TAG,
+ "Failed in requesting location updates, "
+ + "status code: "
+ + status.getStatusCode()
+ + ", message: "
+ + status.getStatusMessage());
+ }
+ }
+ });
+}
+
+@Override
+protected void onPause() {
+ super.onPause();
+ if (mGoogleApiClient.isConnected()) {
+ LocationServices.FusedLocationApi
+ .removeLocationUpdates(mGoogleApiClient, this);
+ }
+ mGoogleApiClient.disconnect();
+}
+
+@Override
+public void onConnectionSuspended(int i) {
+ if (Log.isLoggable(TAG, Log.DEBUG)) {
+ Log.d(TAG, "connection to location client suspended");
+ }
+}
+
+</pre>
+
+<p>Now that you have enabled location updates, the system calls the {@link android.location.LocationListener#onLocationChanged
+onLocationChanged()} method with the updated location at the interval specified in <a
+href="{@docRoot}reference/com/google/android/gms/location/LocationRequest.html#setInterval(long)">
+{@code setInterval()}</a>
+</p>
+
+<h2 id="DetectGPS">Detect On-Board GPS</h2>
+
+<p>Not all wearables have a GPS sensor. If your user goes out for a run and leaves their phone at
+home, your wearable app cannot receive location data through a tethered connection. If the
+wearable device does not have a sensor, you should detect this situation and warn the user that
+location functionality is not available.
+
+<p>To determine whether your Android Wear device has a built-in GPS sensor, use the
+{@link android.content.pm.PackageManager#hasSystemFeature hasSystemFeature()}
+method. The following code detects whether the device has built-in GPS when you start an activity:
+</p>
+
+<pre>
+
+protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.main_activity);
+ if (!hasGps()) {
+ Log.d(TAG, "This hardware doesn't have GPS.");
+ // Fall back to functionality that does not use location or
+ // warn the user that location function is not available.
+ }
+
+ ...
+}
+
+private boolean hasGps() {
+ return getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS);
+}
+</pre>
+
+<h2 id="Disconnection">Handle Disconnection Events</h2>
+
+<p>Wearable devices relying on a tethered connection for location data may lose their connections
+abruptly. If your wearable app expects a constant stream of data, you must handle the
+disconnection based upon where that data is interrupted or unavailable. On a wearable device with no
+onboard GPS sensor, loss of location data occurs when the device loses its tethered data connection.
+</p>
+
+<p>In cases where your app depends on a tethered data connection for location data and the wear
+device does not have a GPS sensor, you should detect the loss of that connection, warn the user, and
+gracefully degrade the functionality of your app.</p>
+
+<p>To detect the loss of a tethered data connection:</p>
+
+<ol>
+ <li>Extend a <a href="{@docRoot}reference/com/google/android/gms/wearable/WearableListenerService.html">
+ <code>WearableListenerService</code></a> that lets you listen for important data layer events.
+ </li>
+ <li>Declare an intent filter in your Android manifest to notify the system about your
+ <a href="{@docRoot}reference/com/google/android/gms/wearable/WearableListenerService.html"><code>
+ WearableListenerService</code></a>.
+ This filter allows the system to bind your service as needed.
+<pre>
+<service android:name=".NodeListenerService">
+ <intent-filter>
+ <action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
+ </intent-filter>
+</service>
+</pre>
+ </li>
+ <li>Implement the <a href="{@docRoot}reference/com/google/android/gms/wearable/WearableListenerService.html#onPeerDisconnected(com.google.android.gms.wearable.Node)">
+ <code>onPeerDisconnected()</code></a> method and handle cases of whether or not the device has
+ built-in
+ GPS.
+<pre>
+public class NodeListenerService extends WearableListenerService {
+
+ private static final String TAG = "NodeListenerService";
+
+ @Override
+ public void onPeerDisconnected(Node peer) {
+ Log.d(TAG, "You have been disconnected.");
+ if(!hasGPS()) {
+ // Notify user to bring tethered handset
+ // Fall back to functionality that does not use location
+ }
+ }
+ ...
+}
+</pre>
+ </li>
+</ol>
+
+For more information, read the <a href="{@docRoot}training/wearables/data-layer/events.html#Listen">
+Listen for Data Layer Events</a> guide.
+
+<h2 id="Notify">Handle Location Not Found</h2>
+
+<p>When the GPS signal is lost, you can still retrieve the last known location using
+<a href="{@docRoot}reference/com/google/android/gms/location/FusedLocationProviderApi.html#getLastLocation(com.google.android.gms.common.api.GoogleApiClient)">
+<code>getLastLocation()</code></a>. This method can be helpful in situations where you are unable to
+get a GPS fix, or when your wearable doesn't have built-in GPS and loses its connection with the
+phone.</p>
+
+<p>The following code uses <a href="{@docRoot}reference/com/google/android/gms/location/FusedLocationProviderApi.html#getLastLocation(com.google.android.gms.common.api.GoogleApiClient)">
+<code>getLastLocation()</code></a> to retrieve the last known location if available:
+</p>
+
+<pre>
+Location location = LocationServices.FusedLocationApi
+ .getLastLocation(mGoogleApiClient);
+</pre>
+
+<h2 id="Synchronize">Synchronize Data</h2>
+
+<p>If your wearable app records data using the built-in GPS, you may want to synchronize
+the location data with the handset. With the {@link android.location.LocationListener}, you
+implement the {@link android.location.LocationListener#onLocationChanged onLocationChanged()}
+method to detect and record the location as it changes.
+
+<p>The following code for wearable apps detects when the location changes and uses the data layer
+API to store the data for later retrieval by your phone app:</p>
+
+<pre>
+@Override
+public void onLocationChanged(Location location) {
+ ...
+ addLocationEntry(location.getLatitude(), location.getLongitude());
+
+}
+
+private void addLocationEntry(double latitude, double longitude) {
+ if (!mSaveGpsLocation || !mGoogleApiClient.isConnected()) {
+ return;
+ }
+
+ mCalendar.setTimeInMillis(System.currentTimeMillis());
+
+ // Set the path of the data map
+ String path = Constants.PATH + "/" + mCalendar.getTimeInMillis();
+ PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(path);
+
+ // Set the location values in the data map
+ putDataMapRequest.getDataMap()
+ .putDouble(Constants.KEY_LATITUDE, latitude);
+ putDataMapRequest.getDataMap()
+ .putDouble(Constants.KEY_LONGITUDE, longitude);
+ putDataMapRequest.getDataMap()
+ .putLong(Constants.KEY_TIME, mCalendar.getTimeInMillis());
+
+ // Prepare the data map for the request
+ PutDataRequest request = putDataMapRequest.asPutDataRequest();
+
+ // Request the system to create the data item
+ Wearable.DataApi.putDataItem(mGoogleApiClient, request)
+ .setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
+ @Override
+ public void onResult(DataApi.DataItemResult dataItemResult) {
+ if (!dataItemResult.getStatus().isSuccess()) {
+ Log.e(TAG, "Failed to set the data, "
+ + "status: " + dataItemResult.getStatus()
+ .getStatusCode());
+ }
+ }
+ });
+}
+</pre>
+
+<p>For more information on how to use the Data Layer API, see the <a href="{@docRoot}training/
+wearables/data-layer/index.html">Sending and Syncing Data</a>
+guide.</p>
diff --git a/docs/html/training/basics/firstapp/building-ui.jd b/docs/html/training/basics/firstapp/building-ui.jd
index 179b3ac..c082642 100644
--- a/docs/html/training/basics/firstapp/building-ui.jd
+++ b/docs/html/training/basics/firstapp/building-ui.jd
@@ -1,12 +1,8 @@
page.title=Building a Simple User Interface
-parent.title=Building Your First App
-parent.link=index.html
-
trainingnavtop=true
-previous.title=Running Your App
-previous.link=running-app.html
-next.title=Starting Another Activity
-next.link=starting-activity.html
+
+page.tags=ui, views, layouts, widgets, string resources
+helpoutsWidget=true
@jd:body
diff --git a/docs/html/training/basics/firstapp/creating-project.jd b/docs/html/training/basics/firstapp/creating-project.jd
index c4cb362..418eb68 100644
--- a/docs/html/training/basics/firstapp/creating-project.jd
+++ b/docs/html/training/basics/firstapp/creating-project.jd
@@ -1,6 +1,7 @@
page.title=Creating an Android Project
-parent.title=Building Your First App
-parent.link=index.html
+
+page.tags=eclipse adt, sdk tools, project setup
+helpoutsWidget=true
trainingnavtop=true
next.title=Running Your App
diff --git a/docs/html/training/basics/firstapp/index.jd b/docs/html/training/basics/firstapp/index.jd
index 1b49096..ac8e64a 100644
--- a/docs/html/training/basics/firstapp/index.jd
+++ b/docs/html/training/basics/firstapp/index.jd
@@ -3,8 +3,9 @@
trainingnavtop=true
startpage=true
-next.title=Creating an Android Project
-next.link=creating-project.html
+
+page.tags=sdk tools
+helpoutsWidget=true
@jd:body
@@ -47,6 +48,3 @@
<p>This class uses a tutorial format that incrementally builds a small Android app that teaches
you some fundamental concepts about Android development, so it's important that you follow each
step.</p>
-
-<p><strong><a href="creating-project.html">Start the first lesson ›</a></strong></p>
-
diff --git a/docs/html/training/basics/firstapp/running-app.jd b/docs/html/training/basics/firstapp/running-app.jd
index 23cedba..96b7172 100644
--- a/docs/html/training/basics/firstapp/running-app.jd
+++ b/docs/html/training/basics/firstapp/running-app.jd
@@ -3,10 +3,9 @@
parent.link=index.html
trainingnavtop=true
-previous.title=Creating a Project
-previous.link=creating-project.html
-next.title=Building a Simple User Interface
-next.link=building-ui.html
+
+page.tags=emulator
+helpoutsWidget=true
@jd:body
diff --git a/docs/html/training/basics/firstapp/starting-activity.jd b/docs/html/training/basics/firstapp/starting-activity.jd
index 27d2c10..f9dcba4 100644
--- a/docs/html/training/basics/firstapp/starting-activity.jd
+++ b/docs/html/training/basics/firstapp/starting-activity.jd
@@ -3,8 +3,9 @@
parent.link=index.html
trainingnavtop=true
-previous.title=Building a Simpler User Interface
-previous.link=building-ui.html
+
+page.tags=input events, intents, activity lifecycle
+helpoutsWidget=true
@jd:body
diff --git a/docs/html/training/material/animations.jd b/docs/html/training/material/animations.jd
new file mode 100644
index 0000000..e8291b8
--- /dev/null
+++ b/docs/html/training/material/animations.jd
@@ -0,0 +1,548 @@
+page.title=Defining Custom Animations
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+<h2>This lesson teaches you to</h2>
+<ol>
+ <li><a href="#Touch">Customize Touch Feedback</a></li>
+ <li><a href="#Reveal">Use the Reveal Effect</a></li>
+ <li><a href="#Transitions">Customize Activity Transitions</a></li>
+ <li><a href="#ViewState">Animate View State Changes</a></li>
+ <li><a href="#AnimVector">Animate Vector Drawables</a></li>
+</ol>
+<h2>You should also read</h2>
+<ul>
+ <li><a href="http://www.google.com/design/spec">Material design specification</a></li>
+ <li><a href="{@docRoot}design/material/index.html">Material design on Android</a></li>
+</ul>
+</div>
+</div>
+
+
+<p>Animations in material design give users feedback on their actions and provide visual
+continuity as users interact with your app. The material theme provides some default animations
+for buttons and activity transitions, and Android 5.0 (API level 21) and above lets you customize
+these animations and create new ones:</p>
+
+<ul>
+<li>Touch feedback</li>
+<li>Circular Reveal</li>
+<li>Activity transitions</li>
+<li>Curved motion</li>
+<li>View state changes</li>
+</ul>
+
+
+<h2 id="Touch">Customize Touch Feedback</h2>
+
+<p>Touch feedback in material design provides an instantaneous visual confirmation at the
+point of contact when users interact with UI elements. The default touch feedback animations
+for buttons use the new {@link android.graphics.drawable.RippleDrawable} class, which transitions
+between different states with a ripple effect.</p>
+
+<p>In most cases, you should apply this functionality in your view XML by specifying the view
+background as:</p>
+
+<ul>
+<li><code>?android:attr/selectableItemBackground</code> for a bounded ripple</li>
+<li><code>?android:attr/selectableItemBackgroundBorderless</code> for a ripple that extends beyond
+the view</li>
+</ul>
+
+<p class="note"><strong>Note:</strong> <code>selectableItemBackgroundBorderless</code> is a new
+attribute introduced in API level 21.</p>
+
+
+<p>Alternatively, you can define a {@link android.graphics.drawable.RippleDrawable}
+as an XML resource using the <code>ripple</code> element.</p>
+
+<p>You can assign a color to {@link android.graphics.drawable.RippleDrawable} objects. To change
+the default touch feedback color, use the theme's <code>android:colorControlHighlight</code>
+attribute.</p>
+
+<p>For more information, see the API reference for the {@link
+android.graphics.drawable.RippleDrawable} class.</p>
+
+
+<h2 id="Reveal">Use the Reveal Effect</h2>
+
+<p>Reveal animations provide users visual continuity when you show or hide a group of UI
+elements. The {@link android.view.ViewAnimationUtils#createCircularReveal
+ViewAnimationUtils.createCircularReveal()} method enables you to animate a clipping circle to
+reveal or hide a view.</p>
+
+<p>To reveal a previously invisible view using this effect:</p>
+
+<pre>
+// previously invisible view
+View myView = findViewById(R.id.my_view);
+
+// get the center for the clipping circle
+int cx = (myView.getLeft() + myView.getRight()) / 2;
+int cy = (myView.getTop() + myView.getBottom()) / 2;
+
+// get the final radius for the clipping circle
+int finalRadius = myView.getWidth();
+
+// create and start the animator for this view
+// (the start radius is zero)
+Animator anim =
+ ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius);
+anim.start();
+</pre>
+
+<p>To hide a previously visible view using this effect:</p>
+
+<pre>
+// previously visible view
+final View myView = findViewById(R.id.my_view);
+
+// get the center for the clipping circle
+int cx = (myView.getLeft() + myView.getRight()) / 2;
+int cy = (myView.getTop() + myView.getBottom()) / 2;
+
+// get the initial radius for the clipping circle
+int initialRadius = myView.getWidth();
+
+// create the animation (the final radius is zero)
+Animator anim =
+ ViewAnimationUtils.createCircularReveal(myView, cx, cy, initialRadius, 0);
+
+// make the view invisible when the animation is done
+anim.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ myView.setVisibility(View.INVISIBLE);
+ }
+});
+
+// start the animation
+anim.start();
+</pre>
+
+
+<h2 id="Transitions">Customize Activity Transitions</h2>
+
+<!-- shared transition video -->
+<div style="width:290px;margin-left:35px;float:right">
+ <div class="framed-nexus5-port-span-5">
+ <video class="play-on-hover" autoplay="">
+ <source src="{@docRoot}design/material/videos/ContactsAnim.mp4">
+ <source src="{@docRoot}design/material/videos/ContactsAnim.webm">
+ <source src="{@docRoot}design/material/videos/ContactsAnim.ogv">
+ </video>
+ </div>
+ <div style="font-size:10pt;margin-left:20px;margin-bottom:30px">
+ <p class="img-caption" style="margin-top:3px;margin-bottom:10px"><strong>Figure 1</strong> - A
+ transition with shared elements.</p>
+ <em>To replay the movie, click on the device screen</em>
+ </div>
+</div>
+
+<p>Activity transitions in material design apps provide visual connections between different states
+through motion and transformations between common elements. You can specify custom animations for
+enter and exit transitions and for transitions of shared elements between activities.</p>
+
+<ul>
+<li>An <strong>enter</strong> transition determines how views in an activity enter the scene.
+For example, in the <em>explode</em> enter transition, the views enter the scene from the outside
+and fly in towards the center of the screen.</li>
+
+<li>An <strong>exit</strong> transition determines how views in an activity exit the scene. For
+ example, in the <em>explode</em> exit transition, the views exit the scene away from the
+center.</li>
+
+<li>A <strong>shared elements</strong> transition determines how views that are shared between
+two activities transition between these activities. For example, if two activities have the same
+image in different positions and sizes, the <em>changeImageTransform</em> shared element transition
+translates and scales the image smoothly between these activities.</li>
+</ul>
+
+<p>Android 5.0 (API level 21) supports these enter and exit transitions:</p>
+
+<ul>
+<li><em>explode</em> - Moves views in or out from the center of the scene.</li>
+<li><em>slide</em> - Moves views in or out from one of the edges of the scene.</li>
+<li><em>fade</em> - Adds or removes a view from the scene by changing its opacity.</li>
+</ul>
+
+<p>Any transition that extends the {@link android.transition.Visibility} class is supported
+as an enter or exit transition. For more information, see the API reference for the
+{@link android.transition.Transition} class.</p>
+
+<p>Android 5.0 (API level 21) also supports these shared elements transitions:</p>
+
+<ul>
+<li><em>changeBounds</em> - Animates the changes in layout bounds of target views.</li>
+<li><em>changeClipBounds</em> - Animates the changes in clip bounds of target views.</li>
+<li><em>changeTransform</em> - Animates the changes in scale and rotation of target views.</li>
+<li><em>changeImageTransform</em> - Animates changes in size and scale of target images.</li>
+</ul>
+
+<p>When you enable activity transitions in your app, the default cross-fading transition is
+activated between the entering and exiting activities.</p>
+
+<img src="{@docRoot}training/material/images/SceneTransition.png" alt="" width="600" height="405"
+ style="margin-top:20px"/>
+<p class="img-caption">
+ <strong>Figure 2</strong> - A scene transition with one shared element.
+</p>
+
+<h3>Specify custom transitions</h3>
+
+<p>First, enable window content transitions with the <code>android:windowContentTransitions</code>
+attribute when you define a style that inherits from the material theme. You can also specify
+enter, exit, and shared element transitions in your style definition:</p>
+
+<pre>
+<style name="BaseAppTheme" parent="android:Theme.Material">
+ <!-- enable window content transitions -->
+ <item name="android:windowContentTransitions">true</item>
+
+ <!-- specify enter and exit transitions -->
+ <item name="android:windowEnterTransition">@transition/explode</item>
+ <item name="android:windowExitTransition">@transition/explode</item>
+
+ <!-- specify shared element transitions -->
+ <item name="android:windowSharedElementEnterTransition">
+ @transition/change_image_transform</item>
+ <item name="android:windowSharedElementExitTransition">
+ @transition/change_image_transform</item>
+</style>
+</pre>
+
+<p>The <code>change_image_transform</code> transition in this example is defined as follows:</p>
+
+<pre>
+<!-- res/transition/change_image_transform.xml -->
+<!-- (see also Shared Transitions below) -->
+<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
+ <changeImageTransform/>
+</transitionSet>
+</pre>
+
+<p>The <code>changeImageTransform</code> element corresponds to the
+{@link android.transition.ChangeImageTransform} class. For more information, see the API
+reference for {@link android.transition.Transition}.</p>
+
+<p>To enable window content transitions in your code instead, call the
+{@link android.view.Window#requestFeature Window.requestFeature()} method:</p>
+
+<pre>
+// inside your activity (if you did not enable transitions in your theme)
+getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
+
+// set an exit transition
+getWindow().setExitTransition(new Explode());
+</pre>
+
+<p>To specify transitions in your code, call these methods with a {@link
+android.transition.Transition} object:</p>
+
+<ul>
+ <li>{@link android.view.Window#setEnterTransition Window.setEnterTransition()}</li>
+ <li>{@link android.view.Window#setExitTransition Window.setExitTransition()}</li>
+ <li>{@link android.view.Window#setSharedElementEnterTransition
+ Window.setSharedElementEnterTransition()}</li>
+ <li>{@link android.view.Window#setSharedElementExitTransition
+ Window.setSharedElementExitTransition()}</li>
+</ul>
+
+<p>The {@link android.view.Window#setExitTransition setExitTransition()} and {@link
+android.view.Window#setSharedElementExitTransition setSharedElementExitTransition()} methods define
+the exit transition for the calling activity. The {@link android.view.Window#setEnterTransition
+setEnterTransition()} and {@link android.view.Window#setSharedElementEnterTransition
+setSharedElementEnterTransition()} methods define the enter transition for the called activity.</p>
+
+<p>To get the full effect of a transition, you must enable window content transitions on both the
+calling and called activities. Otherwise, the calling activity will start the exit transition,
+but then you'll see a window transition (like scale or fade).</p>
+
+<p>To start an enter transition as soon as possible, use the
+{@link android.view.Window#setAllowEnterTransitionOverlap Window.setAllowEnterTransitionOverlap()}
+method on the called activity. This lets you have more dramatic enter transitions.</p>
+
+<h3>Start an activity using transitions</h3>
+
+<p>If you enable transitions and set an exit transition for an activity, the transition is activated
+when you launch another activity as follows:</p>
+
+<pre>
+startActivity(intent,
+ ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
+</pre>
+
+<p>If you have set an enter transition for the second activity, the transition is also activated
+when the activity starts. To disable transitions when you start another activity, provide
+a <code>null</code> options bundle.</p>
+
+<h3>Start an activity with a shared element</h3>
+
+<p>To make a screen transition animation between two activities that have a shared element:</p>
+
+<ol>
+<li>Enable window content transitions in your theme.</li>
+<li>Specify a shared elements transition in your style.</li>
+<li>Define your transition as an XML resource.</li>
+<li>Assign a common name to the shared elements in both layouts with the
+ <code>android:transitionName</code> attribute.</li>
+<li>Use the {@link android.app.ActivityOptions#makeSceneTransitionAnimation
+ActivityOptions.makeSceneTransitionAnimation()} method.</li>
+</ol>
+
+<pre>
+// get the element that receives the click event
+final View imgContainerView = findViewById(R.id.img_container);
+
+// get the common element for the transition in this activity
+final View androidRobotView = findViewById(R.id.image_small);
+
+// define a click listener
+imgContainerView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent intent = new Intent(this, Activity2.class);
+ // create the transition animation - the images in the layouts
+ // of both activities are defined with android:transitionName="robot"
+ ActivityOptions options = ActivityOptions
+ .makeSceneTransitionAnimation(this, androidRobotView, "robot");
+ // start the new activity
+ startActivity(intent, options.toBundle());
+ }
+});
+</pre>
+
+<p>For shared dynamic views that you generate in your code, use the
+{@link android.view.View#setTransitionName View.setTransitionName()} method to specify a common
+element name in both activities.</p>
+
+<p>To reverse the scene transition animation when you finish the second activity, call the
+{@link android.app.Activity#finishAfterTransition Activity.finishAfterTransition()}
+method instead of {@link android.app.Activity#finish Activity.finish()}.</p>
+
+<h3>Start an activity with multiple shared elements</h3>
+
+<p>To make a scene transition animation between two activities that have more than one shared
+element, define the shared elements in both layouts with the <code>android:transitionName</code>
+attribute (or use the {@link android.view.View#setTransitionName View.setTransitionName()} method
+in both activities), and create an {@link android.app.ActivityOptions} object as follows:</p>
+
+<pre>
+ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
+ Pair.create(view1, "agreedName1"),
+ Pair.create(view2, "agreedName2"));
+</pre>
+
+
+<h2 id="CurvedMotion">Use Curved Motion</h2>
+
+<p>Animations in material design rely on curves for time interpolation and spatial movement
+patterns. With Android 5.0 (API level 21) and above, you can define custom timing curves and
+curved motion patterns for animations.</p>
+
+<p>The {@link android.view.animation.PathInterpolator} class is a new interpolator based on a
+Bézier curve or a {@link android.graphics.Path} object. This interpolator specifies a motion curve
+in a 1x1 square, with anchor points at (0,0) and (1,1) and control points as specified using the
+constructor arguments. You can also define a path interpolator as an XML resource:</p>
+
+<pre>
+<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:controlX1="0.4"
+ android:controlY1="0"
+ android:controlX2="1"
+ android:controlY2="1"/>
+</pre>
+
+<p>The system provides XML resources for the three basic curves in the material design
+specification:</p>
+
+<ul>
+ <li><code>@interpolator/fast_out_linear_in.xml</code></li>
+ <li><code>@interpolator/fast_out_slow_in.xml</code></li>
+ <li><code>@interpolator/linear_out_slow_in.xml</code></li>
+</ul>
+
+<p>You can pass a {@link android.view.animation.PathInterpolator} object to the {@link
+android.animation.Animator#setInterpolator Animator.setInterpolator()} method.</p>
+
+<p>The {@link android.animation.ObjectAnimator} class has new constructors that enable you to animate
+coordinates along a path using two or more properties at once. For example, the following animator
+uses a {@link android.graphics.Path} object to animate the X and Y properties of a view:</p>
+
+<pre>
+ObjectAnimator mAnimator;
+mAnimator = ObjectAnimator.ofFloat(view, View.X, View.Y, path);
+...
+mAnimator.start();
+</pre>
+
+
+<h2 id="ViewState">Animate View State Changes</h2>
+
+<p>The {@link android.animation.StateListAnimator} class lets you define animators that run when
+the state of a view changes. The following example shows how to define an {@link
+android.animation.StateListAnimator} as an XML resource:</p>
+
+<pre>
+<!-- animate the translationZ property of a view when pressed -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_pressed="true">
+ <set>
+ <objectAnimator android:propertyName="translationZ"
+ android:duration="@android:integer/config_shortAnimTime"
+ android:valueTo="2dp"
+ android:valueType="floatType"/>
+ <!-- you could have other objectAnimator elements
+ here for "x" and "y", or other properties -->
+ </set>
+ </item>
+ <item android:state_enabled="true"
+ android:state_pressed="false"
+ android:state_focused="true">
+ <set>
+ <objectAnimator android:propertyName="translationZ"
+ android:duration="100"
+ android:valueTo="0"
+ android:valueType="floatType"/>
+ </set>
+ </item>
+</selector>
+</pre>
+
+<p>To attach custom view state animations to a view, define an animator using the
+<code>selector</code> element in an XML resource file as in this example, and assign it to your
+view with the <code>android:stateListAnimator</code> attribute. To assign a state list animator
+to a view in your code, use the {@link android.animation.AnimatorInflater#loadStateListAnimator
+AnimationInflater.loadStateListAnimator()} method, and assign the animator to your view with the
+{@link android.view.View#setStateListAnimator View.setStateListAnimator()} method.</p>
+
+<p>When your theme extends the material theme, buttons have a Z animation by default. To avoid this
+behavior in your buttons, set the <code>android:stateListAnimator</code> attribute to
+<code>@null</code>.</p>
+
+<p>The {@link android.graphics.drawable.AnimatedStateListDrawable} class lets you create drawables
+that show animations between state changes of the associated view. Some of the system widgets in
+Android 5.0 use these animations by default. The following example shows how
+to define an {@link android.graphics.drawable.AnimatedStateListDrawable} as an XML resource:</p>
+
+<pre>
+<!-- res/drawable/myanimstatedrawable.xml -->
+<animated-selector
+ xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- provide a different drawable for each state-->
+ <item android:id="@+id/pressed" android:drawable="@drawable/drawableP"
+ android:state_pressed="true"/>
+ <item android:id="@+id/focused" android:drawable="@drawable/drawableF"
+ android:state_focused="true"/>
+ <item android:id="@id/default"
+ android:drawable="@drawable/drawableD"/>
+
+ <!-- specify a transition -->
+ <transition android:fromId="@+id/default" android:toId="@+id/pressed">
+ <animation-list>
+ <item android:duration="15" android:drawable="@drawable/dt1"/>
+ <item android:duration="15" android:drawable="@drawable/dt2"/>
+ ...
+ </animation-list>
+ </transition>
+ ...
+</animated-selector>
+</pre>
+
+
+<h2 id="AnimVector">Animate Vector Drawables</h2>
+
+<p><a href="{@docRoot}training/material/drawables.html#VectorDrawables">Vector Drawables</a> are
+scalable without losing definition. The {@link android.graphics.drawable.AnimatedVectorDrawable}
+class lets you animate the properties of a vector drawable.</p>
+
+<p>You normally define animated vector drawables in three XML files:</p>
+
+<ul>
+<li>A vector drawable with the <code><vector></code> element in
+<code>res/drawable/</code></li>
+<li>An animated vector drawable with the <code><animated-vector></code> element in
+<code>res/drawable/</code></li>
+<li>One or more object animators with the <code><objectAnimator></code> element in
+<code>res/anim/</code></li>
+</ul>
+
+<p>Animated vector drawables can animate the attributes of the <code><group></code> and
+<code><path></code> elements. The <code><group></code> elements defines a set of
+paths or subgroups, and the <code><path></code> element defines paths to be drawn.</p>
+
+<p>When you define a vector drawable that you want to animate, use the <code>android:name</code>
+attribute to assign a unique name to groups and paths, so you can refer to them from your animator
+definitions. For example:</p>
+
+<pre>
+<!-- res/drawable/vectordrawable.xml -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="600"
+ android:viewportWidth="600">
+ <group
+ <strong>android:name="rotationGroup"</strong>
+ android:pivotX="300.0"
+ android:pivotY="300.0"
+ android:rotation="45.0" >
+ <path
+ <strong>android:name="v"</strong>
+ android:fillColor="#000000"
+ android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
+ </group>
+</vector>
+</pre>
+
+<p>The animated vector drawable definition refers to the groups and paths in the vector drawable
+by their names:</p>
+
+<pre>
+<!-- res/drawable/animvectordrawable.xml -->
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:drawable="@drawable/vectordrawable" >
+ <target
+ android:name="rotationGroup"
+ android:animation="@anim/rotation" />
+ <target
+ android:name="v"
+ android:animation="@anim/path_morph" />
+</animated-vector>
+</pre>
+
+<p>The animation definitions represent {@link android.animation.ObjectAnimator} or {@link
+android.animation.AnimatorSet} objects. The first animator in this example rotates the target
+group 360 degrees:</p>
+
+<pre>
+<!-- res/anim/rotation.xml -->
+<objectAnimator
+ android:duration="6000"
+ android:propertyName="rotation"
+ android:valueFrom="0"
+ android:valueTo="360" />
+</pre>
+
+<p>The second animator in this example morphs the vector drawable's path from one shape to
+another. Both paths must be compatible for morphing: they must have the same number of commands
+and the same number of parameters for each command.</p>
+
+<pre>
+<!-- res/anim/path_morph.xml -->
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <objectAnimator
+ android:duration="3000"
+ android:propertyName="pathData"
+ android:valueFrom="M300,70 l 0,-70 70,70 0,0 -70,70z"
+ android:valueTo="M300,70 l 0,-70 70,0 0,140 -70,0 z"
+ android:valueType="pathType" />
+</set>
+</pre>
+
+<p>For more information, see the API reference for {@link
+android.graphics.drawable.AnimatedVectorDrawable}.</p>
diff --git a/docs/html/training/material/compatibility.jd b/docs/html/training/material/compatibility.jd
new file mode 100644
index 0000000..49ef7f7
--- /dev/null
+++ b/docs/html/training/material/compatibility.jd
@@ -0,0 +1,172 @@
+page.title=Maintaining Compatibility
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+<h2>This lesson teaches you to</h2>
+<ol>
+ <li><a href="#Theme">Define Alternative Styles</a></li>
+ <li><a href="#Layouts">Provide Alternative Layouts</a></li>
+ <li><a href="#SupportLib">Use the Support Library</a></li>
+ <li><a href="#CheckVersion">Check the System Version</a></li>
+</ol>
+<h2>You should also read</h2>
+<ul>
+ <li><a href="http://www.google.com/design/spec">Material design specification</a></li>
+ <li><a href="{@docRoot}design/material/index.html">Material design on Android</a></li>
+</ul>
+</div>
+</div>
+
+
+<p>Some material design features like the material theme and custom activity transitions are
+only available on Android 5.0 (API level 21) and above. However, you can design your apps to make
+use of these features when running on devices that support material design and still be compatible
+with devices running previous releases of Android.</p>
+
+
+<h2 id="Theme">Define Alternative Styles</h2>
+
+<p>You can configure your app to use the material theme on devices that support it and revert
+to an older theme on devices running earlier versions of Android:</p>
+
+<ol>
+<li>Define a theme that inherits from an older theme (like Holo) in
+ <code>res/values/styles.xml</code>.</li>
+<li>Define a theme with the same name that inherits from the material theme in
+ <code>res/values-v21/styles.xml</code>.</li>
+<li>Set this theme as your app's theme in the manifest file.</li>
+</ol>
+
+<p class="note"><strong>Note:</strong>
+If your app uses the material theme but does not provide an alternative theme in this manner,
+your app will not run on versions of Android earlier than 5.0.
+</p>
+
+
+<h2 id="Layouts">Provide Alternative Layouts</h2>
+
+<p>If the layouts that you design according to the material design guidelines do not use any of
+the new XML attributes introduced in Android 5.0 (API level 21), they will work on previous
+versions of Android. Otherwise, you can provide alternative layouts. You can also provide
+alternative layouts to customize how your app looks on earlier versions of Android.</p>
+
+<p>Create your layout files for Android 5.0 (API level 21) inside <code>res/layout-v21/</code> and
+your alternative layout files for earlier versions of Android inside <code>res/layout/</code>.
+For example, <code>res/layout/my_activity.xml</code> is an alternative layout for
+<code>res/layout-v21/my_activity.xml</code>.</p>
+
+<p>To avoid duplication of code, define your styles inside <code>res/values/</code>, modify the
+styles in <code>res/values-v21/</code> for the new APIs, and use style inheritance, defining base
+styles in <code>res/values/</code> and inheriting from those in <code>res/values-v21/</code>.</p>
+
+
+<h2 id="SupportLib">Use the Support Library</h2>
+
+<p>The <a href="{@docRoot}tools/support-library/features.html#v7">v7 Support Libraries</a>
+r21 and above includes the following material design features:</p>
+
+<ul>
+<li><a href="{@docRoot}training/material/theme.html">Material design styles</a> for some system
+ widgets when you apply one of the <code>Theme.AppCompat</code> themes.</li>
+<li><a href="{@docRoot}training/material/theme.html#ColorPalette">Color palette theme attributes</a>
+ in the <code>Theme.AppCompat</code> themes.</li>
+<li>The {@link android.support.v7.widget.RecyclerView} widget to <a
+ href="{@docRoot}training/material/lists-cards.html#RecyclerView">display data
+ collections</a>.</li>
+<li>The {@link android.support.v7.widget.CardView} widget to <a
+ href="{@docRoot}training/material/lists-cards.html#CardView">create cards</a>.</li>
+<li>The {@link android.support.v7.graphics.Palette} class to <a
+ href="{@docRoot}training/material/drawables.html#ColorExtract">extract prominent colors from
+ images</a>.</li>
+</ul>
+
+<h3>System widgets</h3>
+
+<p>The <code>Theme.AppCompat</code> themes provide material design styles for these widgets:</p>
+
+<ul>
+ <li>{@link android.widget.EditText}</li>
+ <li>{@link android.widget.Spinner}</li>
+ <li>{@link android.widget.CheckBox}</li>
+ <li>{@link android.widget.RadioButton}</li>
+ <li>{@link android.support.v7.widget.SwitchCompat}</li>
+ <li>{@link android.widget.CheckedTextView}</li>
+</ul>
+
+<h3>Color Palette</h3>
+
+<p>To obtain material design styles and customize the color palette with the Android v7 Support
+Library, apply one of the <code>Theme.AppCompat</code> themes:</p>
+
+<pre>
+<!-- extend one of the Theme.AppCompat themes -->
+<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">
+ <!-- customize the color palette -->
+ <item name="colorPrimary">@color/material_blue_500</item>
+ <item name="colorPrimaryDark">@color/material_blue_700</item>
+ <item name="colorAccent">@color/material_green_A200</item>
+</style>
+</pre>
+
+<h3>Lists and Cards</h3>
+
+<p>The {@link android.support.v7.widget.RecyclerView} and {@link
+android.support.v7.widget.CardView} widgets are available in earlier versions of Android through
+the Android v7 Support Library with these limitations:</p>
+<ul>
+<li>{@link android.support.v7.widget.CardView} falls back to a programmatic shadow implementation
+ using additional padding.</li>
+<li>{@link android.support.v7.widget.CardView} does not clip its children views that intersect
+ with rounded corners.</li>
+</ul>
+
+
+<h3>Dependencies</h3>
+
+<p>To use these features in versions of Android earlier than 5.0 (API level 21), include the
+Android v7 Support Library in your project as a <a
+href="{@docRoot}/sdk/installing/studio-build.html#dependencies">Gradle dependency</a>:</p>
+
+<pre>
+dependencies {
+ compile 'com.android.support:appcompat-v7:21.0.+'
+ compile 'com.android.support:cardview-v7:21.0.+'
+ compile 'com.android.support:recyclerview-v7:21.0.+'
+}
+</pre>
+
+
+<h2 id="CheckVersion">Check the System Version</h2>
+
+<p>The following features are available only in Android 5.0 (API level 21) and above:</p>
+
+<ul>
+<li>Activity transitions</li>
+<li>Touch feedback</li>
+<li>Reveal animations</li>
+<li>Path-based animations</li>
+<li>Vector drawables</li>
+<li>Drawable tinting</li>
+</ul>
+
+<p>To preserve compatibility with earlier versions of Android, check the system {@link
+android.os.Build.VERSION#SDK_INT version} at runtime before you invoke the APIs for any of these
+features:</p>
+
+<pre>
+// Check if we're running on Android 5.0 or higher
+if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ // Call some material design APIs here
+} else {
+ // Implement this feature without material design
+}
+</pre>
+
+<p class="note"><strong>Note:</strong> To specify which versions of Android your app supports,
+use the <code>android:minSdkVersion</code> and <code>android:targetSdkVersion</code>
+attributes in your manifest file. To use the material design features in Android 5.0, set
+the <code>android:targetSdkVersion</code> attribute to <code>21</code>. For more information, see
+the <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><uses-sdk> API
+guide</a>.</p>
diff --git a/docs/html/training/material/drawables.jd b/docs/html/training/material/drawables.jd
new file mode 100644
index 0000000..fd21e3d
--- /dev/null
+++ b/docs/html/training/material/drawables.jd
@@ -0,0 +1,119 @@
+page.title=Working with Drawables
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+<h2>This lesson teaches you to</h2>
+<ol>
+ <li><a href="#DrawableTint">Tint Drawable Resources</a></li>
+ <li><a href="#ColorExtract">Extract Prominent Colors from an Image</a></li>
+ <li><a href="#VectorDrawables">Create Vector Drawables</a></li>
+</ol>
+<h2>You should also read</h2>
+<ul>
+ <li><a href="http://www.google.com/design/spec">Material design specification</a></li>
+ <li><a href="{@docRoot}design/material/index.html">Material design on Android</a></li>
+</ul>
+</div>
+</div>
+
+<p>The following capabilities for drawables help you implement material design in your apps:</p>
+
+<ul>
+<li>Drawable tinting</li>
+<li>Prominent color extraction</li>
+<li>Vector drawables</li>
+</ul>
+
+<p>This lesson shows you how to use these features in your app.</p>
+
+
+<h2 id="DrawableTint">Tint Drawable Resources</h2>
+
+<p>With Android 5.0 (API level 21) and above, you can tint bitmaps and nine-patches defined as
+alpha masks. You can tint them with color resources or theme attributes that resolve to color
+resources (for example, <code>?android:attr/colorPrimary</code>). Usually, you create these assets
+only once and color them automatically to match your theme.</p>
+
+<p>You can apply a tint to {@link android.graphics.drawable.BitmapDrawable} or {@link
+android.graphics.drawable.NinePatchDrawable} objects with the {@code setTint()} method. You can
+also set the tint color and mode in your layouts with the <code>android:tint</code> and
+<code>android:tintMode</code> attributes.</p>
+
+
+<h2 id="ColorExtract">Extract Prominent Colors from an Image</h2>
+
+<p>The Android Support Library r21 and above includes the {@link
+android.support.v7.graphics.Palette} class, which lets you extract prominent colors from an image.
+This class extracts the following prominent colors:</p>
+
+<ul>
+<li>Vibrant</li>
+<li>Vibrant dark</li>
+<li>Vibrant light</li>
+<li>Muted</li>
+<li>Muted dark</li>
+<li>Muted light</li>
+</ul>
+
+<p>To extract these colors, pass a {@link android.graphics.Bitmap} object to the
+{@link android.support.v7.graphics.Palette#generate Palette.generate()} static method in the
+background thread where you load your images. If you can't use that thread, call the
+{@link android.support.v7.graphics.Palette#generateAsync Palette.generateAsync()} method and
+provide a listener instead.</p>
+
+<p>You can retrieve the prominent colors from the image using the getter methods in the
+<code>Palette</code> class, such as <code>Palette.getVibrantColor</code>.</p>
+
+<p>To use the {@link android.support.v7.graphics.Palette} class in your project, add the following
+<a href="{@docRoot}sdk/installing/studio-build.html#dependencies">Gradle dependency</a> to your
+app's module:</p>
+
+<pre>
+dependencies {
+ ...
+ compile 'com.android.support:palette-v7:21.0.+'
+}
+</pre>
+
+<p>For more information, see the API reference for the {@link android.support.v7.graphics.Palette}
+class.</p>
+
+
+<h2 id="VectorDrawables">Create Vector Drawables</h2>
+
+<p>In Android 5.0 (API Level 21) and above, you can define vector drawables, which scale without
+losing definition. You need only one asset file for a vector image, as opposed to an asset file for
+each screen density in the case of bitmap images. To create a vector image, you define the details
+of the shape inside a <code><vector></code> XML element.</p>
+
+<p>The following example defines a vector image with the shape of a heart:</p>
+
+<pre>
+<!-- res/drawable/heart.xml -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ <!-- intrinsic size of the drawable -->
+ android:height="256dp"
+ android:width="256dp"
+ <!-- size of the virtual canvas -->
+ android:viewportWidth="32"
+ android:viewportHeight="32">
+
+ <!-- draw a path -->
+ <path android:fillColor="#8fff"
+ android:pathData="M20.5,9.5
+ c-1.955,0,-3.83,1.268,-4.5,3
+ c-0.67,-1.732,-2.547,-3,-4.5,-3
+ C8.957,9.5,7,11.432,7,14
+ c0,3.53,3.793,6.257,9,11.5
+ c5.207,-5.242,9,-7.97,9,-11.5
+ C25,11.432,23.043,9.5,20.5,9.5z" />
+</vector>
+</pre>
+
+<p>Vector images are represented in Android as {@link android.graphics.drawable.VectorDrawable}
+objects. For more information about the <code>pathData</code> syntax, see the <a
+href="http://www.w3.org/TR/SVG11/paths.html#PathData">SVG Path reference</a>. For more information
+about animating the properties of vector drawables, see
+<a href="{@docRoot}training/material/animations.html#AnimVector">Animating Vector Drawables</a>.</p>
diff --git a/docs/html/training/material/get-started.jd b/docs/html/training/material/get-started.jd
new file mode 100644
index 0000000..b6088eb
--- /dev/null
+++ b/docs/html/training/material/get-started.jd
@@ -0,0 +1,173 @@
+page.title=Getting Started
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+<h2>This lesson teaches you to</h2>
+<ol>
+ <li><a href="#ApplyTheme">Apply the Material Theme</a></li>
+ <li><a href="#Layouts">Design Your Layouts</a></li>
+ <li><a href="#Depth">Specify Elevation in Your Views</a></li>
+ <li><a href="#ListsCards">Create Lists and Cards</a></li>
+ <li><a href="#Animations">Customize Your Animations</a></li>
+</ol>
+<h2>You should also read</h2>
+<ul>
+ <li><a href="http://www.google.com/design/spec">Material design specification</a></li>
+ <li><a href="{@docRoot}design/material/index.html">Material design on Android</a></li>
+</ul>
+</div>
+</div>
+
+
+<p>To create apps with material design:</p>
+
+<ol>
+ <li style="margin-bottom:10px">
+ Review the <a href="http://www.google.com/design/spec">material design specification</a>.</li>
+ <li style="margin-bottom:10px">
+ Apply the material <strong>theme</strong> to your app.</li>
+ <li style="margin-bottom:10px">
+ Create your <strong>layouts</strong> following material design guidelines.</li>
+ <li style="margin-bottom:10px">
+ Specify the <strong>elevation</strong> of your views to cast shadows.</li>
+ <li style="margin-bottom:10px">
+ Use system <strong>widgets</strong> for lists and cards.</li>
+ <li style="margin-bottom:10px">
+ Customize the <strong>animations</strong> in your app.</li>
+</ol>
+
+<h3>Maintain backward compatibility</h3>
+
+<p>You can add many material design features to your app while maintaining compatibility with
+versions of Android earlier than 5.0. For more information, see
+<a href="{@docRoot}training/material/compatibility.html">Maintaining Compatibility</a>.</p>
+
+<h3>Update your app with material design</h3>
+
+<p>To update an existing app to incorporate material design, update your layouts following
+material design guidelines. Also make sure to incorporate depth, touch feedback, and
+animations.</p>
+
+<h3>Create new apps with material design</h3>
+
+<p>If you are creating a new app with material design features, the <a
+href="http://www.google.com/design/spec">material design guidelines</a> provide you with a
+cohesive design framework. Follow those guidelines and use the new functionality in the Android
+framework to design and develop your app.</p>
+
+
+<h2 id="ApplyTheme">Apply the Material Theme</h2>
+
+<p>To apply the material theme in your app, specify a style that inherits from
+<code>android:Theme.Material</code>:</p>
+
+<pre>
+<!-- res/values/styles.xml -->
+<resources>
+ <!-- your theme inherits from the material theme -->
+ <style name="AppTheme" parent="android:Theme.Material">
+ <!-- theme customizations -->
+ </style>
+</resources>
+</pre>
+
+<p>The material theme provides updated system widgets that let you set their color palette and
+default animations for touch feedback and activity transitions. For more details, see
+<a href="{@docRoot}training/material/theme.html">Using the Material Theme</a>.</p>
+
+
+<h2 id="Layouts">Design Your Layouts</h2>
+
+<p>In addition to applying and customizing the material theme, your layouts should conform to
+the <a href="http://www.google.com/design/spec">material design guidelines</a>. When you design
+your layouts, pay special attention to the following:</p>
+
+<ul>
+<li>Baseline grids</li>
+<li>Keylines</li>
+<li>Spacing</li>
+<li>Touch target size</li>
+<li>Layout structure</li>
+</ul>
+
+
+<h2 id="Depth">Specify Elevation in Your Views</h2>
+
+<p>Views can cast shadows, and the elevation value of a view
+determines the size of its shadow and its drawing order. To set the elevation of a view, use the
+<code>android:elevation</code> attribute in your layouts:</p>
+
+<pre>
+<TextView
+ android:id="@+id/my_textview"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/next"
+ android:background="@color/white"
+ android:elevation="5dp" />
+</pre>
+
+<p>The new <code>translationZ</code> property lets you create animations that reflect temporary
+changes in the elevation of a view. Elevation changes can be useful when
+<a href="{@docRoot}training/material/animations.html#ViewState">responding to touch
+gestures</a>.</p>
+
+<p>For more details, see <a href="{@docRoot}training/material/shadows-clipping.html">Defining
+Shadows and Clipping Views</a>.</p>
+
+
+<h2 id="ListsCards">Create Lists and Cards</h2>
+
+<p>{@link android.support.v7.widget.RecyclerView} is a more pluggable version of {@link
+android.widget.ListView} that supports different layout types and provides performance improvements.
+{@link android.support.v7.widget.CardView} lets you show pieces of information inside cards with
+a consistent look across apps. The following code example demonstrates how to include a
+{@link android.support.v7.widget.CardView} in your layout:</p>
+
+<pre>
+<android.support.v7.widget.CardView
+ android:id="@+id/card_view"
+ android:layout_width="200dp"
+ android:layout_height="200dp"
+ card_view:cardCornerRadius="3dp">
+ ...
+</android.support.v7.widget.CardView>
+</pre>
+
+<p>For more information, see <a href="{@docRoot}training/material/lists-cards.html">Creating Lists
+and Cards</a>.</p>
+
+
+<h2 id="Animations">Customize Your Animations</h2>
+
+<p>Android 5.0 (API level 21) includes new APIs to create custom animations in your app.
+For example, you can enable activity transitions and define an exit transition inside an
+activity:</p>
+
+<pre>
+public class MyActivity extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // enable transitions
+ getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
+ setContentView(R.layout.activity_my);
+ }
+
+ public void onSomeButtonClicked(View view) {
+ getWindow().setExitTransition(new Explode());
+ Intent intent = new Intent(this, MyOtherActivity.class);
+ startActivity(intent,
+ ActivityOptions
+ .makeSceneTransitionAnimation(this).toBundle());
+ }
+}
+</pre>
+
+<p>When you start another activity from this activity, the exit transition is activated.</p>
+
+<p>To learn more about the new animation APIs, see <a
+href="{@docRoot}training/material/animations.html">Defining Custom Animations</a>.</p>
diff --git a/docs/html/preview/material/images/RecyclerView.png b/docs/html/training/material/images/RecyclerView.png
similarity index 100%
rename from docs/html/preview/material/images/RecyclerView.png
rename to docs/html/training/material/images/RecyclerView.png
Binary files differ
diff --git a/docs/html/training/material/images/SceneTransition.png b/docs/html/training/material/images/SceneTransition.png
new file mode 100644
index 0000000..ae82820
--- /dev/null
+++ b/docs/html/training/material/images/SceneTransition.png
Binary files differ
diff --git a/docs/html/preview/material/images/ThemeColors.png b/docs/html/training/material/images/ThemeColors.png
similarity index 85%
rename from docs/html/preview/material/images/ThemeColors.png
rename to docs/html/training/material/images/ThemeColors.png
index 53f695d..b3c570b 100644
--- a/docs/html/preview/material/images/ThemeColors.png
+++ b/docs/html/training/material/images/ThemeColors.png
Binary files differ
diff --git a/docs/html/training/material/images/shadows-depth.png b/docs/html/training/material/images/shadows-depth.png
new file mode 100644
index 0000000..26b6b4a
--- /dev/null
+++ b/docs/html/training/material/images/shadows-depth.png
Binary files differ
diff --git a/docs/html/training/material/index.jd b/docs/html/training/material/index.jd
new file mode 100644
index 0000000..4eb7911
--- /dev/null
+++ b/docs/html/training/material/index.jd
@@ -0,0 +1,62 @@
+page.title=Creating Apps with Material Design
+page.type=design
+page.image=images/material.png
+page.metaDescription=Learn how to apply material design to your apps.
+
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>Dependencies and Prerequisites</h2>
+ <ul>
+ <li>Android 5.0 (API level 21)</li>
+ <li>Android Studio 0.8</li>
+ </ul>
+</div>
+</div>
+
+<p>Material design is a comprehensive guide for visual, motion, and interaction design across
+platforms and devices. To use material design in your Android apps, follow the guidelines
+described in the
+<a href="http://www.google.com/design/spec/material-design/introduction.html">material design
+specification</a> and use the new components and functionality available in Android 5.0
+(API level 21).</p>
+
+<p>This class shows you how to create material design apps with the following elements:</p>
+
+<ul>
+<li>The material theme</li>
+<li>Widgets for cards and lists</li>
+<li>Custom shadows and view clipping</li>
+<li>Vector drawables</li>
+<li>Custom animations</li>
+</ul>
+
+<p>This class also teaches you how to maintain compatibility with versions of Android earlier than
+5.0 (API level 21) when you use material design features in your app.</p>
+
+<h2>Lessons</h2>
+
+<dl>
+ <dt><a href="{@docRoot}training/material/get-started.html">Getting Started</a></dt>
+ <dd>Learn how to update your app with material design features.</dd>
+
+ <dt><a href="{@docRoot}training/material/theme.html">Using the Material Theme</a></dt>
+ <dd>Learn how to apply material design styles to your app.</dd>
+
+ <dt><a href="{@docRoot}training/material/lists-cards.html">Creating Lists and Cards</a></dt>
+ <dd>Learn how to create lists and cards with a consistent look and feel using system widgets.</dd>
+
+ <dt><a href="{@docRoot}training/material/shadows-clipping.html">Defining Shadows and Clipping Views</a></dt>
+ <dd>Learn how to set elevation for your views to create custom shadows and how to clip views.</dd>
+
+ <dt><a href="{@docRoot}training/material/drawables.html">Working with Drawables</a></dt>
+ <dd>Learn how to create vector drawables and how to tint drawable resources.</dd>
+
+ <dt><a href="{@docRoot}training/material/animations.html">Defining Custom Animations</a></dt>
+ <dd>Learn how to create custom animations for views and activity transitions with shared elements.</dd>
+
+ <dt><a href="{@docRoot}training/material/compatibility.html">Maintaining Compatibility</a></dt>
+ <dd>Learn how to maintain compatibility with platform versions earlier than Android 5.0.</dd>
+</dl>
diff --git a/docs/html/training/material/lists-cards.jd b/docs/html/training/material/lists-cards.jd
new file mode 100644
index 0000000..e7bdfe0
--- /dev/null
+++ b/docs/html/training/material/lists-cards.jd
@@ -0,0 +1,266 @@
+page.title=Creating Lists and Cards
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+<h2>This lesson teaches you to</h2>
+<ol>
+ <li><a href="#RecyclerView">Create Lists</a></li>
+ <li><a href="#CardView">Create Cards</a></li>
+ <li><a href="#Dependencies">Add Dependencies</a></li>
+</ol>
+<h2>You should also read</h2>
+<ul>
+ <li><a href="http://www.google.com/design/spec">Material design specification</a></li>
+ <li><a href="{@docRoot}design/material/index.html">Material design on Android</a></li>
+</ul>
+</div>
+</div>
+
+
+<p>To create complex lists and cards with material design styles in your apps, you can use the
+{@link android.support.v7.widget.RecyclerView} and {@link android.support.v7.widget.CardView}
+widgets.</p>
+
+
+<h2 id="RecyclerView">Create Lists</h2>
+
+<p>The {@link android.support.v7.widget.RecyclerView} widget is a more advanced and flexible
+version of {@link android.widget.ListView}. This widget is a container for displaying large data
+sets that can be scrolled very efficiently by maintaining a limited number of views. Use the
+{@link android.support.v7.widget.RecyclerView} widget when you have data collections whose elements
+change at runtime based on user action or network events.</p>
+
+<p>The {@link android.support.v7.widget.RecyclerView} class simplifies the display and handling of
+large data sets by providing:</p>
+
+<ul>
+ <li>Layout managers for positioning items</li>
+ <li>Default animations for common item operations, such as removal or addition of items</li>
+</ul>
+
+<p>You also have the flexibility to define custom layout managers and animations for {@link
+android.support.v7.widget.RecyclerView} widgets.</p>
+
+<img src="{@docRoot}training/material/images/RecyclerView.png" alt="" width="550" height="106"/>
+<p class="img-caption">
+<strong>Figure 1</strong>. The <code>RecyclerView</code> widget.
+</p>
+
+<p>To use the {@link android.support.v7.widget.RecyclerView} widget, you have to specify an
+adapter and a layout manager. To create an adapter, extend the {@link
+android.support.v7.widget.RecyclerView.Adapter RecyclerView.Adapter} class. The details
+of the implementation depend on the specifics of your dataset and the type of views. For more
+information, see the <a href="#RVExamples">examples</a> below.</p>
+
+<div style="float:right">
+<img src="{@docRoot}design/material/images/list_mail.png" alt="" width="250" height="426"/>
+<p class="img-caption" style="margin-left:8px">
+<strong>Figure 2</strong> - Lists with <code>RecyclerView</code>.
+</p>
+</div>
+
+<p>A <strong>layout manager</strong> positions item views inside a {@link
+android.support.v7.widget.RecyclerView} and determines when to reuse item views that are no
+longer visible to the user. To reuse (or <em>recycle</em>) a view, a layout manager may ask the
+adapter to replace the contents of the view with a different element from the dataset. Recycling
+views in this manner improves performance by avoiding the creation of unnecessary views or
+performing expensive {@link android.app.Activity#findViewById findViewById()} lookups.</p>
+
+<p>{@link android.support.v7.widget.RecyclerView} provides these built-in layout managers:</p>
+
+<ul>
+<li>{@link android.support.v7.widget.LinearLayoutManager} shows items in a vertical or horizontal
+scrolling list.</li>
+<li>{@link android.support.v7.widget.GridLayoutManager} shows items in a grid.</li>
+<li>{@link android.support.v7.widget.StaggeredGridLayoutManager} shows items in a staggered grid.</li>
+</ul>
+
+<p>To create a custom layout manager, extend the {@link
+android.support.v7.widget.RecyclerView.LayoutManager RecyclerView.LayoutManager} class.</p>
+
+<h3>Animations</h3>
+
+<p>Animations for adding and removing items are enabled by default in {@link
+android.support.v7.widget.RecyclerView}. To customize these animations, extend the
+{@link android.support.v7.widget.RecyclerView.ItemAnimator RecyclerView.ItemAnimator} class and use
+the {@link android.support.v7.widget.RecyclerView#setItemAnimator RecyclerView.setItemAnimator()}
+method.</p>
+
+<h3 id="RVExamples">Examples</h3>
+
+<p>The following code example demonstrates how to add the
+{@link android.support.v7.widget.RecyclerView} to a layout:</p>
+
+<pre>
+<!-- A RecyclerView with some commonly used attributes -->
+<android.support.v7.widget.RecyclerView
+ android:id="@+id/my_recycler_view"
+ android:scrollbars="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
+</pre>
+
+<p>Once you have added a {@link android.support.v7.widget.RecyclerView} widget to your layout,
+obtain a handle to the object, connect it to a layout manager, and attach an adapter for the data
+to be displayed:</p>
+
+<pre>
+public class MyActivity extends Activity {
+ private RecyclerView mRecyclerView;
+ private RecyclerView.Adapter mAdapter;
+ private RecyclerView.LayoutManager mLayoutManager;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.my_activity);
+ mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
+
+ // use this setting to improve performance if you know that changes
+ // in content do not change the layout size of the RecyclerView
+ mRecyclerView.setHasFixedSize(true);
+
+ // use a linear layout manager
+ mLayoutManager = new LinearLayoutManager(this);
+ mRecyclerView.setLayoutManager(mLayoutManager);
+
+ // specify an adapter (see also next example)
+ mAdapter = new MyAdapter(myDataset);
+ mRecyclerView.setAdapter(mAdapter);
+ }
+ ...
+}
+</pre>
+
+<p>The adapter provides access to the items in your data set, creates views for items, and
+replaces the content of some of the views with new data items when the original item is no longer
+visible. The following code example shows a simple implementation for a data set that consists
+of an array of strings displayed using {@link android.widget.TextView} widgets:</p>
+
+<pre>
+public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
+ private String[] mDataset;
+
+ // Provide a reference to the views for each data item
+ // Complex data items may need more than one view per item, and
+ // you provide access to all the views for a data item in a view holder
+ public static class ViewHolder extends RecyclerView.ViewHolder {
+ // each data item is just a string in this case
+ public TextView mTextView;
+ public ViewHolder(TextView v) {
+ super(v);
+ mTextView = v;
+ }
+ }
+
+ // Provide a suitable constructor (depends on the kind of dataset)
+ public MyAdapter(String[] myDataset) {
+ mDataset = myDataset;
+ }
+
+ // Create new views (invoked by the layout manager)
+ @Override
+ public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
+ int viewType) {
+ // create a new view
+ View v = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.my_text_view, parent, false);
+ // set the view's size, margins, paddings and layout parameters
+ ...
+ ViewHolder vh = new ViewHolder(v);
+ return vh;
+ }
+
+ // Replace the contents of a view (invoked by the layout manager)
+ @Override
+ public void onBindViewHolder(ViewHolder holder, int position) {
+ // - get element from your dataset at this position
+ // - replace the contents of the view with that element
+ holder.mTextView.setText(mDataset[position]);
+
+ }
+
+ // Return the size of your dataset (invoked by the layout manager)
+ @Override
+ public int getItemCount() {
+ return mDataset.length;
+ }
+}
+</pre>
+
+
+<div style="float:right;margin-top:15px;margin-left:30px">
+<img src="{@docRoot}design/material/images/card_travel.png" alt="" width="225" height="383">
+<p class="img-caption" style="margin-left:12px">
+<strong>Figure 3</strong>. Card examples.
+</p>
+</div>
+
+<h2 id="CardView">Create Cards</h2>
+
+<p>{@link android.support.v7.widget.CardView} extends the {@link android.widget.FrameLayout} class
+and lets you show information inside cards that have a consistent look across the platform. {@link
+android.support.v7.widget.CardView} widgets can have shadows and rounded corners.</p>
+
+<p>To create a card with a shadow, use the <code>card_view:cardElevation</code> attribute.
+{@link android.support.v7.widget.CardView} uses real elevation and dynamic shadows on Android 5.0
+(API level 21) and above and falls back to a programmatic shadow implementation on earlier versions.
+For more information, see <a href="{@docRoot}training/material/compatibility.html">Maintaining
+Compatibility</a>.</p>
+
+<p>Use these properties to customize the appearance of the
+{@link android.support.v7.widget.CardView} widget:</p>
+
+<ul>
+ <li>To set the corner radius in your layouts, use the <code>card_view:cardCornerRadius</code>
+ attribute.</li>
+ <li>To set the corner radius in your code, use the <code>CardView.setRadius</code> method.</li>
+ <li>To set the background color of a card, use the <code>card_view:cardBackgroundColor</code>
+attribute.</li>
+</ul>
+
+<p>The following code example shows you how to include a {@link android.support.v7.widget.CardView}
+widget in your layout:</p>
+
+<pre>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ xmlns:card_view="http://schemas.android.com/apk/res-auto"
+ ... >
+ <!-- A CardView that contains a TextView -->
+ <android.support.v7.widget.CardView
+ xmlns:card_view="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/card_view"
+ android:layout_gravity="center"
+ android:layout_width="200dp"
+ android:layout_height="200dp"
+ card_view:cardCornerRadius="4dp">
+
+ <TextView
+ android:id="@+id/info_text"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+ </android.support.v7.widget.CardView>
+</LinearLayout>
+</pre>
+
+<p>For more information, see the API reference for {@link android.support.v7.widget.CardView}.</p>
+
+
+<h2 id="Dependencies">Add Dependencies</h2>
+
+<p>The {@link android.support.v7.widget.RecyclerView} and {@link android.support.v7.widget.CardView}
+widgets are part of the <a href="{@docRoot}tools/support-library/features.html#v7">v7 Support
+Libraries</a>. To use these widgets in your project, add these
+<a href="{@docRoot}sdk/installing/studio-build.html#dependencies">Gradle dependencies</a> to your
+app's module:</p>
+
+<pre>
+dependencies {
+ ...
+ compile 'com.android.support:cardview-v7:21.0.+'
+ compile 'com.android.support:recyclerview-v7:21.0.+'
+}
+</pre>
diff --git a/docs/html/training/material/shadows-clipping.jd b/docs/html/training/material/shadows-clipping.jd
new file mode 100644
index 0000000..f58d780
--- /dev/null
+++ b/docs/html/training/material/shadows-clipping.jd
@@ -0,0 +1,127 @@
+page.title=Defining Shadows and Clipping Views
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+<h2>This lesson teaches you to</h2>
+<ol>
+ <li><a href="#Elevation">Assign Elevation to Your Views</a></li>
+ <li><a href="#Shadows">Customize View Shadows and Outlines</a></li>
+ <li><a href="#Clip">Clip Views</a></li>
+</ol>
+<h2>You should also read</h2>
+<ul>
+ <li><a href="http://www.google.com/design/spec">Material design specification</a></li>
+ <li><a href="{@docRoot}design/material/index.html">Material design on Android</a></li>
+</ul>
+</div>
+</div>
+
+<p>Material design introduces depth for UI elements. Depth helps users understand the relative
+importance of each element and focus their attention to the task at hand.</p>
+
+<p>The elevation of a view, represented by the Z property, determines the size of its shadow:
+views with higher Z values cast bigger shadows. Views only cast shadows on the Z=0 plane; they
+don't cast shadows on other views placed below them and above the Z=0 plane.</p>
+
+<p>Views with higher Z values occlude views with lower Z values. However, the Z value of a view
+does not affect the view's size.</p>
+
+<p>Elevation is also useful to create animations where widgets temporarily rise above the
+view plane when performing some action.</p>
+
+
+<h2 id="Elevation">Assign Elevation to Your Views</h2>
+
+<p>The Z value for a view has two components, elevation and translation. The elevation is the
+static component, and the translation is used for animations:</p>
+
+<p><code>Z = elevation + translationZ</code></p>
+
+<img src="{@docRoot}training/material/images/shadows-depth.png" width="680" height="177" alt=""/>
+<p class="img-caption"><strong>Figure 1</strong> - Shadows for different view elevations.</p>
+
+<p>To set the elevation of a view in a layout definition, use the <code>android:elevation</code>
+attribute. To set the elevation of a view in the code of an activity, use the
+{@link android.view.View#setElevation View.setElevation()} method.</p>
+
+<p>To set the translation of a view, use the {@link android.view.View#setTranslationZ
+View.setTranslationZ()} method.</p>
+
+<p>The new {@link android.view.ViewPropertyAnimator#z ViewPropertyAnimator.z()} and {@link
+android.view.ViewPropertyAnimator#translationZ ViewPropertyAnimator.translationZ()} methods enable
+you to easily animate the elevation of views. For more information, see the API reference for
+{@link android.view.ViewPropertyAnimator} and the <a
+href="{@docRoot}guide/topics/graphics/prop-animation.html">Property Animation</a> developer
+guide.</p>
+
+<p>You can also use a {@link android.animation.StateListAnimator} to
+specify these animations in a declarative way. This is especially useful for cases where state
+changes trigger animations, like when a user presses a button. For more information, see
+<a href="{@docRoot}training/material/animations.html#ViewState">Animate View State Changes</a></p>.
+
+<p>The Z values are measured in the same units as the X and Y values.</p>
+
+
+<h2 id="Shadows">Customize View Shadows and Outlines</h2>
+
+<p>The bounds of a view's background drawable determine the default shape of its shadow.
+<strong>Outlines</strong> represent the outer shape of a graphics object and define the ripple
+area for touch feedback.</p>
+
+<p>Consider this view, defined with a background drawable:</p>
+
+<pre>
+<TextView
+ android:id="@+id/myview"
+ ...
+ android:elevation="2dp"
+ android:background="@drawable/myrect" />
+</pre>
+
+<p>The background drawable is defined as a rectangle with rounded corners:</p>
+
+<pre>
+<!-- res/drawable/myrect.xml -->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid android:color="#42000000" />
+ <corners android:radius="5dp" />
+</shape>
+</pre>
+
+<p>The view casts a shadow with rounded corners, since the background drawable defines the
+view's outline. Providing a custom outline overrides the default shape of a view's shadow.</p>
+
+<p>To define a custom outline for a view in your code:<p>
+
+<ol>
+<li>Extend the {@link android.view.ViewOutlineProvider} class.</li>
+<li>Override the {@link android.view.ViewOutlineProvider#getOutline getOutline()} method.</li>
+<li>Assign the new outline provider to your view with the {@link
+android.view.View#setOutlineProvider View.setOutlineProvider()} method.</li>
+</ol>
+
+<p>You can create oval and rectangular outlines with rounded corners using the methods in the
+{@link android.graphics.Outline} class. The default outline provider for views obtains the outline
+from the view's background. To prevent a view from casting a shadow, set its outline provider
+to <code>null</code>.</p>
+
+
+<h2 id="Clip">Clip Views</h2>
+
+<p>Clipping views enables you to easily change the shape of a view. You can clip views for
+consistency with other design elements or to change the shape of a view in response to user input.
+You can clip a view to its outline area using the {@link android.view.View#setClipToOutline
+View.setClipToOutline()} method or the <code>android:clipToOutline</code> attribute. Only
+rectangle, circle, and round rectangle outlines support clipping, as determined by the
+{@link android.graphics.Outline#canClip Outline.canClip()} method.</p>
+
+<p>To clip a view to the shape of a drawable, set the drawable as the background of the view
+(as shown above) and call the {@link android.view.View#setClipToOutline View.setClipToOutline()}
+method.</p>
+
+<p>Clipping views is an expensive operation, so don't animate the shape you use to
+clip a view. To achieve this effect, use the <a
+href="{@docRoot}training/material/animations.html#Reveal">Reveal Effect</a> animation.</p>
diff --git a/docs/html/training/material/theme.jd b/docs/html/training/material/theme.jd
new file mode 100644
index 0000000..17894f6
--- /dev/null
+++ b/docs/html/training/material/theme.jd
@@ -0,0 +1,131 @@
+page.title=Using the Material Theme
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+<h2>This lesson teaches you to</h2>
+<ol>
+ <li><a href="#ColorPalette">Customize the Color Palette</a></li>
+ <li><a href="#StatusBar">Customize the Status Bar</a></li>
+ <li><a href="#Inheritance">Theme Individual Views</a></li>
+</ol>
+<h2>You should also read</h2>
+<ul>
+ <li><a href="http://www.google.com/design/spec">Material design specification</a></li>
+ <li><a href="{@docRoot}design/material/index.html">Material design on Android</a></li>
+</ul>
+</div>
+</div>
+
+
+<p>The new material theme provides:</p>
+
+<ul>
+ <li>System widgets that let you set their color palette</li>
+ <li>Touch feedback animations for the system widgets</li>
+ <li>Activity transition animations</li>
+</ul>
+
+<p>You can customize the look of the material theme
+according to your brand identity with a color palette you control. You can tint the action bar and
+the status bar using theme attributes, as shown in <a href="#fig3">Figure 3</a>.</p>
+
+<p>The system widgets have a new design and touch feedback animations. You can customize the
+color palette, the touch feedback animations, and the activity transitions for your app.</p>
+
+<p>The material theme is defined as:</p>
+
+<ul>
+ <li><code>@android:style/Theme.Material</code> (dark version)</li>
+ <li><code>@android:style/Theme.Material.Light</code> (light version)</li>
+ <li><code>@android:style/Theme.Material.Light.DarkActionBar</code></li>
+</ul>
+
+<p>For a list of material styles that you can use, see the API reference for
+{@link android.R.style R.style}.</p>
+
+<!-- two columns, dark/light material theme example -->
+<div style="width:700px;margin-top:25px;margin-bottom:10px">
+<div style="float:left;width:250px;margin-left:40px;margin-right:60px;">
+ <img src="{@docRoot}design/material/images/MaterialDark.png" width="500" height="238">
+ <div style="width:170px;margin:0 auto">
+ <p style="margin-top:8px;font-size:12px"><strong>Figure 1</strong>. Dark material theme</p>
+ </div>
+</div>
+<div style="float:left;width:250px;margin-right:0px;">
+ <img src="{@docRoot}design/material/images/MaterialLight.png" width="500" height="238">
+ <div style="width:170px;margin:0 auto">
+ <p style="margin-top:8px;font-size:12px"><strong>Figure 2</strong>. Light material theme</p>
+ </div>
+</div>
+<br style="clear:left">
+</div>
+
+<p class="note">
+<strong>Note:</strong> The material theme is only available in Android 5.0 (API level 21) and
+above. The <a href="{@docRoot}tools/support-library/features.html#v7">v7 Support Libraries</a>
+provide themes with material design styles for some widgets and support for customizing the color
+palette. For more information, see
+<a href="{@docRoot}training/material/compatibility.html">Maintaining Compatibility</a>.
+</p>
+
+
+<h2 id="ColorPalette">Customize the Color Palette</h2>
+
+<p style="margin-bottom:30px">To customize the theme's base colors to fit your brand, define
+your custom colors using theme attributes when you inherit from the material theme:</p>
+
+<pre>
+<resources>
+ <!-- inherit from the material theme -->
+ <style name="AppTheme" parent="android:Theme.Material">
+ <!-- Main theme colors -->
+ <!-- your app branding color for the app bar -->
+ <item name="android:colorPrimary">@color/primary</item>
+ <!-- darker variant for the status bar and contextual app bars -->
+ <item name="android:colorPrimaryDark">@color/primary_dark</item>
+ <!-- theme UI controls like checkboxes and text fields -->
+ <item name="android:colorAccent">@color/accent</item>
+ </style>
+</resources>
+</pre>
+
+<div style="float:right;margin-left:25px;margin-top:20px;margin-bottom:10px" id="fig3">
+<img src="{@docRoot}training/material/images/ThemeColors.png" width="250" height="445"/>
+<p class="img-caption" style="margin-bottom:0px">
+<strong>Figure 3.</strong> Customizing the material theme.</p>
+</div>
+
+
+<h2 id="StatusBar">Customize the Status Bar</h2>
+
+<p>The material theme lets you easily customize the status bar, so you can specify a
+color that fits your brand and provides enough contrast to show the white status icons. To
+set a custom color for the status bar, use the <code>android:statusBarColor</code> attribute when
+you extend the material theme. By default, <code>android:statusBarColor</code> inherits the
+value of <code>android:colorPrimaryDark</code>.</p>
+
+<p>You can also draw behind the status bar yourself. For example, if you want to show
+the status bar transparently over a photo, with a subtle dark gradient to ensure the white
+status icons are visible. To do so, set the <code>android:statusBarColor</code> attribute to
+<code>@android:color/transparent</code> and adjust the window flags as required. You can
+also use the {@link android.view.Window#setStatusBarColor Window.setStatusBarColor()} method for
+animations or fading.</p>
+
+<p class="note">
+<strong>Note:</strong> The status bar should almost always have a clear delineation from the
+primary toolbar, except for cases where you show edge-to-edge rich imagery or media content behind
+these bars and when you use a gradient to ensure that the icons are still visible.
+</p>
+
+<p>When you customize the navigation and status bars, either make them both transparent or modify
+only the status bar. The navigation bar should remain black in all other cases.</p>
+
+
+<h2 id="Inheritance">Theme Individual Views</h3>
+
+<p>Elements in XML layout definitions can specify the <code>android:theme</code> attribute,
+which references a theme resource. This attribute modifies the theme for the element and any
+child elements, which is useful for altering theme color palettes in a specific portion
+of an interface.</p>
diff --git a/docs/html/training/search/index.jd b/docs/html/training/search/index.jd
index 612e8e8..66874bb 100644
--- a/docs/html/training/search/index.jd
+++ b/docs/html/training/search/index.jd
@@ -49,5 +49,5 @@
<dt><b><a href="backward-compat.html">Remaining Backward Compatible</a></b></dt>
- <dd>Learn how to keep search features backward compatible with older devices by using.</dd>
+ <dd>Learn how to keep search features backward compatible with older devices.</dd>
</dl>
diff --git a/docs/html/training/training_toc.cs b/docs/html/training/training_toc.cs
index 03fb812..9f06666 100644
--- a/docs/html/training/training_toc.cs
+++ b/docs/html/training/training_toc.cs
@@ -834,11 +834,17 @@
</li>
</ul>
</li>
+ <li>
+ <a href="<?cs var:toroot ?>training/articles/wear-location-detection.html"
+ description=
+ "How to detect location data on Android Wear devices."
+ >Detecting Location</a>
+ </li>
</ul>
</li>
-
<!-- End Building for wearables -->
+
<!-- Start: Building for TV -->
<li class="nav-section">
<div class="nav-section-header">
@@ -892,13 +898,17 @@
<a href="<?cs var:toroot ?>training/tv/playback/details.html">
Building a Details View</a>
</li>
+ <li>
+ <a href="<?cs var:toroot ?>training/tv/playback/now-playing.html">
+ Displaying a Now Playing Card</a>
+ </li>
</ul>
</li>
<li class="nav-section">
<div class="nav-section-header">
<a href="<?cs var:toroot ?>training/tv/discovery/index.html"
- description="How to help users discovery content from your app.">
+ description="How to help users discover content from your app.">
Helping Users Find Content on TV</a>
</div>
<ul>
@@ -920,8 +930,9 @@
</li>
<li>
- <a href="<?cs var:toroot ?>training/tv/tif/index.html">
- TV Input Framework</a>
+ <a href="<?cs var:toroot ?>training/tv/tif/index.html"
+ description="How to build Live TV apps.">
+ Building Live TV Apps</a>
</li>
</ul>
</li>
@@ -1241,6 +1252,45 @@
</ul>
</li>
+ <li class="nav-section">
+ <div class="nav-section-header">
+ <a href="<?cs var:toroot ?>training/material/index.html"
+ description=
+ "How to implement material design on Android."
+ >Creating Apps with Material Design</a>
+ </div>
+ <ul>
+ <li><a href="<?cs var:toroot ?>training/material/get-started.html">
+ Getting Started
+ </a>
+ </li>
+ <li><a href="<?cs var:toroot ?>training/material/theme.html">
+ Using the Material Theme
+ </a>
+ </li>
+ <li><a href="<?cs var:toroot ?>training/material/lists-cards.html">
+ Creating Lists and Cards
+ </a>
+ </li>
+ <li><a href="<?cs var:toroot ?>training/material/shadows-clipping.html">
+ Defining Shadows and Clipping Views
+ </a>
+ </li>
+ <li><a href="<?cs var:toroot ?>training/material/drawables.html">
+ Working with Drawables
+ </a>
+ </li>
+ <li><a href="<?cs var:toroot ?>training/material/animations.html">
+ Defining Custom Animations
+ </a>
+ </li>
+ <li><a href="<?cs var:toroot ?>training/material/compatibility.html">
+ Maintaining Compatibility
+ </a>
+ </li>
+ </ul>
+ </li>
+
</ul>
</li>
<!-- End User Interface -->
diff --git a/docs/html/training/tv/discovery/recommendations.jd b/docs/html/training/tv/discovery/recommendations.jd
index 048b649..a6eb152 100644
--- a/docs/html/training/tv/discovery/recommendations.jd
+++ b/docs/html/training/tv/discovery/recommendations.jd
@@ -29,7 +29,7 @@
bring users back to your app.
</p>
-<img src="{@docRoot}preview/tv/images/home-recommendations.png" alt="" id="figure1" />
+<img src="{@docRoot}images/tv/home-recommendations.png" alt="" id="figure1" />
<p class="img-caption">
<strong>Figure 1.</strong> An example of the recommendations row.
</p>
diff --git a/docs/html/training/tv/games/index.jd b/docs/html/training/tv/games/index.jd
index 29b055b..2f510a9 100644
--- a/docs/html/training/tv/games/index.jd
+++ b/docs/html/training/tv/games/index.jd
@@ -31,7 +31,7 @@
</p>
-<h3 id="shared-display">Shared display</h3>
+<h3 id="shared-display">Consider the shared display</h3>
<p>
A living-room TV poses design challenges for multiplayer games, in that all players can see
@@ -57,7 +57,7 @@
</ul>
-<h3 id="landscape-display">Landscape display</h3>
+<h3 id="landscape-display">Support landscape display</h3>
<p>
A TV is always sideways: You can’t turn it, and there is no portrait orientation. Always design
@@ -69,19 +69,19 @@
<p>
TVs don't have touch interfaces, so it's even more important to get your controls right and make
- sure that players find them intuitive and fun to use. The separation of controller from device
- also introduces some other issues to pay attention to, like keeping track of multiple players'
+ sure players find them intuitive and fun to use. Handling controllers
+ also introduces some other issues to pay attention to, like keeping track of multiple
controllers, and handling disconnects gracefully.
</p>
-<h3 id="d-pad">D-pad</h3>
+<h3 id="d-pad">Support D-pad controls</h3>
<p>
Plan your control scheme around a directional pad (D-pad) control, since this control set is the
default for Android TV devices. The player needs to be able to use a D-Pad in all aspects of the
- game–not just controlling core gameplay, but also navigating menus and ads. For this reason, you
- should also ensure that your Android TV game does not refer to a touch interface: For example, an
- Android TV game should not tell a player to <strong>Tap here to skip</strong>.
+ game—not just controlling core gameplay, but also navigating menus and ads. For this reason, you
+ should also ensure that your Android TV game does not refer to a touch interface. For example, an
+ Android TV game should not tell a player to "<em>Tap</em> here to continue."
</p>
<p>
@@ -91,35 +91,35 @@
<ul>
<li>
- <strong>Communicate Controller Requirements up Front</strong> - Use your Play Store description
+ <strong>Communicate Controller Requirements up Front</strong>. Use your Google Play description
to communicate to the player any expectations about controllers. If a game is better suited to
a gamepad with a joystick than one with only a D-pad, make this fact clear. A player who uses
- an ill-suited controller for a game is likely to have a subpar experience–and penalize your
+ an ill-suited controller for a game is likely to have a subpar experience and penalize your
game in the ratings.
</li>
<li>
- <strong>Use Consistent Button Mapping</strong> - Intuitive and flexible button mapping is key
- to a good user experience. For example, you can adhere to accepted custom by using the A button
- to <code>Accept</code>, and the B button to <code>Cancel</code>. You can also offer flexibility
- in the form of remappability. For more information on button mapping, see <a href=
+ <strong>Use Consistent Button Mapping</strong>. Intuitive and flexible button mapping is key
+ to a good user experience. For example, you should adhere to accepted customs by using the A button
+ to <em>Accept</em>, and the B button to <em>Cancel</em>. You can also offer flexibility
+ in the form of remappability. For more information about button mapping, see <a href=
"http://developer.android.com/training/game-controllers/controller-input.html">Handling
Controller Actions</a>.
</li>
<li>
- <strong>Detect Controller Capabilities and Adjust Accordingly</strong> - Query the controller
+ <strong>Detect Controller Capabilities and Adjust Accordingly</strong>. Query the controller
about its capabilities in order to optimize the match between controller and game. For example,
you may intend for a player to steer an object by waving the controller in the air. If a
player's controller lacks accelerometer and gyroscope hardware, however, waving will not work.
- When, however, your game queries the controller and discovers that motion detection is not
- supported, it can switch over to an alternative, available control scheme. For more information
- on querying controller capabilities, see <a href=
+ So, your game should query the controller and if motion detection is not
+ supported, switch over to an alternative, available control scheme. For more information
+ about querying controller capabilities, see <a href=
"http://developer.android.com/training/game-controllers/compatibility.html">Supporting
Controllers Across Android Versions</a>.
</li>
</ul>
-<h3 id="back-button">Back-button behavior</h3>
+<h3 id="back-button">Provide appropriate Back-button behavior</h3>
<p>
The Back button should never act as a toggle. For example, do not use it to both open and close a
@@ -139,18 +139,18 @@
</p>
-<h3 id="multiple-controllers">Handling multiple controllers</h3>
+<h3 id="multiple-controllers">Handle multiple controllers</h3>
<p>
When multiple players are playing a game, each with his or her own controller, it is important to
- map each player-controller pair. For information on how to implement controller-number
+ map each player-controller pair. For information about how to implement controller-number
identification, see <a href=
"http://developer.android.com/reference/android/view/InputDevice.html#getControllerNumber">Input
Devices</a>.
</p>
-<h3 id="handle-disconnect">Handling disconnects</h3>
+<h3 id="handle-disconnect">Handle controller disconnects</h3>
<p>
When a controller is disconnected in the middle of gameplay, the game should pause, and a dialog
@@ -159,7 +159,7 @@
<p>
The dialog should also offer troubleshooting tips (for example, a pop-up dialog telling the
- player to "Check your Bluetooth connection"). For more information on implementing input-device
+ player to "Check your Bluetooth connection"). For more information about implementing input-device
support, see <a href=
"http://developer.android.com/training/game-controllers/controller-input.html">Handling Controller
Actions</a>. Specific information about Bluetooth connections is at <a href=
@@ -167,25 +167,53 @@
</p>
+<h3 id="ControllerHelp">Show controller instructions</h3>
+
+<p>If your game provides visual game control instructions, the
+controller image should be free of branding and include only <a
+href="{@docRoot}training/game-controllers/controller-input.html#button"
+>buttons compatible with Android</a>.</p>
+
+<p>For sample images of an Android-compatible controller, download the
+<a href="http://storage.googleapis.com/androiddevelopers/design/android_tv_gamepad_template-2014-10.zip"
+>Android TV Gamepad Template (ZIP)</a>.
+It includes a white controller on black background and a black controller on white background
+(shown in figure 1), as a PNG file and an Adobe® Illustrator® file.</p>
+
+<img src="{@docRoot}images/games/game-controller-buttons_2x.png" width="700"
+ srcset="{@docRoot}images/games/game-controller-buttons_2x.png 2x,
+ {@docRoot}images/games/game-controller-buttons.png 1x" />
+<p class="img-caption"><b>Figure 1.</b> Example controller instructions using the
+<a href="http://storage.googleapis.com/androiddevelopers/design/android_tv_gamepad_template-2014-10.zip"
+>Android TV Gamepad Template (ZIP)</a>.
+
+
+
+
<h2 id="manifest">Manifest</h2>
+<p>There are a some special things games should include in the Android manifest.</p>
+
+<h3 id="Launcher">Show your game in the launcher</h3>
<p>
- The Android TV launcher home screen displays games in a separate row from regular apps. The TV
- framework uses the <code>android:isGame</code> manifest attribute to differentiate games from
- non-game apps. Set this value to <code>true</code> in your game's app manifest, as shown in the
- following code example:
+ The Android TV launcher home screen displays games in a separate row from regular apps.
+ To make your game appear in the list of games, add the
+ <a href="{@docRoot}guide/topics/manifest/meta-data-element.html"
+ ><code><meta-data></code></a> tag in your app manifest with <code>android:name</code>
+ set to <code>"isGame"</code> and <code>android:value</code>
+ set to <code>"true"</code>. For example:
</p>
<pre class="fragment">
<application>
...
- < meta-data android:name="isGame" android:value="true" >
+ <meta-data android:name="isGame" android:value="true" >
...
</application>
</pre>
-<h3 id="gamepad">Game Controllers</h3>
+<h3 id="gamepad">Declare support for game controllers</h3>
<p>
Games controllers may not be available or active for users of a TV device. In order to properly
@@ -215,7 +243,9 @@
<h2 id="gpgs">Google Play Game Services</h2>
<p>
- If your game integrates Google Play Game Services, you should keep in mind a number of
+ If your game integrates <a
+ href="https://developers.google.com/games/services/">Google Play Game services</a>,
+ you should keep in mind a number of
considerations pertaining to achievements, sign-in, saving games, and multiplayer play.
</p>
@@ -224,7 +254,7 @@
<p>
Your game should include at least five (earnable) achievements. Only a user controlling gameplay
- from a supported input device should be able to earn achievements. For more information on
+ from a supported input device should be able to earn achievements. For more information about
achievements and how to implement them, see <a href=
"https://developers.google.com/games/services/android/achievements">Achievements in Android</a>.
</p>
@@ -262,7 +292,7 @@
<p>
A game offering a multiplayer experience must allow at least two players to enter a room. For
- further information on multiplayer games in Android, see the <a href=
+ further information about multiplayer games in Android, see the <a href=
"https://developers.google.com/games/services/android/realtimeMultiplayer">Real-time
Multiplayer</a> and <a href="">Turn-based Multiplayer</a> documentation on the Android developer
site.
diff --git a/docs/html/training/tv/playback/index.jd b/docs/html/training/tv/playback/index.jd
index d7167e7..118fc6c 100644
--- a/docs/html/training/tv/playback/index.jd
+++ b/docs/html/training/tv/playback/index.jd
@@ -46,4 +46,7 @@
<dt><b><a href="details.html">Building a Details View</a></b></dt>
<dd>Learn how to use the Leanback support library to build a details page for media items.</dd>
+
+ <dt><b><a href="now-playing.html">Displaying a Now Playing Card</a></b></dt>
+ <dd>Learn how to use a MediaSession to display a Now Playing card on the home screen.</dd>
</dl>
diff --git a/docs/html/training/tv/playback/now-playing.jd b/docs/html/training/tv/playback/now-playing.jd
new file mode 100644
index 0000000..b64beb0
--- /dev/null
+++ b/docs/html/training/tv/playback/now-playing.jd
@@ -0,0 +1,167 @@
+page.title=Displaying a Now Playing Card
+page.tags="nowplaying","mediasession"
+
+trainingnavtop=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>This lesson teaches you to</h2>
+ <ol>
+ <li><a href="#session">Start a Media Session</a></li>
+ <li><a href="#card">Display a Now Playing Card</a></li>
+ <li><a href="#state">Update the Playback State</a></li>
+ <li><a href="#respond">Respond to User Action</a></li>
+ </ol>
+
+</div>
+</div>
+
+<p>TV apps may allow users to play music or other media in the background while using other
+applications. If your app allows this type of use, it must must
+provide a means for the user to return to the app to pause the music or switch to a new song. The
+Android framework enables TV apps to do this by displaying a <em>Now Playing</em> card on the home
+screen in the recommendations row.</p>
+
+<p>The Now Playing card is a system artifact that displays on the
+home screen in the recommendations row for an active media session. It includes the media metadata
+such as the album art, title, and app icon. When the user selects it, the system opens the the app
+that owns the session.</p>
+
+<p>This lesson shows how to use the {@link android.media.session.MediaSession} class to implement
+the Now Playing card.</p>
+
+<h2 id="session">Start a Media Session</h2>
+
+<p>A playback app can run as an <a href="{@docRoot}guide/components/activities">activity</a> or
+as a <a href="{@docRoot}guide/components/services">service</a>. The service is required for
+background playback because it can continue to play media even after the activity that launched it
+has been destroyed. For this discussion, the media playback app is assumed to be running in a
+{@link android.service.media.MediaBrowserService}.</p>
+
+<p>In your service's {@link android.service.media.MediaBrowserService#onCreate() onCreate()}
+method, create a new {@link android.media.session.MediaSession#MediaSession(android.content.Context, java.lang.String) MediaSession},
+set the callback and flags appropriate to a media app, and set the session token for the
+{@link android.service.media.MediaBrowserService}.</p>
+
+<pre>
+mSession = new MediaSession(this, "MusicService");
+mSession.setCallback(new MediaSessionCallback());
+mSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS |
+ MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
+
+// for the MediaBrowserService
+setSessionToken(mSession.getSessionToken());
+</pre>
+
+<p class="note"<strong>Note:</strong> The Now Playing card will display only for a media session with
+the {@link android.media.session.MediaSession#FLAG_HANDLES_TRANSPORT_CONTROLS} flag set.</p>
+
+<h2 id="card">Display a Now Playing Card</h2>
+
+<p>The Now Playing card shows up after {@link android.media.session.MediaSession#setActive(boolean) setActive(true)}
+is called, if the session is the highest priority session in the system. Also, note that your app
+must request the audio focus, as described in <a href="{@docRoot}training/managing-audio/audio-focus">
+Managing Audio Focus</a>.</p>
+
+<pre>
+private void handlePlayRequest() {
+
+ tryToGetAudioFocus();
+
+ if (!mSession.isActive()) {
+ mSession.setActive(true);
+ }
+...
+</pre>
+
+<p>The card is removed from the home screen when {@link android.media.session.MediaSession#setActive(boolean) setActive(false)}
+is called or if another app initiates media playback. You may want to remove the card from the home
+screen some time after playback is paused, depending on how long you want to keep the card up,
+usually 5 to 30 minutes.</p>
+
+<h2 id="state">Update the Playback State</h2>
+
+<p>As with any media app, update the playback state in the {@link android.media.session.MediaSession}
+so that the card can display the current metadata, as shown in the following example:</p>
+
+<pre>
+private void updatePlaybackState() {
+ long position = PlaybackState.PLAYBACK_POSITION_UNKNOWN;
+ if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
+ position = mMediaPlayer.getCurrentPosition();
+ }
+ PlaybackState.Builder stateBuilder = new PlaybackState.Builder()
+ .setActions(getAvailableActions());
+ stateBuilder.setState(mState, position, 1.0f);
+ mSession.setPlaybackState(stateBuilder.build());
+}
+private long getAvailableActions() {
+ long actions = PlaybackState.ACTION_PLAY |
+ PlaybackState.ACTION_PLAY_FROM_MEDIA_ID |
+ PlaybackState.ACTION_PLAY_FROM_SEARCH;
+ if (mPlayingQueue == null || mPlayingQueue.isEmpty()) {
+ return actions;
+ }
+ if (mState == PlaybackState.STATE_PLAYING) {
+ actions |= PlaybackState.ACTION_PAUSE;
+ }
+ if (mCurrentIndexOnQueue > 0) {
+ actions |= PlaybackState.ACTION_SKIP_TO_PREVIOUS;
+ }
+ if (mCurrentIndexOnQueue < mPlayingQueue.size() - 1) {
+ actions |= PlaybackState.ACTION_SKIP_TO_NEXT;
+ }
+ return actions;
+}
+</pre>
+
+<h2 id="metadata">Display the Media Metadata</h2>
+
+<p>For the track currently playing, set the {@link android.media.MediaMetadata} with the
+{@link android.media.session.MediaSession#setMetadata(android.media.MediaMetadata) setMetadata()}
+method. This method of the media session object lets you provide information to the Now Playing card
+about the track such as the title, subtitle, and various icons. The following example assumes your
+track's data is stored in a custom data class, {@code MediaData}.</p>
+
+<pre>
+private void updateMetadata(MediaData myData) {
+ MediaMetadata.Builder metadataBuilder = new MediaMetadata.Builder();
+ // To provide most control over how an item is displayed set the
+ // display fields in the metadata
+ metadataBuilder.putString(MediaMetadata.METADATA_KEY_DISPLAY_TITLE,
+ myData.displayTitle);
+ metadataBuilder.putString(MediaMetadata.METADATA_KEY_DISPLAY_SUBTITLE,
+ myData.displaySubtitle);
+ metadataBuilder.putString(MediaMetadata.METADATA_KEY_DISPLAY_ICON_URI,
+ myData.artUri);
+ // And at minimum the title and artist for legacy support
+ metadataBuilder.putString(MediaMetadata.METADATA_KEY_TITLE,
+ myData.title);
+ metadataBuilder.putString(MediaMetadata.METADATA_KEY_ARTIST,
+ myData.artist);
+ // A small bitmap for the artwork is also recommended
+ metadataBuilder.putString(MediaMetadata.METADATA_KEY_ART,
+ myData.artBitmap);
+ // Add any other fields you have for your data as well
+ mSession.setMetadata(metadataBuilder.build());
+}
+</pre>
+
+<h2 id="respond">Respond to User Action</h2>
+
+<p>When the user selects the Now Playing card, the system opens the app that owns the session.
+If your app provides a {@link android.app.PendingIntent} to pass to
+{@link android.media.session.MediaSession#setSessionActivity(android.app.PendingIntent) setSessionActivity()},
+the system launches the activity you specify, as demonstrated below. If not, the default system
+intent opens. The activity you specify must provide playback controls that allow users to pause or
+stop playback.</p>
+
+<pre>
+Intent intent = new Intent(mContext, MyActivity.class);
+ PendingIntent pi = PendingIntent.getActivity(context, 99 /*request code*/,
+ intent, PendingIntent.FLAG_UPDATE_CURRENT);
+ mSession.setSessionActivity(pi);
+</pre>
+
diff --git a/docs/html/training/tv/tif/index.jd b/docs/html/training/tv/tif/index.jd
index aac640c..4746e42 100644
--- a/docs/html/training/tv/tif/index.jd
+++ b/docs/html/training/tv/tif/index.jd
@@ -1,8 +1,19 @@
-page.title=TV Input Framework
+page.title=Building Live TV Apps
page.tags=tif
+page.article=true
@jd:body
+<div id="tb-wrapper">
+<div id="tb">
+ <h2>You should also read</h2>
+ <ul>
+ <li><a href="{@docRoot}reference/android/media/tv/package-summary.html">
+ android.media.tv</a></li>
+ </ul>
+</div>
+</div>
+
<p>
Watching live television shows and other continuous, channel-based content is a big part of the
TV experience. Android supports receiving and playback of live video content through the TV Input
diff --git a/docs/html/training/wearables/apps/index.jd b/docs/html/training/wearables/apps/index.jd
index 7d961b7..256205b 100644
--- a/docs/html/training/wearables/apps/index.jd
+++ b/docs/html/training/wearables/apps/index.jd
@@ -1,5 +1,6 @@
page.title=Creating Wearable Apps
-page.image=wear/images/notifications.png
+page.tags="wear","wearable","app"
+page.image=wear/images/01_create.png
@jd:body
diff --git a/docs/html/training/wearables/notifications/index.jd b/docs/html/training/wearables/notifications/index.jd
index 17f3cb3..a7b6733 100644
--- a/docs/html/training/wearables/notifications/index.jd
+++ b/docs/html/training/wearables/notifications/index.jd
@@ -1,4 +1,6 @@
page.title=Adding Wearable Features to Notifications
+page.tags="wear","notifications","wearables"
+page.image=wear/images/01_notifications.png
@jd:body
<div id="tb-wrapper">
diff --git a/docs/html/training/wearables/notifications/stacks.jd b/docs/html/training/wearables/notifications/stacks.jd
index e71e74c..9a528a4 100644
--- a/docs/html/training/wearables/notifications/stacks.jd
+++ b/docs/html/training/wearables/notifications/stacks.jd
@@ -45,7 +45,7 @@
Notification notif = new NotificationCompat.Builder(mContext)
.setContentTitle("New mail from " + sender1)
.setContentText(subject1)
- .setSmallIcon(R.drawable.new_mail);
+ .setSmallIcon(R.drawable.new_mail)
.setGroup(GROUP_KEY_EMAILS)
.build();
@@ -65,7 +65,7 @@
Notification notif2 = new NotificationCompat.Builder(mContext)
.setContentTitle("New mail from " + sender2)
.setContentText(subject2)
- .setSmallIcon(R.drawable.new_mail);
+ .setSmallIcon(R.drawable.new_mail)
.setGroup(GROUP_KEY_EMAILS)
.build();
diff --git a/docs/html/training/wearables/ui/index.jd b/docs/html/training/wearables/ui/index.jd
index 8ef6fe7..5d97490 100644
--- a/docs/html/training/wearables/ui/index.jd
+++ b/docs/html/training/wearables/ui/index.jd
@@ -1,4 +1,5 @@
page.title=Creating Custom UIs for Wear Devices
+page.image=wear/images/10_uilib.png
@jd:body
diff --git a/docs/html/preview/tv/adt-1/index.jd b/docs/html/tv/adt-1/index.jd
similarity index 95%
rename from docs/html/preview/tv/adt-1/index.jd
rename to docs/html/tv/adt-1/index.jd
index b37a55a..82760ed 100644
--- a/docs/html/preview/tv/adt-1/index.jd
+++ b/docs/html/tv/adt-1/index.jd
@@ -1,8 +1,14 @@
page.title=ADT-1 Developer Kit
page.tags="emote","e-mote","adt"
+fullpage=1
@jd:body
+
+<div class="wrap" style="width:940px;">
+
+<h1>ADT-1 Developer Kit</h1>
+
<div id="qv-wrapper">
<div id="qv">
<h2>In this document</h2>
@@ -29,9 +35,9 @@
<p class="note">
<strong>Note:</strong> The ADT-1 kit <em>is not required</em> for building and testing apps
for Android TV. You can build apps for TV and test them using an emulator for TV devices. The
- L Developer Preview includes all the software needed to build TV apps and an emulator for running
+ Android SDK includes all the software needed to build TV apps and an emulator for running
and testing them. For more information, see the
- <a href="{@docRoot}preview/tv/start/index.html">Get Started</a> guide for TV apps.
+ <a href="{@docRoot}training/tv/start/index.html">Get Started</a> guide for TV apps.
</p>
<h2 id="faq">ADT-1 Frequently Asked Questions</h2>
@@ -280,7 +286,7 @@
<h2 id="emote">Android TV Remote Control App</h2>
<div class="figure" style="width:250px;margin-top:0">
-<img src="/preview/tv/images/android-tv-remote.png" alt="Android TV Remote Screenshots">
+<img src="{@docRoot}tv/images/android-tv-remote.png" alt="Android TV Remote Screenshots">
</div>
<p>A remote control app is available for Android phones and tablets that allows you to interact
@@ -308,3 +314,9 @@
<li><a href="regulatory.html">Regulatory Disclosures</a></li>
<li><a href="safety.html">Important Safety Information</a></li>
</ul>
+
+</div> <!-- end.class.wrap -->
+
+<div class="layout-content-col col-16" style="padding-top:1px">
+ <!-- layout div, so auto-gen footer sits correctly; do not remove -->
+</div>
diff --git a/docs/html/preview/tv/adt-1/regulatory.jd b/docs/html/tv/adt-1/regulatory.jd
similarity index 94%
rename from docs/html/preview/tv/adt-1/regulatory.jd
rename to docs/html/tv/adt-1/regulatory.jd
index 2f5bf7e..f92ce3e 100644
--- a/docs/html/preview/tv/adt-1/regulatory.jd
+++ b/docs/html/tv/adt-1/regulatory.jd
@@ -1,9 +1,12 @@
page.title=Regulatory Disclosures for ADT-1
-parent.title=ADT-1 Developer Kit
-parent.link=index.html
+fullpage=1
@jd:body
+<div class="wrap" style="width:940px;">
+
+<h1>Regulatory Disclosures for ADT-1</h1>
+
<p>Disclosures for the <a href="index.html">ADT-1</a> device.</p>
<p>
@@ -77,3 +80,9 @@
doit être utilisé de sorte que la possibilité d'un contact humain pendant le fonctionnement
normal soit limitée.
</p>
+
+</div> <!-- end.class.wrap -->
+
+<div class="layout-content-col col-16" style="padding-top:1px">
+ <!-- layout div, so auto-gen footer sits correctly; do not remove -->
+</div>
diff --git a/docs/html/preview/tv/adt-1/safety.jd b/docs/html/tv/adt-1/safety.jd
similarity index 95%
rename from docs/html/preview/tv/adt-1/safety.jd
rename to docs/html/tv/adt-1/safety.jd
index 1984853..79a9736 100644
--- a/docs/html/preview/tv/adt-1/safety.jd
+++ b/docs/html/tv/adt-1/safety.jd
@@ -1,9 +1,12 @@
page.title=Important Safety Instructions for ADT-1
-parent.title=ADT-1 Developer Kit
-parent.link=index.html
+fullpage=1
@jd:body
+<div class="wrap" style="width:940px;">
+
+<h1>Important Safety Instructions for ADT-1</h1>
+
<p>Safety information for the <a href="index.html">ADT-1</a> device.</p>
<p>
@@ -138,3 +141,10 @@
<p>Le défaut de suivre ces instructions de sécurité pourrait provoquer un feu, un choc
électrique, un dommage à l’Appareil ou à d’autres objets ou des lésions corporelles.</p>
+
+
+</div> <!-- end.class.wrap -->
+
+<div class="layout-content-col col-16" style="padding-top:1px">
+ <!-- layout div, so auto-gen footer sits correctly; do not remove -->
+</div>
diff --git a/docs/html/preview/tv/images/android-tv-remote.png b/docs/html/tv/images/android-tv-remote.png
similarity index 100%
rename from docs/html/preview/tv/images/android-tv-remote.png
rename to docs/html/tv/images/android-tv-remote.png
Binary files differ
diff --git a/docs/html/tv/images/atv-framed.png b/docs/html/tv/images/atv-framed.png
index 4cedab2..947f94e 100644
--- a/docs/html/tv/images/atv-framed.png
+++ b/docs/html/tv/images/atv-framed.png
Binary files differ
diff --git a/docs/html/tv/index.jd b/docs/html/tv/index.jd
index ff70977..71e177b 100644
--- a/docs/html/tv/index.jd
+++ b/docs/html/tv/index.jd
@@ -36,7 +36,7 @@
</div>
<div class="landing-body">
- <a href="{@docRoot}preview/tv/start/index.html" class="landing-button
+ <a href="{@docRoot}training/tv/index.html" class="landing-button
landing-primary" style="margin-top: 40px;">
Get Started
</a>
@@ -73,7 +73,7 @@
effort.
</p>
<p class="landing-small">
- <a href="{@docRoot}preview/tv/design/index.html">Learn about design for TV</a>
+ <a href="{@docRoot}design/tv/index.html">Learn about design for TV</a>
</p>
</div>
@@ -104,7 +104,7 @@
catalogs.
</p>
<p class="landing-small">
- <a href="{@docRoot}preview/tv/ui/browse.html">Learn pre-built fragments</a>
+ <a href="{@docRoot}training/tv/playback/index.html">Learn pre-built fragments</a>
</p>
</div>
@@ -117,7 +117,7 @@
Help users find your content quickly with in-app searching.
</p>
<p class="landing-small">
- <a href="{@docRoot}preview/tv/ui/in-app-search.html">Learn about app search</a>
+ <a href="{@docRoot}training/tv/discovery/in-app-search.html">Learn about app search</a>
</p>
</div>
@@ -130,7 +130,7 @@
Suggest content from your app to keep your users coming back.
</p>
<p class="landing-small">
- <a href="{@docRoot}preview/tv/ui/recommendations.html">Learn about
+ <a href="{@docRoot}training/tv/discovery/recommendations.html">Learn about
recommendations</a>
</p>
</div>
@@ -141,78 +141,106 @@
</div> <!-- end .wrap -->
</div> <!-- end .landing-section -->
- <div class="landing-section landing-red-background" id="start">
+
+ <div class="landing-section landing-red-background">
<div class="wrap">
<div class="landing-section-header">
<div class="landing-h1 landing-align-left">Get Started with Android TV</div>
- <div class="landing-body">
- <p>Begin building TV apps right away using these developer resources:</p>
+
+ <div class="landing-subhead landing-subhead-red">
+ <p>
+ Set up your development environment to build apps for TV.
+ Start creating your big-screen experience!
+ </p>
</div>
</div>
-
<div class="landing-body">
- <div class="landing-breakout cols">
- <div class="col-8" style="margin-left: -8px;">
- <p style="font-size: 24px;">L Developer Preview</p>
- <p>
- Get all the tools you need to build and test TV apps. Download the preview and
- start creating your big-screen experience.
- </p>
-
- </div>
-
- <div class="col-8">
- <p style="font-size: 24px;">ADT-1 Developer Kit</p>
- <p>
- Request an <a href="{@docRoot}preview/tv/adt-1/index.html"
- style="color: white;"><u>ADT-1 Developer Kit</u></a>, a compact and powerful
- streaming media player and gamepad, ideal for developing and testing apps for TV.
- </p>
-
- </div>
-
- </div>
+ <a href="{@docRoot}training/tv/start/index.html" class="landing-button landing-primary"
+ style="margin-top: 20px;">
+ Get Started
+ </a>
</div>
-
- <div class="landing-body">
- <div class="landing-breakout cols">
-
- <div class="col-8">
- <a href="{@docRoot}preview/tv/start/index.html" class="landing-button landing-primary">
- Get Started
- </a>
- </div>
-
- <div class="col-8">
- <a href="https://support.google.com/googleplay/android-developer/contact/adt_request"
- class="landing-button landing-primary">
- Request the ADT-1 Developer Kit
- </a>
- </div>
- </div>
- </div>
-
</div> <!-- end .wrap -->
</div> <!-- end .landing-section -->
+ <div class="landing-section">
+ <div class="wrap">
+ <div class="cols">
+ <div class="landing-body">
+
+ <div class="col-3-wide">
+ <a target="_blank" href="http://android-developers.blogspot.com/2014/06/android-tv-and-google-cast.html">
+ <img class="landing-social-image" src="{@docRoot}wear/images/blogger.png" alt="">
+ </a>
+ <div class="landing-social-copy">
+ <p>Blog Post</p>
+ <p class="landing-small">
+ Read more about Android TV development
+ on our blog. Just search for "Android TV".
+ </p>
+ <p class="landing-small">
+ <a target="_blank" href="http://android-developers.blogspot.com">Android
+ Developers Blog</a>
+ </p>
+ <p></p>
+ </div>
+ </div>
+
+ <div class="col-3-wide">
+ <a target="_blank" href="http://g.co/androidtvdev">
+ <img class="landing-social-image" src="//www.google.com/images/icons/product/gplus-128.png" alt="+Android Wear Developers">
+ </a>
+ <div class="landing-social-copy">
+ <p>G+ Community</p>
+ <p class="landing-small">
+ Follow us on Google+ to stay up-to-date with Android TV development and to
+ join the discussion!
+ </p>
+ <p class="landing-small">
+ <a target="_blank" href="http://g.co/androidtvdev">+Android TV Developers</a>
+ </p>
+ </div>
+ </div>
+
+ <div class="col-3-wide">
+ <a target="_blank" href="{@docRoot}tv/adt-1/index.html">
+ <img class="landing-social-image" src="{@docRoot}wear/images/blogger.png" alt="">
+ </a>
+ <div class="landing-social-copy">
+ <p>ADT-1 Kit</p>
+ <p class="landing-small">
+ Get information about the streaming media player
+ for developing and testing apps for TV.
+ </p>
+ <p class="landing-small">
+ <a target="_blank" href="{@docRoot}tv/adt-1/index.html">ADT-1 Development
+ Kit</a>
+ </p>
+ </div>
+ </div>
+
+ </div>
+ </div>
+ </div> <!-- end .wrap -->
+ </div> <!-- end .landing-section -->
+
</div> <!-- end .landing-rest-of-page -->
- <div class="content-footer wrap" itemscope="" itemtype="http://schema.org/SiteNavigationElement"
- style="border-top: none;">
- <div class="layout-content-col col-16" style="padding-top:4px">
- <style>#___plusone_0 {float:right !important;}</style>
- <div class="g-plusone" data-size="medium"></div>
- </div>
+ <div class="content-footer wrap" itemscope="" itemtype="http://schema.org/SiteNavigationElement">
+ <div class="layout-content-col col-16" style="padding-top:4px">
+ <style>#___plusone_0 {float:right !important;}</style>
+ <div class="g-plusone" data-size="medium"></div>
</div>
- <div id="footer" class="wrap" style="width:940px;position:relative;top:-35px;z-index:-1">
- <div id="copyright">
- Except as noted, this content is
- licensed under <a href="http://creativecommons.org/licenses/by/2.5/">
- Creative Commons Attribution 2.5</a>. For details and
- restrictions, see the <a href="/license.html">Content
- License</a>.
- </div>
+ </div>
+ <div id="footer" class="wrap" style="width:940px;position:relative;top:-35px;z-index:-1">
+ <div id="copyright">
+ Except as noted, this content is
+ licensed under <a href="http://creativecommons.org/licenses/by/2.5/">
+ Creative Commons Attribution 2.5</a>. For details and
+ restrictions, see the <a href="/license.html">Content
+ License</a>.
</div>
+ </div>
</div> <!-- end .landing-hero-container -->
diff --git a/docs/html/wear/images/01_create.png b/docs/html/wear/images/01_create.png
new file mode 100644
index 0000000..5a39dde
--- /dev/null
+++ b/docs/html/wear/images/01_create.png
Binary files differ
diff --git a/docs/html/wear/images/02_create.png b/docs/html/wear/images/02_create.png
new file mode 100644
index 0000000..e722df1
--- /dev/null
+++ b/docs/html/wear/images/02_create.png
Binary files differ
diff --git a/docs/html/wear/images/10_uilib.png b/docs/html/wear/images/10_uilib.png
new file mode 100644
index 0000000..de7be57
--- /dev/null
+++ b/docs/html/wear/images/10_uilib.png
Binary files differ
diff --git a/docs/image_sources/distribute/gp-wear-quality.svg b/docs/image_sources/distribute/gp-wear-quality.svg
new file mode 100644
index 0000000..2acf81a
--- /dev/null
+++ b/docs/image_sources/distribute/gp-wear-quality.svg
@@ -0,0 +1,2268 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="2824.887"
+ height="1419.8136"
+ id="svg3004"
+ xml:space="preserve"
+ inkscape:version="0.48.1 "
+ sodipodi:docname="wear_app_quality.svg"><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="1002"
+ id="namedview125"
+ showgrid="false"
+ inkscape:zoom="0.23675905"
+ inkscape:cx="1735.4152"
+ inkscape:cy="-51.97425"
+ inkscape:window-x="1272"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer8"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ fit-margin-top="50"
+ fit-margin-left="200"
+ fit-margin-right="200"
+ fit-margin-bottom="200"><sodipodi:guide
+ orientation="0,1"
+ position="1543.7834,1150.3523"
+ id="guide3963" /><sodipodi:guide
+ orientation="0,1"
+ position="1978.6428,757.82274"
+ id="guide9681" /></sodipodi:namedview><metadata
+ id="metadata3010"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs3008"><clipPath
+ id="clipPath3020"><path
+ d="m 0,1080 1920,0 L 1920,0 0,0 0,1080 z"
+ id="path3022"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3044"><path
+ d="m 391.754,758.654 452.495,0 0,-452.496 -452.495,0 0,452.496 z"
+ id="path3046"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3060"><path
+ d="m 362.683,787.727 510.637,0 0,-510.638 -510.637,0 0,510.638 z"
+ id="path3062"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3086"><path
+ d="m 1058,722 374,0 0,-374 -374,0 0,374 z"
+ id="path3088"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3100"><path
+ d="m 1029,344 432,0 0,-32 -432,0 0,32 z"
+ id="path3102"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3116"><path
+ d="m 1029,756 432,0 0,-32 -432,0 0,32 z"
+ id="path3118"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3060-8"><path
+ d="m 362.683,787.727 510.637,0 0,-510.638 -510.637,0 0,510.638 z"
+ id="path3062-8"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3044-8"><path
+ d="m 391.754,758.654 452.495,0 0,-452.496 -452.495,0 0,452.496 z"
+ id="path3046-8"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3116-3"><path
+ d="m 1029,756 432,0 0,-32 -432,0 0,32 z"
+ id="path3118-0"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3100-0"><path
+ d="m 1029,344 432,0 0,-32 -432,0 0,32 z"
+ id="path3102-0"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3086-0"><path
+ d="m 1058,722 374,0 0,-374 -374,0 0,374 z"
+ id="path3088-4"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3086-0-0"><path
+ d="m 1058,722 374,0 0,-374 -374,0 0,374 z"
+ id="path3088-4-2"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3100-0-7"><path
+ d="m 1029,344 432,0 0,-32 -432,0 0,32 z"
+ id="path3102-0-2"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3116-3-2"><path
+ d="m 1029,756 432,0 0,-32 -432,0 0,32 z"
+ id="path3118-0-6"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3060-8-2"><path
+ d="m 362.683,787.727 510.637,0 0,-510.638 -510.637,0 0,510.638 z"
+ id="path3062-8-4"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3044-8-3"><path
+ d="m 391.754,758.654 452.495,0 0,-452.496 -452.495,0 0,452.496 z"
+ id="path3046-8-8"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3086-4"><path
+ inkscape:connector-curvature="0"
+ d="m 1058,722 374,0 0,-374 -374,0 0,374 z"
+ id="path3088-8" /></clipPath><clipPath
+ id="clipPath3100-8"><path
+ inkscape:connector-curvature="0"
+ d="m 1029,344 432,0 0,-32 -432,0 0,32 z"
+ id="path3102-2" /></clipPath><clipPath
+ id="clipPath3116-4"><path
+ inkscape:connector-curvature="0"
+ d="m 1029,756 432,0 0,-32 -432,0 0,32 z"
+ id="path3118-5" /></clipPath><clipPath
+ id="clipPath3044-8-1"><path
+ inkscape:connector-curvature="0"
+ d="m 391.754,758.654 452.495,0 0,-452.496 -452.495,0 0,452.496 z"
+ id="path3046-8-5" /></clipPath><clipPath
+ id="clipPath3060-8-27"><path
+ inkscape:connector-curvature="0"
+ d="m 362.683,787.727 510.637,0 0,-510.638 -510.637,0 0,510.638 z"
+ id="path3062-8-6" /></clipPath><clipPath
+ id="clipPath3086-0-0-4"><path
+ inkscape:connector-curvature="0"
+ d="m 1058,722 374,0 0,-374 -374,0 0,374 z"
+ id="path3088-4-2-1" /></clipPath><clipPath
+ id="clipPath3100-0-7-1"><path
+ inkscape:connector-curvature="0"
+ d="m 1029,344 432,0 0,-32 -432,0 0,32 z"
+ id="path3102-0-2-5" /></clipPath><clipPath
+ id="clipPath3116-3-2-9"><path
+ inkscape:connector-curvature="0"
+ d="m 1029,756 432,0 0,-32 -432,0 0,32 z"
+ id="path3118-0-6-5" /></clipPath><clipPath
+ id="clipPath3044-8-3-2"><path
+ inkscape:connector-curvature="0"
+ d="m 391.754,758.654 452.495,0 0,-452.496 -452.495,0 0,452.496 z"
+ id="path3046-8-8-2" /></clipPath><clipPath
+ id="clipPath3060-8-2-1"><path
+ inkscape:connector-curvature="0"
+ d="m 362.683,787.727 510.637,0 0,-510.638 -510.637,0 0,510.638 z"
+ id="path3062-8-4-5" /></clipPath><clipPath
+ id="clipPath3942"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3944"
+ d="m 1337.7,554.569 67.31,0 0,-64.569 -67.31,0 0,64.569 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3912"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3914"
+ d="m 1404.777,549.002 12,0 0,11.998 -12,0 0,-11.998 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3908"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3910"
+ d="m 1404.78,561 12,0 0,-12 -12,0 0,12 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3886"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3888"
+ d="m 1363,547.865 32,0 0,12 -32,0 0,-12 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3882"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3884"
+ d="m 1363,559.865 32,0 0,-12.002 -32,0 0,12.002 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3852"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3854"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAABECAAAAACTooUSAAAAAXNCSVQI5gpbmQAAAXhJREFUWIXt2T9v3DAMBfBHWj4Fzh2CXjsEaZd+/+8VZGiN+v4Y1cni6+ADmqUjnQ7kqEE/ULQXPgEAQLBB8S8lAnE3SZCrKFBVVd8+CTMzA5EAaOr7PrmShC211sWABNGUh8fHnNRTtKVcrzMWY4JoPxw/Hw+585sl2cp5/AkzMgm033/59nIcevUCAavz+Cq3Upvce3z5/nzY+T0r7XZ+w/zrpMJ1jvvj89enB0/x94Rpn5PK/VvNw+HpU+78xFZwGnJSAAkQ0a7f5fzgKSLv+k5FgAQAoqJd1zmK6DqVdWppPZK1vES8u93xj/hHhRhiiCGGGGKIIYYYYoghhhhiiCGGGOL/Jt73ciRJuinvr08AQKO11vzCALbWjMa7SFqrt1LgutEtt9qMXHu0pcznCc5b6/NcFgOQQFvKZXzDyXszP17KYkQCrc7jKyb/9GGcqxGJYvXyg9ctEpZLNXDtEWXaJEWqRgggWyZl/IA08EMST2DTVPcPY4fdi0eNNAgAAAAASUVORK5CYII="
+ height="1"
+ width="1" /></mask><mask
+ id="mask3840"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3842"><g
+ id="g3844"
+ clip-path="url(#clipPath3836)"><g
+ id="g3846"><g
+ id="g3848"
+ transform="matrix(113,0,0,68,1351,505)"><image
+ id="image3850"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAABECAYAAAC2ydrOAAAABHNCSVQICAgIfAhkiAAAA1NJREFUeJztnc1uozAURj8HjCMCikq7iNJu+v7vVXXRovJn1RDiWUztMQnttIuQmat7pKugAFn4yDZk8V0BwGIGIcTc18wVsXZWFQROJAohvMDwmLke1lovMDx2xO7AyVqtVmcVnmeWw8k6Ho9nFZ6Pw5tWqxXiOIaU0lccxyzyCoQCD4cDhmHwdTgcvEjgQ6IQwgtUSiFNU2w2G2w2GyilvEiWuBzWWi/QGIOu69B1HbTWAOBFWmunEqWUSNMURVHg9vYWRVEgz3MopRBFEe+RC+H2vXEcYYxB0zQoyxKvr68A/iyv7ro43AullMiyDHd3d3h4eMB+v0dRFEjTFFJKv6wyl+d4PGIYBmitUZYlnp6eIIRA3/cwxmAYBozjCCHE5zNxv9/j8fERu90OeZ4jSRJeUhfCLaV936NpGjw/PwMAtNZ4e3tDXdfexdly6vbELMtQFAV2ux3u7++x3W6xXq9Z4kI4ie/v76iqCgBQVRWyLJt9Rpl9OnUPN3meY7vd4ubmZrIvMpcl3A8BoK5rpGk6ERgyeU90MzKKIkgpkSQJlFJQSmG9XrPEhXASAUAphSRJIKVEFEV+BoYe4tMfcCJDoWGxxMvj3hHdmIc+5sb/TKLD2Z4r5vL8ZNz5nYEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEAn2a7uWji02Iuz0/H/kyiC0x1n+M4+gI4kX8JXFSmq9DHnMw4vDEUNwyDz5t24akclbkMYWitMQZ93/vM7zDA3TGZiWGEv9YaTdP4+GKOj16O0/jopmmgtYYx5qwnBvAh8bQHQ9u2KMvSB4jXdc1B7gsyF+ReliXatp2InHSocTedRvgDvwPEuaXC8sz5KMsSWmsMwzCVaK2FEMLf1LYtXl5eYK1F13Xc3OQKfNXcpG1bL9FdOzsTAcAYg6qquM3QlfiqzdDpTPSt98LeGNzw6/p8p+HXrESAW+/9S3y39R43wfwP+FsTzDOJ/gTL++f47K+3XyWNnXDxB1SBAAAAAElFTkSuQmCC"
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3836"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3838"
+ d="m 1351,573 113,0 0,-68 -113,0 0,68 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3832"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3834"
+ d="m 1351,573 113,0 0,-68 -113,0 0,68 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3824"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3826"
+ d="m 0,1080 1920,0 L 1920,0 0,0 0,1080 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3798"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3800"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAABECAAAAACTooUSAAAAAXNCSVQI5gpbmQAAAZ9JREFUWIXt2U9v1DAQBfA348lmyXa1FdBSgRDf/4tVe4CI7J+oXtvzOKQIOCOnF8/Ft/lpZCeHeQIAgGCF4h9KBFLdJEEuokBVVevOSbi7OwiDiIZN14WqJOE5pZQdMEBtO+yGPmhN0XO8Xmdkp4mEfv/+w/2u13p3SZZ4Hn/AnTRo2B6evjwd3lnFGT3N47PcYipiIrY9PH77+nHotBpIv52PmH+eVGiQsBnuHz5/2m1qii8TprveVJa3av2wP9xt6j0dlojT0JsCMJAk1LptVRH9pgsqAhjoJedC0YqfBxGCytLfCJZcsgM1/3Qi8ru7gnQv7mQ17t9SgEutBEIBYEXvVVy1mtjEJjaxiU1sYhOb2MQmNrGJTWxiE5v4P2XLUXlt9Xd7AwA6vZRSLwxgKcXpfBVJL+kWI0LNjW68peLkMqPnOJ8nbCvuV/1lOs8xO5aNbo6X8YhTzR2y387H8RKzEwZ6msdnTDWzgCV9GOfkhFE8Xb7zuu9D9YTlkhxcZkScelshRUpOCCBqXdfZOkkZ3yANfJPEE1g11f0FocoCRBRb0tkAAAAASUVORK5CYII="
+ height="1"
+ width="1" /></mask><mask
+ id="mask3786"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3788"><g
+ id="g3790"
+ clip-path="url(#clipPath3782)"><g
+ id="g3792"><g
+ id="g3794"
+ transform="matrix(113,0,0,68,1351,444)"><image
+ id="image3796"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAABECAYAAAC2ydrOAAAABHNCSVQICAgIfAhkiAAAA59JREFUeJztnclurDoURTdgmkAhSmlLiaL8/49FGSQodFZM5zd4sstUkdsMQnKPzpKsQgVMWDo2ZrCPB0BjBc/z1v5mvhGtV1XBw4lEz/OsQPeY+T601lage2wQ5sDI8n3/bLjnme0wsuZ5PhvueQEcK873fQRBgCiKEIYhwjBEEAQs8htwBY7jiGEY7BjH0YoEnEr0fR9CCCRJgjRNkWUZ0jRFHMdWJEvcDq21FaiUQtd16LoOUkoAsCK11hCmCoMgQBzHyPMcl5eXuLq6wn6/R5ZliOPYSmSRX49Z96ZpglIKTdOgLEu8vb0BOE6v5joBwE6jSZKgKAocDgc8PDzgcDigKApcXFxACMECN2SeZwzDACklyrLE8/MzPM9D3/dQSmEYBkzTBM/zjpVoptKiKHB7e4unpyc8Pj7i+voaaZoiDEO7NjJfi5lK+75H0zR4eXkBAEgp8f7+jrqu7cxoK9FMp1EUIU1T7Pd73Nzc4P7+Hnd3d8iyDFEUscSNMBI/Pj5QVRUAoKoq7HY7xHEMIcTiHeXs7VQIgTiOkaYp8jxHURTY7XZWIk+pX4+7HgJAXdf2JdMIdBHmJncAx7fVMAyRJAlL3BAjEQDiOLZbPneX4HqwEud5xjRNGMcR4zhimiZorRf7R5a4DaaQgiBYPPfPnr9wP+cYiebX3VAC/BluS8yzdsdn+MBxOjX7j2mazvYizM/FrpCn6+LpGsn8XM72DCzv34M3fgRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQQQn53gdKnv42+f/ZlEk/HmJi+aAXAi/xaYsEQzXB9rMoV7oytuGAabN23CU4MgYIkb4IbWKqXQ973N/F4LTVxUohvhL6VE0zQ2vjhJEs473YjT+OimaSClhFJqNcJ0EVprBLZti7IsbYB4XdecPLwha0HuZVmibduFyEWHGnPTaYQ/8H+AOKfxb8+aj7IsIaXEMAxLiSYi2tzUti1eX1+htUbXdcjz3Hap4eThbfhVc5O2ba1Ec+1qJQKAUgpVVa1G+DNfz6/aDJ1Wom2957ZUMM2+wjBcRPizxO34k4ZfqxIBbr33k/jT1nvcBPMf4HdNMM8k2hMs78fx2ae3/wBR6gt9OOvm0AAAAABJRU5ErkJggg=="
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3782"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3784"
+ d="m 1351,512 113,0 0,-68 -113,0 0,68 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3778"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3780"
+ d="m 1351,512 113,0 0,-68 -113,0 0,68 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3770"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3772"
+ d="m 1341,490 129,0 0,89 -129,0 0,-89 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3748"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3750"
+ d="m 1214,628 270,0 0,-182 -270,0 0,182 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3726"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3728"
+ d="m 652.002,520.002 12,0 0,11.998 -12,0 0,-11.998 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3722"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3724"
+ d="m 652,532 12.002,0 0,-12 -12.002,0 0,12 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3700"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3702"
+ d="m 592,518.865 32,0 0,12 -32,0 0,-12 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3696"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3698"
+ d="m 592,530.865 32,0 0,-12.002 -32,0 0,12.002 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3688"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3690"
+ d="m 0,1080 1920,0 L 1920,0 0,0 0,1080 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3662"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3664"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAABPCAAAAAAc13L4AAAAAXNCSVQI5gpbmQAAAdJJREFUaIHt2rFu2zAUheFDirICJUZQt0OQdun7v1fgwRHqylJMkbyng1S0He5aarj/C/gDLWnhcQAAONSNfxTOwdXkkCBXjIP33vtqp0OIiAiIAMCHtm1DLQ0hJaWlCBjgfOj6x8cu+EoYKXGe5nsuCHC+7U+fT8euqfLckBKnH+8DKQgOvn368u311Le+ggVg/rie27KkUraTef3+cjzU+Z8kzZcu3caP5NZn5un08vX5oRJmmQ73S39o3PY2df3x+VPXVHlmZAlz3wXvHALgnG/aQ9c9VML4GDxIrt8ZOO980zR1MM47lpyLbBjArVXAAIDkkgvBOq/zP5EiRYTEDjDgGnaBAUgCe8FsGUbLMFqG0TKMlmG0DKNlGC3DaBlGyzBahtEyjJZhtAyjZRgtw2gZRsswWobRMoyWYbQMo2UYLcNoGUZru0r+fWX5//v7lwMAUCillCprHpZShMINQ0pJS4yoc+NfYlxSEXI9GclxHq+osxKh3K/jHLMACKDkeBvO+FlnP0NZxvNwi1mIAEqahzdcay2LJM3D2zAnIQKdpNuFU73NVYnj8H5LAq4ng3ituEbLcZrmJIQDXPWdXk4p5Q2zmwXj3radwF5Wr78ATrQFVxEFtwQAAAAASUVORK5CYII="
+ height="1"
+ width="1" /></mask><mask
+ id="mask3650"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3652"><g
+ id="g3654"
+ clip-path="url(#clipPath3646)"><g
+ id="g3656"><g
+ id="g3658"
+ transform="matrix(139.35082,0,0,78.633677,558.31445,465.31115)"><image
+ id="image3660"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAABPCAYAAAA5vC0kAAAABHNCSVQICAgIfAhkiAAABCJJREFUeJzt3UFvskwYheEDAmNQYkq7MLab/v//1bhQUgqMwjDMt3gzBJTmy7Ol50omNSLdcAcfcEEAwGFBEARLb9Mf4dxiFgjwEEwQBGMs09f0Nzjnxlimr73Iv/BhhGH4tKbbaZ18GMMwPK3p9mi6UxiGiKIIcRyPK4oiRrNy01istTDGwBiDrutgrZ1FEwH/QvCxKKWQpil2ux12ux2UUmM0DGadnHNjLG3bQmuNpmmgtcb9fkff97DWAsA8mDiOkaYp8jzH6+sr8jxHlmVQSmGz2XCmWSE/pwzDgLZt0TQNvr+/cb1eURTFbDsARNPZJY5j7Pd7vL294ePjA6fTCXmeI01TxHE8fjXRujjn0Pc9brcbyrLE+XxGHMew1qLrOhhjYK2Ftfb3M8zpdMLn5yeOxyOyLEOSJPxaWqlhGGCMgdYal8sFSikYY1DXNaqqwu12gzEGQRAszzD7/R55nuN4POL9/R2HwwHb7ZbBrNQwDOi6Dk3TIEkS3O93XC4XpGmKJEnGcQT45SrJD75ZluFwOODl5WU2x9B6+Pmk6zpEUQStNdI0fbrYeQrGvxmGITabDeI4RpIkUEpBKYXtdstgVsgHE4Yh2rad3UbxA+/0Bl70+A98NNN4povBrItzbnbMnXOw1qLv+/FyehiG34Px/BlnadF6DcMwhuL/Tn8q4HUyAZjfj/E38fzr6VcSg6HR48zyOL8ADIYWLIXiMRgSYTAkwmBIhMGQCIMhEQZDIgyGRBgMiTAYEmEwJMJgSITBkAiDIREGQyIMhkQYDIkwGBJhMCTCYEiEwZAIgyERBkMiDIZEGAyJMBgSYTAkwmBIhMGQCIMhEQZDIgyGRBgMiTAYEmEwJMJgSITBkAiDIREGQyIMhkQYDIkwGBJhMCTCYEiEwZAIgyERBkMiDIZEGAyJMBgSYTAkwmBI5NfHEP/fwyJpHaTH+SkY/yha/9daOy4AfG71yvgHm/s1PfZL4UTTHaeRGGPQdR3atkXbtgCAzWbDYFbGB+OPc9d1MMbM4pmGMzvD+Keit20LrTWqqkJZlgCA7XaLMAwZzMr4k8T9fkdZlqiqClprtG2Lvu8xDMPs89F0Jx9LXdcoigLn8xkA8PPzgyRJGMwK+WPfdR2qqsL5fEZRFKjrehaNP8vMgjHGQGuNoijw9fUFACjLEmmaIo5jhCEvqtZo6dgXRQGtNYwx82CccwiCYNyprmtcLhc459A0DbIsg1JqnF94hlkXP6P4OaaqKhRFgev1irqux2D8ZxfPMADQti3KsoRSClEU8etoxR5HkqZp0DTN4hkmAOCAf5fLYRgiiiLEcTwuH4v/DK2Pj8FHY4wZ1+MMMwsGAMIwfFrT7bRO02ge13T7GIw3nVM4s/w90/suS3d9n4IZNzCUP+23nwf+AzNnFIrywW/wAAAAAElFTkSuQmCC"
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3646"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3648"
+ d="m 558.314,543.945 139.351,0 0,-78.634 -139.351,0 0,78.634 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3642"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3644"
+ d="m 558.314,543.945 139.351,0 0,-78.633 -139.351,0 0,78.633 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3634"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3636"
+ d="m 570.26,532 c 0,-30.785 24.955,-55.742 55.74,-55.742 l 0,0 c 30.784,0 55.74,24.957 55.74,55.742 l 0,0 c 0,30.784 -24.956,55.74 -55.74,55.74 l 0,0 c -30.785,0 -55.74,-24.956 -55.74,-55.74"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3610"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3612"
+ d="m 652.333,574.333 101,0 0,-79.333 -101,0 0,79.333 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3592"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3594"
+ d="m 730.778,549 12,0 0,-12 -12,0 0,12 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3570"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3572"
+ d="m 679,535.865 32,0 0,12 -32,0 0,-12 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3566"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3568"
+ d="m 679,547.865 32,0 0,-12.002 -32,0 0,12.002 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3540"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3542"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAABECAAAAADGw2ZMAAAAAXNCSVQI5gpbmQAAAZJJREFUWIXt2DFv2zAQhuHvTlTkyDaMuBmCtEv//+9q0KKuAtWWZJnkfR0UAwY69jyVXAhoeEQcyOUVAAAEvos3rAjE0ydBfugCVVV1Oz9hZmYgEABoqOs6ePGE5Rgv2UAEiIamXa+boE665Xkch3PKQIBo3e4/7bdN5TJ70i7De6ckjUGg9eb5y+u+rdUBB5jO/Y/G4s3ZX7++bB98RmNp6lpOwzkal7lv9i+fdysvfVzb8XCoVWS5M0273T01lYvOtMJxt2kqBQIgolX90DQrLx1T+9jUlQgCAIiKVlXlpKOqQwgqsrwmALIsDx2iqioqAHxu4V8/+DjoffTrKnrRi170ohe96EUvetGLXvSiF/3/0bkkvWsnIHn98u+ymRmNV51Gyzn7RD2mHFNKxqUYkpbjZZ7h1WfGaZzmmEkEAJbm8djDr1z96vrTnA0IoKX51H3Hb8fq9u1nP0UjA2hx7N7QuxbDt26IRgSKxdOBg3PtfJ8Sl8nEEXPvXWrnbIQAcqfKTN65kN+97t9sfv6y/QG64fFP78GtbgAAAABJRU5ErkJggg=="
+ height="1"
+ width="1" /></mask><mask
+ id="mask3528"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3530"><g
+ id="g3532"
+ clip-path="url(#clipPath3524)"><g
+ id="g3534"><g
+ id="g3536"
+ transform="matrix(93,0,0,68,667,493)"><image
+ id="image3538"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAABECAYAAADjqDmQAAAABHNCSVQICAgIfAhkiAAAA51JREFUeJztnEtv4koQRo/BpokBoThZIJJN/v/vCkoUYuSAbYwfPYu57duOzWPm3lEvpo5UwqLbXhyXihaLzwM0A3ieN/S1cCNaD2oFwOObdM/zWuH2tXAbWutWuH1t45sLI3c0GvXKXheGMXKbpumVvQ6WdPgp3Pd9giBoy/d9EX8FW3hd15RlSVmWnE4n6rruiffhp0wjXClFGIbMZjNmsxlKqVa8SB9Ga90KL4qCLMvIsow0TTkej1RVRV3X7f6O9CAICMOQKIp4eHggiiIWiwVKKcbjscz4AczcbpqG0+lEmqbsdjviOGY0GrXrZo/WGt+e5UEQMJ/PeXx85Pn5mfV6TRRFhGFIEATtmBG6aK2pqorj8UiSJLy/v6OUomkayrK8vdPX6zUvLy+sVisWiwWTyURGzBmapqGqKvI8J45jwjBEa02e5+2IKcvy306H/kyfz+dEUcRqteLp6Ynlcsl0OhXpZzDSsyxjNpvRNA37/Z7tdst2u22nhBnPg6cX82O6WCxYLpfc39935rrQxYyX6XQKwH6/Z7lcMp/PW2/2aO6c003Hj8djgiBgMpmglEIpxXQ6FelnMNIB8jwnDEPu7u5QShEEQe8Q4n9/gBFvvwC7RHofc/42zer7flv2WDH0pBvMxqES+pgmtctuYBs5A/4BrjWoSHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASP8D2GlGQ5zNBrBvvPaQvx07LsouO0LKpifd3mjCwEyBJNYNYaJHTFJdVVVtGZeDEYH22zI3n04niqKgKAoAiR45g5GeZRl5nrefRVFQliV1XXfEdzrdxCKZmLv9fk+SJAASJ3UBO07q8/OTOI5JkoTD4UBRFJ1sRvhHuulwI/xwOBDHMW9vbwB8fX1JcNoFvgenvb6+8vHxQZIk5HneCU1rg9OM9LIsybKMOI7ZbDYAJEkiEYFXGIoI3Gw2xHFMmqYd6QC+1hrP81rph8OB7XaL1po0TSUM8wqXwjB3ux15nlNVVf+H9HunAxRFQZIkEvt6A5diX+2ZbsS3Ud52NqMEHP8atwQc26eXjnSQKO/f5VeivCW0/n/mltD6nvR2QWT/Jy79ZfIDbR7YvKqk0OoAAAAASUVORK5CYII="
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3524"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3526"
+ d="m 667,561 93,0 0,-68 -93,0 0,68 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3520"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3522"
+ d="m 667,561 93,0 0,-68 -93,0 0,68 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3498"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3500"
+ d="m 560,628 270,0 0,-182 -270,0 0,182 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3490"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3492"
+ d="m 0,1080 1920,0 L 1920,0 0,0 0,1080 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3476"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3478"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABHcAAAK/CAAAAADGr34kAAAAAXNCSVQI5gpbmQAACLFJREFUeJzt1DEBACAMwDDAv+fhohwkCnp1zwJIndcBwHd8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4DaBSkuBn0AocgUAAAAAElFTkSuQmCC"
+ height="1"
+ width="1" /></mask><clipPath
+ id="clipPath3470"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3472"
+ d="m 538,215 954,0 0,118 -954,0 0,-118 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3460"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3462"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABHcAAAK/CAAAAADGr34kAAAAAXNCSVQI5gpbmQAACLFJREFUeJzt1DEBACAMwDDAv+fhohwkCnp1zwJIndcBwHd8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4DaBSkuBn0AocgUAAAAAElFTkSuQmCC"
+ height="1"
+ width="1" /></mask><clipPath
+ id="clipPath3454"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3456"
+ d="m 554,720 958,0 0,204 -958,0 0,-204 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3432"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3434"
+ d="m 904,587 32,0 0,12 -32,0 0,-12 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3428"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3430"
+ d="m 904,599 32,0 0,-12.002 -32,0 0,12.002 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3420"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3422"
+ d="m 0,1080 1920,0 L 1920,0 0,0 0,1080 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3396"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3398"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAACdCAAAAAAcMECVAAAAAXNCSVQI5gpbmQAAAZdJREFUaIHt27tu20AQheEzy6Vo0BKMKCkMJ03e/70MFzYR3YisljsnBQXETZpg1J0pt/gwGGz7GwAAhtjhX9UMFsmTIFfckFJKKWx7wt3dQWQAKfd9n6N0wpda6+JAhqU8jI+PQ05BuC/lcpmxODMs9eP+6343dCF3J1s5TR9wJ7Mh9dtvP172Y58CbMDrPL3atdRmt81ffj7vNiF3oV9Pb5h/HZNxvfl2//z96SEI/33AYTvkZLffMoy7py9DF4K3guM45AQgA2ap6zfD8BCEY9j0XTIDMgBYstR1XQyOrku2XjivT7ZOAI5PUMz3+8cIFy5cuHDhwoULFy5cuHDhwoULFy5cuHDhwoULFy5cuHDhwoULFy5cuHDhwoULFy5cuHDhwv97bkEBSZIR4GcpAwCd3loLaX7YWnM6bzjprV5LQVQhUq61Oblu7kuZTwfEtS2nuSwOIIO+lPP0hmNglTOdy+JEBr3O0ysOoT3RNFcnMs3r+Z2X4BLqXB1cN0c5RDdc1QkD7E71Ge/bzd27+APu1Sr+ATqP3j0zgxPtAAAAAElFTkSuQmCC"
+ height="1"
+ width="1" /></mask><mask
+ id="mask3384"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3386"><g
+ id="g3388"
+ clip-path="url(#clipPath3380)"><g
+ id="g3390"><g
+ id="g3392"
+ transform="matrix(92,0,0,157,888,469)"><image
+ id="image3394"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAACdCAYAAAA5Wx9JAAAABHNCSVQICAgIfAhkiAAABIZJREFUeJzt111rs0gYxvHL92AipbYHIe1Jv//3CjlopMYXMmqcPdgdH03s7lOWvWDh+sPQUDWUX4c7Ew+AxUqe5639Wv1m1q6ywsMduOd5E/b8tfq9rLUT9vy1K3QvHKzv+w9rfl2t52DHcXxY8+vh/CHf9xGGIaIomlYYhkL/h+bYwzCg7/tpDcMwoQN/gXueN2EnSYI0TbHdbrHdbpEkyYQu8PWstRO2MQZN06BpGrRtCwATurV2CR5FEdI0RZ7neHl5QZ7nyLIMSZIgCALN9JXcnL7dbjDGoKoqFEWB8/kM4NeIcfeF89kdRRF2ux1eX1/x/v6Ow+GAPM+RpimiKJpGi1o2jiP6vkfbtiiKAsfjEZ7noes6GGPQ9z1utxs8z/t+hx8OB3x8fGC/3yPLMsRxrLGykhsnXdehqiqcTicAQNu2+Pr6wuVymdweRoqb4bvdDnmeY7/f4+3tDU9PT9hsNgJfyYFfr1eUZQkAKMsSu91u9fNv9ZTiPjizLMPT0xOen58Xc1z9aj6/AeByuSBN0wX2vMU53O30IAgQRRHiOEaSJEiSBJvNRuArOXAASJIEcRwjiiIEQTDt7LlZeP8GDn2OP18CX+bO4M5nbrdm9QDucv+ZtaWW/cRI5zxyAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInF353wVq7utSynzo9gFtrMY7j9PN2u00LADzP++/++v9h1tqF0dxuDT6cPzhH7vseXdfBGANjDAAgCAKB3+XAnVPXdej7foE/h1/s8HEcMQwDjDFo2xZVVaEsSwDAZrOB7/sCv8tt0uv1irIsUVUV2raFMQbDMGAcx8X94fwhh13XNYqiwOl0AgBcLhfEcSzwlZxd13Woqgqn0wlFUaCu6wW62+UL8L7v0bYtiqLA8XgEAJRliTRNEUURfF+HmrXW7IqiQNu26Pt+CW6thed500N1XePz8xPWWjRNgyzLkCTJNL+1w5e5Ge3meFVVKIoC5/MZdV1P4O7e1R0OAMYYlGWJJEkQhqHGyd90P5KbpkHTNKs73ANggT+Pe77vIwxDRFE0LYft7lGPOUyH3vf9tO5n+AIcAHzff1jz62q9Ofr9ml+fwF3zOa2Z/fPm5+61b50P4NMFQf+rvvt6/we8Kp4iURf8WgAAAABJRU5ErkJggg=="
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3380"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3382"
+ d="m 888,626 92,0 0,-157 -92,0 0,157 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3376"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3378"
+ d="m 888,626 92,0 0,-157 -92,0 0,157 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3354"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3356"
+ d="m 1116,527 26.006,0 0,3 -26.006,0 0,-3 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3350"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3352"
+ d="m 1116,530 26.01,0 0,-3 -26.01,0 0,3 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3328"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3330"
+ d="m 1057.994,527 11.006,0 0,3 -11.006,0 0,-3 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3324"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3326"
+ d="m 1057.99,530 26,0 0,-3 -26,0 0,3 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3302"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3304"
+ d="m 1000,527 26.006,0 0,3 -26.006,0 0,-3 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3298"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3300"
+ d="m 1000,530 26.01,0 0,-3 -26.01,0 0,3 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3272"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3274"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABUCAAAAAD/xdukAAAAAXNCSVQI5gpbmQAAAZZJREFUWIXt2L1u3DAQBOBZijoZsg9GLikMO03e/72MK85CLvrxUeTuuJCCJB0lA6m4tT4tl6x2BAAAwdbiHycC2fYDEuTCBc455zacgDAzMxAegPN1Xft8T5jGOKuBHuJ8097fN95lc9MwjdMtKTzE1e3p6+nYVJnzkxbGn28dafACVz98+/58amuX2z29X8+1zlF17f784+l4yD29xenSxKF/j7LM/nB6enm8y+bzeLhd2kMl68037fHxS1Nlzm6zn9rGOxF4QMRV9aFp7rK5C96B5PLuECeuqqpcLk6oKamtHJClsjgAWNKkBHMf69/+NFMzErs4uBR2coAksJ+vVXjhhRdeeOGFF1544YUXXvh/5usO+3srzKm/v/UAQKOpamZ0QlU1GldOmsY5BOQu4BrCHNXIpbulMPVX5IYPtNu1n0IyAB60FIbujF+50Qdt7s/dEJIRHrQ4da+45gcvFqfutZuiEZ5icbhw3BL7aOi7tyEauHRHuG4KnVIYxykaIYDsiLxSjDGt/BOB2+fjPmB/2PgBJp8FYb3sImYAAAAASUVORK5CYII="
+ height="1"
+ width="1" /></mask><mask
+ id="mask3260"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3262"><g
+ id="g3264"
+ clip-path="url(#clipPath3256)"><g
+ id="g3266"><g
+ id="g3268"
+ transform="matrix(62,0,0,84,1107,495)"><image
+ id="image3270"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABUCAYAAADaroR4AAAABHNCSVQICAgIfAhkiAAAA1pJREFUeJztnMtuqzoYRheES0QSRaUdRGknff/3qjJIUCmXYIzhDI6MTC5765wR1F6SFQvHESvmByb+PGDgAZ7nPTq8OIbhoR4eN+Ke543SZn9pDMMwSpt9TaA7WtD3/btmjs8dLdj3/V0zxwNzku/7BEFAGIZjC4JgMfKmtFIKKSVSStq2RSk1kQ/gXyEtHccxSZKw2WzYbDbEcTzKL0FcSwshqOuaqqqo65qmaei6DqUUwFQ8DEOSJCFNU15fX0nTlN1uRxzHrFarWde8ruO+7xFCUFUV39/fXC4XsiybjAMEZm2HYch2u+Xt7Y2Pjw+OxyNpmpIkCWEYjpf8XBmGga7ruF6v5HnO6XQiDEOUUrRti5QSpRRKqecrfjwe+fz85HA4sNvtiKJo9pd73/dIKanrmvP5TBzHSCkpy5KiKLher0gp8TzvcY1vt1vSNOVwOPD+/s5+v2e9Xi9CvG1bqqoiiiKapuF8PpMkCVEUjeUKT+7q+ga32+3Y7/e8vLxM6nyO6Ppt25YgCKjrmiRJ7m7Od+L6oO/7rFYrwjAkiiLiOCaOY9br9SLEfd9HCDF5DOsbm/kiE9z+gJY3/wSzzVncPPdhGFBK0XXd+Bjr+/65uEZfAY/aEuj7fhTWn+Yr7LyfT/8D83mtX2Z037zUf5043Nf0bX3DLxXXPBLW/GrxP+HEbcOJ24YTtw0nbhtO3DacuG04cdtw4rbhxG3DiduGE7cNJ24bTtw2nLhtOHHbcOK24cRtw4nbhhO3DSduG07cNpy4bThx23DituHEbcOJ24YTtw1rxZ/uLf3bTr258V/P905c78s0gyZ0g/kmg+jdw7qZDo/+gMCcaMrqGBEhBEIIgNlvo9ZpIEKISSbE7YZauFlxvfVYR4kURUGe5wCzj0rQi9Y0DXmeUxQFdV0jhKDrujENRBOYk7R0WZZkWcbpdALg5+dn9uEYZlRCURScTieyLKMsy4n8ZOO8nqQTNbIs4+vrC4A8zxcTh/LIIcsy6rpGSjkV1xEDelJZlpzPZ4ZhoKqqxQXg6DovioIsy7hcLpRlOYrr7z5ccQAhBHmeLzLySJdsVVVj5NHtio+xZmYWzG8Iueq6bgy5klLe1fhEHOyJNbM2yO5OfBxYqPAtz15b/wHsvBSUT5t0gwAAAABJRU5ErkJggg=="
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3256"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3258"
+ d="m 1107,579 62,0 0,-84 -62,0 0,84 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3252"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3254"
+ d="m 1107,579 62,0 0,-84 -62,0 0,84 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3226"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3228"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABUCAAAAAD/xdukAAAAAXNCSVQI5gpbmQAAAZZJREFUWIXt2L1u3DAQBOBZijoZsg9GLikMO03e/72MK85CLvrxUeTuuJCCJB0lA6m4tT4tl6x2BAAAwdbiHycC2fYDEuTCBc455zacgDAzMxAegPN1Xft8T5jGOKuBHuJ8097fN95lc9MwjdMtKTzE1e3p6+nYVJnzkxbGn28dafACVz98+/58amuX2z29X8+1zlF17f784+l4yD29xenSxKF/j7LM/nB6enm8y+bzeLhd2kMl68037fHxS1Nlzm6zn9rGOxF4QMRV9aFp7rK5C96B5PLuECeuqqpcLk6oKamtHJClsjgAWNKkBHMf69/+NFMzErs4uBR2coAksJ+vVXjhhRdeeOGFF1544YUXXvh/5usO+3srzKm/v/UAQKOpamZ0QlU1GldOmsY5BOQu4BrCHNXIpbulMPVX5IYPtNu1n0IyAB60FIbujF+50Qdt7s/dEJIRHrQ4da+45gcvFqfutZuiEZ5icbhw3BL7aOi7tyEauHRHuG4KnVIYxykaIYDsiLxSjDGt/BOB2+fjPmB/2PgBJp8FYb3sImYAAAAASUVORK5CYII="
+ height="1"
+ width="1" /></mask><mask
+ id="mask3214"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3216"><g
+ id="g3218"
+ clip-path="url(#clipPath3210)"><g
+ id="g3220"><g
+ id="g3222"
+ transform="matrix(62,0,0,84,1049,495)"><image
+ id="image3224"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABUCAYAAADaroR4AAAABHNCSVQICAgIfAhkiAAAA1pJREFUeJztnMtuqzoYRheES0QSRaUdRGknff/3qjJIUCmXYIzhDI6MTC5765wR1F6SFQvHESvmByb+PGDgAZ7nPTq8OIbhoR4eN+Ke543SZn9pDMMwSpt9TaA7WtD3/btmjs8dLdj3/V0zxwNzku/7BEFAGIZjC4JgMfKmtFIKKSVSStq2RSk1kQ/gXyEtHccxSZKw2WzYbDbEcTzKL0FcSwshqOuaqqqo65qmaei6DqUUwFQ8DEOSJCFNU15fX0nTlN1uRxzHrFarWde8ruO+7xFCUFUV39/fXC4XsiybjAMEZm2HYch2u+Xt7Y2Pjw+OxyNpmpIkCWEYjpf8XBmGga7ruF6v5HnO6XQiDEOUUrRti5QSpRRKqecrfjwe+fz85HA4sNvtiKJo9pd73/dIKanrmvP5TBzHSCkpy5KiKLher0gp8TzvcY1vt1vSNOVwOPD+/s5+v2e9Xi9CvG1bqqoiiiKapuF8PpMkCVEUjeUKT+7q+ga32+3Y7/e8vLxM6nyO6Ppt25YgCKjrmiRJ7m7Od+L6oO/7rFYrwjAkiiLiOCaOY9br9SLEfd9HCDF5DOsbm/kiE9z+gJY3/wSzzVncPPdhGFBK0XXd+Bjr+/65uEZfAY/aEuj7fhTWn+Yr7LyfT/8D83mtX2Z037zUf5043Nf0bX3DLxXXPBLW/GrxP+HEbcOJ24YTtw0nbhtO3DacuG04cdtw4rbhxG3DiduGE7cNJ24bTtw2nLhtOHHbcOK24cRtw4nbhhO3DSduG07cNpy4bThx23DituHEbcOJ24YTtw1rxZ/uLf3bTr258V/P905c78s0gyZ0g/kmg+jdw7qZDo/+gMCcaMrqGBEhBEIIgNlvo9ZpIEKISSbE7YZauFlxvfVYR4kURUGe5wCzj0rQi9Y0DXmeUxQFdV0jhKDrujENRBOYk7R0WZZkWcbpdALg5+dn9uEYZlRCURScTieyLKMsy4n8ZOO8nqQTNbIs4+vrC4A8zxcTh/LIIcsy6rpGSjkV1xEDelJZlpzPZ4ZhoKqqxQXg6DovioIsy7hcLpRlOYrr7z5ccQAhBHmeLzLySJdsVVVj5NHtio+xZmYWzG8Iueq6bgy5klLe1fhEHOyJNbM2yO5OfBxYqPAtz15b/wHsvBSUT5t0gwAAAABJRU5ErkJggg=="
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3210"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3212"
+ d="m 1049,579 62,0 0,-84 -62,0 0,84 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3206"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3208"
+ d="m 1049,579 62,0 0,-84 -62,0 0,84 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3180"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3182"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABUCAAAAAD/xdukAAAAAXNCSVQI5gpbmQAAAZZJREFUWIXt2L1u3DAQBOBZijoZsg9GLikMO03e/72MK85CLvrxUeTuuJCCJB0lA6m4tT4tl6x2BAAAwdbiHycC2fYDEuTCBc455zacgDAzMxAegPN1Xft8T5jGOKuBHuJ8097fN95lc9MwjdMtKTzE1e3p6+nYVJnzkxbGn28dafACVz98+/58amuX2z29X8+1zlF17f784+l4yD29xenSxKF/j7LM/nB6enm8y+bzeLhd2kMl68037fHxS1Nlzm6zn9rGOxF4QMRV9aFp7rK5C96B5PLuECeuqqpcLk6oKamtHJClsjgAWNKkBHMf69/+NFMzErs4uBR2coAksJ+vVXjhhRdeeOGFF1544YUXXvh/5usO+3srzKm/v/UAQKOpamZ0QlU1GldOmsY5BOQu4BrCHNXIpbulMPVX5IYPtNu1n0IyAB60FIbujF+50Qdt7s/dEJIRHrQ4da+45gcvFqfutZuiEZ5icbhw3BL7aOi7tyEauHRHuG4KnVIYxykaIYDsiLxSjDGt/BOB2+fjPmB/2PgBJp8FYb3sImYAAAAASUVORK5CYII="
+ height="1"
+ width="1" /></mask><mask
+ id="mask3168"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3170"><g
+ id="g3172"
+ clip-path="url(#clipPath3164)"><g
+ id="g3174"><g
+ id="g3176"
+ transform="matrix(62,0,0,84,991,495)"><image
+ id="image3178"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABUCAYAAADaroR4AAAABHNCSVQICAgIfAhkiAAAA1pJREFUeJztnMtuqzoYRheES0QSRaUdRGknff/3qjJIUCmXYIzhDI6MTC5765wR1F6SFQvHESvmByb+PGDgAZ7nPTq8OIbhoR4eN+Ke543SZn9pDMMwSpt9TaA7WtD3/btmjs8dLdj3/V0zxwNzku/7BEFAGIZjC4JgMfKmtFIKKSVSStq2RSk1kQ/gXyEtHccxSZKw2WzYbDbEcTzKL0FcSwshqOuaqqqo65qmaei6DqUUwFQ8DEOSJCFNU15fX0nTlN1uRxzHrFarWde8ruO+7xFCUFUV39/fXC4XsiybjAMEZm2HYch2u+Xt7Y2Pjw+OxyNpmpIkCWEYjpf8XBmGga7ruF6v5HnO6XQiDEOUUrRti5QSpRRKqecrfjwe+fz85HA4sNvtiKJo9pd73/dIKanrmvP5TBzHSCkpy5KiKLher0gp8TzvcY1vt1vSNOVwOPD+/s5+v2e9Xi9CvG1bqqoiiiKapuF8PpMkCVEUjeUKT+7q+ga32+3Y7/e8vLxM6nyO6Ppt25YgCKjrmiRJ7m7Od+L6oO/7rFYrwjAkiiLiOCaOY9br9SLEfd9HCDF5DOsbm/kiE9z+gJY3/wSzzVncPPdhGFBK0XXd+Bjr+/65uEZfAY/aEuj7fhTWn+Yr7LyfT/8D83mtX2Z037zUf5043Nf0bX3DLxXXPBLW/GrxP+HEbcOJ24YTtw0nbhtO3DacuG04cdtw4rbhxG3DiduGE7cNJ24bTtw2nLhtOHHbcOK24cRtw4nbhhO3DSduG07cNpy4bThx23DituHEbcOJ24YTtw1rxZ/uLf3bTr258V/P905c78s0gyZ0g/kmg+jdw7qZDo/+gMCcaMrqGBEhBEIIgNlvo9ZpIEKISSbE7YZauFlxvfVYR4kURUGe5wCzj0rQi9Y0DXmeUxQFdV0jhKDrujENRBOYk7R0WZZkWcbpdALg5+dn9uEYZlRCURScTieyLKMsy4n8ZOO8nqQTNbIs4+vrC4A8zxcTh/LIIcsy6rpGSjkV1xEDelJZlpzPZ4ZhoKqqxQXg6DovioIsy7hcLpRlOYrr7z5ccQAhBHmeLzLySJdsVVVj5NHtio+xZmYWzG8Iueq6bgy5klLe1fhEHOyJNbM2yO5OfBxYqPAtz15b/wHsvBSUT5t0gwAAAABJRU5ErkJggg=="
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3164"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3166"
+ d="m 991,579 62,0 0,-84 -62,0 0,84 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3160"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3162"
+ d="m 991,579 62,0 0,-84 -62,0 0,84 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3152"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3154"
+ d="m 897,482 239.999,0 0,135 -239.999,0 0,-135 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3126"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3128"
+ d="m 887,628 270,0 0,-182 -270,0 0,182 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3118"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3120"
+ d="m 0,1080 1920,0 L 1920,0 0,0 0,1080 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3634-8"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3636-7"
+ d="m 570.26,532 c 0,-30.785 24.955,-55.742 55.74,-55.742 l 0,0 c 30.784,0 55.74,24.957 55.74,55.742 l 0,0 c 0,30.784 -24.956,55.74 -55.74,55.74 l 0,0 c -30.785,0 -55.74,-24.956 -55.74,-55.74" /></clipPath><clipPath
+ id="clipPath3642-3"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3644-4"
+ d="m 558.314,543.945 139.351,0 0,-78.633 -139.351,0 0,78.633 z" /></clipPath><mask
+ id="mask3650-5"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3652-7"><g
+ id="g3654-7"
+ clip-path="url(#clipPath3646-3)"><g
+ id="g3656-5"><g
+ id="g3658-1"
+ transform="matrix(139.35082,0,0,78.633677,558.31445,465.31115)"><image
+ id="image3660-3"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAABPCAYAAAA5vC0kAAAABHNCSVQICAgIfAhkiAAABCJJREFUeJzt3UFvskwYheEDAmNQYkq7MLab/v//1bhQUgqMwjDMt3gzBJTmy7Ol50omNSLdcAcfcEEAwGFBEARLb9Mf4dxiFgjwEEwQBGMs09f0Nzjnxlimr73Iv/BhhGH4tKbbaZ18GMMwPK3p9mi6UxiGiKIIcRyPK4oiRrNy01istTDGwBiDrutgrZ1FEwH/QvCxKKWQpil2ux12ux2UUmM0DGadnHNjLG3bQmuNpmmgtcb9fkff97DWAsA8mDiOkaYp8jzH6+sr8jxHlmVQSmGz2XCmWSE/pwzDgLZt0TQNvr+/cb1eURTFbDsARNPZJY5j7Pd7vL294ePjA6fTCXmeI01TxHE8fjXRujjn0Pc9brcbyrLE+XxGHMew1qLrOhhjYK2Ftfb3M8zpdMLn5yeOxyOyLEOSJPxaWqlhGGCMgdYal8sFSikYY1DXNaqqwu12gzEGQRAszzD7/R55nuN4POL9/R2HwwHb7ZbBrNQwDOi6Dk3TIEkS3O93XC4XpGmKJEnGcQT45SrJD75ZluFwOODl5WU2x9B6+Pmk6zpEUQStNdI0fbrYeQrGvxmGITabDeI4RpIkUEpBKYXtdstgVsgHE4Yh2rad3UbxA+/0Bl70+A98NNN4povBrItzbnbMnXOw1qLv+/FyehiG34Px/BlnadF6DcMwhuL/Tn8q4HUyAZjfj/E38fzr6VcSg6HR48zyOL8ADIYWLIXiMRgSYTAkwmBIhMGQCIMhEQZDIgyGRBgMiTAYEmEwJMJgSITBkAiDIREGQyIMhkQYDIkwGBJhMCTCYEiEwZAIgyERBkMiDIZEGAyJMBgSYTAkwmBIhMGQCIMhEQZDIgyGRBgMiTAYEmEwJMJgSITBkAiDIREGQyIMhkQYDIkwGBJhMCTCYEiEwZAIgyERBkMiDIZEGAyJMBgSYTAkwmBI5NfHEP/fwyJpHaTH+SkY/yha/9daOy4AfG71yvgHm/s1PfZL4UTTHaeRGGPQdR3atkXbtgCAzWbDYFbGB+OPc9d1MMbM4pmGMzvD+Keit20LrTWqqkJZlgCA7XaLMAwZzMr4k8T9fkdZlqiqClprtG2Lvu8xDMPs89F0Jx9LXdcoigLn8xkA8PPzgyRJGMwK+WPfdR2qqsL5fEZRFKjrehaNP8vMgjHGQGuNoijw9fUFACjLEmmaIo5jhCEvqtZo6dgXRQGtNYwx82CccwiCYNyprmtcLhc459A0DbIsg1JqnF94hlkXP6P4OaaqKhRFgev1irqux2D8ZxfPMADQti3KsoRSClEU8etoxR5HkqZp0DTN4hkmAOCAf5fLYRgiiiLEcTwuH4v/DK2Pj8FHY4wZ1+MMMwsGAMIwfFrT7bRO02ge13T7GIw3nVM4s/w90/suS3d9n4IZNzCUP+23nwf+AzNnFIrywW/wAAAAAElFTkSuQmCC"
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3646-3"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3648-7"
+ d="m 558.314,543.945 139.351,0 0,-78.634 -139.351,0 0,78.634 z" /></clipPath><mask
+ id="mask3662-9"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3664-6"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAABPCAAAAAAc13L4AAAAAXNCSVQI5gpbmQAAAdJJREFUaIHt2rFu2zAUheFDirICJUZQt0OQdun7v1fgwRHqylJMkbyng1S0He5aarj/C/gDLWnhcQAAONSNfxTOwdXkkCBXjIP33vtqp0OIiAiIAMCHtm1DLQ0hJaWlCBjgfOj6x8cu+EoYKXGe5nsuCHC+7U+fT8euqfLckBKnH+8DKQgOvn368u311Le+ggVg/rie27KkUraTef3+cjzU+Z8kzZcu3caP5NZn5un08vX5oRJmmQ73S39o3PY2df3x+VPXVHlmZAlz3wXvHALgnG/aQ9c9VML4GDxIrt8ZOO980zR1MM47lpyLbBjArVXAAIDkkgvBOq/zP5EiRYTEDjDgGnaBAUgCe8FsGUbLMFqG0TKMlmG0DKNlGC3DaBlGyzBahtEyjJZhtAyjZRgtw2gZRsswWobRMoyWYbQMo2UYLcNoGUZru0r+fWX5//v7lwMAUCillCprHpZShMINQ0pJS4yoc+NfYlxSEXI9GclxHq+osxKh3K/jHLMACKDkeBvO+FlnP0NZxvNwi1mIAEqahzdcay2LJM3D2zAnIQKdpNuFU73NVYnj8H5LAq4ng3ituEbLcZrmJIQDXPWdXk4p5Q2zmwXj3radwF5Wr78ATrQFVxEFtwQAAAAASUVORK5CYII="
+ height="1"
+ width="1" /></mask><clipPath
+ id="clipPath3634-8-0"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3636-7-9"
+ d="m 570.26,532 c 0,-30.785 24.955,-55.742 55.74,-55.742 l 0,0 c 30.784,0 55.74,24.957 55.74,55.742 l 0,0 c 0,30.784 -24.956,55.74 -55.74,55.74 l 0,0 c -30.785,0 -55.74,-24.956 -55.74,-55.74" /></clipPath><clipPath
+ id="clipPath3642-3-4"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3644-4-2"
+ d="m 558.314,543.945 139.351,0 0,-78.633 -139.351,0 0,78.633 z" /></clipPath><mask
+ id="mask3650-5-0"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3652-7-6"><g
+ id="g3654-7-6"
+ clip-path="url(#clipPath3646-3-3)"><g
+ id="g3656-5-4"><g
+ id="g3658-1-6"
+ transform="matrix(139.35082,0,0,78.633677,558.31445,465.31115)"><image
+ id="image3660-3-1"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAABPCAYAAAA5vC0kAAAABHNCSVQICAgIfAhkiAAABCJJREFUeJzt3UFvskwYheEDAmNQYkq7MLab/v//1bhQUgqMwjDMt3gzBJTmy7Ol50omNSLdcAcfcEEAwGFBEARLb9Mf4dxiFgjwEEwQBGMs09f0Nzjnxlimr73Iv/BhhGH4tKbbaZ18GMMwPK3p9mi6UxiGiKIIcRyPK4oiRrNy01istTDGwBiDrutgrZ1FEwH/QvCxKKWQpil2ux12ux2UUmM0DGadnHNjLG3bQmuNpmmgtcb9fkff97DWAsA8mDiOkaYp8jzH6+sr8jxHlmVQSmGz2XCmWSE/pwzDgLZt0TQNvr+/cb1eURTFbDsARNPZJY5j7Pd7vL294ePjA6fTCXmeI01TxHE8fjXRujjn0Pc9brcbyrLE+XxGHMew1qLrOhhjYK2Ftfb3M8zpdMLn5yeOxyOyLEOSJPxaWqlhGGCMgdYal8sFSikYY1DXNaqqwu12gzEGQRAszzD7/R55nuN4POL9/R2HwwHb7ZbBrNQwDOi6Dk3TIEkS3O93XC4XpGmKJEnGcQT45SrJD75ZluFwOODl5WU2x9B6+Pmk6zpEUQStNdI0fbrYeQrGvxmGITabDeI4RpIkUEpBKYXtdstgVsgHE4Yh2rad3UbxA+/0Bl70+A98NNN4povBrItzbnbMnXOw1qLv+/FyehiG34Px/BlnadF6DcMwhuL/Tn8q4HUyAZjfj/E38fzr6VcSg6HR48zyOL8ADIYWLIXiMRgSYTAkwmBIhMGQCIMhEQZDIgyGRBgMiTAYEmEwJMJgSITBkAiDIREGQyIMhkQYDIkwGBJhMCTCYEiEwZAIgyERBkMiDIZEGAyJMBgSYTAkwmBIhMGQCIMhEQZDIgyGRBgMiTAYEmEwJMJgSITBkAiDIREGQyIMhkQYDIkwGBJhMCTCYEiEwZAIgyERBkMiDIZEGAyJMBgSYTAkwmBI5NfHEP/fwyJpHaTH+SkY/yha/9daOy4AfG71yvgHm/s1PfZL4UTTHaeRGGPQdR3atkXbtgCAzWbDYFbGB+OPc9d1MMbM4pmGMzvD+Keit20LrTWqqkJZlgCA7XaLMAwZzMr4k8T9fkdZlqiqClprtG2Lvu8xDMPs89F0Jx9LXdcoigLn8xkA8PPzgyRJGMwK+WPfdR2qqsL5fEZRFKjrehaNP8vMgjHGQGuNoijw9fUFACjLEmmaIo5jhCEvqtZo6dgXRQGtNYwx82CccwiCYNyprmtcLhc459A0DbIsg1JqnF94hlkXP6P4OaaqKhRFgev1irqux2D8ZxfPMADQti3KsoRSClEU8etoxR5HkqZp0DTN4hkmAOCAf5fLYRgiiiLEcTwuH4v/DK2Pj8FHY4wZ1+MMMwsGAMIwfFrT7bRO02ge13T7GIw3nVM4s/w90/suS3d9n4IZNzCUP+23nwf+AzNnFIrywW/wAAAAAElFTkSuQmCC"
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3646-3-3"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3648-7-6"
+ d="m 558.314,543.945 139.351,0 0,-78.634 -139.351,0 0,78.634 z" /></clipPath><mask
+ id="mask3662-9-4"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3664-6-5"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAABPCAAAAAAc13L4AAAAAXNCSVQI5gpbmQAAAdJJREFUaIHt2rFu2zAUheFDirICJUZQt0OQdun7v1fgwRHqylJMkbyng1S0He5aarj/C/gDLWnhcQAAONSNfxTOwdXkkCBXjIP33vtqp0OIiAiIAMCHtm1DLQ0hJaWlCBjgfOj6x8cu+EoYKXGe5nsuCHC+7U+fT8euqfLckBKnH+8DKQgOvn368u311Le+ggVg/rie27KkUraTef3+cjzU+Z8kzZcu3caP5NZn5un08vX5oRJmmQ73S39o3PY2df3x+VPXVHlmZAlz3wXvHALgnG/aQ9c9VML4GDxIrt8ZOO980zR1MM47lpyLbBjArVXAAIDkkgvBOq/zP5EiRYTEDjDgGnaBAUgCe8FsGUbLMFqG0TKMlmG0DKNlGC3DaBlGyzBahtEyjJZhtAyjZRgtw2gZRsswWobRMoyWYbQMo2UYLcNoGUZru0r+fWX5//v7lwMAUCillCprHpZShMINQ0pJS4yoc+NfYlxSEXI9GclxHq+osxKh3K/jHLMACKDkeBvO+FlnP0NZxvNwi1mIAEqahzdcay2LJM3D2zAnIQKdpNuFU73NVYnj8H5LAq4ng3ituEbLcZrmJIQDXPWdXk4p5Q2zmwXj3radwF5Wr78ATrQFVxEFtwQAAAAASUVORK5CYII="
+ height="1"
+ width="1" /></mask><clipPath
+ id="clipPath3592-5"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3594-9"
+ d="m 730.778,549 12,0 0,-12 -12,0 0,12 z" /></clipPath><clipPath
+ id="clipPath3566-8"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3568-8"
+ d="m 679,547.865 32,0 0,-12.002 -32,0 0,12.002 z" /></clipPath><clipPath
+ id="clipPath3570-6"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3572-0"
+ d="m 679,535.865 32,0 0,12 -32,0 0,-12 z" /></clipPath><clipPath
+ id="clipPath3520-6"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3522-3"
+ d="m 667,561 93,0 0,-68 -93,0 0,68 z" /></clipPath><mask
+ id="mask3528-3"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3530-7"><g
+ id="g3532-3"
+ clip-path="url(#clipPath3524-5)"><g
+ id="g3534-0"><g
+ id="g3536-4"
+ transform="matrix(93,0,0,68,667,493)"><image
+ id="image3538-4"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAABECAYAAADjqDmQAAAABHNCSVQICAgIfAhkiAAAA51JREFUeJztnEtv4koQRo/BpokBoThZIJJN/v/vCkoUYuSAbYwfPYu57duOzWPm3lEvpo5UwqLbXhyXihaLzwM0A3ieN/S1cCNaD2oFwOObdM/zWuH2tXAbWutWuH1t45sLI3c0GvXKXheGMXKbpumVvQ6WdPgp3Pd9giBoy/d9EX8FW3hd15RlSVmWnE4n6rruiffhp0wjXClFGIbMZjNmsxlKqVa8SB9Ga90KL4qCLMvIsow0TTkej1RVRV3X7f6O9CAICMOQKIp4eHggiiIWiwVKKcbjscz4AczcbpqG0+lEmqbsdjviOGY0GrXrZo/WGt+e5UEQMJ/PeXx85Pn5mfV6TRRFhGFIEATtmBG6aK2pqorj8UiSJLy/v6OUomkayrK8vdPX6zUvLy+sVisWiwWTyURGzBmapqGqKvI8J45jwjBEa02e5+2IKcvy306H/kyfz+dEUcRqteLp6Ynlcsl0OhXpZzDSsyxjNpvRNA37/Z7tdst2u22nhBnPg6cX82O6WCxYLpfc39935rrQxYyX6XQKwH6/Z7lcMp/PW2/2aO6c003Hj8djgiBgMpmglEIpxXQ6FelnMNIB8jwnDEPu7u5QShEEQe8Q4n9/gBFvvwC7RHofc/42zer7flv2WDH0pBvMxqES+pgmtctuYBs5A/4BrjWoSHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASP8D2GlGQ5zNBrBvvPaQvx07LsouO0LKpifd3mjCwEyBJNYNYaJHTFJdVVVtGZeDEYH22zI3n04niqKgKAoAiR45g5GeZRl5nrefRVFQliV1XXfEdzrdxCKZmLv9fk+SJAASJ3UBO07q8/OTOI5JkoTD4UBRFJ1sRvhHuulwI/xwOBDHMW9vbwB8fX1JcNoFvgenvb6+8vHxQZIk5HneCU1rg9OM9LIsybKMOI7ZbDYAJEkiEYFXGIoI3Gw2xHFMmqYd6QC+1hrP81rph8OB7XaL1po0TSUM8wqXwjB3ux15nlNVVf+H9HunAxRFQZIkEvt6A5diX+2ZbsS3Ud52NqMEHP8atwQc26eXjnSQKO/f5VeivCW0/n/mltD6nvR2QWT/Jy79ZfIDbR7YvKqk0OoAAAAASUVORK5CYII="
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3524-5"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3526-4"
+ d="m 667,561 93,0 0,-68 -93,0 0,68 z" /></clipPath><mask
+ id="mask3540-4"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3542-1"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAABECAAAAADGw2ZMAAAAAXNCSVQI5gpbmQAAAZJJREFUWIXt2DFv2zAQhuHvTlTkyDaMuBmCtEv//+9q0KKuAtWWZJnkfR0UAwY69jyVXAhoeEQcyOUVAAAEvos3rAjE0ydBfugCVVV1Oz9hZmYgEABoqOs6ePGE5Rgv2UAEiIamXa+boE665Xkch3PKQIBo3e4/7bdN5TJ70i7De6ckjUGg9eb5y+u+rdUBB5jO/Y/G4s3ZX7++bB98RmNp6lpOwzkal7lv9i+fdysvfVzb8XCoVWS5M0273T01lYvOtMJxt2kqBQIgolX90DQrLx1T+9jUlQgCAIiKVlXlpKOqQwgqsrwmALIsDx2iqioqAHxu4V8/+DjoffTrKnrRi170ohe96EUvetGLXvSiF/3/0bkkvWsnIHn98u+ymRmNV51Gyzn7RD2mHFNKxqUYkpbjZZ7h1WfGaZzmmEkEAJbm8djDr1z96vrTnA0IoKX51H3Hb8fq9u1nP0UjA2hx7N7QuxbDt26IRgSKxdOBg3PtfJ8Sl8nEEXPvXWrnbIQAcqfKTN65kN+97t9sfv6y/QG64fFP78GtbgAAAABJRU5ErkJggg=="
+ height="1"
+ width="1" /></mask><clipPath
+ id="clipPath3592-5-6"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3594-9-5"
+ d="m 730.778,549 12,0 0,-12 -12,0 0,12 z" /></clipPath><clipPath
+ id="clipPath3566-8-1"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3568-8-2"
+ d="m 679,547.865 32,0 0,-12.002 -32,0 0,12.002 z" /></clipPath><clipPath
+ id="clipPath3570-6-5"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3572-0-0"
+ d="m 679,535.865 32,0 0,12 -32,0 0,-12 z" /></clipPath><clipPath
+ id="clipPath3520-6-0"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3522-3-3"
+ d="m 667,561 93,0 0,-68 -93,0 0,68 z" /></clipPath><mask
+ id="mask3528-3-8"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3530-7-0"><g
+ id="g3532-3-9"
+ clip-path="url(#clipPath3524-5-5)"><g
+ id="g3534-0-9"><g
+ id="g3536-4-3"
+ transform="matrix(93,0,0,68,667,493)"><image
+ id="image3538-4-0"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAABECAYAAADjqDmQAAAABHNCSVQICAgIfAhkiAAAA51JREFUeJztnEtv4koQRo/BpokBoThZIJJN/v/vCkoUYuSAbYwfPYu57duOzWPm3lEvpo5UwqLbXhyXihaLzwM0A3ieN/S1cCNaD2oFwOObdM/zWuH2tXAbWutWuH1t45sLI3c0GvXKXheGMXKbpumVvQ6WdPgp3Pd9giBoy/d9EX8FW3hd15RlSVmWnE4n6rruiffhp0wjXClFGIbMZjNmsxlKqVa8SB9Ga90KL4qCLMvIsow0TTkej1RVRV3X7f6O9CAICMOQKIp4eHggiiIWiwVKKcbjscz4AczcbpqG0+lEmqbsdjviOGY0GrXrZo/WGt+e5UEQMJ/PeXx85Pn5mfV6TRRFhGFIEATtmBG6aK2pqorj8UiSJLy/v6OUomkayrK8vdPX6zUvLy+sVisWiwWTyURGzBmapqGqKvI8J45jwjBEa02e5+2IKcvy306H/kyfz+dEUcRqteLp6Ynlcsl0OhXpZzDSsyxjNpvRNA37/Z7tdst2u22nhBnPg6cX82O6WCxYLpfc39935rrQxYyX6XQKwH6/Z7lcMp/PW2/2aO6c003Hj8djgiBgMpmglEIpxXQ6FelnMNIB8jwnDEPu7u5QShEEQe8Q4n9/gBFvvwC7RHofc/42zer7flv2WDH0pBvMxqES+pgmtctuYBs5A/4BrjWoSHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASP8D2GlGQ5zNBrBvvPaQvx07LsouO0LKpifd3mjCwEyBJNYNYaJHTFJdVVVtGZeDEYH22zI3n04niqKgKAoAiR45g5GeZRl5nrefRVFQliV1XXfEdzrdxCKZmLv9fk+SJAASJ3UBO07q8/OTOI5JkoTD4UBRFJ1sRvhHuulwI/xwOBDHMW9vbwB8fX1JcNoFvgenvb6+8vHxQZIk5HneCU1rg9OM9LIsybKMOI7ZbDYAJEkiEYFXGIoI3Gw2xHFMmqYd6QC+1hrP81rph8OB7XaL1po0TSUM8wqXwjB3ux15nlNVVf+H9HunAxRFQZIkEvt6A5diX+2ZbsS3Ud52NqMEHP8atwQc26eXjnSQKO/f5VeivCW0/n/mltD6nvR2QWT/Jy79ZfIDbR7YvKqk0OoAAAAASUVORK5CYII="
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3524-5-5"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3526-4-5"
+ d="m 667,561 93,0 0,-68 -93,0 0,68 z" /></clipPath><mask
+ id="mask3540-4-8"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3542-1-9"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAABECAAAAADGw2ZMAAAAAXNCSVQI5gpbmQAAAZJJREFUWIXt2DFv2zAQhuHvTlTkyDaMuBmCtEv//+9q0KKuAtWWZJnkfR0UAwY69jyVXAhoeEQcyOUVAAAEvos3rAjE0ydBfugCVVV1Oz9hZmYgEABoqOs6ePGE5Rgv2UAEiIamXa+boE665Xkch3PKQIBo3e4/7bdN5TJ70i7De6ckjUGg9eb5y+u+rdUBB5jO/Y/G4s3ZX7++bB98RmNp6lpOwzkal7lv9i+fdysvfVzb8XCoVWS5M0273T01lYvOtMJxt2kqBQIgolX90DQrLx1T+9jUlQgCAIiKVlXlpKOqQwgqsrwmALIsDx2iqioqAHxu4V8/+DjoffTrKnrRi170ohe96EUvetGLXvSiF/3/0bkkvWsnIHn98u+ymRmNV51Gyzn7RD2mHFNKxqUYkpbjZZ7h1WfGaZzmmEkEAJbm8djDr1z96vrTnA0IoKX51H3Hb8fq9u1nP0UjA2hx7N7QuxbDt26IRgSKxdOBg3PtfJ8Sl8nEEXPvXWrnbIQAcqfKTN65kN+97t9sfv6y/QG64fFP78GtbgAAAABJRU5ErkJggg=="
+ height="1"
+ width="1" /></mask><clipPath
+ id="clipPath3942-2"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3944-1"
+ d="m 1337.7,554.569 67.31,0 0,-64.569 -67.31,0 0,64.569 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3912-3"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3914-9"
+ d="m 1404.777,549.002 12,0 0,11.998 -12,0 0,-11.998 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3908-4"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3910-0"
+ d="m 1404.78,561 12,0 0,-12 -12,0 0,12 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3886-1"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3888-7"
+ d="m 1363,547.865 32,0 0,12 -32,0 0,-12 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3882-9"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3884-9"
+ d="m 1363,559.865 32,0 0,-12.002 -32,0 0,12.002 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3852-6"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3854-6"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAABECAAAAACTooUSAAAAAXNCSVQI5gpbmQAAAXhJREFUWIXt2T9v3DAMBfBHWj4Fzh2CXjsEaZd+/+8VZGiN+v4Y1cni6+ADmqUjnQ7kqEE/ULQXPgEAQLBB8S8lAnE3SZCrKFBVVd8+CTMzA5EAaOr7PrmShC211sWABNGUh8fHnNRTtKVcrzMWY4JoPxw/Hw+585sl2cp5/AkzMgm033/59nIcevUCAavz+Cq3Upvce3z5/nzY+T0r7XZ+w/zrpMJ1jvvj89enB0/x94Rpn5PK/VvNw+HpU+78xFZwGnJSAAkQ0a7f5fzgKSLv+k5FgAQAoqJd1zmK6DqVdWppPZK1vES8u93xj/hHhRhiiCGGGGKIIYYYYoghhhhiiCGGGOL/Jt73ciRJuinvr08AQKO11vzCALbWjMa7SFqrt1LgutEtt9qMXHu0pcznCc5b6/NcFgOQQFvKZXzDyXszP17KYkQCrc7jKyb/9GGcqxGJYvXyg9ctEpZLNXDtEWXaJEWqRgggWyZl/IA08EMST2DTVPcPY4fdi0eNNAgAAAAASUVORK5CYII="
+ height="1"
+ width="1" /></mask><mask
+ id="mask3840-6"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3842-8"><g
+ id="g3844-1"
+ clip-path="url(#clipPath3836-1)"><g
+ id="g3846-7"><g
+ id="g3848-5"
+ transform="matrix(113,0,0,68,1351,505)"><image
+ id="image3850-5"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAABECAYAAAC2ydrOAAAABHNCSVQICAgIfAhkiAAAA1NJREFUeJztnc1uozAURj8HjCMCikq7iNJu+v7vVXXRovJn1RDiWUztMQnttIuQmat7pKugAFn4yDZk8V0BwGIGIcTc18wVsXZWFQROJAohvMDwmLke1lovMDx2xO7AyVqtVmcVnmeWw8k6Ho9nFZ6Pw5tWqxXiOIaU0lccxyzyCoQCD4cDhmHwdTgcvEjgQ6IQwgtUSiFNU2w2G2w2GyilvEiWuBzWWi/QGIOu69B1HbTWAOBFWmunEqWUSNMURVHg9vYWRVEgz3MopRBFEe+RC+H2vXEcYYxB0zQoyxKvr68A/iyv7ro43AullMiyDHd3d3h4eMB+v0dRFEjTFFJKv6wyl+d4PGIYBmitUZYlnp6eIIRA3/cwxmAYBozjCCHE5zNxv9/j8fERu90OeZ4jSRJeUhfCLaV936NpGjw/PwMAtNZ4e3tDXdfexdly6vbELMtQFAV2ux3u7++x3W6xXq9Z4kI4ie/v76iqCgBQVRWyLJt9Rpl9OnUPN3meY7vd4ubmZrIvMpcl3A8BoK5rpGk6ERgyeU90MzKKIkgpkSQJlFJQSmG9XrPEhXASAUAphSRJIKVEFEV+BoYe4tMfcCJDoWGxxMvj3hHdmIc+5sb/TKLD2Z4r5vL8ZNz5nYEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEALJEAn2a7uWji02Iuz0/H/kyiC0x1n+M4+gI4kX8JXFSmq9DHnMw4vDEUNwyDz5t24akclbkMYWitMQZ93/vM7zDA3TGZiWGEv9YaTdP4+GKOj16O0/jopmmgtYYx5qwnBvAh8bQHQ9u2KMvSB4jXdc1B7gsyF+ReliXatp2InHSocTedRvgDvwPEuaXC8sz5KMsSWmsMwzCVaK2FEMLf1LYtXl5eYK1F13Xc3OQKfNXcpG1bL9FdOzsTAcAYg6qquM3QlfiqzdDpTPSt98LeGNzw6/p8p+HXrESAW+/9S3y39R43wfwP+FsTzDOJ/gTL++f47K+3XyWNnXDxB1SBAAAAAElFTkSuQmCC"
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3836-1"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3838-6"
+ d="m 1351,573 113,0 0,-68 -113,0 0,68 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3832-3"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3834-3"
+ d="m 1351,573 113,0 0,-68 -113,0 0,68 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3824-4"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3826-5"
+ d="m 0,1080 1920,0 L 1920,0 0,0 0,1080 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3798-6"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3800-3"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAABECAAAAACTooUSAAAAAXNCSVQI5gpbmQAAAZ9JREFUWIXt2U9v1DAQBfA348lmyXa1FdBSgRDf/4tVe4CI7J+oXtvzOKQIOCOnF8/Ft/lpZCeHeQIAgGCF4h9KBFLdJEEuokBVVevOSbi7OwiDiIZN14WqJOE5pZQdMEBtO+yGPmhN0XO8Xmdkp4mEfv/+w/2u13p3SZZ4Hn/AnTRo2B6evjwd3lnFGT3N47PcYipiIrY9PH77+nHotBpIv52PmH+eVGiQsBnuHz5/2m1qii8TprveVJa3av2wP9xt6j0dlojT0JsCMJAk1LptVRH9pgsqAhjoJedC0YqfBxGCytLfCJZcsgM1/3Qi8ru7gnQv7mQ17t9SgEutBEIBYEXvVVy1mtjEJjaxiU1sYhOb2MQmNrGJTWxiE5v4P2XLUXlt9Xd7AwA6vZRSLwxgKcXpfBVJL+kWI0LNjW68peLkMqPnOJ8nbCvuV/1lOs8xO5aNbo6X8YhTzR2y387H8RKzEwZ6msdnTDWzgCV9GOfkhFE8Xb7zuu9D9YTlkhxcZkScelshRUpOCCBqXdfZOkkZ3yANfJPEE1g11f0FocoCRBRb0tkAAAAASUVORK5CYII="
+ height="1"
+ width="1" /></mask><mask
+ id="mask3786-0"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3788-7"><g
+ id="g3790-3"
+ clip-path="url(#clipPath3782-0)"><g
+ id="g3792-9"><g
+ id="g3794-3"
+ transform="matrix(113,0,0,68,1351,444)"><image
+ id="image3796-9"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAABECAYAAAC2ydrOAAAABHNCSVQICAgIfAhkiAAAA59JREFUeJztnclurDoURTdgmkAhSmlLiaL8/49FGSQodFZM5zd4sstUkdsMQnKPzpKsQgVMWDo2ZrCPB0BjBc/z1v5mvhGtV1XBw4lEz/OsQPeY+T601lage2wQ5sDI8n3/bLjnme0wsuZ5PhvueQEcK873fQRBgCiKEIYhwjBEEAQs8htwBY7jiGEY7BjH0YoEnEr0fR9CCCRJgjRNkWUZ0jRFHMdWJEvcDq21FaiUQtd16LoOUkoAsCK11hCmCoMgQBzHyPMcl5eXuLq6wn6/R5ZliOPYSmSRX49Z96ZpglIKTdOgLEu8vb0BOE6v5joBwE6jSZKgKAocDgc8PDzgcDigKApcXFxACMECN2SeZwzDACklyrLE8/MzPM9D3/dQSmEYBkzTBM/zjpVoptKiKHB7e4unpyc8Pj7i+voaaZoiDEO7NjJfi5lK+75H0zR4eXkBAEgp8f7+jrqu7cxoK9FMp1EUIU1T7Pd73Nzc4P7+Hnd3d8iyDFEUscSNMBI/Pj5QVRUAoKoq7HY7xHEMIcTiHeXs7VQIgTiOkaYp8jxHURTY7XZWIk+pX4+7HgJAXdf2JdMIdBHmJncAx7fVMAyRJAlL3BAjEQDiOLZbPneX4HqwEud5xjRNGMcR4zhimiZorRf7R5a4DaaQgiBYPPfPnr9wP+cYiebX3VAC/BluS8yzdsdn+MBxOjX7j2mazvYizM/FrpCn6+LpGsn8XM72DCzv34M3fgRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQRgiQQQn53gdKnv42+f/ZlEk/HmJi+aAXAi/xaYsEQzXB9rMoV7oytuGAabN23CU4MgYIkb4IbWKqXQ973N/F4LTVxUohvhL6VE0zQ2vjhJEs473YjT+OimaSClhFJqNcJ0EVprBLZti7IsbYB4XdecPLwha0HuZVmibduFyEWHGnPTaYQ/8H+AOKfxb8+aj7IsIaXEMAxLiSYi2tzUti1eX1+htUbXdcjz3Hap4eThbfhVc5O2ba1Ec+1qJQKAUgpVVa1G+DNfz6/aDJ1Wom2957ZUMM2+wjBcRPizxO34k4ZfqxIBbr33k/jT1nvcBPMf4HdNMM8k2hMs78fx2ae3/wBR6gt9OOvm0AAAAABJRU5ErkJggg=="
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3782-0"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3784-8"
+ d="m 1351,512 113,0 0,-68 -113,0 0,68 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3778-1"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3780-0"
+ d="m 1351,512 113,0 0,-68 -113,0 0,68 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3770-5"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3772-0"
+ d="m 1341,490 129,0 0,89 -129,0 0,-89 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3748-6"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3750-3"
+ d="m 1214,628 270,0 0,-182 -270,0 0,182 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3726-6"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3728-1"
+ d="m 652.002,520.002 12,0 0,11.998 -12,0 0,-11.998 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3722-1"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3724-4"
+ d="m 652,532 12.002,0 0,-12 -12.002,0 0,12 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3700-1"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3702-8"
+ d="m 592,518.865 32,0 0,12 -32,0 0,-12 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3696-9"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3698-6"
+ d="m 592,530.865 32,0 0,-12.002 -32,0 0,12.002 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3688-4"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3690-8"
+ d="m 0,1080 1920,0 L 1920,0 0,0 0,1080 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3662-6"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3664-9"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAABPCAAAAAAc13L4AAAAAXNCSVQI5gpbmQAAAdJJREFUaIHt2rFu2zAUheFDirICJUZQt0OQdun7v1fgwRHqylJMkbyng1S0He5aarj/C/gDLWnhcQAAONSNfxTOwdXkkCBXjIP33vtqp0OIiAiIAMCHtm1DLQ0hJaWlCBjgfOj6x8cu+EoYKXGe5nsuCHC+7U+fT8euqfLckBKnH+8DKQgOvn368u311Le+ggVg/rie27KkUraTef3+cjzU+Z8kzZcu3caP5NZn5un08vX5oRJmmQ73S39o3PY2df3x+VPXVHlmZAlz3wXvHALgnG/aQ9c9VML4GDxIrt8ZOO980zR1MM47lpyLbBjArVXAAIDkkgvBOq/zP5EiRYTEDjDgGnaBAUgCe8FsGUbLMFqG0TKMlmG0DKNlGC3DaBlGyzBahtEyjJZhtAyjZRgtw2gZRsswWobRMoyWYbQMo2UYLcNoGUZru0r+fWX5//v7lwMAUCillCprHpZShMINQ0pJS4yoc+NfYlxSEXI9GclxHq+osxKh3K/jHLMACKDkeBvO+FlnP0NZxvNwi1mIAEqahzdcay2LJM3D2zAnIQKdpNuFU73NVYnj8H5LAq4ng3ituEbLcZrmJIQDXPWdXk4p5Q2zmwXj3radwF5Wr78ATrQFVxEFtwQAAAAASUVORK5CYII="
+ height="1"
+ width="1" /></mask><mask
+ id="mask3650-6"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3652-6"><g
+ id="g3654-8"
+ clip-path="url(#clipPath3646-6)"><g
+ id="g3656-3"><g
+ id="g3658-9"
+ transform="matrix(139.35082,0,0,78.633677,558.31445,465.31115)"><image
+ id="image3660-2"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAABPCAYAAAA5vC0kAAAABHNCSVQICAgIfAhkiAAABCJJREFUeJzt3UFvskwYheEDAmNQYkq7MLab/v//1bhQUgqMwjDMt3gzBJTmy7Ol50omNSLdcAcfcEEAwGFBEARLb9Mf4dxiFgjwEEwQBGMs09f0Nzjnxlimr73Iv/BhhGH4tKbbaZ18GMMwPK3p9mi6UxiGiKIIcRyPK4oiRrNy01istTDGwBiDrutgrZ1FEwH/QvCxKKWQpil2ux12ux2UUmM0DGadnHNjLG3bQmuNpmmgtcb9fkff97DWAsA8mDiOkaYp8jzH6+sr8jxHlmVQSmGz2XCmWSE/pwzDgLZt0TQNvr+/cb1eURTFbDsARNPZJY5j7Pd7vL294ePjA6fTCXmeI01TxHE8fjXRujjn0Pc9brcbyrLE+XxGHMew1qLrOhhjYK2Ftfb3M8zpdMLn5yeOxyOyLEOSJPxaWqlhGGCMgdYal8sFSikYY1DXNaqqwu12gzEGQRAszzD7/R55nuN4POL9/R2HwwHb7ZbBrNQwDOi6Dk3TIEkS3O93XC4XpGmKJEnGcQT45SrJD75ZluFwOODl5WU2x9B6+Pmk6zpEUQStNdI0fbrYeQrGvxmGITabDeI4RpIkUEpBKYXtdstgVsgHE4Yh2rad3UbxA+/0Bl70+A98NNN4povBrItzbnbMnXOw1qLv+/FyehiG34Px/BlnadF6DcMwhuL/Tn8q4HUyAZjfj/E38fzr6VcSg6HR48zyOL8ADIYWLIXiMRgSYTAkwmBIhMGQCIMhEQZDIgyGRBgMiTAYEmEwJMJgSITBkAiDIREGQyIMhkQYDIkwGBJhMCTCYEiEwZAIgyERBkMiDIZEGAyJMBgSYTAkwmBIhMGQCIMhEQZDIgyGRBgMiTAYEmEwJMJgSITBkAiDIREGQyIMhkQYDIkwGBJhMCTCYEiEwZAIgyERBkMiDIZEGAyJMBgSYTAkwmBI5NfHEP/fwyJpHaTH+SkY/yha/9daOy4AfG71yvgHm/s1PfZL4UTTHaeRGGPQdR3atkXbtgCAzWbDYFbGB+OPc9d1MMbM4pmGMzvD+Keit20LrTWqqkJZlgCA7XaLMAwZzMr4k8T9fkdZlqiqClprtG2Lvu8xDMPs89F0Jx9LXdcoigLn8xkA8PPzgyRJGMwK+WPfdR2qqsL5fEZRFKjrehaNP8vMgjHGQGuNoijw9fUFACjLEmmaIo5jhCEvqtZo6dgXRQGtNYwx82CccwiCYNyprmtcLhc459A0DbIsg1JqnF94hlkXP6P4OaaqKhRFgev1irqux2D8ZxfPMADQti3KsoRSClEU8etoxR5HkqZp0DTN4hkmAOCAf5fLYRgiiiLEcTwuH4v/DK2Pj8FHY4wZ1+MMMwsGAMIwfFrT7bRO02ge13T7GIw3nVM4s/w90/suS3d9n4IZNzCUP+23nwf+AzNnFIrywW/wAAAAAElFTkSuQmCC"
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3646-6"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3648-8"
+ d="m 558.314,543.945 139.351,0 0,-78.634 -139.351,0 0,78.634 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3642-7"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3644-3"
+ d="m 558.314,543.945 139.351,0 0,-78.633 -139.351,0 0,78.633 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3634-3"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3636-8"
+ d="m 570.26,532 c 0,-30.785 24.955,-55.742 55.74,-55.742 l 0,0 c 30.784,0 55.74,24.957 55.74,55.742 l 0,0 c 0,30.784 -24.956,55.74 -55.74,55.74 l 0,0 c -30.785,0 -55.74,-24.956 -55.74,-55.74"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3610-5"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3612-4"
+ d="m 652.333,574.333 101,0 0,-79.333 -101,0 0,79.333 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3592-6"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3594-98"
+ d="m 730.778,549 12,0 0,-12 -12,0 0,12 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3570-0"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3572-8"
+ d="m 679,535.865 32,0 0,12 -32,0 0,-12 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3566-5"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3568-3"
+ d="m 679,547.865 32,0 0,-12.002 -32,0 0,12.002 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3540-6"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3542-0"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAABECAAAAADGw2ZMAAAAAXNCSVQI5gpbmQAAAZJJREFUWIXt2DFv2zAQhuHvTlTkyDaMuBmCtEv//+9q0KKuAtWWZJnkfR0UAwY69jyVXAhoeEQcyOUVAAAEvos3rAjE0ydBfugCVVV1Oz9hZmYgEABoqOs6ePGE5Rgv2UAEiIamXa+boE665Xkch3PKQIBo3e4/7bdN5TJ70i7De6ckjUGg9eb5y+u+rdUBB5jO/Y/G4s3ZX7++bB98RmNp6lpOwzkal7lv9i+fdysvfVzb8XCoVWS5M0273T01lYvOtMJxt2kqBQIgolX90DQrLx1T+9jUlQgCAIiKVlXlpKOqQwgqsrwmALIsDx2iqioqAHxu4V8/+DjoffTrKnrRi170ohe96EUvetGLXvSiF/3/0bkkvWsnIHn98u+ymRmNV51Gyzn7RD2mHFNKxqUYkpbjZZ7h1WfGaZzmmEkEAJbm8djDr1z96vrTnA0IoKX51H3Hb8fq9u1nP0UjA2hx7N7QuxbDt26IRgSKxdOBg3PtfJ8Sl8nEEXPvXWrnbIQAcqfKTN65kN+97t9sfv6y/QG64fFP78GtbgAAAABJRU5ErkJggg=="
+ height="1"
+ width="1" /></mask><mask
+ id="mask3528-8"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3530-9"><g
+ id="g3532-7"
+ clip-path="url(#clipPath3524-3)"><g
+ id="g3534-3"><g
+ id="g3536-8"
+ transform="matrix(93,0,0,68,667,493)"><image
+ id="image3538-8"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAABECAYAAADjqDmQAAAABHNCSVQICAgIfAhkiAAAA51JREFUeJztnEtv4koQRo/BpokBoThZIJJN/v/vCkoUYuSAbYwfPYu57duOzWPm3lEvpo5UwqLbXhyXihaLzwM0A3ieN/S1cCNaD2oFwOObdM/zWuH2tXAbWutWuH1t45sLI3c0GvXKXheGMXKbpumVvQ6WdPgp3Pd9giBoy/d9EX8FW3hd15RlSVmWnE4n6rruiffhp0wjXClFGIbMZjNmsxlKqVa8SB9Ga90KL4qCLMvIsow0TTkej1RVRV3X7f6O9CAICMOQKIp4eHggiiIWiwVKKcbjscz4AczcbpqG0+lEmqbsdjviOGY0GrXrZo/WGt+e5UEQMJ/PeXx85Pn5mfV6TRRFhGFIEATtmBG6aK2pqorj8UiSJLy/v6OUomkayrK8vdPX6zUvLy+sVisWiwWTyURGzBmapqGqKvI8J45jwjBEa02e5+2IKcvy306H/kyfz+dEUcRqteLp6Ynlcsl0OhXpZzDSsyxjNpvRNA37/Z7tdst2u22nhBnPg6cX82O6WCxYLpfc39935rrQxYyX6XQKwH6/Z7lcMp/PW2/2aO6c003Hj8djgiBgMpmglEIpxXQ6FelnMNIB8jwnDEPu7u5QShEEQe8Q4n9/gBFvvwC7RHofc/42zer7flv2WDH0pBvMxqES+pgmtctuYBs5A/4BrjWoSHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASP8D2GlGQ5zNBrBvvPaQvx07LsouO0LKpifd3mjCwEyBJNYNYaJHTFJdVVVtGZeDEYH22zI3n04niqKgKAoAiR45g5GeZRl5nrefRVFQliV1XXfEdzrdxCKZmLv9fk+SJAASJ3UBO07q8/OTOI5JkoTD4UBRFJ1sRvhHuulwI/xwOBDHMW9vbwB8fX1JcNoFvgenvb6+8vHxQZIk5HneCU1rg9OM9LIsybKMOI7ZbDYAJEkiEYFXGIoI3Gw2xHFMmqYd6QC+1hrP81rph8OB7XaL1po0TSUM8wqXwjB3ux15nlNVVf+H9HunAxRFQZIkEvt6A5diX+2ZbsS3Ud52NqMEHP8atwQc26eXjnSQKO/f5VeivCW0/n/mltD6nvR2QWT/Jy79ZfIDbR7YvKqk0OoAAAAASUVORK5CYII="
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3524-3"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3526-7"
+ d="m 667,561 93,0 0,-68 -93,0 0,68 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3520-9"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3522-1"
+ d="m 667,561 93,0 0,-68 -93,0 0,68 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3498-7"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3500-1"
+ d="m 560,628 270,0 0,-182 -270,0 0,182 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3490-4"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3492-5"
+ d="m 0,1080 1920,0 L 1920,0 0,0 0,1080 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3476-8"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3478-3"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABHcAAAK/CAAAAADGr34kAAAAAXNCSVQI5gpbmQAACLFJREFUeJzt1DEBACAMwDDAv+fhohwkCnp1zwJIndcBwHd8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4DaBSkuBn0AocgUAAAAAElFTkSuQmCC"
+ height="1"
+ width="1" /></mask><clipPath
+ id="clipPath3470-9"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3472-6"
+ d="m 538,215 954,0 0,118 -954,0 0,-118 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3460-8"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3462-0"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABHcAAAK/CAAAAADGr34kAAAAAXNCSVQI5gpbmQAACLFJREFUeJzt1DEBACAMwDDAv+fhohwkCnp1zwJIndcBwHd8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4Ca7wA13wFqvgPUfAeo+Q5Q8x2g5jtAzXeAmu8ANd8Bar4D1HwHqPkOUPMdoOY7QM13gJrvADXfAWq+A9R8B6j5DlDzHaDmO0DNd4DaBSkuBn0AocgUAAAAAElFTkSuQmCC"
+ height="1"
+ width="1" /></mask><clipPath
+ id="clipPath3454-4"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3456-3"
+ d="m 554,720 958,0 0,204 -958,0 0,-204 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3432-5"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3434-1"
+ d="m 904,587 32,0 0,12 -32,0 0,-12 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3428-5"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3430-0"
+ d="m 904,599 32,0 0,-12.002 -32,0 0,12.002 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3420-8"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3422-5"
+ d="m 0,1080 1920,0 L 1920,0 0,0 0,1080 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3396-6"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3398-2"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAACdCAAAAAAcMECVAAAAAXNCSVQI5gpbmQAAAZdJREFUaIHt27tu20AQheEzy6Vo0BKMKCkMJ03e/70MFzYR3YisljsnBQXETZpg1J0pt/gwGGz7GwAAhtjhX9UMFsmTIFfckFJKKWx7wt3dQWQAKfd9n6N0wpda6+JAhqU8jI+PQ05BuC/lcpmxODMs9eP+6343dCF3J1s5TR9wJ7Mh9dtvP172Y58CbMDrPL3atdRmt81ffj7vNiF3oV9Pb5h/HZNxvfl2//z96SEI/33AYTvkZLffMoy7py9DF4K3guM45AQgA2ap6zfD8BCEY9j0XTIDMgBYstR1XQyOrku2XjivT7ZOAI5PUMz3+8cIFy5cuHDhwoULFy5cuHDhwoULFy5cuHDhwoULFy5cuHDhwoULFy5cuHDhwoULFy5cuHDhwv97bkEBSZIR4GcpAwCd3loLaX7YWnM6bzjprV5LQVQhUq61Oblu7kuZTwfEtS2nuSwOIIO+lPP0hmNglTOdy+JEBr3O0ysOoT3RNFcnMs3r+Z2X4BLqXB1cN0c5RDdc1QkD7E71Ge/bzd27+APu1Sr+ATqP3j0zgxPtAAAAAElFTkSuQmCC"
+ height="1"
+ width="1" /></mask><mask
+ id="mask3384-8"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3386-8"><g
+ id="g3388-5"
+ clip-path="url(#clipPath3380-6)"><g
+ id="g3390-8"><g
+ id="g3392-8"
+ transform="matrix(92,0,0,157,888,469)"><image
+ id="image3394-9"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAACdCAYAAAA5Wx9JAAAABHNCSVQICAgIfAhkiAAABIZJREFUeJzt111rs0gYxvHL92AipbYHIe1Jv//3CjlopMYXMmqcPdgdH03s7lOWvWDh+sPQUDWUX4c7Ew+AxUqe5639Wv1m1q6ywsMduOd5E/b8tfq9rLUT9vy1K3QvHKzv+w9rfl2t52DHcXxY8+vh/CHf9xGGIaIomlYYhkL/h+bYwzCg7/tpDcMwoQN/gXueN2EnSYI0TbHdbrHdbpEkyYQu8PWstRO2MQZN06BpGrRtCwATurV2CR5FEdI0RZ7neHl5QZ7nyLIMSZIgCALN9JXcnL7dbjDGoKoqFEWB8/kM4NeIcfeF89kdRRF2ux1eX1/x/v6Ow+GAPM+RpimiKJpGi1o2jiP6vkfbtiiKAsfjEZ7noes6GGPQ9z1utxs8z/t+hx8OB3x8fGC/3yPLMsRxrLGykhsnXdehqiqcTicAQNu2+Pr6wuVymdweRoqb4bvdDnmeY7/f4+3tDU9PT9hsNgJfyYFfr1eUZQkAKMsSu91u9fNv9ZTiPjizLMPT0xOen58Xc1z9aj6/AeByuSBN0wX2vMU53O30IAgQRRHiOEaSJEiSBJvNRuArOXAASJIEcRwjiiIEQTDt7LlZeP8GDn2OP18CX+bO4M5nbrdm9QDucv+ZtaWW/cRI5zxyAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInJ3ByAicncHICJydwcgInF353wVq7utSynzo9gFtrMY7j9PN2u00LADzP++/++v9h1tqF0dxuDT6cPzhH7vseXdfBGANjDAAgCAKB3+XAnVPXdej7foE/h1/s8HEcMQwDjDFo2xZVVaEsSwDAZrOB7/sCv8tt0uv1irIsUVUV2raFMQbDMGAcx8X94fwhh13XNYqiwOl0AgBcLhfEcSzwlZxd13Woqgqn0wlFUaCu6wW62+UL8L7v0bYtiqLA8XgEAJRliTRNEUURfF+HmrXW7IqiQNu26Pt+CW6thed500N1XePz8xPWWjRNgyzLkCTJNL+1w5e5Ge3meFVVKIoC5/MZdV1P4O7e1R0OAMYYlGWJJEkQhqHGyd90P5KbpkHTNKs73ANggT+Pe77vIwxDRFE0LYft7lGPOUyH3vf9tO5n+AIcAHzff1jz62q9Ofr9ml+fwF3zOa2Z/fPm5+61b50P4NMFQf+rvvt6/we8Kp4iURf8WgAAAABJRU5ErkJggg=="
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3380-6"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3382-6"
+ d="m 888,626 92,0 0,-157 -92,0 0,157 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3376-1"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3378-8"
+ d="m 888,626 92,0 0,-157 -92,0 0,157 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3354-1"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3356-9"
+ d="m 1116,527 26.006,0 0,3 -26.006,0 0,-3 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3350-2"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3352-7"
+ d="m 1116,530 26.01,0 0,-3 -26.01,0 0,3 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3328-2"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3330-1"
+ d="m 1057.994,527 11.006,0 0,3 -11.006,0 0,-3 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3324-6"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3326-2"
+ d="m 1057.99,530 26,0 0,-3 -26,0 0,3 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3302-2"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3304-7"
+ d="m 1000,527 26.006,0 0,3 -26.006,0 0,-3 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3298-9"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3300-4"
+ d="m 1000,530 26.01,0 0,-3 -26.01,0 0,3 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3272-6"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3274-5"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABUCAAAAAD/xdukAAAAAXNCSVQI5gpbmQAAAZZJREFUWIXt2L1u3DAQBOBZijoZsg9GLikMO03e/72MK85CLvrxUeTuuJCCJB0lA6m4tT4tl6x2BAAAwdbiHycC2fYDEuTCBc455zacgDAzMxAegPN1Xft8T5jGOKuBHuJ8097fN95lc9MwjdMtKTzE1e3p6+nYVJnzkxbGn28dafACVz98+/58amuX2z29X8+1zlF17f784+l4yD29xenSxKF/j7LM/nB6enm8y+bzeLhd2kMl68037fHxS1Nlzm6zn9rGOxF4QMRV9aFp7rK5C96B5PLuECeuqqpcLk6oKamtHJClsjgAWNKkBHMf69/+NFMzErs4uBR2coAksJ+vVXjhhRdeeOGFF1544YUXXvh/5usO+3srzKm/v/UAQKOpamZ0QlU1GldOmsY5BOQu4BrCHNXIpbulMPVX5IYPtNu1n0IyAB60FIbujF+50Qdt7s/dEJIRHrQ4da+45gcvFqfutZuiEZ5icbhw3BL7aOi7tyEauHRHuG4KnVIYxykaIYDsiLxSjDGt/BOB2+fjPmB/2PgBJp8FYb3sImYAAAAASUVORK5CYII="
+ height="1"
+ width="1" /></mask><mask
+ id="mask3260-5"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3262-2"><g
+ id="g3264-6"
+ clip-path="url(#clipPath3256-0)"><g
+ id="g3266-6"><g
+ id="g3268-0"
+ transform="matrix(62,0,0,84,1107,495)"><image
+ id="image3270-6"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABUCAYAAADaroR4AAAABHNCSVQICAgIfAhkiAAAA1pJREFUeJztnMtuqzoYRheES0QSRaUdRGknff/3qjJIUCmXYIzhDI6MTC5765wR1F6SFQvHESvmByb+PGDgAZ7nPTq8OIbhoR4eN+Ke543SZn9pDMMwSpt9TaA7WtD3/btmjs8dLdj3/V0zxwNzku/7BEFAGIZjC4JgMfKmtFIKKSVSStq2RSk1kQ/gXyEtHccxSZKw2WzYbDbEcTzKL0FcSwshqOuaqqqo65qmaei6DqUUwFQ8DEOSJCFNU15fX0nTlN1uRxzHrFarWde8ruO+7xFCUFUV39/fXC4XsiybjAMEZm2HYch2u+Xt7Y2Pjw+OxyNpmpIkCWEYjpf8XBmGga7ruF6v5HnO6XQiDEOUUrRti5QSpRRKqecrfjwe+fz85HA4sNvtiKJo9pd73/dIKanrmvP5TBzHSCkpy5KiKLher0gp8TzvcY1vt1vSNOVwOPD+/s5+v2e9Xi9CvG1bqqoiiiKapuF8PpMkCVEUjeUKT+7q+ga32+3Y7/e8vLxM6nyO6Ppt25YgCKjrmiRJ7m7Od+L6oO/7rFYrwjAkiiLiOCaOY9br9SLEfd9HCDF5DOsbm/kiE9z+gJY3/wSzzVncPPdhGFBK0XXd+Bjr+/65uEZfAY/aEuj7fhTWn+Yr7LyfT/8D83mtX2Z037zUf5043Nf0bX3DLxXXPBLW/GrxP+HEbcOJ24YTtw0nbhtO3DacuG04cdtw4rbhxG3DiduGE7cNJ24bTtw2nLhtOHHbcOK24cRtw4nbhhO3DSduG07cNpy4bThx23DituHEbcOJ24YTtw1rxZ/uLf3bTr258V/P905c78s0gyZ0g/kmg+jdw7qZDo/+gMCcaMrqGBEhBEIIgNlvo9ZpIEKISSbE7YZauFlxvfVYR4kURUGe5wCzj0rQi9Y0DXmeUxQFdV0jhKDrujENRBOYk7R0WZZkWcbpdALg5+dn9uEYZlRCURScTieyLKMsy4n8ZOO8nqQTNbIs4+vrC4A8zxcTh/LIIcsy6rpGSjkV1xEDelJZlpzPZ4ZhoKqqxQXg6DovioIsy7hcLpRlOYrr7z5ccQAhBHmeLzLySJdsVVVj5NHtio+xZmYWzG8Iueq6bgy5klLe1fhEHOyJNbM2yO5OfBxYqPAtz15b/wHsvBSUT5t0gwAAAABJRU5ErkJggg=="
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3256-0"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3258-5"
+ d="m 1107,579 62,0 0,-84 -62,0 0,84 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3252-1"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3254-3"
+ d="m 1107,579 62,0 0,-84 -62,0 0,84 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3226-6"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3228-8"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABUCAAAAAD/xdukAAAAAXNCSVQI5gpbmQAAAZZJREFUWIXt2L1u3DAQBOBZijoZsg9GLikMO03e/72MK85CLvrxUeTuuJCCJB0lA6m4tT4tl6x2BAAAwdbiHycC2fYDEuTCBc455zacgDAzMxAegPN1Xft8T5jGOKuBHuJ8097fN95lc9MwjdMtKTzE1e3p6+nYVJnzkxbGn28dafACVz98+/58amuX2z29X8+1zlF17f784+l4yD29xenSxKF/j7LM/nB6enm8y+bzeLhd2kMl68037fHxS1Nlzm6zn9rGOxF4QMRV9aFp7rK5C96B5PLuECeuqqpcLk6oKamtHJClsjgAWNKkBHMf69/+NFMzErs4uBR2coAksJ+vVXjhhRdeeOGFF1544YUXXvh/5usO+3srzKm/v/UAQKOpamZ0QlU1GldOmsY5BOQu4BrCHNXIpbulMPVX5IYPtNu1n0IyAB60FIbujF+50Qdt7s/dEJIRHrQ4da+45gcvFqfutZuiEZ5icbhw3BL7aOi7tyEauHRHuG4KnVIYxykaIYDsiLxSjDGt/BOB2+fjPmB/2PgBJp8FYb3sImYAAAAASUVORK5CYII="
+ height="1"
+ width="1" /></mask><mask
+ id="mask3214-5"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3216-2"><g
+ id="g3218-9"
+ clip-path="url(#clipPath3210-9)"><g
+ id="g3220-8"><g
+ id="g3222-2"
+ transform="matrix(62,0,0,84,1049,495)"><image
+ id="image3224-4"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABUCAYAAADaroR4AAAABHNCSVQICAgIfAhkiAAAA1pJREFUeJztnMtuqzoYRheES0QSRaUdRGknff/3qjJIUCmXYIzhDI6MTC5765wR1F6SFQvHESvmByb+PGDgAZ7nPTq8OIbhoR4eN+Ke543SZn9pDMMwSpt9TaA7WtD3/btmjs8dLdj3/V0zxwNzku/7BEFAGIZjC4JgMfKmtFIKKSVSStq2RSk1kQ/gXyEtHccxSZKw2WzYbDbEcTzKL0FcSwshqOuaqqqo65qmaei6DqUUwFQ8DEOSJCFNU15fX0nTlN1uRxzHrFarWde8ruO+7xFCUFUV39/fXC4XsiybjAMEZm2HYch2u+Xt7Y2Pjw+OxyNpmpIkCWEYjpf8XBmGga7ruF6v5HnO6XQiDEOUUrRti5QSpRRKqecrfjwe+fz85HA4sNvtiKJo9pd73/dIKanrmvP5TBzHSCkpy5KiKLher0gp8TzvcY1vt1vSNOVwOPD+/s5+v2e9Xi9CvG1bqqoiiiKapuF8PpMkCVEUjeUKT+7q+ga32+3Y7/e8vLxM6nyO6Ppt25YgCKjrmiRJ7m7Od+L6oO/7rFYrwjAkiiLiOCaOY9br9SLEfd9HCDF5DOsbm/kiE9z+gJY3/wSzzVncPPdhGFBK0XXd+Bjr+/65uEZfAY/aEuj7fhTWn+Yr7LyfT/8D83mtX2Z037zUf5043Nf0bX3DLxXXPBLW/GrxP+HEbcOJ24YTtw0nbhtO3DacuG04cdtw4rbhxG3DiduGE7cNJ24bTtw2nLhtOHHbcOK24cRtw4nbhhO3DSduG07cNpy4bThx23DituHEbcOJ24YTtw1rxZ/uLf3bTr258V/P905c78s0gyZ0g/kmg+jdw7qZDo/+gMCcaMrqGBEhBEIIgNlvo9ZpIEKISSbE7YZauFlxvfVYR4kURUGe5wCzj0rQi9Y0DXmeUxQFdV0jhKDrujENRBOYk7R0WZZkWcbpdALg5+dn9uEYZlRCURScTieyLKMsy4n8ZOO8nqQTNbIs4+vrC4A8zxcTh/LIIcsy6rpGSjkV1xEDelJZlpzPZ4ZhoKqqxQXg6DovioIsy7hcLpRlOYrr7z5ccQAhBHmeLzLySJdsVVVj5NHtio+xZmYWzG8Iueq6bgy5klLe1fhEHOyJNbM2yO5OfBxYqPAtz15b/wHsvBSUT5t0gwAAAABJRU5ErkJggg=="
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3210-9"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3212-3"
+ d="m 1049,579 62,0 0,-84 -62,0 0,84 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3206-7"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3208-1"
+ d="m 1049,579 62,0 0,-84 -62,0 0,84 z"
+ inkscape:connector-curvature="0" /></clipPath><mask
+ id="mask3180-7"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3182-1"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABUCAAAAAD/xdukAAAAAXNCSVQI5gpbmQAAAZZJREFUWIXt2L1u3DAQBOBZijoZsg9GLikMO03e/72MK85CLvrxUeTuuJCCJB0lA6m4tT4tl6x2BAAAwdbiHycC2fYDEuTCBc455zacgDAzMxAegPN1Xft8T5jGOKuBHuJ8097fN95lc9MwjdMtKTzE1e3p6+nYVJnzkxbGn28dafACVz98+/58amuX2z29X8+1zlF17f784+l4yD29xenSxKF/j7LM/nB6enm8y+bzeLhd2kMl68037fHxS1Nlzm6zn9rGOxF4QMRV9aFp7rK5C96B5PLuECeuqqpcLk6oKamtHJClsjgAWNKkBHMf69/+NFMzErs4uBR2coAksJ+vVXjhhRdeeOGFF1544YUXXvh/5usO+3srzKm/v/UAQKOpamZ0QlU1GldOmsY5BOQu4BrCHNXIpbulMPVX5IYPtNu1n0IyAB60FIbujF+50Qdt7s/dEJIRHrQ4da+45gcvFqfutZuiEZ5icbhw3BL7aOi7tyEauHRHuG4KnVIYxykaIYDsiLxSjDGt/BOB2+fjPmB/2PgBJp8FYb3sImYAAAAASUVORK5CYII="
+ height="1"
+ width="1" /></mask><mask
+ id="mask3168-6"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3170-1"><g
+ id="g3172-4"
+ clip-path="url(#clipPath3164-3)"><g
+ id="g3174-6"><g
+ id="g3176-0"
+ transform="matrix(62,0,0,84,991,495)"><image
+ id="image3178-0"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABUCAYAAADaroR4AAAABHNCSVQICAgIfAhkiAAAA1pJREFUeJztnMtuqzoYRheES0QSRaUdRGknff/3qjJIUCmXYIzhDI6MTC5765wR1F6SFQvHESvmByb+PGDgAZ7nPTq8OIbhoR4eN+Ke543SZn9pDMMwSpt9TaA7WtD3/btmjs8dLdj3/V0zxwNzku/7BEFAGIZjC4JgMfKmtFIKKSVSStq2RSk1kQ/gXyEtHccxSZKw2WzYbDbEcTzKL0FcSwshqOuaqqqo65qmaei6DqUUwFQ8DEOSJCFNU15fX0nTlN1uRxzHrFarWde8ruO+7xFCUFUV39/fXC4XsiybjAMEZm2HYch2u+Xt7Y2Pjw+OxyNpmpIkCWEYjpf8XBmGga7ruF6v5HnO6XQiDEOUUrRti5QSpRRKqecrfjwe+fz85HA4sNvtiKJo9pd73/dIKanrmvP5TBzHSCkpy5KiKLher0gp8TzvcY1vt1vSNOVwOPD+/s5+v2e9Xi9CvG1bqqoiiiKapuF8PpMkCVEUjeUKT+7q+ga32+3Y7/e8vLxM6nyO6Ppt25YgCKjrmiRJ7m7Od+L6oO/7rFYrwjAkiiLiOCaOY9br9SLEfd9HCDF5DOsbm/kiE9z+gJY3/wSzzVncPPdhGFBK0XXd+Bjr+/65uEZfAY/aEuj7fhTWn+Yr7LyfT/8D83mtX2Z037zUf5043Nf0bX3DLxXXPBLW/GrxP+HEbcOJ24YTtw0nbhtO3DacuG04cdtw4rbhxG3DiduGE7cNJ24bTtw2nLhtOHHbcOK24cRtw4nbhhO3DSduG07cNpy4bThx23DituHEbcOJ24YTtw1rxZ/uLf3bTr258V/P905c78s0gyZ0g/kmg+jdw7qZDo/+gMCcaMrqGBEhBEIIgNlvo9ZpIEKISSbE7YZauFlxvfVYR4kURUGe5wCzj0rQi9Y0DXmeUxQFdV0jhKDrujENRBOYk7R0WZZkWcbpdALg5+dn9uEYZlRCURScTieyLKMsy4n8ZOO8nqQTNbIs4+vrC4A8zxcTh/LIIcsy6rpGSjkV1xEDelJZlpzPZ4ZhoKqqxQXg6DovioIsy7hcLpRlOYrr7z5ccQAhBHmeLzLySJdsVVVj5NHtio+xZmYWzG8Iueq6bgy5klLe1fhEHOyJNbM2yO5OfBxYqPAtz15b/wHsvBSUT5t0gwAAAABJRU5ErkJggg=="
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3164-3"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3166-1"
+ d="m 991,579 62,0 0,-84 -62,0 0,84 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3160-9"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3162-3"
+ d="m 991,579 62,0 0,-84 -62,0 0,84 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3152-4"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3154-4"
+ d="m 897,482 239.999,0 0,135 -239.999,0 0,-135 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3126-1"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3128-0"
+ d="m 887,628 270,0 0,-182 -270,0 0,182 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3118-8"
+ clipPathUnits="userSpaceOnUse"><path
+ id="path3120-5"
+ d="m 0,1080 1920,0 L 1920,0 0,0 0,1080 z"
+ inkscape:connector-curvature="0" /></clipPath><clipPath
+ id="clipPath3722-1-6"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3724-4-6"
+ d="m 652,532 12.002,0 0,-12 -12.002,0 0,12 z" /></clipPath><clipPath
+ id="clipPath3726-6-9"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3728-1-7"
+ d="m 652.002,520.002 12,0 0,11.998 -12,0 0,-11.998 z" /></clipPath><clipPath
+ id="clipPath3696-9-7"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3698-6-3"
+ d="m 592,530.865 32,0 0,-12.002 -32,0 0,12.002 z" /></clipPath><clipPath
+ id="clipPath3700-1-1"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3702-8-2"
+ d="m 592,518.865 32,0 0,12 -32,0 0,-12 z" /></clipPath><clipPath
+ id="clipPath3696-9-7-9"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3698-6-3-5"
+ d="m 592,530.865 32,0 0,-12.002 -32,0 0,12.002 z" /></clipPath><clipPath
+ id="clipPath3700-1-1-8"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3702-8-2-6"
+ d="m 592,518.865 32,0 0,12 -32,0 0,-12 z" /></clipPath><clipPath
+ id="clipPath3722-1-6-1"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3724-4-6-5"
+ d="m 652,532 12.002,0 0,-12 -12.002,0 0,12 z" /></clipPath><clipPath
+ id="clipPath3726-6-9-4"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3728-1-7-6"
+ d="m 652.002,520.002 12,0 0,11.998 -12,0 0,-11.998 z" /></clipPath><clipPath
+ id="clipPath3086-4-0"><path
+ inkscape:connector-curvature="0"
+ d="m 1058,722 374,0 0,-374 -374,0 0,374 z"
+ id="path3088-8-7" /></clipPath><clipPath
+ id="clipPath3100-8-2"><path
+ inkscape:connector-curvature="0"
+ d="m 1029,344 432,0 0,-32 -432,0 0,32 z"
+ id="path3102-2-9" /></clipPath><clipPath
+ id="clipPath3116-4-9"><path
+ inkscape:connector-curvature="0"
+ d="m 1029,756 432,0 0,-32 -432,0 0,32 z"
+ id="path3118-5-1" /></clipPath><clipPath
+ id="clipPath3592-5-68"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3594-9-1"
+ d="m 730.778,549 12,0 0,-12 -12,0 0,12 z" /></clipPath><clipPath
+ id="clipPath3566-8-9"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3568-8-22"
+ d="m 679,547.865 32,0 0,-12.002 -32,0 0,12.002 z" /></clipPath><clipPath
+ id="clipPath3570-6-4"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3572-0-00"
+ d="m 679,535.865 32,0 0,12 -32,0 0,-12 z" /></clipPath><clipPath
+ id="clipPath3520-6-4"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3522-3-32"
+ d="m 667,561 93,0 0,-68 -93,0 0,68 z" /></clipPath><mask
+ id="mask3528-3-5"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><g
+ id="g3530-7-3"><g
+ id="g3532-3-5"
+ clip-path="url(#clipPath3524-5-2)"><g
+ id="g3534-0-0"><g
+ id="g3536-4-5"
+ transform="matrix(93,0,0,68,667,493)"><image
+ id="image3538-4-00"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAABECAYAAADjqDmQAAAABHNCSVQICAgIfAhkiAAAA51JREFUeJztnEtv4koQRo/BpokBoThZIJJN/v/vCkoUYuSAbYwfPYu57duOzWPm3lEvpo5UwqLbXhyXihaLzwM0A3ieN/S1cCNaD2oFwOObdM/zWuH2tXAbWutWuH1t45sLI3c0GvXKXheGMXKbpumVvQ6WdPgp3Pd9giBoy/d9EX8FW3hd15RlSVmWnE4n6rruiffhp0wjXClFGIbMZjNmsxlKqVa8SB9Ga90KL4qCLMvIsow0TTkej1RVRV3X7f6O9CAICMOQKIp4eHggiiIWiwVKKcbjscz4AczcbpqG0+lEmqbsdjviOGY0GrXrZo/WGt+e5UEQMJ/PeXx85Pn5mfV6TRRFhGFIEATtmBG6aK2pqorj8UiSJLy/v6OUomkayrK8vdPX6zUvLy+sVisWiwWTyURGzBmapqGqKvI8J45jwjBEa02e5+2IKcvy306H/kyfz+dEUcRqteLp6Ynlcsl0OhXpZzDSsyxjNpvRNA37/Z7tdst2u22nhBnPg6cX82O6WCxYLpfc39935rrQxYyX6XQKwH6/Z7lcMp/PW2/2aO6c003Hj8djgiBgMpmglEIpxXQ6FelnMNIB8jwnDEPu7u5QShEEQe8Q4n9/gBFvvwC7RHofc/42zer7flv2WDH0pBvMxqES+pgmtctuYBs5A/4BrjWoSHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASHeASP8D2GlGQ5zNBrBvvPaQvx07LsouO0LKpifd3mjCwEyBJNYNYaJHTFJdVVVtGZeDEYH22zI3n04niqKgKAoAiR45g5GeZRl5nrefRVFQliV1XXfEdzrdxCKZmLv9fk+SJAASJ3UBO07q8/OTOI5JkoTD4UBRFJ1sRvhHuulwI/xwOBDHMW9vbwB8fX1JcNoFvgenvb6+8vHxQZIk5HneCU1rg9OM9LIsybKMOI7ZbDYAJEkiEYFXGIoI3Gw2xHFMmqYd6QC+1hrP81rph8OB7XaL1po0TSUM8wqXwjB3ux15nlNVVf+H9HunAxRFQZIkEvt6A5diX+2ZbsS3Ud52NqMEHP8atwQc26eXjnSQKO/f5VeivCW0/n/mltD6nvR2QWT/Jy79ZfIDbR7YvKqk0OoAAAAASUVORK5CYII="
+ transform="matrix(1,0,0,-1,0,1)"
+ height="1"
+ width="1" /></g></g></g></g></mask><clipPath
+ id="clipPath3524-5-2"
+ clipPathUnits="userSpaceOnUse"><path
+ inkscape:connector-curvature="0"
+ id="path3526-4-1"
+ d="m 667,561 93,0 0,-68 -93,0 0,68 z" /></clipPath><mask
+ id="mask3540-4-88"
+ height="1"
+ width="1"
+ y="0"
+ x="0"
+ maskUnits="userSpaceOnUse"><image
+ id="image3542-1-5"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAABECAAAAADGw2ZMAAAAAXNCSVQI5gpbmQAAAZJJREFUWIXt2DFv2zAQhuHvTlTkyDaMuBmCtEv//+9q0KKuAtWWZJnkfR0UAwY69jyVXAhoeEQcyOUVAAAEvos3rAjE0ydBfugCVVV1Oz9hZmYgEABoqOs6ePGE5Rgv2UAEiIamXa+boE665Xkch3PKQIBo3e4/7bdN5TJ70i7De6ckjUGg9eb5y+u+rdUBB5jO/Y/G4s3ZX7++bB98RmNp6lpOwzkal7lv9i+fdysvfVzb8XCoVWS5M0273T01lYvOtMJxt2kqBQIgolX90DQrLx1T+9jUlQgCAIiKVlXlpKOqQwgqsrwmALIsDx2iqioqAHxu4V8/+DjoffTrKnrRi170ohe96EUvetGLXvSiF/3/0bkkvWsnIHn98u+ymRmNV51Gyzn7RD2mHFNKxqUYkpbjZZ7h1WfGaZzmmEkEAJbm8djDr1z96vrTnA0IoKX51H3Hb8fq9u1nP0UjA2hx7N7QuxbDt26IRgSKxdOBg3PtfJ8Sl8nEEXPvXWrnbIQAcqfKTN65kN+97t9sfv6y/QG64fFP78GtbgAAAABJRU5ErkJggg=="
+ height="1"
+ width="1" /></mask></defs><g
+ inkscape:groupmode="layer"
+ id="layer8"
+ inkscape:label="Layer5"
+ transform="translate(436.0495,72.4457)"><g
+ style="display:inline"
+ id="g3508-5-64"
+ transform="matrix(5.09,0,0,-5.09,-201.82504,927.02677)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c -2.209,0 -4,1.791 -4,4 l 0,92 c 0,2.209 1.791,4 4,4 l 92,0 c 2.209,0 4,-1.791 4,-4 L 96,4 C 96,1.791 94.209,0 92,0 L 0,0 z"
+ style="fill:#4fbdee;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3510-0-3" /></g><g
+ style="display:inline"
+ id="g3516-7-0"
+ transform="matrix(5.09,0,0,-5.09,-3586.6755,3426.2166)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ id="g3518-2-5" /><g
+ id="g3544-9-2"><g
+ style="opacity:0.119995"
+ clip-path="url(#clipPath3520-6-4)"
+ id="g3546-7-5"><g
+ id="g3548-8-3"><g
+ id="g3550-3-8" /><g
+ mask="url(#mask3528-3-5)"
+ id="g3552-8-72"><g
+ transform="matrix(93,0,0,68,667,493)"
+ id="g3554-9-8"><image
+ width="1"
+ height="1"
+ transform="matrix(1,0,0,-1,0,1)"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAABECAYAAADjqDmQAAAABHNCSVQICAgIfAhkiAAAAP1JREFUeJzt3DGKhEAARcFWvP+VeyNBxJGFHX3BVmU2BvL4DBP1Muec48KyLFfH/NKHrGOMMbbzgdjfsXe8ir+dX+K7ruKv1cf8N8dRr+cDnmfpL9rHvVr5+yw9sIwxPv+h5BGWHhA9IHpA9IDoAdEDogdED4geED0gekD0gOgB0QOiB0QPiB4QPSB6QPSA6AHRA6IHRA+IHhA9IHpA9IDoAdEDogdED4geED0gekD0gOgB0QOiB0QPiB4QPSB6QPSA6AHRA6IHRA+IHhA9IHpA9JfNOUUvrHe3H/MMS3/RPvD1+MA7LP0lx2Fv50N3737X7aX155fE/5u7n+wfv04ph+lQnM8AAAAASUVORK5CYII="
+ mask="url(#mask3540-4-88)"
+ id="image3556-9-3" /></g></g></g></g></g></g><g
+ style="display:inline"
+ id="g3558-6-1"
+ transform="matrix(5.09,0,0,-5.09,235.91496,860.85677)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,-1.65 -1.35,-3 -3,-3 l -74,0 c -1.649,0 -3,1.35 -3,3 l 0,50 c 0,1.65 1.351,3 3,3 l 74,0 c 1.65,0 3,-1.35 3,-3 L 0,0 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3560-5-6" /></g><g
+ style="display:inline"
+ id="g3562-4-0"
+ transform="matrix(5.09,0,0,-5.09,-3586.6755,3426.2166)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ id="g3564-6-3" /><g
+ id="g3574-7-9"><g
+ style="opacity:0.5"
+ clip-path="url(#clipPath3566-8-9)"
+ id="g3576-7-8"><g
+ id="g3578-2-9"><g
+ clip-path="url(#clipPath3570-6-4)"
+ id="g3580-1-9"><path
+ inkscape:connector-curvature="0"
+ d="m 710.994,535.863 -31.988,0 0,12.002 31.988,0 0,-12.002 z"
+ style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3582-0-16" /></g></g></g></g></g><path
+ inkscape:connector-curvature="0"
+ d="m 123.93496,748.87677 -254.5,0 0,-25.45 254.5,0 0,25.45 z"
+ style="fill:#d1d2d3;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ id="path3584-1-9"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999" /><path
+ inkscape:connector-curvature="0"
+ d="m 6.8649591,799.77677 -137.4299991,0 0,-25.45 137.4299991,0 0,25.45 z"
+ style="fill:#d1d2d3;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ id="path3586-5-0"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999" /><g
+ style="display:inline"
+ id="g3588-5-0"
+ transform="matrix(5.09,0,0,-5.09,-3586.6755,3426.2166)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ id="g3590-3-9" /><g
+ id="g3596-7-2"><g
+ style="opacity:0"
+ clip-path="url(#clipPath3592-5-68)"
+ id="g3598-6-5"><path
+ inkscape:connector-curvature="0"
+ d="m 730.777,537 12,0 0,12 -12,0 0,-12 z"
+ style="fill:#03a9f4;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3600-8-1" /></g></g></g><g
+ style="display:inline"
+ id="g3602-7-0"
+ transform="matrix(5.09,0,0,-5.09,188.97176,661.07427)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,0.414 -0.336,0.75 -0.75,0.75 l -2.75,0 -2.5,4 -1,0 1.25,-4 -2.75,0 -0.75,1 -0.75,0 0.5,-1.75 -0.5,-1.75 0.75,0 0.75,1 2.75,0 -1.25,-4 1,0 2.5,4 2.75,0 C -0.336,-0.75 0,-0.414 0,0"
+ style="fill:#00c853;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3604-3-8" /></g><g
+ transform="matrix(1.25,0,0,-1.25,-1884.887,1349.9021)"
+ id="g3012-8"
+ style="display:inline"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ transform="translate(1677.8121,922.30928)"
+ id="g3072-5"
+ style="fill:#333333;fill-opacity:1"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -285.486,0 -14,-190.491 313.486,0 L 0,0 z"
+ id="path3074-5"
+ style="fill:#101010;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g><g
+ transform="translate(1691.8121,352.84148)"
+ id="g3076-9"
+ style="fill:#333333;fill-opacity:1"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -313.486,0 14,-190.491 286.486,0 L 0,0 z"
+ id="path3078-3"
+ style="fill:#101010;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g><path
+ inkscape:connector-curvature="0"
+ d="m 1721.07,355.32978 -374,0 0,374 374,0 0,-374 z m 3.332,409 -378.666,0 c -14.729,0 -26.666,-11.938 -26.666,-26.667 l 0,-5.333 0,-380 0,-5.334 c 0,-14.727 11.937,-26.666 26.666,-26.666 l 378.666,0 c 14.729,0 26.668,11.939 26.668,26.666 l 0,5.334 0,380 0,5.333 c 0,14.729 -11.939,26.667 -26.668,26.667"
+ id="path3080-4"
+ style="fill:#101010;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
+ transform="translate(290.06807,8.3297801)"
+ id="g3082-3"><g
+ id="g3084-9" /><g
+ id="g3090-2"><g
+ clip-path="url(#clipPath3086-4-0)"
+ id="g3092-8"
+ style="opacity:0.10000598"><path
+ inkscape:connector-curvature="0"
+ d="m 1432.002,722 -374,0 0,-374 374,0 0,374 z m -3,-371 -368,0 0,368 368,0 0,-368 z"
+ id="path3094-1"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></g><g
+ transform="translate(290.06807,8.3297801)"
+ id="g3096-6"><g
+ id="g3098-6" /><g
+ id="g3104-5"><g
+ clip-path="url(#clipPath3100-8-2)"
+ id="g3106-9"
+ style="opacity:0.10000598"><g
+ transform="translate(1434.334,317.334)"
+ id="g3108-9"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -378.666,0 c -14.729,0 -26.666,11.938 -26.666,26.666 l 0,-5.334 c 0,-14.727 11.937,-26.666 26.666,-26.666 L 0,-5.334 c 14.729,0 26.668,11.939 26.668,26.666 l 0,5.334 C 26.668,11.938 14.729,0 0,0"
+ id="path3110-8"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></g></g><g
+ transform="translate(290.06807,8.3297801)"
+ id="g3112-1"><g
+ id="g3114-5" /><g
+ id="g3120-7"><g
+ clip-path="url(#clipPath3116-4-9)"
+ id="g3122-5"
+ style="opacity:0.10000598"><g
+ transform="translate(1434.334,756)"
+ id="g3124-1"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -378.666,0 c -14.729,0 -26.666,-11.938 -26.666,-26.667 l 0,-5.333 c 0,14.728 11.937,26.667 26.666,26.667 L 0,-5.333 c 14.729,0 26.668,-11.939 26.668,-26.667 l 0,5.333 C 26.668,-11.938 14.729,0 0,0"
+ id="path3126-0"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></g></g></g></g><g
+ inkscape:groupmode="layer"
+ id="layer7"
+ inkscape:label="Layer4"
+ style="display:inline"
+ transform="translate(436.0495,72.4457)"><g
+ style="display:inline"
+ id="g3622-5-8"
+ transform="matrix(5.2235991,0,0,-5.1937884,507.13047,984.15494)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c -32.947,0 -59.75,26.804 -59.75,59.75 0,32.946 26.803,59.75 59.75,59.75 32.945,0 59.75,-26.804 59.75,-59.75 C 59.75,26.804 32.945,0 0,0"
+ style="fill:#ff4a3c;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3624-3-9" /></g><g
+ style="display:inline"
+ id="g3630-4-7"
+ transform="matrix(5.2235991,0,0,-5.1937884,-2762.8426,3436.9216)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ id="g3632-0-4"
+ clip-path="url(#clipPath3634-8-0)"><g
+ id="g3638-2-4"><g
+ id="g3640-4-1" /><g
+ id="g3666-9-6"><g
+ style="opacity:0.119995"
+ clip-path="url(#clipPath3642-3-4)"
+ id="g3668-8-7"><g
+ id="g3670-0-5"><g
+ id="g3672-4-4" /><g
+ mask="url(#mask3650-5-0)"
+ id="g3674-2-0"><g
+ transform="matrix(139.35082,0,0,78.633677,558.31445,465.31115)"
+ id="g3676-6-2"><image
+ width="1"
+ height="1"
+ transform="matrix(1,0,0,-1,0,1)"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAABPCAYAAAA5vC0kAAAABHNCSVQICAgIfAhkiAAAASdJREFUeJzt1rFuwyAUQFGw/P+/TIfKamQ5be7kRjlnshEDw9WDudZa48Kc82qZD/Eki7GfF4TCGD8dnMPZzxvg0Tmc7c7D8D6OcLbHH/iLCcPL5pxjjjGun8NwwYQhEQyJYEgEQyIYEsGQCIZEMCSCIREMiWBIBEMiGBLBkAiGRDAkgiERDIlgSARDIhgSwZAIhkQwJIIhEQyJYEgEQyIYEsGQCIZEMCSCIREMiWBIBEMiGBLBkAiGRDAkgiERDIlgSARDIhgSwZAIhkQwJIIhEQyJYEgEQyIYEsGQCIZEMCSCIREMiWBIBEMiGBLBkAiGRDAkgiERDMm21rr7DLyJtZYJQ7ON8V0O/OZoxIQh2Y+Po6A5522H4f853z77sw3C+WzPnilfB04mnX6avLgAAAAASUVORK5CYII="
+ mask="url(#mask3662-9-4)"
+ id="image3678-1-3" /></g></g></g></g></g></g><g
+ id="g3680-5-3"
+ transform="translate(689.7031,476.2588)"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,-1.642 -1.344,-2.984 -2.986,-2.984 l -121.434,0 c -1.643,0 -2.986,1.342 -2.986,2.984 l 0,60.719 c 0,1.641 1.343,2.985 2.986,2.985 l 121.434,0 C -1.344,63.704 0,62.36 0,60.719 L 0,0 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3682-6-2" /></g></g></g><g
+ id="layer3"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ transform="matrix(1.25,0,0,-1.25,715.58308,453.4259)"
+ id="g3024-4"
+ style="fill:#000000;display:inline"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -12.195,205.05 -307.49,0 L -331.88,0 c 44.595,34.886 102.563,58.974 165.94,58.974 C -102.563,58.974 -44.595,34.886 0,0"
+ id="path3026-3"
+ style="fill:#2e2e2e;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g><g
+ transform="matrix(1.25,0,0,-1.25,300.90228,894.5124)"
+ id="g3028-0"
+ style="fill:#000000;display:inline"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 12.06,-202.039 307.49,0 L 331.609,0 C 287.033,-34.822 229.119,-58.869 165.805,-58.869 102.491,-58.869 44.576,-34.822 0,0"
+ id="path3030-8"
+ style="fill:#2e2e2e;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g><g
+ transform="matrix(1.25,0,0,-1.25,456.87948,388.9154)"
+ id="g3032-2"
+ style="display:inline"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 5.706,1.02 11.485,1.83 17.328,2.423 3.895,0.395 7.819,0.694 11.769,0.895 3.95,0.2 7.926,0.301 11.926,0.301 4,0 7.976,-0.101 11.926,-0.301 3.95,-0.201 7.874,-0.5 11.77,-0.895 C 70.561,1.83 76.341,1.02 82.047,0 c 108.425,-19.367 190.726,-114.139 190.726,-228.132 0,-127.991 -103.756,-231.75 -231.75,-231.75 -127.99,0 -231.751,103.759 -231.751,231.75 0,113.993 82.305,208.765 190.728,228.132 m 41.023,26.794 c -140.792,0 -254.926,-114.133 -254.926,-254.926 0,-140.792 114.134,-254.926 254.926,-254.926 140.79,0 254.926,114.134 254.926,254.926 0,140.793 -114.136,254.926 -254.926,254.926"
+ id="path3034-1"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g><g
+ transform="matrix(1.25,0,0,-1.25,508.15818,355.4224)"
+ id="g3036-8"
+ style="fill:#000000;display:inline"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c -140.792,0 -254.926,-114.134 -254.926,-254.926 0,-140.792 114.134,-254.926 254.926,-254.926 140.792,0 254.926,114.134 254.926,254.926 C 254.926,-114.134 140.792,0 0,0 m 231.75,-254.926 c 0,-127.991 -103.758,-231.75 -231.75,-231.75 -127.992,0 -231.75,103.759 -231.75,231.75 0,127.993 103.758,231.751 231.75,231.751 127.992,0 231.75,-103.758 231.75,-231.751"
+ id="path3038-3"
+ style="fill:#2c2c2c;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g><g
+ transform="matrix(1.25,0,0,-1.25,-264.34372,1339.588)"
+ id="g3040-9"
+ style="display:inline"><g
+ id="g3042-1" /><g
+ id="g3048-2"><g
+ clip-path="url(#clipPath3044-8-3-2)"
+ id="g3050-4"
+ style="opacity:0.10000598"><g
+ transform="translate(844.249,532.4062)"
+ id="g3052-7"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,-124.952 -101.295,-226.248 -226.248,-226.248 -124.952,0 -226.247,101.296 -226.247,226.248 0,124.953 101.295,226.248 226.247,226.248 C -101.295,226.248 0,124.953 0,0"
+ id="path3054-5"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></g></g><g
+ transform="matrix(1.25,0,0,-1.25,-264.34372,1339.588)"
+ id="g3056-2"
+ style="display:inline"><g
+ id="g3058-6" /><g
+ id="g3064-1"><g
+ clip-path="url(#clipPath3060-8-2-1)"
+ id="g3066-2"
+ style="opacity:0.10000598"><g
+ transform="translate(618.0015,787.7266)"
+ id="g3068-5"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c -34.466,0 -67.903,-6.75 -99.383,-20.065 -30.404,-12.861 -57.707,-31.269 -81.155,-54.716 -23.446,-23.447 -41.856,-50.752 -54.715,-81.156 -13.314,-31.48 -20.066,-64.916 -20.066,-99.383 0,-34.465 6.752,-67.904 20.066,-99.381 12.859,-30.405 31.269,-57.709 54.715,-81.156 23.448,-23.447 50.751,-41.857 81.155,-54.715 31.48,-13.315 64.917,-20.066 99.383,-20.066 34.466,0 67.903,6.751 99.382,20.066 30.405,12.858 57.708,31.268 81.155,54.715 23.447,23.447 41.857,50.751 54.716,81.156 13.314,31.477 20.066,64.916 20.066,99.381 0,34.467 -6.752,67.903 -20.066,99.383 -12.859,30.404 -31.269,57.709 -54.716,81.156 -23.447,23.447 -50.75,41.855 -81.155,54.716 C 67.903,-6.75 34.466,0 0,0 m 0,-3.153 c 139.268,0 252.167,-112.897 252.167,-252.167 0,-139.267 -112.899,-252.166 -252.167,-252.166 -139.268,0 -252.167,112.899 -252.167,252.166 0,139.27 112.899,252.167 252.167,252.167"
+ id="path3070-2"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></g></g></g><g
+ style="display:inline"
+ id="g3692-7-8"
+ transform="matrix(5.2956158,0,0,-5.2956158,-2815.7539,3491.418)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ id="g3694-5-3" /><g
+ id="g3704-5-3"><g
+ clip-path="url(#clipPath3696-9-7-9)"
+ id="g3706-2-5"
+ style="opacity:0.5"><g
+ id="g3708-6-9"><g
+ clip-path="url(#clipPath3700-1-1-8)"
+ id="g3710-3-0"><path
+ d="m 623.994,518.863 -31.988,0 0,12.002 31.988,0 0,-12.002 z"
+ style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3712-4-5"
+ inkscape:connector-curvature="0" /></g></g></g></g></g><path
+ d="m 584.03152,795.94967 -264.78075,0 0,-26.47808 264.78075,0 0,26.47808 z"
+ style="fill:#d1d2d3;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ id="path3714-2-5"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999" /><path
+ d="m 462.23242,848.90583 -142.98165,0 0,-26.47808 142.98165,0 0,26.47808 z"
+ style="fill:#d1d2d3;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ id="path3716-3-1"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999" /><g
+ style="display:inline"
+ id="g3718-7-1"
+ transform="matrix(5.2956158,0,0,-5.2956158,-2815.7539,3491.418)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ id="g3720-1-0" /><g
+ id="g3730-8-4"><g
+ clip-path="url(#clipPath3722-1-6-1)"
+ id="g3732-8-4"
+ style="opacity:0"><g
+ id="g3734-9-2"><g
+ clip-path="url(#clipPath3726-6-9-4)"
+ id="g3736-3-3"><path
+ d="m 664.001,520 -12.001,0 0,12 12.001,0 0,-12 z"
+ style="fill:#ee2a7b;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3738-7-6"
+ inkscape:connector-curvature="0" /></g></g></g></g></g><g
+ style="display:inline"
+ id="g3740-9-7"
+ transform="matrix(5.2956158,0,0,-5.2956158,644.93112,705.35546)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><path
+ d="m 0,0 4.5,0 0,-4.501 0.501,0 4,9.001 L 0,0.501 0,0 z"
+ style="fill:#03a9f4;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3742-8-7"
+ inkscape:connector-curvature="0" /></g></g><g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Layer3"
+ style="display:inline"
+ transform="translate(436.0495,72.4457)"><g
+ style="display:inline"
+ id="g3508-5-6"
+ transform="matrix(5.09,0,0,-5.09,742.55563,925.70096)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c -2.209,0 -4,1.791 -4,4 l 0,92 c 0,2.209 1.791,4 4,4 l 92,0 c 2.209,0 4,-1.791 4,-4 L 96,4 C 96,1.791 94.209,0 92,0 L 0,0 z"
+ style="fill:#9d65dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3510-0-8" /></g><g
+ style="display:inline"
+ id="g3516-7-9"
+ transform="matrix(5.09,0,0,-5.09,-2642.2948,3424.8908)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ id="g3518-2-7" /><g
+ id="g3544-9-6"><g
+ style="opacity:0.119995"
+ clip-path="url(#clipPath3520-6-0)"
+ id="g3546-7-3"><g
+ id="g3548-8-7"><g
+ id="g3550-3-6" /><g
+ mask="url(#mask3528-3-8)"
+ id="g3552-8-7"><g
+ transform="matrix(93,0,0,68,667,493)"
+ id="g3554-9-9"><image
+ width="1"
+ height="1"
+ transform="matrix(1,0,0,-1,0,1)"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAABECAYAAADjqDmQAAAABHNCSVQICAgIfAhkiAAAAP1JREFUeJzt3DGKhEAARcFWvP+VeyNBxJGFHX3BVmU2BvL4DBP1Muec48KyLFfH/NKHrGOMMbbzgdjfsXe8ir+dX+K7ruKv1cf8N8dRr+cDnmfpL9rHvVr5+yw9sIwxPv+h5BGWHhA9IHpA9IDoAdEDogdED4geED0gekD0gOgB0QOiB0QPiB4QPSB6QPSA6AHRA6IHRA+IHhA9IHpA9IDoAdEDogdED4geED0gekD0gOgB0QOiB0QPiB4QPSB6QPSA6AHRA6IHRA+IHhA9IHpA9JfNOUUvrHe3H/MMS3/RPvD1+MA7LP0lx2Fv50N3737X7aX155fE/5u7n+wfv04ph+lQnM8AAAAASUVORK5CYII="
+ mask="url(#mask3540-4-8)"
+ id="image3556-9-8" /></g></g></g></g></g></g><g
+ style="display:inline"
+ id="g3558-6-7"
+ transform="matrix(5.09,0,0,-5.09,1180.2956,859.53096)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,-1.65 -1.35,-3 -3,-3 l -74,0 c -1.649,0 -3,1.35 -3,3 l 0,50 c 0,1.65 1.351,3 3,3 l 74,0 c 1.65,0 3,-1.35 3,-3 L 0,0 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3560-5-9" /></g><g
+ style="display:inline"
+ id="g3562-4-5"
+ transform="matrix(5.09,0,0,-5.09,-2642.2948,3424.8908)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ id="g3564-6-8" /><g
+ id="g3574-7-5"><g
+ style="opacity:0.5"
+ clip-path="url(#clipPath3566-8-1)"
+ id="g3576-7-7"><g
+ id="g3578-2-1"><g
+ clip-path="url(#clipPath3570-6-5)"
+ id="g3580-1-1"><path
+ inkscape:connector-curvature="0"
+ d="m 710.994,535.863 -31.988,0 0,12.002 31.988,0 0,-12.002 z"
+ style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3582-0-1" /></g></g></g></g></g><path
+ inkscape:connector-curvature="0"
+ d="m 1068.3156,747.55096 -254.49997,0 0,-25.45 254.49997,0 0,25.45 z"
+ style="fill:#d1d2d3;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ id="path3584-1-4"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999" /><path
+ inkscape:connector-curvature="0"
+ d="m 951.24563,798.45096 -137.43,0 0,-25.45 137.43,0 0,25.45 z"
+ style="fill:#d1d2d3;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ id="path3586-5-3"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999" /><g
+ style="display:inline"
+ id="g3588-5-2"
+ transform="matrix(5.09,0,0,-5.09,-2642.2948,3424.8908)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ id="g3590-3-5" /><g
+ id="g3596-7-7"><g
+ style="opacity:0"
+ clip-path="url(#clipPath3592-5-6)"
+ id="g3598-6-3"><path
+ inkscape:connector-curvature="0"
+ d="m 730.777,537 12,0 0,12 -12,0 0,-12 z"
+ style="fill:#03a9f4;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3600-8-8" /></g></g></g><g
+ style="display:inline"
+ id="g3602-7-1"
+ transform="matrix(5.09,0,0,-5.09,1133.3524,659.74846)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,0.414 -0.336,0.75 -0.75,0.75 l -2.75,0 -2.5,4 -1,0 1.25,-4 -2.75,0 -0.75,1 -0.75,0 0.5,-1.75 -0.5,-1.75 0.75,0 0.75,1 2.75,0 -1.25,-4 1,0 2.5,4 2.75,0 C -0.336,-0.75 0,-0.414 0,0"
+ style="fill:#00c853;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3604-3-1" /></g><g
+ id="layer2"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ transform="matrix(1.25,0,0,-1.25,1156.7381,197.1134)"
+ id="g3072-2"
+ style="fill:#4d4d4d;display:inline"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -285.486,0 -14,-190.491 313.486,0 L 0,0 z"
+ id="path3074-4"
+ style="fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g><g
+ transform="matrix(1.25,0,0,-1.25,1174.2381,908.94815)"
+ id="g3076-2"
+ style="fill:#333333;display:inline"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -313.486,0 14,-190.491 286.486,0 L 0,0 z"
+ id="path3078-2"
+ style="fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g><path
+ inkscape:connector-curvature="0"
+ d="m 1210.8105,905.83777 -467.50004,0 0,-467.5 467.50004,0 0,467.5 z m 4.165,-511.25 -473.33254,0 c -18.41125,0 -33.3325,14.92251 -33.3325,33.33376 l 0,6.66624 0,475 0,6.66751 c 0,18.40874 14.92125,33.33249 33.3325,33.33249 l 473.33254,0 c 18.4112,0 33.335,-14.92375 33.335,-33.33249 l 0,-6.66751 0,-475 0,-6.66624 c 0,-18.41125 -14.9238,-33.33376 -33.335,-33.33376"
+ id="path3080-8"
+ style="fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline" /><g
+ transform="matrix(1.25,0,0,-1.25,-577.94194,1339.5878)"
+ id="g3082-6"
+ style="display:inline"><g
+ id="g3084-6" /><g
+ id="g3090-6"><g
+ clip-path="url(#clipPath3086-0-0-4)"
+ id="g3092-6"
+ style="opacity:0.10000598"><path
+ inkscape:connector-curvature="0"
+ d="m 1432.002,722 -374,0 0,-374 374,0 0,374 z m -3,-371 -368,0 0,368 368,0 0,-368 z"
+ id="path3094-4"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></g><g
+ transform="matrix(1.25,0,0,-1.25,-577.94194,1339.5878)"
+ id="g3096-1"
+ style="display:inline"><g
+ id="g3098-7" /><g
+ id="g3104-3"><g
+ clip-path="url(#clipPath3100-0-7-1)"
+ id="g3106-8"
+ style="opacity:0.10000598"><g
+ transform="translate(1434.334,317.334)"
+ id="g3108-5"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -378.666,0 c -14.729,0 -26.666,11.938 -26.666,26.666 l 0,-5.334 c 0,-14.727 11.937,-26.666 26.666,-26.666 L 0,-5.334 c 14.729,0 26.668,11.939 26.668,26.666 l 0,5.334 C 26.668,11.938 14.729,0 0,0"
+ id="path3110-7"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></g></g><g
+ transform="matrix(1.25,0,0,-1.25,-577.94194,1339.5878)"
+ id="g3112-0"
+ style="display:inline"><g
+ id="g3114-4" /><g
+ id="g3120-4"><g
+ clip-path="url(#clipPath3116-3-2-9)"
+ id="g3122-9"
+ style="opacity:0.10000598"><g
+ transform="translate(1434.334,756)"
+ id="g3124-5"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -378.666,0 c -14.729,0 -26.666,-11.938 -26.666,-26.667 l 0,-5.333 c 0,14.728 11.937,26.667 26.666,26.667 L 0,-5.333 c 14.729,0 26.668,-11.939 26.668,-26.667 l 0,5.333 C 26.668,-11.938 14.729,0 0,0"
+ id="path3126-3"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></g></g></g></g><g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Layer2"
+ style="display:inline"
+ transform="translate(436.0495,72.4457)"><g
+ style="display:inline"
+ id="g3622-5"
+ transform="matrix(5.2235991,0,0,-5.1937884,1450.0328,987.05631)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c -32.947,0 -59.75,26.804 -59.75,59.75 0,32.946 26.803,59.75 59.75,59.75 32.945,0 59.75,-26.804 59.75,-59.75 C 59.75,26.804 32.945,0 0,0"
+ style="fill:#0bda2f;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3624-3" /></g><g
+ style="display:inline"
+ id="g3630-4"
+ transform="matrix(5.2235991,0,0,-5.1937884,-1819.9402,3439.8229)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ id="g3632-0"
+ clip-path="url(#clipPath3634-8)"><g
+ id="g3638-2"><g
+ id="g3640-4" /><g
+ id="g3666-9"><g
+ style="opacity:0.119995"
+ clip-path="url(#clipPath3642-3)"
+ id="g3668-8"><g
+ id="g3670-0"><g
+ id="g3672-4" /><g
+ mask="url(#mask3650-5)"
+ id="g3674-2"><g
+ transform="matrix(139.35082,0,0,78.633677,558.31445,465.31115)"
+ id="g3676-6"><image
+ width="1"
+ height="1"
+ transform="matrix(1,0,0,-1,0,1)"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAABPCAYAAAA5vC0kAAAABHNCSVQICAgIfAhkiAAAASdJREFUeJzt1rFuwyAUQFGw/P+/TIfKamQ5be7kRjlnshEDw9WDudZa48Kc82qZD/Eki7GfF4TCGD8dnMPZzxvg0Tmc7c7D8D6OcLbHH/iLCcPL5pxjjjGun8NwwYQhEQyJYEgEQyIYEsGQCIZEMCSCIREMiWBIBEMiGBLBkAiGRDAkgiERDIlgSARDIhgSwZAIhkQwJIIhEQyJYEgEQyIYEsGQCIZEMCSCIREMiWBIBEMiGBLBkAiGRDAkgiERDIlgSARDIhgSwZAIhkQwJIIhEQyJYEgEQyIYEsGQCIZEMCSCIREMiWBIBEMiGBLBkAiGRDAkgiERDMm21rr7DLyJtZYJQ7ON8V0O/OZoxIQh2Y+Po6A5522H4f853z77sw3C+WzPnilfB04mnX6avLgAAAAASUVORK5CYII="
+ mask="url(#mask3662-9)"
+ id="image3678-1" /></g></g></g></g></g></g><g
+ id="g3680-5"
+ transform="translate(689.7031,476.2588)"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,-1.642 -1.344,-2.984 -2.986,-2.984 l -121.434,0 c -1.643,0 -2.986,1.342 -2.986,2.984 l 0,60.719 c 0,1.641 1.343,2.985 2.986,2.985 l 121.434,0 C -1.344,63.704 0,62.36 0,60.719 L 0,0 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3682-6" /></g></g></g><g
+ transform="translate(2e-5,-3e-5)"
+ id="layer1"
+ style="display:inline"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ transform="matrix(1.25,0,0,-1.25,1656.802,453.73263)"
+ id="g3024"
+ style="fill:#000000"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -12.195,205.05 -307.49,0 L -331.88,0 c 44.595,34.886 102.563,58.974 165.94,58.974 C -102.563,58.974 -44.595,34.886 0,0"
+ id="path3026"
+ style="fill:#606060;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g><g
+ transform="matrix(1.25,0,0,-1.25,1242.1212,894.81914)"
+ id="g3028"
+ style="fill:#000000"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 12.06,-202.039 307.49,0 L 331.609,0 C 287.033,-34.822 229.119,-58.869 165.805,-58.869 102.491,-58.869 44.576,-34.822 0,0"
+ id="path3030"
+ style="fill:#606060;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g><g
+ transform="matrix(1.25,0,0,-1.25,1398.0984,389.22214)"
+ id="g3032"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 5.706,1.02 11.485,1.83 17.328,2.423 3.895,0.395 7.819,0.694 11.769,0.895 3.95,0.2 7.926,0.301 11.926,0.301 4,0 7.976,-0.101 11.926,-0.301 3.95,-0.201 7.874,-0.5 11.77,-0.895 C 70.561,1.83 76.341,1.02 82.047,0 c 108.425,-19.367 190.726,-114.139 190.726,-228.132 0,-127.991 -103.756,-231.75 -231.75,-231.75 -127.99,0 -231.751,103.759 -231.751,231.75 0,113.993 82.305,208.765 190.728,228.132 m 41.023,26.794 c -140.792,0 -254.926,-114.133 -254.926,-254.926 0,-140.792 114.134,-254.926 254.926,-254.926 140.79,0 254.926,114.134 254.926,254.926 0,140.793 -114.136,254.926 -254.926,254.926"
+ id="path3034"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g><g
+ transform="matrix(1.25,0,0,-1.25,1449.3771,355.72914)"
+ id="g3036"
+ style="fill:#000000"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c -140.792,0 -254.926,-114.134 -254.926,-254.926 0,-140.792 114.134,-254.926 254.926,-254.926 140.792,0 254.926,114.134 254.926,254.926 C 254.926,-114.134 140.792,0 0,0 m 231.75,-254.926 c 0,-127.991 -103.758,-231.75 -231.75,-231.75 -127.992,0 -231.75,103.759 -231.75,231.75 0,127.993 103.758,231.751 231.75,231.751 127.992,0 231.75,-103.758 231.75,-231.751"
+ id="path3038"
+ style="fill:#606060;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g><g
+ transform="matrix(1.25,0,0,-1.25,676.87523,1339.8947)"
+ id="g3040"><g
+ id="g3042" /><g
+ id="g3048"><g
+ clip-path="url(#clipPath3044-8-1)"
+ id="g3050"
+ style="opacity:0.10000598"><g
+ transform="translate(844.249,532.4062)"
+ id="g3052"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,-124.952 -101.295,-226.248 -226.248,-226.248 -124.952,0 -226.247,101.296 -226.247,226.248 0,124.953 101.295,226.248 226.247,226.248 C -101.295,226.248 0,124.953 0,0"
+ id="path3054"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></g></g><g
+ transform="matrix(1.25,0,0,-1.25,676.87523,1339.8947)"
+ id="g3056"><g
+ id="g3058" /><g
+ id="g3064"><g
+ clip-path="url(#clipPath3060-8-27)"
+ id="g3066"
+ style="opacity:0.10000598"><g
+ transform="translate(618.0015,787.7266)"
+ id="g3068"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c -34.466,0 -67.903,-6.75 -99.383,-20.065 -30.404,-12.861 -57.707,-31.269 -81.155,-54.716 -23.446,-23.447 -41.856,-50.752 -54.715,-81.156 -13.314,-31.48 -20.066,-64.916 -20.066,-99.383 0,-34.465 6.752,-67.904 20.066,-99.381 12.859,-30.405 31.269,-57.709 54.715,-81.156 23.448,-23.447 50.751,-41.857 81.155,-54.715 31.48,-13.315 64.917,-20.066 99.383,-20.066 34.466,0 67.903,6.751 99.382,20.066 30.405,12.858 57.708,31.268 81.155,54.715 23.447,23.447 41.857,50.751 54.716,81.156 13.314,31.477 20.066,64.916 20.066,99.381 0,34.467 -6.752,67.903 -20.066,99.383 -12.859,30.404 -31.269,57.709 -54.716,81.156 -23.447,23.447 -50.75,41.855 -81.155,54.716 C 67.903,-6.75 34.466,0 0,0 m 0,-3.153 c 139.268,0 252.167,-112.897 252.167,-252.167 0,-139.267 -112.899,-252.166 -252.167,-252.166 -139.268,0 -252.167,112.899 -252.167,252.166 0,139.27 112.899,252.167 252.167,252.167"
+ id="path3070"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></g></g></g><g
+ style="display:inline"
+ id="g3692-7"
+ transform="matrix(5.2956158,0,0,-5.2956158,-1870.725,3488.2105)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ id="g3694-5" /><g
+ id="g3704-5"><g
+ clip-path="url(#clipPath3696-9-7)"
+ id="g3706-2"
+ style="opacity:0.5"><g
+ id="g3708-6"><g
+ clip-path="url(#clipPath3700-1-1)"
+ id="g3710-3"><path
+ d="m 623.994,518.863 -31.988,0 0,12.002 31.988,0 0,-12.002 z"
+ style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3712-4"
+ inkscape:connector-curvature="0" /></g></g></g></g></g><path
+ d="m 1529.0604,792.7421 -264.7808,0 0,-26.47808 264.7808,0 0,26.47808 z"
+ style="fill:#d1d2d3;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ id="path3714-2"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999" /><path
+ d="m 1407.2613,845.69826 -142.9817,0 0,-26.47808 142.9817,0 0,26.47808 z"
+ style="fill:#d1d2d3;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ id="path3716-3"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999" /><g
+ style="display:inline"
+ id="g3718-7"
+ transform="matrix(5.2956158,0,0,-5.2956158,-1870.725,3488.2105)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ id="g3720-1" /><g
+ id="g3730-8"><g
+ clip-path="url(#clipPath3722-1-6)"
+ id="g3732-8"
+ style="opacity:0"><g
+ id="g3734-9"><g
+ clip-path="url(#clipPath3726-6-9)"
+ id="g3736-3"><path
+ d="m 664.001,520 -12.001,0 0,12 12.001,0 0,-12 z"
+ style="fill:#ee2a7b;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3738-7"
+ inkscape:connector-curvature="0" /></g></g></g></g></g><g
+ style="display:inline"
+ id="g3740-9"
+ transform="matrix(5.2956158,0,0,-5.2956158,1589.96,702.14789)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><path
+ d="m 0,0 4.5,0 0,-4.501 0.501,0 4,9.001 L 0,0.501 0,0 z"
+ style="fill:#03a9f4;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3742-8"
+ inkscape:connector-curvature="0" /></g></g><g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Layer1"
+ style="display:inline"
+ transform="translate(436.0495,72.4457)"><g
+ style="display:inline"
+ id="g3508-5"
+ transform="matrix(5.09,0,0,-5.09,1683.0619,927.12472)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c -2.209,0 -4,1.791 -4,4 l 0,92 c 0,2.209 1.791,4 4,4 l 92,0 c 2.209,0 4,-1.791 4,-4 L 96,4 C 96,1.791 94.209,0 92,0 L 0,0 z"
+ style="fill:#ffed0d;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3510-0" /></g><g
+ style="display:inline"
+ id="g3516-7"
+ transform="matrix(5.09,0,0,-5.09,-1701.7885,3426.3146)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ id="g3518-2" /><g
+ id="g3544-9"><g
+ style="opacity:0.119995"
+ clip-path="url(#clipPath3520-6)"
+ id="g3546-7"><g
+ id="g3548-8"><g
+ id="g3550-3" /><g
+ mask="url(#mask3528-3)"
+ id="g3552-8"><g
+ transform="matrix(93,0,0,68,667,493)"
+ id="g3554-9"><image
+ width="1"
+ height="1"
+ transform="matrix(1,0,0,-1,0,1)"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAABECAYAAADjqDmQAAAABHNCSVQICAgIfAhkiAAAAP1JREFUeJzt3DGKhEAARcFWvP+VeyNBxJGFHX3BVmU2BvL4DBP1Muec48KyLFfH/NKHrGOMMbbzgdjfsXe8ir+dX+K7ruKv1cf8N8dRr+cDnmfpL9rHvVr5+yw9sIwxPv+h5BGWHhA9IHpA9IDoAdEDogdED4geED0gekD0gOgB0QOiB0QPiB4QPSB6QPSA6AHRA6IHRA+IHhA9IHpA9IDoAdEDogdED4geED0gekD0gOgB0QOiB0QPiB4QPSB6QPSA6AHRA6IHRA+IHhA9IHpA9JfNOUUvrHe3H/MMS3/RPvD1+MA7LP0lx2Fv50N3737X7aX155fE/5u7n+wfv04ph+lQnM8AAAAASUVORK5CYII="
+ mask="url(#mask3540-4)"
+ id="image3556-9" /></g></g></g></g></g></g><g
+ style="display:inline"
+ id="g3558-6"
+ transform="matrix(5.09,0,0,-5.09,2120.8019,860.95472)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,-1.65 -1.35,-3 -3,-3 l -74,0 c -1.649,0 -3,1.35 -3,3 l 0,50 c 0,1.65 1.351,3 3,3 l 74,0 c 1.65,0 3,-1.35 3,-3 L 0,0 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3560-5" /></g><g
+ style="display:inline"
+ id="g3562-4"
+ transform="matrix(5.09,0,0,-5.09,-1701.7885,3426.3146)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ id="g3564-6" /><g
+ id="g3574-7"><g
+ style="opacity:0.5"
+ clip-path="url(#clipPath3566-8)"
+ id="g3576-7"><g
+ id="g3578-2"><g
+ clip-path="url(#clipPath3570-6)"
+ id="g3580-1"><path
+ inkscape:connector-curvature="0"
+ d="m 710.994,535.863 -31.988,0 0,12.002 31.988,0 0,-12.002 z"
+ style="fill:#6d6e71;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3582-0" /></g></g></g></g></g><path
+ inkscape:connector-curvature="0"
+ d="m 2008.8219,748.97472 -254.5,0 0,-25.45 254.5,0 0,25.45 z"
+ style="fill:#d1d2d3;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ id="path3584-1"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999" /><path
+ inkscape:connector-curvature="0"
+ d="m 1891.7519,799.87472 -137.43,0 0,-25.45 137.43,0 0,25.45 z"
+ style="fill:#d1d2d3;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
+ id="path3586-5"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999" /><g
+ style="display:inline"
+ id="g3588-5"
+ transform="matrix(5.09,0,0,-5.09,-1701.7885,3426.3146)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><g
+ id="g3590-3" /><g
+ id="g3596-7"><g
+ style="opacity:0"
+ clip-path="url(#clipPath3592-5)"
+ id="g3598-6"><path
+ inkscape:connector-curvature="0"
+ d="m 730.777,537 12,0 0,12 -12,0 0,-12 z"
+ style="fill:#03a9f4;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3600-8" /></g></g></g><g
+ style="display:inline"
+ id="g3602-7"
+ transform="matrix(5.09,0,0,-5.09,2073.8587,661.17222)"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 c 0,0.414 -0.336,0.75 -0.75,0.75 l -2.75,0 -2.5,4 -1,0 1.25,-4 -2.75,0 -0.75,1 -0.75,0 0.5,-1.75 -0.5,-1.75 0.75,0 0.75,1 2.75,0 -1.25,-4 1,0 2.5,4 2.75,0 C -0.336,-0.75 0,-0.414 0,0"
+ style="fill:#00c853;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3604-3" /></g><g
+ transform="matrix(1.25,0,0,-1.25,0,1350)"
+ id="g3012"
+ style="display:inline"
+ inkscape:export-xdpi="18.559999"
+ inkscape:export-ydpi="18.559999"
+ inkscape:export-filename="C:\Users\Joe Fernandez\Downloads\Android Wear Artwork\g3014.png"><g
+ transform="translate(1677.8121,922.30928)"
+ id="g3072"
+ style="fill:#333333;fill-opacity:1"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -285.486,0 -14,-190.491 313.486,0 L 0,0 z"
+ id="path3074"
+ style="fill:#747474;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g><g
+ transform="translate(1691.8121,352.84148)"
+ id="g3076"
+ style="fill:#333333;fill-opacity:1"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -313.486,0 14,-190.491 286.486,0 L 0,0 z"
+ id="path3078"
+ style="fill:#747474;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g><path
+ inkscape:connector-curvature="0"
+ d="m 1721.07,355.32978 -374,0 0,374 374,0 0,-374 z m 3.332,409 -378.666,0 c -14.729,0 -26.666,-11.938 -26.666,-26.667 l 0,-5.333 0,-380 0,-5.334 c 0,-14.727 11.937,-26.666 26.666,-26.666 l 378.666,0 c 14.729,0 26.668,11.939 26.668,26.666 l 0,5.334 0,380 0,5.333 c 0,14.729 -11.939,26.667 -26.668,26.667"
+ id="path3080"
+ style="fill:#747474;fill-opacity:1;fill-rule:nonzero;stroke:none" /><g
+ transform="translate(290.06807,8.3297801)"
+ id="g3082"><g
+ id="g3084" /><g
+ id="g3090"><g
+ clip-path="url(#clipPath3086-4)"
+ id="g3092"
+ style="opacity:0.10000598"><path
+ inkscape:connector-curvature="0"
+ d="m 1432.002,722 -374,0 0,-374 374,0 0,374 z m -3,-371 -368,0 0,368 368,0 0,-368 z"
+ id="path3094"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></g><g
+ transform="translate(290.06807,8.3297801)"
+ id="g3096"><g
+ id="g3098" /><g
+ id="g3104"><g
+ clip-path="url(#clipPath3100-8)"
+ id="g3106"
+ style="opacity:0.10000598"><g
+ transform="translate(1434.334,317.334)"
+ id="g3108"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -378.666,0 c -14.729,0 -26.666,11.938 -26.666,26.666 l 0,-5.334 c 0,-14.727 11.937,-26.666 26.666,-26.666 L 0,-5.334 c 14.729,0 26.668,11.939 26.668,26.666 l 0,5.334 C 26.668,11.938 14.729,0 0,0"
+ id="path3110"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></g></g><g
+ transform="translate(290.06807,8.3297801)"
+ id="g3112"><g
+ id="g3114" /><g
+ id="g3120"><g
+ clip-path="url(#clipPath3116-4)"
+ id="g3122"
+ style="opacity:0.10000598"><g
+ transform="translate(1434.334,756)"
+ id="g3124"><path
+ inkscape:connector-curvature="0"
+ d="m 0,0 -378.666,0 c -14.729,0 -26.666,-11.938 -26.666,-26.667 l 0,-5.333 c 0,14.728 11.937,26.667 26.666,26.667 L 0,-5.333 c 14.729,0 26.668,-11.939 26.668,-26.667 l 0,5.333 C 26.668,-11.938 14.729,0 0,0"
+ id="path3126"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" /></g></g></g></g></g><g
+ id="g3744"
+ transform="matrix(1.25,0,0,-1.25,-298.02174,762.5543)"><g
+ id="g3746" /><g
+ id="g3752"><g
+ clip-path="url(#clipPath3748-6)"
+ id="g3754"
+ style="opacity:0"><path
+ d="m 1484,446 -270,0 0,182 270,0 0,-182 z"
+ style="fill:#ec008c;fill-opacity:1;fill-rule:nonzero;stroke:none"
+ id="path3756"
+ inkscape:connector-curvature="0" /></g></g></g><g
+ id="g3758"
+ transform="matrix(1.25,0,0,-1.25,1378.2283,155.0543)" /><g
+ id="g3762"
+ transform="matrix(1.25,0,0,-1.25,1539.4783,28.8043)" /></g></svg>
\ No newline at end of file
diff --git a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
index 9bcad3e..849faec 100644
--- a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
@@ -139,27 +139,15 @@
@Override
protected boolean onStateChange(int[] stateSet) {
- final int keyframeIndex = mState.indexOfKeyframe(stateSet);
- if (keyframeIndex == getCurrentIndex()) {
- // Propagate state change to current keyframe.
- final Drawable current = getCurrent();
- if (current != null) {
- return current.setState(stateSet);
- }
- return false;
- }
+ // If we're not already at the target index, either attempt to find a
+ // valid transition to it or jump directly there.
+ final int targetIndex = mState.indexOfKeyframe(stateSet);
+ final boolean changedIndex = targetIndex != getCurrentIndex()
+ && (selectTransition(targetIndex) || selectDrawable(targetIndex));
- // Attempt to find a valid transition to the keyframe.
- if (selectTransition(keyframeIndex)) {
- return true;
- }
-
- // No valid transition, attempt to jump directly to the keyframe.
- if (selectDrawable(keyframeIndex)) {
- return true;
- }
-
- return super.onStateChange(stateSet);
+ // Always call super.onStateChanged() to propagate the state change to
+ // the current drawable.
+ return super.onStateChange(stateSet) || changedIndex;
}
private boolean selectTransition(int toIndex) {
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index bec1d38..1fac5b6 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -1058,54 +1058,72 @@
final Drawable drawable;
final String name = parser.getName();
- if (name.equals("selector")) {
- drawable = new StateListDrawable();
- } else if (name.equals("animated-selector")) {
- drawable = new AnimatedStateListDrawable();
- } else if (name.equals("level-list")) {
- drawable = new LevelListDrawable();
- } else if (name.equals("layer-list")) {
- drawable = new LayerDrawable();
- } else if (name.equals("transition")) {
- drawable = new TransitionDrawable();
- } else if (name.equals("ripple")) {
- drawable = new RippleDrawable();
- } else if (name.equals("color")) {
- drawable = new ColorDrawable();
- } else if (name.equals("shape")) {
- drawable = new GradientDrawable();
- } else if (name.equals("vector")) {
- drawable = new VectorDrawable();
- } else if (name.equals("animated-vector")) {
- drawable = new AnimatedVectorDrawable();
- } else if (name.equals("scale")) {
- drawable = new ScaleDrawable();
- } else if (name.equals("clip")) {
- drawable = new ClipDrawable();
- } else if (name.equals("rotate")) {
- drawable = new RotateDrawable();
- } else if (name.equals("animated-rotate")) {
- drawable = new AnimatedRotateDrawable();
- } else if (name.equals("animation-list")) {
- drawable = new AnimationDrawable();
- } else if (name.equals("inset")) {
- drawable = new InsetDrawable();
- } else if (name.equals("bitmap")) {
- //noinspection deprecation
- drawable = new BitmapDrawable(r);
- if (r != null) {
- ((BitmapDrawable) drawable).setTargetDensity(r.getDisplayMetrics());
- }
- } else if (name.equals("nine-patch")) {
- drawable = new NinePatchDrawable();
- if (r != null) {
- ((NinePatchDrawable) drawable).setTargetDensity(r.getDisplayMetrics());
- }
- } else {
- throw new XmlPullParserException(parser.getPositionDescription() +
- ": invalid drawable tag " + name);
- }
+ switch (name) {
+ case "selector":
+ drawable = new StateListDrawable();
+ break;
+ case "animated-selector":
+ drawable = new AnimatedStateListDrawable();
+ break;
+ case "level-list":
+ drawable = new LevelListDrawable();
+ break;
+ case "layer-list":
+ drawable = new LayerDrawable();
+ break;
+ case "transition":
+ drawable = new TransitionDrawable();
+ break;
+ case "ripple":
+ drawable = new RippleDrawable();
+ break;
+ case "color":
+ drawable = new ColorDrawable();
+ break;
+ case "shape":
+ drawable = new GradientDrawable();
+ break;
+ case "vector":
+ drawable = new VectorDrawable();
+ break;
+ case "animated-vector":
+ drawable = new AnimatedVectorDrawable();
+ break;
+ case "scale":
+ drawable = new ScaleDrawable();
+ break;
+ case "clip":
+ drawable = new ClipDrawable();
+ break;
+ case "rotate":
+ drawable = new RotateDrawable();
+ break;
+ case "animated-rotate":
+ drawable = new AnimatedRotateDrawable();
+ break;
+ case "animation-list":
+ drawable = new AnimationDrawable();
+ break;
+ case "inset":
+ drawable = new InsetDrawable();
+ break;
+ case "bitmap":
+ drawable = new BitmapDrawable(r);
+ if (r != null) {
+ ((BitmapDrawable) drawable).setTargetDensity(r.getDisplayMetrics());
+ }
+ break;
+ case "nine-patch":
+ drawable = new NinePatchDrawable();
+ if (r != null) {
+ ((NinePatchDrawable) drawable).setTargetDensity(r.getDisplayMetrics());
+ }
+ break;
+ default:
+ throw new XmlPullParserException(parser.getPositionDescription() +
+ ": invalid drawable tag " + name);
+ }
drawable.inflate(r, parser, attrs, theme);
return drawable;
}
diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java
index eff5a3d..47e0e46 100644
--- a/graphics/java/android/graphics/drawable/GradientDrawable.java
+++ b/graphics/java/android/graphics/drawable/GradientDrawable.java
@@ -1395,9 +1395,12 @@
} else {
radiusType = RADIUS_TYPE_FRACTION;
}
- } else {
+ } else if (tv.type == TypedValue.TYPE_DIMENSION) {
radius = tv.getDimension(r.getDisplayMetrics());
radiusType = RADIUS_TYPE_PIXELS;
+ } else {
+ radius = tv.getFloat();
+ radiusType = RADIUS_TYPE_PIXELS;
}
st.mGradientRadius = radius;
@@ -1549,14 +1552,15 @@
public int mThickness = -1;
public boolean mDither = false;
- private float mCenterX = 0.5f;
- private float mCenterY = 0.5f;
- private float mGradientRadius = 0.5f;
- private int mGradientRadiusType = RADIUS_TYPE_PIXELS;
- private boolean mUseLevel;
- private boolean mUseLevelForShape;
- private boolean mOpaqueOverBounds;
- private boolean mOpaqueOverShape;
+ float mCenterX = 0.5f;
+ float mCenterY = 0.5f;
+ float mGradientRadius = 0.5f;
+ int mGradientRadiusType = RADIUS_TYPE_PIXELS;
+ boolean mUseLevel = false;
+ boolean mUseLevelForShape = true;
+
+ boolean mOpaqueOverBounds;
+ boolean mOpaqueOverShape;
ColorStateList mTint = null;
PorterDuff.Mode mTintMode = DEFAULT_TINT_MODE;
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index 3a51dfb..848fc53 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -694,6 +694,7 @@
if (mTempPaint == null) {
mTempPaint = new Paint();
+ mTempPaint.setFilterBitmap(true);
}
mTempPaint.setAlpha(mVPathRenderer.getRootAlpha());
mTempPaint.setColorFilter(filter);
diff --git a/libs/androidfw/tests/Android.mk b/libs/androidfw/tests/Android.mk
index 5808d20..1344dd9 100644
--- a/libs/androidfw/tests/Android.mk
+++ b/libs/androidfw/tests/Android.mk
@@ -26,6 +26,7 @@
Idmap_test.cpp \
ResTable_test.cpp \
Split_test.cpp \
+ TestHelpers.cpp \
Theme_test.cpp \
TypeWrappers_test.cpp \
ZipUtils_test.cpp
diff --git a/libs/androidfw/tests/ResTable_test.cpp b/libs/androidfw/tests/ResTable_test.cpp
index 89d271d0..6a9314e 100644
--- a/libs/androidfw/tests/ResTable_test.cpp
+++ b/libs/androidfw/tests/ResTable_test.cpp
@@ -37,8 +37,6 @@
#include "data/lib/lib_arsc.h"
-enum { MAY_NOT_BE_BAG = false };
-
TEST(ResTableTest, shouldLoadSuccessfully) {
ResTable table;
ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len));
@@ -48,15 +46,7 @@
ResTable table;
ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len));
- Res_value val;
- ssize_t block = table.getResource(base::R::string::test1, &val, MAY_NOT_BE_BAG);
-
- ASSERT_GE(block, 0);
- ASSERT_EQ(Res_value::TYPE_STRING, val.dataType);
-
- const ResStringPool* pool = table.getTableStringBlock(block);
- ASSERT_TRUE(NULL != pool);
- ASSERT_EQ(String8("test1"), pool->string8ObjectAt(val.data));
+ EXPECT_TRUE(IsStringEqual(table, base::R::string::test1, "test1"));
}
TEST(ResTableTest, resourceNameIsResolved) {
diff --git a/libs/androidfw/tests/Split_test.cpp b/libs/androidfw/tests/Split_test.cpp
index f63f566..b69d685 100644
--- a/libs/androidfw/tests/Split_test.cpp
+++ b/libs/androidfw/tests/Split_test.cpp
@@ -42,6 +42,9 @@
* Package: com.android.test.basic
*/
#include "data/basic/split_de_fr_arsc.h"
+#include "data/basic/split_hdpi_v4_arsc.h"
+#include "data/basic/split_xhdpi_v4_arsc.h"
+#include "data/basic/split_xxhdpi_v4_arsc.h"
/**
* Include a binary resource table. This table
@@ -163,6 +166,33 @@
EXPECT_EQ(ResTable_config::CONFIG_LOCALE, frSpecFlags);
}
+TEST(SplitTest, SelectBestDensity) {
+ ResTable_config baseConfig;
+ memset(&baseConfig, 0, sizeof(baseConfig));
+ baseConfig.density = ResTable_config::DENSITY_XHIGH;
+ baseConfig.sdkVersion = 21;
+
+ ResTable table;
+ table.setParameters(&baseConfig);
+ ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len));
+ ASSERT_EQ(NO_ERROR, table.add(split_hdpi_v4_arsc, split_hdpi_v4_arsc_len));
+
+ EXPECT_TRUE(IsStringEqual(table, base::R::string::density, "hdpi"));
+
+ ASSERT_EQ(NO_ERROR, table.add(split_xhdpi_v4_arsc, split_xhdpi_v4_arsc_len));
+
+ EXPECT_TRUE(IsStringEqual(table, base::R::string::density, "xhdpi"));
+
+ ASSERT_EQ(NO_ERROR, table.add(split_xxhdpi_v4_arsc, split_xxhdpi_v4_arsc_len));
+
+ EXPECT_TRUE(IsStringEqual(table, base::R::string::density, "xhdpi"));
+
+ baseConfig.density = ResTable_config::DENSITY_XXHIGH;
+ table.setParameters(&baseConfig);
+
+ EXPECT_TRUE(IsStringEqual(table, base::R::string::density, "xxhdpi"));
+}
+
TEST(SplitFeatureTest, TestNewResourceIsAccessible) {
ResTable table;
ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len));
@@ -188,7 +218,7 @@
ASSERT_EQ(NO_ERROR, table.add(feature_arsc, feature_arsc_len));
- EXPECT_TRUE(table.getResourceName(base::R::string::test3, false, &name));
+ ASSERT_TRUE(table.getResourceName(base::R::string::test3, false, &name));
EXPECT_EQ(String16("com.android.test.basic"),
String16(name.package, name.packageLen));
diff --git a/libs/androidfw/tests/TestHelpers.cpp b/libs/androidfw/tests/TestHelpers.cpp
new file mode 100644
index 0000000..41a19a7
--- /dev/null
+++ b/libs/androidfw/tests/TestHelpers.cpp
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#include "TestHelpers.h"
+
+#include <androidfw/ResourceTypes.h>
+#include <utils/String8.h>
+#include <gtest/gtest.h>
+
+namespace android {
+
+::testing::AssertionResult IsStringEqual(const ResTable& table, uint32_t resourceId, const char* expectedStr) {
+ Res_value val;
+ ssize_t block = table.getResource(resourceId, &val, MAY_NOT_BE_BAG);
+ if (block < 0) {
+ return ::testing::AssertionFailure() << "could not find resource";
+ }
+
+ if (val.dataType != Res_value::TYPE_STRING) {
+ return ::testing::AssertionFailure() << "resource is not a string";
+ }
+
+ const ResStringPool* pool = table.getTableStringBlock(block);
+ if (pool == NULL) {
+ return ::testing::AssertionFailure() << "table has no string pool for block " << block;
+ }
+
+ const String8 actual = pool->string8ObjectAt(val.data);
+ if (String8(expectedStr) != actual) {
+ return ::testing::AssertionFailure() << actual.string();
+ }
+ return ::testing::AssertionSuccess() << actual.string();
+}
+
+} // namespace android
diff --git a/libs/androidfw/tests/TestHelpers.h b/libs/androidfw/tests/TestHelpers.h
index fe2e5ce..ac80d88 100644
--- a/libs/androidfw/tests/TestHelpers.h
+++ b/libs/androidfw/tests/TestHelpers.h
@@ -6,6 +6,7 @@
#include <androidfw/ResourceTypes.h>
#include <utils/String8.h>
#include <utils/String16.h>
+#include <gtest/gtest.h>
static inline ::std::ostream& operator<<(::std::ostream& out, const android::String8& str) {
return out << str.string();
@@ -17,6 +18,8 @@
namespace android {
+enum { MAY_NOT_BE_BAG = false };
+
static inline bool operator==(const android::ResTable_config& a, const android::ResTable_config& b) {
return memcmp(&a, &b, sizeof(a)) == 0;
}
@@ -25,6 +28,8 @@
return out << c.toString().string();
}
+::testing::AssertionResult IsStringEqual(const ResTable& table, uint32_t resourceId, const char* expectedStr);
+
} // namespace android
#endif // __TEST_HELPERS_H
diff --git a/libs/androidfw/tests/data/app/R.h b/libs/androidfw/tests/data/app/R.h
index 780a116..23e68e3 100644
--- a/libs/androidfw/tests/data/app/R.h
+++ b/libs/androidfw/tests/data/app/R.h
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
#ifndef __APP_R_H
#define __APP_R_H
diff --git a/libs/androidfw/tests/data/app/build b/libs/androidfw/tests/data/app/build
index 89c4641..62257bc 100755
--- a/libs/androidfw/tests/data/app/build
+++ b/libs/androidfw/tests/data/app/build
@@ -1,4 +1,19 @@
#!/bin/bash
+#
+# Copyright (C) 2014 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.
+#
aapt package -v -I ../system/bundle.apk -M AndroidManifest.xml -S res -F bundle.apk -f && \
unzip bundle.apk resources.arsc && \
diff --git a/libs/androidfw/tests/data/app/res/values/values.xml b/libs/androidfw/tests/data/app/res/values/values.xml
index b0ead38..c1cf64c 100644
--- a/libs/androidfw/tests/data/app/res/values/values.xml
+++ b/libs/androidfw/tests/data/app/res/values/values.xml
@@ -1,4 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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>
<attr name="number" format="integer"/>
<style name="Theme.One" parent="@android:style/Theme.One">
diff --git a/libs/androidfw/tests/data/basic/R.h b/libs/androidfw/tests/data/basic/R.h
index 363dcb9..aaac740 100644
--- a/libs/androidfw/tests/data/basic/R.h
+++ b/libs/androidfw/tests/data/basic/R.h
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
#ifndef __BASE_R_H
#define __BASE_R_H
@@ -21,9 +37,10 @@
enum {
test1 = 0x7f030000, // default
test2 = 0x7f030001, // default
+ density = 0x7f030002, // default
- test3 = 0x7f070000, // default (in feature)
- test4 = 0x7f070001, // default (in feature)
+ test3 = 0x7f080000, // default (in feature)
+ test4 = 0x7f080001, // default (in feature)
};
}
@@ -32,7 +49,7 @@
number1 = 0x7f040000, // default, sv
number2 = 0x7f040001, // default
- test3 = 0x7f080000, // default (in feature)
+ test3 = 0x7f090000, // default (in feature)
};
}
diff --git a/libs/androidfw/tests/data/basic/basic_arsc.h b/libs/androidfw/tests/data/basic/basic_arsc.h
index 61cb94c..13ab4fa 100644
--- a/libs/androidfw/tests/data/basic/basic_arsc.h
+++ b/libs/androidfw/tests/data/basic/basic_arsc.h
@@ -1,5 +1,5 @@
unsigned char basic_arsc[] = {
- 0x02, 0x00, 0x0c, 0x00, 0x60, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x0c, 0x00, 0x68, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x01, 0x00, 0x1c, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00,
@@ -16,7 +16,7 @@
0x00, 0x00, 0x05, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00,
0x31, 0x00, 0x00, 0x00, 0x05, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00,
0x74, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x01,
- 0x98, 0x06, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6f, 0x00,
+ 0xa0, 0x06, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6f, 0x00,
0x6d, 0x00, 0x2e, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x72, 0x00,
0x6f, 0x00, 0x69, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x74, 0x00, 0x65, 0x00,
0x73, 0x00, 0x74, 0x00, 0x2e, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00,
@@ -101,61 +101,61 @@
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00,
- 0x18, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00,
- 0x6c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
- 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x1c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x02, 0x44, 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
- 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03,
- 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
- 0x08, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00,
- 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
- 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00,
- 0x6c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
- 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
- 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10,
- 0xc8, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
- 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x7f, 0x01, 0x02, 0x44, 0x00,
- 0x5c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
- 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x73, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
- 0x08, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10,
- 0x90, 0x01, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00,
- 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00, 0x90, 0x00, 0x00, 0x00,
- 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03,
+ 0x03, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00, 0x6c, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,
- 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x01, 0x7f, 0x08, 0x00, 0x00, 0x10, 0x64, 0x00, 0x00, 0x00,
- 0x01, 0x00, 0x01, 0x7f, 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x7f,
- 0x10, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7f,
- 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7f, 0x08, 0x00, 0x00, 0x10,
- 0x2c, 0x01, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00,
- 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x01, 0x02, 0x44, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
- 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x05, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0xc8, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x06, 0x7f, 0x01, 0x02, 0x44, 0x00, 0x5c, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
+ 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x76, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00,
+ 0x05, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x90, 0x01, 0x00, 0x00,
+ 0x02, 0x02, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x02, 0x44, 0x00, 0x90, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x10, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x10,
- 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x10,
- 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x10,
- 0x03, 0x00, 0x00, 0x00
+ 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7f,
+ 0x08, 0x00, 0x00, 0x10, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x7f,
+ 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x7f, 0x10, 0x00, 0x01, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x7f, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x7f, 0x08, 0x00, 0x00, 0x10, 0x2c, 0x01, 0x00, 0x00,
+ 0x02, 0x02, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00,
+ 0x7c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x48, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x00
};
-unsigned int basic_arsc_len = 1888;
+unsigned int basic_arsc_len = 1896;
diff --git a/libs/androidfw/tests/data/basic/build b/libs/androidfw/tests/data/basic/build
index 036e468..fd289fa 100755
--- a/libs/androidfw/tests/data/basic/build
+++ b/libs/androidfw/tests/data/basic/build
@@ -1,11 +1,39 @@
#!/bin/bash
+#
+# Copyright (C) 2014 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.
+#
PATH_TO_FRAMEWORK_RES=$(gettop)/prebuilts/sdk/current/android.jar
-aapt package -M AndroidManifest.xml -S res -I $PATH_TO_FRAMEWORK_RES --split fr,de -F bundle.apk -f && \
+aapt package -M AndroidManifest.xml -S res -I $PATH_TO_FRAMEWORK_RES --split hdpi --split xhdpi --split xxhdpi --split fr,de -F bundle.apk -f && \
unzip bundle.apk resources.arsc && \
mv resources.arsc basic.arsc && \
xxd -i basic.arsc > basic_arsc.h && \
+\
unzip bundle_de_fr.apk resources.arsc && \
mv resources.arsc split_de_fr.arsc && \
-xxd -i split_de_fr.arsc > split_de_fr_arsc.h
+xxd -i split_de_fr.arsc > split_de_fr_arsc.h && \
+\
+unzip bundle_hdpi-v4.apk resources.arsc && \
+mv resources.arsc split_hdpi_v4.arsc && \
+xxd -i split_hdpi_v4.arsc > split_hdpi_v4_arsc.h && \
+\
+unzip bundle_xhdpi-v4.apk resources.arsc && \
+mv resources.arsc split_xhdpi_v4.arsc && \
+xxd -i split_xhdpi_v4.arsc > split_xhdpi_v4_arsc.h && \
+\
+unzip bundle_xxhdpi-v4.apk resources.arsc && \
+mv resources.arsc split_xxhdpi_v4.arsc && \
+xxd -i split_xxhdpi_v4.arsc > split_xxhdpi_v4_arsc.h \
diff --git a/libs/androidfw/tests/data/basic/res/layout-fr-sw600dp/main.xml b/libs/androidfw/tests/data/basic/res/layout-fr-sw600dp/main.xml
index 05ffd58..0dcf7e0 100644
--- a/libs/androidfw/tests/data/basic/res/layout-fr-sw600dp/main.xml
+++ b/libs/androidfw/tests/data/basic/res/layout-fr-sw600dp/main.xml
@@ -1,3 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
<merge>
</merge>
diff --git a/libs/androidfw/tests/data/basic/res/layout/main.xml b/libs/androidfw/tests/data/basic/res/layout/main.xml
index 05ffd58..0dcf7e0 100644
--- a/libs/androidfw/tests/data/basic/res/layout/main.xml
+++ b/libs/androidfw/tests/data/basic/res/layout/main.xml
@@ -1,3 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
<merge>
</merge>
diff --git a/libs/androidfw/tests/data/basic/res/values-de/values.xml b/libs/androidfw/tests/data/basic/res/values-de/values.xml
index 103c6a3..2683a7e 100644
--- a/libs/androidfw/tests/data/basic/res/values-de/values.xml
+++ b/libs/androidfw/tests/data/basic/res/values-de/values.xml
@@ -1,4 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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>
<string name="test1">versuch 1</string>
<string name="test2">versuch 2</string>
diff --git a/libs/androidfw/tests/data/basic/res/values-fr/values.xml b/libs/androidfw/tests/data/basic/res/values-fr/values.xml
index 1806a2d..7d3bed3 100644
--- a/libs/androidfw/tests/data/basic/res/values-fr/values.xml
+++ b/libs/androidfw/tests/data/basic/res/values-fr/values.xml
@@ -1,4 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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>
<string name="test1">essai 1</string>
<string name="test2">essai 2</string>
diff --git a/libs/androidfw/tests/data/basic/res/values-hdpi/values.xml b/libs/androidfw/tests/data/basic/res/values-hdpi/values.xml
new file mode 100644
index 0000000..04bf943
--- /dev/null
+++ b/libs/androidfw/tests/data/basic/res/values-hdpi/values.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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>
+ <string name="density">hdpi</string>
+</resources>
diff --git a/libs/androidfw/tests/data/basic/res/values-sv/values.xml b/libs/androidfw/tests/data/basic/res/values-sv/values.xml
index 9d52307..7351b49 100644
--- a/libs/androidfw/tests/data/basic/res/values-sv/values.xml
+++ b/libs/androidfw/tests/data/basic/res/values-sv/values.xml
@@ -1,4 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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>
<integer name="number1">400</integer>
</resources>
diff --git a/libs/androidfw/tests/data/basic/res/values-xhdpi/values.xml b/libs/androidfw/tests/data/basic/res/values-xhdpi/values.xml
new file mode 100644
index 0000000..845e9a0
--- /dev/null
+++ b/libs/androidfw/tests/data/basic/res/values-xhdpi/values.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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>
+ <string name="density">xhdpi</string>
+</resources>
diff --git a/libs/androidfw/tests/data/basic/res/values-xxhdpi/values.xml b/libs/androidfw/tests/data/basic/res/values-xxhdpi/values.xml
new file mode 100644
index 0000000..964da02
--- /dev/null
+++ b/libs/androidfw/tests/data/basic/res/values-xxhdpi/values.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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>
+ <string name="density">xxhdpi</string>
+</resources>
diff --git a/libs/androidfw/tests/data/basic/res/values/values.xml b/libs/androidfw/tests/data/basic/res/values/values.xml
index 662eda6..a010cca 100644
--- a/libs/androidfw/tests/data/basic/res/values/values.xml
+++ b/libs/androidfw/tests/data/basic/res/values/values.xml
@@ -1,4 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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>
<attr name="attr1" format="reference|integer" />
<attr name="attr2" format="reference|integer" />
diff --git a/libs/androidfw/tests/data/basic/split_de_fr_arsc.h b/libs/androidfw/tests/data/basic/split_de_fr_arsc.h
index a8eaf0b..b742d28 100644
--- a/libs/androidfw/tests/data/basic/split_de_fr_arsc.h
+++ b/libs/androidfw/tests/data/basic/split_de_fr_arsc.h
@@ -1,5 +1,5 @@
unsigned char split_de_fr_arsc[] = {
- 0x02, 0x00, 0x0c, 0x00, 0xd8, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x0c, 0x00, 0xe4, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x01, 0x00, 0x1c, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00,
@@ -10,7 +10,7 @@
0x32, 0x00, 0x00, 0x00, 0x07, 0x00, 0x65, 0x00, 0x73, 0x00, 0x73, 0x00,
0x61, 0x00, 0x69, 0x00, 0x20, 0x00, 0x31, 0x00, 0x00, 0x00, 0x07, 0x00,
0x65, 0x00, 0x73, 0x00, 0x73, 0x00, 0x61, 0x00, 0x69, 0x00, 0x20, 0x00,
- 0x32, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x01, 0x50, 0x03, 0x00, 0x00,
+ 0x32, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x01, 0x5c, 0x03, 0x00, 0x00,
0x7f, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x2e, 0x00,
0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x69, 0x00,
0x64, 0x00, 0x2e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00,
@@ -55,24 +55,25 @@
0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00,
0x14, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00,
- 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
- 0x04, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00, 0x6c, 0x00, 0x00, 0x00,
- 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x65, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00,
+ 0x70, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x50, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x64, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x02, 0x44, 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x66, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
- 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03,
- 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00, 0x6c, 0x00, 0x00, 0x00,
- 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x72, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x10, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03,
0x03, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00,
@@ -82,4 +83,4 @@
0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
-unsigned int split_de_fr_arsc_len = 984;
+unsigned int split_de_fr_arsc_len = 996;
diff --git a/libs/androidfw/tests/data/basic/split_hdpi_v4_arsc.h b/libs/androidfw/tests/data/basic/split_hdpi_v4_arsc.h
new file mode 100644
index 0000000..e9fb7ea
--- /dev/null
+++ b/libs/androidfw/tests/data/basic/split_hdpi_v4_arsc.h
@@ -0,0 +1,68 @@
+unsigned char split_hdpi_v4_arsc[] = {
+ 0x02, 0x00, 0x0c, 0x00, 0x08, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x1c, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x68, 0x00,
+ 0x64, 0x00, 0x70, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x01,
+ 0xd0, 0x02, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6f, 0x00,
+ 0x6d, 0x00, 0x2e, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x72, 0x00,
+ 0x6f, 0x00, 0x69, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x74, 0x00, 0x65, 0x00,
+ 0x73, 0x00, 0x74, 0x00, 0x2e, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00,
+ 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xb0, 0x01, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x00,
+ 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
+ 0x2c, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x72, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x79, 0x00, 0x6f, 0x00, 0x75, 0x00,
+ 0x74, 0x00, 0x00, 0x00, 0x06, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00,
+ 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x00, 0x00, 0x07, 0x00, 0x69, 0x00,
+ 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00,
+ 0x00, 0x00, 0x05, 0x00, 0x73, 0x00, 0x74, 0x00, 0x79, 0x00, 0x6c, 0x00,
+ 0x65, 0x00, 0x00, 0x00, 0x05, 0x00, 0x61, 0x00, 0x72, 0x00, 0x72, 0x00,
+ 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x00,
+ 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6e, 0x00,
+ 0x73, 0x00, 0x69, 0x00, 0x74, 0x00, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00,
+ 0x1c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x02, 0x44, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+unsigned int split_hdpi_v4_arsc_len = 776;
diff --git a/libs/androidfw/tests/data/basic/split_xhdpi_v4_arsc.h b/libs/androidfw/tests/data/basic/split_xhdpi_v4_arsc.h
new file mode 100644
index 0000000..7835f71
--- /dev/null
+++ b/libs/androidfw/tests/data/basic/split_xhdpi_v4_arsc.h
@@ -0,0 +1,68 @@
+unsigned char split_xhdpi_v4_arsc[] = {
+ 0x02, 0x00, 0x0c, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x1c, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x78, 0x00,
+ 0x68, 0x00, 0x64, 0x00, 0x70, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x02, 0x20, 0x01, 0xd0, 0x02, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00,
+ 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x2e, 0x00, 0x61, 0x00, 0x6e, 0x00,
+ 0x64, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x69, 0x00, 0x64, 0x00, 0x2e, 0x00,
+ 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x2e, 0x00, 0x62, 0x00,
+ 0x61, 0x00, 0x73, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0xb0, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x1c, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
+ 0x1c, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00,
+ 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00,
+ 0x72, 0x00, 0x00, 0x00, 0x06, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x79, 0x00,
+ 0x6f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x00, 0x00, 0x06, 0x00, 0x73, 0x00,
+ 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x00, 0x00,
+ 0x07, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00,
+ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x05, 0x00, 0x73, 0x00, 0x74, 0x00,
+ 0x79, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x00, 0x00, 0x05, 0x00, 0x61, 0x00,
+ 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x1c, 0x00, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x64, 0x00,
+ 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x69, 0x00, 0x74, 0x00, 0x79, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00, 0x60, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
+ 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+unsigned int split_xhdpi_v4_arsc_len = 780;
diff --git a/libs/androidfw/tests/data/basic/split_xxhdpi_v4_arsc.h b/libs/androidfw/tests/data/basic/split_xxhdpi_v4_arsc.h
new file mode 100644
index 0000000..f805db1
--- /dev/null
+++ b/libs/androidfw/tests/data/basic/split_xxhdpi_v4_arsc.h
@@ -0,0 +1,68 @@
+unsigned char split_xxhdpi_v4_arsc[] = {
+ 0x02, 0x00, 0x0c, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x1c, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x78, 0x00,
+ 0x78, 0x00, 0x68, 0x00, 0x64, 0x00, 0x70, 0x00, 0x69, 0x00, 0x00, 0x00,
+ 0x00, 0x02, 0x20, 0x01, 0xd0, 0x02, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00,
+ 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x2e, 0x00, 0x61, 0x00, 0x6e, 0x00,
+ 0x64, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x69, 0x00, 0x64, 0x00, 0x2e, 0x00,
+ 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x2e, 0x00, 0x62, 0x00,
+ 0x61, 0x00, 0x73, 0x00, 0x69, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0xb0, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x1c, 0x00, 0x90, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
+ 0x1c, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00,
+ 0x4c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00,
+ 0x72, 0x00, 0x00, 0x00, 0x06, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x79, 0x00,
+ 0x6f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x00, 0x00, 0x06, 0x00, 0x73, 0x00,
+ 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x00, 0x00,
+ 0x07, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x67, 0x00,
+ 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x05, 0x00, 0x73, 0x00, 0x74, 0x00,
+ 0x79, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x00, 0x00, 0x05, 0x00, 0x61, 0x00,
+ 0x72, 0x00, 0x72, 0x00, 0x61, 0x00, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x1c, 0x00, 0x34, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x64, 0x00,
+ 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x69, 0x00, 0x74, 0x00, 0x79, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00, 0x60, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00,
+ 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+unsigned int split_xxhdpi_v4_arsc_len = 780;
diff --git a/libs/androidfw/tests/data/feature/build b/libs/androidfw/tests/data/feature/build
index b547dc2..0f3307f 100755
--- a/libs/androidfw/tests/data/feature/build
+++ b/libs/androidfw/tests/data/feature/build
@@ -1,4 +1,19 @@
#!/bin/bash
+#
+# Copyright (C) 2014 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.
+#
aapt package -M AndroidManifest.xml -S res --feature-of ../basic/bundle.apk -F bundle.apk -f && \
unzip bundle.apk resources.arsc && \
diff --git a/libs/androidfw/tests/data/feature/feature_arsc.h b/libs/androidfw/tests/data/feature/feature_arsc.h
index cf7647d..cd29910 100644
--- a/libs/androidfw/tests/data/feature/feature_arsc.h
+++ b/libs/androidfw/tests/data/feature/feature_arsc.h
@@ -1,11 +1,11 @@
unsigned char feature_arsc[] = {
- 0x02, 0x00, 0x0c, 0x00, 0x40, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x0c, 0x00, 0x44, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x01, 0x00, 0x1c, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
0x05, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x33, 0x00,
0x00, 0x00, 0x05, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00,
- 0x34, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x01, 0xf4, 0x02, 0x00, 0x00,
+ 0x34, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x01, 0xf8, 0x02, 0x00, 0x00,
0x7f, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x2e, 0x00,
0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x69, 0x00,
0x64, 0x00, 0x2e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00,
@@ -28,46 +28,46 @@
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00,
- 0x08, 0x00, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x7c, 0x00, 0x00, 0x00,
- 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x80, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,
- 0x2e, 0x00, 0x00, 0x00, 0x07, 0x00, 0x3c, 0x00, 0x65, 0x00, 0x6d, 0x00,
- 0x70, 0x00, 0x74, 0x00, 0x79, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x04, 0x00,
- 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x72, 0x00, 0x00, 0x00, 0x06, 0x00,
- 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00,
- 0x00, 0x00, 0x07, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00,
- 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x00,
- 0x58, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
- 0x05, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00, 0x33, 0x00,
- 0x00, 0x00, 0x05, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00,
- 0x34, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6e, 0x00, 0x75, 0x00, 0x6d, 0x00,
- 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x02, 0x02, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00,
- 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00, 0x6c, 0x00, 0x00, 0x00,
- 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
+ 0x1e, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x07, 0x00, 0x3c, 0x00,
+ 0x65, 0x00, 0x6d, 0x00, 0x70, 0x00, 0x74, 0x00, 0x79, 0x00, 0x3e, 0x00,
+ 0x00, 0x00, 0x04, 0x00, 0x61, 0x00, 0x74, 0x00, 0x74, 0x00, 0x72, 0x00,
+ 0x00, 0x00, 0x06, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00,
+ 0x6e, 0x00, 0x67, 0x00, 0x00, 0x00, 0x07, 0x00, 0x69, 0x00, 0x6e, 0x00,
+ 0x74, 0x00, 0x65, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x1c, 0x00, 0x58, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
+ 0x1c, 0x00, 0x00, 0x00, 0x05, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00,
+ 0x74, 0x00, 0x33, 0x00, 0x00, 0x00, 0x05, 0x00, 0x74, 0x00, 0x65, 0x00,
+ 0x73, 0x00, 0x74, 0x00, 0x34, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6e, 0x00,
+ 0x75, 0x00, 0x6d, 0x00, 0x62, 0x00, 0x65, 0x00, 0x72, 0x00, 0x33, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00,
+ 0x18, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00,
+ 0x6c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00,
+ 0x14, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00, 0x58, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
- 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03,
- 0x01, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00,
- 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x01, 0x02, 0x44, 0x00, 0x58, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
- 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10,
- 0xc8, 0x00, 0x00, 0x00
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x10, 0xc8, 0x00, 0x00, 0x00
};
-unsigned int feature_arsc_len = 832;
+unsigned int feature_arsc_len = 836;
diff --git a/libs/androidfw/tests/data/feature/res/values/values.xml b/libs/androidfw/tests/data/feature/res/values/values.xml
index d03445a..343fd6c 100644
--- a/libs/androidfw/tests/data/feature/res/values/values.xml
+++ b/libs/androidfw/tests/data/feature/res/values/values.xml
@@ -1,4 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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>
<string name="test3">test3</string>
<string name="test4">test4</string>
diff --git a/libs/androidfw/tests/data/lib/R.h b/libs/androidfw/tests/data/lib/R.h
index 13bf095..ff31120 100644
--- a/libs/androidfw/tests/data/lib/R.h
+++ b/libs/androidfw/tests/data/lib/R.h
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
#ifndef __LIB_R_H
#define __LIB_R_H
diff --git a/libs/androidfw/tests/data/lib/build b/libs/androidfw/tests/data/lib/build
index 8e6e70c..4102903 100755
--- a/libs/androidfw/tests/data/lib/build
+++ b/libs/androidfw/tests/data/lib/build
@@ -1,4 +1,19 @@
#!/bin/bash
+#
+# Copyright (C) 2014 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.
+#
aapt package -M AndroidManifest.xml -S res -F bundle.apk -f --shared-lib && \
unzip bundle.apk resources.arsc && \
diff --git a/libs/androidfw/tests/data/lib/lib_arsc.h b/libs/androidfw/tests/data/lib/lib_arsc.h
index d670c5b..dd3dad5 100644
--- a/libs/androidfw/tests/data/lib/lib_arsc.h
+++ b/libs/androidfw/tests/data/lib/lib_arsc.h
@@ -1,8 +1,8 @@
unsigned char lib_arsc[] = {
- 0x02, 0x00, 0x0c, 0x00, 0xc8, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x0c, 0x00, 0xb8, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x01, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x01, 0xa0, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x01, 0x90, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x2e, 0x00,
0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x69, 0x00,
0x64, 0x00, 0x2e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00,
@@ -37,48 +37,25 @@
0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x05, 0x00, 0x61, 0x00,
0x74, 0x00, 0x74, 0x00, 0x72, 0x00, 0x31, 0x00, 0x00, 0x00, 0x05, 0x00,
0x54, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x00, 0x00,
- 0x03, 0x02, 0x0c, 0x00, 0x10, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x2e, 0x00,
- 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x69, 0x00,
- 0x64, 0x00, 0x2e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x73, 0x00, 0x74, 0x00,
- 0x2e, 0x00, 0x62, 0x00, 0x61, 0x00, 0x73, 0x00, 0x69, 0x00, 0x63, 0x00,
+ 0x02, 0x02, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00,
+ 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x48, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00,
+ 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x48, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00,
- 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00, 0x64, 0x00, 0x00, 0x00,
- 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
- 0x08, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x02, 0x02, 0x10, 0x00,
- 0x14, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x44, 0x00, 0x64, 0x00, 0x00, 0x00,
- 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
- 0x08, 0x00, 0x00, 0x10, 0xbc, 0x02, 0x00, 0x00
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x10, 0xbc, 0x02, 0x00, 0x00
};
-unsigned int lib_arsc_len = 968;
+unsigned int lib_arsc_len = 696;
diff --git a/libs/androidfw/tests/data/lib/res/values/values.xml b/libs/androidfw/tests/data/lib/res/values/values.xml
index a77f0c7..3ec79b1 100644
--- a/libs/androidfw/tests/data/lib/res/values/values.xml
+++ b/libs/androidfw/tests/data/lib/res/values/values.xml
@@ -1,4 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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>
<attr name="attr1" format="integer" />
diff --git a/libs/androidfw/tests/data/overlay/build b/libs/androidfw/tests/data/overlay/build
index 87cf6de..f737677 100755
--- a/libs/androidfw/tests/data/overlay/build
+++ b/libs/androidfw/tests/data/overlay/build
@@ -1,4 +1,19 @@
#!/bin/bash
+#
+# Copyright (C) 2014 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.
+#
aapt package -M AndroidManifest.xml -S res -F bundle.apk -f && \
unzip bundle.apk resources.arsc && \
diff --git a/libs/androidfw/tests/data/overlay/res/values/values.xml b/libs/androidfw/tests/data/overlay/res/values/values.xml
index 227e889..3e1af98 100644
--- a/libs/androidfw/tests/data/overlay/res/values/values.xml
+++ b/libs/androidfw/tests/data/overlay/res/values/values.xml
@@ -1,4 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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>
<string name="test2">test2-overlay</string>
<integer-array name="integerArray1">
diff --git a/libs/androidfw/tests/data/system/R.h b/libs/androidfw/tests/data/system/R.h
index 7a9d3db..27f25fe 100644
--- a/libs/androidfw/tests/data/system/R.h
+++ b/libs/androidfw/tests/data/system/R.h
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
#ifndef __ANDROID_R_H
#define __ANDROID_R_H
diff --git a/libs/androidfw/tests/data/system/build b/libs/androidfw/tests/data/system/build
index 2a3ac0b..1a70e84 100755
--- a/libs/androidfw/tests/data/system/build
+++ b/libs/androidfw/tests/data/system/build
@@ -1,4 +1,19 @@
#!/bin/bash
+#
+# Copyright (C) 2014 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.
+#
aapt package -x -M AndroidManifest.xml -S res -F bundle.apk -f && \
unzip bundle.apk resources.arsc && \
diff --git a/libs/androidfw/tests/data/system/res/values/themes.xml b/libs/androidfw/tests/data/system/res/values/themes.xml
index b29848e..35d43c7 100644
--- a/libs/androidfw/tests/data/system/res/values/themes.xml
+++ b/libs/androidfw/tests/data/system/res/values/themes.xml
@@ -1,4 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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>
<public name="background" type="attr" id="0x01010000"/>
<public name="foreground" type="attr" id="0x01010001"/>
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index 70ff6e5..40cd13e 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -296,6 +296,9 @@
mStagingDisplayListData->children()[i]->mRenderNode->incParentRefCount();
}
}
+ // Damage with the old display list first then the new one to catch any
+ // changes in isRenderable or, in the future, bounds
+ damageSelf(info);
deleteDisplayListData();
mDisplayListData = mStagingDisplayListData;
mStagingDisplayListData = NULL;
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 3bb4778..9d2ae8b 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -42,7 +42,8 @@
: mRenderThread(thread)
, mEglManager(thread.eglManager())
, mEglSurface(EGL_NO_SURFACE)
- , mDirtyRegionsEnabled(false)
+ , mBufferPreserved(false)
+ , mSwapBehavior(kSwap_default)
, mOpaque(!translucent)
, mCanvas(NULL)
, mHaveNewSurface(false)
@@ -82,7 +83,8 @@
}
if (mEglSurface != EGL_NO_SURFACE) {
- mDirtyRegionsEnabled = mEglManager.enableDirtyRegions(mEglSurface);
+ const bool preserveBuffer = (mSwapBehavior != kSwap_discardBuffer);
+ mBufferPreserved = mEglManager.setPreserveBuffer(mEglSurface, preserveBuffer);
mHaveNewSurface = true;
makeCurrent();
} else {
@@ -103,6 +105,10 @@
makeCurrent();
}
+void CanvasContext::setSwapBehavior(SwapBehavior swapBehavior) {
+ mSwapBehavior = swapBehavior;
+}
+
bool CanvasContext::initialize(ANativeWindow* window) {
setSurface(window);
if (mCanvas) return false;
@@ -200,7 +206,7 @@
if (width != mCanvas->getViewportWidth() || height != mCanvas->getViewportHeight()) {
mCanvas->setViewport(width, height);
dirty.setEmpty();
- } else if (!mDirtyRegionsEnabled || mHaveNewSurface) {
+ } else if (!mBufferPreserved || mHaveNewSurface) {
dirty.setEmpty();
} else {
if (!dirty.isEmpty() && !dirty.intersect(0, 0, width, height)) {
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index d4282fa..e20564b 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -48,6 +48,11 @@
class EglManager;
+enum SwapBehavior {
+ kSwap_default,
+ kSwap_discardBuffer,
+};
+
// This per-renderer class manages the bridge between the global EGL context
// and the render surface.
// TODO: Rename to Renderer or some other per-window, top-level manager
@@ -57,6 +62,9 @@
IContextFactory* contextFactory);
virtual ~CanvasContext();
+ // Won't take effect until next EGLSurface creation
+ void setSwapBehavior(SwapBehavior swapBehavior);
+
bool initialize(ANativeWindow* window);
void updateSurface(ANativeWindow* window);
void pauseSurface(ANativeWindow* window);
@@ -111,7 +119,8 @@
EglManager& mEglManager;
sp<ANativeWindow> mNativeWindow;
EGLSurface mEglSurface;
- bool mDirtyRegionsEnabled;
+ bool mBufferPreserved;
+ SwapBehavior mSwapBehavior;
bool mOpaque;
OpenGLRenderer* mCanvas;
diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp
index a87834e..760fc15 100644
--- a/libs/hwui/renderthread/EglManager.cpp
+++ b/libs/hwui/renderthread/EglManager.cpp
@@ -70,12 +70,12 @@
, mEglConfig(0)
, mEglContext(EGL_NO_CONTEXT)
, mPBufferSurface(EGL_NO_SURFACE)
- , mRequestDirtyRegions(load_dirty_regions_property())
+ , mAllowPreserveBuffer(load_dirty_regions_property())
, mCurrentSurface(EGL_NO_SURFACE)
, mAtlasMap(NULL)
, mAtlasMapSize(0) {
- mCanSetDirtyRegions = mRequestDirtyRegions;
- ALOGD("Render dirty regions requested: %s", mRequestDirtyRegions ? "true" : "false");
+ mCanSetPreserveBuffer = mAllowPreserveBuffer;
+ ALOGD("Use EGL_SWAP_BEHAVIOR_PRESERVED: %s", mAllowPreserveBuffer ? "true" : "false");
}
void EglManager::initialize() {
@@ -113,7 +113,7 @@
}
void EglManager::loadConfig() {
- EGLint swapBehavior = mCanSetDirtyRegions ? EGL_SWAP_BEHAVIOR_PRESERVED_BIT : 0;
+ EGLint swapBehavior = mCanSetPreserveBuffer ? EGL_SWAP_BEHAVIOR_PRESERVED_BIT : 0;
EGLint attribs[] = {
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_RED_SIZE, 8,
@@ -131,10 +131,10 @@
if (!eglChooseConfig(mEglDisplay, attribs, &mEglConfig, num_configs, &num_configs)
|| num_configs != 1) {
// Failed to get a valid config
- if (mCanSetDirtyRegions) {
+ if (mCanSetPreserveBuffer) {
ALOGW("Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...");
// Try again without dirty regions enabled
- mCanSetDirtyRegions = false;
+ mCanSetPreserveBuffer = false;
loadConfig();
} else {
LOG_ALWAYS_FATAL("Failed to choose config, error = %s", egl_error_str());
@@ -273,25 +273,30 @@
return false;
}
-bool EglManager::enableDirtyRegions(EGLSurface surface) {
- if (!mRequestDirtyRegions) return false;
+bool EglManager::setPreserveBuffer(EGLSurface surface, bool preserve) {
+ if (CC_UNLIKELY(!mAllowPreserveBuffer)) return false;
- if (mCanSetDirtyRegions) {
- if (!eglSurfaceAttrib(mEglDisplay, surface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED)) {
+ bool preserved = false;
+ if (mCanSetPreserveBuffer) {
+ preserved = eglSurfaceAttrib(mEglDisplay, surface, EGL_SWAP_BEHAVIOR,
+ preserve ? EGL_BUFFER_PRESERVED : EGL_BUFFER_DESTROYED);
+ if (CC_UNLIKELY(!preserved)) {
ALOGW("Failed to set EGL_SWAP_BEHAVIOR on surface %p, error=%s",
(void*) surface, egl_error_str());
- return false;
}
- return true;
}
- // Perhaps it is already enabled?
- EGLint value;
- if (!eglQuerySurface(mEglDisplay, surface, EGL_SWAP_BEHAVIOR, &value)) {
- ALOGW("Failed to query EGL_SWAP_BEHAVIOR on surface %p, error=%p",
- (void*) surface, egl_error_str());
- return false;
+ if (CC_UNLIKELY(!preserved)) {
+ // Maybe it's already set?
+ EGLint swapBehavior;
+ if (eglQuerySurface(mEglDisplay, surface, EGL_SWAP_BEHAVIOR, &swapBehavior)) {
+ preserved = (swapBehavior == EGL_BUFFER_PRESERVED);
+ } else {
+ ALOGW("Failed to query EGL_SWAP_BEHAVIOR on surface %p, error=%p",
+ (void*) surface, egl_error_str());
+ }
}
- return value == EGL_BUFFER_PRESERVED;
+
+ return preserved;
}
} /* namespace renderthread */
diff --git a/libs/hwui/renderthread/EglManager.h b/libs/hwui/renderthread/EglManager.h
index 71213fb..ae03ea1 100644
--- a/libs/hwui/renderthread/EglManager.h
+++ b/libs/hwui/renderthread/EglManager.h
@@ -49,7 +49,8 @@
void beginFrame(EGLSurface surface, EGLint* width, EGLint* height);
bool swapBuffers(EGLSurface surface);
- bool enableDirtyRegions(EGLSurface surface);
+ // Returns true iff the surface is now preserving buffers.
+ bool setPreserveBuffer(EGLSurface surface, bool preserve);
void setTextureAtlas(const sp<GraphicBuffer>& buffer, int64_t* map, size_t mapSize);
@@ -71,8 +72,8 @@
EGLContext mEglContext;
EGLSurface mPBufferSurface;
- const bool mRequestDirtyRegions;
- bool mCanSetDirtyRegions;
+ const bool mAllowPreserveBuffer;
+ bool mCanSetPreserveBuffer;
EGLSurface mCurrentSurface;
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index 047819d..8f99b4e 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -103,6 +103,18 @@
post(task);
}
+CREATE_BRIDGE2(setSwapBehavior, CanvasContext* context, SwapBehavior swapBehavior) {
+ args->context->setSwapBehavior(args->swapBehavior);
+ return NULL;
+}
+
+void RenderProxy::setSwapBehavior(SwapBehavior swapBehavior) {
+ SETUP_TASK(setSwapBehavior);
+ args->context = mContext;
+ args->swapBehavior = swapBehavior;
+ post(task);
+}
+
CREATE_BRIDGE1(loadSystemProperties, CanvasContext* context) {
bool needsRedraw = false;
if (Caches::hasInstance()) {
diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h
index 678e7e2..dddf0c7 100644
--- a/libs/hwui/renderthread/RenderProxy.h
+++ b/libs/hwui/renderthread/RenderProxy.h
@@ -31,6 +31,7 @@
#include "../Caches.h"
#include "../IContextFactory.h"
+#include "CanvasContext.h"
#include "DrawFrameTask.h"
namespace android {
@@ -44,7 +45,6 @@
namespace renderthread {
-class CanvasContext;
class ErrorChannel;
class RenderThread;
class RenderProxyBridge;
@@ -63,6 +63,8 @@
ANDROID_API virtual ~RenderProxy();
ANDROID_API void setFrameInterval(nsecs_t frameIntervalNanos);
+ // Won't take effect until next EGLSurface creation
+ ANDROID_API void setSwapBehavior(SwapBehavior swapBehavior);
ANDROID_API bool loadSystemProperties();
ANDROID_API bool initialize(const sp<ANativeWindow>& window);
diff --git a/libs/hwui/renderthread/TimeLord.cpp b/libs/hwui/renderthread/TimeLord.cpp
index cf3d039..9bd4eae 100644
--- a/libs/hwui/renderthread/TimeLord.cpp
+++ b/libs/hwui/renderthread/TimeLord.cpp
@@ -20,7 +20,7 @@
namespace renderthread {
TimeLord::TimeLord()
- : mFrameIntervalNanos(0)
+ : mFrameIntervalNanos(milliseconds_to_nanoseconds(16))
, mFrameTimeNanos(0) {
}
diff --git a/libs/hwui/tests/main.cpp b/libs/hwui/tests/main.cpp
index 3e9a86f..2d99e9f 100644
--- a/libs/hwui/tests/main.cpp
+++ b/libs/hwui/tests/main.cpp
@@ -76,13 +76,14 @@
sp<Surface> surface = control->getSurface();
RenderNode* rootNode = new RenderNode();
+ rootNode->incStrong(0);
rootNode->mutateStagingProperties().setLeftTopRightBottom(0, 0, width, height);
rootNode->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y);
rootNode->mutateStagingProperties().setClipToBounds(false);
rootNode->setPropertyFieldsDirty(RenderNode::GENERIC);
- RenderProxy* proxy = new RenderProxy(false, rootNode, new ContextFactory());
- proxy->setFrameInterval(milliseconds_to_nanoseconds(16));
+ ContextFactory factory;
+ RenderProxy* proxy = new RenderProxy(false, rootNode, &factory);
proxy->loadSystemProperties();
proxy->initialize(surface);
float lightX = width / 2.0;
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 69c1142..c100df2 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -512,8 +512,11 @@
*/
public static final int RINGER_MODE_NORMAL = 2;
- // maximum valid ringer mode value. Values must start from 0 and be contiguous.
- private static final int RINGER_MODE_MAX = RINGER_MODE_NORMAL;
+ /**
+ * Maximum valid ringer mode value. Values must start from 0 and be contiguous.
+ * @hide
+ */
+ public static final int RINGER_MODE_MAX = RINGER_MODE_NORMAL;
/**
* Vibrate type that corresponds to the ringer.
@@ -887,7 +890,13 @@
if (ringerMode < 0 || ringerMode > RINGER_MODE_MAX) {
return false;
}
- return true;
+ IAudioService service = getService();
+ try {
+ return service.isValidRingerMode(ringerMode);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Dead object in isValidRingerMode", e);
+ return false;
+ }
}
/**
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index b0bf4a1..bbeeac0 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -843,7 +843,7 @@
int ringerMode = ringerModeFromSettings;
// sanity check in case the settings are restored from a device with incompatible
// ringer modes
- if (!AudioManager.isValidRingerMode(ringerMode)) {
+ if (!isValidRingerMode(ringerMode)) {
ringerMode = AudioManager.RINGER_MODE_NORMAL;
}
if ((ringerMode == AudioManager.RINGER_MODE_VIBRATE) && !mHasVibrator) {
@@ -1733,17 +1733,22 @@
}
private void ensureValidRingerMode(int ringerMode) {
- if (!AudioManager.isValidRingerMode(ringerMode)) {
+ if (!isValidRingerMode(ringerMode)) {
throw new IllegalArgumentException("Bad ringer mode " + ringerMode);
}
}
+ /** @see AudioManager#isValidRingerMode(int) */
+ public boolean isValidRingerMode(int ringerMode) {
+ return ringerMode >= 0 && ringerMode <= AudioManager.RINGER_MODE_MAX;
+ }
+
/** @see AudioManager#setRingerMode(int) */
public void setRingerMode(int ringerMode, boolean checkZen) {
if (mUseFixedVolume || isPlatformTelevision()) {
return;
}
-
+ ensureValidRingerMode(ringerMode);
if ((ringerMode == AudioManager.RINGER_MODE_VIBRATE) && !mHasVibrator) {
ringerMode = AudioManager.RINGER_MODE_SILENT;
}
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index 39b074e..2d8042c 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -80,6 +80,8 @@
int getRingerMode();
+ boolean isValidRingerMode(int ringerMode);
+
void setVibrateSetting(int vibrateType, int vibrateSetting);
int getVibrateSetting(int vibrateType);
diff --git a/media/java/android/media/RemoteControlClient.java b/media/java/android/media/RemoteControlClient.java
index 0336f11..1b6536f 100644
--- a/media/java/android/media/RemoteControlClient.java
+++ b/media/java/android/media/RemoteControlClient.java
@@ -535,6 +535,21 @@
return this;
}
+ @Override
+ public synchronized MetadataEditor putObject(int key, Object object)
+ throws IllegalArgumentException {
+ super.putObject(key, object);
+ if (mMetadataBuilder != null &&
+ (key == MediaMetadataEditor.RATING_KEY_BY_USER ||
+ key == MediaMetadataEditor.RATING_KEY_BY_OTHERS)) {
+ String metadataKey = MediaMetadata.getKeyFromMetadataEditorKey(key);
+ if (metadataKey != null) {
+ mMetadataBuilder.putRating(metadataKey, (Rating) object);
+ }
+ }
+ return this;
+ }
+
/**
* Clears all the metadata that has been set since the MetadataEditor instance was created
* (with {@link RemoteControlClient#editMetadata(boolean)}).
diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java
index ad018ad..86da80a 100644
--- a/media/java/android/media/session/MediaSession.java
+++ b/media/java/android/media/session/MediaSession.java
@@ -1157,6 +1157,7 @@
break;
case MSG_SKIP_TO_ITEM:
mCallback.onSkipToQueueItem((Long) msg.obj);
+ break;
case MSG_PAUSE:
mCallback.onPause();
break;
diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java
index b3890d4..691df77 100644
--- a/media/java/android/media/tv/TvContract.java
+++ b/media/java/android/media/tv/TvContract.java
@@ -1052,6 +1052,24 @@
/** The genre for Gaming. */
public static final String GAMING = "GAMING";
+ /** The genre for Arts. */
+ public static final String ARTS = "ARTS";
+
+ /** The genre for Entertainment. */
+ public static final String ENTERTAINMENT = "ENTERTAINMENT";
+
+ /** The genre for Life Style. */
+ public static final String LIFE_STYLE = "LIFE_STYLE";
+
+ /** The genre for Music. */
+ public static final String MUSIC = "MUSIC";
+
+ /** The genre for Premier. */
+ public static final String PREMIER = "PREMIER";
+
+ /** The genre for Tech/Science. */
+ public static final String TECH_SCIENCE = "TECH_SCIENCE";
+
private static final ArraySet<String> CANONICAL_GENRES = new ArraySet<String>();
static {
CANONICAL_GENRES.add(FAMILY_KIDS);
@@ -1065,6 +1083,12 @@
CANONICAL_GENRES.add(ANIMAL_WILDLIFE);
CANONICAL_GENRES.add(NEWS);
CANONICAL_GENRES.add(GAMING);
+ CANONICAL_GENRES.add(ARTS);
+ CANONICAL_GENRES.add(ENTERTAINMENT);
+ CANONICAL_GENRES.add(LIFE_STYLE);
+ CANONICAL_GENRES.add(MUSIC);
+ CANONICAL_GENRES.add(PREMIER);
+ CANONICAL_GENRES.add(TECH_SCIENCE);
}
private Genres() {}
diff --git a/media/java/android/media/tv/TvInputInfo.java b/media/java/android/media/tv/TvInputInfo.java
index 54ebc6a..b9e99d2 100644
--- a/media/java/android/media/tv/TvInputInfo.java
+++ b/media/java/android/media/tv/TvInputInfo.java
@@ -241,6 +241,9 @@
if (DEBUG) {
Log.d(TAG, "Setup activity loaded. [" + input.mSetupActivity + "] for " + si.name);
}
+ if (inputType == TYPE_TUNER && TextUtils.isEmpty(input.mSetupActivity)) {
+ throw new XmlPullParserException("Setup activity not found in " + si.name);
+ }
input.mSettingsActivity = sa.getString(
com.android.internal.R.styleable.TvInputService_settingsActivity);
if (DEBUG) {
diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java
index 78714d2..51bd205 100644
--- a/media/java/android/media/tv/TvInputManager.java
+++ b/media/java/android/media/tv/TvInputManager.java
@@ -159,12 +159,12 @@
private final Object mLock = new Object();
- // @GuardedBy(mLock)
+ // @GuardedBy("mLock")
private final List<TvInputCallbackRecord> mCallbackRecords =
new LinkedList<TvInputCallbackRecord>();
// A mapping from TV input ID to the state of corresponding input.
- // @GuardedBy(mLock)
+ // @GuardedBy("mLock")
private final Map<String, Integer> mStateMap = new ArrayMap<String, Integer>();
// A mapping from the sequence number of a session to its SessionCallbackRecord.
@@ -207,7 +207,7 @@
/**
* This is called when the channel of this session is changed by the underlying TV input
- * with out any {@link TvInputManager.Session#tune(Uri)} request.
+ * without any {@link TvInputManager.Session#tune(Uri)} request.
*
* @param session A {@link TvInputManager.Session} associated with this callback.
* @param channelUri The URI of a channel.
@@ -227,7 +227,7 @@
/**
* This is called when a track for a given type is selected.
*
- * @param session A {@link TvInputManager.Session} associated with this callback
+ * @param session A {@link TvInputManager.Session} associated with this callback.
* @param type The type of the selected track. The type can be
* {@link TvTrackInfo#TYPE_AUDIO}, {@link TvTrackInfo#TYPE_VIDEO} or
* {@link TvTrackInfo#TYPE_SUBTITLE}.
@@ -238,6 +238,18 @@
}
/**
+ * This is invoked when the video size has been changed. It is also called when the first
+ * time video size information becomes available after the session is tuned to a specific
+ * channel.
+ *
+ * @param session A {@link TvInputManager.Session} associated with this callback.
+ * @param width The width of the video.
+ * @param height The height of the video.
+ */
+ public void onVideoSizeChanged(Session session, int width, int height) {
+ }
+
+ /**
* This is called when the video is available, so the TV input starts the playback.
*
* @param session A {@link TvInputManager.Session} associated with this callback.
@@ -312,13 +324,13 @@
private final Handler mHandler;
private Session mSession;
- public SessionCallbackRecord(SessionCallback sessionCallback,
+ SessionCallbackRecord(SessionCallback sessionCallback,
Handler handler) {
mSessionCallback = sessionCallback;
mHandler = handler;
}
- public void postSessionCreated(final Session session) {
+ void postSessionCreated(final Session session) {
mSession = session;
mHandler.post(new Runnable() {
@Override
@@ -328,7 +340,7 @@
});
}
- public void postSessionReleased() {
+ void postSessionReleased() {
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -337,7 +349,7 @@
});
}
- public void postChannelRetuned(final Uri channelUri) {
+ void postChannelRetuned(final Uri channelUri) {
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -346,49 +358,34 @@
});
}
- public void postTracksChanged(final List<TvTrackInfo> tracks) {
+ void postTracksChanged(final List<TvTrackInfo> tracks) {
mHandler.post(new Runnable() {
@Override
public void run() {
- mSession.mAudioTracks.clear();
- mSession.mVideoTracks.clear();
- mSession.mSubtitleTracks.clear();
- for (TvTrackInfo track : tracks) {
- if (track.getType() == TvTrackInfo.TYPE_AUDIO) {
- mSession.mAudioTracks.add(track);
- } else if (track.getType() == TvTrackInfo.TYPE_VIDEO) {
- mSession.mVideoTracks.add(track);
- } else if (track.getType() == TvTrackInfo.TYPE_SUBTITLE) {
- mSession.mSubtitleTracks.add(track);
- } else {
- // Silently ignore.
- }
- }
mSessionCallback.onTracksChanged(mSession, tracks);
}
});
}
- public void postTrackSelected(final int type, final String trackId) {
+ void postTrackSelected(final int type, final String trackId) {
mHandler.post(new Runnable() {
@Override
public void run() {
- if (type == TvTrackInfo.TYPE_AUDIO) {
- mSession.mSelectedAudioTrackId = trackId;
- } else if (type == TvTrackInfo.TYPE_VIDEO) {
- mSession.mSelectedVideoTrackId = trackId;
- } else if (type == TvTrackInfo.TYPE_SUBTITLE) {
- mSession.mSelectedSubtitleTrackId = trackId;
- } else {
- // Silently ignore.
- return;
- }
mSessionCallback.onTrackSelected(mSession, type, trackId);
}
});
}
- public void postVideoAvailable() {
+ void postVideoSizeChanged(final int width, final int height) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mSessionCallback.onVideoSizeChanged(mSession, width, height);
+ }
+ });
+ }
+
+ void postVideoAvailable() {
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -397,7 +394,7 @@
});
}
- public void postVideoUnavailable(final int reason) {
+ void postVideoUnavailable(final int reason) {
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -406,7 +403,7 @@
});
}
- public void postContentAllowed() {
+ void postContentAllowed() {
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -415,7 +412,7 @@
});
}
- public void postContentBlocked(final TvContentRating rating) {
+ void postContentBlocked(final TvContentRating rating) {
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -424,7 +421,7 @@
});
}
- public void postLayoutSurface(final int left, final int top, final int right,
+ void postLayoutSurface(final int left, final int top, final int right,
final int bottom) {
mHandler.post(new Runnable() {
@Override
@@ -434,7 +431,7 @@
});
}
- public void postSessionEvent(final String eventType, final Bundle eventArgs) {
+ void postSessionEvent(final String eventType, final Bundle eventArgs) {
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -610,7 +607,10 @@
Log.e(TAG, "Callback not found for seq " + seq);
return;
}
- record.postTracksChanged(tracks);
+ if (record.mSession.updateTracks(tracks)) {
+ record.postTracksChanged(tracks);
+ postVideoSizeChangedIfNeededLocked(record);
+ }
}
}
@@ -622,7 +622,17 @@
Log.e(TAG, "Callback not found for seq " + seq);
return;
}
- record.postTrackSelected(type, trackId);
+ if (record.mSession.updateTrackSelection(type, trackId)) {
+ record.postTrackSelected(type, trackId);
+ postVideoSizeChangedIfNeededLocked(record);
+ }
+ }
+ }
+
+ private void postVideoSizeChangedIfNeededLocked(SessionCallbackRecord record) {
+ TvTrackInfo track = record.mSession.getVideoTrackToNotify();
+ if (track != null) {
+ record.postVideoSizeChanged(track.getVideoWidth(), track.getVideoHeight());
}
}
@@ -778,7 +788,7 @@
}
/**
- * Returns the state of a given TV input. It retuns one of the following:
+ * Returns the state of a given TV input. It returns one of the following:
* <ul>
* <li>{@link #INPUT_STATE_CONNECTED}
* <li>{@link #INPUT_STATE_CONNECTED_STANDBY}
@@ -1133,12 +1143,24 @@
private IBinder mToken;
private TvInputEventSender mSender;
private InputChannel mChannel;
+
+ private final Object mTrackLock = new Object();
+ // @GuardedBy("mTrackLock")
private final List<TvTrackInfo> mAudioTracks = new ArrayList<TvTrackInfo>();
+ // @GuardedBy("mTrackLock")
private final List<TvTrackInfo> mVideoTracks = new ArrayList<TvTrackInfo>();
+ // @GuardedBy("mTrackLock")
private final List<TvTrackInfo> mSubtitleTracks = new ArrayList<TvTrackInfo>();
+ // @GuardedBy("mTrackLock")
private String mSelectedAudioTrackId;
+ // @GuardedBy("mTrackLock")
private String mSelectedVideoTrackId;
+ // @GuardedBy("mTrackLock")
private String mSelectedSubtitleTrackId;
+ // @GuardedBy("mTrackLock")
+ private int mVideoWidth;
+ // @GuardedBy("mTrackLock")
+ private int mVideoHeight;
private Session(IBinder token, InputChannel channel, ITvInputManager service, int userId,
int seq, SparseArray<SessionCallbackRecord> sessionCallbackRecordMap) {
@@ -1273,12 +1295,16 @@
Log.w(TAG, "The session has been already released");
return;
}
- mAudioTracks.clear();
- mVideoTracks.clear();
- mSubtitleTracks.clear();
- mSelectedAudioTrackId = null;
- mSelectedVideoTrackId = null;
- mSelectedSubtitleTrackId = null;
+ synchronized (mTrackLock) {
+ mAudioTracks.clear();
+ mVideoTracks.clear();
+ mSubtitleTracks.clear();
+ mSelectedAudioTrackId = null;
+ mSelectedVideoTrackId = null;
+ mSelectedSubtitleTrackId = null;
+ mVideoWidth = 0;
+ mVideoHeight = 0;
+ }
try {
mService.tune(mToken, channelUri, params, mUserId);
} catch (RemoteException e) {
@@ -1314,23 +1340,25 @@
* @see #getTracks
*/
public void selectTrack(int type, String trackId) {
- if (type == TvTrackInfo.TYPE_AUDIO) {
- if (trackId != null && !containsTrack(mAudioTracks, trackId)) {
- Log.w(TAG, "Invalid audio trackId: " + trackId);
- return;
+ synchronized (mTrackLock) {
+ if (type == TvTrackInfo.TYPE_AUDIO) {
+ if (trackId != null && !containsTrack(mAudioTracks, trackId)) {
+ Log.w(TAG, "Invalid audio trackId: " + trackId);
+ return;
+ }
+ } else if (type == TvTrackInfo.TYPE_VIDEO) {
+ if (trackId != null && !containsTrack(mVideoTracks, trackId)) {
+ Log.w(TAG, "Invalid video trackId: " + trackId);
+ return;
+ }
+ } else if (type == TvTrackInfo.TYPE_SUBTITLE) {
+ if (trackId != null && !containsTrack(mSubtitleTracks, trackId)) {
+ Log.w(TAG, "Invalid subtitle trackId: " + trackId);
+ return;
+ }
+ } else {
+ throw new IllegalArgumentException("invalid type: " + type);
}
- } else if (type == TvTrackInfo.TYPE_VIDEO) {
- if (trackId != null && !containsTrack(mVideoTracks, trackId)) {
- Log.w(TAG, "Invalid video trackId: " + trackId);
- return;
- }
- } else if (type == TvTrackInfo.TYPE_SUBTITLE) {
- if (trackId != null && !containsTrack(mSubtitleTracks, trackId)) {
- Log.w(TAG, "Invalid subtitle trackId: " + trackId);
- return;
- }
- } else {
- throw new IllegalArgumentException("invalid type: " + type);
}
if (mToken == null) {
Log.w(TAG, "The session has been already released");
@@ -1361,21 +1389,23 @@
* @return the list of tracks for the given type.
*/
public List<TvTrackInfo> getTracks(int type) {
- if (type == TvTrackInfo.TYPE_AUDIO) {
- if (mAudioTracks == null) {
- return null;
+ synchronized (mTrackLock) {
+ if (type == TvTrackInfo.TYPE_AUDIO) {
+ if (mAudioTracks == null) {
+ return null;
+ }
+ return new ArrayList<TvTrackInfo>(mAudioTracks);
+ } else if (type == TvTrackInfo.TYPE_VIDEO) {
+ if (mVideoTracks == null) {
+ return null;
+ }
+ return new ArrayList<TvTrackInfo>(mVideoTracks);
+ } else if (type == TvTrackInfo.TYPE_SUBTITLE) {
+ if (mSubtitleTracks == null) {
+ return null;
+ }
+ return new ArrayList<TvTrackInfo>(mSubtitleTracks);
}
- return mAudioTracks;
- } else if (type == TvTrackInfo.TYPE_VIDEO) {
- if (mVideoTracks == null) {
- return null;
- }
- return mVideoTracks;
- } else if (type == TvTrackInfo.TYPE_SUBTITLE) {
- if (mSubtitleTracks == null) {
- return null;
- }
- return mSubtitleTracks;
}
throw new IllegalArgumentException("invalid type: " + type);
}
@@ -1388,17 +1418,89 @@
* @see #selectTrack
*/
public String getSelectedTrack(int type) {
- if (type == TvTrackInfo.TYPE_AUDIO) {
- return mSelectedAudioTrackId;
- } else if (type == TvTrackInfo.TYPE_VIDEO) {
- return mSelectedVideoTrackId;
- } else if (type == TvTrackInfo.TYPE_SUBTITLE) {
- return mSelectedSubtitleTrackId;
+ synchronized (mTrackLock) {
+ if (type == TvTrackInfo.TYPE_AUDIO) {
+ return mSelectedAudioTrackId;
+ } else if (type == TvTrackInfo.TYPE_VIDEO) {
+ return mSelectedVideoTrackId;
+ } else if (type == TvTrackInfo.TYPE_SUBTITLE) {
+ return mSelectedSubtitleTrackId;
+ }
}
throw new IllegalArgumentException("invalid type: " + type);
}
/**
+ * Responds to onTracksChanged() and updates the internal track information. Returns true if
+ * there is an update.
+ */
+ boolean updateTracks(List<TvTrackInfo> tracks) {
+ synchronized (mTrackLock) {
+ mAudioTracks.clear();
+ mVideoTracks.clear();
+ mSubtitleTracks.clear();
+ for (TvTrackInfo track : tracks) {
+ if (track.getType() == TvTrackInfo.TYPE_AUDIO) {
+ mAudioTracks.add(track);
+ } else if (track.getType() == TvTrackInfo.TYPE_VIDEO) {
+ mVideoTracks.add(track);
+ } else if (track.getType() == TvTrackInfo.TYPE_SUBTITLE) {
+ mSubtitleTracks.add(track);
+ }
+ }
+ return !mAudioTracks.isEmpty() || !mVideoTracks.isEmpty()
+ || !mSubtitleTracks.isEmpty();
+ }
+ }
+
+ /**
+ * Responds to onTrackSelected() and updates the internal track selection information.
+ * Returns true if there is an update.
+ */
+ boolean updateTrackSelection(int type, String trackId) {
+ synchronized (mTrackLock) {
+ if (type == TvTrackInfo.TYPE_AUDIO && trackId != mSelectedAudioTrackId) {
+ mSelectedAudioTrackId = trackId;
+ return true;
+ } else if (type == TvTrackInfo.TYPE_VIDEO && trackId != mSelectedVideoTrackId) {
+ mSelectedVideoTrackId = trackId;
+ return true;
+ } else if (type == TvTrackInfo.TYPE_SUBTITLE
+ && trackId != mSelectedSubtitleTrackId) {
+ mSelectedSubtitleTrackId = trackId;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns the new/updated video track that contains new video size information. Returns
+ * null if there is no video track to notify. Subsequent calls of this method results in a
+ * non-null video track returned only by the first call and null returned by following
+ * calls. The caller should immediately notify of the video size change upon receiving the
+ * track.
+ */
+ TvTrackInfo getVideoTrackToNotify() {
+ synchronized (mTrackLock) {
+ if (!mVideoTracks.isEmpty() && mSelectedVideoTrackId != null) {
+ for (TvTrackInfo track : mVideoTracks) {
+ if (track.getId().equals(mSelectedVideoTrackId)) {
+ int videoWidth = track.getVideoWidth();
+ int videoHeight = track.getVideoHeight();
+ if (mVideoWidth != videoWidth || mVideoHeight != videoHeight) {
+ mVideoWidth = videoWidth;
+ mVideoHeight = videoHeight;
+ return track;
+ }
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
* Calls {@link TvInputService.Session#appPrivateCommand(String, Bundle)
* TvInputService.Session.appPrivateCommand()} on the current TvView.
*
diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java
index 4f8facb..5d5ea02 100644
--- a/media/java/android/media/tv/TvInputService.java
+++ b/media/java/android/media/tv/TvInputService.java
@@ -332,8 +332,13 @@
}
/**
- * Sends the change on the track information. This is expected to be called whenever a track
- * is added/removed and the metadata of a track is modified.
+ * Sends the list of all audio/video/subtitle tracks. The is used by the framework to
+ * maintain the track information for a given session, which in turn is used by
+ * {@link TvView#getTracks} for the application to retrieve metadata for a given track type.
+ * The TV input service must call this method as soon as the track information becomes
+ * available or is updated. Note that in a case where a part of the information for a
+ * certain track is updated, it is not necessary to create a new {@link TvTrackInfo} object
+ * with a different track ID.
*
* @param tracks A list which includes track information.
* @throws IllegalArgumentException if {@code tracks} contains redundant tracks.
@@ -364,8 +369,12 @@
}
/**
- * Sends the ID of the selected track for a given track type. This is expected to be called
- * whenever there is a change on track selection.
+ * Sends the type and ID of a selected track. This is used to inform the application that a
+ * specific track is selected. The TV input service must call this method as soon as a track
+ * is selected either by default or in response to a call to {@link #onSelectTrack}. The
+ * selected track ID for a given type is maintained in the framework until the next call to
+ * this method even after the entire track list is updated (but is reset when the session is
+ * tuned to a new channel), so care must be taken not to result in an obsolete track ID.
*
* @param type The type of the selected track. The type can be
* {@link TvTrackInfo#TYPE_AUDIO}, {@link TvTrackInfo#TYPE_VIDEO} or
@@ -1067,9 +1076,19 @@
/**
* Base class for a TV input session which represents an external device connected to a
- * hardware TV input. Once TV input returns an implementation of this class on
- * {@link #onCreateSession(String)}, the framework will create a hardware session and forward
- * the application's surface to the hardware TV input.
+ * hardware TV input.
+ * <p>
+ * This class is for an input which provides channels for the external set-top box to the
+ * application. Once a TV input returns an implementation of this class on
+ * {@link #onCreateSession(String)}, the framework will create a separate session for
+ * a hardware TV Input (e.g. HDMI 1) and forward the application's surface to the session so
+ * that the user can see the screen of the hardware TV Input when she tunes to a channel from
+ * this TV input. The implementation of this class is expected to change the channel of the
+ * external set-top box via a proprietary protocol when {@link HardwareSession#onTune(Uri)} is
+ * requested by the application.
+ * </p><p>
+ * Note that this class is not for inputs for internal hardware like built-in tuner and HDMI 1.
+ * </p>
* @see #onCreateSession(String)
*/
public abstract static class HardwareSession extends Session {
diff --git a/media/java/android/media/tv/TvStreamConfig.java b/media/java/android/media/tv/TvStreamConfig.java
index a7e7e44..1bdc63e 100644
--- a/media/java/android/media/tv/TvStreamConfig.java
+++ b/media/java/android/media/tv/TvStreamConfig.java
@@ -33,7 +33,6 @@
private int mStreamId;
private int mType;
- // TODO: Revisit if max widht/height really make sense.
private int mMaxWidth;
private int mMaxHeight;
/**
@@ -166,4 +165,17 @@
return config;
}
}
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null) return false;
+ if (!(obj instanceof TvStreamConfig)) return false;
+
+ TvStreamConfig config = (TvStreamConfig) obj;
+ return config.mGeneration == mGeneration
+ && config.mStreamId == mStreamId
+ && config.mType == mType
+ && config.mMaxWidth == mMaxWidth
+ && config.mMaxHeight == mMaxHeight;
+ }
}
diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java
index 0949b1a..f9d84c1 100644
--- a/media/java/android/media/tv/TvView.java
+++ b/media/java/android/media/tv/TvView.java
@@ -59,8 +59,6 @@
private static final String TAG = "TvView";
private static final boolean DEBUG = false;
- private static final int VIDEO_SIZE_VALUE_UNKNOWN = 0;
-
private static final int ZORDER_MEDIA = 0;
private static final int ZORDER_MEDIA_OVERLAY = 1;
private static final int ZORDER_ON_TOP = 2;
@@ -69,7 +67,7 @@
private static final int CAPTION_ENABLED = 1;
private static final int CAPTION_DISABLED = 2;
- private static final WeakReference<TvView> NULL_TV_VIEW = new WeakReference(null);
+ private static final WeakReference<TvView> NULL_TV_VIEW = new WeakReference<>(null);
private static final Object sMainTvViewLock = new Object();
private static WeakReference<TvView> sMainTvView = NULL_TV_VIEW;
@@ -86,8 +84,10 @@
private OnUnhandledInputEventListener mOnUnhandledInputEventListener;
private boolean mHasStreamVolume;
private float mStreamVolume;
- private int mVideoWidth = VIDEO_SIZE_VALUE_UNKNOWN;
- private int mVideoHeight = VIDEO_SIZE_VALUE_UNKNOWN;
+ private int mCaptionEnabled;
+ private String mAppPrivateCommandAction;
+ private Bundle mAppPrivateCommandData;
+
private boolean mSurfaceChanged;
private int mSurfaceFormat;
private int mSurfaceWidth;
@@ -100,7 +100,6 @@
private int mSurfaceViewRight;
private int mSurfaceViewTop;
private int mSurfaceViewBottom;
- private int mCaptionEnabled;
private final SurfaceHolder.Callback mSurfaceHolderCallback = new SurfaceHolder.Callback() {
@Override
@@ -197,7 +196,7 @@
@SystemApi
public void setMain() {
synchronized (sMainTvViewLock) {
- sMainTvView = new WeakReference(this);
+ sMainTvView = new WeakReference<>(this);
if (hasWindowFocus() && mSession != null) {
mSession.setMain();
}
@@ -291,7 +290,7 @@
}
synchronized (sMainTvViewLock) {
if (sMainTvView.get() == null) {
- sMainTvView = new WeakReference(this);
+ sMainTvView = new WeakReference<>(this);
}
}
if (mSessionCallback != null && mSessionCallback.mInputId.equals(inputId)) {
@@ -421,10 +420,10 @@
* Calls {@link TvInputService.Session#appPrivateCommand(String, Bundle)
* TvInputService.Session.appPrivateCommand()} on the current TvView.
*
- * @param action Name of the command to be performed. This <em>must</em> be a scoped name, i.e.
- * prefixed with a package name you own, so that different developers will not create
- * conflicting commands.
- * @param data Any data to include with the command.
+ * @param action The name of the private command to send. This <em>must</em> be a scoped name,
+ * i.e. prefixed with a package name you own, so that different developers will not
+ * create conflicting commands.
+ * @param data An optional bundle to send with the command.
* @hide
*/
@SystemApi
@@ -434,6 +433,13 @@
}
if (mSession != null) {
mSession.sendAppPrivateCommand(action, data);
+ } else {
+ Log.w(TAG, "sendAppPrivateCommand - session not created (action " + action + " cached)");
+ if (mAppPrivateCommandAction != null) {
+ Log.w(TAG, "previous cached action " + action + " removed");
+ }
+ mAppPrivateCommandAction = action;
+ mAppPrivateCommandData = data;
}
}
@@ -619,6 +625,9 @@
}
private void release() {
+ mAppPrivateCommandAction = null;
+ mAppPrivateCommandData = null;
+
setSessionSurface(null);
removeSessionOverlayView();
mUseRequestedSurfaceLayout = false;
@@ -703,19 +712,8 @@
}
/**
- * This is invoked when the view is tuned to a specific channel and starts decoding video
- * stream from there. It is also called later when the video size is changed.
- *
- * @param inputId The ID of the TV input bound to this view.
- * @param width The width of the video.
- * @param height The height of the video.
- */
- public void onVideoSizeChanged(String inputId, int width, int height) {
- }
-
- /**
* This is invoked when the channel of this TvView is changed by the underlying TV input
- * with out any {@link TvView#tune(String, Uri)} request.
+ * without any {@link TvView#tune(String, Uri)} request.
*
* @param inputId The ID of the TV input bound to this view.
* @param channelUri The URI of a channel.
@@ -745,6 +743,18 @@
}
/**
+ * This is invoked when the video size has been changed. It is also called when the first
+ * time video size information becomes available after this view is tuned to a specific
+ * channel.
+ *
+ * @param inputId The ID of the TV input bound to this view.
+ * @param width The width of the video.
+ * @param height The height of the video.
+ */
+ public void onVideoSizeChanged(String inputId, int width, int height) {
+ }
+
+ /**
* This is called when the video is available, so the TV input starts the playback.
*
* @param inputId The ID of the TV input bound to this view.
@@ -828,16 +838,17 @@
@Override
public void onSessionCreated(Session session) {
+ if (DEBUG) {
+ Log.d(TAG, "onSessionCreated()");
+ }
if (this != mSessionCallback) {
+ Log.w(TAG, "onSessionCreated - session already created");
// This callback is obsolete.
if (session != null) {
session.release();
}
return;
}
- if (DEBUG) {
- Log.d(TAG, "onSessionCreated()");
- }
mSession = session;
if (session != null) {
synchronized (sMainTvViewLock) {
@@ -862,6 +873,12 @@
if (mHasStreamVolume) {
mSession.setStreamVolume(mStreamVolume);
}
+ if (mAppPrivateCommandAction != null) {
+ mSession.sendAppPrivateCommand(
+ mAppPrivateCommandAction, mAppPrivateCommandData);
+ mAppPrivateCommandAction = null;
+ mAppPrivateCommandData = null;
+ }
} else {
mSessionCallback = null;
if (mCallback != null) {
@@ -872,7 +889,11 @@
@Override
public void onSessionReleased(Session session) {
+ if (DEBUG) {
+ Log.d(TAG, "onSessionReleased()");
+ }
if (this != mSessionCallback) {
+ Log.w(TAG, "onSessionReleased - session not created");
return;
}
mOverlayViewCreated = false;
@@ -886,12 +907,13 @@
@Override
public void onChannelRetuned(Session session, Uri channelUri) {
- if (this != mSessionCallback) {
- return;
- }
if (DEBUG) {
Log.d(TAG, "onChannelChangedByTvInput(" + channelUri + ")");
}
+ if (this != mSessionCallback) {
+ Log.w(TAG, "onChannelRetuned - session not created");
+ return;
+ }
if (mCallback != null) {
mCallback.onChannelRetuned(mInputId, channelUri);
}
@@ -899,11 +921,12 @@
@Override
public void onTracksChanged(Session session, List<TvTrackInfo> tracks) {
- if (this != mSessionCallback) {
- return;
- }
if (DEBUG) {
- Log.d(TAG, "onTracksChanged()");
+ Log.d(TAG, "onTracksChanged(" + tracks + ")");
+ }
+ if (this != mSessionCallback) {
+ Log.w(TAG, "onTracksChanged - session not created");
+ return;
}
if (mCallback != null) {
mCallback.onTracksChanged(mInputId, tracks);
@@ -912,26 +935,41 @@
@Override
public void onTrackSelected(Session session, int type, String trackId) {
+ if (DEBUG) {
+ Log.d(TAG, "onTrackSelected(type=" + type + ", trackId=" + trackId + ")");
+ }
if (this != mSessionCallback) {
+ Log.w(TAG, "onTrackSelected - session not created");
return;
}
- if (DEBUG) {
- Log.d(TAG, "onTrackSelected()");
- }
- // TODO: Update the video size when the type is TYPE_VIDEO.
if (mCallback != null) {
mCallback.onTrackSelected(mInputId, type, trackId);
}
}
@Override
- public void onVideoAvailable(Session session) {
+ public void onVideoSizeChanged(Session session, int width, int height) {
+ if (DEBUG) {
+ Log.d(TAG, "onVideoSizeChanged()");
+ }
if (this != mSessionCallback) {
+ Log.w(TAG, "onVideoSizeChanged - session not created");
return;
}
+ if (mCallback != null) {
+ mCallback.onVideoSizeChanged(mInputId, width, height);
+ }
+ }
+
+ @Override
+ public void onVideoAvailable(Session session) {
if (DEBUG) {
Log.d(TAG, "onVideoAvailable()");
}
+ if (this != mSessionCallback) {
+ Log.w(TAG, "onVideoAvailable - session not created");
+ return;
+ }
if (mCallback != null) {
mCallback.onVideoAvailable(mInputId);
}
@@ -939,11 +977,12 @@
@Override
public void onVideoUnavailable(Session session, int reason) {
- if (this != mSessionCallback) {
- return;
- }
if (DEBUG) {
- Log.d(TAG, "onVideoUnavailable(" + reason + ")");
+ Log.d(TAG, "onVideoUnavailable(reason=" + reason + ")");
+ }
+ if (this != mSessionCallback) {
+ Log.w(TAG, "onVideoUnavailable - session not created");
+ return;
}
if (mCallback != null) {
mCallback.onVideoUnavailable(mInputId, reason);
@@ -952,12 +991,13 @@
@Override
public void onContentAllowed(Session session) {
- if (this != mSessionCallback) {
- return;
- }
if (DEBUG) {
Log.d(TAG, "onContentAllowed()");
}
+ if (this != mSessionCallback) {
+ Log.w(TAG, "onContentAllowed - session not created");
+ return;
+ }
if (mCallback != null) {
mCallback.onContentAllowed(mInputId);
}
@@ -965,11 +1005,12 @@
@Override
public void onContentBlocked(Session session, TvContentRating rating) {
- if (this != mSessionCallback) {
- return;
- }
if (DEBUG) {
- Log.d(TAG, "onContentBlocked()");
+ Log.d(TAG, "onContentBlocked(rating=" + rating + ")");
+ }
+ if (this != mSessionCallback) {
+ Log.w(TAG, "onContentBlocked - session not created");
+ return;
}
if (mCallback != null) {
mCallback.onContentBlocked(mInputId, rating);
@@ -978,13 +1019,14 @@
@Override
public void onLayoutSurface(Session session, int left, int top, int right, int bottom) {
- if (this != mSessionCallback) {
- return;
- }
if (DEBUG) {
Log.d(TAG, "onLayoutSurface (left=" + left + ", top=" + top + ", right="
+ right + ", bottom=" + bottom + ",)");
}
+ if (this != mSessionCallback) {
+ Log.w(TAG, "onLayoutSurface - session not created");
+ return;
+ }
mSurfaceViewLeft = left;
mSurfaceViewTop = top;
mSurfaceViewRight = right;
@@ -995,12 +1037,13 @@
@Override
public void onSessionEvent(Session session, String eventType, Bundle eventArgs) {
- if (this != mSessionCallback) {
- return;
- }
if (DEBUG) {
Log.d(TAG, "onSessionEvent(" + eventType + ")");
}
+ if (this != mSessionCallback) {
+ Log.w(TAG, "onSessionEvent - session not created");
+ return;
+ }
if (mCallback != null) {
mCallback.onEvent(mInputId, eventType, eventArgs);
}
diff --git a/media/jni/android_media_MediaRecorder.cpp b/media/jni/android_media_MediaRecorder.cpp
index 5646740..3b1b1d7 100644
--- a/media/jni/android_media_MediaRecorder.cpp
+++ b/media/jni/android_media_MediaRecorder.cpp
@@ -182,7 +182,8 @@
android_media_MediaRecorder_setAudioSource(JNIEnv *env, jobject thiz, jint as)
{
ALOGV("setAudioSource(%d)", as);
- if (as < AUDIO_SOURCE_DEFAULT || as >= AUDIO_SOURCE_CNT) {
+ if (as < AUDIO_SOURCE_DEFAULT ||
+ (as >= AUDIO_SOURCE_CNT && as != AUDIO_SOURCE_FM_TUNER)) {
jniThrowException(env, "java/lang/IllegalArgumentException", "Invalid audio source");
return;
}
diff --git a/media/tests/omxjpegdecoder/Android.mk b/media/tests/omxjpegdecoder/Android.mk
deleted file mode 100644
index b0bc5d4..0000000
--- a/media/tests/omxjpegdecoder/Android.mk
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright (C) 2009 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := \
- omx_jpeg_decoder.cpp \
- jpeg_decoder_bench.cpp \
- StreamSource.cpp
-
-LOCAL_SHARED_LIBRARIES := \
- libcutils \
- libskia \
- libstagefright \
- libstagefright_foundation \
- libbinder \
- libutils \
- liblog \
- libjpeg
-
-LOCAL_C_INCLUDES := \
- $(TOP)/external/jpeg \
- $(TOP)/frameworks/base/media/libstagefright \
- $(TOP)/frameworks/base/include/ \
- $(TOP)/frameworks/base/ \
- $(TOP)/frameworks/native/include/media/openmax
-
-LOCAL_MODULE := jpeg_bench
-
-LOCAL_MODULE_TAGS := optional
-
-include $(BUILD_EXECUTABLE)
diff --git a/media/tests/omxjpegdecoder/StreamSource.cpp b/media/tests/omxjpegdecoder/StreamSource.cpp
deleted file mode 100644
index f764121a..0000000
--- a/media/tests/omxjpegdecoder/StreamSource.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <media/stagefright/foundation/ADebug.h>
-
-#include "StreamSource.h"
-
-namespace android {
-
-StreamSource::StreamSource(SkStream *stream)
- : mStream(stream) {
- CHECK(stream != NULL);
- mSize = stream->getLength();
-}
-
-StreamSource::~StreamSource() {
- delete mStream;
- mStream = NULL;
-}
-
-status_t StreamSource::initCheck() const {
- return mStream != NULL ? OK : NO_INIT;
-}
-
-ssize_t StreamSource::readAt(off64_t offset, void *data, size_t size) {
- Mutex::Autolock autoLock(mLock);
-
- mStream->rewind();
- mStream->skip(offset);
- ssize_t result = mStream->read(data, size);
-
- return result;
-}
-
-status_t StreamSource::getSize(off64_t *size) {
- *size = mSize;
- return OK;
-}
-
-} // namespace android
diff --git a/media/tests/omxjpegdecoder/StreamSource.h b/media/tests/omxjpegdecoder/StreamSource.h
deleted file mode 100644
index 9807385..0000000
--- a/media/tests/omxjpegdecoder/StreamSource.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef STREAM_SOURCE_H_
-
-#define STREAM_SOURCE_H_
-
-#include <stdio.h>
-
-#include <SkStream.h>
-#include <media/stagefright/DataSource.h>
-#include <media/stagefright/MediaErrors.h>
-#include <utils/threads.h>
-
-namespace android {
-
-class StreamSource : public DataSource {
-public:
- // Pass the ownership of SkStream to StreamSource.
- StreamSource(SkStream *SkStream);
- virtual status_t initCheck() const;
- virtual ssize_t readAt(off64_t offset, void *data, size_t size);
- virtual status_t getSize(off64_t *size);
-
-protected:
- virtual ~StreamSource();
-
-private:
- SkStream *mStream;
- size_t mSize;
- Mutex mLock;
-
- StreamSource(const StreamSource &);
- StreamSource &operator=(const StreamSource &);
-};
-
-} // namespace android
-
-#endif // STREAM_SOURCE_H_
diff --git a/media/tests/omxjpegdecoder/jpeg_decoder_bench.cpp b/media/tests/omxjpegdecoder/jpeg_decoder_bench.cpp
deleted file mode 100644
index de6294d..0000000
--- a/media/tests/omxjpegdecoder/jpeg_decoder_bench.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "OmxJpegDecoder"
-#include <sys/time.h>
-#include <utils/Log.h>
-
-#include <binder/ProcessState.h>
-
-#include "SkBitmap.h"
-#include "SkImageDecoder.h"
-#include "SkStream.h"
-#include "omx_jpeg_decoder.h"
-
-class SkJPEGImageDecoder : public SkImageDecoder {
-public:
- virtual Format getFormat() const {
- return kJPEG_Format;
- }
-
-protected:
- virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode);
-};
-
-int nullObjectReturn(const char msg[]) {
- if (msg) {
- SkDebugf("--- %s\n", msg);
- }
- return -1;
-}
-
-static int64_t getNowUs() {
- struct timeval tv;
- gettimeofday(&tv, NULL);
-
- return tv.tv_usec + (int64_t) tv.tv_sec * 1000000;
-}
-
-int testDecodeBounds(SkImageDecoder* decoder, SkStream* stream,
- SkBitmap* bitmap) {
- int64_t startTime = getNowUs();
- SkColorType prefColorType = kN32_SkColorType;
- SkImageDecoder::Mode decodeMode = SkImageDecoder::kDecodeBounds_Mode;
-
- // Decode the input stream and then use the bitmap.
- if (!decoder->decode(stream, bitmap, prefColorType, decodeMode)) {
- return nullObjectReturn("decoder->decode returned false");
- } else {
- int64_t delay = getNowUs() - startTime;
- printf("WidthxHeight: %dx%d\n", bitmap->width(), bitmap->height());
- printf("Decoding Time in BoundsMode %.1f msec.\n", delay / 1000.0f);
- return 0;
- }
-}
-
-int testDecodePixels(SkImageDecoder* decoder, SkStream* stream,
- SkBitmap* bitmap) {
- int64_t startTime = getNowUs();
- SkColorType prefColorType = kN32_SkColorType;
- SkImageDecoder::Mode decodeMode = SkImageDecoder::kDecodePixels_Mode;
-
- // Decode the input stream and then use the bitmap.
- if (!decoder->decode(stream, bitmap, prefColorType, decodeMode)) {
- return nullObjectReturn("decoder->decode returned false");
- } else {
- int64_t delay = getNowUs() - startTime;
- printf("Decoding Time in PixelsMode %.1f msec.\n", delay / 1000.0f);
- const char* filename = "/sdcard/omxJpegDecodedBitmap.rgba";
- return storeBitmapToFile(bitmap, filename);
- }
-}
-
-int testDecoder(SkImageDecoder* decoder, char* filename) {
- // test DecodeMode == Pixels
- SkStream* stream = new SkFILEStream(filename);
- SkBitmap* bitmap = new SkBitmap;
- testDecodePixels(decoder, stream, bitmap);
- delete bitmap;
-
- // test DecodeMode == Bounds
- stream = new SkFILEStream(filename);
- bitmap = new SkBitmap;
- testDecodeBounds(decoder, stream, bitmap);
- delete bitmap;
-
- delete decoder;
- return 0;
-}
-
-int main(int argc, char** argv) {
- android::ProcessState::self()->startThreadPool();
-
- printf("Decoding jpeg with libjpeg...\n");
- SkJPEGImageDecoder* libjpeg = new SkJPEGImageDecoder;
- testDecoder(libjpeg, argv[1]);
-
- printf("\nDecoding jpeg with OMX...\n");
- OmxJpegImageDecoder* omx = new OmxJpegImageDecoder;
- testDecoder(omx, argv[1]);
- return 0;
-}
diff --git a/media/tests/omxjpegdecoder/omx_jpeg_decoder.cpp b/media/tests/omxjpegdecoder/omx_jpeg_decoder.cpp
deleted file mode 100644
index 229bfdb..0000000
--- a/media/tests/omxjpegdecoder/omx_jpeg_decoder.cpp
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "OmxJpegDecoder"
-#include <sys/time.h>
-#include <utils/Log.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <binder/IServiceManager.h>
-#include <binder/ProcessState.h>
-#include <media/IMediaPlayerService.h>
-#include <media/stagefright/foundation/ADebug.h>
-#include <media/stagefright/MediaSource.h>
-#include <media/stagefright/MetaData.h>
-#include <media/stagefright/OMXClient.h>
-#include <media/stagefright/OMXCodec.h>
-#include <SkImage.h>
-#include <SkMallocPixelRef.h>
-
-#include "omx_jpeg_decoder.h"
-#include "StreamSource.h"
-
-using namespace android;
-
-static void getJpegOutput(MediaBuffer* buffer, const char* filename) {
- int size = buffer->range_length();
- int offset = buffer->range_offset();
- FILE *pFile = fopen(filename, "w+");
-
- if (pFile == NULL) {
- printf("Error: cannot open %s.\n", filename);
- } else {
- char* data = (char*) buffer->data();
- data += offset;
- while (size > 0) {
- int numChars = fwrite(data, sizeof(char), 1024, pFile);
- int numBytes = numChars * sizeof(char);
- size -= numBytes;
- data += numBytes;
- }
- fclose(pFile);
- }
- return;
-}
-
-extern int storeBitmapToFile(SkBitmap* bitmap, const char* filename) {
- bitmap->lockPixels();
- uint8_t* data = (uint8_t *)bitmap->getPixels();
- int size = bitmap->getSize();
- FILE* fp = fopen(filename, "w+");
-
- if (NULL == fp) {
- printf("Cannot open the output file! \n");
- return -1;
- } else {
- while (size > 0) {
- int numChars = fwrite(data, sizeof(char), 1024, fp);
- int numBytes = numChars * sizeof(char);
- size -= numBytes;
- data += numBytes;
- }
- fclose(fp);
- }
- return 0;
-}
-
-static int64_t getNowUs() {
- struct timeval tv;
- gettimeofday(&tv, NULL);
-
- return (int64_t)tv.tv_usec + tv.tv_sec * 1000000;
-}
-
-OmxJpegImageDecoder::OmxJpegImageDecoder() {
- status_t err = mClient.connect();
- CHECK_EQ(err, (status_t)OK);
-}
-
-OmxJpegImageDecoder::~OmxJpegImageDecoder() {
- mClient.disconnect();
-}
-
-bool OmxJpegImageDecoder::onDecode(SkStream* stream,
- SkBitmap* bm, Mode mode) {
- sp<MediaSource> source = prepareMediaSource(stream);
- sp<MetaData> meta = source->getFormat();
- int width;
- int height;
- meta->findInt32(kKeyWidth, &width);
- meta->findInt32(kKeyHeight, &height);
- configBitmapSize(
- bm, getPrefColorType(k32Bit_SrcDepth, false),
- width, height);
-
- // mode == DecodeBounds
- if (mode == SkImageDecoder::kDecodeBounds_Mode) {
- return true;
- }
-
- // mode == DecodePixels
- if (!this->allocPixelRef(bm, NULL)) {
- ALOGI("Cannot allocPixelRef()!");
- return false;
- }
-
- sp<MediaSource> decoder = getDecoder(&mClient, source);
- return decodeSource(decoder, source, bm);
-}
-
-JPEGSource* OmxJpegImageDecoder::prepareMediaSource(SkStream* stream) {
- DataSource::RegisterDefaultSniffers();
- sp<DataSource> dataSource = new StreamSource(stream);
- return new JPEGSource(dataSource);
-}
-
-sp<MediaSource> OmxJpegImageDecoder::getDecoder(
- OMXClient *client, const sp<MediaSource>& source) {
- sp<MetaData> meta = source->getFormat();
- sp<MediaSource> decoder = OMXCodec::Create(
- client->interface(), meta, false /* createEncoder */, source);
-
- CHECK(decoder != NULL);
- return decoder;
-}
-
-bool OmxJpegImageDecoder::decodeSource(sp<MediaSource> decoder,
- const sp<MediaSource>& source, SkBitmap* bm) {
- status_t rt = decoder->start();
- if (rt != OK) {
- ALOGE("Cannot start OMX Decoder!");
- return false;
- }
- int64_t startTime = getNowUs();
- MediaBuffer *buffer;
-
- // decode source
- status_t err = decoder->read(&buffer, NULL);
- int64_t duration = getNowUs() - startTime;
-
- if (err != OK) {
- CHECK(buffer == NULL);
- }
- printf("Duration in decoder->read(): %.1f (msecs). \n",
- duration / 1E3 );
-
- // Copy pixels from buffer to bm.
- // May need to check buffer->rawBytes() == bm->rawBytes().
- CHECK_EQ(buffer->size(), bm->getSize());
- memcpy(bm->getPixels(), buffer->data(), buffer->size());
- buffer->release();
- decoder->stop();
-
- return true;
-}
-
-void OmxJpegImageDecoder::configBitmapSize(SkBitmap* bm, SkColorType pref,
- int width, int height) {
- // Set the color space to ARGB_8888 for now (ignoring pref)
- // because of limitation in hardware support.
- bm->setInfo(SkImageInfo::MakeN32(width, height, kOpaque_SkAlphaType));
-}
diff --git a/media/tests/omxjpegdecoder/omx_jpeg_decoder.h b/media/tests/omxjpegdecoder/omx_jpeg_decoder.h
deleted file mode 100644
index e487245..0000000
--- a/media/tests/omxjpegdecoder/omx_jpeg_decoder.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef OMXJPEGIMAGEDECODER
-#define OMXJPEGIMAGEDECODER
-
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <media/stagefright/JPEGSource.h>
-#include <media/stagefright/MediaSource.h>
-#include <media/stagefright/OMXClient.h>
-#include <media/stagefright/OMXCodec.h>
-#include <SkImageDecoder.h>
-#include <SkStream.h>
-
-using namespace android;
-
-extern int storeBitmapToFile(SkBitmap* bitmap, const char* filename);
-
-class OmxJpegImageDecoder : public SkImageDecoder {
-public:
- OmxJpegImageDecoder();
- ~OmxJpegImageDecoder();
-
- virtual Format getFormat() const {
- return kJPEG_Format;
- }
-
-protected:
- virtual bool onDecode(SkStream* stream, SkBitmap* bm, Mode mode);
-
-private:
- JPEGSource* prepareMediaSource(SkStream* stream);
- sp<MediaSource> getDecoder(OMXClient* client, const sp<MediaSource>& source);
- bool decodeSource(sp<MediaSource> decoder, const sp<MediaSource>& source,
- SkBitmap* bm);
- void configBitmapSize(SkBitmap* bm, SkColorType, int width, int height);
-
- OMXClient mClient;
-};
-
-#endif
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
index fef1f4a..219de38 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
@@ -574,7 +574,8 @@
// Only sort by size when visible
sortSize.setVisible(mState.showSize);
- final boolean searchVisible;
+ boolean searchVisible;
+ boolean fileSizeVisible = mState.action != ACTION_MANAGE;
if (mState.action == ACTION_CREATE || mState.action == ACTION_OPEN_TREE) {
createDir.setVisible(cwd != null && cwd.isCreateSupported());
searchVisible = false;
@@ -583,6 +584,7 @@
if (cwd == null) {
grid.setVisible(false);
list.setVisible(false);
+ fileSizeVisible = false;
}
if (mState.action == ACTION_CREATE) {
@@ -604,7 +606,7 @@
? R.string.menu_file_size_hide : R.string.menu_file_size_show);
advanced.setVisible(mState.action != ACTION_MANAGE);
- fileSize.setVisible(mState.action != ACTION_MANAGE);
+ fileSize.setVisible(fileSizeVisible);
return true;
}
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
index c323a33..066acac 100644
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
@@ -154,7 +154,12 @@
if (ROOT_ID_PRIMARY_EMULATED.equals(rootId)) {
root.title = getContext().getString(R.string.root_internal_storage);
} else {
- root.title = volume.getUserLabel();
+ final String userLabel = volume.getUserLabel();
+ if (!TextUtils.isEmpty(userLabel)) {
+ root.title = userLabel;
+ } else {
+ root.title = volume.getDescription(getContext());
+ }
}
root.docId = getDocIdForFile(path);
mRoots.add(root);
diff --git a/packages/Keyguard/res/values-sw600dp/bools.xml b/packages/Keyguard/res/values-sw600dp/bools.xml
index ddc48c5..00f45c1 100644
--- a/packages/Keyguard/res/values-sw600dp/bools.xml
+++ b/packages/Keyguard/res/values-sw600dp/bools.xml
@@ -19,7 +19,6 @@
<bool name="show_ongoing_ime_switcher">true</bool>
<bool name="kg_share_status_area">false</bool>
<bool name="kg_sim_puk_account_full_screen">false</bool>
- <bool name="kg_show_ime_at_screen_on">false</bool>
<!-- No camera for you, tablet user -->
<bool name="kg_enable_camera_default_widget">false</bool>
<bool name="kg_center_small_widgets_vertically">true</bool>
diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java b/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java
index 85b2490..a54334a 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java
@@ -24,6 +24,7 @@
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
+import android.net.Uri;
import android.os.AsyncTask;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
@@ -110,13 +111,12 @@
mRenderer.close(callback);
}
- public void destroy(Runnable callback) {
- throwIfNotClosed();
+ public void destroy() {
mState = STATE_DESTROYED;
if (DEBUG) {
Log.i(LOG_TAG, "STATE_DESTROYED");
}
- doDestroy(callback);
+ mRenderer.destroy();
}
public void startPreload(int firstShownPage, int lastShownPage) {
@@ -163,21 +163,13 @@
try {
if (mState != STATE_DESTROYED) {
mCloseGuard.warnIfOpen();
- doDestroy(null);
+ destroy();
}
} finally {
super.finalize();
}
}
- private void doDestroy(Runnable callback) {
- mState = STATE_DESTROYED;
- if (DEBUG) {
- Log.i(LOG_TAG, "STATE_DESTROYED");
- }
- mRenderer.destroy(callback);
- }
-
private void throwIfNotOpened() {
if (mState != STATE_OPENED) {
throw new IllegalStateException("Not opened");
@@ -428,6 +420,7 @@
private IPdfRenderer mRenderer;
private boolean mBoundToService;
+ private boolean mDestroyed;
public AsyncRenderer(Context context, OnMalformedPdfFileListener malformedPdfFileListener) {
mContext = context;
@@ -441,7 +434,6 @@
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
- mBoundToService = true;
synchronized (mLock) {
mRenderer = IPdfRenderer.Stub.asInterface(service);
mLock.notifyAll();
@@ -465,9 +457,15 @@
new AsyncTask<Void, Void, Integer>() {
@Override
protected void onPreExecute() {
+ if (mDestroyed) {
+ cancel(true);
+ return;
+ }
Intent intent = new Intent(PdfManipulationService.ACTION_GET_RENDERER);
intent.setClass(mContext, PdfManipulationService.class);
+ intent.setData(Uri.fromParts("fake-scheme", String.valueOf(hashCode()), null));
mContext.bindService(intent, AsyncRenderer.this, Context.BIND_AUTO_CREATE);
+ mBoundToService = true;
}
@Override
@@ -513,6 +511,14 @@
new AsyncTask<Void, Void, Void>() {
@Override
+ protected void onPreExecute() {
+ if (mDestroyed) {
+ cancel(true);
+ return;
+ }
+ }
+
+ @Override
protected Void doInBackground(Void... params) {
synchronized (mLock) {
try {
@@ -534,27 +540,14 @@
}.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}
- public void destroy(final Runnable callback) {
- new AsyncTask<Void, Void, Void>() {
- @Override
- protected Void doInBackground(Void... params) {
- return null;
- }
-
- @Override
- public void onPostExecute(Void result) {
- if (mBoundToService) {
- mBoundToService = false;
- mContext.unbindService(AsyncRenderer.this);
- }
- mPageContentCache.invalidate();
- mPageContentCache.clear();
- if (callback != null) {
- callback.run();
- }
-
- }
- }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
+ public void destroy() {
+ if (mBoundToService) {
+ mBoundToService = false;
+ mContext.unbindService(AsyncRenderer.this);
+ }
+ mPageContentCache.invalidate();
+ mPageContentCache.clear();
+ mDestroyed = true;
}
public void startPreload(int firstShownPage, int lastShownPage, RenderSpec renderSpec) {
diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java
index 045a2f9..2cc5e04 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java
@@ -78,7 +78,7 @@
private static final boolean DEBUG_PERSISTENCE = false;
- private static final boolean PERSISTNECE_MANAGER_ENABLED = true;
+ private static final boolean PERSISTENCE_MANAGER_ENABLED = true;
private static final long CHECK_ALL_PRINTJOBS_HANDLED_DELAY = 5000;
@@ -728,7 +728,7 @@
}
public void writeStateLocked() {
- if (!PERSISTNECE_MANAGER_ENABLED) {
+ if (!PERSISTENCE_MANAGER_ENABLED) {
return;
}
if (mWriteStateScheduled) {
@@ -935,7 +935,7 @@
}
public void readStateLocked() {
- if (!PERSISTNECE_MANAGER_ENABLED) {
+ if (!PERSISTENCE_MANAGER_ENABLED) {
return;
}
FileInputStream in = null;
diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java b/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java
index c53fcad..f6ace41 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java
@@ -137,7 +137,7 @@
private final DeathRecipient mDeathRecipient = new DeathRecipient() {
@Override
public void binderDied() {
- notifyPrintingAppDied();
+ onPrintingAppDied();
}
};
@@ -268,7 +268,7 @@
mPrintDocumentAdapter.finish();
mState = STATE_FINISHED;
} catch (RemoteException re) {
- Log.e(LOG_TAG, "Error calling finish()", re);
+ Log.e(LOG_TAG, "Error calling finish()");
mState = STATE_FAILED;
}
}
@@ -1108,7 +1108,8 @@
}
}
- private void notifyPrintingAppDied() {
+ private void onPrintingAppDied() {
+ mState = STATE_FAILED;
new Handler(mLooper).post(new Runnable() {
@Override
public void run() {
@@ -1129,7 +1130,7 @@
public void onDestroy() {
final RemotePrintDocument document = mWeakDocument.get();
if (document != null) {
- document.notifyPrintingAppDied();
+ document.onPrintingAppDied();
}
}
}
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/FusedPrintersProvider.java b/packages/PrintSpooler/src/com/android/printspooler/ui/FusedPrintersProvider.java
index 8a65a2e..02d2715 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/FusedPrintersProvider.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/FusedPrintersProvider.java
@@ -48,6 +48,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -91,14 +92,14 @@
mPersistenceManager.addPrinterAndWritePrinterHistory(printer);
}
- private void computeAndDeliverResult(ArrayMap<PrinterId, PrinterInfo> discoveredPrinters,
- ArrayMap<PrinterId, PrinterInfo> favoritePrinters) {
+ private void computeAndDeliverResult(Map<PrinterId, PrinterInfo> discoveredPrinters,
+ List<PrinterInfo> favoritePrinters) {
List<PrinterInfo> printers = new ArrayList<>();
// Add the updated favorite printers.
final int favoritePrinterCount = favoritePrinters.size();
for (int i = 0; i < favoritePrinterCount; i++) {
- PrinterInfo favoritePrinter = favoritePrinters.valueAt(i);
+ PrinterInfo favoritePrinter = favoritePrinters.get(i);
PrinterInfo updatedPrinter = discoveredPrinters.remove(
favoritePrinter.getId());
if (updatedPrinter != null) {
@@ -215,21 +216,14 @@
// printer to use its current name instead of the historical one.
mPersistenceManager.updatePrintersHistoricalNamesIfNeeded(printers);
- ArrayMap<PrinterId, PrinterInfo> printersMap = new ArrayMap<>();
+ Map<PrinterId, PrinterInfo> printersMap = new LinkedHashMap<>();
final int printerCount = printers.size();
for (int i = 0; i < printerCount; i++) {
PrinterInfo printer = printers.get(i);
printersMap.put(printer.getId(), printer);
}
- ArrayMap<PrinterId, PrinterInfo> favoritePrintersMap = new ArrayMap<>();
- final int favoritePrinterCount = favoritePrinters.size();
- for (int i = 0; i < favoritePrinterCount; i++) {
- PrinterInfo favoritePrinter = favoritePrinters.get(i);
- favoritePrintersMap.put(favoritePrinter.getId(), favoritePrinter);
- }
-
- computeAndDeliverResult(printersMap, favoritePrintersMap);
+ computeAndDeliverResult(printersMap, favoritePrinters);
}
@Override
@@ -544,7 +538,7 @@
mReadHistoryCompleted = true;
// Deliver the printers.
- updatePrinters(mDiscoverySession.getPrinters(), mHistoricalPrinters);
+ updatePrinters(mDiscoverySession.getPrinters(), mFavoritePrinters);
// Loading the available printers if needed.
loadInternal();
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java
index fbf7204..aa79568 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java
@@ -484,9 +484,13 @@
return selectedPages;
}
- public void destroy(Runnable callback) {
- throwIfNotClosed();
- doDestroy(callback);
+ public void destroy() {
+ mPageContentRepository.destroy();
+ mCloseGuard.close();
+ mState = STATE_DESTROYED;
+ if (DEBUG) {
+ Log.i(LOG_TAG, "STATE_DESTROYED");
+ }
}
@Override
@@ -494,7 +498,7 @@
try {
if (mState != STATE_DESTROYED) {
mCloseGuard.warnIfOpen();
- doDestroy(null);
+ destroy();
}
} finally {
super.finalize();
@@ -741,15 +745,6 @@
mPageContentRepository.stopPreload();
}
- private void doDestroy(Runnable callback) {
- mPageContentRepository.destroy(callback);
- mCloseGuard.close();
- mState = STATE_DESTROYED;
- if (DEBUG) {
- Log.i(LOG_TAG, "STATE_DESTROYED");
- }
- }
-
private void throwIfNotOpened() {
if (mState != STATE_OPENED) {
throw new IllegalStateException("Not opened");
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
index 01ea3c8..15ea9a7 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
@@ -1412,12 +1412,16 @@
mCopiesEditText.setEnabled(true);
mCopiesEditText.setFocusableInTouchMode(true);
} else {
+ CharSequence text = mCopiesEditText.getText();
+ if (TextUtils.isEmpty(text) || !MIN_COPIES_STRING.equals(text.toString())) {
+ mCopiesEditText.setText(MIN_COPIES_STRING);
+ }
mCopiesEditText.setEnabled(false);
mCopiesEditText.setFocusable(false);
}
if (mCopiesEditText.getError() == null
&& TextUtils.isEmpty(mCopiesEditText.getText())) {
- mCopiesEditText.setText(String.valueOf(MIN_COPIES));
+ mCopiesEditText.setText(MIN_COPIES_STRING);
mCopiesEditText.requestFocus();
}
}
@@ -1612,15 +1616,9 @@
mSpoolerProvider.destroy();
mPrintedDocument.finish();
mPrintedDocument.destroy();
- mPrintPreviewController.destroy(new Runnable() {
- @Override
- public void run() {
- finish();
- }
- });
- } else {
- finish();
+ mPrintPreviewController.destroy();
}
+ finish();
}
private final class SpinnerItem<T> {
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java
index e4eab10..15342ae 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java
@@ -192,15 +192,10 @@
});
}
- public void destroy(Runnable callback) {
- if (mPageAdapter.isOpened()) {
- Message operation = mHandler.obtainMessage(MyHandler.MSG_CLOSE);
- mHandler.enqueueOperation(operation);
- }
-
- Message operation = mHandler.obtainMessage(MyHandler.MSG_DESTROY);
- operation.obj = callback;
- mHandler.enqueueOperation(operation);
+ public void destroy() {
+ mHandler.cancelQueuedOperations();
+ mRecyclerView.setAdapter(null);
+ mPageAdapter.destroy();
}
@Override
@@ -226,7 +221,6 @@
private final class MyHandler extends Handler {
public static final int MSG_OPEN = 1;
public static final int MSG_CLOSE = 2;
- public static final int MSG_DESTROY = 3;
public static final int MSG_UPDATE = 4;
public static final int MSG_START_PRELOAD = 5;
@@ -246,6 +240,10 @@
super(looper, null, false);
}
+ public void cancelQueuedOperations() {
+ mPendingOperations.clear();
+ }
+
public void enqueueOperation(Message message) {
mPendingOperations.add(message);
handleNextOperation();
@@ -294,13 +292,6 @@
});
} break;
- case MSG_DESTROY: {
- Runnable callback = (Runnable) message.obj;
- mRecyclerView.setAdapter(null);
- mPageAdapter.destroy(callback);
- handleNextOperation();
- } break;
-
case MSG_UPDATE: {
SomeArgs args = (SomeArgs) message.obj;
PageRange[] writtenPages = (PageRange[]) args.arg1;
diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index efba03d..16c6075 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -21,6 +21,7 @@
<integer name="def_screen_off_timeout">60000</integer>
<integer name="def_sleep_timeout">-1</integer>
<bool name="def_airplane_mode_on">false</bool>
+ <bool name="def_theater_mode_on">false</bool>
<!-- Comma-separated list of bluetooth, wifi, and cell. -->
<string name="def_airplane_mode_radios" translatable="false">cell,bluetooth,wifi,nfc,wimax</string>
<string name="airplane_mode_toggleable_radios" translatable="false">bluetooth,wifi,nfc</string>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 8c51caf..e56806a 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -71,7 +71,7 @@
// database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion'
// is properly propagated through your change. Not doing so will result in a loss of user
// settings.
- private static final int DATABASE_VERSION = 114;
+ private static final int DATABASE_VERSION = 116;
private Context mContext;
private int mUserHandle;
@@ -1828,20 +1828,43 @@
upgradeVersion = 113;
}
- if (upgradeVersion < 114) {
- db.beginTransaction();
- SQLiteStatement stmt = null;
- try {
- stmt = db.compileStatement("INSERT OR IGNORE INTO global(name,value)"
- + " VALUES(?,?);");
- loadSetting(stmt, Settings.Global.VOLTE_VT_ENABLED, ImsConfig.FeatureValueConstants.ON);
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- if (stmt != null) stmt.close();
+ // We skipped 114 to handle a merge conflict with the introduction of theater mode.
+
+ if (upgradeVersion < 115) {
+ if (mUserHandle == UserHandle.USER_OWNER) {
+ db.beginTransaction();
+ SQLiteStatement stmt = null;
+ try {
+ stmt = db.compileStatement("INSERT OR IGNORE INTO global(name,value)"
+ + " VALUES(?,?);");
+ loadBooleanSetting(stmt, Global.THEATER_MODE_ON,
+ R.bool.def_theater_mode_on);
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ if (stmt != null) stmt.close();
+ }
}
- upgradeVersion = 114;
+ upgradeVersion = 115;
}
+
+ if (upgradeVersion < 116) {
+ if (mUserHandle == UserHandle.USER_OWNER) {
+ db.beginTransaction();
+ SQLiteStatement stmt = null;
+ try {
+ stmt = db.compileStatement("INSERT OR IGNORE INTO global(name,value)"
+ + " VALUES(?,?);");
+ loadSetting(stmt, Settings.Global.ENHANCED_4G_MODE_ENABLED, ImsConfig.FeatureValueConstants.ON);
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ if (stmt != null) stmt.close();
+ }
+ }
+ upgradeVersion = 116;
+ }
+
// *** Remember to update DATABASE_VERSION above!
if (upgradeVersion != currentVersion) {
@@ -2438,6 +2461,9 @@
loadBooleanSetting(stmt, Settings.Global.AIRPLANE_MODE_ON,
R.bool.def_airplane_mode_on);
+ loadBooleanSetting(stmt, Settings.Global.THEATER_MODE_ON,
+ R.bool.def_theater_mode_on);
+
loadStringSetting(stmt, Settings.Global.AIRPLANE_MODE_RADIOS,
R.string.def_airplane_mode_radios);
@@ -2584,7 +2610,7 @@
loadBooleanSetting(stmt, Settings.Global.GUEST_USER_ENABLED,
R.bool.def_guest_user_enabled);
- loadSetting(stmt, Settings.Global.VOLTE_VT_ENABLED, ImsConfig.FeatureValueConstants.ON);
+ loadSetting(stmt, Settings.Global.ENHANCED_4G_MODE_ENABLED, ImsConfig.FeatureValueConstants.ON);
// --- New global settings start here
} finally {
if (stmt != null) stmt.close();
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 7e6afa6..3c44245 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -92,6 +92,7 @@
<uses-permission android:name="android.permission.FRAME_STATS" />
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
<uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
+ <uses-permission android:name="android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS"/>
<application android:label="@string/app_label">
<provider
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index d50adf9..59e5ece 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Информация за приложението"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Скорошните ви екрани се показват тук"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Отхвърляне на скорошните приложения"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"1 екран в панела за общ преглед"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d екрана в панела за общ преглед"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Няма известия"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"В момента"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Известия"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Назад"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Начало"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Меню"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"Общ преглед"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Търсене"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Камера"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Телефон"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Бързи настройки."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Заключване на екрана."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Настройки"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Общ преглед."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Потребител: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Функцията за Wi-Fi се изключи."</string>
diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml
index 93ff2ec..10be3ee 100644
--- a/packages/SystemUI/res/values-bn-rBD/strings.xml
+++ b/packages/SystemUI/res/values-bn-rBD/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"আপনার সাম্প্রতিক স্ক্রীনগুলো এখানে দেখা যাবে"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"সাম্প্রতিক অ্যাপ্লিকেশানগুলি খারিজ করুন"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"ওভারভিউ-এ ১টি স্ক্রীন"</item>
- <item quantity="other" msgid="5523506463832158203">"ওভারভিউ-এ %dটি স্ক্রীন"</item>
+ <item quantity="one" msgid="3969335317929254918">"এক নজরে-এ ১টি স্ক্রীন"</item>
+ <item quantity="other" msgid="5523506463832158203">"এক নজরে-এ %dটি স্ক্রীন"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"কোনো বিজ্ঞপ্তি নেই"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"চলতে-থাকা"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"ফিরুন"</string>
<string name="accessibility_home" msgid="8217216074895377641">"হোম"</string>
<string name="accessibility_menu" msgid="316839303324695949">"মেনু"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"ওভারভিউ"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"এক নজরে"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"অনুসন্ধান করুন"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"ক্যামেরা"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"ফোন"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"দ্রুত সেটিংস৷"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"লক স্ক্রীন।"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"সেটিংস"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ওভারভিউ৷"</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"এক নজরে৷"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ব্যবহারকারী <xliff:g id="USER">%s</xliff:g>৷"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>।"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WiFi বন্ধ হয়েছে।"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 7ebce43..a18dda8 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Aquí es mostren les teves pantalles recents."</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Omet les aplicacions recents"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"1 pantalla en la visió general"</item>
- <item quantity="other" msgid="5523506463832158203">"%d pantalles en la visió general"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 pantalla a Visió general"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d pantalles a Visió general"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Cap notificació"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Continu"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 7522155..da61fcb 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informace o aplikaci"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Zde budou zobrazeny vaše poslední obrazovky"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Zavřít nové aplikace"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"1 obrazovka v Přehledu"</item>
+ <item quantity="other" msgid="5523506463832158203">"Počet obrazovek v Přehledu: %d"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Žádná oznámení"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Probíhající"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Oznámení"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Zpět"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Domů"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"Přehled"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Hledat"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Fotoaparát"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string>
@@ -166,8 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Rychlé nastavení."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Obrazovka uzamčení"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Nastavení"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Přehled"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Uživatel <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Připojení Wi-Fi je vypnuto."</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 8ad8be3..fba17ca 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Aquí aparecerán tus pantallas recientes"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Ignorar aplicaciones recientes"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"1 pantalla en Información general"</item>
- <item quantity="other" msgid="5523506463832158203">"%d pantallas en Información general"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 pantalla en Visión general"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d pantallas en Visión general"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No tienes notificaciones"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Entrante"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Atrás"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Inicio"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menú"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"Información general"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"Visión general"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Buscar"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Cámara"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Teléfono"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Ajustes rápidos"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla de bloqueo."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Ajustes"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Información general."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visión general."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuario <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi desactivado."</string>
diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml
index a23e20a..1cb4259 100644
--- a/packages/SystemUI/res/values-et-rEE/strings.xml
+++ b/packages/SystemUI/res/values-et-rEE/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Rakenduse teave"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Teie viimane ekraanikuva ilmub siia"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Loobu hiljutistest rakendustest"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"1 ekraan jaotises Ülevaade"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d ekraanikuva jaotises Ülevaade"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Teatisi pole"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Jätkuv"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Teadistused"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Tagasi"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Kodu"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menüü"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"Ülevaade"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Otsing"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Kaamera"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Kiirseaded."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Kuva lukustamine."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Seaded"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ülevaade."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Kasutaja <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WiFi on välja lülitatud."</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 74b8da3..d9b3985 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Sovelluksen tiedot"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Äskettäin käytetyt ruudut näkyvät tässä"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Hylkää viimeaikaiset sovellukset"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"1 näyttö Viimeisimmät-kohdassa"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d näyttöä Viimeisimmät-kohdassa"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ei ilmoituksia"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Käynnissä olevat"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ilmoitukset"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Takaisin"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Aloituspainike"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Valikko"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"Viimeisimmät"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Haku"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Puhelin"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Pika-asetukset."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lukitse näyttö."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Asetukset"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Viimeisimmät."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Käyttäjä: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi poistettiin käytöstä."</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 1876835..7c625d1 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informations sur l\'application"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Vos écrans récents s\'affichent ici"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Masquer les applications récentes"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"Aperçu de 1 écran"</item>
+ <item quantity="other" msgid="5523506463832158203">"Aperçu de %d écrans"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Aucune notification"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"En cours"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notifications"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Précédent"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Domicile"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"Aperçu"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Rechercher"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Appareil photo"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Téléphone"</string>
@@ -166,8 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Paramètres rapides"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Écran de verrouillage"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Paramètres"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Aperçu"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilisateur : <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi désactivé"</string>
diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml
index e868f1f..e94f007 100644
--- a/packages/SystemUI/res/values-gl-rES/strings.xml
+++ b/packages/SystemUI/res/values-gl-rES/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Información da aplicación"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"As túas pantallas recentes aparecen aquí"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Rexeitar aplicacións recentes"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"1 pantalla en Visión xeral"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d pantallas en Visión xeral"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Non hai notificacións"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"En curso"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificacións"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Volver"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Inicio"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menú"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"Visión xeral"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Buscar"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Cámara"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Teléfono"</string>
@@ -166,8 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Configuración rápida"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla de bloqueo."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Configuración"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visión xeral."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuario <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi desactivada."</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 11ad98d..da20f7d 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ऐप्स की जानकारी"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"आपकी हाल की स्क्रीन यहां दिखाई देती हैं"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"हाल ही के ऐप्स खारिज करें"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"अवलोकन मेें 1 स्क्रीन"</item>
+ <item quantity="other" msgid="5523506463832158203">"अवलोकन में %d स्क्रीन"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"कोई नोटिफिकेशन नहीं"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ऑनगोइंग"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"सूचनाएं"</string>
@@ -62,7 +64,7 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB डीबगिंग करने दें?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"कंप्यूटर का RSA कुंजी फ़िंगरप्रिंट है:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"इस कंप्यूटर से हमेशा अनुमति दें"</string>
- <string name="compat_mode_on" msgid="6623839244840638213">"स्क्रीन भरने हेतु ज़ूम करें"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"स्क्रीन भरने के लिए ज़ूम करें"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"स्क्रीन को भरने के लिए खींचें"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"स्क्रीनशॉट सहेजा जा रहा है..."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"स्क्रीनशॉट सहेजा जा रहा है..."</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"वापस जाएं"</string>
<string name="accessibility_home" msgid="8217216074895377641">"होम"</string>
<string name="accessibility_menu" msgid="316839303324695949">"मेनू"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"अवलोकन"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"खोजें"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"कैमरा"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"फ़ोन"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"त्वरित सेटिंग."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"लॉक स्क्रीन."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"सेटिंग"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"अवलोकन."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"उपयोगकर्ता <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"वाई-फ़ाई को बंद किया गया."</string>
@@ -204,7 +204,7 @@
<string name="data_usage_disabled_dialog_4g_title" msgid="4629078114195977196">"4G डेटा बंद है"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="5793456071535876132">"सेल्युलर डेटा बंद है"</string>
<string name="data_usage_disabled_dialog_title" msgid="8723412000355709802">"डेटा बंद है"</string>
- <string name="data_usage_disabled_dialog" msgid="6468718338038876604">"आपके डिवाइस ने डेटा बंद कर दिया है क्योंकि आपके द्वारा सेट की गई सीमा पार हो गई है.\n\nइसे पुनः चालू करने से आपका वाहक शुल्क ले सकता है."</string>
+ <string name="data_usage_disabled_dialog" msgid="6468718338038876604">"आपके डिवाइस ने डेटा बंद कर दिया है क्योंकि आपके द्वारा सेट की गई सीमा पार हो गई है.\n\nइसे फिर से चालू करने से आपका वाहक शुल्क ले सकता है."</string>
<string name="data_usage_disabled_dialog_enable" msgid="5538068036107372895">"डेटा चालू करें"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"कोई इंटरनेट कनेक्शन नहीं"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"वाई-फ़ाई कनेक्ट किया गया"</string>
@@ -345,7 +345,7 @@
<string name="monitoring_description_device_and_profile_owned" msgid="8685301493845456293">"यह डिवाइस इनके द्वारा प्रबंधित है:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nआपकी प्रोफ़ाइल इनके द्वारा प्रबंधित है:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\nआपका व्यवस्थापक ईमेल, ऐप्स और सुरक्षित वेबसाइटों सहित आपकी डिवाइस और नेटवर्क गतिविधि को मॉनीटर कर सकता है.\n\nअधिक जानकारी के लिए, अपने व्यवस्थापक से संपर्क करें."</string>
<string name="monitoring_description_vpn_profile_owned" msgid="847491346263295767">"यह प्रोफ़ाइल इनके द्वारा प्रबंधित है:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nआपका व्यवस्थापक ईमेल, ऐप्स और सुरक्षित वेबसाइटों सहित आपकी नेटवर्क गतिविधि को मॉनीटर करने में सक्षम है. अधिक जानकारी के लिए, अपने व्यवस्थापक से संपर्क करें.\n\nसाथ ही, आपने \"<xliff:g id="APPLICATION">%2$s</xliff:g>\" को VPN कनेक्शन सेट करने की अनुमति दी है. यह ऐप्स नेटवर्क गतिविधि भी मॉनीटर कर सकता है."</string>
<string name="monitoring_description_legacy_vpn_profile_owned" msgid="4095516964132237051">"यह प्रोफ़ाइल इनके द्वारा प्रबंधित है:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nआपका व्यवस्थापक ईमेल, ऐप्स और सुरक्षित वेबसाइटों सहित आपकी नेटवर्क गतिविधि को मॉनीटर करने में सक्षम है. अधिक जानकारी के लिए, अपने व्यवस्थापक से संपर्क करें.\n\nसाथ ही, आप VPN (\"<xliff:g id="APPLICATION">%2$s</xliff:g>\") से भी कनेक्ट हैं. आपका VPN सेवा प्रदाता नेटवर्क गतिविधि भी मॉनीटर कर सकता है."</string>
- <string name="monitoring_description_vpn_device_and_profile_owned" msgid="9193588924767232909">"डिवाइस इनके द्वारा प्रबंधित है:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nप्रोफ़ाइल इनके द्वारा प्रबंधित है:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\nव्यवस्थापक ईमेल, ऐप्स और सुरक्षित वेबसाइटों सहित नेटवर्क गतिविधि मॉनीटर कर सकते हैं. अधिक जानकारी हेतु, व्यवस्थापक से संपर्क करें.\n\nसाथ ही, आपने \"<xliff:g id="APPLICATION">%3$s</xliff:g>\" को VPN कनेक्शन सेट करने की अनुमति दी है. यह ऐप्स नेटवर्क गतिविधि भी मॉनीटर कर सकता है."</string>
+ <string name="monitoring_description_vpn_device_and_profile_owned" msgid="9193588924767232909">"डिवाइस इनके द्वारा प्रबंधित है:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nप्रोफ़ाइल इनके द्वारा प्रबंधित है:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\nव्यवस्थापक ईमेल, ऐप्स और सुरक्षित वेबसाइटों सहित नेटवर्क गतिविधि मॉनीटर कर सकते हैं. अधिक जानकारी के लिए, व्यवस्थापक से संपर्क करें.\n\nसाथ ही, आपने \"<xliff:g id="APPLICATION">%3$s</xliff:g>\" को VPN कनेक्शन सेट करने की अनुमति दी है. यह ऐप्स नेटवर्क गतिविधि भी मॉनीटर कर सकता है."</string>
<string name="monitoring_description_legacy_vpn_device_and_profile_owned" msgid="6935475023447698473">"यह डिवाइस इनके द्वारा प्रबंधित है:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nआपकी प्रोफ़ाइल इनके द्वारा प्रबंधित है:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\nआपका व्यवस्थापक ईमेल, ऐप्स और सुरक्षित वेबसाइटों सहित आपकी नेटवर्क गतिविधि को मॉनीटर करने में सक्षम है. अधिक जानकारी के लिए, अपने व्यवस्थापक से संपर्क करें.\n\nसाथ ही, आप VPN (\"<xliff:g id="APPLICATION">%3$s</xliff:g>\") से भी कनेक्ट हैं. आपका VPN सेवा प्रदाता नेटवर्क गतिविधि भी मॉनीटर कर सकता है."</string>
<string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"जब तक कि आप मैन्युअल रूप से अनलॉक नहीं करते तब तक डिवाइस लॉक रहेगा"</string>
<string name="hidden_notifications_title" msgid="7139628534207443290">"सूचनाएं अधिक तेज़ी से प्राप्त करें"</string>
diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml
index bbe71a5..5d442a0 100644
--- a/packages/SystemUI/res/values-hy-rAM/strings.xml
+++ b/packages/SystemUI/res/values-hy-rAM/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Տեղեկություններ ծրագրի մասին"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Ձեր վերջին էկրանները տեսանելի են այստեղ"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Անտեսել վերջին ծրագրերը"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"Համատեսքում ցուցադրված է 1 էկրան:"</item>
+ <item quantity="other" msgid="5523506463832158203">"Համատեսքում ցուցադրված է %d էկրան"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ծանուցումներ չկան"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ընթացիկ"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ծանուցումներ"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Հետ"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Տուն"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Ցանկ"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"Համատեսք"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Որոնել"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Ֆոտոխցիկ"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Հեռախոս"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Արագ կարգավորումներ:"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Էկրանի կողպում:"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Կարգավորումներ"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Համատեսք"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Օգտվող <xliff:g id="USER">%s</xliff:g>:"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>:"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi-ն անջատվեց:"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 5228a06..15d5dc7 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Layar terkini Anda muncul di sini"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Tutup aplikasi terbaru"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"1 layar dalam Ikhtisar"</item>
- <item quantity="other" msgid="5523506463832158203">"%d layar dalam Ikhtisar"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 layar dalam Ringkasan"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d layar dalam Ringkasan"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Tidak ada pemberitahuan"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Berkelanjutan"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Kembali"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Utama"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"Ikhtisar"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"Ringkasan"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Telusuri"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Telepon"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Setelan cepat."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Layar kunci."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Setelan"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ikhtisar."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ringkasan."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Pengguna <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi dinonaktifkan."</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index ffe31ae..b104450 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"アプリ情報"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"ここに最近の画面が表示されます"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"最近使ったアプリをクリア"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"[最近]に1個の画面があります"</item>
+ <item quantity="other" msgid="5523506463832158203">"[最近]に%d個の画面があります"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"通知なし"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"実行中"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"戻る"</string>
<string name="accessibility_home" msgid="8217216074895377641">"ホーム"</string>
<string name="accessibility_menu" msgid="316839303324695949">"メニュー"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"最近"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"検索"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"カメラ"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"電話"</string>
@@ -166,8 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"クイック設定"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ロック画面"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"設定"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"最近"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ユーザー: <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-FiをOFFにしました。"</string>
diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml
index c371ca0..9461ad2 100644
--- a/packages/SystemUI/res/values-ka-rGE/strings.xml
+++ b/packages/SystemUI/res/values-ka-rGE/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"აპის შესახებ"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"თქვენი ბოლო ეკრანები აქ გამოჩნდება"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ბოლო აპების გაუქმება"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"ნაჩვენებია 1 ეკრანი"</item>
+ <item quantity="other" msgid="5523506463832158203">"ნაჩვენებია %d ეკრანი"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"შეტყობინებები არ არის."</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"მიმდინარე"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"შეტყობინებები"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"უკან"</string>
<string name="accessibility_home" msgid="8217216074895377641">"საწყისი"</string>
<string name="accessibility_menu" msgid="316839303324695949">"მენიუ"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"გადახედვა"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"ძიება"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"კამერა"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"ტელეფონი"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"სწრაფი პარამეტრები"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ეკრანის დაბლოკვა."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"პარამეტრები"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"გადახედვა."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"მომხმარებელი: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi გამორთულია."</string>
diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml
index c633b9f..bb84471 100644
--- a/packages/SystemUI/res/values-kk-rKZ/strings.xml
+++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Қолданба ақпараты"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Мұнда жақындағы экрандар көрсетіледі"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Жуықта қолданылған қолданбаларды қоспау"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"«Шолу» ішінде 1 экран"</item>
+ <item quantity="other" msgid="5523506463832158203">"«Шолу» ішінде %d экран"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Хабарлар жоқ"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ағымдағы"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Хабарлар"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Артқа"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Үй"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Mәзір"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"Шолу"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Іздеу"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Камера"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Телефон"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Жылдам параметрлер."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Бекіту экраны."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Параметрлер"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Шолу."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Пайдаланушы <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi өшірілді."</string>
diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml
index 16204e6..335681a 100644
--- a/packages/SystemUI/res/values-km-rKH/strings.xml
+++ b/packages/SystemUI/res/values-km-rKH/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ព័ត៌មានកម្មវិធី"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"អេក្រង់បច្ចុប្បន្នរបស់អ្នកបង្ហាញនៅទីនេះ"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"បដិសេធកម្មវិធីថ្មីៗ"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"អេក្រង់ 1 ក្នុងទិដ្ឋភាព"</item>
+ <item quantity="other" msgid="5523506463832158203">"អេក្រង់ %d ក្នុងទិដ្ឋភាព"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"គ្មានការជូនដំណឹង"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"បន្ត"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"ការជូនដំណឹង"</string>
@@ -67,7 +69,7 @@
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"កំពុងរក្សាទុករូបថតអេក្រង់…"</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"កំពុងរក្សាទុករូបថតអេក្រង់..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"រូបថតអេក្រង់កំពុងត្រូវបានរក្សាទុក។"</string>
- <string name="screenshot_saved_title" msgid="6461865960961414961">"បានចាប់យករូបថតអេក្រង់។"</string>
+ <string name="screenshot_saved_title" msgid="6461865960961414961">"បានចាប់យករូបថតអេក្រង់។"</string>
<string name="screenshot_saved_text" msgid="1152839647677558815">"ប៉ះ ដើម្បីមើលរូបថតអេក្រង់របស់អ្នក។"</string>
<string name="screenshot_failed_title" msgid="705781116746922771">"មិនអាចចាប់យករូបថតអេក្រង់។"</string>
<string name="screenshot_failed_text" msgid="1260203058661337274">"មិនអាចថតអេក្រង់ដោយសារតែទំហំផ្ទុកមានដែនកំណត់ ឬវាមិនត្រូវបានអនុញ្ញាតដោយកម្មវិធី ឬស្ថាប័នរបស់អ្នក។"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"ថយក្រោយ"</string>
<string name="accessibility_home" msgid="8217216074895377641">"គេហទំព័រ"</string>
<string name="accessibility_menu" msgid="316839303324695949">"ម៉ឺនុយ"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"ទិដ្ឋភាព"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"ស្វែងរក"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"ម៉ាស៊ីនថត"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"ទូរស័ព្ទ"</string>
@@ -151,7 +152,7 @@
<string name="accessibility_remove_notification" msgid="3603099514902182350">"សម្អាតការជូនដំណឹង។"</string>
<string name="accessibility_gps_enabled" msgid="3511469499240123019">"បានបើក GPS ។"</string>
<string name="accessibility_gps_acquiring" msgid="8959333351058967158">"ទទួល GPS ។"</string>
- <string name="accessibility_tty_enabled" msgid="4613200365379426561">"បានបើកម៉ាស៊ីនអង្គុលីលេខ"</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"បានបើកម៉ាស៊ីនអង្គុលីលេខ"</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"កម្មវិធីរោទ៍ញ័រ។"</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"កម្មវិធីរោទ៍ស្ងាត់។"</string>
<!-- no translation found for accessibility_casting (6887382141726543668) -->
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ការកំណត់រហ័ស។"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ចាក់សោអេក្រង់។"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ការកំណត់"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ទិដ្ឋភាព។"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"អ្នកប្រើ <xliff:g id="USER">%s</xliff:g> ។"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"បានបិទវ៉ាយហ្វាយ។"</string>
@@ -234,7 +234,7 @@
<string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"បញ្ឈរ"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"ទេសភាព"</string>
<string name="quick_settings_ime_label" msgid="7073463064369468429">"វិធីសាស្ត្របញ្ចូល"</string>
- <string name="quick_settings_location_label" msgid="5011327048748762257">"ទីតាំង"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"ទីតាំង"</string>
<string name="quick_settings_location_off_label" msgid="7464544086507331459">"ទីតាំងបានបិទ"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"ឧបករណ៍មេឌៀ"</string>
<string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
@@ -278,11 +278,11 @@
<string name="recents_lock_to_app_button_label" msgid="4793991421811647489">"ចាក់សោទៅកម្មវិធី"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"ស្វែងរក"</string>
<string name="recents_launch_error_message" msgid="2969287838120550506">"មិនអាចចាប់ផ្ដើម <xliff:g id="APP">%s</xliff:g> ទេ។"</string>
- <string name="expanded_header_battery_charged" msgid="5945855970267657951">"បានបញ្ចូលថ្ម"</string>
+ <string name="expanded_header_battery_charged" msgid="5945855970267657951">"បានបញ្ចូលថ្ម"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"កំពុងបញ្ចូលថ្ម"</string>
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> រហូតដល់ពេញ"</string>
<string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"មិនកំពុងបញ្ចូលថ្ម"</string>
- <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"បណ្ដាញអាច\nត្រូវបានត្រួតពិនិត្យ"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"បណ្ដាញអាច\nត្រូវបានត្រួតពិនិត្យ"</string>
<string name="description_target_search" msgid="3091587249776033139">"ស្វែងរក"</string>
<string name="description_direction_up" msgid="7169032478259485180">"រុញឡើងលើដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
<string name="description_direction_left" msgid="7207478719805562165">"រុញទៅឆ្វេងដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml
index a1ac544..e61f89a 100644
--- a/packages/SystemUI/res/values-kn-rIN/strings.xml
+++ b/packages/SystemUI/res/values-kn-rIN/strings.xml
@@ -49,7 +49,7 @@
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"ಮ್ಯೂಟ್"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ಸ್ವಯಂ"</string>
<string name="status_bar_settings_notifications" msgid="397146176280905137">"ಅಧಿಸೂಚನೆಗಳು"</string>
- <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth ವ್ಯಾಪ್ತಿ ತಲುಪಿದೆ"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"ಬ್ಲೂಟೂತ್ ವ್ಯಾಪ್ತಿ ತಲುಪಿದೆ"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ಇನ್ಪುಟ್ ವಿಧಾನಗಳನ್ನು ಹೊಂದಿಸು"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ಭೌತಿಕ ಕೀಬೋರ್ಡ್"</string>
<string name="usb_device_permission_prompt" msgid="834698001271562057">"USB ಸಾಧನವನ್ನು ಪ್ರವೇಶಿಸಲು <xliff:g id="APPLICATION">%1$s</xliff:g> ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುವುದೇ?"</string>
@@ -91,8 +91,8 @@
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ಇನ್ಪುಟ್ ವಿಧಾನ ಬದಲಿಸು ಬಟನ್."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ಹೊಂದಾಣಿಕೆಯ ಝೂಮ್ ಬಟನ್."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ಚಿಕ್ಕ ಪರದೆಯಿಂದ ದೊಡ್ಡ ಪರದೆಗೆ ಝೂಮ್ ಮಾಡು."</string>
- <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth ಸಂಪರ್ಕಗೊಂಡಿದೆ."</string>
- <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ಬ್ಲೂಟೂತ್ ಸಂಪರ್ಕಗೊಂಡಿದೆ."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"ಬ್ಲೂಟೂತ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ."</string>
<string name="accessibility_no_battery" msgid="358343022352820946">"ಬ್ಯಾಟರಿ ಇಲ್ಲ."</string>
<string name="accessibility_battery_one_bar" msgid="7774887721891057523">"ಬ್ಯಾಟರಿ ಒಂದು ಪಟ್ಟಿ."</string>
<string name="accessibility_battery_two_bars" msgid="8500650438735009973">"ಬ್ಯಾಟರಿ ಎರಡು ಪಟ್ಟಿಗಳು."</string>
@@ -108,12 +108,12 @@
<string name="accessibility_data_two_bars" msgid="6166018492360432091">"ಡೇಟಾ ಎರಡು ಪಟ್ಟಿಗಳು."</string>
<string name="accessibility_data_three_bars" msgid="9167670452395038520">"ಡೇಟಾ ಮೂರು ಪಟ್ಟಿಗಳು."</string>
<string name="accessibility_data_signal_full" msgid="2708384608124519369">"ಡೇಟಾ ಸಂಕೇತ ತುಂಬಿದೆ."</string>
- <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi ಆಫ್."</string>
- <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wifi ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ."</string>
- <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Wifi ಒಂದು ಪಟ್ಟಿ."</string>
- <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Wifi ಎರಡು ಪಟ್ಟಿಗಳು."</string>
- <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"Wifi ಮೂರು ಪಟ್ಟಿಗಳು."</string>
- <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Wifi ಸಿಗ್ನಲ್ ಪೂರ್ತಿ ಇದೆ."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"ವೈಫೈ ಆಫ್."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"ವೈಫೈ ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"ವೈಫೈ ಒಂದು ಪಟ್ಟಿ."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"ವೈಫೈ ಎರಡು ಪಟ್ಟಿಗಳು."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"ವೈಫೈ ಮೂರು ಪಟ್ಟಿಗಳು."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"ವೈಫೈ ಸಿಗ್ನಲ್ ಪೂರ್ತಿ ಇದೆ."</string>
<string name="accessibility_wifi_name" msgid="7202151365171148501">"<xliff:g id="WIFI">%s</xliff:g> ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ."</string>
<string name="accessibility_bluetooth_name" msgid="8441517146585531676">"<xliff:g id="BLUETOOTH">%s</xliff:g> ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ."</string>
<string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX ಸಂಕೇತವಿಲ್ಲ."</string>
@@ -143,8 +143,8 @@
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"ರೋಮಿಂಗ್"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"ಎಡ್ಜ್"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
- <string name="accessibility_no_sim" msgid="8274017118472455155">"ಯಾವುದೇ SIM ಇಲ್ಲ."</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth ಟೆಥರಿಂಗ್."</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"ಯಾವುದೇ ಸಿಮ್ ಇಲ್ಲ."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ಬ್ಲೂಟೂತ್ ಟೆಥರಿಂಗ್."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ಏರೋಪ್ಲೇನ್ ಮೋಡ್"</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"ಬ್ಯಾಟರಿ <xliff:g id="NUMBER">%d</xliff:g> ಪ್ರತಿಶತ."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್ಗಳು."</string>
@@ -168,8 +168,8 @@
<string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ಅವಲೋಕನ."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ಬಳಕೆದಾರ <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"Wifi ಆನ್ ಮಾಡಲಾಗಿದೆ."</string>
+ <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ವೈಫೈ ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string>
+ <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"ವೈಫೈ ಆನ್ ಮಾಡಲಾಗಿದೆ."</string>
<string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"ಮೊಬೈಲ್ <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"ಬ್ಯಾಟರಿ <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"ಏರ್ಪ್ಲೇನ್ ಮೋಡ್ ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string>
@@ -179,7 +179,7 @@
<string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"ಬ್ಲೂಟೂತ್ ಆಫ್ ಆಗಿದೆ."</string>
<string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"ಬ್ಲೂಟೂತ್ ಆನ್ ಆಗಿದೆ."</string>
<string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"ಬ್ಲೂಟೂತ್ ಸಂಪರ್ಕಪಡಿಸಲಾಗುತ್ತಿದೆ."</string>
- <string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"Bluetooth ಸಂಪರ್ಕಗೊಂಡಿದೆ."</string>
+ <string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"ಬ್ಲೂಟೂತ್ ಸಂಪರ್ಕಗೊಂಡಿದೆ."</string>
<string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"ಬ್ಲೂಟೂತ್ ಆಫ್ ಮಾಡಲಾಗಿದೆ."</string>
<string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಲಾಗಿದೆ."</string>
<string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"ಸ್ಥಳ ವರದಿಮಾಡುವಿಕೆಯು ಆಫ್ ಆಗಿದೆ."</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index b91259e..845a11e 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"앱 정보"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"여기에 최근 화면이 표시됩니다."</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"최근에 사용한 앱 숨기기"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"최근 사용에 화면 1개"</item>
+ <item quantity="other" msgid="5523506463832158203">"최근 사용에 화면 %d개"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"알림 없음"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"진행 중"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"알림"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"뒤로"</string>
<string name="accessibility_home" msgid="8217216074895377641">"홈"</string>
<string name="accessibility_menu" msgid="316839303324695949">"메뉴"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"최근 사용"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"검색"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"카메라"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"전화"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"빠른 설정"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"화면을 잠급니다."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"설정"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"최근 사용"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"사용자 <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi가 사용 중지되었습니다."</string>
diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml
index fa8cfb9..45ed9bf 100644
--- a/packages/SystemUI/res/values-ky-rKG/strings.xml
+++ b/packages/SystemUI/res/values-ky-rKG/strings.xml
@@ -27,8 +27,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Колдонмо тууралуу"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Акыркы экрандарыңыз бул жерден көрүнөт"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Акыркы колдонмолорду жок кылуу"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"1 экран Көз жүгүртүүдө"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d экран Көз жүгүртүүдө"</item>
+ </plurals>
<!-- no translation found for status_bar_no_notifications_title (4755261167193833213) -->
<skip />
<!-- no translation found for status_bar_ongoing_events_title (1682504513316879202) -->
@@ -103,8 +105,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Артка"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Үйгө"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Меню"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"Көз жүгүртүү"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Издөө"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Камера"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Телефон"</string>
@@ -189,8 +190,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Тез тууралоолор."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Кулпуланган экран."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Жөндөөлөр"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Көз жүгүртүү."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Колдонуучу <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi өчүрүлдү."</string>
diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml
index ac4a0d0..4218fd1 100644
--- a/packages/SystemUI/res/values-lo-rLA/strings.xml
+++ b/packages/SystemUI/res/values-lo-rLA/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ຂໍ້ມູນແອັບຯ"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Your recent screens appear here"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ປິດແອັບຯຫຼ້າສຸດທີ່ໃຊ້"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"1 ໜ້າຈໍຢູ່ໃນພາບຮວມ"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d ໜ້າຈໍຢູ່ໃນພາບຮວມ"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ບໍ່ມີການແຈ້ງເຕືອນ"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ດຳເນີນຢູ່"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"ການແຈ້ງເຕືອນ"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"ກັບຄືນ"</string>
<string name="accessibility_home" msgid="8217216074895377641">"ໜ້າທຳອິດ"</string>
<string name="accessibility_menu" msgid="316839303324695949">"ເມນູ"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"ພາບຮວມ"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"ຊອກຫາ"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"ກ້ອງ"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"ໂທລະສັບ"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ການຕັ້ງຄ່າດ່ວນ."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ລັອກໜ້າຈໍ."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ການຕັ້ງຄ່າ"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ພາບຮວມ."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ຜູ່ໃຊ້ <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ປິດ Wi-Fi ແລ້ວ."</string>
@@ -312,7 +312,7 @@
<string name="guest_exit_guest" msgid="7187359342030096885">"ລຶບແຂກ"</string>
<string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"ລຶບແຂກບໍ?"</string>
<string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"ແອັບຯແລະຂໍ້ມູນທັງໝົດໃນເຊດຊັນນີ້ຈະຖືກລຶບອອກ."</string>
- <string name="guest_exit_guest_dialog_remove" msgid="7402231963862520531">"ລຶບ"</string>
+ <string name="guest_exit_guest_dialog_remove" msgid="7402231963862520531">"ລຶບ"</string>
<string name="guest_wipe_session_title" msgid="6419439912885956132">"ຍິນດີຕ້ອນຮັບກັບມາ, ຜູ່ຢ້ຽມຢາມ!"</string>
<string name="guest_wipe_session_message" msgid="8476238178270112811">"ທ່ານຕ້ອງການສືບຕໍ່ເຊດຊັນຂອງທ່ານບໍ່?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"ເລີ່ມຕົ້ນໃຫມ່"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 28eb9c9..24945ca 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -41,7 +41,7 @@
<string name="battery_low_why" msgid="4553600287639198111">"Nustatymai"</string>
<string name="battery_saver_confirmation_title" msgid="5299585433050361634">"Įjungti Akumuliatoriaus tausojimo priemonę?"</string>
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"Įjungti"</string>
- <string name="battery_saver_start_action" msgid="5576697451677486320">"Įjungti Akumuliatoriaus tausojimo priemonę"</string>
+ <string name="battery_saver_start_action" msgid="5576697451677486320">"Įj. Akum. tausojimo priemonę"</string>
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Nustatymai"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Lėktuvo režimas"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index b97a176..e00514f 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Jūsu pēdējie ekrāni tiek rādīti šeit."</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Nerādīt nesen izmantotās lietotnes"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"1 ekrāns sadaļā “Kopsavilkums”"</item>
- <item quantity="other" msgid="5523506463832158203">"%d ekrāni sadaļā “Kopsavilkums”"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 ekrāns sadaļā “Pārskats”"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d ekrāni sadaļā “Pārskats”"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nav paziņojumu"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Notiekošs"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Atpakaļ"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Sākums"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Izvēlne"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"Kopsavilkums"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"Pārskats"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Meklēt"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Tālruņa numurs"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Ātrie iestatījumi"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Bloķēšanas ekrāns."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Iestatījumi"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Kopsavilkums."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Pārskats."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Lietotājs: <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi ir izslēgts."</string>
diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml
index 36b36cd..8084c5d 100644
--- a/packages/SystemUI/res/values-ml-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ml-rIN/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"നിങ്ങളുടെ പുതിയ സ്ക്രീനുകൾ ഇവിടെ ദൃശ്യമാകുന്നു"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"സമീപകാല അപ്ലിക്കേഷനുകൾ നിരസിക്കുക"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"ചുരുക്കവിവരണത്തിലെ ഒരു സ്ക്രീൻ"</item>
- <item quantity="other" msgid="5523506463832158203">"ചുരുക്കവിവരണത്തിലെ %d സ്ക്രീനുകൾ"</item>
+ <item quantity="one" msgid="3969335317929254918">"കാഴ്ചയിലെ ഒരു സ്ക്രീൻ"</item>
+ <item quantity="other" msgid="5523506463832158203">"കാഴ്ചയിലെ %d സ്ക്രീനുകൾ"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"അറിയിപ്പുകൾ ഒന്നുമില്ല"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"നടന്നുകൊണ്ടിരിക്കുന്നവ"</string>
@@ -44,12 +44,12 @@
<string name="battery_saver_start_action" msgid="5576697451677486320">"ബാറ്ററി സേവർ ഓണാക്കുക"</string>
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ക്രമീകരണങ്ങൾ"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
- <string name="status_bar_settings_airplane" msgid="4879879698500955300">"വിമാന മോഡ്"</string>
+ <string name="status_bar_settings_airplane" msgid="4879879698500955300">"ഫ്ലൈറ്റ് മോഡ്"</string>
<string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"സ്ക്രീൻ യാന്ത്രികമായി തിരിക്കുക"</string>
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"മ്യൂട്ടുചെയ്യുക"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"യാന്ത്രികം"</string>
<string name="status_bar_settings_notifications" msgid="397146176280905137">"അറിയിപ്പുകൾ"</string>
- <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth ടെതർ ചെയ്തു"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"ബ്ലൂടൂത്ത് ടെതർ ചെയ്തു"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ടൈപ്പുചെയ്യൽ രീതികൾ സജ്ജീകരിക്കുക"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ഭൗതിക കീബോർഡ്"</string>
<string name="usb_device_permission_prompt" msgid="834698001271562057">"USB ഉപകരണം ആക്സസ്സ് ചെയ്യാൻ <xliff:g id="APPLICATION">%1$s</xliff:g> എന്ന അപ്ളിക്കേഷനെ അനുവദിക്കണോ?"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"മടങ്ങുക"</string>
<string name="accessibility_home" msgid="8217216074895377641">"ഹോം"</string>
<string name="accessibility_menu" msgid="316839303324695949">"മെനു"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"ചുരുക്കവിവരണം"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"കാഴ്ച"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"തിരയൽ"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"ക്യാമറ"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"ഫോണ്"</string>
@@ -91,8 +91,8 @@
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ടൈപ്പുചെയ്യൽ രീതി ബട്ടൺ മാറുക."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"അനുയോജ്യതാ സൂം ബട്ടൺ."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ചെറുതിൽ നിന്ന് വലിയ സ്ക്രീനിലേക്ക് സൂം ചെയ്യുക."</string>
- <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth കണക്റ്റുചെയ്തു."</string>
- <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth വിച്ഛേദിച്ചു."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ബ്ലൂടൂത്ത് കണക്റ്റുചെയ്തു."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"ബ്ലൂടൂത്ത് വിച്ഛേദിച്ചു."</string>
<string name="accessibility_no_battery" msgid="358343022352820946">"ബാറ്ററിയില്ല."</string>
<string name="accessibility_battery_one_bar" msgid="7774887721891057523">"ബാറ്ററി ഒരു ബാർ."</string>
<string name="accessibility_battery_two_bars" msgid="8500650438735009973">"ബാറ്ററി രണ്ട് ബാർ."</string>
@@ -108,12 +108,12 @@
<string name="accessibility_data_two_bars" msgid="6166018492360432091">"ഡാറ്റ രണ്ട് ബാറുകൾ."</string>
<string name="accessibility_data_three_bars" msgid="9167670452395038520">"ഡാറ്റ മൂന്ന് ബാർ."</string>
<string name="accessibility_data_signal_full" msgid="2708384608124519369">"ഡാറ്റ സിഗ്നൽ പൂർണ്ണമാണ്."</string>
- <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi ഓഫാണ്."</string>
- <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wifi വിച്ഛേദിച്ചു."</string>
- <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Wifi ഒരു ബാർ."</string>
- <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Wifi രണ്ട് ബാറുകൾ."</string>
- <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"Wifi മൂന്ന് ബാറുകൾ."</string>
- <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Wifi മികച്ച സിഗ്നൽ."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"വൈഫൈ ഓഫാണ്."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"വൈഫൈ വിച്ഛേദിച്ചു."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"വൈഫൈ ഒരു ബാർ."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"വൈഫൈ രണ്ട് ബാറുകൾ."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"വൈഫൈ മൂന്ന് ബാറുകൾ."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"വൈഫൈ മികച്ച സിഗ്നൽ."</string>
<string name="accessibility_wifi_name" msgid="7202151365171148501">"<xliff:g id="WIFI">%s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തു."</string>
<string name="accessibility_bluetooth_name" msgid="8441517146585531676">"<xliff:g id="BLUETOOTH">%s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തു."</string>
<string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX ഇല്ല."</string>
@@ -143,9 +143,9 @@
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"റോമിംഗ്"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
- <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM ഇല്ല."</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth ടെതറിംഗ്."</string>
- <string name="accessibility_airplane_mode" msgid="834748999790763092">"വിമാന മോഡ്."</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"സിം ഇല്ല."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ബ്ലൂടൂത്ത് ടെതറിംഗ്."</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"ഫ്ലൈറ്റ് മോഡ്."</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"ബാറ്ററി <xliff:g id="NUMBER">%d</xliff:g> ശതമാനം."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"സിസ്റ്റം ക്രമീകരണങ്ങൾ."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"അറിയിപ്പുകൾ."</string>
@@ -165,23 +165,23 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ദ്രുത ക്രമീകരണങ്ങൾ."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ലോക്ക് സ്ക്രീൻ."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ക്രമീകരണങ്ങൾ"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ചുരുക്കവിവരണം."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"കാഴ്ച."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ഉപയോക്താവ് <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi ഓഫാക്കി."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"Wifi ഓണാക്കി."</string>
+ <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"വൈഫൈ ഓഫാക്കി."</string>
+ <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"വൈഫൈ ഓണാക്കി."</string>
<string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"മൊബൈൽ <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"ബാറ്ററി <xliff:g id="STATE">%s</xliff:g>."</string>
- <string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"വിമാന മോഡ് ഓഫാണ്."</string>
- <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"വിമാന മോഡ് ഓണാണ്."</string>
- <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"വിമാന മോഡ് ഓഫാക്കി."</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"വിമാന മോഡ് ഓണാക്കി."</string>
- <string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"Bluetooth ഓഫാണ്."</string>
- <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"Bluetooth ഓണാണ്."</string>
- <string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"Bluetooth കണക്റ്റുചെയ്യുന്നു."</string>
- <string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"Bluetooth കണക്റ്റുചെയ്തു."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"Bluetooth ഓഫാക്കി."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"Bluetooth ഓണാക്കി."</string>
+ <string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"ഫ്ലൈറ്റ് മോഡ് ഓഫാണ്."</string>
+ <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"ഫ്ലൈറ്റ് മോഡ് ഓണാണ്."</string>
+ <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"ഫ്ലൈറ്റ് മോഡ് ഓഫാക്കി."</string>
+ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"ഫ്ലൈറ്റ് മോഡ് ഓണാക്കി."</string>
+ <string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"ബ്ലൂടൂത്ത് ഓഫാണ്."</string>
+ <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"ബ്ലൂടൂത്ത് ഓണാണ്."</string>
+ <string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"ബ്ലൂടൂത്ത് കണക്റ്റുചെയ്യുന്നു."</string>
+ <string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"ബ്ലൂടൂത്ത് കണക്റ്റുചെയ്തു."</string>
+ <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"ബ്ലൂടൂത്ത് ഓഫാക്കി."</string>
+ <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"ബ്ലൂടൂത്ത് ഓണാക്കി."</string>
<string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"ലൊക്കേഷൻ റിപ്പോർട്ടുചെയ്യൽ ഓഫാണ്."</string>
<string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"ലൊക്കേഷൻ റിപ്പോർട്ടുചെയ്യൽ ഓണാണ്."</string>
<string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"ലൊക്കേഷൻ റിപ്പോർട്ടുചെയ്യൽ ഓഫാക്കി."</string>
@@ -223,10 +223,10 @@
<string name="dessert_case" msgid="1295161776223959221">"ഡെസേർട്ട് കെയ്സ്"</string>
<string name="start_dreams" msgid="7219575858348719790">"ഡേഡ്രീം"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ഇതർനെറ്റ്"</string>
- <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"വിമാന മോഡ്"</string>
- <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
- <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> ഉപകരണങ്ങൾ)"</string>
- <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth ഓഫുചെയ്യുക"</string>
+ <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"ഫ്ലൈറ്റ് മോഡ്"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ബ്ലൂടൂത്ത്"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ബ്ലൂടൂത്ത് (<xliff:g id="NUMBER">%d</xliff:g> ഉപകരണങ്ങൾ)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"ബ്ലൂടൂത്ത് ഓഫുചെയ്യുക"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"ജോടിയാക്കിയ ഉപകരണങ്ങളൊന്നും ലഭ്യമല്ല"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"തെളിച്ചം"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ഓട്ടോ റൊട്ടേറ്റ്"</string>
@@ -299,7 +299,7 @@
<string name="phone_hint" msgid="3101468054914424646">"ഫോണിനായി വലതുവശത്ത് സ്വൈപ്പുചെയ്യുക"</string>
<string name="camera_hint" msgid="5241441720959174226">"ക്യാമറയ്ക്കായി ഇടതുവശത്ത് സ്വൈപ്പുചെയ്യുക"</string>
<string name="interruption_level_none" msgid="3831278883136066646">"ഒന്നുമില്ല"</string>
- <string name="interruption_level_priority" msgid="6517366750688942030">"മുന്ഗണന"</string>
+ <string name="interruption_level_priority" msgid="6517366750688942030">"പ്രധാനപ്പെട്ടവ"</string>
<string name="interruption_level_all" msgid="1330581184930945764">"എല്ലാം"</string>
<string name="keyguard_indication_charging_time" msgid="1757251776872835768">"ചാർജ്ജുചെയ്യുന്നു (പൂർണ്ണമാകുന്നതിന്, <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>)"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ഉപയോക്താവ് മാറുക"</string>
@@ -348,7 +348,7 @@
<string name="monitoring_description_vpn_device_and_profile_owned" msgid="9193588924767232909">"ഈ ഉപകരണത്തെ നിയന്ത്രിക്കുന്നത്:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nനിങ്ങളുടെ പ്രൊഫൈൽ നിയന്ത്രിക്കുന്നത്:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\nഇമെയിലുകൾ, അപ്ലിക്കേഷനുകൾ, സുരക്ഷാ വെബ്സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാൻ നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ പ്രാപ്തനാണ്. കൂടുതൽ വിവരങ്ങൾക്ക് അഡ്മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക.\n\nഒരു VPN കണക്ഷൻ സജ്ജമാക്കാൻ \"<xliff:g id="APPLICATION">%3$s</xliff:g>\" അനുമതിയും നിങ്ങൾ നൽകി. നെറ്റ്വർക്കും പ്രവർത്തനവും നിരീക്ഷിക്കാൻ ഈ അപ്ലിക്കേഷനാകും."</string>
<string name="monitoring_description_legacy_vpn_device_and_profile_owned" msgid="6935475023447698473">"ഈ ഉപകരണത്തെ നിയന്ത്രിക്കുന്നത്:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nനിങ്ങളുടെ പ്രൊഫൈൽ നിയന്ത്രിക്കുന്നത്:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\nഇമെയിലുകൾ, അപ്ലിക്കേഷനുകൾ, സുരക്ഷാ വെബ്സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാൻ നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ പ്രാപ്തനാണ്.\n\nഒരു VPN-ലേക്കും (\"<xliff:g id="APPLICATION">%3$s</xliff:g>\")കണക്റ്റുചെയ്തിരിക്കുന്നു. നിങ്ങളുടെ VPN സേവന ദാതാവിന് നെറ്റ്വർക്ക് പ്രവർത്തനവും നിരീക്ഷിക്കാനാകും."</string>
<string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"നിങ്ങൾ സ്വമേധയാ അൺലോക്കുചെയ്യുന്നതുവരെ ഉപകരണം ലോക്കുചെയ്തതായി തുടരും"</string>
- <string name="hidden_notifications_title" msgid="7139628534207443290">"അറിയിപ്പുകൾ വേഗത്തിൽ നേടുക"</string>
+ <string name="hidden_notifications_title" msgid="7139628534207443290">"അറിയിപ്പുകൾ വേഗത്തിൽ സ്വീകരിക്കുക"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"അൺലോക്കുചെയ്യുന്നതിന് മുമ്പ് അവ കാണുക"</string>
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"വേണ്ട, നന്ദി"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"സജ്ജീകരിക്കുക"</string>
diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml
index f530da5..63b2c89 100644
--- a/packages/SystemUI/res/values-mr-rIN/strings.xml
+++ b/packages/SystemUI/res/values-mr-rIN/strings.xml
@@ -43,13 +43,13 @@
<string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"चालू करा"</string>
<string name="battery_saver_start_action" msgid="5576697451677486320">"बॅटरी बचतकर्ता चालू करा"</string>
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"सेटिंग्ज"</string>
- <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"वाय-फाय"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"विमान मोड"</string>
<string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"स्वयं-फिरणारी स्क्रीन"</string>
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"नि:शब्द करा"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"स्वयं"</string>
<string name="status_bar_settings_notifications" msgid="397146176280905137">"सूचना"</string>
- <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth टिथर केले"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"ब टिथर केले"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"इनपुट पद्धती सेट करा"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"वास्तविक कीबोर्ड"</string>
<string name="usb_device_permission_prompt" msgid="834698001271562057">"USB डिव्हाइसवर प्रवेश करण्यासाठी <xliff:g id="APPLICATION">%1$s</xliff:g> अॅप ला अनुमती द्यायची?"</string>
@@ -91,8 +91,8 @@
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"इनपुट पद्धत स्विच करा बटण."</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"सुसंगतता झूम बटण."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"लहानपासून मोठ्या स्क्रीनवर झूम करा."</string>
- <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth कनेक्ट केले."</string>
- <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"Bluetooth डिस्कनेक्ट केले."</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ब कनेक्ट केले."</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"ब डिस्कनेक्ट केले."</string>
<string name="accessibility_no_battery" msgid="358343022352820946">"बॅटरी नाही."</string>
<string name="accessibility_battery_one_bar" msgid="7774887721891057523">"बॅटरी एक बार."</string>
<string name="accessibility_battery_two_bars" msgid="8500650438735009973">"बॅटरी दोन बार."</string>
@@ -108,12 +108,12 @@
<string name="accessibility_data_two_bars" msgid="6166018492360432091">"डेटा दोन बार."</string>
<string name="accessibility_data_three_bars" msgid="9167670452395038520">"डेटा तीन बार."</string>
<string name="accessibility_data_signal_full" msgid="2708384608124519369">"डेटा सिग्नल पूर्ण."</string>
- <string name="accessibility_wifi_off" msgid="3177380296697933627">"WiFi बंद."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"वायफाय बंद."</string>
<string name="accessibility_no_wifi" msgid="1425476551827924474">"WIFI डिस्कनेक्ट झाले."</string>
- <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"WiFi एक बार."</string>
- <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"WiFi दोन बार."</string>
- <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"WiFi तीन बार."</string>
- <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"WiFi सिग्नल पूर्ण."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"वायफाय एक बार."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"वायफाय दोन बार."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"वायफाय तीन बार."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"वायफाय सिग्नल पूर्ण."</string>
<string name="accessibility_wifi_name" msgid="7202151365171148501">"<xliff:g id="WIFI">%s</xliff:g> शी कनेक्ट केले."</string>
<string name="accessibility_bluetooth_name" msgid="8441517146585531676">"<xliff:g id="BLUETOOTH">%s</xliff:g> शी कनेक्ट केले."</string>
<string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX नाही."</string>
@@ -142,9 +142,9 @@
<string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"रोमिंग"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
- <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"वाय-फाय"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"सिम नाही."</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth टिथरिंग."</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ब टिथरिंग."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"विमान मोड."</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"बॅटरी <xliff:g id="NUMBER">%d</xliff:g> टक्के."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"सिस्टम सेटिंग्ज."</string>
@@ -176,12 +176,12 @@
<string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"विमान मोड चालू."</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"विमान मोड बंद केला."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"विमान मोड चालू केला."</string>
- <string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"Bluetooth बंद."</string>
- <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"Bluetooth चालू."</string>
- <string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"Bluetooth कनेक्ट करत आहे."</string>
- <string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"Bluetooth कनेक्ट केले."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"Bluetooth बंद केले."</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"Bluetooth चालू केले."</string>
+ <string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"ब बंद."</string>
+ <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"ब चालू."</string>
+ <string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"ब कनेक्ट करत आहे."</string>
+ <string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"ब कनेक्ट केले."</string>
+ <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"ब बंद केले."</string>
+ <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"ब चालू केले."</string>
<string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"स्थान अहवाल बंद."</string>
<string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"स्थान अहवाल चालू."</string>
<string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"स्थान अहवाल बंद केला."</string>
@@ -207,7 +207,7 @@
<string name="data_usage_disabled_dialog" msgid="6468718338038876604">"डेटाने आपण सेट केलेली मर्यादा गाठल्यामुळे आपल्या डिव्हाइसने तो बंद केला.\n\n तो पुन्हा चालू केल्यास आपल्या वाहकाकडील शुल्क लागू शकेल."</string>
<string name="data_usage_disabled_dialog_enable" msgid="5538068036107372895">"डेटा चालू करा"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"इंटरनेट कनेक्शन नाही"</string>
- <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi कनेक्ट केले"</string>
+ <string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"वाय-फाय कनेक्ट केले"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS शोधत आहे"</string>
<string name="gps_notification_found_text" msgid="4619274244146446464">"GPS द्वारे स्थान सेट केले"</string>
<string name="accessibility_location_active" msgid="2427290146138169014">"स्थान विनंत्या सक्रिय"</string>
@@ -224,9 +224,9 @@
<string name="start_dreams" msgid="7219575858348719790">"डेड्रीम"</string>
<string name="ethernet_label" msgid="7967563676324087464">"इथरनेट"</string>
<string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"विमान मोड"</string>
- <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
- <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> डिव्हाइसेस)"</string>
- <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth बंद"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ब"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ब (<xliff:g id="NUMBER">%d</xliff:g> डिव्हाइसेस)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"ब बंद"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"कोणतेही जोडलेले डिव्हाइसेस उपलब्ध नाहीत"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"चमक"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"स्वयं-फिरवा"</string>
@@ -244,10 +244,10 @@
<string name="quick_settings_user_label" msgid="5238995632130897840">"मी"</string>
<string name="quick_settings_user_title" msgid="4467690427642392403">"वापरकर्ता"</string>
<string name="quick_settings_user_new_user" msgid="9030521362023479778">"नवीन वापरकर्ता"</string>
- <string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"वाय-फाय"</string>
<string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"कनेक्ट केले नाही"</string>
<string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"नेटवर्क नाही"</string>
- <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi बंद"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"वाय-फाय बंद"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="2831702993995222755">"कोणतीही जतन केलेली नेटवर्क उपलब्ध नाहीत"</string>
<string name="quick_settings_cast_title" msgid="1893629685050355115">"स्क्रीन कास्ट करा"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"कास्ट करत आहे"</string>
diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml
index c074ee8..93fea9f 100644
--- a/packages/SystemUI/res/values-ms-rMY/strings.xml
+++ b/packages/SystemUI/res/values-ms-rMY/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Maklumat aplikasi"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Skrin terbaru anda terpapar di sini"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Buang aplikasi terbaharu"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"1 skrin dalam Gambaran Keseluruhan"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d skrin dalam Gambaran Keseluruhan"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Tiada pemberitahuan"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Sedang berlangsung"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Pemberitahuan"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Kembali"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Rumah"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"Gambaran keseluruhan"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Cari"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Tetapan pantas."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Kunci skrin."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Tetapan"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Gambaran keseluruhan."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Pengguna <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi dimatikan."</string>
diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml
index 489b26c..6c573d6 100644
--- a/packages/SystemUI/res/values-my-rMM/strings.xml
+++ b/packages/SystemUI/res/values-my-rMM/strings.xml
@@ -26,37 +26,37 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"သင်၏ မကြာမီက မျက်နှာပြင်များ ဒီမှာ ပေါ်လာကြမည်"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"လတ်တလောအပ်ပလီကေးရှင်းများအား ဖယ်ထုတ်မည်"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"ခြုံကြည့်မှု ထဲက မျက်နှာပြင် ၁ ခု"</item>
- <item quantity="other" msgid="5523506463832158203">"ခြုံကြည့်မှု ထဲက မျက်နှာပြင် %d ခု"</item>
+ <item quantity="one" msgid="3969335317929254918">"ခြုံကြည့်မှု ထဲက မျက်နှာပြင် ၁ ခု"</item>
+ <item quantity="other" msgid="5523506463832158203">"ခြုံကြည့်မှု ထဲက မျက်နှာပြင် %d ခု"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"အကြောင်းကြားချက်များ မရှိ"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"လက်ရှိအသုံးပြုမှု"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"အကြောင်းကြားချက်များ။"</string>
<string name="battery_low_title" msgid="6456385927409742437">"ဘက်ထရီ အားနည်းနေ"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> ကျန်ရှိနေ"</string>
- <string name="battery_low_percent_format_saver_started" msgid="6859235584035338833">"<xliff:g id="PERCENTAGE">%s</xliff:g> ကျန်ရှိနေ။ ဘက်ထရီ ချွေတာမှု ဖွင့်ထား။"</string>
+ <string name="battery_low_percent_format_saver_started" msgid="6859235584035338833">"<xliff:g id="PERCENTAGE">%s</xliff:g> ကျန်ရှိနေ။ ဘက်ထရီ ချွေတာမှု ဖွင့်ထား။"</string>
<string name="invalid_charger" msgid="4549105996740522523">"လက်ရှိUSBအားသွင်းခြင်း အသုံးမပြုနိုင်ပါ \n ပေးထားသောအားသွင်းကိရိယာကိုသာ အသုံးပြုပါ"</string>
<string name="invalid_charger_title" msgid="3515740382572798460">"USB အားသွင်းမှု မပံ့ပိုးပါ။"</string>
- <string name="invalid_charger_text" msgid="5474997287953892710">"ပေးခဲ့သည့် အားသွင်းစက်ကိုသာ အသုံးပြုပါ"</string>
+ <string name="invalid_charger_text" msgid="5474997287953892710">"ပေးခဲ့သည့် အားသွင်းစက်ကိုသာ အသုံးပြုပါ"</string>
<string name="battery_low_why" msgid="4553600287639198111">"ဆက်တင်များ"</string>
- <string name="battery_saver_confirmation_title" msgid="5299585433050361634">"ဘက်ထရီ ချွေတာမှုကို ဖွင့်ရမလား?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"ဖွင့်ရန်"</string>
- <string name="battery_saver_start_action" msgid="5576697451677486320">"ဘက်ထရီ ချွေတာမှုကို ဖွင့်ရန်"</string>
+ <string name="battery_saver_confirmation_title" msgid="5299585433050361634">"ဘက်ထရီ ချွေတာမှုကို ဖွင့်ရမလား?"</string>
+ <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"ဖွင့်ရန်"</string>
+ <string name="battery_saver_start_action" msgid="5576697451677486320">"ဘက်ထရီ ချွေတာမှုကို ဖွင့်ရန်"</string>
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"အပြင်အဆင်များ"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"ဝိုင်ဖိုင်"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"လေယာဥ်ပျံပေါ်အသုံးပြုသောစနစ်"</string>
- <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"မျက်နှာပြင်အလိုအလျောက်လှည့်ရန်"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"မျက်နှာပြင်အလိုအလျောက်လှည့်ရန်"</string>
<string name="status_bar_settings_mute_label" msgid="554682549917429396">"MUTE"</string>
<string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string>
<string name="status_bar_settings_notifications" msgid="397146176280905137">"သတိပေးချက်များ"</string>
- <string name="bluetooth_tethered" msgid="7094101612161133267">"ဘလူးတုသ်မှတဆင့်ပြန်လည်ချိတ်ဆက်ခြင်း"</string>
- <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ထည့်သွင်းနည်းများ သတ်မှတ်ခြင်း"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"ဘလူးတုသ်မှတဆင့်ပြန်လည်ချိတ်ဆက်ခြင်း"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ထည့်သွင်းနည်းများ သတ်မှတ်ခြင်း"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ခလုတ်ပါဝင်သော ကီးဘုတ်"</string>
- <string name="usb_device_permission_prompt" msgid="834698001271562057">"<xliff:g id="APPLICATION">%1$s</xliff:g>အပ်ပလီကေးရှင်းအား USBပစ္စည်းကို ချိတ်ဆက်ရန်ခွင့်ပြုမည်လား"</string>
- <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"<xliff:g id="APPLICATION">%1$s</xliff:g> အပ်ပလီကေးရှင်းကို USB တွဲဖက်ပစ္စည်းများအား ဝင်ရောက်ကြည့်ရှုရန်ခွင့်ပြုသည်"</string>
- <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"<xliff:g id="ACTIVITY">%1$s</xliff:g> အားUSBပစ္စည်း ချိတ်ဆက်နေစဥ် ဖွင့်မည်လား"</string>
- <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"<xliff:g id="ACTIVITY">%1$s</xliff:g> အား USBတွဲဖက်ပစ္စည်း ချိတ်ဆက်ထားစဥ် ဖွင့်မည်"</string>
- <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ဒီUSBပစ္စည်းနှင့်ဘယ်အပ်ပလီကေးရှင်းမှ အလုပ်မလုပ်ပါ။ ပိုမိုသိရန် <xliff:g id="URL">%1$s</xliff:g>တွင် လေ့လာပါ"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"<xliff:g id="APPLICATION">%1$s</xliff:g>အပ်ပလီကေးရှင်းအား USBပစ္စည်းကို ချိတ်ဆက်ရန်ခွင့်ပြုမည်လား"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"<xliff:g id="APPLICATION">%1$s</xliff:g> အပ်ပလီကေးရှင်းကို USB တွဲဖက်ပစ္စည်းများအား ဝင်ရောက်ကြည့်ရှုရန်ခွင့်ပြုသည်"</string>
+ <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"<xliff:g id="ACTIVITY">%1$s</xliff:g> အားUSBပစ္စည်း ချိတ်ဆက်နေစဥ် ဖွင့်မည်လား"</string>
+ <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"<xliff:g id="ACTIVITY">%1$s</xliff:g> အား USBတွဲဖက်ပစ္စည်း ချိတ်ဆက်ထားစဥ် ဖွင့်မည်"</string>
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ဒီUSBပစ္စည်းနှင့်ဘယ်အပ်ပလီကေးရှင်းမှ အလုပ်မလုပ်ပါ။ ပိုမိုသိရန် <xliff:g id="URL">%1$s</xliff:g>တွင် လေ့လာပါ"</string>
<string name="title_usb_accessory" msgid="4966265263465181372">"USBတွဲဖက်ပစ္စည်းများ"</string>
<string name="label_view" msgid="6304565553218192990">"မြင်ကွင်း"</string>
<string name="always_use_device" msgid="1450287437017315906">"ဤUSBပစ္စည်းများအတွက် မူရင်းအတိုင်း အသုံးပြုပါ။"</string>
@@ -64,31 +64,31 @@
<string name="usb_debugging_title" msgid="4513918393387141949">"USB အမှားရှာဖွေပြင်ဆင်ခြင်း ခွင့်ပြုပါမည်လား?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"ဒီကွန်ပျူတာရဲ့ RSA key fingerprint ကတော့:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g> ဖြစ်ပါသည်"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"ဒီကွန်ပျူတာမှ အမြဲခွင့်ပြုရန်"</string>
- <string name="compat_mode_on" msgid="6623839244840638213">"ဖန်သားပြင်ပြည့် ချဲ့ခြင်း"</string>
- <string name="compat_mode_off" msgid="4434467572461327898">"ဖန်သားပြင်အပြည့်ဆန့်ခြင်း"</string>
+ <string name="compat_mode_on" msgid="6623839244840638213">"ဖန်သားပြင်ပြည့် ချဲ့ခြင်း"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"ဖန်သားပြင်အပြည့်ဆန့်ခြင်း"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"ဖန်သားပြင်ဓါတ်ပုံသိမ်းစဉ်.."</string>
<string name="screenshot_saving_title" msgid="8242282144535555697">"ဖန်သားပြင်ဓါတ်ပုံရိုက်ခြင်းအား သိမ်းဆည်းပါမည်"</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"ဖန်သားပြင်ဓါတ်ပုံရိုက်ခြင်းအား သိမ်းဆည်းပြီးပါပြီ"</string>
<string name="screenshot_saved_title" msgid="6461865960961414961">"ဖန်သားပြင်ဓါတ်ပုံရိုက်ခြင်းအား ဖမ်းယူပြီး"</string>
- <string name="screenshot_saved_text" msgid="1152839647677558815">"သင့်ဖန်သားပြင်ဓါတ်ပုံရိုက်ခြင်းအား ကြည့်ရှုရန် ထိပါ"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"သင့်ဖန်သားပြင်ဓါတ်ပုံရိုက်ခြင်းအား ကြည့်ရှုရန် ထိပါ"</string>
<string name="screenshot_failed_title" msgid="705781116746922771">"ဖန်သားပြင်ဓါတ်ပုံရိုက်ခြင်းအား မဖမ်းစီးနိုင်ပါ"</string>
- <string name="screenshot_failed_text" msgid="1260203058661337274">"မျက်နှာပြင်လျှပ်တပြက်ပုံကို မရုက်နိုင်ခဲ့ပါ၊ သိုလှောင်မှု နေရာ အကန့်အသတ် ရှိနေ၍ သို့မဟုတ် app သို့မဟုတ် သင်၏ အဖွဲ့အစည်းက ခွင့်မပြု၍ ဖြစ်နိုင်သည်။"</string>
+ <string name="screenshot_failed_text" msgid="1260203058661337274">"မျက်နှာပြင်လျှပ်တပြက်ပုံကို မရုက်နိုင်ခဲ့ပါ၊ သိုလှောင်မှု နေရာ အကန့်အသတ် ရှိနေ၍ သို့မဟုတ် app သို့မဟုတ် သင်၏ အဖွဲ့အစည်းက ခွင့်မပြု၍ ဖြစ်နိုင်သည်။"</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB ဖိုင်ပြောင်း ရွေးမှုများ"</string>
- <string name="use_mtp_button_title" msgid="4333504413563023626">"မီဒီယာပလေရာအနေဖြင့် တပ်ဆင်ရန် (MTP)"</string>
- <string name="use_ptp_button_title" msgid="7517127540301625751">"ကင်မရာအနေဖြင့် တပ်ဆင်ရန် (PTP)"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"မီဒီယာပလေရာအနေဖြင့် တပ်ဆင်ရန် (MTP)"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"ကင်မရာအနေဖြင့် တပ်ဆင်ရန် (PTP)"</string>
<string name="installer_cd_button_title" msgid="2312667578562201583">"Macအတွက်Andriodဖိုင်ပြောင်းအပ်ပလီကေးရှင်းထည့်ခြင်း"</string>
<string name="accessibility_back" msgid="567011538994429120">"နောက်သို့"</string>
<string name="accessibility_home" msgid="8217216074895377641">"ပင်မစာမျက်နှာ"</string>
<string name="accessibility_menu" msgid="316839303324695949">"မီနူး"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"ခြုံကြည့်မှု။"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"ခြုံကြည့်မှု။"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"ရှာဖွေရန်"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"ကင်မရာ"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"ဖုန်း"</string>
<string name="accessibility_unlock_button" msgid="128158454631118828">"သော့ဖွင့်ရန်"</string>
- <string name="unlock_label" msgid="8779712358041029439">"သော့ဖွင့်ရန်"</string>
- <string name="phone_label" msgid="2320074140205331708">"ဖုန်းကို ဖွင့်ရန်"</string>
- <string name="camera_label" msgid="7261107956054836961">"ကင်မရာ ဖွင့်ရန်"</string>
- <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ထည့်သွင်းခြင်းခလုတ်အား ပြောင်းခြင်း"</string>
+ <string name="unlock_label" msgid="8779712358041029439">"သော့ဖွင့်ရန်"</string>
+ <string name="phone_label" msgid="2320074140205331708">"ဖုန်းကို ဖွင့်ရန်"</string>
+ <string name="camera_label" msgid="7261107956054836961">"ကင်မရာ ဖွင့်ရန်"</string>
+ <string name="accessibility_ime_switch_button" msgid="5032926134740456424">"ထည့်သွင်းခြင်းခလုတ်အား ပြောင်းခြင်း"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"အံ့ဝင်သောချုံ့ချဲ့ခလုတ်"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ဖန်သားပြင်ပေါ်တွင် အသေးမှအကြီးသို့ချဲ့ခြင်း"</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ဘလူးတုသ်ချိတ်ဆက်ထားမှု"</string>
@@ -97,17 +97,17 @@
<string name="accessibility_battery_one_bar" msgid="7774887721891057523">"ဘတ္တရီတစ်ဘား။"</string>
<string name="accessibility_battery_two_bars" msgid="8500650438735009973">"ဘတ္တရီနှစ်ဘား။"</string>
<string name="accessibility_battery_three_bars" msgid="2302983330865040446">"ဘတ္တရီသုံးဘား။"</string>
- <string name="accessibility_battery_full" msgid="8909122401720158582">"ဘတ္တရီအပြည့်။"</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"ဘတ္တရီအပြည့်။"</string>
<string name="accessibility_no_phone" msgid="4894708937052611281">"ဖုန်းလိုင်းမရှိပါ။"</string>
<string name="accessibility_phone_one_bar" msgid="687699278132664115">"ဖုန်းလိုင်းတစ်ဘား။"</string>
<string name="accessibility_phone_two_bars" msgid="8384905382804815201">"ဖုန်းလိုင်းနှစ်ဘား။"</string>
<string name="accessibility_phone_three_bars" msgid="8521904843919971885">"ဖုန်းလိုင်းသုံးဘား။"</string>
- <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"ဖုန်းလိုင်းအပြည့်။"</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"ဖုန်းလိုင်းအပြည့်။"</string>
<string name="accessibility_no_data" msgid="4791966295096867555">"ဒေတာမရှိပါ။"</string>
<string name="accessibility_data_one_bar" msgid="1415625833238273628">"ဒေတာတစ်ဘား။"</string>
- <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ဒေတာထုတ်လွှင့်မှု ၂ဘားဖမ်းမိခြင်း။"</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ဒေတာထုတ်လွှင့်မှု ၂ဘားဖမ်းမိခြင်း။"</string>
<string name="accessibility_data_three_bars" msgid="9167670452395038520">"ဒေတာသုံးဘား။"</string>
- <string name="accessibility_data_signal_full" msgid="2708384608124519369">"ဒေတာထုတ်လွှင့်မှုအပြည့်ဖမ်းမိခြင်း"</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"ဒေတာထုတ်လွှင့်မှုအပြည့်ဖမ်းမိခြင်း"</string>
<string name="accessibility_wifi_off" msgid="3177380296697933627">"ဝိုင်ဖိုင် မရှိ"</string>
<string name="accessibility_no_wifi" msgid="1425476551827924474">"ဝိုင်ဖိုင် ချိတ်ဆက်ထားမှု မရှိပါ"</string>
<string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"ဝိုင်ဖိုင် ၁ ဘားရှိ"</string>
@@ -127,7 +127,7 @@
<string name="accessibility_one_bar" msgid="1685730113192081895">"တစ်တုံး"</string>
<string name="accessibility_two_bars" msgid="6437363648385206679">"၂ ဘား"</string>
<string name="accessibility_three_bars" msgid="2648241415119396648">"၃ ဘား"</string>
- <string name="accessibility_signal_full" msgid="9122922886519676839">"ဒေတာထုတ်လွှင့်မှုအပြည့်ဖမ်းမိခြင်း"</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"ဒေတာထုတ်လွှင့်မှုအပြည့်ဖမ်းမိခြင်း"</string>
<string name="accessibility_desc_on" msgid="2385254693624345265">"ဖွင့်ထားသည်"</string>
<string name="accessibility_desc_off" msgid="6475508157786853157">"ပိတ်ထားသည်"</string>
<string name="accessibility_desc_connected" msgid="8366256693719499665">"ဆက်သွယ်ထားပြီး"</string>
@@ -144,7 +144,7 @@
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"EDGE"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"ဝိုင်ဖိုင်"</string>
<string name="accessibility_no_sim" msgid="8274017118472455155">"ဆင်းကဒ်မရှိပါ။"</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ဘလူးတုသ်မှတဆင့်ပြန်လည်ချိတ်ဆက်ခြင်း"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ဘလူးတုသ်မှတဆင့်ပြန်လည်ချိတ်ဆက်ခြင်း"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"လေယာဥ်ပျံပေါ်အသုံးပြုသောစနစ်။"</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"ဘတ္တရီ <xliff:g id="NUMBER">%d</xliff:g> ရာခိုင်နှုန်း။"</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"စနစ်အပြင်အဆင်များ"</string>
@@ -165,47 +165,47 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"အမြန်လုပ် အပြင်အဆင်"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"မျက်နှာပြင် သော့ပိတ်ရန်"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ဆက်တင်များ"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ခြုံကြည့်မှု။"</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ခြုံကြည့်မှု။"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"သုံးစွဲသူ <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>။"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ကြိုးမဲ့ ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"ကြိုးမဲ့ ဖွင့်ထား။"</string>
+ <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"ကြိုးမဲ့ ဖွင့်ထား။"</string>
<string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"မိုဘိုင်းလ် <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"ဘက်ထရီ <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"လေယာဉ် မုဒ် ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"လေယာဉ် မုဒ်ကို ဖွင့်ထား။"</string>
+ <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"လေယာဉ် မုဒ်ကို ဖွင့်ထား။"</string>
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"လေယာဉ် မုဒ်ကို ပိတ်ထားလိုက်ပြီ။"</string>
- <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"လေယာဉ် မုဒ်ကို ဖွင့်ထားလိုက်ပြီ။"</string>
+ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"လေယာဉ် မုဒ်ကို ဖွင့်ထားလိုက်ပြီ။"</string>
<string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"ဘလူးတုသ် ပိတ်ထား."</string>
- <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"ဘလူးတုသ် ဖွင့်ထား။"</string>
+ <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"ဘလူးတုသ် ဖွင့်ထား။"</string>
<string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"ဘလူးတုသ် ချိတ်ဆက်နေ။"</string>
<string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"ဘလူးတုသ် ချိတ်ဆက်ထား။"</string>
<string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"ဘလူးတုသ် ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"ဘလူးတုသ် ဖွင့်ထား။"</string>
+ <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"ဘလူးတုသ် ဖွင့်ထား။"</string>
<string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"တည်နေရာ သတင်းပို့မှု ပိတ်ရန်။"</string>
- <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"တည်နေရာ သတင်းပို့မှု ဖွင့်ရန်။"</string>
+ <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"တည်နေရာ သတင်းပို့မှု ဖွင့်ရန်။"</string>
<string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"တည်နေရာ သတင်းပို့မှု ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"တည်နေရာ သတင်းပို့မှု ဖွင့်ထား။"</string>
+ <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"တည်နေရာ သတင်းပို့မှု ဖွင့်ထား။"</string>
<string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"နိုးစက်ပေးထားသော အချိန် <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_close" msgid="3115847794692516306">"ဘောင်ကွက် ပိတ်ရန်။"</string>
<string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"အချိန် တိုး"</string>
<string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"အချိန် လျှော့"</string>
<string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"ဖလက်ရှမီး ပိတ်ထား"</string>
- <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"ဖလက်ရှမီး ဖွင့်ထား။"</string>
+ <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"ဖလက်ရှမီး ဖွင့်ထား။"</string>
<string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"ဖလက်ရှမီး ပိတ်ထားသည်။"</string>
- <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"ဖလက်ရှမီး ဖွင့်ထားသည်။"</string>
+ <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"ဖလက်ရှမီး ဖွင့်ထားသည်။"</string>
<string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"အရောင် ပြောင်းပြန်လှန်မှု ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"အရောင် ပြောင်းပြန်လှန်မှု ဖွင့်ထား။"</string>
+ <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"အရောင် ပြောင်းပြန်လှန်မှု ဖွင့်ထား။"</string>
<string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"မိုဘိုင်း ဟော့စပေါ့ ပိတ်ထား။"</string>
- <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"မိုဘိုင်း ဟော့စပေါ့ ဖွင့်ထား။"</string>
+ <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"မိုဘိုင်း ဟော့စပေါ့ ဖွင့်ထား။"</string>
<string name="accessibility_casting_turned_off" msgid="1430668982271976172">"မျက်နှာပြင် ကာစ်တင် လုပ်မှု ရပ်လိုက်ပြီ။"</string>
<string name="accessibility_brightness" msgid="8003681285547803095">"တောက်ပမှုကို ပြရန်"</string>
<string name="data_usage_disabled_dialog_3g_title" msgid="2626865386971800302">"2G-3G ဒေတာ ပိတ်ထား"</string>
<string name="data_usage_disabled_dialog_4g_title" msgid="4629078114195977196">"4G ဒေတာ ပိတ်ထား"</string>
<string name="data_usage_disabled_dialog_mobile_title" msgid="5793456071535876132">"ဆယ်လူလာ ဒေတာကို ပိတ်ထား"</string>
<string name="data_usage_disabled_dialog_title" msgid="8723412000355709802">"ဒေတာ ပိတ်ထား"</string>
- <string name="data_usage_disabled_dialog" msgid="6468718338038876604">"သင်၏ ကိရိယာသည် သင်က သတ်မှတ်ခဲ့သည့် ကန့်သတ်ချက်ကို ပြည့်မီသွား၍ ပိတ်သွားသည်။ \n\n၎င်းကို ပြန်ပြီး ဖွင့်မှုအတွက် သင်၏ စီမံပေးသူ ထံမှ ငွေတောင်းခံ လာနိုင်ပါသည်။"</string>
- <string name="data_usage_disabled_dialog_enable" msgid="5538068036107372895">"ဒေတာ ဖွင့်ပေးရန်"</string>
+ <string name="data_usage_disabled_dialog" msgid="6468718338038876604">"သင်၏ ကိရိယာသည် သင်က သတ်မှတ်ခဲ့သည့် ကန့်သတ်ချက်ကို ပြည့်မီသွား၍ ပိတ်သွားသည်။ \n\n၎င်းကို ပြန်ပြီး ဖွင့်မှုအတွက် သင်၏ စီမံပေးသူ ထံမှ ငွေတောင်းခံ လာနိုင်ပါသည်။"</string>
+ <string name="data_usage_disabled_dialog_enable" msgid="5538068036107372895">"ဒေတာ ဖွင့်ပေးရန်"</string>
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"အင်တာနက်မရှိ"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"ကြိုးမဲ့ဆက်သွယ်မှု"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"GPSအားရှာဖွေသည်"</string>
@@ -227,13 +227,13 @@
<string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ဘလူးတု"</string>
<string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ဘလူးတု (<xliff:g id="NUMBER">%d</xliff:g> စက်များ)"</string>
<string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"ဘလူးတု ပိတ်ထားရန်"</string>
- <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"ချိတ်တွဲထားသည့် ကိရိယာများ မရှိ"</string>
+ <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"ချိတ်တွဲထားသည့် ကိရိယာများ မရှိ"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"အလင်းတောက်ပမှု"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"အော်တို-လည်"</string>
<string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"လည်မှု သော့ပိတ်ထား"</string>
<string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"ဒေါင်လိုက်"</string>
<string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"ဘေးတိုက်"</string>
- <string name="quick_settings_ime_label" msgid="7073463064369468429">"ထည့်သွင်းရန်နည်းလမ်း"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"ထည့်သွင်းရန်နည်းလမ်း"</string>
<string name="quick_settings_location_label" msgid="5011327048748762257">"တည်နေရာ"</string>
<string name="quick_settings_location_off_label" msgid="7464544086507331459">"တည်နေရာပြမှု မရှိ"</string>
<string name="quick_settings_media_device_label" msgid="1302906836372603762">"မီဒီယာ စက်ပစ္စည်း"</string>
@@ -252,7 +252,7 @@
<string name="quick_settings_cast_title" msgid="1893629685050355115">"ကာစ်တ် မျက်နှာပြင်"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"ကာစ်တင်"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"အမည်မတပ် ကိရိယာ"</string>
- <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ကာစ်တ် လုပ်ရန် အသင့် ရှိနေပြီ"</string>
+ <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"ကာစ်တ် လုပ်ရန် အသင့် ရှိနေပြီ"</string>
<string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"ကိရိယာများ မရှိ"</string>
<string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"အလင်းတောက်ပမှု"</string>
<string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"အလိုအလျောက်"</string>
@@ -269,9 +269,9 @@
<string name="quick_settings_cellular_detail_title" msgid="8575062783675171695">"ဆယ်လူလာ ဒေတာ"</string>
<string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ဒေတာ သုံးစွဲမှု"</string>
<string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ကျန်ရှိ ဒေတာ"</string>
- <string name="quick_settings_cellular_detail_over_limit" msgid="3242930457130971204">"ကန့်သတ်ချက် ပြည့်မီသွားပြီ - ဒေတာ သုံးစွဲမှု ဆိုင်းငံ့ထားပြီ"</string>
+ <string name="quick_settings_cellular_detail_over_limit" msgid="3242930457130971204">"ကန့်သတ်ချက် ပြည့်မီသွားပြီ - ဒေတာ သုံးစွဲမှု ဆိုင်းငံ့ထားပြီ"</string>
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> သုံးထား"</string>
- <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ကန့်သတ်ချက်"</string>
+ <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ကန့်သတ်ချက်"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> သတိပေးချက်"</string>
<string name="recents_empty_message" msgid="8682129509540827999">"သင်၏ မကြာမီက မျက်နှာပြင်များ ဒီမှာ ပေါ်လာကြမည်"</string>
<string name="recents_app_info_button_label" msgid="2890317189376000030">"အပလီကေးရှင်း အင်ဖို"</string>
@@ -280,76 +280,76 @@
<string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> ကို မစနိုင်ပါ။"</string>
<string name="expanded_header_battery_charged" msgid="5945855970267657951">"အားသွင်းပြီး"</string>
<string name="expanded_header_battery_charging" msgid="205623198487189724">"အားသွင်းနေ"</string>
- <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ပြည်သည့် အထိ"</string>
+ <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ပြည်သည့် အထိ"</string>
<string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"အား မသွင်းပါ"</string>
<string name="ssl_ca_cert_warning" msgid="9005954106902053641">"ကွန်ယက်ကို\n စောင့်ကြည့်စစ်ဆေးခံရနိုင်သည်"</string>
<string name="description_target_search" msgid="3091587249776033139">"ရှာဖွေရန်"</string>
<string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် အပေါ်ကို ပွတ်ဆွဲပါ"</string>
<string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် ဖယ်ဘက်ကို ပွတ်ဆွဲပါ"</string>
<string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"ကြားဖြတ်ဝင်မှုများ မရှိခဲ့။ နှိုးစက်ပင် မရှိခဲ့။"</string>
- <string name="zen_no_interruptions" msgid="7970973750143632592">"ကြားဖြတ်ဝင်မှု ခွင့်မပြုရန်"</string>
+ <string name="zen_no_interruptions" msgid="7970973750143632592">"ကြားဖြတ်ဝင်မှု ခွင့်မပြုရန်"</string>
<string name="zen_important_interruptions" msgid="3477041776609757628">"ဦးစားပေး ကြားဖြတ်ဝင်မှုများ သာလျှင်"</string>
<string name="zen_alarm_information_time" msgid="5235772206174372272">"သင်၏ နောက် နှိုးစက်၏ အချိန်မှာ<xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
<string name="zen_alarm_information_day_time" msgid="8422733576255047893">"သင်၏ နောက် နှိုးစက်မှာ <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string>
<string name="zen_alarm_warning" msgid="6873910860111498041">"သင်သည် သင်၏ <xliff:g id="ALARM_TIME">%s</xliff:g> နှိုးစက်ကို ကြားရမည် မဟုတ်"</string>
<string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
- <string name="speed_bump_explanation" msgid="1288875699658819755">"အရေးပါမှု နည်းသည့် အကြောင်းကြားချက်များ အောက်မှာ"</string>
- <string name="notification_tap_again" msgid="8524949573675922138">"ဖွင့်ရန် ထပ်ပြီး ထိပါ"</string>
- <string name="keyguard_unlock" msgid="8043466894212841998">"သော့ဖွင့်ရန် အပေါ်သို့ ပွတ်ဆွဲပါ"</string>
+ <string name="speed_bump_explanation" msgid="1288875699658819755">"အရေးပါမှု နည်းသည့် အကြောင်းကြားချက်များ အောက်မှာ"</string>
+ <string name="notification_tap_again" msgid="8524949573675922138">"ဖွင့်ရန် ထပ်ပြီး ထိပါ"</string>
+ <string name="keyguard_unlock" msgid="8043466894212841998">"သော့ဖွင့်ရန် အပေါ်သို့ ပွတ်ဆွဲပါ"</string>
<string name="phone_hint" msgid="3101468054914424646">"ဖုန်း အတွက် ညာသို့ ပွတ်ဆွဲပါ"</string>
<string name="camera_hint" msgid="5241441720959174226">"ကင်မရာ အတွက် ဘယ်သို့ ပွတ်ဆွဲပါ"</string>
<string name="interruption_level_none" msgid="3831278883136066646">"မရှိ"</string>
<string name="interruption_level_priority" msgid="6517366750688942030">"ဦးစားပေးမှု"</string>
<string name="interruption_level_all" msgid="1330581184930945764">"အားလုံး"</string>
- <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"(<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> အပြည့် အထိ) အားသွင်းနေ"</string>
+ <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"(<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> အပြည့် အထိ) အားသွင်းနေ"</string>
<string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"အသုံးပြုသူကို ပြောင်းလဲရန်"</string>
<string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"အသုံးပြုသူကို ပြောင်းရန်၊ လက်ရှိ အသုံးပြုသူ <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
<string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"ပရိုဖိုင်ကို ပြရန်"</string>
<string name="user_add_user" msgid="5110251524486079492">"သုံးသူ ထပ်ထည့်ရန်"</string>
<string name="user_new_user_name" msgid="426540612051178753">"အသုံးပြုသူ အသစ်"</string>
- <string name="guest_nickname" msgid="8059989128963789678">"ဧည့်သည်"</string>
- <string name="guest_new_guest" msgid="600537543078847803">"ဧည့်သည့်ကို ထည့်ပေးရန်"</string>
- <string name="guest_exit_guest" msgid="7187359342030096885">"ဧည့်သည်ကို ဖယ်ထုတ်ရန်"</string>
- <string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"ဧည့်သည်ကို ဖယ်ထုတ်လိုက်ရမလား?"</string>
- <string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"ဒီချိတ်ဆက်မှု ထဲက appများ အားလုံး နှင့် ဒေတာကို ဖျက်ပစ်မည်။"</string>
+ <string name="guest_nickname" msgid="8059989128963789678">"ဧည့်သည်"</string>
+ <string name="guest_new_guest" msgid="600537543078847803">"ဧည့်သည့်ကို ထည့်ပေးရန်"</string>
+ <string name="guest_exit_guest" msgid="7187359342030096885">"ဧည့်သည်ကို ဖယ်ထုတ်ရန်"</string>
+ <string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"ဧည့်သည်ကို ဖယ်ထုတ်လိုက်ရမလား?"</string>
+ <string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"ဒီချိတ်ဆက်မှု ထဲက appများ အားလုံး နှင့် ဒေတာကို ဖျက်ပစ်မည်။"</string>
<string name="guest_exit_guest_dialog_remove" msgid="7402231963862520531">"ဖယ်ထုတ်ပါ"</string>
- <string name="guest_wipe_session_title" msgid="6419439912885956132">"ပြန်လာတာ ကြိုဆိုပါသည်၊ ဧည့်သည်!"</string>
+ <string name="guest_wipe_session_title" msgid="6419439912885956132">"ပြန်လာတာ ကြိုဆိုပါသည်၊ ဧည့်သည်!"</string>
<string name="guest_wipe_session_message" msgid="8476238178270112811">"သင်သည် သင်၏ ချိတ်ဆက်မှုကို ဆက်ပြုလုပ် လိုပါသလား?"</string>
<string name="guest_wipe_session_wipe" msgid="5065558566939858884">"အစမှ ပြန်စပါ"</string>
<string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ဟုတ်ကဲ့၊ ဆက်လုပ်ပါ"</string>
- <string name="user_add_user_title" msgid="4553596395824132638">"အသုံးပြုသူ အသစ်ကို ထည့်ရမလား?"</string>
- <string name="user_add_user_message_short" msgid="2161624834066214559">"သင်က အသုံးပြုသူ အသစ် တစ်ဦးကို ထည့်ပေးလိုက်လျှင်၊ ထိုသူသည် ၎င်း၏ နေရာကို သတ်မှတ်စီစဉ်ရန် လိုအပ်မည်။\n\n အသုံးပြုသူ မည်သူမဆို ကျန်အသုံးပြုသူ အားလုံးတို့အတွက် appများကို မွမ်းမံပေးနိုင်သည်။"</string>
- <string name="battery_saver_notification_title" msgid="237918726750955859">"ဘက်ထရီ ချွေတာသူ ဖွင့်ထား"</string>
- <string name="battery_saver_notification_text" msgid="820318788126672692">"လုပ်ကိုင်မှုကို လျှော့ချလျက် နောက်ခံ ဒေတာကို ကန့်သတ်သည်"</string>
+ <string name="user_add_user_title" msgid="4553596395824132638">"အသုံးပြုသူ အသစ်ကို ထည့်ရမလား?"</string>
+ <string name="user_add_user_message_short" msgid="2161624834066214559">"သင်က အသုံးပြုသူ အသစ် တစ်ဦးကို ထည့်ပေးလိုက်လျှင်၊ ထိုသူသည် ၎င်း၏ နေရာကို သတ်မှတ်စီစဉ်ရန် လိုအပ်မည်။\n\n အသုံးပြုသူ မည်သူမဆို ကျန်အသုံးပြုသူ အားလုံးတို့အတွက် appများကို မွမ်းမံပေးနိုင်သည်။"</string>
+ <string name="battery_saver_notification_title" msgid="237918726750955859">"ဘက်ထရီ ချွေတာသူ ဖွင့်ထား"</string>
+ <string name="battery_saver_notification_text" msgid="820318788126672692">"လုပ်ကိုင်မှုကို လျှော့ချလျက် နောက်ခံ ဒေတာကို ကန့်သတ်သည်"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"ဘက်ထရီ ချွေတာမှုကို ပိတ်ထားရန်"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"အကြောင်းအရာများ ဝှက်ထား"</string>
- <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> က သင်၏ မျက်နှာပြင် ပေါ်မှာ ပြသထားသည့် အရာတိုင်းကို စတင် ဖမ်းယူမည်။"</string>
+ <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> က သင်၏ မျက်နှာပြင် ပေါ်မှာ ပြသထားသည့် အရာတိုင်းကို စတင် ဖမ်းယူမည်။"</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"နောက်ထပ် မပြပါနှင့်"</string>
<string name="clear_all_notifications_text" msgid="814192889771462828">"အားလုံး ရှင်းလင်းရန်"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"ယခု စတင်ပါ"</string>
<string name="empty_shade_text" msgid="708135716272867002">"အကြောင်းကြားချက်များ မရှိ"</string>
- <string name="device_owned_footer" msgid="3802752663326030053">"ကိရိယာကို စောင့်ကြပ် နိုင်ပါသည်"</string>
- <string name="profile_owned_footer" msgid="8021888108553696069">"ပရိုဖိုင်ကို စောင့်ကြပ်နိုင်သည်"</string>
- <string name="vpn_footer" msgid="2388611096129106812">"ကွန်ရက်ကို ကို စောင့်ကြပ် နိုင်ပါသည်"</string>
+ <string name="device_owned_footer" msgid="3802752663326030053">"ကိရိယာကို စောင့်ကြပ် နိုင်ပါသည်"</string>
+ <string name="profile_owned_footer" msgid="8021888108553696069">"ပရိုဖိုင်ကို စောင့်ကြပ်နိုင်သည်"</string>
+ <string name="vpn_footer" msgid="2388611096129106812">"ကွန်ရက်ကို ကို စောင့်ကြပ် နိုင်ပါသည်"</string>
<string name="monitoring_title_device_owned" msgid="7121079311903859610">"ကိရိယာကို စောင့်ကြပ်ခြင်း"</string>
- <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ပရိုဖိုင် စောင့်ကြပ်မှု"</string>
+ <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ပရိုဖိုင် စောင့်ကြပ်မှု"</string>
<string name="monitoring_title" msgid="169206259253048106">"ကွန်ရက်ကို စောင့်ကြပ်ခြင်း"</string>
<string name="disable_vpn" msgid="4435534311510272506">"VPN ကို ပိတ်ထားရန်"</string>
<string name="disconnect_vpn" msgid="1324915059568548655">"VPN ကို အဆက်ဖြတ်ရန်"</string>
<string name="monitoring_description_device_owned" msgid="7512371572956715493">"ဤစက်ပစ္စည်းကို စီမံခန့်ခွဲသူ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင့်အက်ဒ်မင်သည် သင့်စက်ပစ္စည်းနှင့် အီးမေးများ၊ app များ နှင့် လုံခြုံသည့်ဝက်ဘ်ဆိုက် အပါအဝင် ကွန်ရက် လှုပ်ှရားမှုများကို စောင့်ကြည့်နိုင်သည်။\n\nနောက်ထပ်အချက်အလက်များအတွက်၊ သင့်အက်ဒ်မင်ကို ဆက်သွယ်ပါ။"</string>
<string name="monitoring_description_vpn" msgid="7288268682714305659">"သင် \"<xliff:g id="APPLICATION">%1$s</xliff:g>\" ကို VPN စတင်သုံးခွင့်ပေးလိုက်သည်။ \n\n ဤ app သည် သင့်စက်ပစ္စည်းနှင့် အီးမေးများ၊ app များ နှင့် လုံခြုံသည့်ဝက်ဘ်ဆိုက် အပါအဝင် ကွန်ရက် လှုပ်ှရားမှုများကို စောင့်ကြည့်နိုင်သည်။"</string>
<string name="monitoring_description_legacy_vpn" msgid="4740349017929725435">"VPN (\"<xliff:g id="APPLICATION">%1$s</xliff:g>\") ကို သင်ချိတ်ဆက်မိ၏။\n\nသင့် VPN ဝန်ဆောင်မှုပေးသူသည် သင့်စက်ပစ္စည်းနှင့် အီးမေးများ၊ app များ နှင့် လုံခြုံသည့်ဝက်ဘ်ဆိုက် အပါအဝင် ကွန်ရက် လှုပ်ှရားမှုများကို စောင့်ကြည့်နိုင်သည်။"</string>
- <string name="monitoring_description_vpn_device_owned" msgid="696121105616356493">"ဒီကိရိယာကို စီမံကွပ်ကဲသူမှာ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင်၏ စီမံအုပ်ချုပ်သူက သင်၏ ကွန်ရက် လှုပ်ရှားမှုကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို၊ စောင့်ကြပ် နိုင်ပါသည်။ အချက်အလက်များ ပိုပြီး ရယူရန်၊ သင်၏ စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။\n\n ထို့အပြင် သင်သည် \"<xliff:g id="APPLICATION">%2$s</xliff:g>\" အား VPN ချိတ်ဆက်မှု စဖွင့်လုပ်ကိုင်ရန် ခွင့်ပြုခဲ့သည်။ ဒီ appကပါ သင်၏ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ် နိုင်ပါသည်။"</string>
- <string name="monitoring_description_legacy_vpn_device_owned" msgid="649791650224064248">"ဒီကိရိယာကို စီမံကွပ်ကဲသူမှာ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင်၏ စီမံအုပ်ချုပ်သူက သင်၏ ကွန်ရက် လှုပ်ရှားမှုကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို၊ စောင့်ကြပ် နိုင်ပါသည်။ အချက်အလက်များ ပိုပြီး ရယူရန်၊ သင်၏ စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။\n\nထို့အပြင်၊ သင်သည် VPN (\"<xliff:g id="APPLICATION">%2$s</xliff:g>\") သို့ ချိတ်ဆက်ထားသည်။ သင်၏ VPN ဝန်ဆောင်မှုကို စီမံပေးသူကပါ ကွန်ရက် လှုပ်ရှားမှုများကို စောင့်ကြပ်နိုင်သေးသည်။"</string>
- <string name="monitoring_description_profile_owned" msgid="2370062794285691713">"ဒီပရိုဖိုင်ကို စီမံကွပ်ကဲပေးသူ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင်၏ စီမံအုပ်ချုပ်သူသည် သင်၏ ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှုများကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို၊ စောင့်ကြပ်နိုင်သည်။ \n\n နောက်ထပ် သိလိုလျှင်၊ သင်၏ စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။"</string>
- <string name="monitoring_description_device_and_profile_owned" msgid="8685301493845456293">"ဒီကိရိယာကို စီမံကွပ်ကဲပေးသူ:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nသင့် ပရိုဖိုင်ကို စီမံကွပ်ကဲပေးသူ:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\nသင်၏ စီမံအုပ်ချုပ်သူသည် သင်၏ ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှုများကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို၊ စောင့်ကြပ်နိုင်သည်။\n\nနောက်ထပ် သိလိုလျှင်၊ သင်၏ စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။"</string>
- <string name="monitoring_description_vpn_profile_owned" msgid="847491346263295767">"ပရိုဖိုင်ကို စီမံပေးသူ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင့် စီမံအုပ်ချုပ်သူက သင့် ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှုကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်၊ စောင့်ကြပ်နိုင်သည်။ ထပ် သိလိုလျှင်၊ သင့် စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။\n\n သင်သည် \"<xliff:g id="APPLICATION">%2$s</xliff:g>\" အား VPN ချိတ်ဆက်မှု ထူထောင်ခွင့် ပေးခဲ့သည်။ ဒီappကပါ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ်နိုင်သည်။"</string>
- <string name="monitoring_description_legacy_vpn_profile_owned" msgid="4095516964132237051">"ပရိုဖိုင်ကို စီမံပေးသူ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင့်စီမံအုပ်ချုပ်သူက သင့် ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှု၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို စောင့်ကြပ်နိုင်သည်။ ထပ် သိလိုလျှင်၊ သင့်စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။\n\nသင်သည် VPN (\"<xliff:g id="APPLICATION">%2$s</xliff:g>\") သို့ပါ ချိတ်ထားသည်။ သင်၏ VPN စီမံပေးသူကပါ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ်နိုင်သည်။"</string>
- <string name="monitoring_description_vpn_device_and_profile_owned" msgid="9193588924767232909">"ကိရိယာကို စီမံပေးသူ:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nသင့်ပရိုဖိုင်ကို စီမံပေးသူ:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\nသင့်စီမံအုပ်ချုပ်သူသည် သင့် ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှု၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို စောင့်ကြပ်နိုင်သည်။\n\nသင်သည် \"<xliff:g id="APPLICATION">%3$s</xliff:g>\"အား VPN ချိတ်ဆက်မှု ထူထောင်ခွင့် ပေးခဲ့သည်။ ဒီappကပါ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ်နိုင်သည်။"</string>
- <string name="monitoring_description_legacy_vpn_device_and_profile_owned" msgid="6935475023447698473">"ဒီကိရိယာ စီမံပေးသူ:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nသင့် ပရိုဖိုင် စီမံပေးသူ:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\n စီမံအုပ်ချုပ်သူသည် သင့် ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှု၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို စောင့်ကြပ်နိုင်သည်။\n\nထပ် သိလိုလျှင်၊ သင့်စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။ သင်သည် VPN (\"<xliff:g id="APPLICATION">%3$s</xliff:g>\") သို့ပါ ချိတ်ထားသည်။ သင်၏ VPN စီမံပေးသူကပါ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ်နိုင်သည်။"</string>
- <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"သင်က လက်ဖြင့် သော့မဖွင့်မချင်း ကိရိယာမှာ သော့ပိတ်လျက် ရှိနေမည်"</string>
+ <string name="monitoring_description_vpn_device_owned" msgid="696121105616356493">"ဒီကိရိယာကို စီမံကွပ်ကဲသူမှာ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင်၏ စီမံအုပ်ချုပ်သူက သင်၏ ကွန်ရက် လှုပ်ရှားမှုကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို၊ စောင့်ကြပ် နိုင်ပါသည်။ အချက်အလက်များ ပိုပြီး ရယူရန်၊ သင်၏ စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။\n\n ထို့အပြင် သင်သည် \"<xliff:g id="APPLICATION">%2$s</xliff:g>\" အား VPN ချိတ်ဆက်မှု စဖွင့်လုပ်ကိုင်ရန် ခွင့်ပြုခဲ့သည်။ ဒီ appကပါ သင်၏ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ် နိုင်ပါသည်။"</string>
+ <string name="monitoring_description_legacy_vpn_device_owned" msgid="649791650224064248">"ဒီကိရိယာကို စီမံကွပ်ကဲသူမှာ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင်၏ စီမံအုပ်ချုပ်သူက သင်၏ ကွန်ရက် လှုပ်ရှားမှုကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို၊ စောင့်ကြပ် နိုင်ပါသည်။ အချက်အလက်များ ပိုပြီး ရယူရန်၊ သင်၏ စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။\n\nထို့အပြင်၊ သင်သည် VPN (\"<xliff:g id="APPLICATION">%2$s</xliff:g>\") သို့ ချိတ်ဆက်ထားသည်။ သင်၏ VPN ဝန်ဆောင်မှုကို စီမံပေးသူကပါ ကွန်ရက် လှုပ်ရှားမှုများကို စောင့်ကြပ်နိုင်သေးသည်။"</string>
+ <string name="monitoring_description_profile_owned" msgid="2370062794285691713">"ဒီပရိုဖိုင်ကို စီမံကွပ်ကဲပေးသူ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင်၏ စီမံအုပ်ချုပ်သူသည် သင်၏ ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှုများကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို၊ စောင့်ကြပ်နိုင်သည်။ \n\n နောက်ထပ် သိလိုလျှင်၊ သင်၏ စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။"</string>
+ <string name="monitoring_description_device_and_profile_owned" msgid="8685301493845456293">"ဒီကိရိယာကို စီမံကွပ်ကဲပေးသူ:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nသင့် ပရိုဖိုင်ကို စီမံကွပ်ကဲပေးသူ:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\nသင်၏ စီမံအုပ်ချုပ်သူသည် သင်၏ ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှုများကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို၊ စောင့်ကြပ်နိုင်သည်။\n\nနောက်ထပ် သိလိုလျှင်၊ သင်၏ စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။"</string>
+ <string name="monitoring_description_vpn_profile_owned" msgid="847491346263295767">"ပရိုဖိုင်ကို စီမံပေးသူ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင့် စီမံအုပ်ချုပ်သူက သင့် ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှုကို၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်၊ စောင့်ကြပ်နိုင်သည်။ ထပ် သိလိုလျှင်၊ သင့် စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။\n\n သင်သည် \"<xliff:g id="APPLICATION">%2$s</xliff:g>\" အား VPN ချိတ်ဆက်မှု ထူထောင်ခွင့် ပေးခဲ့သည်။ ဒီappကပါ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ်နိုင်သည်။"</string>
+ <string name="monitoring_description_legacy_vpn_profile_owned" msgid="4095516964132237051">"ပရိုဖိုင်ကို စီမံပေးသူ:\n<xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nသင့်စီမံအုပ်ချုပ်သူက သင့် ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှု၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို စောင့်ကြပ်နိုင်သည်။ ထပ် သိလိုလျှင်၊ သင့်စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။\n\nသင်သည် VPN (\"<xliff:g id="APPLICATION">%2$s</xliff:g>\") သို့ပါ ချိတ်ထားသည်။ သင်၏ VPN စီမံပေးသူကပါ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ်နိုင်သည်။"</string>
+ <string name="monitoring_description_vpn_device_and_profile_owned" msgid="9193588924767232909">"ကိရိယာကို စီမံပေးသူ:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nသင့်ပရိုဖိုင်ကို စီမံပေးသူ:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\nသင့်စီမံအုပ်ချုပ်သူသည် သင့် ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှု၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို စောင့်ကြပ်နိုင်သည်။\n\nသင်သည် \"<xliff:g id="APPLICATION">%3$s</xliff:g>\"အား VPN ချိတ်ဆက်မှု ထူထောင်ခွင့် ပေးခဲ့သည်။ ဒီappကပါ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ်နိုင်သည်။"</string>
+ <string name="monitoring_description_legacy_vpn_device_and_profile_owned" msgid="6935475023447698473">"ဒီကိရိယာ စီမံပေးသူ:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>\nသင့် ပရိုဖိုင် စီမံပေးသူ:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>\n\n စီမံအုပ်ချုပ်သူသည် သင့် ကိရိယာ နှင့် ကွန်ရက် လှုပ်ရှားမှု၊ အီးမေးလ်များ၊ appများ နှင့် လုံခြုံသည့် ဝက်ဘ်ဆိုက်များ အပါအဝင်ကို စောင့်ကြပ်နိုင်သည်။\n\nထပ် သိလိုလျှင်၊ သင့်စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။ သင်သည် VPN (\"<xliff:g id="APPLICATION">%3$s</xliff:g>\") သို့ပါ ချိတ်ထားသည်။ သင်၏ VPN စီမံပေးသူကပါ ကွန်ရက် လှုပ်ရှားမှုကို စောင့်ကြပ်နိုင်သည်။"</string>
+ <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"သင်က လက်ဖြင့် သော့မဖွင့်မချင်း ကိရိယာမှာ သော့ပိတ်လျက် ရှိနေမည်"</string>
<string name="hidden_notifications_title" msgid="7139628534207443290">"အကြောင်းကြားချက်များ မြန်မြန်ရရန်"</string>
- <string name="hidden_notifications_text" msgid="2326409389088668981">"မဖွင့်ခင် ၎င်းတို့ကို ကြည့်ပါ"</string>
+ <string name="hidden_notifications_text" msgid="2326409389088668981">"မဖွင့်ခင် ၎င်းတို့ကို ကြည့်ပါ"</string>
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"မလိုအပ်ပါ"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"သတ်မှတ်ရန်"</string>
<string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> အသံပိတ်သည်"</string>
diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml
index 5e71e8d..153d48d 100644
--- a/packages/SystemUI/res/values-ne-rNP/strings.xml
+++ b/packages/SystemUI/res/values-ne-rNP/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"अनुप्रयोगको जानकारी"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"तपाईँको हालको स्क्रिन यहाँ प्रकट हुन्छ"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"नयाँ अनुप्रयोगहरू खारेज गर्नुहोस्"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"अवलोकन मा १ पर्दा"</item>
+ <item quantity="other" msgid="5523506463832158203">"अवलोकन मा %%d स्क्रीन"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"कुनै सूचनाहरू छैन"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"चलिरहेको"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"सूचनाहरू"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"पछाडि"</string>
<string name="accessibility_home" msgid="8217216074895377641">"गृह"</string>
<string name="accessibility_menu" msgid="316839303324695949">"मेनु"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"अवलोकन"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"खोज्नुहोस्"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"क्यामेरा"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"फोन"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"द्रुत सेटिङहरू"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"स्क्रीन बन्द गर्नुहोस्।"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"सेटिङहरू"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"अवलोकन।"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"प्रयोगकर्ता <xliff:g id="USER">%s</xliff:g>।"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>।"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"वाइफाइ बन्द गरियो।"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 468081f..703eb33 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informações do app"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Suas telas recentes aparecem aqui"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Dispensar apps recentes"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"1 tela em \"Visão geral\""</item>
+ <item quantity="other" msgid="5523506463832158203">"%d telas em \"Visão geral\""</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Sem notificações"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em andamento"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificações"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Voltar"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Página inicial"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"Visão geral"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Pesquisar"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Câmera"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Telefone"</string>
@@ -166,8 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Configurações rápidas."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Tela de bloqueio."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Configurações"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visão geral."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuário <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"O Wi-Fi foi desativado."</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 3a4b5c0..1276588 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informaţii despre aplicaţie"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Ecranele dvs. recente apar aici"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Renunţaţi la aplicaţiile recente"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"1 ecran în Vizualizare generală"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d ecrane în Vizualizare generală"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Nicio notificare"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"În desfăşurare"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificări"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Înapoi"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Ecranul de pornire"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Meniu"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"Vizualizare generală"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Căutați"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Cameră foto"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Setări rapide."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Ecranul de blocare."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Setări"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Vizualizare generală"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilizatorul <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Conexiunea prin Wi-Fi este dezactivată."</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 8053e71..9aa6531 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"О приложении"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Здесь будут показаны недавние приложения."</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Закрыть недавние приложения"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"Показан 1 экран."</item>
+ <item quantity="other" msgid="5523506463832158203">"Показано экранов: %d."</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Нет уведомлений"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Текущие"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Уведомления"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Назад"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Домой"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Меню"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"Обзор."</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Поиск"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Камера"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Телефон."</string>
@@ -166,8 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Быстрые настройки"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Заблокированный экран."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Настройки"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Обзор."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Пользователь <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Модуль Wi-Fi отключен."</string>
diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml
index f76e719..b194e78 100644
--- a/packages/SystemUI/res/values-si-rLK/strings.xml
+++ b/packages/SystemUI/res/values-si-rLK/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"යෙදුම් තොරතුරු"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"මෙහි ඔබගේ මෑතක තිර පෙන්නුම් කරයි"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"මෑත යෙදුම් ඉවතලන්න"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"දළ විශ්ලේෂණය තුළ 1 තීරයයි"</item>
+ <item quantity="other" msgid="5523506463832158203">"දළ විශ්ලේෂණය තුළ තීරයෙන් %d"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"දැනුම්දීම් නැත"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"දැනට පවතින"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"දැනුම්දීම්"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"ආපසු"</string>
<string name="accessibility_home" msgid="8217216074895377641">"මුල් පිටුව"</string>
<string name="accessibility_menu" msgid="316839303324695949">"මෙනුව"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"දළ විශ්ලේෂණය"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"සොයන්න"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"කැමරාව"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"දුරකථනය"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ක්ෂණික සැකසීම්."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"අගුළු තිරය."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"සැකසීම්"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"දළ විශ්ලේෂණය."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"පරිශීලකයා <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi අක්රියයි."</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 6ca0d9f..1933b90 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Vaše nedávne obrazovky sa zobrazia tu."</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Zatvoriť nedávne aplikácie"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"V Prehľade je 1 obrazovka"</item>
- <item quantity="other" msgid="5523506463832158203">"V Prehľade je niekoľko obrazoviek (počet: %d)"</item>
+ <item quantity="one" msgid="3969335317929254918">"Počet obrazoviek v Prehľade: 1"</item>
+ <item quantity="other" msgid="5523506463832158203">"Počet obrazoviek v Prehľade: %d"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Žiadne upozornenia"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Prebiehajúce"</string>
@@ -167,7 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Rýchle nastavenia."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Uzamknutá obrazovka"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Nastavenia"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Prehľad."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Prehľad"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Používateľ: <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Pripojenie Wi-Fi je vypnuté."</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index e0f8b3a..594b760 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -22,9 +22,9 @@
<string name="app_label" msgid="7164937344850004466">"Sistemski uporabniški vmesnik"</string>
<string name="status_bar_clear_all_button" msgid="7774721344716731603">"Počisti"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Odstrani s seznama"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Podatki o programu"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Podatki o aplikaciji"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Vaši nedavni zasloni so prikazani tu"</string>
- <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Zapre nedavne programe"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Zapre nedavne aplikacije"</string>
<plurals name="status_bar_accessibility_recent_apps">
<item quantity="one" msgid="3969335317929254918">"En zaslon v pregledu"</item>
<item quantity="other" msgid="5523506463832158203">"Št. zaslonov v pregledu: %d"</item>
@@ -52,8 +52,8 @@
<string name="bluetooth_tethered" msgid="7094101612161133267">"Internetna povezava prek Bluetootha"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Nastavi načine vnosa"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Fizična tipkovnica"</string>
- <string name="usb_device_permission_prompt" msgid="834698001271562057">"Želite programu <xliff:g id="APPLICATION">%1$s</xliff:g> dovoliti dostop do naprave USB?"</string>
- <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Želite dovoliti programu <xliff:g id="APPLICATION">%1$s</xliff:g> dostop do dodatka USB?"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"Želite aplikaciji <xliff:g id="APPLICATION">%1$s</xliff:g> dovoliti dostop do naprave USB?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Želite dovoliti aplikaciji <xliff:g id="APPLICATION">%1$s</xliff:g> dostop do dodatka USB?"</string>
<string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Želite, da se odpre <xliff:g id="ACTIVITY">%1$s</xliff:g>, ko priključite to napravo USB?"</string>
<string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Želite, da se odpre <xliff:g id="ACTIVITY">%1$s</xliff:g>, ko priključite ta dodatek USB?"</string>
<string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Namešč. prog. ne delujejo s tem dodatkom USB. Več o tem dodatku preberite na <xliff:g id="URL">%1$s</xliff:g>"</string>
@@ -158,7 +158,7 @@
<!-- no translation found for accessibility_casting (6887382141726543668) -->
<skip />
<string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Opusti aplikacijo <xliff:g id="APP">%s</xliff:g>."</string>
- <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Program <xliff:g id="APP">%s</xliff:g> je bil odstranjen."</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikacija <xliff:g id="APP">%s</xliff:g> je bila odstranjena."</string>
<string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Zaganjanje aplikacije <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Obvestilo je bilo odstranjeno."</string>
<string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Zaslon z obvestili."</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index d9a7de4..9718752 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Dina senaste skärmar visas här"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Avvisa nya appar"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"En skärm i översikten"</item>
- <item quantity="other" msgid="5523506463832158203">"%d skärmar i översikten"</item>
+ <item quantity="one" msgid="3969335317929254918">"En skärm i Översikten"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d skärmar i Översikten"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Inga aviseringar"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Pågående"</string>
diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml
index 158666c..7b629d7 100644
--- a/packages/SystemUI/res/values-ta-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ta-rIN/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"பயன்பாட்டுத் தகவல்"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"சமீபத்திய திரைகள் இங்கு தோன்றும்"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"சமீபத்திய பயன்பாடுகளை நிராகரி"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"மேலோட்டப் பார்வையில் 1 திரை"</item>
+ <item quantity="other" msgid="5523506463832158203">"மேலோட்டப் பார்வையில் %d திரைகள்"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"அறிவிப்புகள் இல்லை"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"செயலில் இருக்கும்"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"அறிவிப்புகள்"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"பின்செல்"</string>
<string name="accessibility_home" msgid="8217216074895377641">"முகப்பு"</string>
<string name="accessibility_menu" msgid="316839303324695949">"மெனு"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"மேலோட்டப் பார்வை"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"தேடு"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"கேமரா"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"ஃபோன்"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"உடனடி அமைப்பு."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"பூட்டுத் திரை."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"அமைப்பு"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"மேலோட்டப் பார்வை."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"பயனர் <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"வைஃபை முடக்கப்பட்டது."</string>
diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml
index 2fcded7..8e3faed 100644
--- a/packages/SystemUI/res/values-te-rIN/strings.xml
+++ b/packages/SystemUI/res/values-te-rIN/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"మీ ఇటీవలి స్క్రీన్లు ఇక్కడ కనిపిస్తాయి"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ఇటీవలి అనువర్తనాలను తీసివేయండి"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"స్థూలదృష్టిలో 1 స్క్రీన్ ఉంది"</item>
- <item quantity="other" msgid="5523506463832158203">"స్థూలదృష్టిలో %d స్క్రీన్లు ఉన్నాయి"</item>
+ <item quantity="one" msgid="3969335317929254918">"అవలోకనంలో 1 స్క్రీన్ ఉంది"</item>
+ <item quantity="other" msgid="5523506463832158203">"అవలోకనంలో %d స్క్రీన్లు ఉన్నాయి"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"నోటిఫికేషన్లు లేవు"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"కొనసాగుతున్నవి"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"వెనుకకు"</string>
<string name="accessibility_home" msgid="8217216074895377641">"హోమ్"</string>
<string name="accessibility_menu" msgid="316839303324695949">"మెను"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"స్థూలదృష్టి"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"అవలోకనం"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"శోధించు"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"కెమెరా"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"ఫోన్"</string>
@@ -108,12 +108,12 @@
<string name="accessibility_data_two_bars" msgid="6166018492360432091">"డేటా రెండు బార్లు."</string>
<string name="accessibility_data_three_bars" msgid="9167670452395038520">"డేటా మూడు బార్లు."</string>
<string name="accessibility_data_signal_full" msgid="2708384608124519369">"డేటా సిగ్నల్ సంపూర్ణంగా ఉంది."</string>
- <string name="accessibility_wifi_off" msgid="3177380296697933627">"Wifi ఆఫ్లో ఉంది."</string>
- <string name="accessibility_no_wifi" msgid="1425476551827924474">"Wifi డిస్కనెక్ట్ చేయబడింది."</string>
- <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"Wifi ఒక బార్ కలిగి ఉంది."</string>
- <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"Wifi రెండు బార్లు కలిగి ఉంది."</string>
- <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"Wifi మూడు బార్లు కలిగి ఉంది."</string>
- <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"Wifi సిగ్నల్ పూర్తిగా ఉంది."</string>
+ <string name="accessibility_wifi_off" msgid="3177380296697933627">"వైఫై ఆఫ్లో ఉంది."</string>
+ <string name="accessibility_no_wifi" msgid="1425476551827924474">"వైఫై డిస్కనెక్ట్ చేయబడింది."</string>
+ <string name="accessibility_wifi_one_bar" msgid="7735893178010724377">"వైఫై ఒక బార్ కలిగి ఉంది."</string>
+ <string name="accessibility_wifi_two_bars" msgid="4994274250497262434">"వైఫై రెండు బార్లు కలిగి ఉంది."</string>
+ <string name="accessibility_wifi_three_bars" msgid="3495755044276588384">"వైఫై మూడు బార్లు కలిగి ఉంది."</string>
+ <string name="accessibility_wifi_signal_full" msgid="6853561303586480376">"వైఫై సిగ్నల్ పూర్తిగా ఉంది."</string>
<string name="accessibility_wifi_name" msgid="7202151365171148501">"<xliff:g id="WIFI">%s</xliff:g>కి కనెక్ట్ చేయబడింది."</string>
<string name="accessibility_bluetooth_name" msgid="8441517146585531676">"<xliff:g id="BLUETOOTH">%s</xliff:g>కి కనెక్ట్ చేయబడింది."</string>
<string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX లేదు."</string>
@@ -143,7 +143,7 @@
<string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"రోమింగ్"</string>
<string name="accessibility_data_connection_edge" msgid="4477457051631979278">"ఎడ్జ్"</string>
<string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string>
- <string name="accessibility_no_sim" msgid="8274017118472455155">"SIM లేదు."</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"సిమ్ లేదు."</string>
<string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"బ్లూటూత్ టెథెరింగ్."</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"ఎయిర్ప్లేన్ మోడ్."</string>
<string name="accessibility_battery_level" msgid="7451474187113371965">"బ్యాటరీ <xliff:g id="NUMBER">%d</xliff:g> శాతం."</string>
@@ -165,11 +165,11 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"శీఘ్ర సెట్టింగ్లు."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"లాక్ స్క్రీన్."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"సెట్టింగ్లు"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"స్థూలదృష్టి."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"అవలోకనం."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"వినియోగదారు <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
- <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi ఆఫ్ చేయబడింది."</string>
- <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"Wifi ఆన్ చేయబడింది."</string>
+ <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"వైఫై ఆఫ్ చేయబడింది."</string>
+ <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"వైఫై ఆన్ చేయబడింది."</string>
<string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"మొబైల్ <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
<string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"బ్యాటరీ <xliff:g id="STATE">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"ఎయిర్ప్లైన్ మోడ్ ఆఫ్లో ఉంది."</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index bc47074..45c570f 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ข้อมูลแอปพลิเคชัน"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"หน้าจอล่าสุดของคุณแสดงที่นี่"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"ปิดแอปพลิเคชันล่าสุด"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"1 หน้าจอในภาพรวม"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d หน้าจอในภาพรวม"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"ไม่มีการแจ้งเตือน"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ดำเนินอยู่"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"การแจ้งเตือน"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"กลับ"</string>
<string name="accessibility_home" msgid="8217216074895377641">"หน้าแรก"</string>
<string name="accessibility_menu" msgid="316839303324695949">"เมนู"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"ภาพรวม"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"ค้นหา"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"กล้องถ่ายรูป"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"โทรศัพท์"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"การตั้งค่าด่วน"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ล็อกหน้าจอ"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"การตั้งค่า"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ภาพรวม"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ผู้ใช้ <xliff:g id="USER">%s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ปิด Wi-Fi แล้ว"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index f4b8f9d..fbf6132 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Impormasyon ng app"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Lumalabas dito ang iyong kamakailang screen"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Huwag pansinin ang kamakailang apps"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"1 screen sa Overview"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d (na) screen sa Overview"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Walang mga notification"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Nagpapatuloy"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Mga Notification"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Bumalik"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Home"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"Overview"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Hanapin"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Camera"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Telepono"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Mga mabilisang setting."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lock screen."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Mga Setting"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overview"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"User na si <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Na-off ang wifi."</string>
diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml
index 19d69f3..4251334 100644
--- a/packages/SystemUI/res/values-ur-rPK/strings.xml
+++ b/packages/SystemUI/res/values-ur-rPK/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ایپ کی معلومات"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"آپ کی حالیہ اسکرینز یہاں ظاہر ہوتی ہیں"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"حالیہ ایپس برخاست کریں"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"مجموعی جائزہ میں 1 اسکرین"</item>
+ <item quantity="other" msgid="5523506463832158203">"مجموعی جائزہ میں %d اسکرینز"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"کوئی اطلاعات نہیں ہیں"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"جاری"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"اطلاعات"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"واپس جائیں"</string>
<string name="accessibility_home" msgid="8217216074895377641">"ہوم"</string>
<string name="accessibility_menu" msgid="316839303324695949">"مینو"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"مجموعی جائزہ"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"تلاش کریں"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"کیمرا"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"فون"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"فوری ترتیبات۔"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"مقفل اسکرین۔"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"ترتیبات"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"مجموعی جائزہ۔"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"صارف <xliff:g id="USER">%s</xliff:g>۔"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>۔"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wifi کو آف کر دیا گیا۔"</string>
diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml
index 1aff4a0..422a82f 100644
--- a/packages/SystemUI/res/values-uz-rUZ/strings.xml
+++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Ilova xaqida"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Yaqinda ish-gan ilovalar bu yerda ko‘rinadi"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"So‘nggi dasturlarni tozalash"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"“Umumiy nazar” oynasida 1 ta ekran bor"</item>
+ <item quantity="other" msgid="5523506463832158203">"“Umumiy nazar” oynasida %d ta ekran bor"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Eslatmalar - yo‘q"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Joriy"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Eslatmalar"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Orqaga"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Uyga"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menyu"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"Umumiy nazar"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Izlash"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Tezkor sozlamalar."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Qulflash ekrani."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Sozlamalar"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Umumiy nazar."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Foydalanuvchi <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Wi-Fi o‘chirildi."</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index dbfb55c..d070968 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Thông tin về ứng dụng"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Màn hình gần đây của bạn sẽ xuất hiện tại đây"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Loại bỏ các ứng dụng gần đây"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"1 màn hình trong Tổng quan"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d màn hình trong Tổng quan"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Không có thông báo nào"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Đang diễn ra"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Thông báo"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Quay lại"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Trang chủ"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"Tổng quan"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Tìm kiếm"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Máy ảnh"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Điện thoại"</string>
@@ -164,8 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Cài đặt nhanh."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Màn hình khóa."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Cài đặt"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Tổng quan."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Người dùng <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"Đã tắt Wifi."</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 8333fd6..db7e5e5 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"应用信息"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"您最近浏览过的屏幕会显示在此处"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"关闭最近运行的应用"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"概览中有 1 个屏幕"</item>
+ <item quantity="other" msgid="5523506463832158203">"概览中有 %d 个屏幕"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"无通知"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"正在进行的"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"返回"</string>
<string name="accessibility_home" msgid="8217216074895377641">"主屏幕"</string>
<string name="accessibility_menu" msgid="316839303324695949">"菜单"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"概览"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"搜索"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"相机"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"电话"</string>
@@ -166,8 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"快捷设置。"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"锁定屏幕。"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"设置"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"概览。"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"用户:<xliff:g id="USER">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>。"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WLAN已关闭。"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index e71ff41..5c5f07e 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"應用程式資訊"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"您最近的螢幕顯示在這裡"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"關閉最近使用的應用程式"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"概覽中有 1 個畫面"</item>
+ <item quantity="other" msgid="5523506463832158203">"概覽中有 %d 個畫面"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"無通知"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"持續進行"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"返回"</string>
<string name="accessibility_home" msgid="8217216074895377641">"首頁"</string>
<string name="accessibility_menu" msgid="316839303324695949">"選單"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"概覽"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"搜尋"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"相機"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"電話"</string>
@@ -166,8 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"快速設定。"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"上鎖畫面。"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"設定"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"概覽"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"使用者:<xliff:g id="USER">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>。"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WiFi 已關閉。"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index be3bc2c..cbf73aa 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -25,8 +25,10 @@
<string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"應用程式資訊"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"您最近的螢幕會顯示在這裡"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"關閉最近使用的應用程式"</string>
- <!-- no translation found for status_bar_accessibility_recent_apps:one (3969335317929254918) -->
- <!-- no translation found for status_bar_accessibility_recent_apps:other (5523506463832158203) -->
+ <plurals name="status_bar_accessibility_recent_apps">
+ <item quantity="one" msgid="3969335317929254918">"總覽中有 1 個畫面"</item>
+ <item quantity="other" msgid="5523506463832158203">"總覽中有 %d 個畫面"</item>
+ </plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"沒有通知"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"進行中"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"通知"</string>
@@ -78,8 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"返回"</string>
<string name="accessibility_home" msgid="8217216074895377641">"主螢幕"</string>
<string name="accessibility_menu" msgid="316839303324695949">"選單"</string>
- <!-- no translation found for accessibility_recent (5208608566793607626) -->
- <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"總覽"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"搜尋"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"相機"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"電話"</string>
@@ -166,8 +167,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"快速設定。"</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"螢幕鎖定。"</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"設定"</string>
- <!-- no translation found for accessibility_desc_recent_apps (4876900986661819788) -->
- <skip />
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"總覽。"</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"使用者:<xliff:g id="USER">%s</xliff:g>。"</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>。"</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"WiFi 已關閉。"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 28e0f94..298f7b8 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Izikrini zakho zakamuva zivela lapha"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Susa izinhlelo zokusebenza zakamumva"</string>
<plurals name="status_bar_accessibility_recent_apps">
- <item quantity="one" msgid="3969335317929254918">"1 isikrini esiku-Ukubuka konke"</item>
- <item quantity="other" msgid="5523506463832158203">"%d wezikrini eziku-Ukubuka konke"</item>
+ <item quantity="one" msgid="3969335317929254918">"1 isikrini esiku-Buka konke"</item>
+ <item quantity="other" msgid="5523506463832158203">"%d wezikrini eziku-Buka konke"</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Azikho izaziso"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Okuqhubekayo"</string>
@@ -80,7 +80,7 @@
<string name="accessibility_back" msgid="567011538994429120">"Emuva"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Ekhaya"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Imenyu"</string>
- <string name="accessibility_recent" msgid="5208608566793607626">"Ukubuka konke"</string>
+ <string name="accessibility_recent" msgid="5208608566793607626">"Buka konke"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Sesha"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Ikhamela"</string>
<string name="accessibility_phone_button" msgid="6738112589538563574">"Ifoni"</string>
@@ -165,7 +165,7 @@
<string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Izilingiselelo ezisheshayo."</string>
<string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Khiya isikrini."</string>
<string name="accessibility_desc_settings" msgid="3417884241751434521">"Izilungiselelo"</string>
- <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ukubuka konke."</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Buka konke."</string>
<string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Umsebenzisi <xliff:g id="USER">%s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
<string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"I-Wifi ivaliwe."</string>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index cd82c45..4f867a0 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -238,8 +238,11 @@
<!-- Volume: time to delay dismissing the volume panel after a click is performed -->
<integer name="volume_panel_dismiss_delay">200</integer>
- <!-- Tiles with feature timeouts: number of days to show after feature is used. -->
- <integer name="days_to_show_timeout_tiles">30</integer>
+ <!-- Hotspot tile: number of days to show after feature is used. -->
+ <integer name="days_to_show_hotspot_tile">30</integer>
+
+ <!-- Color inversion tile: number of days to show after feature is used. -->
+ <integer name="days_to_show_color_inversion_tile">7</integer>
<!-- Number of times to show the strong alarm warning text in the volume dialog -->
<integer name="zen_mode_alarm_warning_threshold">5</integer>
@@ -249,5 +252,8 @@
<!-- Zen toast visibility duration -->
<integer name="zen_toast_visible_duration">500</integer>
+
+ <!-- Enable the default volume dialog -->
+ <bool name="enable_volume_ui">true</bool>
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 78bde75..07573e0 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -239,7 +239,7 @@
<dimen name="recents_search_bar_space_height">64dp</dimen>
<!-- The side padding for the task stack as a percentage of the width. -->
- <item name="recents_stack_width_padding_percentage" format="float" type="dimen">0.04444</item>
+ <item name="recents_stack_width_padding_percentage" format="float" type="dimen">0.03333</item>
<!-- The overscroll percentage allowed on the stack. -->
<item name="recents_stack_overscroll_percentage" format="float" type="dimen">0.0875</item>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 89bbacf..7a0d655 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -657,8 +657,8 @@
<string name="recents_empty_message">Your recent screens appear here</string>
<!-- Recents: The info panel app info button string. [CHAR LIMIT=NONE] -->
<string name="recents_app_info_button_label">Application Info</string>
- <!-- Recents: The lock-to-app button. [CHAR LIMIT=NONE] -->
- <string name="recents_lock_to_app_button_label">lock to app</string>
+ <!-- Recents: The screen pinning button. [CHAR LIMIT=NONE] -->
+ <string name="recents_lock_to_app_button_label">screen pinning</string>
<!-- Recents: Temporary string for the button in the recents search bar. [CHAR LIMIT=NONE] -->
<string name="recents_search_bar_label">search</string>
<!-- Recents: Launch error string. [CHAR LIMIT=NONE] -->
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
index f69f2e6..f5df1a9 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
@@ -144,7 +144,7 @@
showSaverNotification();
mShowing = SHOWING_SAVER;
} else {
- mNoMan.cancel(TAG_NOTIFICATION, ID_NOTIFICATION);
+ mNoMan.cancelAsUser(TAG_NOTIFICATION, ID_NOTIFICATION, UserHandle.ALL);
mShowing = SHOWING_NOTHING;
}
}
@@ -158,7 +158,6 @@
.setContentTitle(mContext.getString(R.string.invalid_charger_title))
.setContentText(mContext.getString(R.string.invalid_charger_text))
.setPriority(Notification.PRIORITY_MAX)
- .setCategory(Notification.CATEGORY_SYSTEM)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setColor(mContext.getResources().getColor(
com.android.internal.R.color.system_notification_accent_color));
@@ -166,7 +165,7 @@
if (n.headsUpContentView != null) {
n.headsUpContentView.setViewVisibility(com.android.internal.R.id.right_icon, View.GONE);
}
- mNoMan.notifyAsUser(TAG_NOTIFICATION, ID_NOTIFICATION, n, UserHandle.CURRENT);
+ mNoMan.notifyAsUser(TAG_NOTIFICATION, ID_NOTIFICATION, n, UserHandle.ALL);
}
private void showWarningNotification() {
@@ -182,7 +181,6 @@
.setContentText(mContext.getString(textRes, percentage))
.setOnlyAlertOnce(true)
.setPriority(Notification.PRIORITY_MAX)
- .setCategory(Notification.CATEGORY_SYSTEM)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setColor(mContext.getResources().getColor(
com.android.internal.R.color.battery_saver_mode_color));
@@ -204,7 +202,7 @@
if (n.headsUpContentView != null) {
n.headsUpContentView.setViewVisibility(com.android.internal.R.id.right_icon, View.GONE);
}
- mNoMan.notifyAsUser(TAG_NOTIFICATION, ID_NOTIFICATION, n, UserHandle.CURRENT);
+ mNoMan.notifyAsUser(TAG_NOTIFICATION, ID_NOTIFICATION, n, UserHandle.ALL);
}
private void showSaverNotification() {
@@ -214,7 +212,6 @@
.setContentText(mContext.getString(R.string.battery_saver_notification_text))
.setOngoing(true)
.setShowWhen(false)
- .setCategory(Notification.CATEGORY_SYSTEM)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setColor(mContext.getResources().getColor(
com.android.internal.R.color.battery_saver_mode_color));
@@ -222,7 +219,7 @@
if (hasSaverSettings()) {
nb.setContentIntent(pendingActivity(mOpenSaverSettings));
}
- mNoMan.notifyAsUser(TAG_NOTIFICATION, ID_NOTIFICATION, nb.build(), UserHandle.CURRENT);
+ mNoMan.notifyAsUser(TAG_NOTIFICATION, ID_NOTIFICATION, nb.build(), UserHandle.ALL);
}
private void addStopSaverAction(Notification.Builder nb) {
@@ -343,6 +340,11 @@
updateNotification();
}
+ @Override
+ public void userSwitched() {
+ updateNotification();
+ }
+
private void showStartSaverConfirmation() {
if (mSaverConfirmation != null) return;
final SystemUIDialog d = new SystemUIDialog(mContext);
@@ -372,7 +374,7 @@
filter.addAction(ACTION_SHOW_BATTERY_SETTINGS);
filter.addAction(ACTION_START_SAVER);
filter.addAction(ACTION_STOP_SAVER);
- mContext.registerReceiver(this, filter, null, mHandler);
+ mContext.registerReceiverAsUser(this, UserHandle.ALL, filter, null, mHandler);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
index d3c7dee..9459740 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
@@ -137,6 +137,7 @@
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
+ filter.addAction(Intent.ACTION_USER_SWITCHED);
filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
mContext.registerReceiver(this, filter, null, mHandler);
@@ -207,6 +208,8 @@
mScreenOffTime = SystemClock.elapsedRealtime();
} else if (Intent.ACTION_SCREEN_ON.equals(action)) {
mScreenOffTime = -1;
+ } else if (Intent.ACTION_USER_SWITCHED.equals(action)) {
+ mWarnings.userSwitched();
} else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {
updateSaverMode();
} else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGING.equals(action)) {
@@ -256,6 +259,7 @@
void updateLowBatteryWarning();
boolean isInvalidChargerWarningShowing();
void dump(PrintWriter pw);
+ void userSwitched();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java b/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java
index ad79aba..a1092a3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/UsageTracker.java
@@ -22,7 +22,6 @@
import android.content.IntentFilter;
import android.content.SharedPreferences;
-import com.android.systemui.R;
import com.android.systemui.statusbar.policy.Listenable;
public class UsageTracker implements Listenable {
@@ -35,11 +34,10 @@
private boolean mRegistered;
- public UsageTracker(Context context, Class<?> tile) {
+ public UsageTracker(Context context, Class<?> tile, int timeoutResource) {
mContext = context;
mPrefKey = tile.getSimpleName() + "LastUsed";
- mTimeToShowTile = MILLIS_PER_DAY * mContext.getResources()
- .getInteger(R.integer.days_to_show_timeout_tiles);
+ mTimeToShowTile = MILLIS_PER_DAY * mContext.getResources().getInteger(timeoutResource);
mResetAction = "com.android.systemui.qs." + tile.getSimpleName() + ".usage_reset";
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
index 01849c1..7ba1dc0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java
@@ -44,7 +44,8 @@
}
}
};
- mUsageTracker = new UsageTracker(host.getContext(), ColorInversionTile.class);
+ mUsageTracker = new UsageTracker(host.getContext(), ColorInversionTile.class,
+ R.integer.days_to_show_color_inversion_tile);
if (mSetting.getValue() != 0 && !mUsageTracker.isRecentlyUsed()) {
mUsageTracker.trackUsage();
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
index ce99cc3..b30a1d3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
@@ -34,7 +34,7 @@
public HotspotTile(Host host) {
super(host);
mController = host.getHotspotController();
- mUsageTracker = new UsageTracker(host.getContext(), HotspotTile.class);
+ mUsageTracker = newUsageTracker(host.getContext());
mUsageTracker.setListening(true);
}
@@ -84,6 +84,10 @@
}
}
+ private static UsageTracker newUsageTracker(Context context) {
+ return new UsageTracker(context, HotspotTile.class, R.integer.days_to_show_hotspot_tile);
+ }
+
private final class Callback implements HotspotController.Callback {
@Override
public void onHotspotChanged(boolean enabled) {
@@ -101,7 +105,7 @@
@Override
public void onReceive(Context context, Intent intent) {
if (mUsageTracker == null) {
- mUsageTracker = new UsageTracker(context, HotspotTile.class);
+ mUsageTracker = newUsageTracker(context);
}
mUsageTracker.trackUsage();
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
index 1ca67bc..76e8181 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
@@ -54,7 +54,7 @@
import java.util.concurrent.atomic.AtomicBoolean;
/** A proxy implementation for the recents component */
-public class AlternateRecentsComponent implements ActivityOptions.OnAnimationStartedListener {
+public class AlternateRecentsComponent {
final public static String EXTRA_FROM_HOME = "recents.triggeredOverHome";
final public static String EXTRA_FROM_SEARCH_HOME = "recents.triggeredOverSearchHome";
@@ -63,7 +63,6 @@
final public static String EXTRA_TRIGGERED_FROM_ALT_TAB = "recents.triggeredFromAltTab";
final public static String EXTRA_TRIGGERED_FROM_HOME_KEY = "recents.triggeredFromHomeKey";
- final public static String ACTION_START_ENTER_ANIMATION = "action_start_enter_animation";
final public static String ACTION_TOGGLE_RECENTS_ACTIVITY = "action_toggle_recents_activity";
final public static String ACTION_HIDE_RECENTS_ACTIVITY = "action_hide_recents_activity";
@@ -78,9 +77,7 @@
Context mContext;
LayoutInflater mInflater;
SystemServicesProxy mSystemServicesProxy;
- Handler mHandler;
boolean mBootCompleted;
- boolean mStartAnimationTriggered;
// Task launching
RecentsConfiguration mConfig;
@@ -106,7 +103,6 @@
mInflater = LayoutInflater.from(context);
mContext = context;
mSystemServicesProxy = new SystemServicesProxy(context);
- mHandler = new Handler();
mTaskStackBounds = new Rect();
}
@@ -130,6 +126,9 @@
}
}
}
+
+ // When we start, preload the metadata associated with the previous tasks
+ RecentsTaskLoader.getInstance().preload(mContext);
}
public void onBootCompleted() {
@@ -327,7 +326,8 @@
// If the user has toggled it too quickly, then just eat up the event here (it's better than
// showing a janky screenshot).
// NOTE: Ideally, the screenshot mechanism would take the window transform into account
- if (System.currentTimeMillis() - mLastToggleTime < sMinToggleDelay) {
+ long currentTime = System.currentTimeMillis();
+ if ((currentTime > mLastToggleTime) && (currentTime - mLastToggleTime) < sMinToggleDelay) {
return;
}
@@ -364,30 +364,27 @@
* Creates the activity options for a unknown state->recents transition.
*/
ActivityOptions getUnknownTransitionActivityOptions() {
- mStartAnimationTriggered = false;
return ActivityOptions.makeCustomAnimation(mContext,
R.anim.recents_from_unknown_enter,
- R.anim.recents_from_unknown_exit, mHandler, this);
+ R.anim.recents_from_unknown_exit);
}
/**
* Creates the activity options for a home->recents transition.
*/
ActivityOptions getHomeTransitionActivityOptions(boolean fromSearchHome) {
- mStartAnimationTriggered = false;
if (fromSearchHome) {
return ActivityOptions.makeCustomAnimation(mContext,
R.anim.recents_from_search_launcher_enter,
- R.anim.recents_from_search_launcher_exit, mHandler, this);
+ R.anim.recents_from_search_launcher_exit);
}
return ActivityOptions.makeCustomAnimation(mContext,
R.anim.recents_from_launcher_enter,
- R.anim.recents_from_launcher_exit, mHandler, this);
+ R.anim.recents_from_launcher_exit);
}
/**
- * Creates the activity options for an app->recents transition. If this method sets the static
- * screenshot, then we will use that for the transition.
+ * Creates the activity options for an app->recents transition.
*/
ActivityOptions getThumbnailTransitionActivityOptions(ActivityManager.RunningTaskInfo topTask,
boolean isTopTaskHome) {
@@ -411,10 +408,9 @@
c.setBitmap(null);
}
- mStartAnimationTriggered = false;
return ActivityOptions.makeThumbnailAspectScaleDownAnimation(mStatusBarView,
thumbnail, toTaskRect.left, toTaskRect.top, toTaskRect.width(),
- toTaskRect.height(), this);
+ toTaskRect.height(), null);
}
// If both the screenshot and thumbnail fails, then just fall back to the default transition
@@ -551,42 +547,4 @@
sRecentsComponentCallbacks.onVisibilityChanged(visible);
}
}
-
- /**** OnAnimationStartedListener Implementation ****/
-
- @Override
- public void onAnimationStarted() {
- // Notify recents to start the enter animation
- if (!mStartAnimationTriggered) {
- // There can be a race condition between the start animation callback and
- // the start of the new activity (where we register the receiver that listens
- // to this broadcast, so we add our own receiver and if that gets called, then
- // we know the activity has not yet started and we can retry sending the broadcast.
- BroadcastReceiver fallbackReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (getResultCode() == Activity.RESULT_OK) {
- mStartAnimationTriggered = true;
- return;
- }
-
- // Schedule for the broadcast to be sent again after some time
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- onAnimationStarted();
- }
- }, 75);
- }
- };
-
- // Send the broadcast to notify Recents that the animation has started
- Intent intent = new Intent(ACTION_START_ENTER_ANIMATION);
- intent.setPackage(mContext.getPackageName());
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT |
- Intent.FLAG_RECEIVER_FOREGROUND);
- mContext.sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT, null,
- fallbackReceiver, null, Activity.RESULT_CANCELED, null, null);
- }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index 1c8f55b..d2c55f7 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -28,6 +28,8 @@
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
import android.os.UserHandle;
import android.util.Pair;
import android.view.KeyEvent;
@@ -102,8 +104,7 @@
@Override
public void run() {
// Mark Recents as no longer visible
- AlternateRecentsComponent.notifyVisibilityChanged(false);
- mVisible = false;
+ onRecentsActivityVisibilityChanged(false);
// Finish Recents
if (mLaunchIntent != null) {
if (mLaunchOpts != null) {
@@ -141,14 +142,6 @@
} else if (action.equals(AlternateRecentsComponent.ACTION_TOGGLE_RECENTS_ACTIVITY)) {
// If we are toggling Recents, then first unfilter any filtered stacks first
dismissRecentsToFocusedTaskOrHome(true);
- } else if (action.equals(AlternateRecentsComponent.ACTION_START_ENTER_ANIMATION)) {
- // Try and start the enter animation (or restart it on configuration changed)
- ReferenceCountedTrigger t = new ReferenceCountedTrigger(context, null, null, null);
- mRecentsView.startEnterRecentsAnimation(new ViewAnimation.TaskViewEnterContext(t));
- onEnterAnimationTriggered();
- // Notify the fallback receiver that we have successfully got the broadcast
- // See AlternateRecentsComponent.onAnimationStarted()
- setResultCode(Activity.RESULT_OK);
}
}
};
@@ -163,6 +156,8 @@
if (action.equals(Intent.ACTION_SCREEN_OFF)) {
// When the screen turns off, dismiss Recents to Home
dismissRecentsToHome(false);
+ // Start preloading some tasks in the background
+ RecentsTaskLoader.getInstance().preload(RecentsActivity.this);
} else if (action.equals(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED)) {
// When the search activity changes, update the Search widget
refreshSearchWidget();
@@ -433,6 +428,7 @@
}
}
+ /** Called when the configuration changes. */
void onConfigurationChange() {
// Update RecentsConfiguration
mConfig = RecentsConfiguration.reinitialize(this,
@@ -441,7 +437,16 @@
// Try and start the enter animation (or restart it on configuration changed)
ReferenceCountedTrigger t = new ReferenceCountedTrigger(this, null, null, null);
mRecentsView.startEnterRecentsAnimation(new ViewAnimation.TaskViewEnterContext(t));
- onEnterAnimationTriggered();
+ // Animate the SystemUI scrim views
+ mScrimViews.startEnterRecentsAnimation();
+ }
+
+ /** Handles changes to the activity visibility. */
+ void onRecentsActivityVisibilityChanged(boolean visible) {
+ if (!visible) {
+ AlternateRecentsComponent.notifyVisibilityChanged(visible);
+ }
+ mVisible = visible;
}
@Override
@@ -469,7 +474,6 @@
IntentFilter filter = new IntentFilter();
filter.addAction(AlternateRecentsComponent.ACTION_HIDE_RECENTS_ACTIVITY);
filter.addAction(AlternateRecentsComponent.ACTION_TOGGLE_RECENTS_ACTIVITY);
- filter.addAction(AlternateRecentsComponent.ACTION_START_ENTER_ANIMATION);
registerReceiver(mServiceBroadcastReceiver, filter);
// Register any broadcast receivers for the task loader
@@ -481,7 +485,7 @@
super.onResume();
// Mark Recents as visible
- mVisible = true;
+ onRecentsActivityVisibilityChanged(true);
}
@Override
@@ -512,6 +516,16 @@
}
@Override
+ public void onEnterAnimationComplete() {
+ // Try and start the enter animation (or restart it on configuration changed)
+ ReferenceCountedTrigger t = new ReferenceCountedTrigger(this, null, null, null);
+ mRecentsView.startEnterRecentsAnimation(new ViewAnimation.TaskViewEnterContext(t));
+
+ // Animate the SystemUI scrim views
+ mScrimViews.startEnterRecentsAnimation();
+ }
+
+ @Override
public void onTrimMemory(int level) {
RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
if (loader != null) {
@@ -592,12 +606,6 @@
}
}
- /** Called when the enter recents animation is triggered. */
- public void onEnterAnimationTriggered() {
- // Animate the SystemUI scrim views
- mScrimViews.startEnterRecentsAnimation();
- }
-
/**** RecentsView.RecentsViewCallbacks Implementation ****/
@Override
@@ -609,8 +617,7 @@
@Override
public void onTaskViewClicked() {
// Mark recents as no longer visible
- AlternateRecentsComponent.notifyVisibilityChanged(false);
- mVisible = false;
+ onRecentsActivityVisibilityChanged(false);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java b/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java
index f01d17c..a0dee07 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/Utilities.java
@@ -16,6 +16,7 @@
package com.android.systemui.recents.misc;
+import android.animation.Animator;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Matrix;
@@ -188,4 +189,15 @@
int flags = intent.getFlags();
return (flags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) == Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
}
+
+ /**
+ * Cancels an animation ensuring that if it has listeners, onCancel and onEnd
+ * are not called.
+ */
+ public static void cancelAnimationWithoutCallbacks(Animator animator) {
+ if (animator != null) {
+ animator.removeAllListeners();
+ animator.cancel();
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/KeyStoreLruCache.java b/packages/SystemUI/src/com/android/systemui/recents/model/KeyStoreLruCache.java
index 7ccefc6..97e0916 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/KeyStoreLruCache.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/KeyStoreLruCache.java
@@ -21,15 +21,16 @@
import java.util.HashMap;
/**
- * An LRU cache that support querying the keys as well as values. By using the Task's key, we can
- * prevent holding onto a reference to the Task resource data, while keeping the cache data in
- * memory where necessary.
+ * An LRU cache that internally support querying the keys as well as values. We use this to keep
+ * track of the task metadata to determine when to invalidate the cache when tasks have been
+ * updated. Generally, this cache will return the last known cache value for the requested task
+ * key.
*/
public class KeyStoreLruCache<V> {
// We keep a set of keys that are associated with the LRU cache, so that we can find out
// information about the Task that was previously in the cache.
HashMap<Integer, Task.TaskKey> mTaskKeys = new HashMap<Integer, Task.TaskKey>();
- // The cache implementation
+ // The cache implementation, mapping task id -> value
LruCache<Integer, V> mCache;
public KeyStoreLruCache(int cacheSize) {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsPackageMonitor.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsPackageMonitor.java
index 60e89bf..e48e5f0 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsPackageMonitor.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsPackageMonitor.java
@@ -19,6 +19,7 @@
import android.content.ComponentName;
import android.content.Context;
import android.os.Looper;
+import android.os.UserHandle;
import com.android.internal.content.PackageMonitor;
import com.android.systemui.recents.misc.SystemServicesProxy;
@@ -26,16 +27,16 @@
import java.util.List;
/**
- * The package monitor listens for changes from PackageManager to update the contents of the Recents
- * list.
+ * The package monitor listens for changes from PackageManager to update the contents of the
+ * Recents list.
*/
public class RecentsPackageMonitor extends PackageMonitor {
public interface PackageCallbacks {
- public void onComponentRemoved(HashSet<ComponentName> cns);
+ public void onPackagesChanged(RecentsPackageMonitor monitor, String packageName,
+ int userId);
}
PackageCallbacks mCb;
- List<Task.TaskKey> mTasks;
SystemServicesProxy mSystemServicesProxy;
/** Registers the broadcast receivers with the specified callbacks. */
@@ -43,7 +44,9 @@
mSystemServicesProxy = new SystemServicesProxy(context);
mCb = cb;
try {
- register(context, Looper.getMainLooper(), true);
+ // We register for events from all users, but will cross-reference them with
+ // packages for the current user and any profiles they have
+ register(context, Looper.getMainLooper(), UserHandle.ALL, true);
} catch (IllegalStateException e) {
e.printStackTrace();
}
@@ -59,29 +62,15 @@
}
mSystemServicesProxy = null;
mCb = null;
- mTasks.clear();
- }
-
- /** Sets the list of tasks to match against package broadcast changes. */
- void setTasks(List<Task.TaskKey> tasks) {
- mTasks = tasks;
}
@Override
public void onPackageRemoved(String packageName, int uid) {
if (mCb == null) return;
- // Identify all the tasks that should be removed as a result of the package being removed.
- // Using a set to ensure that we callback once per unique component.
- HashSet<ComponentName> componentsToRemove = new HashSet<ComponentName>();
- for (Task.TaskKey t : mTasks) {
- ComponentName cn = t.baseIntent.getComponent();
- if (cn.getPackageName().equals(packageName)) {
- componentsToRemove.add(cn);
- }
- }
- // Notify our callbacks that the components no longer exist
- mCb.onComponentRemoved(componentsToRemove);
+ // Notify callbacks that a package has changed
+ final int eventUserId = getChangingUserId();
+ mCb.onPackagesChanged(this, packageName, eventUserId);
}
@Override
@@ -94,25 +83,38 @@
public void onPackageModified(String packageName) {
if (mCb == null) return;
+ // Notify callbacks that a package has changed
+ final int eventUserId = getChangingUserId();
+ mCb.onPackagesChanged(this, packageName, eventUserId);
+ }
+
+ /**
+ * Computes the components that have been removed as a result of a change in the specified
+ * package.
+ */
+ public HashSet<ComponentName> computeComponentsRemoved(List<Task.TaskKey> taskKeys,
+ String packageName, int userId) {
// Identify all the tasks that should be removed as a result of the package being removed.
// Using a set to ensure that we callback once per unique component.
- HashSet<ComponentName> componentsKnownToExist = new HashSet<ComponentName>();
- HashSet<ComponentName> componentsToRemove = new HashSet<ComponentName>();
- for (Task.TaskKey t : mTasks) {
+ HashSet<ComponentName> existingComponents = new HashSet<ComponentName>();
+ HashSet<ComponentName> removedComponents = new HashSet<ComponentName>();
+ for (Task.TaskKey t : taskKeys) {
+ // Skip if this doesn't apply to the current user
+ if (t.userId != userId) continue;
+
ComponentName cn = t.baseIntent.getComponent();
if (cn.getPackageName().equals(packageName)) {
- if (componentsKnownToExist.contains(cn)) {
+ if (existingComponents.contains(cn)) {
// If we know that the component still exists in the package, then skip
continue;
}
- if (mSystemServicesProxy.getActivityInfo(cn) != null) {
- componentsKnownToExist.add(cn);
+ if (mSystemServicesProxy.getActivityInfo(cn, userId) != null) {
+ existingComponents.add(cn);
} else {
- componentsToRemove.add(cn);
+ removedComponents.add(cn);
}
}
}
- // Notify our callbacks that the components no longer exist
- mCb.onComponentRemoved(componentsToRemove);
+ return removedComponents;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
index d40e847..594eb0e 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
@@ -418,17 +418,25 @@
root.setStack(stack);
// Start the task loader and add all the tasks we need to load
- mLoader.start(context);
mLoadQueue.addTasks(tasksToLoad);
-
- // Update the package monitor with the list of packages to listen for
- mPackageMonitor.setTasks(taskKeys);
+ mLoader.start(context);
return root;
}
+ /** Preloads the set of recent tasks (not including thumbnails). */
+ public void preload(Context context) {
+ ArrayList<Task> tasksToLoad = new ArrayList<Task>();
+ getTaskStack(mSystemServicesProxy, context.getResources(),
+ -1, -1, true, true, null, tasksToLoad);
+
+ // Start the task loader and add all the tasks we need to load
+ mLoadQueue.addTasks(tasksToLoad);
+ mLoader.start(context);
+ }
+
/** Creates a lightweight stack of the current recent tasks, without thumbnails and icons. */
- public TaskStack getTaskStack(SystemServicesProxy ssp, Resources res,
+ public synchronized TaskStack getTaskStack(SystemServicesProxy ssp, Resources res,
int preloadTaskId, int preloadTaskCount,
boolean loadTaskThumbnails, boolean isTopTaskHome,
List<Task.TaskKey> taskKeysOut, List<Task> tasksToLoadOut) {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/Task.java b/packages/SystemUI/src/com/android/systemui/recents/model/Task.java
index a7e2b0b..55dfe45 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/Task.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/Task.java
@@ -129,7 +129,7 @@
TaskCallbacks mCb;
public Task() {
- // Only used by RecentsService for task rect calculations.
+ // Do nothing
}
public Task(TaskKey key, boolean isActive, int taskAffiliation, int taskAffiliationColor,
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java
index 1e47b50..a37b9e6 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java
@@ -255,6 +255,17 @@
return mTaskList.getTasks().get(mTaskList.size() - 1);
}
+ /** Gets the task keys */
+ public ArrayList<Task.TaskKey> getTaskKeys() {
+ ArrayList<Task.TaskKey> taskKeys = new ArrayList<Task.TaskKey>();
+ ArrayList<Task> tasks = mTaskList.getTasks();
+ int taskCount = tasks.size();
+ for (int i = 0; i < taskCount; i++) {
+ taskKeys.add(tasks.get(i).key);
+ }
+ return taskKeys;
+ }
+
/** Gets the tasks */
public ArrayList<Task> getTasks() {
return mTaskList.getTasks();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java b/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java
index 421b905..5f8f3f2 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/AnimateableViewBounds.java
@@ -68,7 +68,7 @@
mSourceView.invalidateOutline();
updateClipBounds();
if (!mConfig.useHardwareLayers) {
- mSourceView.mThumbnailView.updateVisibility(
+ mSourceView.mThumbnailView.updateThumbnailVisibility(
bottom - mSourceView.getPaddingBottom());
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
index 9dfebfe..6b0d306 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -18,7 +18,6 @@
import android.app.ActivityOptions;
import android.app.TaskStackBuilder;
-import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
@@ -42,7 +41,6 @@
import com.android.systemui.recents.model.TaskStack;
import java.util.ArrayList;
-import java.util.HashSet;
/**
* This view is the the top level layout that contains TaskStacks (which are laid out according
@@ -564,14 +562,14 @@
/**** RecentsPackageMonitor.PackageCallbacks Implementation ****/
@Override
- public void onComponentRemoved(HashSet<ComponentName> cns) {
+ public void onPackagesChanged(RecentsPackageMonitor monitor, String packageName, int userId) {
// Propagate this event down to each task stack view
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
View child = getChildAt(i);
if (child != mSearchBar) {
TaskStackView stackView = (TaskStackView) child;
- stackView.onComponentRemoved(cns);
+ stackView.onPackagesChanged(monitor, packageName, userId);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
index e479952..dee26e6 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
@@ -1081,12 +1081,16 @@
/**** RecentsPackageMonitor.PackageCallbacks Implementation ****/
@Override
- public void onComponentRemoved(HashSet<ComponentName> cns) {
+ public void onPackagesChanged(RecentsPackageMonitor monitor, String packageName, int userId) {
+ // Compute which components need to be removed
+ HashSet<ComponentName> removedComponents = monitor.computeComponentsRemoved(
+ mStack.getTaskKeys(), packageName, userId);
+
// For other tasks, just remove them directly if they no longer exist
ArrayList<Task> tasks = mStack.getTasks();
for (int i = tasks.size() - 1; i >= 0; i--) {
final Task t = tasks.get(i);
- if (cns.contains(t.key.baseIntent.getComponent())) {
+ if (removedComponents.contains(t.key.baseIntent.getComponent())) {
TaskView tv = getChildViewForTask(t);
if (tv != null) {
// For visible children, defer removing the task until after the animation
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java
index c9113fe..04f7c6f 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java
@@ -23,6 +23,7 @@
import android.content.Context;
import android.widget.OverScroller;
import com.android.systemui.recents.RecentsConfiguration;
+import com.android.systemui.recents.misc.Utilities;
/* The scrolling logic for a TaskStackView */
public class TaskStackViewScroller {
@@ -161,10 +162,7 @@
/** Aborts any current stack scrolls */
void stopBoundScrollAnimation() {
- if (mScrollAnimator != null) {
- mScrollAnimator.removeAllListeners();
- mScrollAnimator.cancel();
- }
+ Utilities.cancelAnimationWithoutCallbacks(mScrollAnimator);
}
/**** OverScroller ****/
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
index dfb30f3..7b4e10a 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
@@ -28,10 +28,9 @@
import android.view.animation.AccelerateInterpolator;
import android.widget.FrameLayout;
import com.android.systemui.R;
-import com.android.systemui.recents.AlternateRecentsComponent;
import com.android.systemui.recents.Constants;
import com.android.systemui.recents.RecentsConfiguration;
-import com.android.systemui.recents.model.RecentsTaskLoader;
+import com.android.systemui.recents.misc.Utilities;
import com.android.systemui.recents.model.Task;
import com.android.systemui.statusbar.phone.PhoneStatusBar;
@@ -53,11 +52,11 @@
float mTaskProgress;
ObjectAnimator mTaskProgressAnimator;
- ObjectAnimator mDimAnimator;
float mMaxDimScale;
- int mDim;
+ int mDimAlpha;
AccelerateInterpolator mDimInterpolator = new AccelerateInterpolator(1f);
- PorterDuffColorFilter mDimColorFilter = new PorterDuffColorFilter(0, PorterDuff.Mode.MULTIPLY);
+ PorterDuffColorFilter mDimColorFilter = new PorterDuffColorFilter(0, PorterDuff.Mode.SRC_ATOP);
+ Paint mDimLayerPaint = new Paint();
Task mTask;
boolean mTaskDataLoaded;
@@ -65,7 +64,6 @@
boolean mFocusAnimationsEnabled;
boolean mClipViewInStack;
AnimateableViewBounds mViewBounds;
- Paint mLayerPaint = new Paint();
View mContent;
TaskViewThumbnail mThumbnailView;
@@ -130,7 +128,7 @@
mContent = findViewById(R.id.task_view_content);
mHeaderView = (TaskViewHeader) findViewById(R.id.task_view_bar);
mThumbnailView = (TaskViewThumbnail) findViewById(R.id.task_view_thumbnail);
- mThumbnailView.enableTaskBarClip(mHeaderView);
+ mThumbnailView.updateClipToTaskBar(mHeaderView);
mActionButtonView = findViewById(R.id.lock_to_app_fab);
mActionButtonView.setOutlineProvider(new ViewOutlineProvider() {
@Override
@@ -179,10 +177,7 @@
!mConfig.fakeShadows, updateCallback);
// Update the task progress
- if (mTaskProgressAnimator != null) {
- mTaskProgressAnimator.removeAllListeners();
- mTaskProgressAnimator.cancel();
- }
+ Utilities.cancelAnimationWithoutCallbacks(mTaskProgressAnimator);
if (duration <= 0) {
setTaskProgress(toTransform.p);
} else {
@@ -377,7 +372,7 @@
mThumbnailView.startLaunchTaskAnimation(postAnimRunnable);
// Animate the dim
- if (mDim > 0) {
+ if (mDimAlpha > 0) {
ObjectAnimator anim = ObjectAnimator.ofInt(this, "dim", 0);
anim.setDuration(mConfig.taskBarExitAnimDuration);
anim.setInterpolator(mConfig.fastOutLinearInInterpolator);
@@ -495,26 +490,16 @@
/** Returns the current dim. */
public void setDim(int dim) {
- mDim = dim;
- if (mDimAnimator != null) {
- mDimAnimator.removeAllListeners();
- mDimAnimator.cancel();
- }
+ mDimAlpha = dim;
if (mConfig.useHardwareLayers) {
// Defer setting hardware layers if we have not yet measured, or there is no dim to draw
if (getMeasuredWidth() > 0 && getMeasuredHeight() > 0) {
- if (mDimAnimator != null) {
- mDimAnimator.removeAllListeners();
- mDimAnimator.cancel();
- }
-
- int inverse = 255 - mDim;
- mDimColorFilter.setColor(Color.argb(0xFF, inverse, inverse, inverse));
- mLayerPaint.setColorFilter(mDimColorFilter);
- mContent.setLayerType(LAYER_TYPE_HARDWARE, mLayerPaint);
+ mDimColorFilter.setColor(Color.argb(mDimAlpha, 0, 0, 0));
+ mDimLayerPaint.setColorFilter(mDimColorFilter);
+ mContent.setLayerType(LAYER_TYPE_HARDWARE, mDimLayerPaint);
}
} else {
- float dimAlpha = mDim / 255.0f;
+ float dimAlpha = mDimAlpha / 255.0f;
if (mThumbnailView != null) {
mThumbnailView.setDimAlpha(dimAlpha);
}
@@ -526,7 +511,7 @@
/** Returns the current dim. */
public int getDim() {
- return mDim;
+ return mDimAlpha;
}
/** Animates the dim to the task progress. */
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
index 6554f82..ba868f5 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
@@ -36,7 +36,6 @@
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.RippleDrawable;
-import android.graphics.drawable.ShapeDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
@@ -56,23 +55,27 @@
RecentsConfiguration mConfig;
+ // Header views
ImageView mDismissButton;
ImageView mApplicationIcon;
TextView mActivityDescription;
- RippleDrawable mBackground;
- GradientDrawable mBackgroundColorDrawable;
+ // Header drawables
+ boolean mCurrentPrimaryColorIsDark;
+ int mCurrentPrimaryColor;
int mBackgroundColor;
Drawable mLightDismissDrawable;
Drawable mDarkDismissDrawable;
+ RippleDrawable mBackground;
+ GradientDrawable mBackgroundColorDrawable;
AnimatorSet mFocusAnimator;
- PorterDuffColorFilter mDimFilter = new PorterDuffColorFilter(0, PorterDuff.Mode.SRC_ATOP);
- boolean mCurrentPrimaryColorIsDark;
- int mCurrentPrimaryColor;
-
+ // Static highlight that we draw at the top of each view
static Paint sHighlightPaint;
- private Paint mDimPaint = new Paint();
+
+ // Header dim, which is only used when task view hardware layers are not used
+ Paint mDimLayerPaint = new Paint();
+ PorterDuffColorFilter mDimColorFilter = new PorterDuffColorFilter(0, PorterDuff.Mode.SRC_ATOP);
public TaskViewHeader(Context context) {
this(context, null);
@@ -172,6 +175,16 @@
return false;
}
+ /**
+ * Sets the dim alpha, only used when we are not using hardware layers.
+ * (see RecentsConfiguration.useHardwareLayers)
+ */
+ void setDimAlpha(int alpha) {
+ mDimColorFilter.setColor(Color.argb(alpha, 0, 0, 0));
+ mDimLayerPaint.setColorFilter(mDimColorFilter);
+ setLayerType(LAYER_TYPE_HARDWARE, mDimLayerPaint);
+ }
+
/** Returns the secondary color for a primary color. */
int getSecondaryColor(int primaryColor, boolean useLightOverlayColor) {
int overlayColor = useLightOverlayColor ? Color.WHITE : Color.BLACK;
@@ -266,8 +279,7 @@
boolean isRunning = false;
if (mFocusAnimator != null) {
isRunning = mFocusAnimator.isRunning();
- mFocusAnimator.removeAllListeners();
- mFocusAnimator.cancel();
+ Utilities.cancelAnimationWithoutCallbacks(mFocusAnimator);
}
if (focused) {
@@ -344,11 +356,4 @@
}
}
}
-
- public void setDimAlpha(int alpha) {
- int color = Color.argb(alpha, 0, 0, 0);
- mDimFilter.setColor(color);
- mDimPaint.setColorFilter(mDimFilter);
- setLayerType(LAYER_TYPE_HARDWARE, mDimPaint);
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java
index a946a84..c83248e 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java
@@ -33,37 +33,48 @@
import android.util.AttributeSet;
import android.view.View;
import com.android.systemui.recents.RecentsConfiguration;
+import com.android.systemui.recents.misc.Utilities;
import com.android.systemui.recents.model.Task;
-/** The task thumbnail view */
+/**
+ * The task thumbnail view. It implements an image view that allows for animating the dim and
+ * alpha of the thumbnail image.
+ */
public class TaskViewThumbnail extends View {
- private final int mCornerRadius;
- private final Matrix mScaleMatrix = new Matrix();
RecentsConfiguration mConfig;
- // Task bar clipping
- Rect mClipRect = new Rect();
+ // Drawing
+ float mDimAlpha;
+ Matrix mScaleMatrix = new Matrix();
Paint mDrawPaint = new Paint();
+ RectF mBitmapRect = new RectF();
+ RectF mLayoutRect = new RectF();
+ BitmapShader mBitmapShader;
LightingColorFilter mLightingColorFilter = new LightingColorFilter(0xffffffff, 0);
- private final RectF mBitmapRect = new RectF();
- private final RectF mLayoutRect = new RectF();
- private BitmapShader mBitmapShader;
- private float mBitmapAlpha;
- private float mDimAlpha;
- private View mTaskBar;
- private boolean mInvisible;
- private ValueAnimator mAlphaAnimator;
- private ValueAnimator.AnimatorUpdateListener mAlphaUpdateListener
+
+ // Thumbnail alpha
+ float mThumbnailAlpha;
+ ValueAnimator mThumbnailAlphaAnimator;
+ ValueAnimator.AnimatorUpdateListener mThumbnailAlphaUpdateListener
= new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
- mBitmapAlpha = (float) animation.getAnimatedValue();
- updateFilter();
+ mThumbnailAlpha = (float) animation.getAnimatedValue();
+ updateThumbnailPaintFilter();
}
};
+ // Task bar clipping, the top of this thumbnail can be clipped against the opaque header
+ // bar that overlaps this thumbnail
+ View mTaskBar;
+ Rect mClipRect = new Rect();
+
+ // Visibility optimization, if the thumbnail height is less than the height of the header
+ // bar for the task view, then just mark this thumbnail view as invisible
+ boolean mInvisible;
+
public TaskViewThumbnail(Context context) {
this(context, null);
}
@@ -79,103 +90,15 @@
public TaskViewThumbnail(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
mConfig = RecentsConfiguration.getInstance();
- mCornerRadius = mConfig.taskViewRoundedCornerRadiusPx;
mDrawPaint.setColorFilter(mLightingColorFilter);
mDrawPaint.setFilterBitmap(true);
mDrawPaint.setAntiAlias(true);
}
@Override
- protected void onDraw(Canvas canvas) {
- if (mInvisible) {
- return;
- }
- canvas.drawRoundRect(0,
- 0,
- getWidth(),
- getHeight(),
- mCornerRadius,
- mCornerRadius,
- mDrawPaint);
- }
-
- @Override
protected void onFinishInflate() {
- mBitmapAlpha = 0.9f;
- updateFilter();
- }
-
- private void updateFilter() {
- if (mInvisible) {
- return;
- }
- int mul = (int) ((1.0f - mDimAlpha) * mBitmapAlpha * 255);
- int add = (int) ((1.0f - mDimAlpha) * (1 - mBitmapAlpha) * 255);
- if (mBitmapShader != null) {
- mLightingColorFilter.setColorMultiply(Color.argb(255, mul, mul, mul));
- mLightingColorFilter.setColorAdd(Color.argb(0, add, add, add));
- mDrawPaint.setColorFilter(mLightingColorFilter);
- mDrawPaint.setColor(0xffffffff);
- } else {
- mDrawPaint.setColorFilter(null);
- int grey = mul + add;
- mDrawPaint.setColor(Color.argb(255, grey, grey, grey));
- }
- invalidate();
- }
-
- /** Updates the clip rect based on the given task bar. */
- void enableTaskBarClip(View taskBar) {
- mTaskBar = taskBar;
- int top = (int) Math.max(0, taskBar.getTranslationY() +
- taskBar.getMeasuredHeight() - 1);
- mClipRect.set(0, top, getMeasuredWidth(), getMeasuredHeight());
- setClipBounds(mClipRect);
- }
-
- void updateVisibility(int clipBottom) {
- boolean invisible = mTaskBar != null && getHeight() - clipBottom < mTaskBar.getHeight();
- if (invisible != mInvisible) {
- mInvisible = invisible;
- if (!mInvisible) {
- updateFilter();
- }
- invalidate();
- }
- }
-
- /** Binds the thumbnail view to the screenshot. */
- boolean bindToScreenshot(Bitmap ss) {
- setImageBitmap(ss);
- return ss != null;
- }
-
- /** Unbinds the thumbnail view from the screenshot. */
- void unbindFromScreenshot() {
- setImageBitmap(null);
- }
-
- /** Binds the thumbnail view to the task */
- void rebindToTask(Task t) {
- if (t.thumbnail != null) {
- setImageBitmap(t.thumbnail);
- } else {
- setImageBitmap(null);
- }
- }
-
- public void setImageBitmap(Bitmap bm) {
- if (bm != null) {
- mBitmapShader = new BitmapShader(bm, Shader.TileMode.CLAMP,
- Shader.TileMode.CLAMP);
- mDrawPaint.setShader(mBitmapShader);
- mBitmapRect.set(0, 0, bm.getWidth(), bm.getHeight());
- updateBitmapScale();
- } else {
- mBitmapShader = null;
- mDrawPaint.setShader(null);
- }
- updateFilter();
+ mThumbnailAlpha = mConfig.taskViewThumbnailAlpha;
+ updateThumbnailPaintFilter();
}
@Override
@@ -183,25 +106,106 @@
super.onLayout(changed, left, top, right, bottom);
if (changed) {
mLayoutRect.set(0, 0, getWidth(), getHeight());
- updateBitmapScale();
+ updateThumbnailScale();
}
}
- private void updateBitmapScale() {
+ @Override
+ protected void onDraw(Canvas canvas) {
+ if (mInvisible) {
+ return;
+ }
+ // Draw the thumbnail with the rounded corners
+ canvas.drawRoundRect(0, 0, getWidth(), getHeight(),
+ mConfig.taskViewRoundedCornerRadiusPx,
+ mConfig.taskViewRoundedCornerRadiusPx, mDrawPaint);
+ }
+
+ /** Sets the thumbnail to a given bitmap. */
+ void setThumbnail(Bitmap bm) {
+ if (bm != null) {
+ mBitmapShader = new BitmapShader(bm, Shader.TileMode.CLAMP,
+ Shader.TileMode.CLAMP);
+ mDrawPaint.setShader(mBitmapShader);
+ mBitmapRect.set(0, 0, bm.getWidth(), bm.getHeight());
+ updateThumbnailScale();
+ } else {
+ mBitmapShader = null;
+ mDrawPaint.setShader(null);
+ }
+ updateThumbnailPaintFilter();
+ }
+
+ /** Updates the paint to draw the thumbnail. */
+ void updateThumbnailPaintFilter() {
+ if (mInvisible) {
+ return;
+ }
+ int mul = (int) ((1.0f - mDimAlpha) * mThumbnailAlpha * 255);
+ int add = (int) ((1.0f - mDimAlpha) * (1 - mThumbnailAlpha) * 255);
+ if (mBitmapShader != null) {
+ mLightingColorFilter.setColorMultiply(Color.argb(255, mul, mul, mul));
+ mLightingColorFilter.setColorAdd(Color.argb(0, add, add, add));
+ mDrawPaint.setColorFilter(mLightingColorFilter);
+ mDrawPaint.setColor(0xffffffff);
+ } else {
+ int grey = mul + add;
+ mDrawPaint.setColorFilter(null);
+ mDrawPaint.setColor(Color.argb(255, grey, grey, grey));
+ }
+ invalidate();
+ }
+
+ /** Updates the thumbnail shader's scale transform. */
+ void updateThumbnailScale() {
if (mBitmapShader != null) {
mScaleMatrix.setRectToRect(mBitmapRect, mLayoutRect, Matrix.ScaleToFit.FILL);
mBitmapShader.setLocalMatrix(mScaleMatrix);
}
}
+ /** Updates the clip rect based on the given task bar. */
+ void updateClipToTaskBar(View taskBar) {
+ mTaskBar = taskBar;
+ int top = (int) Math.max(0, taskBar.getTranslationY() +
+ taskBar.getMeasuredHeight() - 1);
+ mClipRect.set(0, top, getMeasuredWidth(), getMeasuredHeight());
+ setClipBounds(mClipRect);
+ }
+
+ /** Updates the visibility of the the thumbnail. */
+ void updateThumbnailVisibility(int clipBottom) {
+ boolean invisible = mTaskBar != null && (getHeight() - clipBottom) <= mTaskBar.getHeight();
+ if (invisible != mInvisible) {
+ mInvisible = invisible;
+ if (!mInvisible) {
+ updateThumbnailPaintFilter();
+ }
+ invalidate();
+ }
+ }
+
+ /**
+ * Sets the dim alpha, only used when we are not using hardware layers.
+ * (see RecentsConfiguration.useHardwareLayers)
+ */
public void setDimAlpha(float dimAlpha) {
mDimAlpha = dimAlpha;
- updateFilter();
+ updateThumbnailPaintFilter();
+ }
+
+ /** Binds the thumbnail view to the task */
+ void rebindToTask(Task t) {
+ if (t.thumbnail != null) {
+ setThumbnail(t.thumbnail);
+ } else {
+ setThumbnail(null);
+ }
}
/** Unbinds the thumbnail view from the task */
void unbindFromTask() {
- setImageBitmap(null);
+ setThumbnail(null);
}
/** Handles focus changes. */
@@ -217,54 +221,46 @@
}
}
- /** Prepares for the enter recents animation. */
+ /**
+ * Prepares for the enter recents animation, this gets called before the the view
+ * is first visible and will be followed by a startEnterRecentsAnimation() call.
+ */
void prepareEnterRecentsAnimation(boolean isTaskViewLaunchTargetTask) {
if (isTaskViewLaunchTargetTask) {
- mBitmapAlpha = 1f;
+ mThumbnailAlpha = 1f;
} else {
- mBitmapAlpha = mConfig.taskViewThumbnailAlpha;
+ mThumbnailAlpha = mConfig.taskViewThumbnailAlpha;
}
- updateFilter();
+ updateThumbnailPaintFilter();
}
- /** Animates this task thumbnail as it enters recents */
+ /** Animates this task thumbnail as it enters Recents. */
void startEnterRecentsAnimation(int delay, Runnable postAnimRunnable) {
startFadeAnimation(mConfig.taskViewThumbnailAlpha, delay,
mConfig.taskBarEnterAnimDuration, postAnimRunnable);
}
- /** Animates this task thumbnail as it exits recents */
+ /** Animates this task thumbnail as it exits Recents. */
void startLaunchTaskAnimation(Runnable postAnimRunnable) {
startFadeAnimation(1f, 0, mConfig.taskBarExitAnimDuration, postAnimRunnable);
}
- /** Animates the thumbnail alpha. */
+ /** Starts a new thumbnail alpha animation. */
void startFadeAnimation(float finalAlpha, int delay, int duration, final Runnable postAnimRunnable) {
- if (mAlphaAnimator != null) {
- mAlphaAnimator.cancel();
- }
- mAlphaAnimator = ValueAnimator.ofFloat(mBitmapAlpha, finalAlpha);
- mAlphaAnimator.addUpdateListener(mAlphaUpdateListener);
- mAlphaAnimator.setStartDelay(delay);
- mAlphaAnimator.setInterpolator(mConfig.fastOutSlowInInterpolator);
- mAlphaAnimator.setDuration(duration);
- mAlphaAnimator.start();
+ Utilities.cancelAnimationWithoutCallbacks(mThumbnailAlphaAnimator);
+ mThumbnailAlphaAnimator = ValueAnimator.ofFloat(mThumbnailAlpha, finalAlpha);
+ mThumbnailAlphaAnimator.setStartDelay(delay);
+ mThumbnailAlphaAnimator.setDuration(duration);
+ mThumbnailAlphaAnimator.setInterpolator(mConfig.fastOutSlowInInterpolator);
+ mThumbnailAlphaAnimator.addUpdateListener(mThumbnailAlphaUpdateListener);
if (postAnimRunnable != null) {
- mAlphaAnimator.addListener(new AnimatorListenerAdapter() {
- public boolean mCancelled;
-
- @Override
- public void onAnimationCancel(Animator animation) {
- mCancelled = true;
- }
-
+ mThumbnailAlphaAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
- if (!mCancelled) {
- postAnimRunnable.run();
- }
+ postAnimRunnable.run();
}
});
}
+ mThumbnailAlphaAnimator.start();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 9492a14..7c74246 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -69,6 +69,7 @@
import android.view.ViewAnimationUtils;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
+import android.view.ViewParent;
import android.view.ViewStub;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
@@ -266,6 +267,15 @@
if (DEBUG) {
Log.v(TAG, "Notification click handler invoked for intent: " + pendingIntent);
}
+ logActionClick(view);
+ // The intent we are sending is for the application, which
+ // won't have permission to immediately start an activity after
+ // the user switches to home. We know it is safe to do at this
+ // point, so make sure new activity switches are now allowed.
+ try {
+ ActivityManagerNative.getDefault().resumeAppSwitches();
+ } catch (RemoteException e) {
+ }
final boolean isActivity = pendingIntent.isActivity();
if (isActivity) {
final boolean keyguardShowing = mStatusBarKeyguardViewManager.isShowing();
@@ -278,11 +288,6 @@
try {
ActivityManagerNative.getDefault()
.keyguardWaitingForActivityDrawn();
- // The intent we are sending is for the application, which
- // won't have permission to immediately start an activity after
- // the user switches to home. We know it is safe to do at this
- // point, so make sure new activity switches are now allowed.
- ActivityManagerNative.getDefault().resumeAppSwitches();
} catch (RemoteException e) {
}
}
@@ -305,6 +310,37 @@
}
}
+ private void logActionClick(View view) {
+ ViewParent parent = view.getParent();
+ String key = getNotificationKeyForParent(parent);
+ if (key == null) {
+ Log.w(TAG, "Couldn't determine notification for click.");
+ return;
+ }
+ int index = -1;
+ // If this is a default template, determine the index of the button.
+ if (view.getId() == com.android.internal.R.id.action0 &&
+ parent != null && parent instanceof ViewGroup) {
+ ViewGroup actionGroup = (ViewGroup) parent;
+ index = actionGroup.indexOfChild(view);
+ }
+ try {
+ mBarService.onNotificationActionClick(key, index);
+ } catch (RemoteException e) {
+ // Ignore
+ }
+ }
+
+ private String getNotificationKeyForParent(ViewParent parent) {
+ while (parent != null) {
+ if (parent instanceof ExpandableNotificationRow) {
+ return ((ExpandableNotificationRow) parent).getStatusBarNotification().getKey();
+ }
+ parent = parent.getParent();
+ }
+ return null;
+ }
+
private boolean superOnClickHandler(View view, PendingIntent pendingIntent,
Intent fillInIntent) {
return super.onClickHandler(view, pendingIntent, fillInIntent);
@@ -1486,20 +1522,21 @@
if (mIsHeadsUp) {
mHeadsUpNotificationView.clear();
}
- AsyncTask.execute(new Runnable() {
+ new Thread() {
@Override
public void run() {
- if (keyguardShowing && !afterKeyguardGone) {
- try {
+ try {
+ if (keyguardShowing && !afterKeyguardGone) {
ActivityManagerNative.getDefault()
.keyguardWaitingForActivityDrawn();
- // The intent we are sending is for the application, which
- // won't have permission to immediately start an activity after
- // the user switches to home. We know it is safe to do at this
- // point, so make sure new activity switches are now allowed.
- ActivityManagerNative.getDefault().resumeAppSwitches();
- } catch (RemoteException e) {
}
+
+ // The intent we are sending is for the application, which
+ // won't have permission to immediately start an activity after
+ // the user switches to home. We know it is safe to do at this
+ // point, so make sure new activity switches are now allowed.
+ ActivityManagerNative.getDefault().resumeAppSwitches();
+ } catch (RemoteException e) {
}
if (mIntent != null) {
@@ -1524,7 +1561,7 @@
// system process is dead if we're here.
}
}
- });
+ }.start();
// close the shade if it was open
animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 9196dc8..556c423 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -158,6 +158,7 @@
public void resetHeight() {
mMaxExpandHeight = 0;
mWasReset = true;
+ mActualHeight = 0;
onHeightReset();
requestLayout();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index a6fccb6..c19bdff 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -802,6 +802,7 @@
requestPanelHeightUpdate();
mNotificationStackScroller.setInterceptDelegateEnabled(expanded);
mStatusBar.setQsExpanded(expanded);
+ mQsPanel.setExpanded(expanded);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
index f74d2f4..3efaaff 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
@@ -236,4 +236,8 @@
public void onExpandingFinished() {
}
+
+ public void onClosingFinished() {
+
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index a7ff0bd..0ddda8a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -68,7 +68,6 @@
protected int mTouchSlop;
protected boolean mHintAnimationRunning;
private boolean mOverExpandedBeforeFling;
- private float mOriginalIndicationY;
private boolean mTouchAboveFalsingThreshold;
private int mUnlockFalsingThreshold;
@@ -107,7 +106,7 @@
};
protected void onExpandingFinished() {
- mClosing = false;
+ endClosing();
mBar.onExpandingFinished();
}
@@ -250,9 +249,7 @@
trackMovement(event);
if (!waitForTouchSlop || (mHeightAnimator != null && !mHintAnimationRunning) ||
mPeekPending || mPeekAnimator != null) {
- if (mHeightAnimator != null) {
- mHeightAnimator.cancel(); // end any outstanding animations
- }
+ cancelHeightAnimator();
cancelPeek();
mTouchSlopExceeded = (mHeightAnimator != null && !mHintAnimationRunning)
|| mPeekPending || mPeekAnimator != null;
@@ -293,9 +290,7 @@
mInitialTouchY = y;
h = 0;
}
- if (mHeightAnimator != null) {
- mHeightAnimator.cancel(); // end any outstanding animations
- }
+ cancelHeightAnimator();
removeCallbacks(mPeekRunnable);
mPeekPending = false;
onTrackingStarted();
@@ -372,7 +367,7 @@
}
protected void onTrackingStarted() {
- mClosing = false;
+ endClosing();
mTracking = true;
mCollapseAfterPeek = false;
mBar.onTrackingStarted(PanelView.this);
@@ -407,9 +402,7 @@
mStatusBar.userActivity();
if (mHeightAnimator != null && !mHintAnimationRunning ||
mPeekPending || mPeekAnimator != null) {
- if (mHeightAnimator != null) {
- mHeightAnimator.cancel(); // end any outstanding animations
- }
+ cancelHeightAnimator();
cancelPeek();
mTouchSlopExceeded = true;
return true;
@@ -441,9 +434,7 @@
trackMovement(event);
if (scrolledToBottom) {
if (h < -mTouchSlop && h < -Math.abs(x - mInitialTouchX)) {
- if (mHeightAnimator != null) {
- mHeightAnimator.cancel();
- }
+ cancelHeightAnimator();
mInitialOffsetOnTouch = mExpandedHeight;
mInitialTouchY = y;
mInitialTouchX = x;
@@ -461,6 +452,20 @@
return false;
}
+ private void cancelHeightAnimator() {
+ if (mHeightAnimator != null) {
+ mHeightAnimator.cancel();
+ }
+ endClosing();
+ }
+
+ private void endClosing() {
+ if (mClosing) {
+ mClosing = false;
+ onClosingFinished();
+ }
+ }
+
private void initVelocityTracker() {
if (mVelocityTracker != null) {
mVelocityTracker.recycle();
@@ -700,9 +705,7 @@
mPeekRunnable.run();
}
} else if (!isFullyCollapsed() && !mTracking && !mClosing) {
- if (mHeightAnimator != null) {
- mHeightAnimator.cancel();
- }
+ cancelHeightAnimator();
mClosing = true;
notifyExpandingStarted();
if (delayed) {
@@ -785,13 +788,16 @@
private void abortAnimations() {
cancelPeek();
- if (mHeightAnimator != null) {
- mHeightAnimator.cancel();
- }
+ cancelHeightAnimator();
removeCallbacks(mPostCollapseRunnable);
removeCallbacks(mFlingCollapseRunnable);
}
+ protected void onClosingFinished() {
+ mBar.onClosingFinished();
+ }
+
+
protected void startUnlockHintAnimation() {
// We don't need to hint the user if an animation is already running or the user is changing
@@ -841,16 +847,15 @@
});
animator.start();
mHeightAnimator = animator;
- mOriginalIndicationY = mKeyguardBottomArea.getIndicationView().getY();
mKeyguardBottomArea.getIndicationView().animate()
- .y(mOriginalIndicationY - mHintDistance)
+ .translationY(-mHintDistance)
.setDuration(250)
.setInterpolator(mFastOutSlowInInterpolator)
.withEndAction(new Runnable() {
@Override
public void run() {
mKeyguardBottomArea.getIndicationView().animate()
- .y(mOriginalIndicationY)
+ .translationY(0)
.setDuration(450)
.setInterpolator(mBounceInterpolator)
.start();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 4980c1c..be27ddc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -175,6 +175,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
DragDownHelper.DragDownCallback, ActivityStarter {
@@ -800,7 +801,9 @@
}
mUserInfoController = new UserInfoController(mContext);
mVolumeComponent = getComponent(VolumeComponent.class);
- mZenModeController = mVolumeComponent.getZenController();
+ if (mVolumeComponent != null) {
+ mZenModeController = mVolumeComponent.getZenController();
+ }
mCastController = new CastControllerImpl(mContext);
final SignalClusterView signalCluster =
(SignalClusterView) mStatusBarView.findViewById(R.id.signal_cluster);
@@ -2963,6 +2966,11 @@
if (mSecurityController != null) {
mSecurityController.dump(fd, pw, args);
}
+ pw.println("SharedPreferences:");
+ for (Map.Entry<String, ?> entry : mContext.getSharedPreferences(mContext.getPackageName(),
+ Context.MODE_PRIVATE).getAll().entrySet()) {
+ pw.print(" "); pw.print(entry.getKey()); pw.print("="); pw.println(entry.getValue());
+ }
}
private String hunStateToString(Entry entry) {
@@ -3787,6 +3795,10 @@
runPostCollapseRunnables();
}
+ public void onClosingFinished() {
+ runPostCollapseRunnables();
+ }
+
public void onUnlockHintStarted() {
mKeyguardIndicationController.showTransientIndication(R.string.keyguard_unlock);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
index 6411fb8..e4eae38 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
@@ -20,7 +20,6 @@
import android.content.res.Resources;
import android.util.AttributeSet;
import android.util.EventLog;
-import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
@@ -152,6 +151,12 @@
}
@Override
+ public void onClosingFinished() {
+ super.onClosingFinished();
+ mBar.onClosingFinished();
+ }
+
+ @Override
public void onTrackingStopped(PanelView panel, boolean expand) {
super.onTrackingStopped(panel, expand);
mBar.onTrackingStopped(expand);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
index ca853a9..247252c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
@@ -302,9 +302,6 @@
updateSystemIconsLayoutParams();
updateClickTargets();
updateMultiUserSwitch();
- if (mQSPanel != null) {
- mQSPanel.setExpanded(mExpanded);
- }
updateClockScale();
updateAvatarScale();
updateClockLp();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrustDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrustDrawable.java
index dcda2c7..b89aa8f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrustDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/TrustDrawable.java
@@ -133,6 +133,7 @@
if (!mAnimating) {
mAnimating = true;
updateState(true);
+ invalidateSelf();
}
}
@@ -146,18 +147,21 @@
mState = STATE_UNSET;
mCurAlpha = 0;
mCurInnerRadius = mInnerRadiusEnter;
+ invalidateSelf();
}
}
public void setTrustManaged(boolean trustManaged) {
if (trustManaged == mTrustManaged && mState != STATE_UNSET) return;
mTrustManaged = trustManaged;
- if (mAnimating) {
- updateState(true);
- }
+ updateState(true);
}
- private void updateState(boolean animate) {
+ private void updateState(boolean allowTransientState) {
+ if (!mAnimating) {
+ return;
+ }
+
int nextState = mState;
if (mState == STATE_UNSET) {
nextState = mTrustManaged ? STATE_ENTERING : STATE_GONE;
@@ -170,7 +174,7 @@
} else if (mState == STATE_EXITING) {
if (mTrustManaged) nextState = STATE_ENTERING;
}
- if (!animate) {
+ if (!allowTransientState) {
if (nextState == STATE_ENTERING) nextState = STATE_VISIBLE;
if (nextState == STATE_EXITING) nextState = STATE_GONE;
}
@@ -200,9 +204,8 @@
mState = nextState;
if (mCurAnimator != null) {
mCurAnimator.start();
- } else {
- invalidateSelf();
}
+ invalidateSelf();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java
deleted file mode 100644
index f339401..0000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Prefs.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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";
-
- 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/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index eb808c2..5c7909a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -571,6 +571,9 @@
cancel();
} else {
dismiss();
+ if (ActivityManager.isUserAMonkey()) {
+ return;
+ }
UserInfo user = mUserManager.createSecondaryUser(
mContext.getString(R.string.user_new_user_name), 0 /* flags */);
if (user == null) {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java
index 0586a83..0fe6d89 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java
@@ -1,7 +1,6 @@
package com.android.systemui.volume;
import android.content.Context;
-import android.content.Intent;
import android.content.res.Configuration;
import android.database.ContentObserver;
import android.media.AudioManager;
@@ -11,13 +10,10 @@
import android.media.session.MediaController;
import android.media.session.MediaSessionManager;
import android.net.Uri;
-import android.os.AsyncTask;
import android.os.Handler;
import android.os.RemoteException;
-import android.os.UserHandle;
import android.provider.Settings;
import android.util.Log;
-import android.view.WindowManagerGlobal;
import com.android.systemui.R;
import com.android.systemui.SystemUI;
@@ -53,6 +49,7 @@
private final Handler mHandler = new Handler();
+ private boolean mEnabled;
private AudioManager mAudioManager;
private MediaSessionManager mMediaSessionManager;
private VolumeController mVolumeController;
@@ -63,6 +60,8 @@
@Override
public void start() {
+ mEnabled = mContext.getResources().getBoolean(R.bool.enable_volume_ui);
+ if (!mEnabled) return;
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
mMediaSessionManager = (MediaSessionManager) mContext
.getSystemService(Context.MEDIA_SESSION_SERVICE);
@@ -84,6 +83,7 @@
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ pw.print("mEnabled="); pw.println(mEnabled);
if (mPanel != null) {
mPanel.dump(fd, pw, args);
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
index ea431ae..69be377 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
@@ -430,7 +430,8 @@
}
tag.condition = condition;
tag.rb.setEnabled(enabled);
- if (sameConditionId(mSessionExitCondition, tag.condition)) {
+ if (mSessionExitCondition != null
+ && sameConditionId(mSessionExitCondition, tag.condition)) {
tag.rb.setChecked(true);
}
tag.rb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@@ -690,7 +691,7 @@
}
private SharedPreferences prefs() {
- return mContext.getSharedPreferences(ZenModePanel.class.getSimpleName(), 0);
+ return mContext.getSharedPreferences(mContext.getPackageName(), 0);
}
private void updateMinuteIndex() {
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index 9c81f0a..1ed61fd 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -3342,9 +3342,9 @@
final boolean noActionBar = !hasFeature(FEATURE_ACTION_BAR) || hasFeature(FEATURE_NO_TITLE);
if (targetPreHoneycomb || (targetPreIcs && targetHcNeedsOptions && noActionBar)) {
- addFlags(WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY);
+ setNeedsMenuKey(WindowManager.LayoutParams.NEEDS_MENU_SET_TRUE);
} else {
- clearFlags(WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY);
+ setNeedsMenuKey(WindowManager.LayoutParams.NEEDS_MENU_SET_FALSE);
}
// Non-floating windows on high end devices must put up decor beneath the system bars and
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 4b2e8aa..558cf56 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -503,6 +503,14 @@
// What we do when the user double-taps on home
private int mDoubleTapOnHomeBehavior;
+ // Allowed theater mode wake actions
+ private boolean mAllowTheaterModeWakeFromKey;
+ private boolean mAllowTheaterModeWakeFromPowerKey;
+ private boolean mAllowTheaterModeWakeFromMotion;
+ private boolean mAllowTheaterModeWakeFromCameraLens;
+ private boolean mAllowTheaterModeWakeFromLidSwitch;
+ private boolean mAllowTheaterModeWakeFromWakeGesture;
+
// Screenshot trigger states
// Time to volume and power must be pressed within this interval of each other.
private static final long SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS = 150;
@@ -656,7 +664,7 @@
synchronized (mLock) {
if (shouldEnableWakeGestureLp()) {
performHapticFeedbackLw(null, HapticFeedbackConstants.VIRTUAL_KEY, false);
- mPowerManager.wakeUp(SystemClock.uptimeMillis());
+ wakeUp(SystemClock.uptimeMillis(), mAllowTheaterModeWakeFromWakeGesture);
}
}
}
@@ -1022,6 +1030,21 @@
com.android.internal.R.bool.config_lidControlsSleep);
mTranslucentDecorEnabled = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_enableTranslucentDecor);
+
+ mAllowTheaterModeWakeFromKey = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_allowTheaterModeWakeFromKey);
+ mAllowTheaterModeWakeFromPowerKey = mAllowTheaterModeWakeFromKey
+ || mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_allowTheaterModeWakeFromPowerKey);
+ mAllowTheaterModeWakeFromMotion = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_allowTheaterModeWakeFromMotion);
+ mAllowTheaterModeWakeFromCameraLens = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_allowTheaterModeWakeFromCameraLens);
+ mAllowTheaterModeWakeFromLidSwitch = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_allowTheaterModeWakeFromLidSwitch);
+ mAllowTheaterModeWakeFromWakeGesture = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_allowTheaterModeWakeFromGesture);
+
readConfigurationDependentBehaviors();
mAccessibilityManager = (AccessibilityManager) context.getSystemService(
@@ -1408,6 +1431,7 @@
case TYPE_WALLPAPER:
case TYPE_PRIVATE_PRESENTATION:
case TYPE_VOICE_INTERACTION:
+ case TYPE_ACCESSIBILITY_OVERLAY:
// The window manager will check these.
break;
case TYPE_PHONE:
@@ -1461,7 +1485,6 @@
case TYPE_PHONE:
case TYPE_POINTER:
case TYPE_PRIORITY_PHONE:
- case TYPE_RECENTS_OVERLAY:
case TYPE_SEARCH_BAR:
case TYPE_STATUS_BAR:
case TYPE_STATUS_BAR_PANEL:
@@ -1580,7 +1603,6 @@
case TYPE_VOICE_INTERACTION:
// voice interaction layer is almost immediately above apps.
return 5;
- case TYPE_RECENTS_OVERLAY:
case TYPE_SYSTEM_DIALOG:
return 6;
case TYPE_TOAST:
@@ -1639,15 +1661,18 @@
// the drag layer: input for drag-and-drop is associated with this window,
// which sits above all other focusable windows
return 25;
- case TYPE_SECURE_SYSTEM_OVERLAY:
+ case TYPE_ACCESSIBILITY_OVERLAY:
+ // overlay put by accessibility services to intercept user interaction
return 26;
- case TYPE_BOOT_PROGRESS:
+ case TYPE_SECURE_SYSTEM_OVERLAY:
return 27;
+ case TYPE_BOOT_PROGRESS:
+ return 28;
case TYPE_POINTER:
// the (mouse) pointer layer
- return 28;
- case TYPE_HIDDEN_NAV_CONSUMER:
return 29;
+ case TYPE_HIDDEN_NAV_CONSUMER:
+ return 30;
}
Log.e(TAG, "Unknown window type: " + type);
return 2;
@@ -1951,7 +1976,6 @@
}
mKeyguardScrim = win;
break;
-
}
return WindowManagerGlobal.ADD_OKAY;
}
@@ -3183,10 +3207,15 @@
// whether it is taking care of insetting its content. If not,
// we need to use the parent's content frame so that the entire
// window is positioned within that content. Otherwise we can use
- // the display frame and let the attached window take care of
+ // the overscan frame and let the attached window take care of
// positioning its content appropriately.
if (adjust != SOFT_INPUT_ADJUST_RESIZE) {
- cf.set(attached.getOverscanFrameLw());
+ // Set the content frame of the attached window to the parent's decor frame
+ // (same as content frame when IME isn't present) if specifically requested by
+ // setting {@link WindowManager.LayoutParams#FLAG_LAYOUT_ATTACHED_IN_DECOR} flag.
+ // Otherwise, use the overscan frame.
+ cf.set((fl & FLAG_LAYOUT_ATTACHED_IN_DECOR) != 0
+ ? attached.getContentFrameLw() : attached.getOverscanFrameLw());
} else {
// If the window is resizing, then we want to base the content
// frame on our attached content frame to resize... however,
@@ -4062,7 +4091,7 @@
updateRotation(true);
if (lidOpen) {
- mPowerManager.wakeUp(SystemClock.uptimeMillis());
+ wakeUp(SystemClock.uptimeMillis(), mAllowTheaterModeWakeFromLidSwitch);
} else if (!mLidControlsSleep) {
mPowerManager.userActivity(SystemClock.uptimeMillis(), false);
}
@@ -4084,7 +4113,7 @@
} else {
intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
}
- mPowerManager.wakeUp(whenNanos / 1000000);
+ wakeUp(whenNanos / 1000000, mAllowTheaterModeWakeFromCameraLens);
mContext.startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF);
}
mCameraLensCoverState = lensCoverState;
@@ -4262,7 +4291,8 @@
// key processing.
if (mGlobalKeyManager.shouldHandleGlobalKey(keyCode, event)) {
if (isWakeKey) {
- mPowerManager.wakeUp(event.getEventTime());
+ wakeUp(event.getEventTime(), keyCode == KeyEvent.KEYCODE_POWER
+ ? mAllowTheaterModeWakeFromPowerKey : mAllowTheaterModeWakeFromKey);
}
return result;
}
@@ -4511,8 +4541,10 @@
}
if (isWakeKey) {
- mPowerManager.wakeUp(event.getEventTime());
+ wakeUp(event.getEventTime(), keyCode == KeyEvent.KEYCODE_POWER
+ ? mAllowTheaterModeWakeFromPowerKey : mAllowTheaterModeWakeFromKey);
}
+
return result;
}
@@ -4555,7 +4587,7 @@
@Override
public int interceptMotionBeforeQueueingNonInteractive(long whenNanos, int policyFlags) {
if ((policyFlags & FLAG_WAKE) != 0) {
- mPowerManager.wakeUp(whenNanos / 1000000);
+ wakeUp(whenNanos / 1000000, mAllowTheaterModeWakeFromMotion);
return 0;
}
if (shouldDispatchInputWhenNonInteractive()) {
@@ -4733,6 +4765,14 @@
}
}
+ private void wakeUp(long wakeTime, boolean wakeInTheaterMode) {
+ if (!wakeInTheaterMode && isTheaterModeEnabled()) {
+ return;
+ }
+
+ mPowerManager.wakeUp(wakeTime);
+ }
+
// Called on the PowerManager's Notifier thread.
@Override
public void wakingUp() {
@@ -5611,6 +5651,11 @@
ringTone.play();
}
+ private boolean isTheaterModeEnabled() {
+ return Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.THEATER_MODE_ON, 0) == 1;
+ }
+
private boolean isGlobalAccessibilityGestureEnabled() {
return Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.ENABLE_ACCESSIBILITY_GLOBAL_GESTURE_ENABLED, 0) == 1;
diff --git a/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java b/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java
deleted file mode 100644
index bc55ed1..0000000
--- a/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java
+++ /dev/null
@@ -1,347 +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 com.android.internal.policy.impl;
-
-import android.app.ActivityManager;
-import android.app.Dialog;
-import android.app.StatusBarManager;
-import android.content.ActivityNotFoundException;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.os.Handler;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.SoundEffectConstants;
-import android.view.View;
-import android.view.Window;
-import android.view.WindowManager;
-import android.view.View.OnClickListener;
-import android.widget.TextView;
-
-import java.util.List;
-
-public class RecentApplicationsDialog extends Dialog implements OnClickListener {
- // Elements for debugging support
-// private static final String LOG_TAG = "RecentApplicationsDialog";
- private static final boolean DBG_FORCE_EMPTY_LIST = false;
-
- static private StatusBarManager sStatusBar;
-
- private static final int NUM_BUTTONS = 8;
- private static final int MAX_RECENT_TASKS = NUM_BUTTONS * 2; // allow for some discards
-
- final TextView[] mIcons = new TextView[NUM_BUTTONS];
- View mNoAppsText;
- IntentFilter mBroadcastIntentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
-
- class RecentTag {
- ActivityManager.RecentTaskInfo info;
- Intent intent;
- }
-
- Handler mHandler = new Handler();
- Runnable mCleanup = new Runnable() {
- public void run() {
- // dump extra memory we're hanging on to
- for (TextView icon: mIcons) {
- icon.setCompoundDrawables(null, null, null, null);
- icon.setTag(null);
- }
- }
- };
-
- public RecentApplicationsDialog(Context context) {
- super(context, com.android.internal.R.style.Theme_Dialog_RecentApplications);
-
- }
-
- /**
- * We create the recent applications dialog just once, and it stays around (hidden)
- * until activated by the user.
- *
- * @see PhoneWindowManager#showRecentAppsDialog
- */
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- Context context = getContext();
-
- if (sStatusBar == null) {
- sStatusBar = (StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE);
- }
-
- Window window = getWindow();
- window.requestFeature(Window.FEATURE_NO_TITLE);
- window.setType(WindowManager.LayoutParams.TYPE_RECENTS_OVERLAY);
- window.setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
- WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
- window.setTitle("Recents");
-
- setContentView(com.android.internal.R.layout.recent_apps_dialog);
-
- final WindowManager.LayoutParams params = window.getAttributes();
- params.width = WindowManager.LayoutParams.MATCH_PARENT;
- params.height = WindowManager.LayoutParams.MATCH_PARENT;
- window.setAttributes(params);
- window.setFlags(0, WindowManager.LayoutParams.FLAG_DIM_BEHIND);
-
- mIcons[0] = (TextView)findViewById(com.android.internal.R.id.button0);
- mIcons[1] = (TextView)findViewById(com.android.internal.R.id.button1);
- mIcons[2] = (TextView)findViewById(com.android.internal.R.id.button2);
- mIcons[3] = (TextView)findViewById(com.android.internal.R.id.button3);
- mIcons[4] = (TextView)findViewById(com.android.internal.R.id.button4);
- mIcons[5] = (TextView)findViewById(com.android.internal.R.id.button5);
- mIcons[6] = (TextView)findViewById(com.android.internal.R.id.button6);
- mIcons[7] = (TextView)findViewById(com.android.internal.R.id.button7);
- mNoAppsText = findViewById(com.android.internal.R.id.no_applications_message);
-
- for (TextView b: mIcons) {
- b.setOnClickListener(this);
- }
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_TAB) {
- // Ignore all meta keys other than SHIFT. The app switch key could be a
- // fallback action chorded with ALT, META or even CTRL depending on the key map.
- // DPad navigation is handled by the ViewRoot elsewhere.
- final boolean backward = event.isShiftPressed();
- final int numIcons = mIcons.length;
- int numButtons = 0;
- while (numButtons < numIcons && mIcons[numButtons].getVisibility() == View.VISIBLE) {
- numButtons += 1;
- }
- if (numButtons != 0) {
- int nextFocus = backward ? numButtons - 1 : 0;
- for (int i = 0; i < numButtons; i++) {
- if (mIcons[i].hasFocus()) {
- if (backward) {
- nextFocus = (i + numButtons - 1) % numButtons;
- } else {
- nextFocus = (i + 1) % numButtons;
- }
- break;
- }
- }
- final int direction = backward ? View.FOCUS_BACKWARD : View.FOCUS_FORWARD;
- if (mIcons[nextFocus].requestFocus(direction)) {
- mIcons[nextFocus].playSoundEffect(
- SoundEffectConstants.getContantForFocusDirection(direction));
- }
- }
-
- // The dialog always handles the key to prevent the ViewRoot from
- // performing the default navigation itself.
- return true;
- }
-
- return super.onKeyDown(keyCode, event);
- }
-
- /**
- * Dismiss the dialog and switch to the selected application.
- */
- public void dismissAndSwitch() {
- final int numIcons = mIcons.length;
- RecentTag tag = null;
- for (int i = 0; i < numIcons; i++) {
- if (mIcons[i].getVisibility() != View.VISIBLE) {
- break;
- }
- if (i == 0 || mIcons[i].hasFocus()) {
- tag = (RecentTag) mIcons[i].getTag();
- if (mIcons[i].hasFocus()) {
- break;
- }
- }
- }
- if (tag != null) {
- switchTo(tag);
- }
- dismiss();
- }
-
- /**
- * Handler for user clicks. If a button was clicked, launch the corresponding activity.
- */
- public void onClick(View v) {
- for (TextView b: mIcons) {
- if (b == v) {
- RecentTag tag = (RecentTag)b.getTag();
- switchTo(tag);
- break;
- }
- }
- dismiss();
- }
-
- private void switchTo(RecentTag tag) {
- if (tag.info.id >= 0) {
- // This is an active task; it should just go to the foreground.
- final ActivityManager am = (ActivityManager)
- getContext().getSystemService(Context.ACTIVITY_SERVICE);
- am.moveTaskToFront(tag.info.id, ActivityManager.MOVE_TASK_WITH_HOME);
- } else if (tag.intent != null) {
- tag.intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
- | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
- try {
- getContext().startActivity(tag.intent);
- } catch (ActivityNotFoundException e) {
- Log.w("Recent", "Unable to launch recent task", e);
- }
- }
- }
-
- /**
- * Set up and show the recent activities dialog.
- */
- @Override
- public void onStart() {
- super.onStart();
- reloadButtons();
- if (sStatusBar != null) {
- sStatusBar.disable(StatusBarManager.DISABLE_EXPAND);
- }
-
- // receive broadcasts
- getContext().registerReceiver(mBroadcastReceiver, mBroadcastIntentFilter);
-
- mHandler.removeCallbacks(mCleanup);
- }
-
- /**
- * Dismiss the recent activities dialog.
- */
- @Override
- public void onStop() {
- super.onStop();
-
- if (sStatusBar != null) {
- sStatusBar.disable(StatusBarManager.DISABLE_NONE);
- }
-
- // stop receiving broadcasts
- getContext().unregisterReceiver(mBroadcastReceiver);
-
- mHandler.postDelayed(mCleanup, 100);
- }
-
- /**
- * Reload the 6 buttons with recent activities
- */
- private void reloadButtons() {
-
- final Context context = getContext();
- final PackageManager pm = context.getPackageManager();
- final ActivityManager am = (ActivityManager)
- context.getSystemService(Context.ACTIVITY_SERVICE);
- final List<ActivityManager.RecentTaskInfo> recentTasks =
- am.getRecentTasks(MAX_RECENT_TASKS, ActivityManager.RECENT_IGNORE_UNAVAILABLE);
-
- ActivityInfo homeInfo =
- new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME)
- .resolveActivityInfo(pm, 0);
-
- IconUtilities iconUtilities = new IconUtilities(getContext());
-
- // Performance note: Our android performance guide says to prefer Iterator when
- // using a List class, but because we know that getRecentTasks() always returns
- // an ArrayList<>, we'll use a simple index instead.
- int index = 0;
- int numTasks = recentTasks.size();
- for (int i = 0; i < numTasks && (index < NUM_BUTTONS); ++i) {
- final ActivityManager.RecentTaskInfo info = recentTasks.get(i);
-
- // for debug purposes only, disallow first result to create empty lists
- if (DBG_FORCE_EMPTY_LIST && (i == 0)) continue;
-
- Intent intent = new Intent(info.baseIntent);
- if (info.origActivity != null) {
- intent.setComponent(info.origActivity);
- }
-
- // Skip the current home activity.
- if (homeInfo != null) {
- if (homeInfo.packageName.equals(
- intent.getComponent().getPackageName())
- && homeInfo.name.equals(
- intent.getComponent().getClassName())) {
- continue;
- }
- }
-
- intent.setFlags((intent.getFlags()&~Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
- | Intent.FLAG_ACTIVITY_NEW_TASK);
- final ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
- if (resolveInfo != null) {
- final ActivityInfo activityInfo = resolveInfo.activityInfo;
- final String title = activityInfo.loadLabel(pm).toString();
- Drawable icon = activityInfo.loadIcon(pm);
-
- if (title != null && title.length() > 0 && icon != null) {
- final TextView tv = mIcons[index];
- tv.setText(title);
- icon = iconUtilities.createIconDrawable(icon);
- tv.setCompoundDrawables(null, icon, null, null);
- RecentTag tag = new RecentTag();
- tag.info = info;
- tag.intent = intent;
- tv.setTag(tag);
- tv.setVisibility(View.VISIBLE);
- tv.setPressed(false);
- tv.clearFocus();
- ++index;
- }
- }
- }
-
- // handle the case of "no icons to show"
- mNoAppsText.setVisibility((index == 0) ? View.VISIBLE : View.GONE);
-
- // hide the rest
- for (; index < NUM_BUTTONS; ++index) {
- mIcons[index].setVisibility(View.GONE);
- }
- }
-
- /**
- * This is the listener for the ACTION_CLOSE_SYSTEM_DIALOGS intent. It's an indication that
- * we should close ourselves immediately, in order to allow a higher-priority UI to take over
- * (e.g. phone call received).
- */
- private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
- String reason = intent.getStringExtra(PhoneWindowManager.SYSTEM_DIALOG_REASON_KEY);
- if (! PhoneWindowManager.SYSTEM_DIALOG_REASON_RECENT_APPS.equals(reason)) {
- dismiss();
- }
- }
- }
- };
-}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 8ef5b04..2781890 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -67,7 +67,6 @@
import android.util.Pools.SimplePool;
import android.util.Slog;
import android.util.SparseArray;
-import android.view.AccessibilityManagerInternal;
import android.view.Display;
import android.view.IWindow;
import android.view.InputDevice;
@@ -235,7 +234,6 @@
registerBroadcastReceivers();
new AccessibilityContentObserver(mMainHandler).register(
context.getContentResolver());
- LocalServices.addService(AccessibilityManagerInternal.class, new LocalService());
}
private UserState getUserStateLocked(int userId) {
@@ -1042,7 +1040,7 @@
private void addServiceLocked(Service service, UserState userState) {
try {
- service.linkToOwnDeathLocked();
+ service.onAdded();
userState.mBoundServices.add(service);
userState.mComponentNameToServiceMap.put(service.mComponentName, service);
} catch (RemoteException re) {
@@ -1058,7 +1056,7 @@
private void removeServiceLocked(Service service, UserState userState) {
userState.mBoundServices.remove(service);
userState.mComponentNameToServiceMap.remove(service.mComponentName);
- service.unlinkToOwnDeathLocked();
+ service.onRemoved();
}
/**
@@ -1331,7 +1329,6 @@
updateTouchExplorationLocked(userState);
updateEnhancedWebAccessibilityLocked(userState);
updateDisplayColorAdjustmentSettingsLocked(userState);
- updateEncryptionState(userState);
scheduleUpdateInputFilter(userState);
scheduleUpdateClientsIfNeededLocked(userState);
}
@@ -1608,22 +1605,6 @@
DisplayAdjustmentUtils.applyAdjustments(mContext, userState.mUserId);
}
- private void updateEncryptionState(UserState userState) {
- if (userState.mUserId != UserHandle.USER_OWNER) {
- return;
- }
- final long identity = Binder.clearCallingIdentity();
- try {
- if (hasRunningServicesLocked(userState) && LockPatternUtils.isDeviceEncrypted()) {
- // If there are running accessibility services we do not have encryption as
- // the user needs the accessibility layer to be running to authenticate.
- mLockPatternUtils.clearEncryptionPassword();
- }
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
-
private boolean hasRunningServicesLocked(UserState userState) {
return !userState.mBoundServices.isEmpty() || !userState.mBindingServices.isEmpty();
}
@@ -1950,6 +1931,8 @@
final ResolveInfo mResolveInfo;
+ final IBinder mOverlayWindowToken = new Binder();
+
// the events pending events to be dispatched to this service
final SparseArray<AccessibilityEvent> mPendingEvents =
new SparseArray<>();
@@ -2131,7 +2114,7 @@
userState.mBindingServices.remove(mComponentName);
mWasConnectedAndDied = false;
try {
- mServiceInterface.setConnection(this, mId);
+ mServiceInterface.init(this, mId, mOverlayWindowToken);
onUserStateChangedLocked(userState);
} catch (RemoteException re) {
Slog.w(LOG_TAG, "Error while setting connection for service: "
@@ -2621,6 +2604,27 @@
/* do nothing - #binderDied takes care */
}
+ public void onAdded() throws RemoteException {
+ linkToOwnDeathLocked();
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mWindowManagerService.addWindowToken(mOverlayWindowToken,
+ WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ public void onRemoved() {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mWindowManagerService.removeWindowToken(mOverlayWindowToken, true);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ unlinkToOwnDeathLocked();
+ }
+
public void linkToOwnDeathLocked() throws RemoteException {
mService.linkToDeath(this, 0);
}
@@ -2633,7 +2637,7 @@
try {
// Clear the proxy in the other process so this
// IAccessibilityServiceConnection can be garbage collected.
- mServiceInterface.setConnection(null, mId);
+ mServiceInterface.init(null, mId, null);
} catch (RemoteException re) {
/* ignore */
}
@@ -3175,7 +3179,6 @@
case WindowManager.LayoutParams.TYPE_STATUS_BAR:
case WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL:
case WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL:
- case WindowManager.LayoutParams.TYPE_RECENTS_OVERLAY:
case WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY:
case WindowManager.LayoutParams.TYPE_SYSTEM_ALERT:
case WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG:
@@ -3184,6 +3187,10 @@
return AccessibilityWindowInfo.TYPE_SYSTEM;
}
+ case WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY: {
+ return AccessibilityWindowInfo.TYPE_ACCESSIBILITY_OVERLAY;
+ }
+
default: {
return -1;
}
@@ -3331,6 +3338,7 @@
}
// $fall-through$
case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
+ case AccessibilityEvent.TYPE_ANNOUNCEMENT:
// All events generated by the user touching the
// screen should *always* be dispatched.
case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START:
@@ -3969,14 +3977,4 @@
}
}
}
-
- private final class LocalService extends AccessibilityManagerInternal {
- @Override
- public boolean isNonDefaultEncryptionPasswordAllowed() {
- synchronized (mLock) {
- UserState userState = getCurrentUserStateLocked();
- return !hasRunningServicesLocked(userState);
- }
- }
- }
}
diff --git a/services/core/java/com/android/server/DockObserver.java b/services/core/java/com/android/server/DockObserver.java
index d05c280..41ce25d 100644
--- a/services/core/java/com/android/server/DockObserver.java
+++ b/services/core/java/com/android/server/DockObserver.java
@@ -65,11 +65,15 @@
private boolean mUpdatesStopped;
+ private final boolean mAllowTheaterModeWakeFromDock;
+
public DockObserver(Context context) {
super(context);
mPowerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
+ mAllowTheaterModeWakeFromDock = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_allowTheaterModeWakeFromDock);
init(); // set initial status
@@ -126,8 +130,12 @@
if (newState != mReportedDockState) {
mReportedDockState = newState;
if (mSystemReady) {
- // Wake up immediately when docked or undocked.
- mPowerManager.wakeUp(SystemClock.uptimeMillis());
+ // Wake up immediately when docked or undocked except in theater mode.
+ if (mAllowTheaterModeWakeFromDock
+ || Settings.Global.getInt(getContext().getContentResolver(),
+ Settings.Global.THEATER_MODE_ON, 0) == 0) {
+ mPowerManager.wakeUp(SystemClock.uptimeMillis());
+ }
updateLocked();
}
}
diff --git a/services/core/java/com/android/server/EventLogTags.logtags b/services/core/java/com/android/server/EventLogTags.logtags
index 64d8f6f..eec97f3 100644
--- a/services/core/java/com/android/server/EventLogTags.logtags
+++ b/services/core/java/com/android/server/EventLogTags.logtags
@@ -69,6 +69,10 @@
27511 notification_expansion (key|3),(user_action|1),(expanded|1)
# when a notification has been clicked
27520 notification_clicked (key|3)
+# when a notification action button has been clicked
+27521 notification_action_clicked (key|3),(action_index|1)
+# when a notification has been canceled
+27530 notification_canceled (key|3),(reason|1)
# ---------------------------
# Watchdog.java
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 28a6917..d9c96e4 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -1796,9 +1796,6 @@
@Override
public boolean addGpsStatusListener(IGpsStatusListener listener, String packageName) {
- if (mGpsStatusProvider == null) {
- return false;
- }
int allowedResolutionLevel = getCallerAllowedResolutionLevel();
checkResolutionLevelIsSufficientForProviderUse(allowedResolutionLevel,
LocationManager.GPS_PROVIDER);
@@ -1813,6 +1810,10 @@
Binder.restoreCallingIdentity(ident);
}
+ if (mGpsStatusProvider == null) {
+ return false;
+ }
+
try {
mGpsStatusProvider.addGpsStatusListener(listener);
} catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java
index 976e707..e400fb6 100644
--- a/services/core/java/com/android/server/MountService.java
+++ b/services/core/java/com/android/server/MountService.java
@@ -63,7 +63,6 @@
import android.util.Slog;
import android.util.Xml;
-import android.view.AccessibilityManagerInternal;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.IMediaContainerService;
@@ -558,8 +557,6 @@
private final Handler mHandler;
- private final AccessibilityManagerInternal mAccessibilityManagerInternal;
-
void waitForAsecScan() {
waitForLatch(mAsecsScanned);
}
@@ -829,7 +826,9 @@
// On an encrypted device we can't see system properties yet, so pull
// the system locale out of the mount service.
- copyLocaleFromMountService();
+ if ("".equals(SystemProperties.get("vold.encrypt_progress"))) {
+ copyLocaleFromMountService();
+ }
// Let package manager load internal ASECs.
mPms.scanAvailableAsecs();
@@ -1462,9 +1461,6 @@
hthread.start();
mHandler = new MountServiceHandler(hthread.getLooper());
- mAccessibilityManagerInternal = LocalServices.getService(
- AccessibilityManagerInternal.class);
-
// Watch for user changes
final IntentFilter userFilter = new IntentFilter();
userFilter.addAction(Intent.ACTION_USER_ADDED);
@@ -2263,16 +2259,8 @@
Slog.i(TAG, "changing encryption password...");
}
- final NativeDaemonEvent event;
try {
- // The accessibility layer may veto having a non-default encryption
- // password because if there are enabled accessibility services the
- // user cannot authenticate as the latter need access to the data.
- if (!TextUtils.isEmpty(password)
- && !mAccessibilityManagerInternal.isNonDefaultEncryptionPasswordAllowed()) {
- return getEncryptionState();
- }
- event = mConnector.execute("cryptfs", "changepw", CRYPTO_TYPES[type],
+ NativeDaemonEvent event = mConnector.execute("cryptfs", "changepw", CRYPTO_TYPES[type],
new SensitiveArg(toHex(password)));
return Integer.parseInt(event.getMessage());
} catch (NativeDaemonConnectorException e) {
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 8dfb321..9f1ce0b 100755
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -1734,8 +1734,13 @@
logBuilder.append(" MemInfo: ");
logBuilder.append(infos[Debug.MEMINFO_SLAB]).append(" kB slab, ");
logBuilder.append(infos[Debug.MEMINFO_SHMEM]).append(" kB shmem, ");
+ logBuilder.append(infos[Debug.MEMINFO_VM_ALLOC_USED]).append(" kB vm alloc, ");
+ logBuilder.append(infos[Debug.MEMINFO_PAGE_TABLES]).append(" kB page tables ");
+ logBuilder.append(infos[Debug.MEMINFO_KERNEL_STACK]).append(" kB kernel stack\n");
+ logBuilder.append(" ");
logBuilder.append(infos[Debug.MEMINFO_BUFFERS]).append(" kB buffers, ");
logBuilder.append(infos[Debug.MEMINFO_CACHED]).append(" kB cached, ");
+ logBuilder.append(infos[Debug.MEMINFO_MAPPED]).append(" kB mapped, ");
logBuilder.append(infos[Debug.MEMINFO_FREE]).append(" kB free\n");
if (infos[Debug.MEMINFO_ZRAM_TOTAL] != 0) {
logBuilder.append(" ZRAM: ");
@@ -1952,9 +1957,7 @@
+ (SystemClock.uptimeMillis()-start) + "ms");
mProcessStats.addSysMemUsageLocked(memInfo.getCachedSizeKb(),
memInfo.getFreeSizeKb(), memInfo.getZramTotalSizeKb(),
- memInfo.getBuffersSizeKb()+memInfo.getShmemSizeKb()
- +memInfo.getSlabSizeKb(),
- nativeTotalPss);
+ memInfo.getKernelUsedSizeKb(), nativeTotalPss);
}
}
@@ -8849,7 +8852,8 @@
task = mStackSupervisor.anyTaskForIdLocked(task.taskId);
if (task != null) {
if (!isSystemInitiated
- && ((mFocusedActivity == null) || (task != mFocusedActivity.task))) {
+ && ((mStackSupervisor.getFocusedStack() == null)
+ || (task != mStackSupervisor.getFocusedStack().topTask()))) {
throw new IllegalArgumentException("Invalid task, not in foreground");
}
mStackSupervisor.setLockTaskModeLocked(task, !isSystemInitiated);
@@ -14240,8 +14244,7 @@
synchronized (this) {
mProcessStats.addSysMemUsageLocked(memInfo.getCachedSizeKb(),
memInfo.getFreeSizeKb(), memInfo.getZramTotalSizeKb(),
- memInfo.getBuffersSizeKb()+memInfo.getShmemSizeKb()+memInfo.getSlabSizeKb(),
- nativeProcTotalPss);
+ memInfo.getKernelUsedSizeKb(), nativeProcTotalPss);
}
}
if (!brief) {
@@ -14280,16 +14283,12 @@
}
if (!isCompact) {
pw.print(" Used RAM: "); pw.print(totalPss - cachedPss
- + memInfo.getBuffersSizeKb() + memInfo.getShmemSizeKb()
- + memInfo.getSlabSizeKb()); pw.print(" kB (");
+ + memInfo.getKernelUsedSizeKb()); pw.print(" kB (");
pw.print(totalPss - cachedPss); pw.print(" used pss + ");
- pw.print(memInfo.getBuffersSizeKb()); pw.print(" buffers + ");
- pw.print(memInfo.getShmemSizeKb()); pw.print(" shmem + ");
- pw.print(memInfo.getSlabSizeKb()); pw.println(" slab)");
+ pw.print(memInfo.getKernelUsedSizeKb()); pw.print(" kernel)\n");
pw.print(" Lost RAM: "); pw.print(memInfo.getTotalSizeKb()
- totalPss - memInfo.getFreeSizeKb() - memInfo.getCachedSizeKb()
- - memInfo.getBuffersSizeKb() - memInfo.getShmemSizeKb()
- - memInfo.getSlabSizeKb()); pw.println(" kB");
+ - memInfo.getKernelUsedSizeKb()); pw.println(" kB");
}
if (!brief) {
if (memInfo.getZramTotalSizeKb() != 0) {
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 03dd3c0..c1bf955 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -120,7 +120,7 @@
static final boolean DEBUG_RELEASE = DEBUG || false;
static final boolean DEBUG_SAVED_STATE = DEBUG || false;
static final boolean DEBUG_SCREENSHOTS = DEBUG || false;
- static final boolean DEBUG_STATES = DEBUG || false;
+ static final boolean DEBUG_STATES = DEBUG || true;
static final boolean DEBUG_VISIBLE_BEHIND = DEBUG || false;
public static final int HOME_STACK_ID = 0;
diff --git a/services/core/java/com/android/server/am/LockTaskNotify.java b/services/core/java/com/android/server/am/LockTaskNotify.java
index 5768ddb..b3777ed 100644
--- a/services/core/java/com/android/server/am/LockTaskNotify.java
+++ b/services/core/java/com/android/server/am/LockTaskNotify.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.os.Handler;
import android.os.Message;
+import android.view.WindowManager;
import android.view.accessibility.AccessibilityManager;
import android.widget.Toast;
@@ -56,8 +57,7 @@
if (mLastToast != null) {
mLastToast.cancel();
}
- mLastToast = Toast.makeText(mContext, text, Toast.LENGTH_LONG);
- mLastToast.show();
+ mLastToast = makeAllUserToastAndShow(text);
}
public void show(boolean starting) {
@@ -65,7 +65,15 @@
if (starting) {
showString = R.string.lock_to_app_start;
}
- Toast.makeText(mContext, mContext.getString(showString), Toast.LENGTH_LONG).show();
+ makeAllUserToastAndShow(mContext.getString(showString));
+ }
+
+ private Toast makeAllUserToastAndShow(String text) {
+ Toast toast = Toast.makeText(mContext, text, Toast.LENGTH_LONG);
+ toast.getWindowParams().privateFlags |=
+ WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+ toast.show();
+ return toast;
}
private final class H extends Handler {
diff --git a/services/core/java/com/android/server/am/TaskPersister.java b/services/core/java/com/android/server/am/TaskPersister.java
index afc781f..b331c84 100644
--- a/services/core/java/com/android/server/am/TaskPersister.java
+++ b/services/core/java/com/android/server/am/TaskPersister.java
@@ -166,7 +166,7 @@
break;
}
}
- if (queueNdx < 0) {
+ if (queueNdx < 0 && task.isPersistable) {
mWriteQueue.add(new TaskWriteQueueItem(task));
}
} else {
@@ -473,13 +473,15 @@
if (DEBUG) Slog.d(TAG, "mRecents=" + tasks);
for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) {
final TaskRecord task = tasks.get(taskNdx);
- if (DEBUG) Slog.d(TAG, "LazyTaskWriter: task=" + task + " persistable=" +
- task.isPersistable);
- if (task.isPersistable && !task.stack.isHomeStack()) {
+ if (DEBUG) Slog.d(TAG, "LazyTaskWriter: task=" + task +
+ " persistable=" + task.isPersistable);
+ if ((task.isPersistable || task.inRecents)
+ && !task.stack.isHomeStack()) {
if (DEBUG) Slog.d(TAG, "adding to persistentTaskIds task=" + task);
persistentTaskIds.add(task.taskId);
} else {
- if (DEBUG) Slog.d(TAG, "omitting from persistentTaskIds task=" + task);
+ if (DEBUG) Slog.d(TAG,
+ "omitting from persistentTaskIds task=" + task);
}
}
}
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 4dfd23b..ee93233 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -144,7 +144,7 @@
boolean mReuseTask = false;
private Bitmap mLastThumbnail; // Last thumbnail captured for this item.
- private final File mLastThumbnailFile; // File containing last thubmnail.
+ private final File mLastThumbnailFile; // File containing last thumbnail.
private final String mFilename;
CharSequence lastDescription; // Last description captured for this item.
diff --git a/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java b/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
index cb92112..9593a9c 100644
--- a/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
+++ b/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
@@ -57,8 +57,9 @@
* Handles the incoming active source command.
*
* @param newActive new active source information
+ * @param deviceType device type of the new active source
*/
- void process(ActiveSource newActive) {
+ void process(ActiveSource newActive, int deviceType) {
// Seq #17
HdmiCecLocalDeviceTv tv = mSource;
ActiveSource activeSource = tv.getActiveSource();
@@ -68,7 +69,7 @@
}
HdmiDeviceInfo device = mService.getDeviceInfo(newActive.logicalAddress);
if (device == null) {
- tv.startNewDeviceAction(newActive);
+ tv.startNewDeviceAction(newActive, deviceType);
}
if (!tv.isProhibitMode()) {
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index 836a463..4f8b9fb 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -516,8 +516,8 @@
}
protected boolean handleVendorCommand(HdmiCecMessage message) {
- if (!mService.invokeVendorCommandListeners(mDeviceType, message.getSource(),
- message.getParams(), false)) {
+ if (!mService.invokeVendorCommandListenersOnReceived(mDeviceType, message.getSource(),
+ message.getDestination(), message.getParams(), false)) {
// Vendor command listener may not have been registered yet. Respond with
// <Feature Abort> [NOT_IN_CORRECT_MODE] so that the sender can try again later.
mService.maySendFeatureAbortCommand(message, Constants.ABORT_NOT_IN_CORRECT_MODE);
@@ -529,8 +529,8 @@
byte[] params = message.getParams();
int vendorId = HdmiUtils.threeBytesToInt(params);
if (vendorId == mService.getVendorId()) {
- if (!mService.invokeVendorCommandListeners(mDeviceType, message.getSource(), params,
- true)) {
+ if (!mService.invokeVendorCommandListenersOnReceived(mDeviceType, message.getSource(),
+ message.getDestination(), params, true)) {
mService.maySendFeatureAbortCommand(message, Constants.ABORT_NOT_IN_CORRECT_MODE);
}
} else if (message.getDestination() != Constants.ADDR_BROADCAST &&
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index 1a5678b..6bae761 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -110,6 +110,9 @@
// If true, TV wakes itself up when receiving <Text/Image View On>.
private boolean mAutoWakeup;
+ // List of the logical address of local CEC devices. Unmodifiable, thread-safe.
+ private List<Integer> mLocalDeviceAddresses;
+
private final HdmiCecStandbyModeHandler mStandbyHandler;
// If true, do not do routing control/send active source for internal source.
@@ -141,10 +144,22 @@
mSkipRoutingControl = (reason == HdmiControlService.INITIATED_BY_WAKE_UP_MESSAGE);
launchRoutingControl(reason != HdmiControlService.INITIATED_BY_ENABLE_CEC &&
reason != HdmiControlService.INITIATED_BY_BOOT_UP);
+ mLocalDeviceAddresses = initLocalDeviceAddresses();
launchDeviceDiscovery();
startQueuedActions();
}
+
+ @ServiceThreadOnly
+ private List<Integer> initLocalDeviceAddresses() {
+ assertRunOnServiceThread();
+ List<Integer> addresses = new ArrayList<>();
+ for (HdmiCecLocalDevice device : mService.getAllLocalDevices()) {
+ addresses.add(device.getDeviceInfo().getLogicalAddress());
+ }
+ return Collections.unmodifiableList(addresses);
+ }
+
@Override
@ServiceThreadOnly
protected int getPreferredAddress() {
@@ -390,11 +405,12 @@
assertRunOnServiceThread();
int logicalAddress = message.getSource();
int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
- if (getCecDeviceInfo(logicalAddress) == null) {
+ HdmiDeviceInfo info = getCecDeviceInfo(logicalAddress);
+ if (info == null) {
handleNewDeviceAtTheTailOfActivePath(physicalAddress);
} else {
ActiveSource activeSource = ActiveSource.of(logicalAddress, physicalAddress);
- ActiveSourceHandler.create(this, null).process(activeSource);
+ ActiveSourceHandler.create(this, null).process(activeSource, info.getDeviceType());
}
return true;
}
@@ -484,7 +500,7 @@
if (!isInDeviceList(address, path)) {
handleNewDeviceAtTheTailOfActivePath(path);
}
- startNewDeviceAction(ActiveSource.of(address, path));
+ startNewDeviceAction(ActiveSource.of(address, path), type);
return true;
}
@@ -520,7 +536,7 @@
return false;
}
- void startNewDeviceAction(ActiveSource activeSource) {
+ void startNewDeviceAction(ActiveSource activeSource, int deviceType) {
for (NewDeviceAction action : getActions(NewDeviceAction.class)) {
// If there is new device action which has the same logical address and path
// ignore new request.
@@ -536,7 +552,7 @@
}
addAndStartAction(new NewDeviceAction(this, activeSource.logicalAddress,
- activeSource.physicalAddress));
+ activeSource.physicalAddress, deviceType));
}
private void handleNewDeviceAtTheTailOfActivePath(int path) {
@@ -1195,15 +1211,8 @@
}
}
- @ServiceThreadOnly
private boolean isLocalDeviceAddress(int address) {
- assertRunOnServiceThread();
- for (HdmiCecLocalDevice device : mService.getAllLocalDevices()) {
- if (device.isAddressOf(address)) {
- return true;
- }
- }
- return false;
+ return mLocalDeviceAddresses.contains(address);
}
@ServiceThreadOnly
@@ -1253,6 +1262,17 @@
}
}
+ List<HdmiDeviceInfo> getSafeCecDevicesLocked() {
+ ArrayList<HdmiDeviceInfo> infoList = new ArrayList<>();
+ for (HdmiDeviceInfo info : mSafeAllDeviceInfos) {
+ if (isLocalDeviceAddress(info.getLogicalAddress())) {
+ continue;
+ }
+ infoList.add(info);
+ }
+ return infoList;
+ }
+
/**
* Called when a device is newly added or a new device is detected or
* existing device is updated.
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index 22b7147..e741fc4 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -316,20 +316,23 @@
mMessageValidator = new HdmiCecMessageValidator(this);
publishBinderService(Context.HDMI_CONTROL_SERVICE, new BinderService());
- // Register broadcast receiver for power state change.
if (mCecController != null) {
+ // Register broadcast receiver for power state change.
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
getContext().registerReceiver(mHdmiControlBroadcastReceiver, filter);
+
+ // Register ContentObserver to monitor the settings change.
+ registerContentObserver();
}
}
/**
* Called when the initialization of local devices is complete.
*/
- private void onInitializeCecComplete() {
+ private void onInitializeCecComplete(int initiatedBy) {
if (mPowerStatus == HdmiControlManager.POWER_STATUS_TRANSIENT_TO_ON) {
mPowerStatus = HdmiControlManager.POWER_STATUS_ON;
}
@@ -337,7 +340,22 @@
if (isTvDevice()) {
mCecController.setOption(OPTION_CEC_AUTO_WAKEUP, toInt(tv().getAutoWakeup()));
- registerContentObserver();
+ }
+ int reason = -1;
+ switch (initiatedBy) {
+ case INITIATED_BY_BOOT_UP:
+ reason = HdmiControlManager.CONTROL_STATE_CHANGED_REASON_START;
+ break;
+ case INITIATED_BY_ENABLE_CEC:
+ reason = HdmiControlManager.CONTROL_STATE_CHANGED_REASON_SETTING;
+ break;
+ case INITIATED_BY_SCREEN_ON:
+ case INITIATED_BY_WAKE_UP_MESSAGE:
+ reason = HdmiControlManager.CONTROL_STATE_CHANGED_REASON_WAKEUP;
+ break;
+ }
+ if (reason != -1) {
+ invokeVendorCommandListenersOnControlStateChanged(true, reason);
}
}
@@ -402,10 +420,6 @@
Global.putInt(cr, key, toInt(value));
}
- private void unregisterSettingsObserver() {
- getContext().getContentResolver().unregisterContentObserver(mSettingsObserver);
- }
-
private void initializeCec(int initiatedBy) {
mCecController.setOption(OPTION_CEC_SERVICE_CONTROL, ENABLED);
initializeLocalDevices(initiatedBy);
@@ -460,7 +474,7 @@
if (initiatedBy != INITIATED_BY_HOTPLUG) {
// In case of the hotplug we don't call onInitializeCecComplete()
// since we reallocate the logical address only.
- onInitializeCecComplete();
+ onInitializeCecComplete(initiatedBy);
}
notifyAddressAllocated(allocatedDevices, initiatedBy);
}
@@ -1019,6 +1033,7 @@
@Override
public HdmiDeviceInfo getActiveSource() {
+ enforceAccessPermission();
HdmiCecLocalDeviceTv tv = tv();
if (tv == null) {
Slog.w(TAG, "Local tv device not available");
@@ -1232,6 +1247,19 @@
}
}
+ // Returns all the CEC devices on the bus including system audio, switch,
+ // even those of reserved type.
+ @Override
+ public List<HdmiDeviceInfo> getDeviceList() {
+ enforceAccessPermission();
+ HdmiCecLocalDeviceTv tv = tv();
+ synchronized (mLock) {
+ return (tv == null)
+ ? Collections.<HdmiDeviceInfo>emptyList()
+ : tv.getSafeCecDevicesLocked();
+ }
+ }
+
@Override
public void setSystemAudioVolume(final int oldIndex, final int newIndex,
final int maxIndex) {
@@ -1338,11 +1366,13 @@
@Override
public void setHdmiRecordListener(IHdmiRecordListener listener) {
+ enforceAccessPermission();
HdmiControlService.this.setHdmiRecordListener(listener);
}
@Override
public void startOneTouchRecord(final int recorderAddress, final byte[] recordSource) {
+ enforceAccessPermission();
runOnServiceThread(new Runnable() {
@Override
public void run() {
@@ -1357,6 +1387,7 @@
@Override
public void stopOneTouchRecord(final int recorderAddress) {
+ enforceAccessPermission();
runOnServiceThread(new Runnable() {
@Override
public void run() {
@@ -1372,6 +1403,7 @@
@Override
public void startTimerRecording(final int recorderAddress, final int sourceType,
final byte[] recordSource) {
+ enforceAccessPermission();
runOnServiceThread(new Runnable() {
@Override
public void run() {
@@ -1387,6 +1419,7 @@
@Override
public void clearTimerRecording(final int recorderAddress, final int sourceType,
final byte[] recordSource) {
+ enforceAccessPermission();
runOnServiceThread(new Runnable() {
@Override
public void run() {
@@ -1776,6 +1809,8 @@
private void onStandby() {
assertRunOnServiceThread();
mPowerStatus = HdmiControlManager.POWER_STATUS_TRANSIENT_TO_STANDBY;
+ invokeVendorCommandListenersOnControlStateChanged(false,
+ HdmiControlManager.CONTROL_STATE_CHANGED_REASON_STANDBY);
final List<HdmiCecLocalDevice> devices = getAllLocalDevices();
disableDevices(new PendingActionClearedCallback() {
@@ -1814,9 +1849,6 @@
for (HdmiCecLocalDevice device : mCecController.getLocalDeviceList()) {
device.disableDevice(mStandbyMessageReceived, callback);
}
- if (isTvDevice()) {
- unregisterSettingsObserver();
- }
}
mMhlController.clearAllLocalDevices();
@@ -1861,8 +1893,8 @@
}
}
- boolean invokeVendorCommandListeners(int deviceType, int srcAddress, byte[] params,
- boolean hasVendorId) {
+ boolean invokeVendorCommandListenersOnReceived(int deviceType, int srcAddress, int destAddress,
+ byte[] params, boolean hasVendorId) {
synchronized (mLock) {
if (mVendorCommandListenerRecords.isEmpty()) {
return false;
@@ -1872,7 +1904,7 @@
continue;
}
try {
- record.mListener.onReceived(srcAddress, params, hasVendorId);
+ record.mListener.onReceived(srcAddress, destAddress, params, hasVendorId);
} catch (RemoteException e) {
Slog.e(TAG, "Failed to notify vendor command reception", e);
}
@@ -1881,6 +1913,22 @@
}
}
+ boolean invokeVendorCommandListenersOnControlStateChanged(boolean enabled, int reason) {
+ synchronized (mLock) {
+ if (mVendorCommandListenerRecords.isEmpty()) {
+ return false;
+ }
+ for (VendorCommandListenerRecord record : mVendorCommandListenerRecords) {
+ try {
+ record.mListener.onControlStateChanged(enabled, reason);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to notify control-state-changed to vendor handler", e);
+ }
+ }
+ return true;
+ }
+ }
+
private void addHdmiMhlVendorCommandListener(IHdmiMhlVendorCommandListener listener) {
HdmiMhlVendorCommandListenerRecord record =
new HdmiMhlVendorCommandListenerRecord(listener);
@@ -1930,6 +1978,11 @@
void setControlEnabled(boolean enabled) {
assertRunOnServiceThread();
+ if (!enabled) {
+ // Call the vendor handler before the service is disabled.
+ invokeVendorCommandListenersOnControlStateChanged(false,
+ HdmiControlManager.CONTROL_STATE_CHANGED_REASON_SETTING);
+ }
int value = toInt(enabled);
mCecController.setOption(OPTION_CEC_ENABLE, value);
mMhlController.setOption(OPTION_MHL_ENABLE, value);
@@ -2034,7 +2087,7 @@
assertRunOnServiceThread();
Intent intent = new Intent(HdmiControlManager.ACTION_OSD_MESSAGE);
intent.putExtra(HdmiControlManager.EXTRA_MESSAGE_ID, messageId);
- intent.putExtra(HdmiControlManager.EXTRA_MESSAGE_EXTRAM_PARAM1, extra);
+ intent.putExtra(HdmiControlManager.EXTRA_MESSAGE_EXTRA_PARAM1, extra);
getContext().sendBroadcastAsUser(intent, UserHandle.ALL,
HdmiControlService.PERMISSION);
}
diff --git a/services/core/java/com/android/server/hdmi/NewDeviceAction.java b/services/core/java/com/android/server/hdmi/NewDeviceAction.java
index 2074085..998889b 100644
--- a/services/core/java/com/android/server/hdmi/NewDeviceAction.java
+++ b/services/core/java/com/android/server/hdmi/NewDeviceAction.java
@@ -47,6 +47,7 @@
private final int mDeviceLogicalAddress;
private final int mDevicePhysicalAddress;
+ private final int mDeviceType;
private int mVendorId;
private String mDisplayName;
@@ -57,12 +58,14 @@
* @param source {@link HdmiCecLocalDevice} instance
* @param deviceLogicalAddress logical address of the device in interest
* @param devicePhysicalAddress physical address of the device in interest
+ * @param deviceType type of the device
*/
NewDeviceAction(HdmiCecLocalDevice source, int deviceLogicalAddress,
- int devicePhysicalAddress) {
+ int devicePhysicalAddress, int deviceType) {
super(source);
mDeviceLogicalAddress = deviceLogicalAddress;
mDevicePhysicalAddress = devicePhysicalAddress;
+ mDeviceType = deviceType;
mVendorId = Constants.UNKNOWN_VENDOR_ID;
}
@@ -155,8 +158,7 @@
HdmiDeviceInfo deviceInfo = new HdmiDeviceInfo(
mDeviceLogicalAddress, mDevicePhysicalAddress,
tv().getPortId(mDevicePhysicalAddress),
- HdmiUtils.getTypeFromAddress(mDeviceLogicalAddress),
- mVendorId, mDisplayName);
+ mDeviceType, mVendorId, mDisplayName);
tv().addCecDevice(deviceInfo);
if (HdmiUtils.getTypeFromAddress(mDeviceLogicalAddress)
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index c6d2db2..83d6986 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -137,11 +137,15 @@
public void onReceive(Context context, Intent intent) {
Slog.d(TAG, "Receieved: " + intent.getAction());
if (Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction())) {
- int uidRemoved = intent.getIntExtra(Intent.EXTRA_UID, -1);
- if (DEBUG) {
- Slog.d(TAG, "Removing jobs for uid: " + uidRemoved);
+ // If this is an outright uninstall rather than the first half of an
+ // app update sequence, cancel the jobs associated with the app.
+ if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
+ int uidRemoved = intent.getIntExtra(Intent.EXTRA_UID, -1);
+ if (DEBUG) {
+ Slog.d(TAG, "Removing jobs for uid: " + uidRemoved);
+ }
+ cancelJobsForUid(uidRemoved);
}
- cancelJobsForUid(uidRemoved);
} else if (Intent.ACTION_USER_REMOVED.equals(intent.getAction())) {
final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
if (DEBUG) {
diff --git a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
index cdfb656..00eaaa4 100644
--- a/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
+++ b/services/core/java/com/android/server/media/projection/MediaProjectionManagerService.java
@@ -325,7 +325,7 @@
final long token = Binder.clearCallingIdentity();
try {
- dump(pw);
+ MediaProjectionManagerService.this.dump(pw);
} finally {
Binder.restoreCallingIdentity(token);
}
diff --git a/services/core/java/com/android/server/notification/NotificationDelegate.java b/services/core/java/com/android/server/notification/NotificationDelegate.java
index 97f0a1e..24fc455 100644
--- a/services/core/java/com/android/server/notification/NotificationDelegate.java
+++ b/services/core/java/com/android/server/notification/NotificationDelegate.java
@@ -20,6 +20,7 @@
void onSetDisabled(int status);
void onClearAll(int callingUid, int callingPid, int userId);
void onNotificationClick(int callingUid, int callingPid, String key);
+ void onNotificationActionClick(int callingUid, int callingPid, String key, int actionIndex);
void onNotificationClear(int callingUid, int callingPid,
String pkg, String tag, int id, int userId);
void onNotificationError(int callingUid, int callingPid,
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 22f060f..090967f 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -541,6 +541,20 @@
}
@Override
+ public void onNotificationActionClick(int callingUid, int callingPid, String key,
+ int actionIndex) {
+ synchronized (mNotificationList) {
+ EventLogTags.writeNotificationActionClicked(key, actionIndex);
+ NotificationRecord r = mNotificationsByKey.get(key);
+ if (r == null) {
+ Log.w(TAG, "No notification with key: " + key);
+ return;
+ }
+ // TODO: Log action click via UsageStats.
+ }
+ }
+
+ @Override
public void onNotificationClear(int callingUid, int callingPid,
String pkg, String tag, int id, int userId) {
cancelNotification(callingUid, callingPid, pkg, tag, id, 0,
@@ -2358,6 +2372,8 @@
// Save it for users of getHistoricalNotifications()
mArchive.record(r.sbn);
+
+ EventLogTags.writeNotificationCanceled(r.getKey(), reason);
}
/**
diff --git a/services/core/java/com/android/server/notification/ZenLog.java b/services/core/java/com/android/server/notification/ZenLog.java
index 6cc5e0e..e0b83de 100644
--- a/services/core/java/com/android/server/notification/ZenLog.java
+++ b/services/core/java/com/android/server/notification/ZenLog.java
@@ -34,6 +34,7 @@
public class ZenLog {
private static final String TAG = "ZenLog";
+ private static final boolean DEBUG = Build.IS_DEBUGGABLE;
private static final int SIZE = Build.IS_DEBUGGABLE ? 100 : 20;
@@ -166,7 +167,7 @@
sSize++;
}
}
- Slog.d(TAG, typeToString(type) + ": " + msg);
+ if (DEBUG) Slog.d(TAG, typeToString(type) + ": " + msg);
}
public static void dump(PrintWriter pw, String prefix) {
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 52807c0..5e95dfe 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -281,6 +281,9 @@
// True if the device should wake up when plugged or unplugged.
private boolean mWakeUpWhenPluggedOrUnpluggedConfig;
+ // True if the device should wake up when plugged or unplugged in theater mode.
+ private boolean mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig;
+
// True if the device should suspend when the screen is off due to proximity.
private boolean mSuspendWhenScreenOffDueToProximityConfig;
@@ -420,6 +423,9 @@
// True if the battery level is currently considered low.
private boolean mBatteryLevelLow;
+ // True if theater mode is enabled
+ private boolean mTheaterModeEnabled;
+
private final ArrayList<PowerManagerInternal.LowPowerModeListener> mLowPowerModeListeners
= new ArrayList<PowerManagerInternal.LowPowerModeListener>();
@@ -568,6 +574,9 @@
resolver.registerContentObserver(Settings.Global.getUriFor(
Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL),
false, mSettingsObserver, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Global.getUriFor(
+ Settings.Global.THEATER_MODE_ON),
+ false, mSettingsObserver, UserHandle.USER_ALL);
// Go.
readConfigurationLocked();
updateSettingsLocked();
@@ -585,6 +594,8 @@
com.android.internal.R.bool.config_powerDecoupleInteractiveModeFromDisplay);
mWakeUpWhenPluggedOrUnpluggedConfig = resources.getBoolean(
com.android.internal.R.bool.config_unplugTurnsOnScreen);
+ mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig = resources.getBoolean(
+ com.android.internal.R.bool.config_allowTheaterModeWakeFromUnplug);
mSuspendWhenScreenOffDueToProximityConfig = resources.getBoolean(
com.android.internal.R.bool.config_suspendWhenScreenOffDueToProximity);
mDreamsSupportedConfig = resources.getBoolean(
@@ -636,6 +647,8 @@
UserHandle.USER_CURRENT);
mStayOnWhilePluggedInSetting = Settings.Global.getInt(resolver,
Settings.Global.STAY_ON_WHILE_PLUGGED_IN, BatteryManager.BATTERY_PLUGGED_AC);
+ mTheaterModeEnabled = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.THEATER_MODE_ON, 0) == 1;
final int oldScreenBrightnessSetting = mScreenBrightnessSetting;
mScreenBrightnessSetting = Settings.System.getIntForUser(resolver,
@@ -1334,6 +1347,11 @@
return false;
}
+ // Don't wake while theater mode is enabled.
+ if (mTheaterModeEnabled && !mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig) {
+ return false;
+ }
+
// Otherwise wake up!
return true;
}
@@ -2360,6 +2378,10 @@
+ mDecoupleHalInteractiveModeFromDisplayConfig);
pw.println(" mWakeUpWhenPluggedOrUnpluggedConfig="
+ mWakeUpWhenPluggedOrUnpluggedConfig);
+ pw.println(" mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig="
+ + mWakeUpWhenPluggedOrUnpluggedInTheaterModeConfig);
+ pw.println(" mTheaterModeEnabled="
+ + mTheaterModeEnabled);
pw.println(" mSuspendWhenScreenOffDueToProximityConfig="
+ mSuspendWhenScreenOffDueToProximityConfig);
pw.println(" mDreamsSupportedConfig=" + mDreamsSupportedConfig);
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index f85e2d9..15e0bf0 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -26,6 +26,7 @@
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.util.Slog;
+import android.view.WindowManager;
import com.android.internal.statusbar.IStatusBar;
import com.android.internal.statusbar.IStatusBarService;
@@ -295,9 +296,10 @@
}
}
- /**
+ /**
* Hide or show the on-screen Menu key. Only call this from the window manager, typically in
- * response to a window with FLAG_NEEDS_MENU_KEY set.
+ * response to a window with {@link android.view.WindowManager.LayoutParams#needsMenuKey} set
+ * to {@link android.view.WindowManager.LayoutParams#NEEDS_MENU_SET_TRUE}.
*/
@Override
public void topAppWindowChanged(final boolean menuVisible) {
@@ -523,6 +525,20 @@
}
@Override
+ public void onNotificationActionClick(String key, int actionIndex) {
+ enforceStatusBarService();
+ final int callingUid = Binder.getCallingUid();
+ final int callingPid = Binder.getCallingPid();
+ long identity = Binder.clearCallingIdentity();
+ try {
+ mNotificationDelegate.onNotificationActionClick(callingUid, callingPid, key,
+ actionIndex);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
public void onNotificationError(String pkg, String tag, int id,
int uid, int initialPid, String message, int userId) {
enforceStatusBarService();
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index fefbe0a..1649535 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -16,6 +16,7 @@
package com.android.server.trust;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.content.PackageMonitor;
import com.android.internal.widget.LockPatternUtils;
import com.android.server.SystemService;
@@ -24,6 +25,7 @@
import org.xmlpull.v1.XmlPullParserException;
import android.Manifest;
+import android.app.ActivityManager;
import android.app.ActivityManagerNative;
import android.app.admin.DevicePolicyManager;
import android.app.trust.ITrustListener;
@@ -41,6 +43,7 @@
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
import android.graphics.drawable.Drawable;
+import android.os.Binder;
import android.os.DeadObjectException;
import android.os.Handler;
import android.os.IBinder;
@@ -100,8 +103,10 @@
/* package */ final TrustArchive mArchive = new TrustArchive();
private final Context mContext;
private final LockPatternUtils mLockPatternUtils;
+ private final UserManager mUserManager;
- private UserManager mUserManager;
+ @GuardedBy("mUserIsTrusted")
+ private final SparseBooleanArray mUserIsTrusted = new SparseBooleanArray();
public TrustManagerService(Context context) {
super(context);
@@ -120,8 +125,9 @@
if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY && !isSafeMode()) {
mPackageMonitor.register(mContext, mHandler.getLooper(), UserHandle.ALL, true);
mReceiver.register(mContext);
- maybeEnableFactoryTrustAgents(mLockPatternUtils, UserHandle.USER_OWNER);
refreshAgentList(UserHandle.USER_ALL);
+ } else if (phase == SystemService.PHASE_BOOT_COMPLETED && !isSafeMode()) {
+ maybeEnableFactoryTrustAgents(mLockPatternUtils, UserHandle.USER_OWNER);
}
}
@@ -159,7 +165,11 @@
public void updateTrust(int userId, boolean initiatedByUser) {
dispatchOnTrustManagedChanged(aggregateIsTrustManaged(userId), userId);
- dispatchOnTrustChanged(aggregateIsTrusted(userId), userId, initiatedByUser);
+ boolean trusted = aggregateIsTrusted(userId);
+ synchronized (mUserIsTrusted) {
+ mUserIsTrusted.put(userId, trusted);
+ }
+ dispatchOnTrustChanged(trusted, userId, initiatedByUser);
}
void refreshAgentList(int userId) {
@@ -546,6 +556,16 @@
mHandler.obtainMessage(MSG_UNREGISTER_LISTENER, trustListener).sendToTarget();
}
+ @Override
+ public boolean isTrusted(int userId) throws RemoteException {
+ userId = ActivityManager.handleIncomingUser(getCallingPid(), getCallingUid(), userId,
+ false /* allowAll */, true /* requireFull */, "isTrusted", null);
+ userId = resolveProfileParent(userId);
+ synchronized (mUserIsTrusted) {
+ return mUserIsTrusted.get(userId);
+ }
+ }
+
private void enforceReportPermission() {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.ACCESS_KEYGUARD_SECURE_STORAGE, "reporting trust events");
@@ -622,6 +642,19 @@
}
};
+ private int resolveProfileParent(int userId) {
+ long identity = Binder.clearCallingIdentity();
+ try {
+ UserInfo parent = mUserManager.getProfileParent(userId);
+ if (parent != null) {
+ return parent.getUserHandle().getIdentifier();
+ }
+ return userId;
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
diff --git a/services/core/java/com/android/server/tv/TvInputHal.java b/services/core/java/com/android/server/tv/TvInputHal.java
index 558ffb5..c12dd63 100644
--- a/services/core/java/com/android/server/tv/TvInputHal.java
+++ b/services/core/java/com/android/server/tv/TvInputHal.java
@@ -55,7 +55,7 @@
private native long nativeOpen();
- private static native int nativeAddStream(long ptr, int deviceId, int streamId,
+ private static native int nativeAddOrUpdateStream(long ptr, int deviceId, int streamId,
Surface surface);
private static native int nativeRemoveStream(long ptr, int deviceId, int streamId);
private static native TvStreamConfig[] nativeGetStreamConfigs(long ptr, int deviceId,
@@ -80,7 +80,7 @@
}
}
- public int addStream(int deviceId, Surface surface, TvStreamConfig streamConfig) {
+ public int addOrUpdateStream(int deviceId, Surface surface, TvStreamConfig streamConfig) {
synchronized (mLock) {
if (mPtr == 0) {
return ERROR_NO_INIT;
@@ -89,7 +89,7 @@
if (generation != streamConfig.getGeneration()) {
return ERROR_STALE_CONFIG;
}
- if (nativeAddStream(mPtr, deviceId, streamConfig.getStreamId(), surface) == 0) {
+ if (nativeAddOrUpdateStream(mPtr, deviceId, streamConfig.getStreamId(), surface) == 0) {
return SUCCESS;
} else {
return ERROR_UNKNOWN;
diff --git a/services/core/java/com/android/server/tv/TvInputHardwareManager.java b/services/core/java/com/android/server/tv/TvInputHardwareManager.java
index 44e4ad1..85659cf 100644
--- a/services/core/java/com/android/server/tv/TvInputHardwareManager.java
+++ b/services/core/java/com/android/server/tv/TvInputHardwareManager.java
@@ -188,6 +188,11 @@
return;
}
connection.updateConfigsLocked(configs);
+ String inputId = mHardwareInputIdMap.get(deviceId);
+ if (inputId != null) {
+ mHandler.obtainMessage(ListenerHandler.STATE_CHANGED,
+ convertConnectedToState(configs.length > 0), 0, inputId).sendToTarget();
+ }
try {
connection.getCallbackLocked().onStreamConfigChanged(configs);
} catch (RemoteException e) {
@@ -257,6 +262,9 @@
mHardwareInputIdMap.put(deviceId, info.getId());
mInputMap.put(info.getId(), info);
+ // Process pending state changes
+
+ // For logical HDMI devices, they have information from HDMI CEC signals.
for (int i = 0; i < mHdmiStateMap.size(); ++i) {
TvInputHardwareInfo hardwareInfo =
findHardwareInfoForHdmiPortLocked(mHdmiStateMap.keyAt(i));
@@ -268,8 +276,17 @@
mHandler.obtainMessage(ListenerHandler.STATE_CHANGED,
convertConnectedToState(mHdmiStateMap.valueAt(i)), 0,
inputId).sendToTarget();
+ return;
}
}
+ // For the rest of the devices, we can tell by the number of available streams.
+ Connection connection = mConnections.get(deviceId);
+ if (connection != null) {
+ mHandler.obtainMessage(ListenerHandler.STATE_CHANGED,
+ convertConnectedToState(connection.getConfigsLocked().length > 0), 0,
+ info.getId()).sendToTarget();
+ return;
+ }
}
}
@@ -668,14 +685,14 @@
result = mHal.removeStream(mInfo.getDeviceId(), mActiveConfig);
mActiveConfig = null;
} else {
- if (config != mActiveConfig && mActiveConfig != null) {
+ if (!config.equals(mActiveConfig)) {
result = mHal.removeStream(mInfo.getDeviceId(), mActiveConfig);
if (result != TvInputHal.SUCCESS) {
mActiveConfig = null;
return false;
}
}
- result = mHal.addStream(mInfo.getDeviceId(), surface, config);
+ result = mHal.addOrUpdateStream(mInfo.getDeviceId(), surface, config);
if (result == TvInputHal.SUCCESS) {
mActiveConfig = config;
}
@@ -801,7 +818,7 @@
return false;
}
- int result = mHal.addStream(mInfo.getDeviceId(), surface, config);
+ int result = mHal.addOrUpdateStream(mInfo.getDeviceId(), surface, config);
return result == TvInputHal.SUCCESS;
}
}
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index fa1c0ff..f947b6a 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -346,8 +346,7 @@
case WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG:
case WindowManager.LayoutParams.TYPE_SYSTEM_ERROR:
case WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY:
- case WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL:
- case WindowManager.LayoutParams.TYPE_RECENTS_OVERLAY: {
+ case WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL: {
Rect magnifiedRegionBounds = mTempRect2;
mMagnifedViewport.getMagnifiedFrameInContentCoordsLocked(
magnifiedRegionBounds);
@@ -993,8 +992,7 @@
final int flags = windowState.mAttrs.flags;
- // If the window is not touchable, do not report it but take into account
- // the space it takes since the content behind it cannot be touched.
+ // If the window is not touchable - ignore.
if ((flags & WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) != 0) {
continue;
}
@@ -1015,9 +1013,14 @@
}
}
- // Account for the space this window takes.
- unaccountedSpace.op(boundsInScreen, unaccountedSpace,
- Region.Op.REVERSE_DIFFERENCE);
+ // Account for the space this window takes if the window
+ // is not an accessibility overlay which does not change
+ // the reported windows.
+ if (windowState.mAttrs.type == WindowManager.LayoutParams
+ .TYPE_ACCESSIBILITY_OVERLAY) {
+ unaccountedSpace.op(boundsInScreen, unaccountedSpace,
+ Region.Op.REVERSE_DIFFERENCE);
+ }
// We figured out what is touchable for the entire screen - done.
if (unaccountedSpace.isEmpty()) {
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 30589b1..b0feca8 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -376,10 +376,9 @@
stack.dump(prefix + " ", pw);
}
pw.println();
- pw.println(" Application tokens in bottom up Z order:");
+ pw.println(" Application tokens in top down Z order:");
int ndx = 0;
- final int numStacks = mStacks.size();
- for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
+ for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
ArrayList<Task> tasks = mStacks.get(stackNdx).getTasks();
for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) {
AppTokenList tokens = tasks.get(taskNdx).mAppTokens;
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 9ceac41..a60be3b 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -60,6 +60,12 @@
return removed;
}
+ void setSendingToBottom(boolean toBottom) {
+ for (int appTokenNdx = 0; appTokenNdx < mAppTokens.size(); appTokenNdx++) {
+ mAppTokens.get(appTokenNdx).sendingToBottom = toBottom;
+ }
+ }
+
@Override
public String toString() {
return "{taskId=" + taskId + " appTokens=" + mAppTokens + "}";
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 837672a..3fee608 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -619,6 +619,9 @@
boolean mTurnOnScreen;
+ // Whether or not a layout can cause a wake up when theater mode is enabled.
+ boolean mAllowTheaterModeWakeFromLayout;
+
DragState mDragState = null;
// For frozen screen animations.
@@ -881,6 +884,9 @@
mAnimator = new WindowAnimator(this);
+ mAllowTheaterModeWakeFromLayout = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_allowTheaterModeWakeFromWindowLayout);
+
LocalServices.addService(WindowManagerInternal.class, new LocalService());
initPolicy();
@@ -2331,6 +2337,11 @@
+ attrs.token + ". Aborting.");
return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
}
+ if (type == TYPE_ACCESSIBILITY_OVERLAY) {
+ Slog.w(TAG, "Attempted to add Accessibility overlay window with unknown token "
+ + attrs.token + ". Aborting.");
+ return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
+ }
token = new WindowToken(this, attrs.token, -1, false);
addToken = true;
} else if (type >= FIRST_APPLICATION_WINDOW && type <= LAST_APPLICATION_WINDOW) {
@@ -2374,6 +2385,12 @@
+ attrs.token + ". Aborting.");
return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
}
+ } else if (type == TYPE_ACCESSIBILITY_OVERLAY) {
+ if (token.windowType != TYPE_ACCESSIBILITY_OVERLAY) {
+ Slog.w(TAG, "Attempted to add Accessibility overlay window with bad token "
+ + attrs.token + ". Aborting.");
+ return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
+ }
} else if (token.appWindowToken != null) {
Slog.w(TAG, "Non-null appWindowToken for system window of type=" + type);
// It is not valid to use an app token with other system types; we will
@@ -2509,9 +2526,8 @@
}
mInputMonitor.updateInputWindowsLw(false /*force*/);
- if (localLOGV) Slog.v(
- TAG, "New client " + client.asBinder()
- + ": window=" + win);
+ if (true || localLOGV) Slog.v(TAG, "addWindow: New client " + client.asBinder()
+ + ": window=" + win + " Callers=" + Debug.getCallers(5));
if (win.isVisibleOrAdding() && updateOrientationFromAppTokensLocked(false)) {
reportNewConfig = true;
@@ -2675,7 +2691,8 @@
mPolicy.removeWindowLw(win);
win.removeLocked();
- if (DEBUG_ADD_REMOVE) Slog.v(TAG, "removeWindowInnerLocked: " + win);
+ if (true || DEBUG_ADD_REMOVE) Slog.v(TAG, "removeWindowInnerLocked: " + win +
+ " Callers=" + Debug.getCallers(5));
mWindowMap.remove(win.mClient.asBinder());
if (win.mAppOp != AppOpsManager.OP_NONE) {
mAppOps.finishOp(win.mAppOp, win.getOwningUid(), win.getOwningPackage());
@@ -5052,6 +5069,10 @@
}
}
stack.moveTaskToTop(task);
+ if (mAppTransition.isTransitionSet()) {
+ task.setSendingToBottom(false);
+ }
+ moveStackWindowsLocked(displayContent);
}
} finally {
Binder.restoreCallingIdentity(origId);
@@ -5070,6 +5091,9 @@
}
final TaskStack stack = task.mStack;
stack.moveTaskToBottom(task);
+ if (mAppTransition.isTransitionSet()) {
+ task.setSendingToBottom(true);
+ }
moveStackWindowsLocked(stack.getDisplayContent());
}
} finally {
@@ -9365,7 +9389,6 @@
final int type = attrs.type;
if (canBeSeen
&& (type == TYPE_SYSTEM_DIALOG
- || type == TYPE_RECENTS_OVERLAY
|| type == TYPE_SYSTEM_ERROR
|| (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0)) {
mInnerFields.mSyswin = true;
@@ -9954,8 +9977,12 @@
}
if (mTurnOnScreen) {
- if (DEBUG_VISIBILITY) Slog.v(TAG, "Turning screen on after layout!");
- mPowerManager.wakeUp(SystemClock.uptimeMillis());
+ if (mAllowTheaterModeWakeFromLayout
+ || Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.THEATER_MODE_ON, 0) == 0) {
+ if (DEBUG_VISIBILITY) Slog.v(TAG, "Turning screen on after layout!");
+ mPowerManager.wakeUp(SystemClock.uptimeMillis());
+ }
mTurnOnScreen = false;
}
@@ -11611,5 +11638,23 @@
checkDrawnWindowsLocked();
}
}
+
+ @Override
+ public void addWindowToken(IBinder token, int type) {
+ WindowManagerService.this.addWindowToken(token, type);
+ }
+
+ @Override
+ public void removeWindowToken(IBinder token, boolean removeWindows) {
+ synchronized(mWindowMap) {
+ if (removeWindows) {
+ WindowToken wtoken = mTokenMap.remove(token);
+ if (wtoken != null) {
+ wtoken.removeAllWindows();
+ }
+ }
+ WindowManagerService.this.removeWindowToken(token);
+ }
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index b4a7f04..806f7c5 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -704,9 +704,8 @@
WindowState ws = this;
WindowList windows = getWindowList();
while (true) {
- if ((ws.mAttrs.privateFlags
- & WindowManager.LayoutParams.PRIVATE_FLAG_SET_NEEDS_MENU_KEY) != 0) {
- return (ws.mAttrs.flags & WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY) != 0;
+ if (ws.mAttrs.needsMenuKey != WindowManager.LayoutParams.NEEDS_MENU_UNSET) {
+ return ws.mAttrs.needsMenuKey == WindowManager.LayoutParams.NEEDS_MENU_SET_TRUE;
}
// If we reached the bottom of the range of windows we are considering,
// assume no menu is needed.
diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java
index 2267123..1a672e68 100644
--- a/services/core/java/com/android/server/wm/WindowToken.java
+++ b/services/core/java/com/android/server/wm/WindowToken.java
@@ -17,6 +17,7 @@
package com.android.server.wm;
import android.os.IBinder;
+import android.util.Slog;
import java.io.PrintWriter;
@@ -29,7 +30,7 @@
class WindowToken {
// The window manager!
final WindowManagerService service;
-
+
// The actual token.
final IBinder token;
@@ -77,6 +78,15 @@
explicit = _explicit;
}
+ void removeAllWindows() {
+ for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {
+ WindowState win = windows.get(winNdx);
+ if (WindowManagerService.DEBUG_WINDOW_MOVEMENT) Slog.w(WindowManagerService.TAG,
+ "removeAllWindows: removing win=" + win);
+ win.mService.removeWindowLocked(win.mSession, win);
+ }
+ }
+
void dump(PrintWriter pw, String prefix) {
pw.print(prefix); pw.print("windows="); pw.println(windows);
pw.print(prefix); pw.print("windowType="); pw.print(windowType);
diff --git a/services/core/jni/com_android_server_tv_TvInputHal.cpp b/services/core/jni/com_android_server_tv_TvInputHal.cpp
index d5abe0c..5cb0543 100644
--- a/services/core/jni/com_android_server_tv_TvInputHal.cpp
+++ b/services/core/jni/com_android_server_tv_TvInputHal.cpp
@@ -235,7 +235,7 @@
static JTvInputHal* createInstance(JNIEnv* env, jobject thiz);
- int addStream(int deviceId, int streamId, const sp<Surface>& surface);
+ int addOrUpdateStream(int deviceId, int streamId, const sp<Surface>& surface);
int removeStream(int deviceId, int streamId);
const tv_stream_config_t* getStreamConfigs(int deviceId, int* numConfigs);
@@ -312,7 +312,7 @@
return new JTvInputHal(env, thiz, device);
}
-int JTvInputHal::addStream(int deviceId, int streamId, const sp<Surface>& surface) {
+int JTvInputHal::addOrUpdateStream(int deviceId, int streamId, const sp<Surface>& surface) {
KeyedVector<int, Connection>& connections = mConnections.editValueFor(deviceId);
if (connections.indexOfKey(streamId) < 0) {
connections.add(streamId, Connection());
@@ -555,14 +555,14 @@
return (jlong)JTvInputHal::createInstance(env, thiz);
}
-static int nativeAddStream(JNIEnv* env, jclass clazz,
+static int nativeAddOrUpdateStream(JNIEnv* env, jclass clazz,
jlong ptr, jint deviceId, jint streamId, jobject jsurface) {
JTvInputHal* tvInputHal = (JTvInputHal*)ptr;
if (!jsurface) {
return BAD_VALUE;
}
sp<Surface> surface(android_view_Surface_getSurface(env, jsurface));
- return tvInputHal->addStream(deviceId, streamId, surface);
+ return tvInputHal->addOrUpdateStream(deviceId, streamId, surface);
}
static int nativeRemoveStream(JNIEnv* env, jclass clazz,
@@ -612,8 +612,8 @@
/* name, signature, funcPtr */
{ "nativeOpen", "()J",
(void*) nativeOpen },
- { "nativeAddStream", "(JIILandroid/view/Surface;)I",
- (void*) nativeAddStream },
+ { "nativeAddOrUpdateStream", "(JIILandroid/view/Surface;)I",
+ (void*) nativeAddOrUpdateStream },
{ "nativeRemoveStream", "(JII)I",
(void*) nativeRemoveStream },
{ "nativeGetStreamConfigs", "(JII)[Landroid/media/tv/TvStreamConfig;",
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index af4ae44..9ee44b9 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -1687,7 +1687,6 @@
.setContentTitle(mContext.getString(R.string.ssl_ca_cert_warning))
.setContentText(contentText)
.setContentIntent(notifyIntent)
- .setOngoing(true)
.setPriority(Notification.PRIORITY_HIGH)
.setShowWhen(false)
.setColor(mContext.getResources().getColor(
@@ -3390,7 +3389,14 @@
private int getEncryptionStatus() {
String status = SystemProperties.get("ro.crypto.state", "unsupported");
if ("encrypted".equalsIgnoreCase(status)) {
- return DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE;
+ final long token = Binder.clearCallingIdentity();
+ try {
+ return LockPatternUtils.isDeviceEncrypted()
+ ? DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE
+ : DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE;
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
} else if ("unencrypted".equalsIgnoreCase(status)) {
return DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE;
} else {
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index f934963..354fa2e 100644
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -484,10 +484,10 @@
/**
* Notifies this {@code Call} that an account has been selected and to proceed with placing
- * an outgoing call.
+ * an outgoing call. Optionally sets this account as the default account.
*/
- public void phoneAccountSelected(PhoneAccountHandle accountHandle) {
- mInCallAdapter.phoneAccountSelected(mTelecomCallId, accountHandle);
+ public void phoneAccountSelected(PhoneAccountHandle accountHandle, boolean setDefault) {
+ mInCallAdapter.phoneAccountSelected(mTelecomCallId, accountHandle, setDefault);
}
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 51f193f..2932721 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -898,6 +898,13 @@
}
/**
+ * @hide
+ */
+ public final ConnectionService getConnectionService() {
+ return mConnectionService;
+ }
+
+ /**
* Sets the conference that this connection is a part of. This will fail if the connection is
* already part of a conference call. {@link #resetConference} to un-set the conference first.
*
@@ -911,6 +918,7 @@
mConference = conference;
if (mConnectionService != null && mConnectionService.containsConference(conference)) {
fireConferenceChanged();
+ onConferenceChanged();
}
return true;
}
@@ -926,6 +934,7 @@
Log.d(this, "Conference reset");
mConference = null;
fireConferenceChanged();
+ onConferenceChanged();
}
}
@@ -1009,6 +1018,11 @@
*/
public void onPostDialContinue(boolean proceed) {}
+ /**
+ * Notifies this Connection that the conference which is set on it has changed.
+ */
+ public void onConferenceChanged() {}
+
static String toLogSafePhoneNumber(String number) {
// For unknown number, log empty string.
if (number == null) {
diff --git a/telecomm/java/android/telecom/InCallAdapter.java b/telecomm/java/android/telecom/InCallAdapter.java
index fd3cf2e..62b8dea 100644
--- a/telecomm/java/android/telecom/InCallAdapter.java
+++ b/telecomm/java/android/telecom/InCallAdapter.java
@@ -189,14 +189,16 @@
}
/**
- * Instructs Telecom to add a PhoneAccountHandle to the specified call
+ * Instructs Telecom to add a PhoneAccountHandle to the specified call.
*
- * @param callId The identifier of the call
- * @param accountHandle The PhoneAccountHandle through which to place the call
+ * @param callId The identifier of the call.
+ * @param accountHandle The PhoneAccountHandle through which to place the call.
+ * @param setDefault {@code True} if this account should be set as the default for calls.
*/
- public void phoneAccountSelected(String callId, PhoneAccountHandle accountHandle) {
+ public void phoneAccountSelected(String callId, PhoneAccountHandle accountHandle,
+ boolean setDefault) {
try {
- mAdapter.phoneAccountSelected(callId, accountHandle);
+ mAdapter.phoneAccountSelected(callId, accountHandle, setDefault);
} catch (RemoteException e) {
}
}
diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java
index 66b52ae..402df30 100644
--- a/telecomm/java/android/telecom/PhoneAccount.java
+++ b/telecomm/java/android/telecom/PhoneAccount.java
@@ -105,11 +105,17 @@
*/
public static final String SCHEME_SIP = "sip";
+ /**
+ * Indicating no color is set.
+ */
+ public static final int NO_COLOR = -1;
+
private final PhoneAccountHandle mAccountHandle;
private final Uri mAddress;
private final Uri mSubscriptionAddress;
private final int mCapabilities;
private final int mIconResId;
+ private final int mColor;
private final CharSequence mLabel;
private final CharSequence mShortDescription;
private final List<String> mSupportedUriSchemes;
@@ -120,6 +126,7 @@
private Uri mSubscriptionAddress;
private int mCapabilities;
private int mIconResId;
+ private int mColor = NO_COLOR;
private CharSequence mLabel;
private CharSequence mShortDescription;
private List<String> mSupportedUriSchemes = new ArrayList<String>();
@@ -141,6 +148,7 @@
mSubscriptionAddress = phoneAccount.getSubscriptionAddress();
mCapabilities = phoneAccount.getCapabilities();
mIconResId = phoneAccount.getIconResId();
+ mColor = phoneAccount.getColor();
mLabel = phoneAccount.getLabel();
mShortDescription = phoneAccount.getShortDescription();
mSupportedUriSchemes.addAll(phoneAccount.getSupportedUriSchemes());
@@ -166,6 +174,11 @@
return this;
}
+ public Builder setColor(int value) {
+ this.mColor = value;
+ return this;
+ }
+
public Builder setShortDescription(CharSequence value) {
this.mShortDescription = value;
return this;
@@ -219,6 +232,7 @@
mSubscriptionAddress,
mCapabilities,
mIconResId,
+ mColor,
mLabel,
mShortDescription,
mSupportedUriSchemes);
@@ -231,6 +245,7 @@
Uri subscriptionAddress,
int capabilities,
int iconResId,
+ int color,
CharSequence label,
CharSequence shortDescription,
List<String> supportedUriSchemes) {
@@ -239,6 +254,7 @@
mSubscriptionAddress = subscriptionAddress;
mCapabilities = capabilities;
mIconResId = iconResId;
+ mColor = color;
mLabel = label;
mShortDescription = shortDescription;
mSupportedUriSchemes = Collections.unmodifiableList(supportedUriSchemes);
@@ -371,6 +387,15 @@
}
/**
+ * A highlight color to use in displaying information about this {@code PhoneAccount}.
+ *
+ * @return A hexadecimal color value.
+ */
+ public int getColor() {
+ return mColor;
+ }
+
+ /**
* An icon to represent this {@code PhoneAccount} in a user interface.
*
* @return An icon for this {@code PhoneAccount}.
@@ -418,6 +443,7 @@
out.writeParcelable(mSubscriptionAddress, 0);
out.writeInt(mCapabilities);
out.writeInt(mIconResId);
+ out.writeInt(mColor);
out.writeCharSequence(mLabel);
out.writeCharSequence(mShortDescription);
out.writeList(mSupportedUriSchemes);
@@ -444,6 +470,7 @@
mSubscriptionAddress = in.readParcelable(getClass().getClassLoader());
mCapabilities = in.readInt();
mIconResId = in.readInt();
+ mColor = in.readInt();
mLabel = in.readCharSequence();
mShortDescription = in.readCharSequence();
diff --git a/telecomm/java/android/telecom/PhoneCapabilities.java b/telecomm/java/android/telecom/PhoneCapabilities.java
index c7d9014..9c67503 100644
--- a/telecomm/java/android/telecom/PhoneCapabilities.java
+++ b/telecomm/java/android/telecom/PhoneCapabilities.java
@@ -103,6 +103,17 @@
return (capabilities & capability) != 0;
}
+ /**
+ * Removes the specified capability from the set of capabilities and returns the new set.
+ * @param capabilities The set of capabilities.
+ * @param capability The capability to remove from the set.
+ * @return The set of capabilities, with the capability removed.
+ * @hide
+ */
+ public static int remove(int capabilities, int capability) {
+ return capabilities & ~capability;
+ }
+
public static String toString(int capabilities) {
StringBuilder builder = new StringBuilder();
builder.append("[Capabilities:");
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index ed221d2..2652b45 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -31,7 +31,6 @@
/**
* Provides access to Telecom-related functionality.
- * TODO: Move this all into PhoneManager.
*/
public class TelecomManager {
@@ -587,7 +586,6 @@
*
* @param account The complete {@link PhoneAccount}.
*/
- @SystemApi
public void registerPhoneAccount(PhoneAccount account) {
try {
if (isServiceConnected()) {
@@ -603,7 +601,6 @@
*
* @param accountHandle A {@link PhoneAccountHandle} for the {@link PhoneAccount} to unregister.
*/
- @SystemApi
public void unregisterPhoneAccount(PhoneAccountHandle accountHandle) {
try {
if (isServiceConnected()) {
@@ -617,7 +614,6 @@
/**
* Remove all Accounts that belong to the calling package from the system.
*/
- @SystemApi
public void clearAccounts() {
try {
if (isServiceConnected()) {
@@ -671,7 +667,6 @@
* Requires permission: {@link android.Manifest.permission#READ_PHONE_STATE}
* </p>
*/
- @SystemApi
public boolean isInCall() {
try {
if (isServiceConnected()) {
@@ -823,7 +818,6 @@
* @param extras A bundle that will be passed through to
* {@link ConnectionService#onCreateIncomingConnection}.
*/
- @SystemApi
public void addNewIncomingCall(PhoneAccountHandle phoneAccount, Bundle extras) {
try {
if (isServiceConnected()) {
diff --git a/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl b/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl
index 138a877..863fff2 100644
--- a/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl
+++ b/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl
@@ -46,7 +46,8 @@
void postDialContinue(String callId, boolean proceed);
- void phoneAccountSelected(String callId, in PhoneAccountHandle accountHandle);
+ void phoneAccountSelected(String callId, in PhoneAccountHandle accountHandle,
+ boolean setDefault);
void conference(String callId, String otherCallId);
diff --git a/telephony/java/android/telephony/RadioAccessFamily.aidl b/telephony/java/android/telephony/RadioAccessFamily.aidl
new file mode 100644
index 0000000..f42e134
--- /dev/null
+++ b/telephony/java/android/telephony/RadioAccessFamily.aidl
@@ -0,0 +1,19 @@
+/*
+* Copyright (C) 2014 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.telephony;
+
+parcelable RadioAccessFamily;
\ No newline at end of file
diff --git a/telephony/java/android/telephony/RadioAccessFamily.java b/telephony/java/android/telephony/RadioAccessFamily.java
new file mode 100644
index 0000000..dd4c45d
--- /dev/null
+++ b/telephony/java/android/telephony/RadioAccessFamily.java
@@ -0,0 +1,135 @@
+/*
+* Copyright (C) 2014 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.telephony;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Object to indicate the phone radio type and access technology.
+ *
+ * @hide
+ */
+public class RadioAccessFamily implements Parcelable {
+
+ // Radio Access Family
+ public static final int RAF_UNKNOWN = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN);
+ public static final int RAF_GPRS = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GPRS);
+ public static final int RAF_EDGE = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EDGE);
+ public static final int RAF_UMTS = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_UMTS);
+ public static final int RAF_IS95A = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IS95A);
+ public static final int RAF_IS95B = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IS95B);
+ public static final int RAF_1xRTT = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT);
+ public static final int RAF_EVDO_0 = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0);
+ public static final int RAF_EVDO_A = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A);
+ public static final int RAF_HSDPA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA);
+ public static final int RAF_HSUPA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA);
+ public static final int RAF_HSPA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPA);
+ public static final int RAF_EVDO_B = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B);
+ public static final int RAF_EHRPD = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD);
+ public static final int RAF_LTE = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_LTE);
+ public static final int RAF_HSPAP = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP);
+ public static final int RAF_GSM = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GSM);
+ public static final int RAF_TD_SCDMA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA);
+
+ /* Phone ID of phone */
+ private int mPhoneId;
+
+ /* Radio Access Family */
+ private int mRadioAccessFamily;
+
+ /**
+ * Constructor.
+ *
+ * @param phoneId the phone ID
+ * @param radioAccessFamily the phone radio access family defined
+ * in RadioAccessFamily. It's a bit mask value to represent
+ * the support type.
+ */
+ public RadioAccessFamily(int phoneId, int radioAccessFamily) {
+ mPhoneId = phoneId;
+ mRadioAccessFamily = radioAccessFamily;
+ }
+
+ /**
+ * Get phone ID.
+ *
+ * @return phone ID
+ */
+ public int getPhoneId() {
+ return mPhoneId;
+ }
+
+ /**
+ * get radio access family.
+ *
+ * @return radio access family
+ */
+ public int getRadioAccessFamily() {
+ return mRadioAccessFamily;
+ }
+
+ @Override
+ public String toString() {
+ String ret = "{ mPhoneId = " + mPhoneId
+ + ", mRadioAccessFamily = " + mRadioAccessFamily
+ + "}";
+ return ret;
+ }
+
+ /**
+ * Implement the Parcelable interface.
+ *
+ * @return describe content
+ */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * Implement the Parcelable interface.
+ *
+ * @param outParcel The Parcel in which the object should be written.
+ * @param flags Additional flags about how the object should be written.
+ */
+ public void writeToParcel(Parcel outParcel, int flags) {
+ outParcel.writeInt(mPhoneId);
+ outParcel.writeInt(mRadioAccessFamily);
+ }
+
+ /**
+ * Implement the Parcelable interface.
+ */
+ public static final Creator<RadioAccessFamily> CREATOR =
+ new Creator<RadioAccessFamily>() {
+
+ @Override
+ public RadioAccessFamily createFromParcel(Parcel in) {
+ int phoneId = in.readInt();
+ int radioAccessFamily = in.readInt();
+
+ return new RadioAccessFamily(phoneId, radioAccessFamily);
+ }
+
+ @Override
+ public RadioAccessFamily[] newArray(int size) {
+ return new RadioAccessFamily[size];
+ }
+ };
+}
+
diff --git a/telephony/java/android/telephony/SubInfoRecord.java b/telephony/java/android/telephony/SubInfoRecord.java
index b9de871..f2df079 100644
--- a/telephony/java/android/telephony/SubInfoRecord.java
+++ b/telephony/java/android/telephony/SubInfoRecord.java
@@ -16,6 +16,7 @@
package android.telephony;
+import android.graphics.drawable.BitmapDrawable;
import android.os.Parcel;
import android.os.Parcelable;
@@ -107,6 +108,31 @@
this.mnc = mnc;
}
+ /**
+ * Returns the string displayed to the user that identifies this subscription
+ */
+ public String getLabel() {
+ return this.displayName;
+ }
+
+ /**
+ * Return the icon used to identify this SIM.
+ * TODO: return the correct drawable.
+ */
+ public BitmapDrawable getIconDrawable() {
+ return new BitmapDrawable();
+ }
+
+ /**
+ * Return the color to be used for when displaying to the user. This is the value of the color.
+ * ex: 0x00ff00
+ */
+ public int getColor() {
+ // Note: This color is currently an index into a list of drawables, but this is soon to
+ // change.
+ return this.color;
+ }
+
public static final Parcelable.Creator<SubInfoRecord> CREATOR = new Parcelable.Creator<SubInfoRecord>() {
@Override
public SubInfoRecord createFromParcel(Parcel source) {
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index d3cef4a..7b5234a 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -3528,4 +3528,25 @@
}
return -1;
}
+
+ /** @hide */
+ @SystemApi
+ public void enableVideoCalling(boolean enable) {
+ try {
+ getITelephony().enableVideoCalling(enable);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling ITelephony#enableVideoCalling", e);
+ }
+ }
+
+ /** @hide */
+ @SystemApi
+ public boolean isVideoCallingEnabled() {
+ try {
+ return getITelephony().isVideoCallingEnabled();
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling ITelephony#isVideoCallingEnabled", e);
+ }
+ return false;
+ }
}
diff --git a/telephony/java/com/android/ims/internal/IImsCallSession.aidl b/telephony/java/com/android/ims/internal/IImsCallSession.aidl
index 98b2d8a9..16b0cd5 100644
--- a/telephony/java/com/android/ims/internal/IImsCallSession.aidl
+++ b/telephony/java/com/android/ims/internal/IImsCallSession.aidl
@@ -160,10 +160,13 @@
void resume(in ImsStreamMediaProfile profile);
/**
- * Merges the active & hold call. When it succeeds, {@link Listener#callSessionMerged}
- * is called.
+ * Merges the active & hold call. When the merge starts,
+ * {@link Listener#callSessionMergeStarted} is called.
+ * {@link Listener#callSessionMergeComplete} is called if the merge is successful, and
+ * {@link Listener#callSessionMergeFailed} is called if the merge fails.
*
- * @see Listener#callSessionMerged, Listener#callSessionMergeFailed
+ * @see Listener#callSessionMergeStarted, Listener#callSessionMergeComplete,
+ * Listener#callSessionMergeFailed
*/
void merge();
@@ -225,4 +228,10 @@
* intermediates between the propriety implementation and Telecomm/InCall.
*/
IImsVideoCallProvider getVideoCallProvider();
+
+ /**
+ * Determines if the current session is multiparty.
+ * @return {@code True} if the session is multiparty.
+ */
+ boolean isMultiparty();
}
diff --git a/telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl b/telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl
index 11da6e6..84d1c545 100644
--- a/telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl
+++ b/telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl
@@ -48,10 +48,11 @@
void callSessionResumeReceived(in IImsCallSession session, in ImsCallProfile profile);
/**
- * Notifiies the result of call merge operation.
+ * Notifies the result of call merge operation.
*/
- void callSessionMerged(in IImsCallSession session,
+ void callSessionMergeStarted(in IImsCallSession session,
in IImsCallSession newSession, in ImsCallProfile profile);
+ void callSessionMergeComplete(in IImsCallSession session);
void callSessionMergeFailed(in IImsCallSession session,
in ImsReasonInfo reasonInfo);
diff --git a/telephony/java/com/android/ims/internal/IImsConfig.aidl b/telephony/java/com/android/ims/internal/IImsConfig.aidl
index e8d921e..c5ccf5f 100644
--- a/telephony/java/com/android/ims/internal/IImsConfig.aidl
+++ b/telephony/java/com/android/ims/internal/IImsConfig.aidl
@@ -73,9 +73,9 @@
*
* @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
* @param value in Integer format.
- * @return void.
+ * @return as defined in com.android.ims.ImsConfig#OperationStatusConstants.
*/
- void setProvisionedValue(int item, int value);
+ int setProvisionedValue(int item, int value);
/**
* Sets the value for IMS service/capabilities parameters by the operator device
@@ -84,9 +84,9 @@
*
* @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
* @param value in String format.
- * @return void.
+ * @return as defined in com.android.ims.ImsConfig#OperationStatusConstants.
*/
- void setProvisionedStringValue(int item, String value);
+ int setProvisionedStringValue(int item, String value);
/**
* Gets the value of the specified IMS feature item for specified network type.
diff --git a/telephony/java/com/android/internal/telephony/DcParamObject.java b/telephony/java/com/android/internal/telephony/DcParamObject.java
index 2736e6f..c92988f 100644
--- a/telephony/java/com/android/internal/telephony/DcParamObject.java
+++ b/telephony/java/com/android/internal/telephony/DcParamObject.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 MediaTek Inc.
+ * Copyright (C) 2014 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.
diff --git a/telephony/java/com/android/internal/telephony/DctConstants.java b/telephony/java/com/android/internal/telephony/DctConstants.java
index defb43b..a4e9486 100644
--- a/telephony/java/com/android/internal/telephony/DctConstants.java
+++ b/telephony/java/com/android/internal/telephony/DctConstants.java
@@ -99,6 +99,7 @@
public static final int EVENT_PROVISIONING_APN_ALARM = BASE + 39;
public static final int CMD_NET_STAT_POLL = BASE + 40;
public static final int EVENT_DATA_RAT_CHANGED = BASE + 41;
+ public static final int CMD_CLEAR_PROVISIONING_SPINNER = BASE + 42;
/***** Constants *****/
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index b5e6703..b4d165c 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -21,13 +21,14 @@
import android.telephony.CellInfo;
import android.telephony.IccOpenLogicalChannelResponse;
import android.telephony.NeighboringCellInfo;
+import android.telephony.RadioAccessFamily;
import java.util.List;
/**
* Interface used to interact with the phone. Mostly this is used by the
* TelephonyManager class. A few places are still using this directly.
- * Please clean them up if possible and use TelephonyManager insteadl.
+ * Please clean them up if possible and use TelephonyManager instead.
*
* {@hide}
*/
@@ -813,4 +814,35 @@
* Shutdown Mobile Radios
*/
void shutdownMobileRadios();
+
+ /**
+ * Set phone radio type and access technology.
+ *
+ * @param rafs an RadioAccessFamily array to indicate all phone's
+ * new radio access family. The length of RadioAccessFamily
+ * must equ]]al to phone count.
+ */
+ void setRadioCapability(in RadioAccessFamily[] rafs);
+
+ /**
+ * Get phone radio type and access technology.
+ *
+ * @param phoneId which phone you want to get
+ * @return phone radio type and access technology
+ */
+ int getRadioAccessFamily(in int phoneId);
+
+ /**
+ * Enables or disables video calling.
+ *
+ * @param enable Whether to enable video calling.
+ */
+ void enableVideoCalling(boolean enable);
+
+ /**
+ * Whether video calling has been enabled by the user.
+ *
+ * @return {@code True} if the user has enabled video calling, {@code false} otherwise.
+ */
+ boolean isVideoCallingEnabled();
}
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index 4aaf99b..b5e82e3 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -161,6 +161,7 @@
public static final int DATA_PROFILE_FOTA = 3;
public static final int DATA_PROFILE_CBS = 4;
public static final int DATA_PROFILE_OEM_BASE = 1000;
+ public static final int DATA_PROFILE_INVALID = 0xFFFFFFFF;
int RIL_REQUEST_GET_SIM_STATUS = 1;
int RIL_REQUEST_ENTER_SIM_PIN = 2;
@@ -291,8 +292,8 @@
int RIL_REQUEST_SET_DC_RT_INFO_RATE = 127;
int RIL_REQUEST_SET_DATA_PROFILE = 128;
int RIL_REQUEST_SHUTDOWN = 129;
- int RIL_REQUEST_GET_3G_CAPABILITY = 130;
- int RIL_REQUEST_SET_3G_CAPABILITY = 131;
+ int RIL_REQUEST_GET_RADIO_CAPABILITY = 130;
+ int RIL_REQUEST_SET_RADIO_CAPABILITY = 131;
int RIL_UNSOL_RESPONSE_BASE = 1000;
int RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED = 1000;
@@ -336,4 +337,6 @@
int RIL_UNSOL_UICC_SUBSCRIPTION_STATUS_CHANGED = 1038;
int RIL_UNSOL_SRVCC_STATE_NOTIFY = 1039;
int RIL_UNSOL_HARDWARE_CONFIG_CHANGED = 1040;
+ int RIL_UNSOL_DC_RT_INFO_CHANGED = 1041;
+ int RIL_UNSOL_RADIO_CAPABILITY = 1042;
}
diff --git a/telephony/java/com/android/internal/telephony/TelephonyIntents.java b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
index e7aca90..d05e7d1 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyIntents.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyIntents.java
@@ -401,4 +401,23 @@
*/
public static final String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED
= "android.intent.action.ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED";
+
+ /*
+ * Broadcast Action: An attempt to set phone radio type and access technology has changed.
+ * This has the following extra values:
+ * <ul>
+ * <li><em>phones radio access family </em> - A RadioAccessFamily
+ * array, contain phone ID and new radio access family for each phone.</li>
+ * </ul>
+ */
+ public static final String ACTION_SET_RADIO_CAPABILITY_DONE =
+ "android.intent.action.ACTION_SET_RADIO_CAPABILITY_DONE";
+
+ public static final String EXTRA_RADIO_ACCESS_FAMILY = "rafs";
+
+ /*
+ * Broadcast Action: An attempt to set phone radio access family has failed.
+ */
+ public static final String ACTION_SET_RADIO_CAPABILITY_FAILED =
+ "android.intent.action.ACTION_SET_RADIO_CAPABILITY_FAILED";
}
diff --git a/tests/HwAccelerationTest/AndroidManifest.xml b/tests/HwAccelerationTest/AndroidManifest.xml
index bc2f1fd..8531944 100644
--- a/tests/HwAccelerationTest/AndroidManifest.xml
+++ b/tests/HwAccelerationTest/AndroidManifest.xml
@@ -342,6 +342,24 @@
</activity>
<activity
+ android:name="HardwareCanvasTextureViewActivity"
+ android:label="TextureView/HardwareCanvas">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="com.android.test.hwui.TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity
+ android:name="HardwareCanvasSurfaceViewActivity"
+ android:label="SurfaceView/HardwareCanvas">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="com.android.test.hwui.TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity
android:name="GLTextureViewActivity"
android:label="TextureView/OpenGL">
<intent-filter>
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/HardwareCanvasSurfaceViewActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/HardwareCanvasSurfaceViewActivity.java
new file mode 100644
index 0000000..b1431c5
--- /dev/null
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/HardwareCanvasSurfaceViewActivity.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2014 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.test.hwui;
+
+import android.app.Activity;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.os.Bundle;
+import android.view.Gravity;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+import android.view.SurfaceHolder.Callback;
+import android.view.SurfaceView;
+import android.widget.FrameLayout;
+
+@SuppressWarnings({"UnusedDeclaration"})
+public class HardwareCanvasSurfaceViewActivity extends Activity implements Callback {
+ private SurfaceView mSurfaceView;
+ private HardwareCanvasSurfaceViewActivity.RenderingThread mThread;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ FrameLayout content = new FrameLayout(this);
+
+ mSurfaceView = new SurfaceView(this);
+ mSurfaceView.getHolder().addCallback(this);
+
+ content.addView(mSurfaceView, new FrameLayout.LayoutParams(
+ FrameLayout.LayoutParams.MATCH_PARENT,
+ FrameLayout.LayoutParams.MATCH_PARENT,
+ Gravity.CENTER));
+ setContentView(content);
+ }
+
+ @Override
+ public void surfaceCreated(SurfaceHolder holder) {
+ mThread = new RenderingThread(holder.getSurface());
+ mThread.start();
+ }
+
+ @Override
+ public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+ mThread.setSize(width, height);
+ }
+
+ @Override
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ if (mThread != null) mThread.stopRendering();
+ }
+
+ private static class RenderingThread extends Thread {
+ private final Surface mSurface;
+ private volatile boolean mRunning = true;
+ private int mWidth, mHeight;
+
+ public RenderingThread(Surface surface) {
+ mSurface = surface;
+ }
+
+ void setSize(int width, int height) {
+ mWidth = width;
+ mHeight = height;
+ }
+
+ @Override
+ public void run() {
+ float x = 0.0f;
+ float y = 0.0f;
+ float speedX = 5.0f;
+ float speedY = 3.0f;
+
+ Paint paint = new Paint();
+ paint.setColor(0xff00ff00);
+
+ while (mRunning && !Thread.interrupted()) {
+ final Canvas canvas = mSurface.lockHardwareCanvas();
+ try {
+ canvas.drawColor(0x00000000, PorterDuff.Mode.CLEAR);
+ canvas.drawRect(x, y, x + 20.0f, y + 20.0f, paint);
+ } finally {
+ mSurface.unlockCanvasAndPost(canvas);
+ }
+
+ if (x + 20.0f + speedX >= mWidth || x + speedX <= 0.0f) {
+ speedX = -speedX;
+ }
+ if (y + 20.0f + speedY >= mHeight || y + speedY <= 0.0f) {
+ speedY = -speedY;
+ }
+
+ x += speedX;
+ y += speedY;
+
+ try {
+ Thread.sleep(15);
+ } catch (InterruptedException e) {
+ // Interrupted
+ }
+ }
+ }
+
+ void stopRendering() {
+ interrupt();
+ mRunning = false;
+ }
+ }
+}
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/HardwareCanvasTextureViewActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/HardwareCanvasTextureViewActivity.java
new file mode 100644
index 0000000..63a6efa
--- /dev/null
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/HardwareCanvasTextureViewActivity.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2014 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.test.hwui;
+
+import android.app.Activity;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.SurfaceTexture;
+import android.os.Bundle;
+import android.view.Gravity;
+import android.view.Surface;
+import android.view.TextureView;
+import android.widget.FrameLayout;
+
+@SuppressWarnings({"UnusedDeclaration"})
+public class HardwareCanvasTextureViewActivity extends Activity
+ implements TextureView.SurfaceTextureListener {
+ private TextureView mTextureView;
+ private HardwareCanvasTextureViewActivity.RenderingThread mThread;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ FrameLayout content = new FrameLayout(this);
+
+ mTextureView = new TextureView(this);
+ mTextureView.setSurfaceTextureListener(this);
+ mTextureView.setOpaque(false);
+
+ content.addView(mTextureView, new FrameLayout.LayoutParams(500, 500, Gravity.CENTER));
+ setContentView(content);
+ }
+
+ @Override
+ public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
+ mThread = new RenderingThread(mTextureView);
+ mThread.start();
+ }
+
+ @Override
+ public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
+ // Ignored
+ }
+
+ @Override
+ public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
+ if (mThread != null) mThread.stopRendering();
+ return true;
+ }
+
+ @Override
+ public void onSurfaceTextureUpdated(SurfaceTexture surface) {
+ // Ignored
+ }
+
+ private static class RenderingThread extends Thread {
+ private final TextureView mView;
+ private final Surface mSurface;
+ private volatile boolean mRunning = true;
+
+ public RenderingThread(TextureView view) {
+ mView = view;
+ mSurface = new Surface(mView.getSurfaceTexture());
+ }
+
+ @Override
+ public void run() {
+ float x = 0.0f;
+ float y = 0.0f;
+ float speedX = 5.0f;
+ float speedY = 3.0f;
+
+ Paint paint = new Paint();
+ paint.setColor(0xff00ff00);
+
+ while (mRunning && !Thread.interrupted()) {
+ final Canvas canvas = mSurface.lockHardwareCanvas();
+ try {
+ canvas.drawColor(0x00000000, PorterDuff.Mode.CLEAR);
+ canvas.drawRect(x, y, x + 20.0f, y + 20.0f, paint);
+ } finally {
+ mSurface.unlockCanvasAndPost(canvas);
+ }
+
+ if (x + 20.0f + speedX >= mView.getWidth() || x + speedX <= 0.0f) {
+ speedX = -speedX;
+ }
+ if (y + 20.0f + speedY >= mView.getHeight() || y + speedY <= 0.0f) {
+ speedY = -speedY;
+ }
+
+ x += speedX;
+ y += speedY;
+
+ try {
+ Thread.sleep(15);
+ } catch (InterruptedException e) {
+ // Interrupted
+ }
+ }
+ }
+
+ void stopRendering() {
+ interrupt();
+ mRunning = false;
+ }
+ }
+}
diff --git a/tools/aapt/AaptAssets.cpp b/tools/aapt/AaptAssets.cpp
index 117fc24..b7f64f6 100644
--- a/tools/aapt/AaptAssets.cpp
+++ b/tools/aapt/AaptAssets.cpp
@@ -1141,9 +1141,10 @@
ssize_t AaptAssets::slurpFullTree(Bundle* bundle, const String8& srcDir,
const AaptGroupEntry& kind,
const String8& resType,
- sp<FilePathStore>& fullResPaths)
+ sp<FilePathStore>& fullResPaths,
+ const bool overwrite)
{
- ssize_t res = AaptDir::slurpFullTree(bundle, srcDir, kind, resType, fullResPaths);
+ ssize_t res = AaptDir::slurpFullTree(bundle, srcDir, kind, resType, fullResPaths, overwrite);
if (res > 0) {
mGroupEntries.add(kind);
}
diff --git a/tools/aapt/AaptAssets.h b/tools/aapt/AaptAssets.h
index d809c5b..7ae5368 100644
--- a/tools/aapt/AaptAssets.h
+++ b/tools/aapt/AaptAssets.h
@@ -591,7 +591,8 @@
const String8& srcDir,
const AaptGroupEntry& kind,
const String8& resType,
- sp<FilePathStore>& fullResPaths);
+ sp<FilePathStore>& fullResPaths,
+ const bool overwrite=false);
ssize_t slurpResourceTree(Bundle* bundle, const String8& srcDir);
ssize_t slurpResourceZip(Bundle* bundle, const char* filename);
diff --git a/tools/aapt/AaptConfig.cpp b/tools/aapt/AaptConfig.cpp
index 32a0cd3..f447462 100644
--- a/tools/aapt/AaptConfig.cpp
+++ b/tools/aapt/AaptConfig.cpp
@@ -240,7 +240,9 @@
}
uint16_t minSdk = 0;
- if (config->smallestScreenWidthDp != ResTable_config::SCREENWIDTH_ANY
+ if (config->density == ResTable_config::DENSITY_ANY) {
+ minSdk = SDK_L;
+ } else if (config->smallestScreenWidthDp != ResTable_config::SCREENWIDTH_ANY
|| config->screenWidthDp != ResTable_config::SCREENWIDTH_ANY
|| config->screenHeightDp != ResTable_config::SCREENHEIGHT_ANY) {
minSdk = SDK_HONEYCOMB_MR2;
@@ -255,8 +257,6 @@
!= ResTable_config::SCREENLONG_ANY
|| config->density != ResTable_config::DENSITY_DEFAULT) {
minSdk = SDK_DONUT;
- } else if ((config->density == ResTable_config::DENSITY_ANY)) {
- minSdk = SDK_L;
}
if (minSdk > config->sdkVersion) {
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index 1e9e3e2..f5f70c5 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -307,6 +307,7 @@
PUBLIC_KEY_ATTR = 0x010103a6,
CATEGORY_ATTR = 0x010103e8,
BANNER_ATTR = 0x10103f2,
+ ISGAME_ATTR = 0x10103f4,
};
String8 getComponentName(String8 &pkgName, String8 &componentName) {
@@ -1127,13 +1128,35 @@
error.string());
goto bail;
}
+
+ String8 banner = AaptXml::getResolvedAttribute(res, tree, BANNER_ATTR, &error);
+ if (error != "") {
+ fprintf(stderr, "ERROR getting 'android:banner' attribute: %s\n",
+ error.string());
+ goto bail;
+ }
printf("application: label='%s' ",
ResTable::normalizeForOutput(label.string()).string());
- printf("icon='%s'\n", ResTable::normalizeForOutput(icon.string()).string());
+ printf("icon='%s'", ResTable::normalizeForOutput(icon.string()).string());
+ if (banner != "") {
+ printf(" banner='%s'", ResTable::normalizeForOutput(banner.string()).string());
+ }
+ printf("\n");
if (testOnly != 0) {
printf("testOnly='%d'\n", testOnly);
}
+ int32_t isGame = AaptXml::getResolvedIntegerAttribute(res, tree,
+ ISGAME_ATTR, 0, &error);
+ if (error != "") {
+ fprintf(stderr, "ERROR getting 'android:isGame' attribute: %s\n",
+ error.string());
+ goto bail;
+ }
+ if (isGame != 0) {
+ printf("application-isGame\n");
+ }
+
int32_t debuggable = AaptXml::getResolvedIntegerAttribute(res, tree,
DEBUGGABLE_ATTR, 0, &error);
if (error != "") {
diff --git a/tools/aapt/ConfigDescription.h b/tools/aapt/ConfigDescription.h
index 779c423..4f999a2 100644
--- a/tools/aapt/ConfigDescription.h
+++ b/tools/aapt/ConfigDescription.h
@@ -28,10 +28,12 @@
memset(this, 0, sizeof(*this));
size = sizeof(android::ResTable_config);
}
+
ConfigDescription(const android::ResTable_config&o) {
*static_cast<android::ResTable_config*>(this) = o;
size = sizeof(android::ResTable_config);
}
+
ConfigDescription(const ConfigDescription&o) {
*static_cast<android::ResTable_config*>(this) = o;
}
@@ -41,6 +43,7 @@
size = sizeof(android::ResTable_config);
return *this;
}
+
ConfigDescription& operator=(const ConfigDescription& o) {
*static_cast<android::ResTable_config*>(this) = o;
return *this;
diff --git a/tools/aapt/Images.cpp b/tools/aapt/Images.cpp
index 56d1650..5d4a6ac 100644
--- a/tools/aapt/Images.cpp
+++ b/tools/aapt/Images.cpp
@@ -1491,7 +1491,7 @@
// At this point, now that we have all the resource data, all we need to
// do is compile XML files.
if (strcmp(ext.string(), ".xml") == 0) {
- String16 resourceName(parseResourceName(file->getPath().getPathLeaf()));
+ String16 resourceName(parseResourceName(file->getSourceFile().getPathLeaf()));
return compileXmlFile(bundle, assets, resourceName, file, table);
}
diff --git a/tools/aapt/ResourceIdCache.cpp b/tools/aapt/ResourceIdCache.cpp
index d60a07fc..8835fb0 100644
--- a/tools/aapt/ResourceIdCache.cpp
+++ b/tools/aapt/ResourceIdCache.cpp
@@ -9,8 +9,6 @@
#include <utils/Log.h>
#include "ResourceIdCache.h"
#include <map>
-using namespace std;
-
static size_t mHits = 0;
static size_t mMisses = 0;
@@ -29,7 +27,7 @@
CacheEntry(const android::String16& name, uint32_t resId) : hashedName(name), id(resId) { }
};
-static map< uint32_t, CacheEntry > mIdMap;
+static std::map< uint32_t, CacheEntry > mIdMap;
// djb2; reasonable choice for strings when collisions aren't particularly important
@@ -63,7 +61,7 @@
bool onlyPublic) {
const String16 hashedName = makeHashableName(package, type, name, onlyPublic);
const uint32_t hashcode = hash(hashedName);
- map<uint32_t, CacheEntry>::iterator item = mIdMap.find(hashcode);
+ std::map<uint32_t, CacheEntry>::iterator item = mIdMap.find(hashcode);
if (item == mIdMap.end()) {
// cache miss
mMisses++;
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
index c003fa6..4587a4b 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -4428,6 +4428,9 @@
// Look to see if we already have an overriding v21 configuration.
sp<ConfigList> cl = getConfigList(String16(mAssets->getPackage()),
String16(target->getResourceType()), resourceName);
+ //if (cl == NULL) {
+ // fprintf(stderr, "fuuuuck\n");
+ //}
if (cl->getEntries().indexOfKey(newConfig) < 0) {
// We don't have an overriding entry for v21, so we must duplicate this one.
sp<XMLNode> newRoot = root->clone();
@@ -4435,7 +4438,7 @@
AaptGroupEntry(newConfig), target->getResourceType());
String8 resPath = String8::format("res/%s/%s",
newFile->getGroupEntry().toDirName(target->getResourceType()).string(),
- target->getPath().getPathLeaf().string());
+ target->getSourceFile().getPathLeaf().string());
resPath.convertToResPath();
// Add a resource table entry.
diff --git a/tools/layoutlib/bridge/src/android/graphics/FontFamily_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/FontFamily_Delegate.java
index bef5181..4993262 100644
--- a/tools/layoutlib/bridge/src/android/graphics/FontFamily_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/FontFamily_Delegate.java
@@ -213,6 +213,10 @@
return null;
}
+ @Nullable
+ /*package*/ static String getFontLocation() {
+ return sFontLocation;
+ }
// ---- native methods ----
diff --git a/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java
index 276e134..b9460b4 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Typeface_Delegate.java
@@ -27,6 +27,8 @@
import java.util.ArrayList;
import java.util.List;
+import static android.graphics.FontFamily_Delegate.getFontLocation;
+
/**
* Delegate implementing the native methods of android.graphics.Typeface
*
@@ -48,8 +50,6 @@
private static final DelegateManager<Typeface_Delegate> sManager =
new DelegateManager<Typeface_Delegate>(Typeface_Delegate.class);
- // ---- delegate helper data ----
- private static String sFontLocation;
// ---- delegate data ----
@@ -61,11 +61,8 @@
private static long sDefaultTypeface;
+
// ---- Public Helper methods ----
- public static synchronized void setFontLocation(String fontLocation) {
- sFontLocation = fontLocation;
- FontFamily_Delegate.setFontLocation(fontLocation);
- }
public static Typeface_Delegate getDelegate(long nativeTypeface) {
return sManager.getDelegate(nativeTypeface);
@@ -131,6 +128,18 @@
return fonts;
}
+ /**
+ * Clear the default typefaces when disposing bridge.
+ */
+ public static void resetDefaults() {
+ // Sometimes this is called before the Bridge is initialized. In that case, we don't want to
+ // initialize Typeface because the SDK fonts location hasn't been set.
+ if (FontFamily_Delegate.getFontLocation() != null) {
+ Typeface.sDefaults = null;
+ }
+ }
+
+
// ---- native methods ----
@LayoutlibDelegate
@@ -193,7 +202,7 @@
@LayoutlibDelegate
/*package*/ static File getSystemFontConfigLocation() {
- return new File(sFontLocation);
+ return new File(getFontLocation());
}
// ---- Private delegate/helper methods ----
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
index 3d0e1e8..825731b 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java
@@ -38,7 +38,7 @@
import android.content.res.BridgeAssetManager;
import android.graphics.Bitmap;
-import android.graphics.Typeface_Accessor;
+import android.graphics.FontFamily_Delegate;
import android.graphics.Typeface_Delegate;
import android.os.Looper;
import android.os.Looper_Accessor;
@@ -250,7 +250,7 @@
}
// load the fonts.
- Typeface_Delegate.setFontLocation(fontLocation.getAbsolutePath());
+ FontFamily_Delegate.setFontLocation(fontLocation.getAbsolutePath());
// now parse com.android.internal.R (and only this one as android.R is a subset of
// the internal version), and put the content in the maps.
@@ -303,7 +303,7 @@
BridgeAssetManager.clearSystem();
// dispose of the default typeface.
- Typeface_Accessor.resetDefaults();
+ Typeface_Delegate.resetDefaults();
return true;
}
diff --git a/tools/split-select/Abi.cpp b/tools/split-select/Abi.cpp
new file mode 100644
index 0000000..20654b6
--- /dev/null
+++ b/tools/split-select/Abi.cpp
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#include "Abi.h"
+
+namespace split {
+namespace abi {
+
+static const std::vector<Variant> sNoneVariants = {};
+static const std::vector<Variant> sArmVariants =
+ {Variant::armeabi, Variant::armeabi_v7a, Variant::arm64_v8a};
+static const std::vector<Variant> sIntelVariants = {Variant::x86, Variant::x86_64};
+static const std::vector<Variant> sMipsVariants = {Variant::mips, Variant::mips64};
+
+Family getFamily(Variant variant) {
+ switch (variant) {
+ case Variant::none:
+ return Family::none;
+ case Variant::armeabi:
+ case Variant::armeabi_v7a:
+ case Variant::arm64_v8a:
+ return Family::arm;
+ case Variant::x86:
+ case Variant::x86_64:
+ return Family::intel;
+ case Variant::mips:
+ case Variant::mips64:
+ return Family::mips;
+ }
+ return Family::none;
+}
+
+const std::vector<Variant>& getVariants(Family family) {
+ switch (family) {
+ case Family::none:
+ return sNoneVariants;
+ case Family::arm:
+ return sArmVariants;
+ case Family::intel:
+ return sIntelVariants;
+ case Family::mips:
+ return sMipsVariants;
+ }
+ return sNoneVariants;
+}
+
+const char* toString(Variant variant) {
+ switch (variant) {
+ case Variant::none:
+ return "";
+ case Variant::armeabi:
+ return "armeabi";
+ case Variant::armeabi_v7a:
+ return "armeabi-v7a";
+ case Variant::arm64_v8a:
+ return "arm64-v8a";
+ case Variant::x86:
+ return "x86";
+ case Variant::x86_64:
+ return "x86_64";
+ case Variant::mips:
+ return "mips";
+ case Variant::mips64:
+ return "mips64";
+ }
+ return "";
+}
+
+} // namespace abi
+} // namespace split
diff --git a/tools/split-select/Abi.h b/tools/split-select/Abi.h
new file mode 100644
index 0000000..3e00eba
--- /dev/null
+++ b/tools/split-select/Abi.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#ifndef H_ANDROID_SPLIT_ABI
+#define H_ANDROID_SPLIT_ABI
+
+#include <vector>
+
+namespace split {
+namespace abi {
+
+enum class Variant {
+ none = 0,
+ armeabi,
+ armeabi_v7a,
+ arm64_v8a,
+ x86,
+ x86_64,
+ mips,
+ mips64,
+};
+
+enum class Family {
+ none,
+ arm,
+ intel,
+ mips,
+};
+
+Family getFamily(Variant variant);
+const std::vector<Variant>& getVariants(Family family);
+const char* toString(Variant variant);
+
+} // namespace abi
+} // namespace split
+
+#endif // H_ANDROID_SPLIT_ABI
diff --git a/tools/split-select/Android.mk b/tools/split-select/Android.mk
new file mode 100644
index 0000000..d0b7287
--- /dev/null
+++ b/tools/split-select/Android.mk
@@ -0,0 +1,119 @@
+#
+# Copyright (C) 2014 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This tool is prebuilt if we're doing an app-only build.
+ifeq ($(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK)),)
+
+# TODO(adamlesinski): Enable OS X builds when I figure out how
+# to build with clang and libc++
+ifneq ($(HOST_OS),darwin)
+
+# ==========================================================
+# Setup some common variables for the different build
+# targets here.
+# ==========================================================
+LOCAL_PATH:= $(call my-dir)
+
+main := Main.cpp
+sources := \
+ Abi.cpp \
+ Grouper.cpp \
+ Rule.cpp \
+ RuleGenerator.cpp \
+ SplitDescription.cpp
+
+testSources := \
+ Grouper_test.cpp \
+ Rule_test.cpp \
+ RuleGenerator_test.cpp
+
+cIncludes := \
+ external/zlib \
+ frameworks/base/tools
+
+hostLdLibs :=
+hostStaticLibs := \
+ libaapt \
+ libandroidfw \
+ libpng \
+ liblog \
+ libutils \
+ libcutils \
+ libexpat \
+ libziparchive-host
+
+cFlags := -std=c++11 -Wall -Werror
+
+ifeq ($(HOST_OS),linux)
+ hostLdLibs += -lrt -ldl -lpthread
+endif
+
+# Statically link libz for MinGW (Win SDK under Linux),
+# and dynamically link for all others.
+ifneq ($(strip $(USE_MINGW)),)
+ hostStaticLibs += libz
+else
+ hostLdLibs += -lz
+endif
+
+
+# ==========================================================
+# Build the host static library: libsplit-select
+# ==========================================================
+include $(CLEAR_VARS)
+LOCAL_MODULE := libsplit-select
+
+LOCAL_SRC_FILES := $(sources)
+
+LOCAL_C_INCLUDES += $(cIncludes)
+LOCAL_CFLAGS += $(cFlags) -D_DARWIN_UNLIMITED_STREAMS
+
+include $(BUILD_HOST_STATIC_LIBRARY)
+
+
+# ==========================================================
+# Build the host tests: libsplit-select_tests
+# ==========================================================
+include $(CLEAR_VARS)
+LOCAL_MODULE := libsplit-select_tests
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SRC_FILES := $(testSources)
+
+LOCAL_C_INCLUDES += $(cIncludes)
+LOCAL_STATIC_LIBRARIES += libsplit-select $(hostStaticLibs)
+LOCAL_LDLIBS += $(hostLdLibs)
+LOCAL_CFLAGS += $(cFlags)
+
+include $(BUILD_HOST_NATIVE_TEST)
+
+# ==========================================================
+# Build the host executable: split-select
+# ==========================================================
+include $(CLEAR_VARS)
+LOCAL_MODULE := split-select
+
+LOCAL_SRC_FILES := $(main)
+
+LOCAL_C_INCLUDES += $(cIncludes)
+LOCAL_STATIC_LIBRARIES += libsplit-select $(hostStaticLibs)
+LOCAL_LDLIBS += $(hostLdLibs)
+LOCAL_CFLAGS += $(cFlags)
+
+include $(BUILD_HOST_EXECUTABLE)
+
+endif # Not OS X
+endif # No TARGET_BUILD_APPS or TARGET_BUILD_PDK
diff --git a/tools/split-select/Grouper.cpp b/tools/split-select/Grouper.cpp
new file mode 100644
index 0000000..15edf89
--- /dev/null
+++ b/tools/split-select/Grouper.cpp
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#include "Grouper.h"
+
+#include "SplitDescription.h"
+
+#include <utils/KeyedVector.h>
+#include <utils/Vector.h>
+
+using namespace android;
+
+namespace split {
+
+template <typename Key, typename Value>
+static void addToVector(KeyedVector<Key, SortedVector<Value> >& group,
+ const Key& key, const Value& value) {
+ ssize_t idx = group.indexOfKey(key);
+ if (idx < 0) {
+ idx = group.add(key, SortedVector<Value>());
+ }
+ group.editValueAt(idx).add(value);
+}
+
+Vector<SortedVector<SplitDescription> >
+groupByMutualExclusivity(const Vector<SplitDescription>& splits) {
+ Vector<SortedVector<SplitDescription> > groups;
+
+ // Find mutually exclusive splits and group them.
+ KeyedVector<SplitDescription, SortedVector<SplitDescription> > densityGroups;
+ KeyedVector<SplitDescription, SortedVector<SplitDescription> > abiGroups;
+ KeyedVector<SplitDescription, SortedVector<SplitDescription> > localeGroups;
+ for (const SplitDescription& split : splits) {
+ if (split.config.density != 0) {
+ SplitDescription key(split);
+ key.config.density = 0;
+ key.config.sdkVersion = 0; // Ignore density so we can support anydpi.
+ addToVector(densityGroups, key, split);
+ } else if (split.abi != abi::Variant::none) {
+ SplitDescription key(split);
+ key.abi = abi::Variant::none;
+ addToVector(abiGroups, key, split);
+ } else if (split.config.locale != 0) {
+ SplitDescription key(split);
+ key.config.clearLocale();
+ addToVector(localeGroups, key, split);
+ } else {
+ groups.add();
+ groups.editTop().add(split);
+ }
+ }
+
+ const size_t densityCount = densityGroups.size();
+ for (size_t i = 0; i < densityCount; i++) {
+ groups.add(densityGroups[i]);
+ }
+
+ const size_t abiCount = abiGroups.size();
+ for (size_t i = 0; i < abiCount; i++) {
+ groups.add(abiGroups[i]);
+ }
+
+ const size_t localeCount = localeGroups.size();
+ for (size_t i = 0; i < localeCount; i++) {
+ groups.add(localeGroups[i]);
+ }
+ return groups;
+}
+
+} // namespace split
diff --git a/core/java/android/view/AccessibilityManagerInternal.java b/tools/split-select/Grouper.h
similarity index 61%
rename from core/java/android/view/AccessibilityManagerInternal.java
rename to tools/split-select/Grouper.h
index 7bb2dc5..5cb0b5b 100644
--- a/core/java/android/view/AccessibilityManagerInternal.java
+++ b/tools/split-select/Grouper.h
@@ -14,18 +14,19 @@
* limitations under the License.
*/
-package android.view;
+#ifndef H_ANDROID_SPLIT_GROUPER
+#define H_ANDROID_SPLIT_GROUPER
-/**
- * Accessibility manager local system service interface.
- *
- * @hide Only for use within the system server.
- */
-public abstract class AccessibilityManagerInternal {
+#include "SplitDescription.h"
- /**
- * Queries if the accessibility manager service permits setting
- * a non-default encryption password.
- */
- public abstract boolean isNonDefaultEncryptionPasswordAllowed();
-}
+#include <utils/SortedVector.h>
+#include <utils/Vector.h>
+
+namespace split {
+
+android::Vector<android::SortedVector<SplitDescription> >
+groupByMutualExclusivity(const android::Vector<SplitDescription>& splits);
+
+} // namespace split
+
+#endif // H_ANDROID_SPLIT_GROUPER
diff --git a/tools/split-select/Grouper_test.cpp b/tools/split-select/Grouper_test.cpp
new file mode 100644
index 0000000..4d146cd
--- /dev/null
+++ b/tools/split-select/Grouper_test.cpp
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#include "Grouper.h"
+
+#include "SplitDescription.h"
+
+#include <gtest/gtest.h>
+#include <initializer_list>
+#include <utils/String8.h>
+#include <utils/Vector.h>
+
+using namespace android;
+
+namespace split {
+
+class GrouperTest : public ::testing::Test {
+protected:
+ virtual void SetUp() {
+ Vector<SplitDescription> splits;
+ addSplit(splits, "en-rUS-sw600dp-hdpi");
+ addSplit(splits, "fr-rFR-sw600dp-hdpi");
+ addSplit(splits, "fr-rFR-sw600dp-xhdpi");
+ addSplit(splits, ":armeabi");
+ addSplit(splits, "en-rUS-sw300dp-xhdpi");
+ addSplit(splits, "large");
+ addSplit(splits, "pl-rPL");
+ addSplit(splits, "xlarge");
+ addSplit(splits, "en-rUS-sw600dp-xhdpi");
+ addSplit(splits, "en-rUS-sw300dp-hdpi");
+ addSplit(splits, "xxhdpi");
+ addSplit(splits, "hdpi");
+ addSplit(splits, "de-rDE");
+ addSplit(splits, "xhdpi");
+ addSplit(splits, ":x86");
+ addSplit(splits, "anydpi");
+ addSplit(splits, "v7");
+ addSplit(splits, "v8");
+ addSplit(splits, "sw600dp");
+ addSplit(splits, "sw300dp");
+ mGroups = groupByMutualExclusivity(splits);
+ }
+
+ void addSplit(Vector<SplitDescription>& splits, const char* str);
+ void expectHasGroupWithSplits(std::initializer_list<const char*> l);
+
+ Vector<SortedVector<SplitDescription> > mGroups;
+};
+
+TEST_F(GrouperTest, shouldHaveCorrectNumberOfGroups) {
+ EXPECT_EQ(12u, mGroups.size());
+}
+
+TEST_F(GrouperTest, shouldGroupDensities) {
+ expectHasGroupWithSplits({"en-rUS-sw300dp-hdpi", "en-rUS-sw300dp-xhdpi"});
+ expectHasGroupWithSplits({"en-rUS-sw600dp-hdpi", "en-rUS-sw600dp-xhdpi"});
+ expectHasGroupWithSplits({"fr-rFR-sw600dp-hdpi", "fr-rFR-sw600dp-xhdpi"});
+ expectHasGroupWithSplits({"hdpi", "xhdpi", "xxhdpi", "anydpi"});
+}
+
+TEST_F(GrouperTest, shouldGroupAbi) {
+ expectHasGroupWithSplits({":armeabi", ":x86"});
+}
+
+TEST_F(GrouperTest, shouldGroupLocale) {
+ expectHasGroupWithSplits({"pl-rPL", "de-rDE"});
+}
+
+TEST_F(GrouperTest, shouldGroupEachSplitIntoItsOwnGroup) {
+ expectHasGroupWithSplits({"large"});
+ expectHasGroupWithSplits({"xlarge"});
+ expectHasGroupWithSplits({"v7"});
+ expectHasGroupWithSplits({"v8"});
+ expectHasGroupWithSplits({"sw600dp"});
+ expectHasGroupWithSplits({"sw300dp"});
+}
+
+//
+// Helper methods
+//
+
+void GrouperTest::expectHasGroupWithSplits(std::initializer_list<const char*> l) {
+ Vector<SplitDescription> splits;
+ for (const char* str : l) {
+ splits.add();
+ if (!SplitDescription::parse(String8(str), &splits.editTop())) {
+ ADD_FAILURE() << "Failed to parse SplitDescription " << str;
+ return;
+ }
+ }
+ const size_t splitCount = splits.size();
+
+ const size_t groupCount = mGroups.size();
+ for (size_t i = 0; i < groupCount; i++) {
+ const SortedVector<SplitDescription>& group = mGroups[i];
+ if (group.size() != splitCount) {
+ continue;
+ }
+
+ size_t found = 0;
+ for (size_t j = 0; j < splitCount; j++) {
+ if (group.indexOf(splits[j]) >= 0) {
+ found++;
+ }
+ }
+
+ if (found == splitCount) {
+ return;
+ }
+ }
+
+ String8 errorMessage("Failed to find expected group [");
+ for (size_t i = 0; i < splitCount; i++) {
+ if (i != 0) {
+ errorMessage.append(", ");
+ }
+ errorMessage.append(splits[i].toString());
+ }
+ errorMessage.append("].\nActual:\n");
+
+ for (size_t i = 0; i < groupCount; i++) {
+ errorMessage.appendFormat("Group %d:\n", int(i + 1));
+ const SortedVector<SplitDescription>& group = mGroups[i];
+ for (size_t j = 0; j < group.size(); j++) {
+ errorMessage.append(" ");
+ errorMessage.append(group[j].toString());
+ errorMessage.append("\n");
+ }
+ }
+ ADD_FAILURE() << errorMessage.string();
+}
+
+void GrouperTest::addSplit(Vector<SplitDescription>& splits, const char* str) {
+ splits.add();
+ EXPECT_TRUE(SplitDescription::parse(String8(str), &splits.editTop()));
+}
+
+} // namespace split
diff --git a/tools/split-select/Main.cpp b/tools/split-select/Main.cpp
new file mode 100644
index 0000000..d6251c3
--- /dev/null
+++ b/tools/split-select/Main.cpp
@@ -0,0 +1,314 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#include <algorithm>
+#include <cstdio>
+
+#include "aapt/AaptUtil.h"
+
+#include "Grouper.h"
+#include "Rule.h"
+#include "RuleGenerator.h"
+#include "SplitDescription.h"
+
+#include <androidfw/AssetManager.h>
+#include <androidfw/ResourceTypes.h>
+#include <utils/KeyedVector.h>
+#include <utils/Vector.h>
+
+using namespace android;
+
+namespace split {
+
+static void usage() {
+ fprintf(stderr,
+ "split-select --help\n"
+ "split-select --target <config> --split <path/to/apk> [--split <path/to/apk> [...]]\n"
+ "split-select --generate --split <path/to/apk> [--split <path/to/apk> [...]]\n"
+ "\n"
+ " --help Displays more information about this program.\n"
+ " --target <config> Performs the Split APK selection on the given configuration.\n"
+ " --generate Generates the logic for selecting the Split APK, in JSON format.\n"
+ " --split <path/to/apk> Includes a Split APK in the selection process.\n"
+ "\n"
+ " Where <config> is an extended AAPT resource qualifier of the form\n"
+ " 'resource-qualifiers:extended-qualifiers', where 'resource-qualifiers' is an AAPT resource\n"
+ " qualifier (ex: en-rUS-sw600dp-xhdpi), and 'extended-qualifiers' is an ordered list of one\n"
+ " qualifier (or none) from each category:\n"
+ " Architecture: armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips\n");
+}
+
+static void help() {
+ usage();
+ fprintf(stderr, "\n"
+ " Generates the logic for selecting a Split APK given some target Android device configuration.\n"
+ " Using the flag --generate will emit a JSON encoded tree of rules that must be satisfied in order\n"
+ " to install the given Split APK. Using the flag --target along with the device configuration\n"
+ " will emit the set of Split APKs to install, following the same logic that would have been emitted\n"
+ " via JSON.\n");
+}
+
+class SplitSelector {
+public:
+ SplitSelector() = default;
+ SplitSelector(const Vector<SplitDescription>& splits);
+
+ Vector<SplitDescription> getBestSplits(const SplitDescription& target) const;
+
+ template <typename RuleGenerator>
+ KeyedVector<SplitDescription, sp<Rule> > getRules() const;
+
+private:
+ Vector<SortedVector<SplitDescription> > mGroups;
+};
+
+SplitSelector::SplitSelector(const Vector<SplitDescription>& splits)
+ : mGroups(groupByMutualExclusivity(splits)) {
+}
+
+static void selectBestFromGroup(const SortedVector<SplitDescription>& splits,
+ const SplitDescription& target, Vector<SplitDescription>& splitsOut) {
+ SplitDescription bestSplit;
+ bool isSet = false;
+ const size_t splitCount = splits.size();
+ for (size_t j = 0; j < splitCount; j++) {
+ const SplitDescription& thisSplit = splits[j];
+ if (!thisSplit.match(target)) {
+ continue;
+ }
+
+ if (!isSet || thisSplit.isBetterThan(bestSplit, target)) {
+ isSet = true;
+ bestSplit = thisSplit;
+ }
+ }
+
+ if (isSet) {
+ splitsOut.add(bestSplit);
+ }
+}
+
+Vector<SplitDescription> SplitSelector::getBestSplits(const SplitDescription& target) const {
+ Vector<SplitDescription> bestSplits;
+ const size_t groupCount = mGroups.size();
+ for (size_t i = 0; i < groupCount; i++) {
+ selectBestFromGroup(mGroups[i], target, bestSplits);
+ }
+ return bestSplits;
+}
+
+template <typename RuleGenerator>
+KeyedVector<SplitDescription, sp<Rule> > SplitSelector::getRules() const {
+ KeyedVector<SplitDescription, sp<Rule> > rules;
+
+ const size_t groupCount = mGroups.size();
+ for (size_t i = 0; i < groupCount; i++) {
+ const SortedVector<SplitDescription>& splits = mGroups[i];
+ const size_t splitCount = splits.size();
+ for (size_t j = 0; j < splitCount; j++) {
+ sp<Rule> rule = Rule::simplify(RuleGenerator::generate(splits, j));
+ if (rule != NULL) {
+ rules.add(splits[j], rule);
+ }
+ }
+ }
+ return rules;
+}
+
+Vector<SplitDescription> select(const SplitDescription& target, const Vector<SplitDescription>& splits) {
+ const SplitSelector selector(splits);
+ return selector.getBestSplits(target);
+}
+
+void generate(const KeyedVector<String8, Vector<SplitDescription> >& splits) {
+ Vector<SplitDescription> allSplits;
+ const size_t apkSplitCount = splits.size();
+ for (size_t i = 0; i < apkSplitCount; i++) {
+ allSplits.appendVector(splits[i]);
+ }
+ const SplitSelector selector(allSplits);
+ KeyedVector<SplitDescription, sp<Rule> > rules(selector.getRules<RuleGenerator>());
+
+ fprintf(stdout, "[\n");
+ for (size_t i = 0; i < apkSplitCount; i++) {
+ sp<Rule> masterRule = new Rule();
+ masterRule->op = Rule::OR_SUBRULES;
+ const Vector<SplitDescription>& splitDescriptions = splits[i];
+ const size_t splitDescriptionCount = splitDescriptions.size();
+ for (size_t j = 0; j < splitDescriptionCount; j++) {
+ masterRule->subrules.add(rules.valueFor(splitDescriptions[j]));
+ }
+ masterRule = Rule::simplify(masterRule);
+ fprintf(stdout, " {\n \"path\": \"%s\",\n \"rules\": %s\n }%s\n",
+ splits.keyAt(i).string(),
+ masterRule->toJson(2).string(),
+ i < apkSplitCount - 1 ? "," : "");
+ }
+ fprintf(stdout, "]\n");
+}
+
+static void removeRuntimeQualifiers(ConfigDescription* outConfig) {
+ outConfig->imsi = 0;
+ outConfig->orientation = ResTable_config::ORIENTATION_ANY;
+ outConfig->screenWidth = ResTable_config::SCREENWIDTH_ANY;
+ outConfig->screenHeight = ResTable_config::SCREENHEIGHT_ANY;
+ outConfig->uiMode &= ResTable_config::UI_MODE_NIGHT_ANY;
+}
+
+static Vector<SplitDescription> extractSplitDescriptionsFromApk(const String8& path) {
+ AssetManager assetManager;
+ Vector<SplitDescription> splits;
+ int32_t cookie = 0;
+ if (!assetManager.addAssetPath(path, &cookie)) {
+ return splits;
+ }
+
+ const ResTable& res = assetManager.getResources(false);
+ if (res.getError() == NO_ERROR) {
+ Vector<ResTable_config> configs;
+ res.getConfigurations(&configs);
+ const size_t configCount = configs.size();
+ for (size_t i = 0; i < configCount; i++) {
+ splits.add();
+ splits.editTop().config = configs[i];
+ }
+ }
+
+ AssetDir* dir = assetManager.openNonAssetDir(cookie, "lib");
+ if (dir != NULL) {
+ const size_t fileCount = dir->getFileCount();
+ for (size_t i = 0; i < fileCount; i++) {
+ splits.add();
+ Vector<String8> parts = AaptUtil::splitAndLowerCase(dir->getFileName(i), '-');
+ if (parseAbi(parts, 0, &splits.editTop()) < 0) {
+ fprintf(stderr, "Malformed library %s\n", dir->getFileName(i).string());
+ splits.pop();
+ }
+ }
+ delete dir;
+ }
+ return splits;
+}
+
+static int main(int argc, char** argv) {
+ // Skip over the first argument.
+ argc--;
+ argv++;
+
+ bool generateFlag = false;
+ String8 targetConfigStr;
+ Vector<String8> splitApkPaths;
+ while (argc > 0) {
+ const String8 arg(*argv);
+ if (arg == "--target") {
+ argc--;
+ argv++;
+ if (argc < 1) {
+ fprintf(stderr, "Missing parameter for --split.\n");
+ usage();
+ return 1;
+ }
+ targetConfigStr.setTo(*argv);
+ } else if (arg == "--split") {
+ argc--;
+ argv++;
+ if (argc < 1) {
+ fprintf(stderr, "Missing parameter for --split.\n");
+ usage();
+ return 1;
+ }
+ splitApkPaths.add(String8(*argv));
+ } else if (arg == "--generate") {
+ generateFlag = true;
+ } else if (arg == "--help") {
+ help();
+ return 0;
+ } else {
+ fprintf(stderr, "Unknown argument '%s'\n", arg.string());
+ usage();
+ return 1;
+ }
+ argc--;
+ argv++;
+ }
+
+ if (!generateFlag && targetConfigStr == "") {
+ usage();
+ return 1;
+ }
+
+ if (splitApkPaths.size() == 0) {
+ usage();
+ return 1;
+ }
+
+ SplitDescription targetSplit;
+ if (!generateFlag) {
+ if (!SplitDescription::parse(targetConfigStr, &targetSplit)) {
+ fprintf(stderr, "Invalid --target config: '%s'\n",
+ targetConfigStr.string());
+ usage();
+ return 1;
+ }
+
+ // We don't want to match on things that will change at run-time
+ // (orientation, w/h, etc.).
+ removeRuntimeQualifiers(&targetSplit.config);
+ }
+
+ KeyedVector<String8, Vector<SplitDescription> > apkPathSplitMap;
+ KeyedVector<SplitDescription, String8> splitApkPathMap;
+ Vector<SplitDescription> splitConfigs;
+ const size_t splitCount = splitApkPaths.size();
+ for (size_t i = 0; i < splitCount; i++) {
+ Vector<SplitDescription> splits = extractSplitDescriptionsFromApk(splitApkPaths[i]);
+ if (splits.isEmpty()) {
+ fprintf(stderr, "Invalid --split path: '%s'. No splits found.\n",
+ splitApkPaths[i].string());
+ usage();
+ return 1;
+ }
+ apkPathSplitMap.replaceValueFor(splitApkPaths[i], splits);
+ const size_t apkSplitDescriptionCount = splits.size();
+ for (size_t j = 0; j < apkSplitDescriptionCount; j++) {
+ splitApkPathMap.replaceValueFor(splits[j], splitApkPaths[i]);
+ }
+ splitConfigs.appendVector(splits);
+ }
+
+ if (!generateFlag) {
+ Vector<SplitDescription> matchingConfigs = select(targetSplit, splitConfigs);
+ const size_t matchingConfigCount = matchingConfigs.size();
+ SortedVector<String8> matchingSplitPaths;
+ for (size_t i = 0; i < matchingConfigCount; i++) {
+ matchingSplitPaths.add(splitApkPathMap.valueFor(matchingConfigs[i]));
+ }
+
+ const size_t matchingSplitApkPathCount = matchingSplitPaths.size();
+ for (size_t i = 0; i < matchingSplitApkPathCount; i++) {
+ fprintf(stderr, "%s\n", matchingSplitPaths[i].string());
+ }
+ } else {
+ generate(apkPathSplitMap);
+ }
+ return 0;
+}
+
+} // namespace split
+
+int main(int argc, char** argv) {
+ return split::main(argc, argv);
+}
diff --git a/tools/split-select/Rule.cpp b/tools/split-select/Rule.cpp
new file mode 100644
index 0000000..9559fe2
--- /dev/null
+++ b/tools/split-select/Rule.cpp
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#include "Rule.h"
+
+#include <utils/String8.h>
+
+using namespace android;
+
+namespace split {
+
+inline static void indentStr(String8& str, int indent) {
+ while (indent > 0) {
+ str.append(" ");
+ indent--;
+ }
+}
+
+String8 Rule::toJson(int indent) const {
+ String8 str;
+ indentStr(str, indent);
+ str.append("{\n");
+ indent++;
+ indentStr(str, indent);
+ str.append("\"op\": \"");
+ switch (op) {
+ case ALWAYS_TRUE:
+ str.append("ALWAYS_TRUE");
+ break;
+ case GREATER_THAN:
+ str.append("GREATER_THAN");
+ break;
+ case LESS_THAN:
+ str.append("LESS_THAN");
+ break;
+ case EQUALS:
+ str.append("EQUALS");
+ break;
+ case AND_SUBRULES:
+ str.append("AND_SUBRULES");
+ break;
+ case OR_SUBRULES:
+ str.append("OR_SUBRULES");
+ break;
+ case CONTAINS_ANY:
+ str.append("CONTAINS_ANY");
+ break;
+ default:
+ str.appendFormat("%d", op);
+ break;
+ }
+ str.append("\"");
+
+ if (negate) {
+ str.append(",\n");
+ indentStr(str, indent);
+ str.append("\"negate\": true");
+ }
+
+ bool includeKey = true;
+ switch (op) {
+ case AND_SUBRULES:
+ case OR_SUBRULES:
+ includeKey = false;
+ break;
+ default:
+ break;
+ }
+
+ if (includeKey) {
+ str.append(",\n");
+ indentStr(str, indent);
+ str.append("\"property\": \"");
+ switch (key) {
+ case NONE:
+ str.append("NONE");
+ break;
+ case SDK_VERSION:
+ str.append("SDK_VERSION");
+ break;
+ case SCREEN_DENSITY:
+ str.append("SCREEN_DENSITY");
+ break;
+ case NATIVE_PLATFORM:
+ str.append("NATIVE_PLATFORM");
+ break;
+ case LANGUAGE:
+ str.append("LANGUAGE");
+ break;
+ default:
+ str.appendFormat("%d", key);
+ break;
+ }
+ str.append("\"");
+ }
+
+ if (op == AND_SUBRULES || op == OR_SUBRULES) {
+ str.append(",\n");
+ indentStr(str, indent);
+ str.append("\"subrules\": [\n");
+ const size_t subruleCount = subrules.size();
+ for (size_t i = 0; i < subruleCount; i++) {
+ str.append(subrules[i]->toJson(indent + 1));
+ if (i != subruleCount - 1) {
+ str.append(",");
+ }
+ str.append("\n");
+ }
+ indentStr(str, indent);
+ str.append("]");
+ } else {
+ switch (key) {
+ case SDK_VERSION:
+ case SCREEN_DENSITY: {
+ str.append(",\n");
+ indentStr(str, indent);
+ str.append("\"args\": [");
+ const size_t argCount = longArgs.size();
+ for (size_t i = 0; i < argCount; i++) {
+ if (i != 0) {
+ str.append(", ");
+ }
+ str.appendFormat("%d", longArgs[i]);
+ }
+ str.append("]");
+ break;
+ }
+ case LANGUAGE:
+ case NATIVE_PLATFORM: {
+ str.append(",\n");
+ indentStr(str, indent);
+ str.append("\"args\": [");
+ const size_t argCount = stringArgs.size();
+ for (size_t i = 0; i < argCount; i++) {
+ if (i != 0) {
+ str.append(", ");
+ }
+ str.append(stringArgs[i]);
+ }
+ str.append("]");
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ str.append("\n");
+ indent--;
+ indentStr(str, indent);
+ str.append("}");
+ return str;
+}
+
+sp<Rule> Rule::simplify(sp<Rule> rule) {
+ if (rule->op != AND_SUBRULES && rule->op != OR_SUBRULES) {
+ return rule;
+ }
+
+ Vector<sp<Rule> > newSubrules;
+ newSubrules.setCapacity(rule->subrules.size());
+ const size_t subruleCount = rule->subrules.size();
+ for (size_t i = 0; i < subruleCount; i++) {
+ sp<Rule> simplifiedRule = simplify(rule->subrules.editItemAt(i));
+ if (simplifiedRule != NULL) {
+ if (simplifiedRule->op == rule->op) {
+ newSubrules.appendVector(simplifiedRule->subrules);
+ } else {
+ newSubrules.add(simplifiedRule);
+ }
+ }
+ }
+
+ const size_t newSubruleCount = newSubrules.size();
+ if (newSubruleCount == 0) {
+ return NULL;
+ } else if (subruleCount == 1) {
+ return newSubrules.editTop();
+ }
+ rule->subrules = newSubrules;
+ return rule;
+}
+
+} // namespace split
diff --git a/tools/split-select/Rule.h b/tools/split-select/Rule.h
new file mode 100644
index 0000000..8029931
--- /dev/null
+++ b/tools/split-select/Rule.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#ifndef H_ANDROID_SPLIT_RULE
+#define H_ANDROID_SPLIT_RULE
+
+#include "SplitDescription.h"
+
+#include <utils/RefBase.h>
+#include <utils/StrongPointer.h>
+#include <utils/String8.h>
+#include <utils/Vector.h>
+
+namespace split {
+
+struct Rule : public virtual android::RefBase {
+ inline Rule();
+
+ enum Operator {
+ LESS_THAN = 1,
+ GREATER_THAN,
+ EQUALS,
+ CONTAINS_ANY,
+ CONTAINS_ALL,
+ IS_TRUE,
+ IS_FALSE,
+ AND_SUBRULES,
+ OR_SUBRULES,
+ ALWAYS_TRUE,
+ };
+
+ Operator op;
+
+ enum Key {
+ NONE = 0,
+ SDK_VERSION,
+ SCREEN_DENSITY,
+ LANGUAGE,
+ NATIVE_PLATFORM,
+ TOUCH_SCREEN,
+ SCREEN_SIZE,
+ SCREEN_LAYOUT,
+ };
+
+ Key key;
+ bool negate;
+
+ android::Vector<android::String8> stringArgs;
+ android::Vector<int> longArgs;
+ android::Vector<double> doubleArgs;
+ android::Vector<android::sp<Rule> > subrules;
+
+ android::String8 toJson(int indent=0) const;
+
+ static android::sp<Rule> simplify(android::sp<Rule> rule);
+};
+
+Rule::Rule()
+: op(ALWAYS_TRUE)
+, key(NONE)
+, negate(false) {}
+
+} // namespace split
+
+#endif // H_ANDROID_SPLIT_RULE
diff --git a/tools/split-select/RuleGenerator.cpp b/tools/split-select/RuleGenerator.cpp
new file mode 100644
index 0000000..669ae78
--- /dev/null
+++ b/tools/split-select/RuleGenerator.cpp
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#include "RuleGenerator.h"
+
+#include <algorithm>
+#include <cmath>
+#include <vector>
+#include <androidfw/ResourceTypes.h>
+
+using namespace android;
+
+namespace split {
+
+// Calculate the point at which the density selection changes between l and h.
+static inline int findMid(int l, int h) {
+ double root = sqrt((h*h) + (8*l*h));
+ return (double(-h) + root) / 2.0;
+}
+
+sp<Rule> RuleGenerator::generateDensity(const Vector<int>& allDensities, size_t index) {
+ sp<Rule> densityRule = new Rule();
+ densityRule->op = Rule::AND_SUBRULES;
+
+ const bool anyDensity = allDensities[index] == ResTable_config::DENSITY_ANY;
+ sp<Rule> any = new Rule();
+ any->op = Rule::EQUALS;
+ any->key = Rule::SCREEN_DENSITY;
+ any->longArgs.add((int)ResTable_config::DENSITY_ANY);
+ any->negate = !anyDensity;
+ densityRule->subrules.add(any);
+
+ if (!anyDensity) {
+ if (index > 0) {
+ sp<Rule> gt = new Rule();
+ gt->op = Rule::GREATER_THAN;
+ gt->key = Rule::SCREEN_DENSITY;
+ gt->longArgs.add(findMid(allDensities[index - 1], allDensities[index]) - 1);
+ densityRule->subrules.add(gt);
+ }
+
+ if (index + 1 < allDensities.size() && allDensities[index + 1] != ResTable_config::DENSITY_ANY) {
+ sp<Rule> lt = new Rule();
+ lt->op = Rule::LESS_THAN;
+ lt->key = Rule::SCREEN_DENSITY;
+ lt->longArgs.add(findMid(allDensities[index], allDensities[index + 1]));
+ densityRule->subrules.add(lt);
+ }
+ }
+ return densityRule;
+}
+
+sp<Rule> RuleGenerator::generateAbi(const Vector<abi::Variant>& splitAbis, size_t index) {
+ const abi::Variant thisAbi = splitAbis[index];
+ const std::vector<abi::Variant>& familyVariants = abi::getVariants(abi::getFamily(thisAbi));
+
+ std::vector<abi::Variant>::const_iterator start =
+ std::find(familyVariants.begin(), familyVariants.end(), thisAbi);
+
+ std::vector<abi::Variant>::const_iterator end = familyVariants.end();
+ if (index + 1 < splitAbis.size()) {
+ end = std::find(start, familyVariants.end(), splitAbis[index + 1]);
+ }
+
+ sp<Rule> abiRule = new Rule();
+ abiRule->op = Rule::CONTAINS_ANY;
+ abiRule->key = Rule::NATIVE_PLATFORM;
+ while (start != end) {
+ abiRule->stringArgs.add(String8(abi::toString(*start)));
+ ++start;
+ }
+ return abiRule;
+}
+
+sp<Rule> RuleGenerator::generate(const SortedVector<SplitDescription>& group, size_t index) {
+ sp<Rule> rootRule = new Rule();
+ rootRule->op = Rule::AND_SUBRULES;
+
+ if (group[index].config.locale != 0) {
+ sp<Rule> locale = new Rule();
+ locale->op = Rule::EQUALS;
+ locale->key = Rule::LANGUAGE;
+ char str[RESTABLE_MAX_LOCALE_LEN];
+ group[index].config.getBcp47Locale(str);
+ locale->stringArgs.add(String8(str));
+ rootRule->subrules.add(locale);
+ }
+
+ if (group[index].config.sdkVersion != 0) {
+ sp<Rule> sdk = new Rule();
+ sdk->op = Rule::GREATER_THAN;
+ sdk->key = Rule::SDK_VERSION;
+ sdk->longArgs.add(group[index].config.sdkVersion - 1);
+ rootRule->subrules.add(sdk);
+ }
+
+ if (group[index].config.density != 0) {
+ size_t densityIndex = 0;
+ Vector<int> allDensities;
+ allDensities.add(group[index].config.density);
+
+ const size_t groupSize = group.size();
+ for (size_t i = 0; i < groupSize; i++) {
+ if (group[i].config.density != group[index].config.density) {
+ // This group differs by density.
+ allDensities.clear();
+ for (size_t j = 0; j < groupSize; j++) {
+ allDensities.add(group[j].config.density);
+ }
+ densityIndex = index;
+ break;
+ }
+ }
+ rootRule->subrules.add(generateDensity(allDensities, densityIndex));
+ }
+
+ if (group[index].abi != abi::Variant::none) {
+ size_t abiIndex = 0;
+ Vector<abi::Variant> allVariants;
+ allVariants.add(group[index].abi);
+
+ const size_t groupSize = group.size();
+ for (size_t i = 0; i < groupSize; i++) {
+ if (group[i].abi != group[index].abi) {
+ // This group differs by ABI.
+ allVariants.clear();
+ for (size_t j = 0; j < groupSize; j++) {
+ allVariants.add(group[j].abi);
+ }
+ abiIndex = index;
+ break;
+ }
+ }
+ rootRule->subrules.add(generateAbi(allVariants, abiIndex));
+ }
+
+ return rootRule;
+}
+
+} // namespace split
diff --git a/tools/split-select/RuleGenerator.h b/tools/split-select/RuleGenerator.h
new file mode 100644
index 0000000..619acd9
--- /dev/null
+++ b/tools/split-select/RuleGenerator.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#ifndef H_ANDROID_SPLIT_RULE_GENERATOR
+#define H_ANDROID_SPLIT_RULE_GENERATOR
+
+#include "Abi.h"
+#include "Rule.h"
+#include "SplitDescription.h"
+
+#include <utils/SortedVector.h>
+#include <utils/Vector.h>
+
+namespace split {
+
+struct RuleGenerator {
+ // Generate rules for a Split given the group of mutually exclusive splits it belongs to
+ static android::sp<Rule> generate(const android::SortedVector<SplitDescription>& group, size_t index);
+
+ static android::sp<Rule> generateAbi(const android::Vector<abi::Variant>& allVariants, size_t index);
+ static android::sp<Rule> generateDensity(const android::Vector<int>& allDensities, size_t index);
+};
+
+} // namespace split
+
+#endif // H_ANDROID_SPLIT_RULE_GENERATOR
diff --git a/tools/split-select/RuleGenerator_test.cpp b/tools/split-select/RuleGenerator_test.cpp
new file mode 100644
index 0000000..60baabe
--- /dev/null
+++ b/tools/split-select/RuleGenerator_test.cpp
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#include "RuleGenerator.h"
+
+#include <algorithm>
+#include <gtest/gtest.h>
+#include <utils/String8.h>
+
+using namespace android;
+
+namespace split {
+
+static void expectDensityRule(const Vector<int>& densities, int density, int greaterThan, int lessThan);
+static void expectAbiRule(const Vector<abi::Variant>& abis, abi::Variant variant,
+ std::initializer_list<const char*> matches);
+
+TEST(RuleGeneratorTest, testAbiRules) {
+ Vector<abi::Variant> abis;
+ abis.add(abi::Variant::armeabi);
+ abis.add(abi::Variant::armeabi_v7a);
+ abis.add(abi::Variant::x86);
+ std::sort(abis.begin(), abis.end());
+
+ expectAbiRule(abis, abi::Variant::armeabi, {"armeabi"});
+ expectAbiRule(abis, abi::Variant::armeabi_v7a, {"armeabi-v7a", "arm64-v8a"});
+ expectAbiRule(abis, abi::Variant::x86, {"x86", "x86_64"});
+}
+
+TEST(RuleGeneratorTest, testDensityRules) {
+ Vector<int> densities;
+ densities.add(ConfigDescription::DENSITY_HIGH);
+ densities.add(ConfigDescription::DENSITY_XHIGH);
+ densities.add(ConfigDescription::DENSITY_XXHIGH);
+ densities.add(ConfigDescription::DENSITY_ANY);
+
+ ASSERT_LT(263, ConfigDescription::DENSITY_XHIGH);
+ ASSERT_GT(262, ConfigDescription::DENSITY_HIGH);
+ ASSERT_LT(363, ConfigDescription::DENSITY_XXHIGH);
+ ASSERT_GT(362, ConfigDescription::DENSITY_XHIGH);
+
+ expectDensityRule(densities, ConfigDescription::DENSITY_HIGH, 0, 263);
+ expectDensityRule(densities, ConfigDescription::DENSITY_XHIGH, 262, 363);
+ expectDensityRule(densities, ConfigDescription::DENSITY_XXHIGH, 362, 0);
+ expectDensityRule(densities, ConfigDescription::DENSITY_ANY, 0, 0);
+}
+
+//
+// Helper methods.
+//
+
+static void expectDensityRule(const Vector<int>& densities, int density, int greaterThan, int lessThan) {
+ const int* iter = std::find(densities.begin(), densities.end(), density);
+ if (densities.end() == iter) {
+ ADD_FAILURE() << density << "dpi was not in the density list.";
+ return;
+ }
+
+ sp<Rule> rule = RuleGenerator::generateDensity(densities, iter - densities.begin());
+ if (rule->op != Rule::AND_SUBRULES) {
+ ADD_FAILURE() << "Op in rule for " << density << "dpi is not Rule::AND_SUBRULES.";
+ return;
+ }
+
+ size_t index = 0;
+
+ bool isAnyDpi = density == ConfigDescription::DENSITY_ANY;
+
+ sp<Rule> anyDpiRule = rule->subrules[index++];
+ EXPECT_EQ(Rule::EQUALS, anyDpiRule->op)
+ << "for " << density << "dpi ANY DPI rule";
+ EXPECT_EQ(Rule::SCREEN_DENSITY, anyDpiRule->key)
+ << "for " << density << "dpi ANY DPI rule";
+ EXPECT_EQ(isAnyDpi == false, anyDpiRule->negate)
+ << "for " << density << "dpi ANY DPI rule";
+ if (anyDpiRule->longArgs.size() == 1) {
+ EXPECT_EQ(ConfigDescription::DENSITY_ANY, anyDpiRule->longArgs[0])
+ << "for " << density << "dpi ANY DPI rule";
+ } else {
+ EXPECT_EQ(1u, anyDpiRule->longArgs.size())
+ << "for " << density << "dpi ANY DPI rule";
+ }
+
+
+ if (greaterThan != 0) {
+ sp<Rule> greaterThanRule = rule->subrules[index++];
+ EXPECT_EQ(Rule::GREATER_THAN, greaterThanRule->op)
+ << "for " << density << "dpi GREATER_THAN rule";
+ EXPECT_EQ(Rule::SCREEN_DENSITY, greaterThanRule->key)
+ << "for " << density << "dpi GREATER_THAN rule";
+ if (greaterThanRule->longArgs.size() == 1) {
+ EXPECT_EQ(greaterThan, greaterThanRule->longArgs[0])
+ << "for " << density << "dpi GREATER_THAN rule";
+ } else {
+ EXPECT_EQ(1u, greaterThanRule->longArgs.size())
+ << "for " << density << "dpi GREATER_THAN rule";
+ }
+ }
+
+ if (lessThan != 0) {
+ sp<Rule> lessThanRule = rule->subrules[index++];
+ EXPECT_EQ(Rule::LESS_THAN, lessThanRule->op)
+ << "for " << density << "dpi LESS_THAN rule";
+ EXPECT_EQ(Rule::SCREEN_DENSITY, lessThanRule->key)
+ << "for " << density << "dpi LESS_THAN rule";
+ if (lessThanRule->longArgs.size() == 1) {
+ EXPECT_EQ(lessThan, lessThanRule->longArgs[0])
+ << "for " << density << "dpi LESS_THAN rule";
+ } else {
+ EXPECT_EQ(1u, lessThanRule->longArgs.size())
+ << "for " << density << "dpi LESS_THAN rule";
+ }
+ }
+}
+
+static void expectAbiRule(const Vector<abi::Variant>& abis, abi::Variant variant,
+ std::initializer_list<const char*> matches) {
+ const abi::Variant* iter = std::find(abis.begin(), abis.end(), variant);
+ if (abis.end() == iter) {
+ ADD_FAILURE() << abi::toString(variant) << " was not in the abi list.";
+ return;
+ }
+
+ sp<Rule> rule = RuleGenerator::generateAbi(abis, iter - abis.begin());
+
+ EXPECT_EQ(Rule::CONTAINS_ANY, rule->op)
+ << "for " << abi::toString(variant) << " rule";
+ EXPECT_EQ(Rule::NATIVE_PLATFORM, rule->key)
+ << " for " << abi::toString(variant) << " rule";
+ EXPECT_EQ(matches.size(), rule->stringArgs.size())
+ << " for " << abi::toString(variant) << " rule";
+
+ for (const char* match : matches) {
+ if (rule->stringArgs.end() ==
+ std::find(rule->stringArgs.begin(), rule->stringArgs.end(), String8(match))) {
+ ADD_FAILURE() << "Rule for abi " << abi::toString(variant)
+ << " does not contain match for expected abi " << match;
+ }
+ }
+}
+
+} // namespace split
diff --git a/tools/split-select/Rule_test.cpp b/tools/split-select/Rule_test.cpp
new file mode 100644
index 0000000..aca7433
--- /dev/null
+++ b/tools/split-select/Rule_test.cpp
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#include "Rule.h"
+
+#include "SplitDescription.h"
+
+#include <algorithm>
+#include <string>
+#include <gtest/gtest.h>
+#include <utils/String8.h>
+
+using namespace android;
+
+namespace split {
+
+TEST(RuleTest, generatesValidJson) {
+ sp<Rule> rule = new Rule();
+ rule->op = Rule::AND_SUBRULES;
+
+ sp<Rule> subrule = new Rule();
+ subrule->op = Rule::EQUALS;
+ subrule->key = Rule::SDK_VERSION;
+ subrule->longArgs.add(7);
+ rule->subrules.add(subrule);
+
+ subrule = new Rule();
+ subrule->op = Rule::OR_SUBRULES;
+ rule->subrules.add(subrule);
+
+ sp<Rule> subsubrule = new Rule();
+ subsubrule->op = Rule::GREATER_THAN;
+ subsubrule->key = Rule::SCREEN_DENSITY;
+ subsubrule->longArgs.add(10);
+ subrule->subrules.add(subsubrule);
+
+ subsubrule = new Rule();
+ subsubrule->op = Rule::LESS_THAN;
+ subsubrule->key = Rule::SCREEN_DENSITY;
+ subsubrule->longArgs.add(5);
+ subrule->subrules.add(subsubrule);
+
+ std::string expected(
+ "{"
+ " \"op\": \"AND_SUBRULES\","
+ " \"subrules\": ["
+ " {"
+ " \"op\": \"EQUALS\","
+ " \"property\": \"SDK_VERSION\","
+ " \"args\": [7]"
+ " },"
+ " {"
+ " \"op\": \"OR_SUBRULES\","
+ " \"subrules\": ["
+ " {"
+ " \"op\": \"GREATER_THAN\","
+ " \"property\": \"SCREEN_DENSITY\","
+ " \"args\": [10]"
+ " },"
+ " {"
+ " \"op\": \"LESS_THAN\","
+ " \"property\": \"SCREEN_DENSITY\","
+ " \"args\": [5]"
+ " }"
+ " ]"
+ " }"
+ " ]"
+ "}");
+ // Trim
+ expected.erase(std::remove_if(expected.begin(), expected.end(), ::isspace), expected.end());
+
+ std::string result(rule->toJson().string());
+
+ // Trim
+ result.erase(std::remove_if(result.begin(), result.end(), ::isspace), result.end());
+
+ ASSERT_EQ(expected, result);
+}
+
+TEST(RuleTest, simplifiesSingleSubruleRules) {
+ sp<Rule> rule = new Rule();
+ rule->op = Rule::AND_SUBRULES;
+
+ sp<Rule> subrule = new Rule();
+ subrule->op = Rule::EQUALS;
+ subrule->key = Rule::SDK_VERSION;
+ subrule->longArgs.add(7);
+ rule->subrules.add(subrule);
+
+ sp<Rule> simplified = Rule::simplify(rule);
+ EXPECT_EQ(Rule::EQUALS, simplified->op);
+ EXPECT_EQ(Rule::SDK_VERSION, simplified->key);
+ ASSERT_EQ(1u, simplified->longArgs.size());
+ EXPECT_EQ(7, simplified->longArgs[0]);
+}
+
+TEST(RuleTest, simplifiesNestedSameOpSubrules) {
+ sp<Rule> rule = new Rule();
+ rule->op = Rule::AND_SUBRULES;
+
+ sp<Rule> subrule = new Rule();
+ subrule->op = Rule::AND_SUBRULES;
+ rule->subrules.add(subrule);
+
+ sp<Rule> subsubrule = new Rule();
+ subsubrule->op = Rule::EQUALS;
+ subsubrule->key = Rule::SDK_VERSION;
+ subsubrule->longArgs.add(7);
+ subrule->subrules.add(subsubrule);
+
+ subrule = new Rule();
+ subrule->op = Rule::EQUALS;
+ subrule->key = Rule::SDK_VERSION;
+ subrule->longArgs.add(8);
+ rule->subrules.add(subrule);
+
+ sp<Rule> simplified = Rule::simplify(rule);
+ EXPECT_EQ(Rule::AND_SUBRULES, simplified->op);
+ ASSERT_EQ(2u, simplified->subrules.size());
+
+ sp<Rule> simplifiedSubrule = simplified->subrules[0];
+ EXPECT_EQ(Rule::EQUALS, simplifiedSubrule->op);
+ EXPECT_EQ(Rule::SDK_VERSION, simplifiedSubrule->key);
+ ASSERT_EQ(1u, simplifiedSubrule->longArgs.size());
+ EXPECT_EQ(7, simplifiedSubrule->longArgs[0]);
+
+ simplifiedSubrule = simplified->subrules[1];
+ EXPECT_EQ(Rule::EQUALS, simplifiedSubrule->op);
+ EXPECT_EQ(Rule::SDK_VERSION, simplifiedSubrule->key);
+ ASSERT_EQ(1u, simplifiedSubrule->longArgs.size());
+ EXPECT_EQ(8, simplifiedSubrule->longArgs[0]);
+}
+
+} // namespace split
diff --git a/tools/split-select/SplitDescription.cpp b/tools/split-select/SplitDescription.cpp
new file mode 100644
index 0000000..8037ef0
--- /dev/null
+++ b/tools/split-select/SplitDescription.cpp
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#include "SplitDescription.h"
+
+#include "aapt/AaptConfig.h"
+#include "aapt/AaptUtil.h"
+
+#include <utils/String8.h>
+#include <utils/Vector.h>
+
+using namespace android;
+
+namespace split {
+
+SplitDescription::SplitDescription()
+: abi(abi::Variant::none) {
+}
+
+int SplitDescription::compare(const SplitDescription& rhs) const {
+ int cmp;
+ cmp = (int)abi - (int)rhs.abi;
+ if (cmp != 0) return cmp;
+ return config.compareLogical(rhs.config);
+}
+
+bool SplitDescription::isBetterThan(const SplitDescription& o, const SplitDescription& target) const {
+ if (abi != abi::Variant::none || o.abi != abi::Variant::none) {
+ abi::Family family = abi::getFamily(abi);
+ abi::Family oFamily = abi::getFamily(o.abi);
+ if (family != oFamily) {
+ return family != abi::Family::none;
+ }
+
+ if (int(target.abi) - int(abi) < int(target.abi) - int(o.abi)) {
+ return true;
+ }
+ }
+ return config.isBetterThan(o.config, &target.config);
+}
+
+bool SplitDescription::match(const SplitDescription& o) const {
+ if (abi != abi::Variant::none) {
+ abi::Family family = abi::getFamily(abi);
+ abi::Family oFamily = abi::getFamily(o.abi);
+ if (family != oFamily) {
+ return false;
+ }
+
+ if (int(abi) > int(o.abi)) {
+ return false;
+ }
+ }
+ return config.match(o.config);
+}
+
+String8 SplitDescription::toString() const {
+ String8 extension;
+ if (abi != abi::Variant::none) {
+ if (extension.isEmpty()) {
+ extension.append(":");
+ } else {
+ extension.append("-");
+ }
+ extension.append(abi::toString(abi));
+ }
+ String8 str(config.toString());
+ str.append(extension);
+ return str;
+}
+
+ssize_t parseAbi(const Vector<String8>& parts, const ssize_t index,
+ SplitDescription* outSplit) {
+ const ssize_t N = parts.size();
+ abi::Variant abi = abi::Variant::none;
+ ssize_t endIndex = index;
+ if (parts[endIndex] == "arm64") {
+ endIndex++;
+ if (endIndex < N) {
+ if (parts[endIndex] == "v8a") {
+ endIndex++;
+ abi = abi::Variant::arm64_v8a;
+ }
+ }
+ } else if (parts[endIndex] == "armeabi") {
+ endIndex++;
+ abi = abi::Variant::armeabi;
+ if (endIndex < N) {
+ if (parts[endIndex] == "v7a") {
+ endIndex++;
+ abi = abi::Variant::armeabi_v7a;
+ }
+ }
+ } else if (parts[endIndex] == "x86") {
+ endIndex++;
+ abi = abi::Variant::x86;
+ } else if (parts[endIndex] == "x86_64") {
+ endIndex++;
+ abi = abi::Variant::x86_64;
+ } else if (parts[endIndex] == "mips") {
+ endIndex++;
+ abi = abi::Variant::mips;
+ } else if (parts[endIndex] == "mips64") {
+ endIndex++;
+ abi = abi::Variant::mips64;
+ }
+
+ if (abi == abi::Variant::none && endIndex != index) {
+ return -1;
+ }
+
+ if (outSplit != NULL) {
+ outSplit->abi = abi;
+ }
+ return endIndex;
+}
+
+bool SplitDescription::parse(const String8& str, SplitDescription* outSplit) {
+ ssize_t index = str.find(":");
+
+ String8 configStr;
+ String8 extensionStr;
+ if (index >= 0) {
+ configStr.setTo(str.string(), index);
+ extensionStr.setTo(str.string() + index + 1);
+ } else {
+ configStr.setTo(str);
+ }
+
+ SplitDescription split;
+ if (!AaptConfig::parse(configStr, &split.config)) {
+ return false;
+ }
+
+ Vector<String8> parts = AaptUtil::splitAndLowerCase(extensionStr, '-');
+ const ssize_t N = parts.size();
+ index = 0;
+
+ if (extensionStr.length() == 0) {
+ goto success;
+ }
+
+ index = parseAbi(parts, index, &split);
+ if (index < 0) {
+ return false;
+ } else {
+ if (index == N) {
+ goto success;
+ }
+ }
+
+ // Unrecognized
+ return false;
+
+success:
+ if (outSplit != NULL) {
+ *outSplit = split;
+ }
+ return true;
+}
+
+} // namespace split
diff --git a/tools/split-select/SplitDescription.h b/tools/split-select/SplitDescription.h
new file mode 100644
index 0000000..5fcafc8
--- /dev/null
+++ b/tools/split-select/SplitDescription.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#ifndef H_ANDROID_SPLIT_SPLIT_DESCRIPTION
+#define H_ANDROID_SPLIT_SPLIT_DESCRIPTION
+
+#include "aapt/ConfigDescription.h"
+#include "Abi.h"
+
+#include <utils/String8.h>
+#include <utils/Vector.h>
+
+namespace split {
+
+struct SplitDescription {
+ SplitDescription();
+ SplitDescription(const SplitDescription&) = default;
+
+ ConfigDescription config;
+ abi::Variant abi;
+
+ int compare(const SplitDescription& rhs) const;
+ inline bool operator<(const SplitDescription& rhs) const;
+ inline bool operator==(const SplitDescription& rhs) const;
+ inline bool operator!=(const SplitDescription& rhs) const;
+
+ bool match(const SplitDescription& o) const;
+ bool isBetterThan(const SplitDescription& o, const SplitDescription& target) const;
+
+ android::String8 toString() const;
+
+ static bool parse(const android::String8& str, SplitDescription* outSplit);
+};
+
+ssize_t parseAbi(const android::Vector<android::String8>& parts, const ssize_t index,
+ SplitDescription* outSplit);
+
+bool SplitDescription::operator<(const SplitDescription& rhs) const {
+ return compare(rhs) < 0;
+}
+
+bool SplitDescription::operator==(const SplitDescription& rhs) const {
+ return compare(rhs) == 0;
+}
+
+bool SplitDescription::operator!=(const SplitDescription& rhs) const {
+ return compare(rhs) != 0;
+}
+
+} // namespace split
+
+#endif // H_ANDROID_SPLIT_SPLIT_DESCRIPTION