diff options
133 files changed, 2370 insertions, 775 deletions
diff --git a/api/current.txt b/api/current.txt index e146dd1..95d8f1e 100644 --- a/api/current.txt +++ b/api/current.txt @@ -23,7 +23,6 @@ package android { field public static final java.lang.String BIND_CARRIER_CONFIG_SERVICE = "android.permission.BIND_CARRIER_CONFIG_SERVICE"; field public static final java.lang.String BIND_CARRIER_MESSAGING_SERVICE = "android.permission.BIND_CARRIER_MESSAGING_SERVICE"; field public static final java.lang.String BIND_CHOOSER_TARGET_SERVICE = "android.permission.BIND_CHOOSER_TARGET_SERVICE"; - field public static final java.lang.String BIND_CONNECTION_SERVICE = "android.permission.BIND_CONNECTION_SERVICE"; field public static final java.lang.String BIND_DEVICE_ADMIN = "android.permission.BIND_DEVICE_ADMIN"; field public static final java.lang.String BIND_DREAM_SERVICE = "android.permission.BIND_DREAM_SERVICE"; field public static final java.lang.String BIND_INCALL_SERVICE = "android.permission.BIND_INCALL_SERVICE"; @@ -32,6 +31,7 @@ package android { field public static final java.lang.String BIND_NOTIFICATION_LISTENER_SERVICE = "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"; field public static final java.lang.String BIND_PRINT_SERVICE = "android.permission.BIND_PRINT_SERVICE"; field public static final java.lang.String BIND_REMOTEVIEWS = "android.permission.BIND_REMOTEVIEWS"; + field public static final java.lang.String BIND_TELECOM_CONNECTION_SERVICE = "android.permission.BIND_TELECOM_CONNECTION_SERVICE"; field public static final java.lang.String BIND_TEXT_SERVICE = "android.permission.BIND_TEXT_SERVICE"; field public static final java.lang.String BIND_TV_INPUT = "android.permission.BIND_TV_INPUT"; field public static final java.lang.String BIND_VOICE_INTERACTION = "android.permission.BIND_VOICE_INTERACTION"; @@ -4781,6 +4781,8 @@ package android.app { method public android.app.Notification clone(); method public int describeContents(); method public java.lang.String getGroup(); + method public android.graphics.drawable.Icon getLargeIcon(); + method public android.graphics.drawable.Icon getSmallIcon(); method public java.lang.String getSortKey(); method public deprecated void setLatestEventInfo(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent); method public void writeToParcel(android.os.Parcel, int); @@ -4925,6 +4927,7 @@ package android.app { ctor public Notification.BigPictureStyle(); ctor public Notification.BigPictureStyle(android.app.Notification.Builder); method public android.app.Notification.BigPictureStyle bigLargeIcon(android.graphics.Bitmap); + method public android.app.Notification.BigPictureStyle bigLargeIcon(android.graphics.drawable.Icon); method public android.app.Notification.BigPictureStyle bigPicture(android.graphics.Bitmap); method public android.app.Notification.BigPictureStyle setBigContentTitle(java.lang.CharSequence); method public android.app.Notification.BigPictureStyle setSummaryText(java.lang.CharSequence); @@ -4963,6 +4966,7 @@ package android.app { method public android.app.Notification.Builder setGroup(java.lang.String); method public android.app.Notification.Builder setGroupSummary(boolean); method public android.app.Notification.Builder setLargeIcon(android.graphics.Bitmap); + method public android.app.Notification.Builder setLargeIcon(android.graphics.drawable.Icon); method public android.app.Notification.Builder setLights(int, int, int); method public android.app.Notification.Builder setLocalOnly(boolean); method public android.app.Notification.Builder setNumber(int); @@ -4974,6 +4978,7 @@ package android.app { method public android.app.Notification.Builder setShowWhen(boolean); method public android.app.Notification.Builder setSmallIcon(int); method public android.app.Notification.Builder setSmallIcon(int, int); + method public android.app.Notification.Builder setSmallIcon(android.graphics.drawable.Icon); method public android.app.Notification.Builder setSortKey(java.lang.String); method public android.app.Notification.Builder setSound(android.net.Uri); method public deprecated android.app.Notification.Builder setSound(android.net.Uri, int); @@ -14694,6 +14699,7 @@ package android.media { public final class AudioDeviceInfo { method public int[] getChannelCounts(); + method public int[] getChannelIndexMasks(); method public int[] getChannelMasks(); method public int[] getFormats(); method public int getId(); @@ -29940,23 +29946,6 @@ package android.system { package android.telecom { - public final class AudioState implements android.os.Parcelable { - ctor public AudioState(boolean, int, int); - ctor public AudioState(android.telecom.AudioState); - method public static java.lang.String audioRouteToString(int); - method public int describeContents(); - method public int getRoute(); - method public int getSupportedRouteMask(); - method public boolean isMuted(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.telecom.AudioState> CREATOR; - field public static final int ROUTE_BLUETOOTH = 2; // 0x2 - field public static final int ROUTE_EARPIECE = 1; // 0x1 - field public static final int ROUTE_SPEAKER = 8; // 0x8 - field public static final int ROUTE_WIRED_HEADSET = 4; // 0x4 - field public static final int ROUTE_WIRED_OR_EARPIECE = 5; // 0x5 - } - public final class Call { method public void answer(int); method public void conference(android.telecom.Call); @@ -30050,11 +30039,27 @@ package android.telecom { field public static final int PROPERTY_WIFI = 8; // 0x8 } + public final class CallAudioState implements android.os.Parcelable { + ctor public CallAudioState(boolean, int, int); + method public static java.lang.String audioRouteToString(int); + method public int describeContents(); + method public int getRoute(); + method public int getSupportedRouteMask(); + method public boolean isMuted(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.telecom.CallAudioState> CREATOR; + field public static final int ROUTE_BLUETOOTH = 2; // 0x2 + field public static final int ROUTE_EARPIECE = 1; // 0x1 + field public static final int ROUTE_SPEAKER = 8; // 0x8 + field public static final int ROUTE_WIRED_HEADSET = 4; // 0x4 + field public static final int ROUTE_WIRED_OR_EARPIECE = 5; // 0x5 + } + public abstract class Conference implements android.telecom.Conferenceable { ctor public Conference(android.telecom.PhoneAccountHandle); method public final boolean addConnection(android.telecom.Connection); method public final void destroy(); - method public final android.telecom.AudioState getAudioState(); + method public final android.telecom.CallAudioState getCallAudioState(); method public final java.util.List<android.telecom.Connection> getConferenceableConnections(); method public final int getConnectionCapabilities(); method public final long getConnectionTime(); @@ -30065,7 +30070,7 @@ package android.telecom { method public final android.telecom.StatusHints getStatusHints(); method public android.telecom.Connection.VideoProvider getVideoProvider(); method public int getVideoState(); - method public void onAudioStateChanged(android.telecom.AudioState); + method public void onCallAudioStateChanged(android.telecom.CallAudioState); method public void onConnectionAdded(android.telecom.Connection); method public void onDisconnect(); method public void onHold(); @@ -30101,7 +30106,7 @@ package android.telecom { method public final android.net.Uri getAddress(); method public final int getAddressPresentation(); method public final boolean getAudioModeIsVoip(); - method public final android.telecom.AudioState getAudioState(); + method public final android.telecom.CallAudioState getCallAudioState(); method public final java.lang.String getCallerDisplayName(); method public final int getCallerDisplayNamePresentation(); method public final android.telecom.Conference getConference(); @@ -30115,7 +30120,7 @@ package android.telecom { method public void onAbort(); method public void onAnswer(int); method public void onAnswer(); - method public void onAudioStateChanged(android.telecom.AudioState); + method public void onCallAudioStateChanged(android.telecom.CallAudioState); method public void onDisconnect(); method public void onHold(); method public void onPlayDtmfTone(char); @@ -30273,12 +30278,12 @@ package android.telecom { public abstract class InCallService extends android.app.Service { ctor public InCallService(); method public final boolean canAddCall(); - method public final android.telecom.AudioState getAudioState(); + method public final android.telecom.CallAudioState getCallAudioState(); method public final java.util.List<android.telecom.Call> getCalls(); - method public void onAudioStateChanged(android.telecom.AudioState); method public android.os.IBinder onBind(android.content.Intent); method public void onBringToForeground(boolean); method public void onCallAdded(android.telecom.Call); + method public void onCallAudioStateChanged(android.telecom.CallAudioState); method public void onCallRemoved(android.telecom.Call); method public void onCanAddCallChanged(boolean); method public final void setAudioRoute(int); @@ -30316,16 +30321,12 @@ package android.telecom { public final class PhoneAccount implements android.os.Parcelable { method public static android.telecom.PhoneAccount.Builder builder(android.telecom.PhoneAccountHandle, java.lang.CharSequence); - method public android.graphics.drawable.Drawable createIconDrawable(android.content.Context); method public int describeContents(); method public android.telecom.PhoneAccountHandle getAccountHandle(); method public android.net.Uri getAddress(); method public int getCapabilities(); method public int getHighlightColor(); - method public android.graphics.Bitmap getIconBitmap(); - method public java.lang.String getIconPackageName(); - method public int getIconResId(); - method public int getIconTint(); + method public android.graphics.drawable.Icon getIcon(); method public java.lang.CharSequence getLabel(); method public java.lang.CharSequence getShortDescription(); method public android.net.Uri getSubscriptionAddress(); @@ -30341,7 +30342,6 @@ package android.telecom { field public static final int CAPABILITY_VIDEO_CALLING = 8; // 0x8 field public static final android.os.Parcelable.Creator<android.telecom.PhoneAccount> CREATOR; field public static final int NO_HIGHLIGHT_COLOR = 0; // 0x0 - field public static final int NO_ICON_TINT = 0; // 0x0 field public static final int NO_RESOURCE_ID = -1; // 0xffffffff field public static final java.lang.String SCHEME_SIP = "sip"; field public static final java.lang.String SCHEME_TEL = "tel"; @@ -30356,11 +30356,7 @@ package android.telecom { method public android.telecom.PhoneAccount.Builder setAddress(android.net.Uri); method public android.telecom.PhoneAccount.Builder setCapabilities(int); method public android.telecom.PhoneAccount.Builder setHighlightColor(int); - method public android.telecom.PhoneAccount.Builder setIcon(android.content.Context, int); - method public android.telecom.PhoneAccount.Builder setIcon(java.lang.String, int); - method public android.telecom.PhoneAccount.Builder setIcon(android.content.Context, int, int); - method public android.telecom.PhoneAccount.Builder setIcon(java.lang.String, int, int); - method public android.telecom.PhoneAccount.Builder setIcon(android.graphics.Bitmap); + method public android.telecom.PhoneAccount.Builder setIcon(android.graphics.drawable.Icon); method public android.telecom.PhoneAccount.Builder setShortDescription(java.lang.CharSequence); method public android.telecom.PhoneAccount.Builder setSubscriptionAddress(android.net.Uri); method public android.telecom.PhoneAccount.Builder setSupportedUriSchemes(java.util.List<java.lang.String>); @@ -30390,7 +30386,7 @@ package android.telecom { method public final void registerCallback(android.telecom.RemoteConference.Callback); method public final void registerCallback(android.telecom.RemoteConference.Callback, android.os.Handler); method public void separate(android.telecom.RemoteConnection); - method public void setAudioState(android.telecom.AudioState); + method public void setCallAudioState(android.telecom.CallAudioState); method public void stopDtmfTone(); method public void swap(); method public void unhold(); @@ -30430,7 +30426,7 @@ package android.telecom { method public void registerCallback(android.telecom.RemoteConnection.Callback); method public void registerCallback(android.telecom.RemoteConnection.Callback, android.os.Handler); method public void reject(); - method public void setAudioState(android.telecom.AudioState); + method public void setCallAudioState(android.telecom.CallAudioState); method public void stopDtmfTone(); method public void unhold(); method public void unregisterCallback(android.telecom.RemoteConnection.Callback); @@ -38812,8 +38808,7 @@ package android.webkit { } public abstract class WebResourceError { - ctor public WebResourceError(); - method public abstract java.lang.String getDescription(); + method public abstract java.lang.CharSequence getDescription(); method public abstract int getErrorCode(); } @@ -38843,12 +38838,6 @@ package android.webkit { public abstract class WebResourceResponseBase { ctor public WebResourceResponseBase(); - method public abstract java.io.InputStream getData(); - method public abstract java.lang.String getEncoding(); - method public abstract java.lang.String getMimeType(); - method public abstract java.lang.String getReasonPhrase(); - method public abstract java.util.Map<java.lang.String, java.lang.String> getResponseHeaders(); - method public abstract int getStatusCode(); } public abstract class WebSettings { @@ -39180,6 +39169,7 @@ package android.webkit { method public void onReceivedError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceError); method public void onReceivedHttpAuthRequest(android.webkit.WebView, android.webkit.HttpAuthHandler, java.lang.String, java.lang.String); method public void onReceivedHttpError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceResponseBase); + method public void onReceivedHttpError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceResponse); method public void onReceivedLoginRequest(android.webkit.WebView, java.lang.String, java.lang.String, java.lang.String); method public void onReceivedSslError(android.webkit.WebView, android.webkit.SslErrorHandler, android.net.http.SslError); method public void onScaleChanged(android.webkit.WebView, float, float); @@ -40282,6 +40272,7 @@ package android.widget { method public void setImageAlpha(int); method public void setImageBitmap(android.graphics.Bitmap); method public void setImageDrawable(android.graphics.drawable.Drawable); + method public void setImageIcon(android.graphics.drawable.Icon); method public void setImageLevel(int); method public void setImageMatrix(android.graphics.Matrix); method public void setImageResource(int); @@ -40862,7 +40853,9 @@ package android.widget { method public void setDouble(int, java.lang.String, double); method public void setEmptyView(int, int); method public void setFloat(int, java.lang.String, float); + method public void setIcon(int, java.lang.String, android.graphics.drawable.Icon); method public void setImageViewBitmap(int, android.graphics.Bitmap); + method public void setImageViewIcon(int, android.graphics.drawable.Icon); method public void setImageViewResource(int, int); method public void setImageViewUri(int, android.net.Uri); method public void setInt(int, java.lang.String, int); diff --git a/api/system-current.txt b/api/system-current.txt index f6843ea..5d11b25 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -32,7 +32,7 @@ package android { field public static final java.lang.String BIND_CARRIER_MESSAGING_SERVICE = "android.permission.BIND_CARRIER_MESSAGING_SERVICE"; field public static final java.lang.String BIND_CHOOSER_TARGET_SERVICE = "android.permission.BIND_CHOOSER_TARGET_SERVICE"; field public static final java.lang.String BIND_CONDITION_PROVIDER_SERVICE = "android.permission.BIND_CONDITION_PROVIDER_SERVICE"; - field public static final java.lang.String BIND_CONNECTION_SERVICE = "android.permission.BIND_CONNECTION_SERVICE"; + field public static final deprecated java.lang.String BIND_CONNECTION_SERVICE = "android.permission.BIND_CONNECTION_SERVICE"; field public static final java.lang.String BIND_DEVICE_ADMIN = "android.permission.BIND_DEVICE_ADMIN"; field public static final java.lang.String BIND_DIRECTORY_SEARCH = "android.permission.BIND_DIRECTORY_SEARCH"; field public static final java.lang.String BIND_DREAM_SERVICE = "android.permission.BIND_DREAM_SERVICE"; @@ -43,6 +43,7 @@ package android { field public static final java.lang.String BIND_NOTIFICATION_LISTENER_SERVICE = "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"; field public static final java.lang.String BIND_PRINT_SERVICE = "android.permission.BIND_PRINT_SERVICE"; field public static final java.lang.String BIND_REMOTEVIEWS = "android.permission.BIND_REMOTEVIEWS"; + field public static final java.lang.String BIND_TELECOM_CONNECTION_SERVICE = "android.permission.BIND_TELECOM_CONNECTION_SERVICE"; field public static final java.lang.String BIND_TEXT_SERVICE = "android.permission.BIND_TEXT_SERVICE"; field public static final java.lang.String BIND_TRUST_AGENT = "android.permission.BIND_TRUST_AGENT"; field public static final java.lang.String BIND_TV_INPUT = "android.permission.BIND_TV_INPUT"; @@ -4874,6 +4875,8 @@ package android.app { method public android.app.Notification clone(); method public int describeContents(); method public java.lang.String getGroup(); + method public android.graphics.drawable.Icon getLargeIcon(); + method public android.graphics.drawable.Icon getSmallIcon(); method public java.lang.String getSortKey(); method public deprecated void setLatestEventInfo(android.content.Context, java.lang.CharSequence, java.lang.CharSequence, android.app.PendingIntent); method public void writeToParcel(android.os.Parcel, int); @@ -5018,6 +5021,7 @@ package android.app { ctor public Notification.BigPictureStyle(); ctor public Notification.BigPictureStyle(android.app.Notification.Builder); method public android.app.Notification.BigPictureStyle bigLargeIcon(android.graphics.Bitmap); + method public android.app.Notification.BigPictureStyle bigLargeIcon(android.graphics.drawable.Icon); method public android.app.Notification.BigPictureStyle bigPicture(android.graphics.Bitmap); method public android.app.Notification.BigPictureStyle setBigContentTitle(java.lang.CharSequence); method public android.app.Notification.BigPictureStyle setSummaryText(java.lang.CharSequence); @@ -5056,6 +5060,7 @@ package android.app { method public android.app.Notification.Builder setGroup(java.lang.String); method public android.app.Notification.Builder setGroupSummary(boolean); method public android.app.Notification.Builder setLargeIcon(android.graphics.Bitmap); + method public android.app.Notification.Builder setLargeIcon(android.graphics.drawable.Icon); method public android.app.Notification.Builder setLights(int, int, int); method public android.app.Notification.Builder setLocalOnly(boolean); method public android.app.Notification.Builder setNumber(int); @@ -5067,6 +5072,7 @@ package android.app { method public android.app.Notification.Builder setShowWhen(boolean); method public android.app.Notification.Builder setSmallIcon(int); method public android.app.Notification.Builder setSmallIcon(int, int); + method public android.app.Notification.Builder setSmallIcon(android.graphics.drawable.Icon); method public android.app.Notification.Builder setSortKey(java.lang.String); method public android.app.Notification.Builder setSound(android.net.Uri); method public deprecated android.app.Notification.Builder setSound(android.net.Uri, int); @@ -9671,6 +9677,7 @@ package android.content.pm { field public static final int INSTALL_FAILED_NO_SHARED_USER = -6; // 0xfffffffa field public static final int INSTALL_FAILED_OLDER_SDK = -12; // 0xfffffff4 field public static final int INSTALL_FAILED_PACKAGE_CHANGED = -23; // 0xffffffe9 + field public static final int INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE = -26; // 0xffffffe6 field public static final int INSTALL_FAILED_REPLACE_COULDNT_DELETE = -10; // 0xfffffff6 field public static final int INSTALL_FAILED_SHARED_USER_INCOMPATIBLE = -8; // 0xfffffff8 field public static final int INSTALL_FAILED_TEST_ONLY = -15; // 0xfffffff1 @@ -15905,6 +15912,7 @@ package android.media { public final class AudioDeviceInfo { method public int[] getChannelCounts(); + method public int[] getChannelIndexMasks(); method public int[] getChannelMasks(); method public int[] getFormats(); method public int getId(); @@ -32066,9 +32074,10 @@ package android.system { package android.telecom { - public final class AudioState implements android.os.Parcelable { + public deprecated class AudioState implements android.os.Parcelable { ctor public AudioState(boolean, int, int); ctor public AudioState(android.telecom.AudioState); + ctor public AudioState(android.telecom.CallAudioState); method public static java.lang.String audioRouteToString(int); method public int describeContents(); method public int getRoute(); @@ -32183,11 +32192,28 @@ package android.telecom { ctor public Call.Listener(); } + public final class CallAudioState implements android.os.Parcelable { + ctor public CallAudioState(boolean, int, int); + method public static java.lang.String audioRouteToString(int); + method public int describeContents(); + method public int getRoute(); + method public int getSupportedRouteMask(); + method public boolean isMuted(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.telecom.CallAudioState> CREATOR; + field public static final int ROUTE_BLUETOOTH = 2; // 0x2 + field public static final int ROUTE_EARPIECE = 1; // 0x1 + field public static final int ROUTE_SPEAKER = 8; // 0x8 + field public static final int ROUTE_WIRED_HEADSET = 4; // 0x4 + field public static final int ROUTE_WIRED_OR_EARPIECE = 5; // 0x5 + } + public abstract class Conference implements android.telecom.Conferenceable { ctor public Conference(android.telecom.PhoneAccountHandle); method public final boolean addConnection(android.telecom.Connection); method public final void destroy(); - method public final android.telecom.AudioState getAudioState(); + method public final deprecated android.telecom.AudioState getAudioState(); + method public final android.telecom.CallAudioState getCallAudioState(); method public final java.util.List<android.telecom.Connection> getConferenceableConnections(); method public final deprecated long getConnectTimeMillis(); method public final int getConnectionCapabilities(); @@ -32200,7 +32226,8 @@ package android.telecom { method public final android.telecom.StatusHints getStatusHints(); method public android.telecom.Connection.VideoProvider getVideoProvider(); method public int getVideoState(); - method public void onAudioStateChanged(android.telecom.AudioState); + method public deprecated void onAudioStateChanged(android.telecom.AudioState); + method public void onCallAudioStateChanged(android.telecom.CallAudioState); method public void onConnectionAdded(android.telecom.Connection); method public void onDisconnect(); method public void onHold(); @@ -32237,7 +32264,8 @@ package android.telecom { method public final android.net.Uri getAddress(); method public final int getAddressPresentation(); method public final boolean getAudioModeIsVoip(); - method public final android.telecom.AudioState getAudioState(); + method public final deprecated android.telecom.AudioState getAudioState(); + method public final android.telecom.CallAudioState getCallAudioState(); method public final java.lang.String getCallerDisplayName(); method public final int getCallerDisplayNamePresentation(); method public final android.telecom.Conference getConference(); @@ -32251,7 +32279,8 @@ package android.telecom { method public void onAbort(); method public void onAnswer(int); method public void onAnswer(); - method public void onAudioStateChanged(android.telecom.AudioState); + method public deprecated void onAudioStateChanged(android.telecom.AudioState); + method public void onCallAudioStateChanged(android.telecom.CallAudioState); method public void onDisconnect(); method public void onHold(); method public void onPlayDtmfTone(char); @@ -32409,13 +32438,13 @@ package android.telecom { public abstract class InCallService extends android.app.Service { ctor public InCallService(); method public final boolean canAddCall(); - method public final android.telecom.AudioState getAudioState(); + method public final android.telecom.CallAudioState getCallAudioState(); method public final java.util.List<android.telecom.Call> getCalls(); method public deprecated android.telecom.Phone getPhone(); - method public void onAudioStateChanged(android.telecom.AudioState); method public android.os.IBinder onBind(android.content.Intent); method public void onBringToForeground(boolean); method public void onCallAdded(android.telecom.Call); + method public void onCallAudioStateChanged(android.telecom.CallAudioState); method public void onCallRemoved(android.telecom.Call); method public void onCanAddCallChanged(boolean); method public deprecated void onPhoneCreated(android.telecom.Phone); @@ -32456,7 +32485,8 @@ package android.telecom { public final deprecated class Phone { method public final void addListener(android.telecom.Phone.Listener); method public final boolean canAddCall(); - method public final android.telecom.AudioState getAudioState(); + method public final deprecated android.telecom.AudioState getAudioState(); + method public final android.telecom.CallAudioState getCallAudioState(); method public final java.util.List<android.telecom.Call> getCalls(); method public final void removeListener(android.telecom.Phone.Listener); method public final void setAudioRoute(int); @@ -32465,25 +32495,22 @@ package android.telecom { public static abstract class Phone.Listener { ctor public Phone.Listener(); - method public void onAudioStateChanged(android.telecom.Phone, android.telecom.AudioState); + method public deprecated void onAudioStateChanged(android.telecom.Phone, android.telecom.AudioState); method public void onBringToForeground(android.telecom.Phone, boolean); method public void onCallAdded(android.telecom.Phone, android.telecom.Call); + method public void onCallAudioStateChanged(android.telecom.Phone, android.telecom.CallAudioState); method public void onCallRemoved(android.telecom.Phone, android.telecom.Call); method public void onCanAddCallChanged(android.telecom.Phone, boolean); } public final class PhoneAccount implements android.os.Parcelable { method public static android.telecom.PhoneAccount.Builder builder(android.telecom.PhoneAccountHandle, java.lang.CharSequence); - method public android.graphics.drawable.Drawable createIconDrawable(android.content.Context); method public int describeContents(); method public android.telecom.PhoneAccountHandle getAccountHandle(); method public android.net.Uri getAddress(); method public int getCapabilities(); method public int getHighlightColor(); - method public android.graphics.Bitmap getIconBitmap(); - method public java.lang.String getIconPackageName(); - method public int getIconResId(); - method public int getIconTint(); + method public android.graphics.drawable.Icon getIcon(); method public java.lang.CharSequence getLabel(); method public java.lang.CharSequence getShortDescription(); method public android.net.Uri getSubscriptionAddress(); @@ -32500,7 +32527,6 @@ package android.telecom { field public static final int CAPABILITY_VIDEO_CALLING = 8; // 0x8 field public static final android.os.Parcelable.Creator<android.telecom.PhoneAccount> CREATOR; field public static final int NO_HIGHLIGHT_COLOR = 0; // 0x0 - field public static final int NO_ICON_TINT = 0; // 0x0 field public static final int NO_RESOURCE_ID = -1; // 0xffffffff field public static final java.lang.String SCHEME_SIP = "sip"; field public static final java.lang.String SCHEME_TEL = "tel"; @@ -32515,11 +32541,7 @@ package android.telecom { method public android.telecom.PhoneAccount.Builder setAddress(android.net.Uri); method public android.telecom.PhoneAccount.Builder setCapabilities(int); method public android.telecom.PhoneAccount.Builder setHighlightColor(int); - method public android.telecom.PhoneAccount.Builder setIcon(android.content.Context, int); - method public android.telecom.PhoneAccount.Builder setIcon(java.lang.String, int); - method public android.telecom.PhoneAccount.Builder setIcon(android.content.Context, int, int); - method public android.telecom.PhoneAccount.Builder setIcon(java.lang.String, int, int); - method public android.telecom.PhoneAccount.Builder setIcon(android.graphics.Bitmap); + method public android.telecom.PhoneAccount.Builder setIcon(android.graphics.drawable.Icon); method public android.telecom.PhoneAccount.Builder setShortDescription(java.lang.CharSequence); method public android.telecom.PhoneAccount.Builder setSubscriptionAddress(android.net.Uri); method public android.telecom.PhoneAccount.Builder setSupportedUriSchemes(java.util.List<java.lang.String>); @@ -32549,7 +32571,8 @@ package android.telecom { method public final void registerCallback(android.telecom.RemoteConference.Callback); method public final void registerCallback(android.telecom.RemoteConference.Callback, android.os.Handler); method public void separate(android.telecom.RemoteConnection); - method public void setAudioState(android.telecom.AudioState); + method public deprecated void setAudioState(android.telecom.AudioState); + method public void setCallAudioState(android.telecom.CallAudioState); method public void stopDtmfTone(); method public void swap(); method public void unhold(); @@ -32589,7 +32612,8 @@ package android.telecom { method public void registerCallback(android.telecom.RemoteConnection.Callback); method public void registerCallback(android.telecom.RemoteConnection.Callback, android.os.Handler); method public void reject(); - method public void setAudioState(android.telecom.AudioState); + method public deprecated void setAudioState(android.telecom.AudioState); + method public void setCallAudioState(android.telecom.CallAudioState); method public void stopDtmfTone(); method public void unhold(); method public void unregisterCallback(android.telecom.RemoteConnection.Callback); @@ -41108,7 +41132,7 @@ package android.webkit { public abstract class WebResourceError { ctor public WebResourceError(); - method public abstract java.lang.String getDescription(); + method public abstract java.lang.CharSequence getDescription(); method public abstract int getErrorCode(); } @@ -41123,6 +41147,7 @@ package android.webkit { public class WebResourceResponse extends android.webkit.WebResourceResponseBase { ctor public WebResourceResponse(java.lang.String, java.lang.String, java.io.InputStream); ctor public WebResourceResponse(java.lang.String, java.lang.String, int, java.lang.String, java.util.Map<java.lang.String, java.lang.String>, java.io.InputStream); + ctor public WebResourceResponse(boolean, java.lang.String, java.lang.String, int, java.lang.String, java.util.Map<java.lang.String, java.lang.String>, java.io.InputStream); method public java.io.InputStream getData(); method public java.lang.String getEncoding(); method public java.lang.String getMimeType(); @@ -41138,12 +41163,6 @@ package android.webkit { public abstract class WebResourceResponseBase { ctor public WebResourceResponseBase(); - method public abstract java.io.InputStream getData(); - method public abstract java.lang.String getEncoding(); - method public abstract java.lang.String getMimeType(); - method public abstract java.lang.String getReasonPhrase(); - method public abstract java.util.Map<java.lang.String, java.lang.String> getResponseHeaders(); - method public abstract int getStatusCode(); } public abstract class WebSettings { @@ -41520,6 +41539,7 @@ package android.webkit { method public void onReceivedError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceError); method public void onReceivedHttpAuthRequest(android.webkit.WebView, android.webkit.HttpAuthHandler, java.lang.String, java.lang.String); method public void onReceivedHttpError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceResponseBase); + method public void onReceivedHttpError(android.webkit.WebView, android.webkit.WebResourceRequest, android.webkit.WebResourceResponse); method public void onReceivedLoginRequest(android.webkit.WebView, java.lang.String, java.lang.String, java.lang.String); method public void onReceivedSslError(android.webkit.WebView, android.webkit.SslErrorHandler, android.net.http.SslError); method public void onScaleChanged(android.webkit.WebView, float, float); @@ -42827,6 +42847,7 @@ package android.widget { method public void setImageAlpha(int); method public void setImageBitmap(android.graphics.Bitmap); method public void setImageDrawable(android.graphics.drawable.Drawable); + method public void setImageIcon(android.graphics.drawable.Icon); method public void setImageLevel(int); method public void setImageMatrix(android.graphics.Matrix); method public void setImageResource(int); @@ -43407,7 +43428,9 @@ package android.widget { method public void setDouble(int, java.lang.String, double); method public void setEmptyView(int, int); method public void setFloat(int, java.lang.String, float); + method public void setIcon(int, java.lang.String, android.graphics.drawable.Icon); method public void setImageViewBitmap(int, android.graphics.Bitmap); + method public void setImageViewIcon(int, android.graphics.drawable.Icon); method public void setImageViewResource(int, int); method public void setImageViewUri(int, android.net.Uri); method public void setInt(int, java.lang.String, int); diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 49b2549..3ffeea7 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -30,6 +30,7 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; import android.media.AudioAttributes; import android.media.AudioManager; import android.media.session.MediaSession; @@ -885,6 +886,9 @@ public class Notification implements Parcelable */ public static final int HEADS_UP_REQUESTED = 2; + private Icon mSmallIcon; + private Icon mLargeIcon; + /** * Structure to encapsulate a named action that can be shown as part of this notification. * It must include an icon, a label, and a {@link PendingIntent} to be fired when the action is @@ -1362,7 +1366,7 @@ public class Notification implements Parcelable int version = parcel.readInt(); when = parcel.readLong(); - icon = parcel.readInt(); + mSmallIcon = Icon.CREATOR.createFromParcel(parcel); number = parcel.readInt(); if (parcel.readInt() != 0) { contentIntent = PendingIntent.CREATOR.createFromParcel(parcel); @@ -1380,7 +1384,7 @@ public class Notification implements Parcelable contentView = RemoteViews.CREATOR.createFromParcel(parcel); } if (parcel.readInt() != 0) { - largeIcon = Bitmap.CREATOR.createFromParcel(parcel); + mLargeIcon = Icon.CREATOR.createFromParcel(parcel); } defaults = parcel.readInt(); flags = parcel.readInt(); @@ -1445,7 +1449,7 @@ public class Notification implements Parcelable */ public void cloneInto(Notification that, boolean heavy) { that.when = this.when; - that.icon = this.icon; + that.mSmallIcon = this.mSmallIcon; that.number = this.number; // PendingIntents are global, so there's no reason (or way) to clone them. @@ -1462,8 +1466,8 @@ public class Notification implements Parcelable if (heavy && this.contentView != null) { that.contentView = this.contentView.clone(); } - if (heavy && this.largeIcon != null) { - that.largeIcon = Bitmap.createBitmap(this.largeIcon); + if (heavy && this.mLargeIcon != null) { + that.mLargeIcon = this.mLargeIcon; } that.iconLevel = this.iconLevel; that.sound = this.sound; // android.net.Uri is immutable @@ -1544,7 +1548,7 @@ public class Notification implements Parcelable contentView = null; bigContentView = null; headsUpContentView = null; - largeIcon = null; + mLargeIcon = null; if (extras != null) { extras.remove(Notification.EXTRA_LARGE_ICON); extras.remove(Notification.EXTRA_LARGE_ICON_BIG); @@ -1586,7 +1590,7 @@ public class Notification implements Parcelable parcel.writeInt(1); parcel.writeLong(when); - parcel.writeInt(icon); + mSmallIcon.writeToParcel(parcel, 0); parcel.writeInt(number); if (contentIntent != null) { parcel.writeInt(1); @@ -1618,9 +1622,9 @@ public class Notification implements Parcelable } else { parcel.writeInt(0); } - if (largeIcon != null) { + if (mLargeIcon != null) { parcel.writeInt(1); - largeIcon.writeToParcel(parcel, 0); + mLargeIcon.writeToParcel(parcel, 0); } else { parcel.writeInt(0); } @@ -1865,6 +1869,27 @@ public class Notification implements Parcelable } /** + * The small icon representing this notification in the status bar and content view. + * + * @return the small icon representing this notification. + * + * @see Builder#getSmallIcon() + * @see Builder#setSmallIcon(Icon) + */ + public Icon getSmallIcon() { + return mSmallIcon; + } + + /** + * The large icon shown in this notification's content view. + * @see Builder#getLargeIcon() + * @see Builder#setLargeIcon(Icon) + */ + public Icon getLargeIcon() { + return mLargeIcon; + } + + /** * @hide */ public boolean isValid() { @@ -1966,7 +1991,7 @@ public class Notification implements Parcelable private Context mContext; private long mWhen; - private int mSmallIcon; + private Icon mSmallIcon, mLargeIcon; private int mSmallIconLevel; private int mNumber; private CharSequence mContentTitle; @@ -1979,7 +2004,6 @@ public class Notification implements Parcelable private PendingIntent mFullScreenIntent; private CharSequence mTickerText; private RemoteViews mTickerView; - private Bitmap mLargeIcon; private Uri mSound; private int mAudioStreamType; private AudioAttributes mAudioAttributes; @@ -2160,8 +2184,7 @@ public class Notification implements Parcelable * @see Notification#icon */ public Builder setSmallIcon(@DrawableRes int icon) { - mSmallIcon = icon; - return this; + return setSmallIcon(Icon.createWithResource(mContext.getResources(), icon)); } /** @@ -2176,8 +2199,20 @@ public class Notification implements Parcelable * @see Notification#iconLevel */ public Builder setSmallIcon(@DrawableRes int icon, int level) { - mSmallIcon = icon; mSmallIconLevel = level; + return setSmallIcon(icon); + } + + /** + * Set the small icon, which will be used to represent the notification in the + * status bar and content view (unless overriden there by a + * {@link #setLargeIcon(Bitmap) large icon}). + * + * @param icon An Icon object to use. + * @see Notification#icon + */ + public Builder setSmallIcon(Icon icon) { + mSmallIcon = icon; return this; } @@ -2324,14 +2359,24 @@ public class Notification implements Parcelable } /** - * Add a large icon to the notification (and the ticker on some devices). + * Add a large icon to the notification content view. * * In the platform template, this image will be shown on the left of the notification view - * in place of the {@link #setSmallIcon(int) small icon} (which will move to the right side). + * in place of the {@link #setSmallIcon(Icon) small icon} (which will be placed in a small + * badge atop the large icon). + */ + public Builder setLargeIcon(Bitmap b) { + return setLargeIcon(b != null ? Icon.createWithBitmap(b) : null); + } + + /** + * Add a large icon to the notification content view. * - * @see Notification#largeIcon + * In the platform template, this image will be shown on the left of the notification view + * in place of the {@link #setSmallIcon(Icon) small icon} (which will be placed in a small + * badge atop the large icon). */ - public Builder setLargeIcon(Bitmap icon) { + public Builder setLargeIcon(Icon icon) { mLargeIcon = icon; return this; } @@ -2840,13 +2885,13 @@ public class Notification implements Parcelable boolean contentTextInLine2 = false; if (mLargeIcon != null) { - contentView.setImageViewBitmap(R.id.icon, mLargeIcon); + contentView.setImageViewIcon(R.id.icon, mLargeIcon); processLargeLegacyIcon(mLargeIcon, contentView); - contentView.setImageViewResource(R.id.right_icon, mSmallIcon); + contentView.setImageViewIcon(R.id.right_icon, mSmallIcon); contentView.setViewVisibility(R.id.right_icon, View.VISIBLE); processSmallRightIcon(mSmallIcon, contentView); } else { // small icon at left - contentView.setImageViewResource(R.id.icon, mSmallIcon); + contentView.setImageViewIcon(R.id.icon, mSmallIcon); contentView.setViewVisibility(R.id.icon, View.VISIBLE); processSmallIconAsLarge(mSmallIcon, contentView); } @@ -3086,14 +3131,16 @@ public class Notification implements Parcelable /** * Apply any necessary background to smallIcons being used in the largeIcon spot. */ - private void processSmallIconAsLarge(int largeIconId, RemoteViews contentView) { + private void processSmallIconAsLarge(Icon largeIcon, RemoteViews contentView) { if (!isLegacy()) { contentView.setDrawableParameters(R.id.icon, false, -1, 0xFFFFFFFF, PorterDuff.Mode.SRC_ATOP, -1); - } - if (!isLegacy() || mColorUtil.isGrayscaleIcon(mContext, largeIconId)) { applyLargeIconBackground(contentView); + } else { + if (mColorUtil.isGrayscaleIcon(mContext, largeIcon)) { + applyLargeIconBackground(contentView); + } } } @@ -3102,8 +3149,9 @@ public class Notification implements Parcelable * if it's grayscale). */ // TODO: also check bounds, transparency, that sort of thing. - private void processLargeLegacyIcon(Bitmap largeIcon, RemoteViews contentView) { - if (isLegacy() && mColorUtil.isGrayscaleIcon(largeIcon)) { + private void processLargeLegacyIcon(Icon largeIcon, RemoteViews contentView) { + if (largeIcon != null && isLegacy() + && mColorUtil.isGrayscaleIcon(mContext, largeIcon)) { applyLargeIconBackground(contentView); } else { removeLargeIconBackground(contentView); @@ -3137,14 +3185,15 @@ public class Notification implements Parcelable /** * Recolor small icons when used in the R.id.right_icon slot. */ - private void processSmallRightIcon(int smallIconDrawableId, - RemoteViews contentView) { + private void processSmallRightIcon(Icon smallIcon, RemoteViews contentView) { if (!isLegacy()) { contentView.setDrawableParameters(R.id.right_icon, false, -1, 0xFFFFFFFF, PorterDuff.Mode.SRC_ATOP, -1); } - if (!isLegacy() || mColorUtil.isGrayscaleIcon(mContext, smallIconDrawableId)) { + final boolean gray = (smallIcon.getType() == Icon.TYPE_RESOURCE + && mColorUtil.isGrayscaleIcon(mContext, smallIcon.getResId())); + if (!isLegacy() || gray) { contentView.setInt(R.id.right_icon, "setBackgroundResource", R.drawable.notification_icon_legacy_bg); @@ -3180,7 +3229,10 @@ public class Notification implements Parcelable public Notification buildUnstyled() { Notification n = new Notification(); n.when = mWhen; - n.icon = mSmallIcon; + n.mSmallIcon = mSmallIcon; + if (mSmallIcon.getType() == Icon.TYPE_RESOURCE) { + n.icon = mSmallIcon.getResId(); + } n.iconLevel = mSmallIconLevel; n.number = mNumber; @@ -3192,7 +3244,10 @@ public class Notification implements Parcelable n.fullScreenIntent = mFullScreenIntent; n.tickerText = mTickerText; n.tickerView = makeTickerView(); - n.largeIcon = mLargeIcon; + n.mLargeIcon = mLargeIcon; + if (mLargeIcon != null && mLargeIcon.getType() == Icon.TYPE_BITMAP) { + n.largeIcon = mLargeIcon.getBitmap(); + } n.sound = mSound; n.audioStreamType = mAudioStreamType; n.audioAttributes = mAudioAttributes; @@ -3242,7 +3297,7 @@ public class Notification implements Parcelable extras.putCharSequence(EXTRA_TEXT, mContentText); extras.putCharSequence(EXTRA_SUB_TEXT, mSubText); extras.putCharSequence(EXTRA_INFO_TEXT, mContentInfo); - extras.putInt(EXTRA_SMALL_ICON, mSmallIcon); + extras.putParcelable(EXTRA_SMALL_ICON, mSmallIcon); extras.putInt(EXTRA_PROGRESS, mProgress); extras.putInt(EXTRA_PROGRESS_MAX, mProgressMax); extras.putBoolean(EXTRA_PROGRESS_INDETERMINATE, mProgressIndeterminate); @@ -3430,7 +3485,7 @@ public class Notification implements Parcelable // Notification fields. mWhen = n.when; - mSmallIcon = n.icon; + mSmallIcon = n.mSmallIcon; mSmallIconLevel = n.iconLevel; mNumber = n.number; @@ -3441,7 +3496,7 @@ public class Notification implements Parcelable mFullScreenIntent = n.fullScreenIntent; mTickerText = n.tickerText; mTickerView = n.tickerView; - mLargeIcon = n.largeIcon; + mLargeIcon = n.mLargeIcon; mSound = n.sound; mAudioStreamType = n.audioStreamType; mAudioAttributes = n.audioAttributes; @@ -3472,7 +3527,7 @@ public class Notification implements Parcelable mContentText = extras.getCharSequence(EXTRA_TEXT); mSubText = extras.getCharSequence(EXTRA_SUB_TEXT); mContentInfo = extras.getCharSequence(EXTRA_INFO_TEXT); - mSmallIcon = extras.getInt(EXTRA_SMALL_ICON); + mSmallIcon = extras.getParcelable(EXTRA_SMALL_ICON); mProgress = extras.getInt(EXTRA_PROGRESS); mProgressMax = extras.getInt(EXTRA_PROGRESS_MAX); mProgressIndeterminate = extras.getBoolean(EXTRA_PROGRESS_INDETERMINATE); @@ -3764,7 +3819,7 @@ public class Notification implements Parcelable */ public static class BigPictureStyle extends Style { private Bitmap mPicture; - private Bitmap mBigLargeIcon; + private Icon mBigLargeIcon; private boolean mBigLargeIconSet = false; public BigPictureStyle() { @@ -3803,8 +3858,15 @@ public class Notification implements Parcelable * Override the large icon when the big notification is shown. */ public BigPictureStyle bigLargeIcon(Bitmap b) { + return bigLargeIcon(b != null ? Icon.createWithBitmap(b) : null); + } + + /** + * Override the large icon when the big notification is shown. + */ + public BigPictureStyle bigLargeIcon(Icon icon) { mBigLargeIconSet = true; - mBigLargeIcon = b; + mBigLargeIcon = icon; return this; } @@ -3815,7 +3877,7 @@ public class Notification implements Parcelable // 1. mBigLargeIconSet -> mBigLargeIcon (null or non-null) applies, overrides // mLargeIcon // 2. !mBigLargeIconSet -> mLargeIcon applies - Bitmap oldLargeIcon = null; + Icon oldLargeIcon = null; if (mBigLargeIconSet) { oldLargeIcon = mBuilder.mLargeIcon; mBuilder.mLargeIcon = mBigLargeIcon; diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java index c74bbdd..34699d8 100644 --- a/core/java/android/app/usage/UsageStatsManager.java +++ b/core/java/android/app/usage/UsageStatsManager.java @@ -234,4 +234,15 @@ public final class UsageStatsManager { } return false; } + + /** + * @hide + */ + public void setAppInactive(String packageName, boolean inactive) { + try { + mService.setAppInactive(packageName, inactive, UserHandle.myUserId()); + } catch (RemoteException e) { + // fall through + } + } } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 202a8a7..2ca0306 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -653,6 +653,16 @@ public abstract class PackageManager { public static final int INSTALL_FAILED_VERSION_DOWNGRADE = -25; /** + * Installation return code: this is passed to the {@link IPackageInstallObserver} by + * {@link #installPackage(android.net.Uri, IPackageInstallObserver, int)} if + * the old package has target SDK high enough to support runtime permission and + * the new package has target SDK low enough to not support runtime permissions. + * @hide + */ + @SystemApi + public static final int INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE = -26; + + /** * Installation parse return code: this is passed to the {@link IPackageInstallObserver} by * {@link #installPackage(android.net.Uri, IPackageInstallObserver, int)} * if the parser was given a path that is not a file, or does not end with the expected @@ -4512,6 +4522,7 @@ public abstract class PackageManager { case INSTALL_FAILED_PACKAGE_CHANGED: return PackageInstaller.STATUS_FAILURE_INVALID; case INSTALL_FAILED_UID_CHANGED: return PackageInstaller.STATUS_FAILURE_INVALID; case INSTALL_FAILED_VERSION_DOWNGRADE: return PackageInstaller.STATUS_FAILURE_INVALID; + case INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE: return PackageInstaller.STATUS_FAILURE_INVALID; case INSTALL_PARSE_FAILED_NOT_APK: return PackageInstaller.STATUS_FAILURE_INVALID; case INSTALL_PARSE_FAILED_BAD_MANIFEST: return PackageInstaller.STATUS_FAILURE_INVALID; case INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION: return PackageInstaller.STATUS_FAILURE_INVALID; diff --git a/core/java/android/webkit/WebResourceError.java b/core/java/android/webkit/WebResourceError.java index 080d174..11f1b6f 100644 --- a/core/java/android/webkit/WebResourceError.java +++ b/core/java/android/webkit/WebResourceError.java @@ -16,6 +16,8 @@ package android.webkit; +import android.annotation.SystemApi; + /** * Encapsulates information about errors occured during loading of web resources. See * {@link WebViewClient#onReceivedError(WebView, WebResourceRequest, WebResourceError) WebViewClient.onReceivedError(WebView, WebResourceRequest, WebResourceError)} @@ -35,5 +37,12 @@ public abstract class WebResourceError { * * @return The description of the error */ - public abstract String getDescription(); + public abstract CharSequence getDescription(); + + /** + * This class can not be subclassed by applications. + * @hide + */ + @SystemApi + public WebResourceError() {} } diff --git a/core/java/android/webkit/WebResourceResponse.java b/core/java/android/webkit/WebResourceResponse.java index a42aaa7..3a925c8 100644 --- a/core/java/android/webkit/WebResourceResponse.java +++ b/core/java/android/webkit/WebResourceResponse.java @@ -20,12 +20,15 @@ import java.io.InputStream; import java.io.StringBufferInputStream; import java.util.Map; +import android.annotation.SystemApi; + /** * Encapsulates a resource response. Applications can return an instance of this * class from {@link WebViewClient#shouldInterceptRequest} to provide a custom * response when the WebView requests a particular resource. */ public class WebResourceResponse extends WebResourceResponseBase { + private boolean mImmutable; private String mMimeType; private String mEncoding; private int mStatusCode; @@ -80,13 +83,15 @@ public class WebResourceResponse extends WebResourceResponseBase { * @param mimeType The resource response's MIME type */ public void setMimeType(String mimeType) { + checkImmutable(); mMimeType = mimeType; } /** - * {@inheritDoc} + * Gets the resource response's MIME type. + * + * @return The resource response's MIME type */ - @Override public String getMimeType() { return mMimeType; } @@ -98,13 +103,15 @@ public class WebResourceResponse extends WebResourceResponseBase { * @param encoding The resource response's encoding */ public void setEncoding(String encoding) { + checkImmutable(); mEncoding = encoding; } /** - * {@inheritDoc} + * Gets the resource response's encoding. + * + * @return The resource response's encoding */ - @Override public String getEncoding() { return mEncoding; } @@ -118,6 +125,7 @@ public class WebResourceResponse extends WebResourceResponseBase { * and not empty. */ public void setStatusCodeAndReasonPhrase(int statusCode, String reasonPhrase) { + checkImmutable(); if (statusCode < 100) throw new IllegalArgumentException("statusCode can't be less than 100."); if (statusCode > 599) @@ -140,17 +148,19 @@ public class WebResourceResponse extends WebResourceResponseBase { } /** - * {@inheritDoc} + * Gets the resource response's status code. + * + * @return The resource response's status code. */ - @Override public int getStatusCode() { return mStatusCode; } /** - * {@inheritDoc} + * Gets the description of the resource response's status code. + * + * @return The description of the resource response's status code. */ - @Override public String getReasonPhrase() { return mReasonPhrase; } @@ -161,13 +171,15 @@ public class WebResourceResponse extends WebResourceResponseBase { * @param headers Mapping of header name -> header value. */ public void setResponseHeaders(Map<String, String> headers) { + checkImmutable(); mResponseHeaders = headers; } /** - * {@inheritDoc} + * Gets the headers for the resource response. + * + * @return The headers for the resource response. */ - @Override public Map<String, String> getResponseHeaders() { return mResponseHeaders; } @@ -180,6 +192,7 @@ public class WebResourceResponse extends WebResourceResponseBase { * StringBufferInputStream. */ public void setData(InputStream data) { + checkImmutable(); // If data is (or is a subclass of) StringBufferInputStream if (data != null && StringBufferInputStream.class.isAssignableFrom(data.getClass())) { throw new IllegalArgumentException("StringBufferInputStream is deprecated and must " + @@ -189,10 +202,32 @@ public class WebResourceResponse extends WebResourceResponseBase { } /** - * {@inheritDoc} + * Gets the input stream that provides the resource response's data. + * + * @return The input stream that provides the resource response's data */ - @Override public InputStream getData() { return mInputStream; } + + /** + * The internal version of the constructor that doesn't perform arguments checks. + * @hide + */ + @SystemApi + public WebResourceResponse(boolean immutable, String mimeType, String encoding, int statusCode, + String reasonPhrase, Map<String, String> responseHeaders, InputStream data) { + mImmutable = immutable; + mMimeType = mimeType; + mEncoding = encoding; + mStatusCode = statusCode; + mReasonPhrase = reasonPhrase; + mResponseHeaders = responseHeaders; + mInputStream = data; + } + + private void checkImmutable() { + if (mImmutable) + throw new IllegalStateException("This WebResourceResponse instance is immutable"); + } } diff --git a/core/java/android/webkit/WebResourceResponseBase.java b/core/java/android/webkit/WebResourceResponseBase.java index cffde82..69eb397 100644 --- a/core/java/android/webkit/WebResourceResponseBase.java +++ b/core/java/android/webkit/WebResourceResponseBase.java @@ -16,53 +16,9 @@ package android.webkit; -import java.io.InputStream; -import java.util.Map; - /** - * Encapsulates a resource response received from the server. - * This is an abstract class used by WebView callbacks. + * This class will be deleted after updated WebView.apk will be submitted + * into the Android tree. */ public abstract class WebResourceResponseBase { - /** - * Gets the resource response's MIME type. - * - * @return The resource response's MIME type - */ - public abstract String getMimeType(); - - /** - * Gets the resource response's encoding. - * - * @return The resource response's encoding - */ - public abstract String getEncoding(); - - /** - * Gets the resource response's status code. - * - * @return The resource response's status code. - */ - public abstract int getStatusCode(); - - /** - * Gets the description of the resource response's status code. - * - * @return The description of the resource response's status code. - */ - public abstract String getReasonPhrase(); - - /** - * Gets the headers for the resource response. - * - * @return The headers for the resource response. - */ - public abstract Map<String, String> getResponseHeaders(); - - /** - * Gets the input stream that provides the resource response's data. - * - * @return The input stream that provides the resource response's data - */ - public abstract InputStream getData(); } diff --git a/core/java/android/webkit/WebViewClient.java b/core/java/android/webkit/WebViewClient.java index 3a40de6..feed2b8 100644 --- a/core/java/android/webkit/WebViewClient.java +++ b/core/java/android/webkit/WebViewClient.java @@ -233,11 +233,20 @@ public class WebViewClient { public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { if (request.isForMainFrame()) { onReceivedError(view, - error.getErrorCode(), error.getDescription(), request.getUrl().toString()); + error.getErrorCode(), error.getDescription().toString(), + request.getUrl().toString()); } } /** + * This method will be deleted after updated WebView.apk will be submitted + * into the Android tree. + */ + public void onReceivedHttpError( + WebView view, WebResourceRequest request, WebResourceResponseBase errorResponse) { + } + + /** * Notify the host application that an HTTP error has been received from the server while * loading a resource. HTTP errors have status codes >= 400. This callback will be called * for any resource (iframe, image, etc), not just for the main page. Thus, it is recommended to @@ -248,7 +257,7 @@ public class WebViewClient { * @param errorResponse Information about the error occured. */ public void onReceivedHttpError( - WebView view, WebResourceRequest request, WebResourceResponseBase errorResponse) { + WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { } /** diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 814882a..30f373a 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -3855,8 +3855,8 @@ public class Editor { private class SelectionStartHandleView extends HandleView { // Indicates whether the cursor is making adjustments within a word. private boolean mInWord = false; - // Offset to track difference between touch and word boundary. - protected int mTouchWordOffset; + // Difference between touch position and word boundary position. + private float mTouchWordDelta; public SelectionStartHandleView(Drawable drawableLtr, Drawable drawableRtl) { super(drawableLtr, drawableRtl); @@ -3908,18 +3908,36 @@ public class Editor { offset = mPreviousOffset; } } - mTouchWordOffset = Math.max(trueOffset - offset, 0); - positionCursor = true; - } else if (offset - mTouchWordOffset > mPreviousOffset || currLine > mPrevLine) { - // User is shrinking the selection. - if (currLine > mPrevLine) { - // We're on a different line, so we'll snap to word boundaries. - offset = start; - mTouchWordOffset = Math.max(trueOffset - offset, 0); + final Layout layout = mTextView.getLayout(); + if (layout != null && offset < trueOffset) { + final float adjustedX = layout.getPrimaryHorizontal(offset); + mTouchWordDelta = + mTextView.convertToLocalHorizontalCoordinate(x) - adjustedX; } else { - offset -= mTouchWordOffset; + mTouchWordDelta = 0.0f; } positionCursor = true; + } else { + final int adjustedOffset = + mTextView.getOffsetAtCoordinate(currLine, x - mTouchWordDelta); + if (adjustedOffset > mPreviousOffset || currLine > mPrevLine) { + // User is shrinking the selection. + if (currLine > mPrevLine) { + // We're on a different line, so we'll snap to word boundaries. + offset = start; + final Layout layout = mTextView.getLayout(); + if (layout != null && offset < trueOffset) { + final float adjustedX = layout.getPrimaryHorizontal(offset); + mTouchWordDelta = + mTextView.convertToLocalHorizontalCoordinate(x) - adjustedX; + } else { + mTouchWordDelta = 0.0f; + } + } else { + offset = adjustedOffset; + } + positionCursor = true; + } } // Handles can not cross and selection is at least one character. @@ -3934,7 +3952,7 @@ public class Editor { } else { offset = alteredOffset; } - mTouchWordOffset = 0; + mTouchWordDelta = 0.0f; } mInWord = !getWordIteratorWithText().isBoundary(offset); positionAtCursorOffset(offset, false); @@ -3946,7 +3964,7 @@ public class Editor { boolean superResult = super.onTouchEvent(event); if (event.getActionMasked() == MotionEvent.ACTION_UP) { // Reset the touch word offset when the user has lifted their finger. - mTouchWordOffset = 0; + mTouchWordDelta = 0.0f; } return superResult; } @@ -3955,8 +3973,8 @@ public class Editor { private class SelectionEndHandleView extends HandleView { // Indicates whether the cursor is making adjustments within a word. private boolean mInWord = false; - // Offset to track difference between touch and word boundary. - protected int mTouchWordOffset; + // Difference between touch position and word boundary position. + private float mTouchWordDelta; public SelectionEndHandleView(Drawable drawableLtr, Drawable drawableRtl) { super(drawableLtr, drawableRtl); @@ -4008,18 +4026,36 @@ public class Editor { offset = mPreviousOffset; } } - mTouchWordOffset = Math.max(offset - trueOffset, 0); - positionCursor = true; - } else if (offset + mTouchWordOffset < mPreviousOffset || currLine < mPrevLine) { - // User is shrinking the selection. - if (currLine < mPrevLine) { - // We're on a different line, so we'll snap to word boundaries. - offset = end; - mTouchWordOffset = Math.max(offset - trueOffset, 0); + final Layout layout = mTextView.getLayout(); + if (layout != null && offset > trueOffset) { + final float adjustedX = layout.getPrimaryHorizontal(offset); + mTouchWordDelta = + adjustedX - mTextView.convertToLocalHorizontalCoordinate(x); } else { - offset += mTouchWordOffset; + mTouchWordDelta = 0.0f; } positionCursor = true; + } else { + final int adjustedOffset = + mTextView.getOffsetAtCoordinate(currLine, x + mTouchWordDelta); + if (adjustedOffset < mPreviousOffset || currLine < mPrevLine) { + // User is shrinking the selection. + if (currLine < mPrevLine) { + // We're on a different line, so we'll snap to word boundaries. + offset = end; + final Layout layout = mTextView.getLayout(); + if (layout != null && offset > trueOffset) { + final float adjustedX = layout.getPrimaryHorizontal(offset); + mTouchWordDelta = + adjustedX - mTextView.convertToLocalHorizontalCoordinate(x); + } else { + mTouchWordDelta = 0.0f; + } + } else { + offset = adjustedOffset; + } + positionCursor = true; + } } if (positionCursor) { @@ -4034,7 +4070,7 @@ public class Editor { } else { offset = Math.min(alteredOffset, length); } - mTouchWordOffset = 0; + mTouchWordDelta = 0.0f; } mInWord = !getWordIteratorWithText().isBoundary(offset); positionAtCursorOffset(offset, false); @@ -4046,7 +4082,7 @@ public class Editor { boolean superResult = super.onTouchEvent(event); if (event.getActionMasked() == MotionEvent.ACTION_UP) { // Reset the touch word offset when the user has lifted their finger. - mTouchWordOffset = 0; + mTouchWordDelta = 0.0f; } return superResult; } diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java index 05059bc..94cda88 100644 --- a/core/java/android/widget/ImageView.java +++ b/core/java/android/widget/ImageView.java @@ -36,8 +36,10 @@ import android.graphics.RectF; import android.graphics.Xfermode; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Build; +import android.os.Handler; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; @@ -462,6 +464,21 @@ public class ImageView extends View { } /** + * Sets the content of this ImageView to the specified Icon. + * + * <p class="note">Depending on the Icon type, this may do Bitmap reading and decoding + * on the UI thread, which can cause UI jank. If that's a concern, consider using + * {@link Icon#loadDrawableAsync(Context, Handler, Icon.OnDrawableLoadedListener)} + * and then {@link #setImageDrawable(android.graphics.drawable.Drawable)} instead.</p> + * + * @param icon an Icon holding the desired image + */ + @android.view.RemotableViewMethod + public void setImageIcon(Icon icon) { + setImageDrawable(icon.loadDrawable(mContext)); + } + + /** * Applies a tint to the image drawable. Does not modify the current tint * mode, which is {@link PorterDuff.Mode#SRC_IN} by default. * <p> diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index a10be11..dc75fd0 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -35,6 +35,7 @@ import android.graphics.Bitmap; import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -1072,6 +1073,7 @@ public class RemoteViews implements Parcelable, Filter { static final int BUNDLE = 13; static final int INTENT = 14; static final int COLOR_STATE_LIST = 15; + static final int ICON = 16; String methodName; int type; @@ -1150,6 +1152,10 @@ public class RemoteViews implements Parcelable, Filter { this.value = ColorStateList.CREATOR.createFromParcel(in); } break; + case ICON: + if (in.readInt() != 0) { + this.value = Icon.CREATOR.createFromParcel(in); + } default: break; } @@ -1225,6 +1231,13 @@ public class RemoteViews implements Parcelable, Filter { if (this.value != null) { ((ColorStateList)this.value).writeToParcel(out, flags); } + break; + case ICON: + out.writeInt(this.value != null ? 1 : 0); + if (this.value != null) { + ((Icon)this.value).writeToParcel(out, flags); + } + break; default: break; } @@ -1262,6 +1275,8 @@ public class RemoteViews implements Parcelable, Filter { return Intent.class; case COLOR_STATE_LIST: return ColorStateList.class; + case ICON: + return Icon.class; default: return null; } @@ -2082,6 +2097,16 @@ public class RemoteViews implements Parcelable, Filter { } /** + * Equivalent to calling ImageView.setImageIcon + * + * @param viewId The id of the view whose bitmap should change + * @param icon The new Icon for the ImageView + */ + public void setImageViewIcon(int viewId, Icon icon) { + setIcon(viewId, "setImageIcon", icon); + } + + /** * Equivalent to calling AdapterView.setEmptyView * * @param viewId The id of the view on which to set the empty view @@ -2519,6 +2544,17 @@ public class RemoteViews implements Parcelable, Filter { } /** + * Call a method taking one Icon on a view in the layout for this RemoteViews. + * + * @param viewId The id of the view on which to call the method. + * @param methodName The name of the method to call. + * @param value The {@link android.graphics.drawable.Icon} to pass the method. + */ + public void setIcon(int viewId, String methodName, Icon value) { + addAction(new ReflectionAction(viewId, methodName, ReflectionAction.ICON, value)); + } + + /** * Equivalent to calling View.setContentDescription(CharSequence). * * @param viewId The id of the view whose content description should change. diff --git a/core/java/com/android/internal/statusbar/StatusBarIcon.java b/core/java/com/android/internal/statusbar/StatusBarIcon.java index e0792cb..4693d4b 100644 --- a/core/java/com/android/internal/statusbar/StatusBarIcon.java +++ b/core/java/com/android/internal/statusbar/StatusBarIcon.java @@ -16,40 +16,46 @@ package com.android.internal.statusbar; +import android.graphics.drawable.Icon; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; public class StatusBarIcon implements Parcelable { - public String iconPackage; public UserHandle user; - public int iconId; + public Icon icon; public int iconLevel; public boolean visible = true; public int number; public CharSequence contentDescription; - public StatusBarIcon(String iconPackage, UserHandle user, int iconId, int iconLevel, int number, + public StatusBarIcon(UserHandle user, Icon icon, int iconLevel, int number, CharSequence contentDescription) { - this.iconPackage = iconPackage; this.user = user; - this.iconId = iconId; + this.icon = icon; this.iconLevel = iconLevel; this.number = number; this.contentDescription = contentDescription; } + public StatusBarIcon(String iconPackage, UserHandle user, + int iconId, int iconLevel, int number, + CharSequence contentDescription) { + this(user, Icon.createWithResource(iconPackage, iconId), + iconLevel, number, contentDescription); + } + @Override public String toString() { - return "StatusBarIcon(pkg=" + this.iconPackage + "user=" + user.getIdentifier() - + " id=0x" + Integer.toHexString(this.iconId) + return "StatusBarIcon(icon=" + this.icon + + " user=" + user.getIdentifier() + " level=" + this.iconLevel + " visible=" + visible + " num=" + this.number + " )"; } @Override public StatusBarIcon clone() { - StatusBarIcon that = new StatusBarIcon(this.iconPackage, this.user, this.iconId, + StatusBarIcon that = new StatusBarIcon(this.user, this.icon, this.iconLevel, this.number, this.contentDescription); that.visible = this.visible; return that; @@ -63,9 +69,8 @@ public class StatusBarIcon implements Parcelable { } public void readFromParcel(Parcel in) { - this.iconPackage = in.readString(); + this.icon = (Icon) in.readParcelable(null); this.user = (UserHandle) in.readParcelable(null); - this.iconId = in.readInt(); this.iconLevel = in.readInt(); this.visible = in.readInt() != 0; this.number = in.readInt(); @@ -73,9 +78,8 @@ public class StatusBarIcon implements Parcelable { } public void writeToParcel(Parcel out, int flags) { - out.writeString(this.iconPackage); + out.writeParcelable(this.icon, 0); out.writeParcelable(this.user, 0); - out.writeInt(this.iconId); out.writeInt(this.iconLevel); out.writeInt(this.visible ? 1 : 0); out.writeInt(this.number); diff --git a/core/java/com/android/internal/util/NotificationColorUtil.java b/core/java/com/android/internal/util/NotificationColorUtil.java index 3249ea3..6076973 100644 --- a/core/java/com/android/internal/util/NotificationColorUtil.java +++ b/core/java/com/android/internal/util/NotificationColorUtil.java @@ -24,6 +24,7 @@ import android.graphics.Color; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; import android.graphics.drawable.VectorDrawable; import android.text.SpannableStringBuilder; import android.text.Spanned; @@ -129,6 +130,20 @@ public class NotificationColorUtil { } } + public boolean isGrayscaleIcon(Context context, Icon icon) { + if (icon == null) { + return false; + } + switch (icon.getType()) { + case Icon.TYPE_BITMAP: + return isGrayscaleIcon(icon.getBitmap()); + case Icon.TYPE_RESOURCE: + return isGrayscaleIcon(context, icon.getResId()); + default: + return false; + } + } + /** * Checks whether a drawable with a resoure id is a small grayscale icon. * Grayscale here means "very close to a perfect gray"; icon means "no larger than 64dp". diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index edff537..4c034b3 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1107,6 +1107,11 @@ <permission android:name="android.permission.CAPTURE_TV_INPUT" android:protectionLevel="signatureOrSystem" /> + <!-- @hide Allows TvInputService to access DVB device. + <p>Not for use by third-party applications. --> + <permission android:name="android.permission.DVB_DEVICE" + android:protectionLevel="signatureOrSystem" /> + <!-- @hide Allows enabling/disabling OEM unlock <p>Not for use by third-party applications. --> <permission android:name="android.permission.OEM_UNLOCK_STATE" @@ -1184,10 +1189,20 @@ android:protectionLevel="system|signature" /> <!-- Must be required by a {@link android.telecom.ConnectionService}, - to ensure that only the system can bind to it. --> + to ensure that only the system can bind to it. + @deprecated {@link android.telecom.ConnectionService}s should require + android.permission.BIND_TELECOM_CONNECTION_SERVICE instead. + @SystemApi + @hide --> <permission android:name="android.permission.BIND_CONNECTION_SERVICE" android:protectionLevel="system|signature" /> + <!-- Must be required by a {@link android.telecom.ConnectionService}, + to ensure that only the system can bind to it. --> + <permission android:name="android.permission.BIND_TELECOM_CONNECTION_SERVICE" + android:protectionLevel="system|signature" /> + + <!-- @SystemApi Allows an application to control the in-call experience. @hide --> <permission android:name="android.permission.CONTROL_INCALL_EXPERIENCE" diff --git a/graphics/java/android/graphics/drawable/Icon.java b/graphics/java/android/graphics/drawable/Icon.java index b2c3ab7..37fb703 100644 --- a/graphics/java/android/graphics/drawable/Icon.java +++ b/graphics/java/android/graphics/drawable/Icon.java @@ -18,9 +18,9 @@ package android.graphics.drawable; import android.annotation.DrawableRes; import android.content.ContentResolver; +import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Resources; -import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; @@ -29,15 +29,16 @@ import android.os.Handler; import android.os.Message; import android.os.Parcel; import android.os.Parcelable; -import android.os.UserHandle; import android.util.Log; +import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.IOException; import java.io.InputStream; -import java.lang.IllegalArgumentException; -import java.lang.Override; +import java.io.OutputStream; /** * An umbrella container for several serializable graphics representations, including Bitmaps, @@ -52,10 +53,16 @@ import java.lang.Override; public final class Icon implements Parcelable { private static final String TAG = "Icon"; - private static final int TYPE_BITMAP = 1; - private static final int TYPE_RESOURCE = 2; - private static final int TYPE_DATA = 3; - private static final int TYPE_URI = 4; + /** @hide */ + public static final int TYPE_BITMAP = 1; + /** @hide */ + public static final int TYPE_RESOURCE = 2; + /** @hide */ + public static final int TYPE_DATA = 3; + /** @hide */ + public static final int TYPE_URI = 4; + + private static final int VERSION_STREAM_SERIALIZER = 1; private final int mType; @@ -78,15 +85,34 @@ public final class Icon implements Parcelable { // TYPE_DATA: data offset private int mInt2; - // Internal accessors for different mType variants - private Bitmap getBitmap() { + /** + * @return The type of image data held in this Icon. One of + * {@link #TYPE_BITMAP}, + * {@link #TYPE_RESOURCE}, + * {@link #TYPE_DATA}, or + * {@link #TYPE_URI}. + * @hide + */ + public int getType() { + return mType; + } + + /** + * @return The {@link android.graphics.Bitmap} held by this {@link #TYPE_BITMAP} Icon. + * @hide + */ + public Bitmap getBitmap() { if (mType != TYPE_BITMAP) { throw new IllegalStateException("called getBitmap() on " + this); } return (Bitmap) mObj1; } - private int getDataLength() { + /** + * @return The length of the compressed bitmap byte array held by this {@link #TYPE_DATA} Icon. + * @hide + */ + public int getDataLength() { if (mType != TYPE_DATA) { throw new IllegalStateException("called getDataLength() on " + this); } @@ -95,7 +121,12 @@ public final class Icon implements Parcelable { } } - private int getDataOffset() { + /** + * @return The offset into the byte array held by this {@link #TYPE_DATA} Icon at which + * valid compressed bitmap data is found. + * @hide + */ + public int getDataOffset() { if (mType != TYPE_DATA) { throw new IllegalStateException("called getDataOffset() on " + this); } @@ -104,7 +135,12 @@ public final class Icon implements Parcelable { } } - private byte[] getDataBytes() { + /** + * @return The byte array held by this {@link #TYPE_DATA} Icon ctonaining compressed + * bitmap data. + * @hide + */ + public byte[] getDataBytes() { if (mType != TYPE_DATA) { throw new IllegalStateException("called getDataBytes() on " + this); } @@ -113,39 +149,58 @@ public final class Icon implements Parcelable { } } - private Resources getResources() { + /** + * @return The {@link android.content.res.Resources} for this {@link #TYPE_RESOURCE} Icon. + * @hide + */ + public Resources getResources() { if (mType != TYPE_RESOURCE) { throw new IllegalStateException("called getResources() on " + this); } return (Resources) mObj1; } - private String getResPackage() { + /** + * @return The package containing resources for this {@link #TYPE_RESOURCE} Icon. + * @hide + */ + public String getResPackage() { if (mType != TYPE_RESOURCE) { throw new IllegalStateException("called getResPackage() on " + this); } return mString1; } - private int getResId() { + /** + * @return The resource ID for this {@link #TYPE_RESOURCE} Icon. + * @hide + */ + public int getResId() { if (mType != TYPE_RESOURCE) { throw new IllegalStateException("called getResId() on " + this); } return mInt1; } - private String getUriString() { + /** + * @return The URI (as a String) for this {@link #TYPE_URI} Icon. + * @hide + */ + public String getUriString() { if (mType != TYPE_URI) { throw new IllegalStateException("called getUriString() on " + this); } return mString1; } - private Uri getUri() { + /** + * @return The {@link android.net.Uri} for this {@link #TYPE_URI} Icon. + * @hide + */ + public Uri getUri() { return Uri.parse(getUriString()); } - // Convert a int32 into a four-char string private static final String typeToString(int x) { switch (x) { case TYPE_BITMAP: return "BITMAP"; @@ -281,16 +336,81 @@ public final class Icon implements Parcelable { return loadDrawable(context); } + /** + * Writes a serialized version of an Icon to the specified stream. + * + * @param stream The stream on which to serialize the Icon. + * @hide + */ + public void writeToStream(OutputStream stream) throws IOException { + DataOutputStream dataStream = new DataOutputStream(stream); + + dataStream.writeInt(VERSION_STREAM_SERIALIZER); + dataStream.writeByte(mType); + + switch (mType) { + case TYPE_BITMAP: + getBitmap().compress(Bitmap.CompressFormat.PNG, 100, dataStream); + break; + case TYPE_DATA: + dataStream.writeInt(getDataLength()); + dataStream.write(getDataBytes(), getDataOffset(), getDataLength()); + break; + case TYPE_RESOURCE: + dataStream.writeUTF(getResPackage()); + dataStream.writeInt(getResId()); + break; + case TYPE_URI: + dataStream.writeUTF(getUriString()); + break; + } + } + private Icon(int mType) { this.mType = mType; } /** + * Create an Icon from the specified stream. + * + * @param stream The input stream from which to reconstruct the Icon. + * @hide + */ + public static Icon createFromStream(InputStream stream) throws IOException { + DataInputStream inputStream = new DataInputStream(stream); + + final int version = inputStream.readInt(); + if (version >= VERSION_STREAM_SERIALIZER) { + final int type = inputStream.readByte(); + switch (type) { + case TYPE_BITMAP: + return createWithBitmap(BitmapFactory.decodeStream(inputStream)); + case TYPE_DATA: + final int length = inputStream.readInt(); + final byte[] data = new byte[length]; + inputStream.read(data, 0 /* offset */, length); + return createWithData(data, 0 /* offset */, length); + case TYPE_RESOURCE: + final String packageName = inputStream.readUTF(); + final int resId = inputStream.readInt(); + return createWithResource(packageName, resId); + case TYPE_URI: + final String uriOrPath = inputStream.readUTF(); + return createWithContentUri(uriOrPath); + } + } + return null; + } + + /** * Create an Icon pointing to a drawable resource. * @param res Resources for a package containing the resource in question * @param resId ID of the drawable resource */ public static Icon createWithResource(Resources res, @DrawableRes int resId) { + if (res == null) { + throw new IllegalArgumentException("Resource must not be null."); + } final Icon rep = new Icon(TYPE_RESOURCE); rep.mObj1 = res; rep.mInt1 = resId; @@ -304,6 +424,9 @@ public final class Icon implements Parcelable { * @param resId ID of the drawable resource */ public static Icon createWithResource(String resPackage, @DrawableRes int resId) { + if (resPackage == null) { + throw new IllegalArgumentException("Resource package name must not be null."); + } final Icon rep = new Icon(TYPE_RESOURCE); rep.mInt1 = resId; rep.mString1 = resPackage; @@ -315,6 +438,9 @@ public final class Icon implements Parcelable { * @param bits A valid {@link android.graphics.Bitmap} object */ public static Icon createWithBitmap(Bitmap bits) { + if (bits == null) { + throw new IllegalArgumentException("Bitmap must not be null."); + } final Icon rep = new Icon(TYPE_BITMAP); rep.mObj1 = bits; return rep; @@ -329,6 +455,9 @@ public final class Icon implements Parcelable { * @param length Length of the bitmap data */ public static Icon createWithData(byte[] data, int offset, int length) { + if (data == null) { + throw new IllegalArgumentException("Data must not be null."); + } final Icon rep = new Icon(TYPE_DATA); rep.mObj1 = data; rep.mInt1 = length; @@ -342,6 +471,9 @@ public final class Icon implements Parcelable { * @param uri A uri referring to local content:// or file:// image data. */ public static Icon createWithContentUri(String uri) { + if (uri == null) { + throw new IllegalArgumentException("Uri must not be null."); + } final Icon rep = new Icon(TYPE_URI); rep.mString1 = uri; return rep; @@ -353,6 +485,9 @@ public final class Icon implements Parcelable { * @param uri A uri referring to local content:// or file:// image data. */ public static Icon createWithContentUri(Uri uri) { + if (uri == null) { + throw new IllegalArgumentException("Uri must not be null."); + } final Icon rep = new Icon(TYPE_URI); rep.mString1 = uri.toString(); return rep; @@ -365,6 +500,9 @@ public final class Icon implements Parcelable { * a type that {@link android.graphics.BitmapFactory} can decode. */ public static Icon createWithFilePath(String path) { + if (path == null) { + throw new IllegalArgumentException("Path must not be null."); + } final Icon rep = new Icon(TYPE_URI); rep.mString1 = path; return rep; diff --git a/media/java/android/media/AudioDeviceInfo.java b/media/java/android/media/AudioDeviceInfo.java index 566f8dc..4ecb930 100644 --- a/media/java/android/media/AudioDeviceInfo.java +++ b/media/java/android/media/AudioDeviceInfo.java @@ -16,6 +16,7 @@ package android.media; +import android.annotation.NonNull; import android.util.SparseIntArray; /** @@ -151,27 +152,38 @@ public final class AudioDeviceInfo { /** * @return An array of sample rates supported by the audio device. */ - public int[] getSampleRates() { + public @NonNull int[] getSampleRates() { return mPort.samplingRates(); } /** - * @return An array of channel masks ({@link AudioFormat#CHANNEL_IN_STEREO}, - * {@link AudioFormat#CHANNEL_OUT_7POINT1) for which this audio device can be configured. + * @return An array of channel position masks (e.g. {@link AudioFormat#CHANNEL_IN_STEREO}, + * {@link AudioFormat#CHANNEL_OUT_7POINT1}) for which this audio device can be configured. * * @see AudioFormat */ - public int[] getChannelMasks() { + public @NonNull int[] getChannelMasks() { return mPort.channelMasks(); } /** - * @return An array of channel counts (1, 2, 4....) for which this audio device + * @return An array of channel index masks for which this audio device can be configured. + * + * @see AudioFormat + */ + public @NonNull int[] getChannelIndexMasks() { + // TODO: implement + return new int[0]; + } + + /** + * @return An array of channel counts (1, 2, 4, ...) for which this audio device * can be configured. */ - public int[] getChannelCounts() { + public @NonNull int[] getChannelCounts() { int[] masks = getChannelMasks(); int[] counts = new int[masks.length]; + // TODO: consider channel index masks for (int mask_index = 0; mask_index < masks.length; mask_index++) { counts[mask_index] = isSink() ? AudioFormat.channelCountFromOutChannelMask(masks[mask_index]) @@ -181,12 +193,16 @@ public final class AudioDeviceInfo { } /** - * @return An array of audio format IDs (@link AudioFormat#ENCODING_PCM_16BIT, - * {@link AudioFormat#ENCODING_PCM_FLOAT}...) supported by the audio device. + * @return An array of audio encodings (e.g. {@link AudioFormat#ENCODING_PCM_16BIT}, + * {@link AudioFormat#ENCODING_PCM_FLOAT}) supported by the audio device. + * <code>ENCODING_PCM_FLOAT</code> indicates the device supports more + * than 16 bits of integer precision. Specifying <code>ENCODING_PCM_FLOAT</code> + * with {@link AudioTrack} or {@link AudioRecord} can preserve at least 24 bits of + * integer precision to that device. * * @see AudioFormat */ - public int[] getFormats() { + public @NonNull int[] getFormats() { return mPort.formats(); } diff --git a/media/java/android/media/tv/DvbDeviceInfo.aidl b/media/java/android/media/tv/DvbDeviceInfo.aidl new file mode 100644 index 0000000..4851050 --- /dev/null +++ b/media/java/android/media/tv/DvbDeviceInfo.aidl @@ -0,0 +1,20 @@ +/* + * + * Copyright 2015, 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.media.tv; + +parcelable DvbDeviceInfo;
\ No newline at end of file diff --git a/media/java/android/media/tv/DvbDeviceInfo.java b/media/java/android/media/tv/DvbDeviceInfo.java new file mode 100644 index 0000000..1885a34 --- /dev/null +++ b/media/java/android/media/tv/DvbDeviceInfo.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2015 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.media.tv; + +import android.annotation.SystemApi; +import android.os.Parcel; +import android.os.Parcelable; +import android.media.tv.TvInputManager; +import android.util.Log; + +import java.lang.IllegalArgumentException; + +/** + * Simple container for information about DVB device. + * Not for third-party developers. + * + * @hide + */ +public final class DvbDeviceInfo implements Parcelable { + static final String TAG = "DvbDeviceInfo"; + + public static final Parcelable.Creator<DvbDeviceInfo> CREATOR = + new Parcelable.Creator<DvbDeviceInfo>() { + @Override + public DvbDeviceInfo createFromParcel(Parcel source) { + try { + return new DvbDeviceInfo(source); + } catch (Exception e) { + Log.e(TAG, "Exception creating DvbDeviceInfo from parcel", e); + return null; + } + } + + @Override + public DvbDeviceInfo[] newArray(int size) { + return new DvbDeviceInfo[size]; + } + }; + + private final int mAdapterId; + private final int mDeviceId; + + private DvbDeviceInfo(Parcel source) { + mAdapterId = source.readInt(); + mDeviceId = source.readInt(); + } + + /** + * Constructs a new {@link DvbDeviceInfo} with the given adapter ID and device ID. + */ + public DvbDeviceInfo(int adapterId, int deviceId) { + mAdapterId = adapterId; + mDeviceId = deviceId; + } + + /** + * Returns the adapter ID of DVB device, in terms of enumerating the DVB device adapters + * installed in the system. The adapter ID counts from zero. + */ + public int getAdapterId() { + return mAdapterId; + } + + /** + * Returns the device ID of DVB device, in terms of enumerating the DVB devices attached to + * the same device adapter. The device ID counts from zero. + */ + public int getDeviceId() { + return mDeviceId; + } + + // Parcelable + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(mAdapterId); + dest.writeInt(mDeviceId); + } +} diff --git a/media/java/android/media/tv/ITvInputManager.aidl b/media/java/android/media/tv/ITvInputManager.aidl index 078fb2f..6fe5dbb 100644 --- a/media/java/android/media/tv/ITvInputManager.aidl +++ b/media/java/android/media/tv/ITvInputManager.aidl @@ -18,6 +18,7 @@ package android.media.tv; import android.content.ComponentName; import android.graphics.Rect; +import android.media.tv.DvbDeviceInfo; import android.media.tv.ITvInputClient; import android.media.tv.ITvInputHardware; import android.media.tv.ITvInputHardwareCallback; @@ -29,6 +30,7 @@ import android.media.tv.TvStreamConfig; import android.media.tv.TvTrackInfo; import android.net.Uri; import android.os.Bundle; +import android.os.ParcelFileDescriptor; import android.view.Surface; /** @@ -91,4 +93,8 @@ interface ITvInputManager { boolean captureFrame(in String inputId, in Surface surface, in TvStreamConfig config, int userId); boolean isSingleSessionActive(int userId); + + // For DVB device binding + List<DvbDeviceInfo> getDvbDeviceList(); + ParcelFileDescriptor openDvbDevice(in DvbDeviceInfo info, int device); } diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java index 705aa3d6..e74860e 100644 --- a/media/java/android/media/tv/TvInputManager.java +++ b/media/java/android/media/tv/TvInputManager.java @@ -21,12 +21,14 @@ import android.annotation.Nullable; import android.annotation.SystemApi; import android.graphics.Rect; import android.media.MediaPlayer; +import android.media.tv.DvbDeviceInfo; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.Message; +import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.util.ArrayMap; import android.util.Log; @@ -42,6 +44,7 @@ import android.view.View; import com.android.internal.util.Preconditions; +import java.lang.IllegalArgumentException; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; @@ -55,6 +58,25 @@ import java.util.Map; public final class TvInputManager { private static final String TAG = "TvInputManager"; + static final int DVB_DEVICE_START = 0; + static final int DVB_DEVICE_END = 2; + + /** + * A demux device of DVB API for controlling the filters of DVB hardware/software. + * @hide + */ + public static final int DVB_DEVICE_DEMUX = DVB_DEVICE_START; + /** + * A DVR device of DVB API for reading transport streams. + * @hide + */ + public static final int DVB_DEVICE_DVR = 1; + /** + * A frontend device of DVB API for controlling the tuner and DVB demodulator hardware. + * @hide + */ + public static final int DVB_DEVICE_FRONTEND = DVB_DEVICE_END; + static final int VIDEO_UNAVAILABLE_REASON_START = 0; static final int VIDEO_UNAVAILABLE_REASON_END = 4; @@ -1258,6 +1280,43 @@ public final class TvInputManager { } /** + * Returns the list of currently available DVB devices on the system. + * + * @return the list of {@link DvbDeviceInfo} objects representing available DVB devices. + * @hide + */ + public List<DvbDeviceInfo> getDvbDeviceList() { + try { + return mService.getDvbDeviceList(); + } catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + /** + * Returns a {@link ParcelFileDescriptor} of a specified DVB device for a given + * {@link DvbDeviceInfo} + * + * @param info A {@link DvbDeviceInfo} to open a DVB device. + * @param device A DVB device. The DVB device can be {@link DVB_DEVICE_DEMUX}, + * {@link DVB_DEVICE_DVR} or {@link DVB_DEVICE_FRONTEND}. + * @return a {@link ParcelFileDescriptor} of a specified DVB device for a given + * {@link DvbDeviceInfo}, or {@code null} if the given {@link DvbDeviceInfo} was + * invalid or the specified DVB device was busy with a previous request. + * @hide + */ + public ParcelFileDescriptor openDvbDevice(DvbDeviceInfo info, int device) { + try { + if (DVB_DEVICE_START > device || DVB_DEVICE_END < device) { + throw new IllegalArgumentException("Invalid DVB device: " + device); + } + return mService.openDvbDevice(info, device); + } catch (RemoteException e) { + throw new RuntimeException(e); + } + } + + /** * The Session provides the per-session functionality of TV inputs. * @hide */ diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp index 84ae3b4..6c1bd97 100644 --- a/media/jni/soundpool/SoundPool.cpp +++ b/media/jni/soundpool/SoundPool.cpp @@ -738,12 +738,16 @@ void SoundChannel::play(const sp<Sample>& sample, int nextChannelID, float leftV // do not create a new audio track if current track is compatible with sample parameters #ifdef USE_SHARED_MEM_BUFFER newTrack = new AudioTrack(streamType, sampleRate, sample->format(), - channelMask, sample->getIMemory(), AUDIO_OUTPUT_FLAG_FAST, callback, userData); + channelMask, sample->getIMemory(), AUDIO_OUTPUT_FLAG_FAST, callback, userData, + 0 /*default notification frames*/, AUDIO_SESSION_ALLOCATE, + AudioTrack::TRANSFER_DEFAULT, + NULL /*offloadInfo*/, -1 /*uid*/, -1 /*pid*/, mSoundPool->attributes()); #else uint32_t bufferFrames = (totalFrames + (kDefaultBufferCount - 1)) / kDefaultBufferCount; newTrack = new AudioTrack(streamType, sampleRate, sample->format(), channelMask, frameCount, AUDIO_OUTPUT_FLAG_FAST, callback, userData, - bufferFrames); + bufferFrames, AUDIO_SESSION_ALLOCATE, AudioTrack::TRANSFER_DEFAULT, + NULL /*offloadInfo*/, -1 /*uid*/, -1 /*pid*/, mSoundPool->attributes()); #endif oldTrack = mAudioTrack; status = newTrack->initCheck(); diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index b702e35..377a9a4 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -48,6 +48,8 @@ <string name="wifi_security_psk_generic">@string/wifi_security_wpa_wpa2</string> <!-- Do not translate. Concise terminology for wifi with 802.1x EAP security --> <string name="wifi_security_eap">802.1x EAP</string> + <!-- Do not translate. Concise terminology for Passpoint network --> + <string name="wifi_security_passpoint">Passpoint</string> <!-- Summary for the remembered network. --> <string name="wifi_remembered">Saved</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index 1ad7a51..7049d6a 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -248,6 +248,9 @@ public class AccessPoint implements Comparable<AccessPoint> { public String getSecurityString(boolean concise) { Context context = mContext; + if (mConfig != null && mConfig.isPasspoint()) { + return context.getString(R.string.wifi_security_passpoint); + } switch(security) { case SECURITY_EAP: return concise ? context.getString(R.string.wifi_security_short_eap) : diff --git a/packages/SettingsProvider/res/values-gu-rIN/defaults.xml b/packages/SettingsProvider/res/values-gu-rIN/defaults.xml new file mode 100644 index 0000000..22443a5 --- /dev/null +++ b/packages/SettingsProvider/res/values-gu-rIN/defaults.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * 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. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string> + <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string> +</resources> diff --git a/packages/SettingsProvider/res/values-gu-rIN/strings.xml b/packages/SettingsProvider/res/values-gu-rIN/strings.xml new file mode 100644 index 0000000..7241974 --- /dev/null +++ b/packages/SettingsProvider/res/values-gu-rIN/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2007, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="4567566098528588863">"સેટિંગ્સ સંગ્રહ"</string> +</resources> diff --git a/packages/SettingsProvider/res/values-sq-rAL/strings.xml b/packages/SettingsProvider/res/values-sq-rAL/strings.xml new file mode 100644 index 0000000..a8e66d5 --- /dev/null +++ b/packages/SettingsProvider/res/values-sq-rAL/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2007, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="4567566098528588863">"Hapësira ruajtëse e \"Cilësimeve\""</string> +</resources> diff --git a/packages/Shell/res/values-hy-rAM/strings.xml b/packages/Shell/res/values-hy-rAM/strings.xml index a254192..6a5358b 100644 --- a/packages/Shell/res/values-hy-rAM/strings.xml +++ b/packages/Shell/res/values-hy-rAM/strings.xml @@ -17,7 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_label" msgid="3701846017049540910">"Խեցի"</string> - <string name="bugreport_finished_title" msgid="2293711546892863898">"Վրիպակի զեկույց ստացվեց"</string> + <string name="bugreport_finished_title" msgid="2293711546892863898">"Վրիպակի զեկույց է ստացվել"</string> <string name="bugreport_finished_text" product="watch" msgid="8389172248433597683">"Սահեցրեք ձախ՝ սխալի հաշվետվությունը համօգտագործելու համար"</string> <string name="bugreport_finished_text" product="default" msgid="3559904746859400732">"Հպեք` ձեր վրիպակի մասին զեկույցը տարածելու համար"</string> <string name="bugreport_confirm" msgid="5130698467795669780">"Վրիպակի զեկույցները պարունակում են տվյալներ համակարգի տարբեր մուտքի ֆայլերից, այդ թվում նաև անհատական և գաղտնի տեղեկություններ: Վրիպակի զեկույցները կիսեք միայն այն հավելվածների և մարդկանց հետ, որոնց վստահում եք:"</string> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index da3d56b..104e5e3 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Jy is in die Work-profiel"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 8e5a18d..99de3d8 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"እርስዎ በስራ መገለጫ ውስጥ ነዎት"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index a0c6154..0b5af65 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -402,4 +402,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"أنت في الملف الشخصي للعمل"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 1c54cbe..073ddaa 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Влезли сте в потребителски профил в Work"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml index 90c4fe8..6590d77 100644 --- a/packages/SystemUI/res/values-bn-rBD/strings.xml +++ b/packages/SystemUI/res/values-bn-rBD/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"আপনি কাজের প্রোফাইলে রয়েছেন"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index c5f1370..e89fa3a2 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Estàs utilitzant el perfil professional"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 641952f..829b4a4 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -402,4 +402,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Nacházíte se v pracovním profilu"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 08aceee..7df138d 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Du er i arbejdsprofilen"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index bedb707..8765ef6 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Sie befinden sich im Arbeitsprofil."</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 89462c3..abc3f79 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Χρησιμοποιείτε προφίλ εργασίας"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index bfe4107..2de7a60 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"You are in the Work profile"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index bfe4107..2de7a60 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"You are in the Work profile"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index bfe4107..2de7a60 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"You are in the Work profile"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 67cddea..7a47b11 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Estás usando el perfil de Work."</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 9ffc53c..10a58cf 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Estás en el perfil de trabajo"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml index 077a3cd..132e867 100644 --- a/packages/SystemUI/res/values-et-rEE/strings.xml +++ b/packages/SystemUI/res/values-et-rEE/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Olete tööprofiilil"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml index 0b18d79..d1b5c02 100644 --- a/packages/SystemUI/res/values-eu-rES/strings.xml +++ b/packages/SystemUI/res/values-eu-rES/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Work profil bat erabiltzen ari zara"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 98e49f0..d611335 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"در نمایه کاری هستید"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 921b982..ced87b2 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Olet Work-profiilissa"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 6de1561..781f932 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Vous avez activé le profil professionnel"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 9e4e5fe..f6ad433 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Vous consultez le profil professionnel."</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml index 3c319cb..03ece76 100644 --- a/packages/SystemUI/res/values-gl-rES/strings.xml +++ b/packages/SystemUI/res/values-gl-rES/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Está no perfil de traballo"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-gu-rIN/strings.xml b/packages/SystemUI/res/values-gu-rIN/strings.xml index 499553e..809616e 100644 --- a/packages/SystemUI/res/values-gu-rIN/strings.xml +++ b/packages/SystemUI/res/values-gu-rIN/strings.xml @@ -83,9 +83,11 @@ <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_voice_assist_button" msgid="487611083884852965">"વૉઇસ સહાય"</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="voice_assist_label" msgid="3956854378310019854">"વૉઇસ સહાય ખોલો"</string> <string name="camera_label" msgid="7261107956054836961">"કૅમેરો ખોલો"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"નવું કાર્ય લેઆઉટ પસંદ કરો"</string> <string name="cancel" msgid="6442560571259935130">"રદ કરો"</string> @@ -121,6 +123,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX બે બાર."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX ત્રણ બાર."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"પૂર્ણ WiMAX સિગ્નલ."</string> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"ઇથરનેટ ડિસ્કનેક્ટ થયું."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"ઇથરનેટ કનેક્ટ થયું."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"કોઈ સિગ્નલ નથી."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"કનેક્ટ થયેલ નથી."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"શૂન્ય બાર."</string> @@ -162,13 +166,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> કાઢી નાખી."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"તમામ તાજેતરની એપ્લિકેશન્સ કાઢી નાખી."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> પ્રારંભ કરી રહ્યું છે."</string> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"સૂચના કાઢી નાખી."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"સૂચના શેડ."</string> <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_confirm" msgid="3446792278337969766">"પુષ્ટિ કરો"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"બંધ કરો"</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> @@ -180,7 +185,7 @@ <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_dnd_priority_on" msgid="1448402297221249355">"ખલેલ પાડશો નહીં ચાલુ, ફક્ત પ્રાધાન્યતા."</string> - <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"ખલેલ પાડશો નહીં ચાલુ, કોઈ વિક્ષેપ નહીં."</string> + <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"ખલેલ પાડશો નહીં ચાલુ, સાવ શાંતિ."</string> <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"ખલેલ પાડશો નહીં ચાલુ, ફક્ત એલાર્મ્સ."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"ખલેલ પાડશો નહીં બંધ."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"ખલેલ પાડશો નહીં બંધ કર્યું."</string> @@ -235,7 +240,7 @@ <string name="quick_settings_dnd_label" msgid="8735855737575028208">"ખલેલ પાડશો નહીં"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ફક્ત પ્રાધાન્યતા"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ફક્ત એલાર્મ્સ"</string> - <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"કોઈ વિક્ષેપ નહીં"</string> + <string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"સાવ શાંતિ"</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> @@ -302,26 +307,20 @@ <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_priority_introduction" msgid="7253045784560169993">"તમને તમે ઉલ્લેખિત એલાર્મ્સ, સ્મૃતિપત્રો, ઇવેન્ટ્સ અને કૉલર્સ સિવાય સાઉન્ડ્સ અને વાઇબ્રેશન્સથી ખલેલ પહોંચાડવામાં આવશે નહીં."</string> + <string name="zen_priority_introduction" msgid="3070506961866919502">"તમને તમે ઉલ્લેખિત એલાર્મ્સ, સ્મૃતિપત્રો, ઇવેન્ટ્સ અને કૉલર્સ સિવાયના ધ્વનિઓ અને વાઇબ્રેશન્સથી ખલેલ પહોંચાડવામાં આવશે નહીં."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"કસ્ટમાઇઝ કરો"</string> - <string name="zen_no_interruptions" msgid="7970973750143632592">"કોઈ વિક્ષેપ નહીં"</string> - <string name="zen_important_interruptions" msgid="3477041776609757628">"ફક્ત પ્રાધાન્યતા વિક્ષેપો"</string> - <string name="zen_alarms" msgid="5055668280767657759">"ફક્ત એલાર્મ્સ"</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="zen_silence_introduction" msgid="575422795504098868">"આ એલાર્મ્સ, સંગીત, વિડિઓઝ અને રમતો સહિત બધા ધ્વનિઓ અને વાઇબ્રેશન્સને અવરોધિત કરે છે. તમે હજુ પણ ફોન કૉલ્સ કરવા માટે સમર્થ હશો."</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="phone_hint" msgid="3101468054914424646">"ફોન માટે જમણે સ્વાઇપ કરો"</string> - <string name="camera_hint" msgid="5241441720959174226">"કૅમેરા માટે ડાબે સ્વાઇપ કરો"</string> - <string name="interruption_level_none" msgid="8284541443482072628">"કોઈ વિક્ષેપ નહીં"</string> + <string name="phone_hint" msgid="4872890986869209950">"ફોન માટે આયકનમાંથી સ્વાઇપ કરો"</string> + <string name="voice_hint" msgid="8939888732119726665">"વૉઇસ સહાય માટે આયકનમાંથી સ્વાઇપ કરો"</string> + <string name="camera_hint" msgid="7939688436797157483">"કૅમેરા માટે આયકનમાંથી સ્વાઇપ કરો"</string> + <string name="interruption_level_none" msgid="6000083681244492992">"સાવ શાંતિ"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"ફક્ત પ્રાધાન્યતા"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"ફક્ત એલાર્મ્સ"</string> - <string name="interruption_level_all" msgid="1330581184930945764">"તમામ"</string> - <string name="interruption_level_none_twoline" msgid="3942121050170227056">"કોઈ\nવિક્ષેપ નહીં"</string> + <string name="interruption_level_none_twoline" msgid="3957581548190765889">"સાવ\nશાંતિ"</string> <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"ફક્ત\nપ્રાધાન્યતા"</string> <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"ફક્ત\nએલાર્મ્સ"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"ચાર્જ થઈ રહ્યું છે (પૂર્ણ થવામાં <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> બાકી)"</string> @@ -363,12 +362,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN અક્ષમ કરો"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN ડિસ્કનેક્ટ કરો"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"તમારું ઉપકરણ <xliff:g id="ORGANIZATION">%1$s</xliff:g> દ્વારા સંચાલિત થાય છે.\n\nતમારા વ્યવસ્થાપક સેટિંગ્સ, કોર્પોરેટ ઍક્સેસ, એપ્લિકેશન્સ, તમારા ઉપકરણ સાથે સંકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતી મોનિટર અને સંચાલિત કરી શકે છે. વધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો."</string> - <string name="monitoring_description_profile_owned" msgid="8110044290898637925">"તમારી કાર્ય પ્રોફાઇલ <xliff:g id="ORGANIZATION">%1$s</xliff:g> દ્વારા સંચાલિત થાય છે.\n\nતમારા વ્યવસ્થાપક, ઇમેઇલ્સ, એપ્લિકેશન્સ અને સુરક્ષિત વેબસાઇટ્સ સહિતની તમારી નેટવર્ક પ્રવૃત્તિ મોનિટર કરવા માટે સક્ષમ છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો."</string> - <string name="monitoring_description_device_and_profile_owned" msgid="1664428184778531249">"તમારું ઉપકરણ આમના દ્વારા સંચાલિત થાય છે:\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" msgid="912328761766161919">"તમે એક એપ્લિકેશનને VPN કનેક્શનને સેટ કરવાની પરવાનગી આપી છે.\n\nઆ એપ્લિકેશન તમારા ઉપકરણ અને ઇમેઇલ્સ, એપ્લિકેશન્સ અને સુરક્ષિત વેબસાઇટ્સ સહિત નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે."</string> + <string name="monitoring_description_vpn" msgid="996222259035614736">"તમે VPN કનેક્શન સેટ કરવા માટે એપ્લિકેશન પરવાનગી આપી.\n\nઆ એપ્લિકેશન ઇમેઇલ્સ, એપ્લિકેશન્સ અને વેબસાઇટ્સ સહિત તમારા ઉપકરણ અને નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"તમારું ઉપકરણ <xliff:g id="ORGANIZATION">%1$s</xliff:g> દ્વારા સંચાલિત થાય છે.\n\nતમારા વ્યવસ્થાપક સેટિંગ્સ, કોર્પોરેટ ઍક્સેસ, એપ્લિકેશન્સ, તમારા ઉપકરણ સાથે સંકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતી મોનિટર અને સંચાલિત કરી શકે છે.\n\nતમે VPN સાથે કનેક્ટ થયેલા છો જે ઇમેઇલ્સ, એપ્લિકેશન્સ અને વેબસાઇટ્સ સહિતની, તમારી નેટવર્ક પ્રવૃત્તિ મોનિટર કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો."</string> - <string name="monitoring_description_vpn_profile_owned" msgid="2224494839524715272">"તમારી કાર્ય પ્રોફાઇલ <xliff:g id="ORGANIZATION">%1$s</xliff:g> દ્વારા સંચાલિત થાય છે.\n\nતમારા વ્યવસ્થાપક, ઇમેઇલ્સ, એપ્લિકેશન્સ અને સુરક્ષિત વેબસાઇટ્સ સહિતની તમારી નેટવર્ક પ્રવૃત્તિ મોનિટર કરવા માટે સક્ષમ છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો.\n\nતમે VPN સાથે પણ કનેક્ટ થયેલ છો, જે તમારી નેટવર્ક પ્રવૃત્તિને મોનિટર કરી શકે છે."</string> - <string name="monitoring_description_vpn_device_and_profile_owned" msgid="2198546817407897093">"આ ઉપકરણ <xliff:g id="ORGANIZATION_0">%1$s</xliff:g> દ્વારા સંચાલિત થાય છે.\nતમારી પ્રોફાઇલ આના દ્વારા સંચાલિત થાય છે:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>.\n\nતમારા વ્યવસ્થાપક ઇમેઇલ્સ, એપ્લિકેશન્સ અને સુરક્ષિત વેબસાઇટ્સ સહિત તમારી નેટવર્ક પ્રવૃત્તિનું નિરીક્ષણ કરવામાં સક્ષમ હોય છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો.\n\nતમે VPN સાથે પણ કનેક્ટ થયેલ છો, જે તમારી વ્યક્તિગત માહિતીને મોનિટર કરી શકે છે"</string> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"તમારી કાર્ય પ્રોફાઇલ <xliff:g id="ORGANIZATION">%1$s</xliff:g> દ્વારા સંચાલિત થાય છે.\n\nતમારા વ્યવસ્થાપક ઇમેઇલ્સ, એપ્લિકેશન્સ અને વેબસાઇટ્સ સહિતની તમારી નેટવર્ક પ્રવૃત્તિને મૉનિટર કરવામાં સમર્થ છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો.\n\nતમે VPN સાથે પણ કનેક્ટ છો, જે તમારી નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"તમે <xliff:g id="APPLICATION">%1$s</xliff:g> સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, એપ્લિકેશન્સ અને વેબસાઇટ્સ સહિતની તમારી નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"તમે <xliff:g id="APPLICATION">%1$s</xliff:g> સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, એપ્લિકેશન્સ અને વેબસાઇટ્સ સહિતની તમારી વ્યક્તિગત નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"તમારી કાર્ય પ્રોફાઇલ <xliff:g id="ORGANIZATION">%1$s</xliff:g> દ્વારા સંચાલિત થાય છે. તે <xliff:g id="APPLICATION">%2$s</xliff:g> સાથે કનેક્ટ થયેલ છે, જે ઇમેઇલ્સ, એપ્લિકેશન્સ અને વેબસાઇટ્સ સહિતની તમારી કાર્ય નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"તમારી કાર્ય પ્રોફાઇલ <xliff:g id="ORGANIZATION">%1$s</xliff:g> દ્વારા સંચાલિત થાય છે. તે <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> સાથે કનેક્ટ થયેલ છે, જે ઇમેઇલ્સ, એપ્લિકેશન્સ અને વેબસાઇટ્સ સહિતની તમારી કાર્ય નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે.\n\nતમે <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> સાથે પણ કનેક્ટ થયેલ છો, જે તમારી વ્યક્તિગત નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"તમારું ઉપકરણ <xliff:g id="ORGANIZATION">%1$s</xliff:g> દ્વારા સંચાલિત થાય છે.\n\nતમારા વ્યવસ્થાપક, સેટિંગ્સ, કોર્પોરેટ ઍક્સેસ, એપ્લિકેશન્સ, તમારા ઉપકરણ સાથે સંકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતીને મૉનિટર કરી અને સંચાલિત કરી શકે છે.\n\nતમે <xliff:g id="APPLICATION">%2$s</xliff:g> સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, એપ્લિકેશન્સ અને વેબસાઇટ્સ સહિતની તમારી નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો."</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> @@ -377,6 +379,9 @@ <string name="notification_expand_button_text" msgid="1037425494153780718">"બધું જુઓ"</string> <string name="notification_collapse_button_text" msgid="6883253262134328057">"બધું છુપાવો"</string> <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> + <string name="volume_zen_end_now" msgid="3179845345429841822">"હવે સમાપ્ત કરો"</string> + <string name="accessibility_volume_expand" msgid="5946812790999244205">"વિસ્તૃત કરો"</string> + <string name="accessibility_volume_collapse" msgid="3609549593031810875">"સંકુચિત કરો"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"સ્ક્રીન પિન કરેલ છે"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યમાં રાખે છે. અનપિન કરવા માટે બેકને ટચ કરો અને પકડો અને તે જ સમયે વિહંગાવલોકન કરો."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યમાં રાખે છે. અનપિન કરવા માટે વિહંગાવલોકનને ટચ કરો અને પકડો."</string> @@ -391,4 +396,12 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> એ વૉલ્યૂમ સંવાદ છે"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"મૂળને પુનઃસ્થાપિત કરવા માટે ટચ કરો."</string> <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"તમે કાર્ય પ્રોફાઇલમાં છો"</string> + <!-- no translation found for system_ui_tuner (8982911407690974001) --> + <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 182677a..b2bd1b8 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"आप कार्य प्रोफ़ाइल में हैं"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index f03d40d..abec5af 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -399,4 +399,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Nalazite se na profilu Worka"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 41fdefe..d2108f4 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"A munkaprofilt használja"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml index 8ea36bc..4ccc304 100644 --- a/packages/SystemUI/res/values-hy-rAM/strings.xml +++ b/packages/SystemUI/res/values-hy-rAM/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Դուք աշխատանքային պրոֆիլում եք"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index a5629c3..80d631a 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Anda berada di Profil kerja"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml index 21b81ae..50a7b49 100644 --- a/packages/SystemUI/res/values-is-rIS/strings.xml +++ b/packages/SystemUI/res/values-is-rIS/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Þú ert í vinnusniðinu"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index f3b024a..339cc8b 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Hai attivato il profilo di lavoro"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 479177c..aaf3fa3 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"אתה נמצא בפרופיל העבודה"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index ba901e8..729945d 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"仕事用プロファイルを使用しています"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml index 32701af..de41277 100644 --- a/packages/SystemUI/res/values-ka-rGE/strings.xml +++ b/packages/SystemUI/res/values-ka-rGE/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"თქვენ სამუშაო პროფილში ხართ"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml index e658129..6338b12 100644 --- a/packages/SystemUI/res/values-kk-rKZ/strings.xml +++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Жұмыс профиліндесіз"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml index 450685e..97c2fae 100644 --- a/packages/SystemUI/res/values-km-rKH/strings.xml +++ b/packages/SystemUI/res/values-km-rKH/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"អ្នកកំពុងនៅក្នុងប្រវត្តិរូបការងារ"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml index 4ef036e..9580004 100644 --- a/packages/SystemUI/res/values-kn-rIN/strings.xml +++ b/packages/SystemUI/res/values-kn-rIN/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"ನೀವು ಕೆಲಸದ ಪ್ರೊಫೈಲ್ನಲ್ಲಿರುವಿರಿ"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 2072347..45dc188 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"현재 직장 프로필에 있음"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml index 18880dd..be7c577 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings.xml @@ -339,9 +339,9 @@ <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="4872890986869209950">"Сүрөтчөнү нукуп, телефонго өтүңүз"</string> - <string name="voice_hint" msgid="8939888732119726665">"Сүрөтчөнү нукуп, үн жардамчысына өтүңүз"</string> - <string name="camera_hint" msgid="7939688436797157483">"Сүрөтчөнү нукуп, камерага өтүңүз"</string> + <string name="phone_hint" msgid="4872890986869209950">"Сүрөтчөнү серпип телефонго өтүңүз"</string> + <string name="voice_hint" msgid="8939888732119726665">"Сүрөтчөнү серпип үн жардамчысына өтүңүз"</string> + <string name="camera_hint" msgid="7939688436797157483">"Сүрөтчөнү серпип камерага өтүңүз"</string> <string name="interruption_level_none" msgid="6000083681244492992">"Тымтырс"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Артыкчылык гана"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Ойготкучтар гана"</string> @@ -405,8 +405,8 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Баарын жашыруу"</string> <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> <string name="volume_zen_end_now" msgid="3179845345429841822">"Азыр бүтүрүү"</string> - <string name="accessibility_volume_expand" msgid="5946812790999244205">"Жаюу"</string> - <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Жыйноо"</string> + <string name="accessibility_volume_expand" msgid="5946812790999244205">"Жайып көрсөтүү"</string> + <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Жыйнап коюу"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Экран кадалган"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Бул бошотулмайынча көрүнө берет. Бошотуу үчүн, бир убакта Артка жана Карап чыгууну коё бербей басып туруңуз."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Бул бошотулмайынча көрүнө берет. Бошотуу үчүн, Карап чыгууну коё бербей басып туруңуз."</string> @@ -423,4 +423,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Сиз Жумуш профилиндесиз"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml index 20b780f..63d569c 100644 --- a/packages/SystemUI/res/values-lo-rLA/strings.xml +++ b/packages/SystemUI/res/values-lo-rLA/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"ທ່ານຢູ່ໃນໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 43b32b0..d8106b2 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Naudojate „Work“ profilį"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 1124e4b..a941359 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -399,4 +399,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Jūs esat pierakstījies darba profilā."</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml index 48ae8fd..276d771 100644 --- a/packages/SystemUI/res/values-mk-rMK/strings.xml +++ b/packages/SystemUI/res/values-mk-rMK/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Вие сте во работен профил"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml index ce277a2..612ca16 100644 --- a/packages/SystemUI/res/values-ml-rIN/strings.xml +++ b/packages/SystemUI/res/values-ml-rIN/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"നിങ്ങൾ ഔദ്യോഗിക പ്രൊഫൈലിൽ ആണ്"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml index 65b9c98..72a0aba 100644 --- a/packages/SystemUI/res/values-mn-rMN/strings.xml +++ b/packages/SystemUI/res/values-mn-rMN/strings.xml @@ -396,4 +396,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Та Work профайлд байна"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml index 1aaa171..27abc44 100644 --- a/packages/SystemUI/res/values-mr-rIN/strings.xml +++ b/packages/SystemUI/res/values-mr-rIN/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"आपण कार्य प्रोफाईल मध्ये आहात"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml index e29e2e7..2336643 100644 --- a/packages/SystemUI/res/values-ms-rMY/strings.xml +++ b/packages/SystemUI/res/values-ms-rMY/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Anda berada dalam profil Kerja"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml index b76791b..45753dc 100644 --- a/packages/SystemUI/res/values-my-rMM/strings.xml +++ b/packages/SystemUI/res/values-my-rMM/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"သင်သည် အလုပ်ပရိုဖိုင်တွင် ဖြစ်သည်"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 5348630..9e18705 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Du er i Work-profilen"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml index 8f7e2a3..e3ea513 100644 --- a/packages/SystemUI/res/values-ne-rNP/strings.xml +++ b/packages/SystemUI/res/values-ne-rNP/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"तपाईँ कार्य प्रोफाइलमा हुनुहुन्छ"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index bd38a7d..34616c8 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"U bevindt zich in het werkprofiel"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pa-rIN/strings.xml b/packages/SystemUI/res/values-pa-rIN/strings.xml index 723a4d4..f082631 100644 --- a/packages/SystemUI/res/values-pa-rIN/strings.xml +++ b/packages/SystemUI/res/values-pa-rIN/strings.xml @@ -83,9 +83,11 @@ <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_voice_assist_button" msgid="487611083884852965">"ਵੌਇਸ ਅਸਿਸਟ"</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="voice_assist_label" msgid="3956854378310019854">"ਵੌਇਸ ਅਸਿਸਟ ਖੋਲ੍ਹੋ"</string> <string name="camera_label" msgid="7261107956054836961">"ਕੈਮਰਾ ਖੋਲ੍ਹੋ"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"ਨਵਾਂ ਕੰਮ ਲੇਆਉਟ ਚੁਣੋ"</string> <string name="cancel" msgid="6442560571259935130">"ਰੱਦ ਕਰੋ"</string> @@ -121,6 +123,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX ਦੋ ਬਾਰਸ।"</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX ਤਿੰਨ ਬਾਰਸ।"</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX ਸਿਗਨਲ ਪੂਰਾ।"</string> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"ਈਥਰਨੈੱਟ ਡਿਸਕਨੈਕਟ ਹੋ ਗਿਆ।"</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"ਈਥਰਨੈੱਟ ਕਨੈਕਟ ਹੋ ਗਿਆ।"</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"ਕੋਈ ਸਿਗਨਲ ਨਹੀਂ।"</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ।"</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"ਸਿਫ਼ਰ ਬਾਰਸ।"</string> @@ -162,13 +166,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ਰੱਦ ਕੀਤਾ।"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ਸਾਰੀਆਂ ਹਾਲੀਆ ਐਪਲੀਕੇਸ਼ਨਾਂ ਰੱਦ ਕੀਤੀਆਂ।"</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> ਚਾਲੂ ਕਰ ਰਿਹਾ ਹੈ।"</string> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"ਸੂਚਨਾ ਰੱਦ ਕੀਤੀ।"</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"ਸੂਚਨਾ ਸ਼ੇਡ।"</string> <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_confirm" msgid="3446792278337969766">"ਪੁਸ਼ਟੀ ਕਰੋ"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"ਬੰਦ ਕਰੋ"</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> @@ -180,7 +185,7 @@ <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_dnd_priority_on" msgid="1448402297221249355">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਚਾਲੂ, ਕੇਵਲ ਤਰਜੀਹੀ।"</string> - <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਚਾਲੂ, ਕੋਈ ਰੁਕਾਵਟਾਂ ਨਹੀਂ।"</string> + <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਚਾਲੂ ਕਰੋ, ਕੁਲ ਚੁੱਪੀ।"</string> <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਚਾਲੂ, ਕੇਵਲ ਅਲਾਰਮ।"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਬੰਦ।"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਬੰਦ ਕੀਤਾ।"</string> @@ -235,7 +240,7 @@ <string name="quick_settings_dnd_label" msgid="8735855737575028208">"ਮੈਨੂੰ ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ਕੇਵਲ ਤਰਜੀਹੀ"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ਕੇਵਲ ਅਲਾਰਮ"</string> - <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"ਕੋਈ ਰੁਕਾਵਟਾਂ ਨਹੀਂ"</string> + <string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"ਕੁਲ ਚੁੱਪੀ"</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> @@ -302,26 +307,20 @@ <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_priority_introduction" msgid="7253045784560169993">"ਤੁਹਾਨੂੰ ਤੁਹਾਡੇ ਦੁਆਰਾ ਨਿਰਦਿਸ਼ਟ ਅਲਾਰਮ, ਰਿਮਾਈਂਡਰ, ਇਵੈਂਟਸ, ਅਤੇ ਕਾਲਰਸ ਤੋਂ ਇਲਾਵਾ, ਧੁਨੀ ਅਤੇ ਵਾਇਬ੍ਰੇਸ਼ਨ ਤੋਂ ਪਰੇਸ਼ਾਨ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ."</string> + <string name="zen_priority_introduction" msgid="3070506961866919502">"ਤੁਹਾਨੂੰ ਤੁਹਾਡੇ ਦੁਆਰਾ ਨਿਰਦਿਸ਼ਟ ਅਲਾਰਮ, ਰਿਮਾਈਂਡਰ, ਇਵੈਂਟਸ, ਅਤੇ ਕਾਲਰਸ ਤੋਂ ਇਲਾਵਾ, ਧੁਨੀ ਅਤੇ ਵਾਇਬ੍ਰੇਸ਼ਨ ਤੋਂ ਪਰੇਸ਼ਾਨ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ।"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"ਅਨੁਕੂਲਿਤ ਕਰੋ"</string> - <string name="zen_no_interruptions" msgid="7970973750143632592">"ਕੋਈ ਰੁਕਾਵਟਾਂ ਨਹੀਂ"</string> - <string name="zen_important_interruptions" msgid="3477041776609757628">"ਕੇਵਲ ਤਰਜੀਹ ਰੁਕਾਵਟਾਂ"</string> - <string name="zen_alarms" msgid="5055668280767657759">"ਕੇਵਲ ਅਲਾਰਮ"</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="zen_silence_introduction" msgid="575422795504098868">"ਇਹ ਅਲਾਰਮ, ਸੰਗੀਤ, ਵੀਡੀਓਜ਼, ਅਤੇ ਗੇਮਸ ਸਮੇਤ, ਸਾਰੀ ਦੁਨੀ ਅਤੇ ਵਾਇਬ੍ਰੇਸ਼ਨ ਨੂੰ ਬਲੌਕ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ ਅਜੇ ਵੀ ਫ਼ੋਨ ਕਾਲ ਕਰਨ ਦੇ ਯੋਗ ਹੋਵੋਗੇ।"</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="phone_hint" msgid="3101468054914424646">"ਫੋਨ ਲਈ ਸੱਜੇ ਪਾਸੇ ਸਵਾਈਪ ਕਰੋ"</string> - <string name="camera_hint" msgid="5241441720959174226">"ਕੈਮਰੇ ਲਈ ਖੱਬੇ ਪਾਸੇ ਸਵਾਈਪ ਕਰੋ"</string> - <string name="interruption_level_none" msgid="8284541443482072628">"ਕੋਈ ਰੁਕਾਵਟਾਂ ਨਹੀਂ"</string> + <string name="phone_hint" msgid="4872890986869209950">"ਫ਼ੋਨ ਲਈ ਆਈਕਨ ਤੋਂ ਸਵਾਈਪ ਕਰੋ"</string> + <string name="voice_hint" msgid="8939888732119726665">"ਵੌਇਸ ਅਸਿਸਟ ਲਈ ਆਈਕਨ ਤੋਂ ਸਵਾਈਪ ਕਰੋ"</string> + <string name="camera_hint" msgid="7939688436797157483">"ਕੈਮਰੇ ਲਈ ਆਈਕਨ ਤੋਂ ਸਵਾਈਪ ਕਰੋ"</string> + <string name="interruption_level_none" msgid="6000083681244492992">"ਕੁਲ ਚੁੱਪੀ"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"ਕੇਵਲ ਤਰਜੀਹੀ"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"ਕੇਵਲ ਅਲਾਰਮ"</string> - <string name="interruption_level_all" msgid="1330581184930945764">"ਸਭ"</string> - <string name="interruption_level_none_twoline" msgid="3942121050170227056">"ਕੋਈ\nਰੁਕਾਵਟਾਂ ਨਹੀਂ"</string> + <string name="interruption_level_none_twoline" msgid="3957581548190765889">"ਕੁਲ \n ਚੁੱਪੀ"</string> <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"ਕੇਵਲ\nਤਰਜੀਹੀ"</string> <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"ਕੇਵਲ\nਅਲਾਰਮ"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"ਚਾਰਜਿੰਗ (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> ਪੂਰਾ ਹੋਣ ਤੱਕ)"</string> @@ -363,12 +362,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN ਨੂੰ ਅਸਮਰੱਥ ਬਣਾਓ"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN ਨੂੰ ਡਿਸਕਨੈਕਟ ਕਰੋ"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"ਤੁਹਾਡੀ ਡਿਵਾਈਸ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਵੱਲੋਂ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਸ, ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਨਾਲ ਸੰਬੰਧਿਤ ਡਾਟਾ ਅਤੇ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਦੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਜਾਣਕਾਰੀ ਦਾ ਨਿਰੀਖਣ ਅਤੇ ਉਸਨੂੰ ਵਿਵਸਥਿਤ ਕਰ ਸਕਦਾ ਹੈ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string> - <string name="monitoring_description_profile_owned" msgid="8110044290898637925">"ਤੁਹਾਡੀ ਕੰਮ ਪ੍ਰੋਫਾਈਲ <xliff:g id="ORGANIZATION">%1$s</xliff:g>ਵੱਲੋਂ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਬੰਧਕ ਤੁਹਾਡੀ ਨੈਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰਨ ਵਿੱਚ ਸਮਰੱਥ ਹੈ, ਈਮੇਲਾਂ, ਐਪਸ ਅਤੇ ਸੁਰੱਖਿਅਤ ਵੈਬਸਾਈਟਾਂ ਸਮੇਤ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣਾ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string> - <string name="monitoring_description_device_and_profile_owned" msgid="1664428184778531249">"ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਇਸ ਵੱਲੋਂ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ:\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" msgid="912328761766161919">"ਤੁਸੀਂ ਇੱਕ ਐਪ ਨੂੰ ਇੱਕ VPN ਕਨੈਕਸ਼ਨ ਸੈਟ ਅਪ ਕਰਨ ਦੀ ਅਨੁਮਤੀ ਦਿੱਤੀ ਹੈ।\n\nਇਹ ਐਪ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਅਤੇ ਨੈਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ, ਈਮੇਲਾਂ, ਐਪਸ ਅਤੇ ਸੁਰੱਖਿਅਤ ਵੈਬਸਾਈਟਾਂ ਸਮੇਤ।"</string> + <string name="monitoring_description_vpn" msgid="996222259035614736">"ਤੁਸੀਂ ਕਿਸੇ ਐਪ ਨੂੰ ਇੱਕ ਕਨੈਕਸ਼ਨ ਸੈੱਟ ਅੱਪ ਕਰਨ ਦੀ ਅਨੁਮਤੀ ਦਿੱਤੀ ਹੈ।\n\nਇਹ ਐਪ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈੱਬਪੰਨੇ ਸਮੇਤ ਆਪਣੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।"</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"ਤੁਹਾਡੀ ਡਿਵਾਈਸ <xliff:g id="ORGANIZATION">%1$s</xliff:g>ਵੱਲੋਂ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਸ, ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਨਾਲ ਸੰਬੰਧਿਤ ਡਾਟਾ ਅਤੇ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਦੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਜਾਣਕਾਰੀ ਦਾ ਨਿਰੀਖਣ ਅਤੇ ਉਸਨੂੰ ਵਿਵਸਥਿਤ ਕਰ ਸਕਦਾ ਹੈ।\n\nਤੁਸੀਂ ਇੱਕ VPN ਨਾਲ ਵੀ ਕਨੈਕਟ ਕੀਤਾ ਹੈ, ਜੋ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ, ਈਮੇਲਾਂ, ਐਪਸ ਅਤੇ ਵੈਬਸਾਈਟਾਂ ਸਮੇਤ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string> - <string name="monitoring_description_vpn_profile_owned" msgid="2224494839524715272">"ਤੁਹਾਡੀ ਕੰਮ ਪ੍ਰੋਫਾਈਲ <xliff:g id="ORGANIZATION">%1$s</xliff:g>ਵੱਲੋਂ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਬੰਧਕ ਤੁਹਾਡੀ ਨੈਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰਨ ਵਿੱਚ ਸਮਰੱਥ ਹੈ, ਈਮੇਲਾਂ, ਐਪਸ ਅਤੇ ਸੁਰੱਖਿਅਤ ਵੈਬਸਾਈਟਾਂ ਸਮੇਤ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣਾ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।\n\nਤੁਸੀਂ ਇੱਕ VPN ਨਾਲ ਵੀ ਕਨੈਕਟ ਕੀਤਾ ਹੈ, ਜੋ ਤੁਹਾਡੀ ਨੈਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ।"</string> - <string name="monitoring_description_vpn_device_and_profile_owned" msgid="2198546817407897093">"ਤੁਹਾਡੀ ਡਿਵਾਈਸ <xliff:g id="ORGANIZATION_0">%1$s</xliff:g>ਵੱਲੋਂ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\nਤੁਹਾਡੀ ਕੰਮ ਪ੍ਰੋਫਾਈਲ ਇਸ ਵੱਲੋਂ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>.\n\nਤੁਹਾਡਾ ਪ੍ਰਬੰਧਕ ਤੁਹਾਡੀ ਨੈਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰਨ ਵਿੱਚ ਸਮਰੱਥ ਹੈ ਜਿਸ ਵਿੱਚ ਸ਼ਾਮਲ ਹਨ ਈਮੇਲਾਂ, ਐਪਸ ਅਤੇ ਸੁਰੱਖਿਅਤ ਵੈਬਸਾਈਟਾਂ। \n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।\n\nਤੁਸੀਂ ਇੱਕ VPN ਨਾਲ ਵੀ ਕਨੈਕਟ ਕੀਤਾ ਹੈ, ਜੋ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ"</string> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਈਮੇਲ, ਐਪਸ, ਅਤੇ ਵੈੱਬਪੰਨੇ ਸੰਤੇ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰਨ ਦੇ ਸਮਰੱਥ ਹੈ।\n\nਵਧੇਰੇ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।\n\nਤੁਸੀਂ VPN ਨਾਲ ਵੀ ਕਨੈਕਟ ਹੋ, ਜੋ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।"</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"ਤੁਸੀਂ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈੱਬਪੰਨੇ ਸਮੇਤ ਆਪਣੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।"</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"ਤੁਸੀਂ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈੱਬਪੰਨੇ ਸਮੇਤ ਆਪਣੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।"</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਤੁਸੀਂ <xliff:g id="APPLICATION">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈੱਬਪੰਨੇ ਸਮੇਤ ਆਪਣੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।\n\nਵਧੇਰੇ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਤੁਸੀਂ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈੱਬਪੰਨੇ ਸਮੇਤ ਆਪਣੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।\n\nਤੁਸੀਂ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ਨਾਲ ਵੀ ਕਨੈਕਟ ਹੋ, ਜੋ ਤੁਹਾਡੀ ਵਿਅਕਤੀਗਤ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰਦੀ ਹੈ।"</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"ਤੁਹਾਡੀ ਡਿਵਾਈਸ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਸ, ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਨਾਲ ਸੰਬੰਧਿਤ ਡਾਟਾ ਅਤੇ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਦੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਜਾਣਕਾਰੀ ਦਾ ਨਿਰੀਖਣ ਅਤੇ ਉਸਨੂੰ ਵਿਵਸਥਿਤ ਕਰ ਸਕਦਾ ਹੈ।\n\nਤੁਸੀਂ ਇੱਕ <xliff:g id="APPLICATION">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈੱਬਪੰਨੇ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</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> @@ -377,6 +379,9 @@ <string name="notification_expand_button_text" msgid="1037425494153780718">"ਸਭ ਦੇਖੋ"</string> <string name="notification_collapse_button_text" msgid="6883253262134328057">"ਸਾਰੇ ਲੁਕਾਓ"</string> <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> + <string name="volume_zen_end_now" msgid="3179845345429841822">"ਹੁਣੇ ਸਮਾਪਤ ਕਰੋ"</string> + <string name="accessibility_volume_expand" msgid="5946812790999244205">"ਵਿਸਤਾਰ ਕਰੋ"</string> + <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ਨਸ਼ਟ ਕਰੋ"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"ਸਕ੍ਰੀਨ ਪਿੰਨ ਕੀਤੀ"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"ਇਹ ਇਸਨੂੰ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਰੱਖਦਾ ਹੈ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਅਨਪਿਨ ਨਹੀਂ ਕਰਦੇ। ਅਨਪਿਨ ਕਰਨ ਲਈ ਪਿੱਛੇ ਅਤੇ ਰੂਪ-ਰੇਖਾ ਨੂੰ ਇੱਕੋ ਸਮੇਂ ਛੋਹਵੋ ਅਤੇ ਹੋਲਡ ਕਰੋ।"</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"ਇਹ ਇਸਨੂੰ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਰੱਖਦਾ ਹੈ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਅਨਪਿਨ ਨਹੀਂ ਕਰਦੇ। ਅਨਪਿਨ ਕਰਨ ਲਈ ਰੂਪ-ਰੇਖਾ ਨੂੰ ਛੋਹਵੋ ਅਤੇ ਹੋਲਡ ਕਰੋ।"</string> @@ -391,4 +396,12 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਵੋਲਯੂਮ ਡਾਇਲੌਗ ਹੈ"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"ਅਸਲੀ ਨੂੰ ਰੀਸਟੋਰ ਕਰਨ ਲਈ ਛੋਹਵੋ।"</string> <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"ਤੁਸੀਂ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ ਹੋ"</string> + <!-- no translation found for system_ui_tuner (8982911407690974001) --> + <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index c69966a..e4298e5 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Korzystasz z profilu do pracy"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index cbd6fb4..8f667d4 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Está no Perfil de trabalho"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 026d69f..5dba631 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Você está no Perfil de trabalho"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 2f320a3..4ee2692 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -399,4 +399,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Vă aflați în profilul de serviciu"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 2cd3075..8881b57 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -402,4 +402,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Вы вошли в профиль Android for Work"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml index 2d36786..2b34d96 100644 --- a/packages/SystemUI/res/values-si-rLK/strings.xml +++ b/packages/SystemUI/res/values-si-rLK/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"ඔබ කාර්යාල පැතිකඩේ සිටියි"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 1baaa84..08b22db 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -402,4 +402,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Nachádzate sa v pracovnom profile"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 5742762..76e28bb 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Ste v profilu za Android Work"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sq-rAL/strings.xml b/packages/SystemUI/res/values-sq-rAL/strings.xml index 38fdcfd..b0aa189 100644 --- a/packages/SystemUI/res/values-sq-rAL/strings.xml +++ b/packages/SystemUI/res/values-sq-rAL/strings.xml @@ -83,9 +83,11 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Kërko"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefoni"</string> + <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Ndihma zanore"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Shkyç"</string> <string name="unlock_label" msgid="8779712358041029439">"shkyç"</string> <string name="phone_label" msgid="2320074140205331708">"hap telefonin"</string> + <string name="voice_assist_label" msgid="3956854378310019854">"hap ndihmën zanore"</string> <string name="camera_label" msgid="7261107956054836961">"hap kamerën"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Zgjidh strukturën e re të detyrës"</string> <string name="cancel" msgid="6442560571259935130">"Anulo"</string> @@ -121,6 +123,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX ka dy vija."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX ka tre vija."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX ka sinjal të plotë."</string> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Lidhja e eternetit u shkëput."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Lidhja e eternetit u lidh."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Nuk ka sinjal."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Nuk është i lidhur."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Zero vija."</string> @@ -162,13 +166,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> është hequr."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Të gjitha aplikacionet e fundit u larguan."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Po nis <xliff:g id="APP">%s</xliff:g>."</string> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Njoftimi është hequr."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Streha e njoftimeve."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Cilësime të shpejta."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Ekrani i kyçjes."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Cilësimet"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Përmbledhja."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Konfirmo"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Mbylle"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Përdoruesi <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 është i çaktivizuar."</string> @@ -180,7 +185,7 @@ <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Modaliteti \"në aeroplan\" është i çaktivizuar."</string> <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Modaliteti \"në aeroplan\" është i aktivizuar."</string> <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\"Mos shqetëso\" është i aktivizuar, vetëm me prioritet."</string> - <string name="accessibility_quick_settings_dnd_none_on" msgid="5910777408232088752">"\"Mos shqetëso\" është i aktivizuar, asnjë ndërprerje."</string> + <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"\"Mos shqetëso\" është aktiv, heshtje e plotë."</string> <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"\"Mos shqetëso\" është i aktivizuar, vetëm alarmet."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\"Mos shqetëso\" është i çaktivizuar."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\"Mos shqetëso\" është i çaktivizuar."</string> @@ -235,7 +240,7 @@ <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Mos shqetëso"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Vetëm me prioritet"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Vetëm alarmet"</string> - <string name="quick_settings_dnd_none_label" msgid="7309935569360609114">"Nuk ka ndërprerje"</string> + <string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"Heshtje e plotë"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"\"Bluetooth-i\" (<xliff:g id="NUMBER">%d</xliff:g> pajisje)"</string> <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"\"Bluetooth-i\" është i çaktivizuar"</string> @@ -302,26 +307,20 @@ <string name="description_target_search" msgid="3091587249776033139">"Kërko"</string> <string name="description_direction_up" msgid="7169032478259485180">"Rrëshqit lart për <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Rrëshqit majtas për <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> - <string name="zen_no_interruptions_with_warning" msgid="4396898053735625287">"Nuk ka ndërprerje. Nuk ka as alarme."</string> - <string name="zen_priority_introduction" msgid="7253045784560169993">"Nuk do të shqetësohesh nga tingujt dhe dridhjet, përveç alarmeve, alarmeve rikujtuese, ngjarjeve dhe telefonuesve që specifikon."</string> + <string name="zen_priority_introduction" msgid="3070506961866919502">"Nuk do të shqetësohesh nga tingujt dhe dridhjet, përveç atyre nga alarmet, rikujtesat, ngjarjet dhe telefonuesit që specifikon."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Personalizo"</string> - <string name="zen_no_interruptions" msgid="7970973750143632592">"Nuk ka ndërprerje"</string> - <string name="zen_important_interruptions" msgid="3477041776609757628">"Vetëm ndërprerje prioritare"</string> - <string name="zen_alarms" msgid="5055668280767657759">"Vetëm alarmet"</string> - <string name="zen_alarm_information_time" msgid="5235772206174372272">"Alarmi i radhës është në <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> - <string name="zen_alarm_information_day_time" msgid="8422733576255047893">"Alarmi i radhës është më <xliff:g id="ALARM_DAY_AND_TIME">%s</xliff:g>"</string> - <string name="zen_alarm_warning" msgid="6873910860111498041">"Nuk do ta dëgjosh alarmin në <xliff:g id="ALARM_TIME">%s</xliff:g>"</string> + <string name="zen_silence_introduction" msgid="575422795504098868">"Kjo bllokon TË GJITHË tingujt dhe dridhjet, duke përfshirë edhe nga alarmet, muzika, videot dhe lojërat. Përsëri do të mund të bësh telefonata."</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">"Njoftimet më pak urgjente, më poshtë!"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Prek sërish për ta hapur"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Rrëshqit për të shkyçur"</string> - <string name="phone_hint" msgid="3101468054914424646">"Rrëshqit djathtas për të hapur telefonin"</string> - <string name="camera_hint" msgid="5241441720959174226">"Rrëshqit majtas për kamerën"</string> - <string name="interruption_level_none" msgid="8284541443482072628">"Nuk ka ndërprerje"</string> + <string name="phone_hint" msgid="4872890986869209950">"Rrëshqit nga ikona për telefonin"</string> + <string name="voice_hint" msgid="8939888732119726665">"Rrëshqit nga ikona për ndihmën zanore"</string> + <string name="camera_hint" msgid="7939688436797157483">"Rrëshqit nga ikona për kamerën"</string> + <string name="interruption_level_none" msgid="6000083681244492992">"Heshtje e plotë"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Vetëm me prioritet"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Vetëm alarmet"</string> - <string name="interruption_level_all" msgid="1330581184930945764">"Të gjitha"</string> - <string name="interruption_level_none_twoline" msgid="3942121050170227056">"Nuk ka\nndërprerje"</string> + <string name="interruption_level_none_twoline" msgid="3957581548190765889">"Heshtje\ne plotë"</string> <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"Vetëm\nme prioritet"</string> <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"Vetëm\nalarmet"</string> <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"Po ngarkohet (<xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> deri sa të mbushet)"</string> @@ -363,12 +362,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Çaktivizo VPN-në"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Shkëput VPN-në"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Pajisja jote menaxhohet nga <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratori yt mund të monitorojë dhe të menaxhojë cilësimet, qasjen e korporatës, aplikacionet, të dhënat e lidhura me pajisjen tënde, si dhe informacionet e vendndodhjes së pajisjes tënde. Për më shumë informacione, kontakto me administratorin tënd."</string> - <string name="monitoring_description_profile_owned" msgid="8110044290898637925">"Profili yt i punës menaxhohet nga <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratori yt mund të monitorojë aktivitetin e rrjetit, duke përfshirë emailet, aplikacionet dhe sajtet e sigurta të uebit.\n\nPër më shumë informacione, kontakto me administratorin tënd."</string> - <string name="monitoring_description_device_and_profile_owned" msgid="1664428184778531249">"Pajisja jote menaxhohet nga:\n<xliff:g id="ORGANIZATION_0">%1$s</xliff:g>.\nProfili yt i punës menaxhohet nga:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>.\n\nAdministratori yt mund të monitorojë pajisjen tënde dhe aktivitetin e rrjetit, duke përfshirë emailet, aplikacionet dhe sajtet e sigurta të uebit.\n\nPër më shumë informacione, kontakto me administratorin."</string> - <string name="monitoring_description_vpn" msgid="912328761766161919">"I dhe leje një aplikacioni që të konfigurojë një lidhje VPN.\n\nKy aplikacion mund të monitorojë pajisjen tënde dhe aktivitetin e rrjetit, duke përfshirë emailet, aplikacionet dhe sajtet e sigurta të uebit."</string> + <string name="monitoring_description_vpn" msgid="996222259035614736">"I dhe leje një aplikacioni që të konfigurojë një lidhje VPN.\n\nKy aplikacion mund të monitorojë pajisjen tënde dhe aktivitetin e rrjetit, duke përfshirë mail-at, aplikacionet dhe faqet e internetit."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Pajisja jote menaxhohet nga <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratori yt mund të monitorojë dhe të menaxhojë cilësimet, qasjen e korporatës, aplikacionet, të dhënat e lidhura me pajisjen dhe informacionet e vendndodhjes së pajisjes.\n\nJe i lidhur me një rrjet VPN që mund të monitorojë aktivitetin tënd të rrjetit, duke përfshirë emailet, aplikacionet dhe sajtet e uebit.\n\nPër më shumë informacione, kontakto me administratorin."</string> - <string name="monitoring_description_vpn_profile_owned" msgid="2224494839524715272">"Profili yt i punës menaxhohet nga <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratori yt mund të monitorojë aktivitetin tënd të rrjetit, duke përfshirë emailet, aplikacionet dhe sajtet e sigurta të uebit.\n\nPër më shumë informacione, kontakto me administratorin tënd.\n\nJe i lidhur po ashtu me një rrjet VPN që mund të monitorojë aktivitetin tënd të rrjetit."</string> - <string name="monitoring_description_vpn_device_and_profile_owned" msgid="2198546817407897093">"Pajisja jote menaxhohet nga <xliff:g id="ORGANIZATION_0">%1$s</xliff:g>.\nProfili yt i punës menaxhohet nga:\n<xliff:g id="ORGANIZATION_1">%2$s</xliff:g>.\n\nAdministratori yt mund të monitorojë aktivitetin tënd të rrjetit, duke përfshirë emailet, aplikacionet dhe sajtet e sigurta të uebit.\n\nPër më shumë informacione, kontakto me administratorin tënd.\n\nJe i lidhur po ashtu me një rrjet VPN që mund të monitorojë aktivitetin e rrjetit tënd personal"</string> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Profili yt i punës menaxhohet nga <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratori yt mund të monitorojë aktivitetin tënd të rrjetit, duke përfshirë mail-at, aplikacionet dhe faqet e internetit.\n\nPër më shumë informacion, kontakto me administratorin tënd.\n\nJe i lidhur edhe me një VPN, që mund të monitorojë aktivitetin tënd të rrjetit."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Je i lidhur me aplikacionin <xliff:g id="APPLICATION">%1$s</xliff:g>, që mund të monitorojë aktivitetin tënd në rrjet përfshirë mail-at, aplikacionet dhe faqet e internetit."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Je i lidhur me aplikacionin <xliff:g id="APPLICATION">%1$s</xliff:g>, që mund të monitorojë aktivitetin tënd personal në rrjet përfshirë mail-at, aplikacionet dhe faqet e internetit."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Profili yt i punës menaxhohet nga <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ai është i lidhur me <xliff:g id="APPLICATION">%2$s</xliff:g>, që mund të monitorojë aktivitetin tënd të punës në rrjet përfshirë mail-at, aplikacionet dhe faqet e internetit.\n\nPër më shumë informacion, kontakto me administratorin tënd."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Profili yt i punës menaxhohet nga <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ai është i lidhur me <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, që mund të monitorojë aktivitetin tënd të punës në rrjet përfshirë mail-at, aplikacionet dhe faqet e internetit.\n\nJe lidhur gjithashtu edhe me <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, që mund të monitorojë aktivitetin tënd personal në rrjet."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Pajisja jote menaxhohet nga <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratori mund të monitorojë dhe menaxhojë cilësimet, qasjen e korporatës, aplikacionet, të dhënat që shoqërojnë pajisjen tënde si dhe informacionin e vendndodhjes së pajisjes.\n\nJe i lidhur me <xliff:g id="APPLICATION">%2$s</xliff:g>, që mund të monitorojë aktivitetin tënd të punës në rrjet përfshirë mail-at, aplikacionet dhe faqet e internetit.\n\nPër më shumë informacion, kontakto me administratorin tënd."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Pajisje do të qëndrojë e kyçur derisa ta shkyçësh manualisht"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Merr njoftime më shpejt"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Shikoji para se t\'i shkyçësh"</string> @@ -377,6 +379,9 @@ <string name="notification_expand_button_text" msgid="1037425494153780718">"Shikoji të gjitha"</string> <string name="notification_collapse_button_text" msgid="6883253262134328057">"Fshihi të gjitha"</string> <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> + <string name="volume_zen_end_now" msgid="3179845345429841822">"Përfundo tani"</string> + <string name="accessibility_volume_expand" msgid="5946812790999244205">"Zgjeroje"</string> + <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Mbylle"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekrani u gozhdua"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Kjo e ruan në pamje derisa e heq nga gozhdimi. Prek dhe mbaj shtypur njëkohësisht \"Prapa\" dhe \"Përmbledhje\" për ta hequr nga gozhdimi."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Kjo e ruan në pamje derisa e heq nga gozhdimi. Prek dhe mbaj shtypur njëkohësisht \"Përmbledhje\" për ta hequr nga gozhdimi."</string> @@ -391,4 +396,12 @@ <string name="volumeui_notification_title" msgid="4906770126345910955">"<xliff:g id="APP_NAME">%1$s</xliff:g> është dialogu i volumit"</string> <string name="volumeui_notification_text" msgid="1826889705095768656">"Prek për të restauruar origjinalin."</string> <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Ndodhesh në profilin e Punës"</string> + <!-- no translation found for system_ui_tuner (8982911407690974001) --> + <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 47079bb..c412527 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -399,4 +399,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Налазите се на профилу за Work"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 74330be..5dfe041 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Du använder Work-profilen"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 88b885e..f7c10e1 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Uko katika wasifu wa Kazi"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml index 7ca6fa7..dc375be 100644 --- a/packages/SystemUI/res/values-ta-rIN/strings.xml +++ b/packages/SystemUI/res/values-ta-rIN/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"பணி சுயவிவரத்தில் இருக்கிறீர்கள்"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml index ed60a93..d2fc929 100644 --- a/packages/SystemUI/res/values-te-rIN/strings.xml +++ b/packages/SystemUI/res/values-te-rIN/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"మీరు కార్యాలయ ప్రొఫైల్లో ఉన్నారు"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 484f22e..5e39621 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"คุณกำลังอยู่ในโปรไฟล์งาน"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 35d9f77..2b801b7 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Nandito ka sa profile sa Trabaho"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index a9a64d5..c1b1552 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"İş profilindesiniz"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 9f4eb98..718abc1 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Ви в робочому профілі"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml index 262680e..a30f5f8 100644 --- a/packages/SystemUI/res/values-ur-rPK/strings.xml +++ b/packages/SystemUI/res/values-ur-rPK/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"آپ دفتری پروفائل میں ہیں"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml index 2d5edc3..715a55e 100644 --- a/packages/SystemUI/res/values-uz-rUZ/strings.xml +++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Siz Android for Work profiliga kirgansiz"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 67948b5..a47e2f4 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Bạn đang trên hồ sơ công việc"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 42d263c..1d4af1d 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"您正在使用工作资料"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index cecde31..b55e79f 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"您正在「工作設定檔」頁面"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 061a805..4240dd6 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -400,4 +400,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"您目前在 Work 設定檔"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 9e1adbd..d6f62f0 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -398,4 +398,10 @@ <string name="managed_profile_foreground_toast" msgid="3199278359979281097">"Ukuphrofayela yomsebenzi"</string> <!-- no translation found for system_ui_tuner (8982911407690974001) --> <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 715f4e4..be33085 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -194,7 +194,7 @@ class SaveImageInBackgroundTask extends AsyncTask<SaveImageInBackgroundData, Voi // we compose the final post-save notification below. mNotificationBuilder.setLargeIcon(croppedIcon); // But we still don't set it for the expanded view, allowing the smallIcon to show here. - mNotificationStyle.bigLargeIcon(null); + mNotificationStyle.bigLargeIcon((Bitmap) null); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 2913c7d..1e488f3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -1390,9 +1390,9 @@ public abstract class BaseStatusBar extends SystemUI implements final ImageView profileBadge = (ImageView) publicViewLocal.findViewById( R.id.profile_badge_line3); - final StatusBarIcon ic = new StatusBarIcon(entry.notification.getPackageName(), + final StatusBarIcon ic = new StatusBarIcon( entry.notification.getUser(), - entry.notification.getNotification().icon, + entry.notification.getNotification().getSmallIcon(), entry.notification.getNotification().iconLevel, entry.notification.getNotification().number, entry.notification.getNotification().tickerText); @@ -1770,9 +1770,9 @@ public abstract class BaseStatusBar extends SystemUI implements sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId()), n); iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); - final StatusBarIcon ic = new StatusBarIcon(sbn.getPackageName(), + final StatusBarIcon ic = new StatusBarIcon( sbn.getUser(), - n.icon, + n.getSmallIcon(), n.iconLevel, n.number, n.tickerText); @@ -1916,9 +1916,9 @@ public abstract class BaseStatusBar extends SystemUI implements try { if (entry.icon != null) { // Update the icon - final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(), + final StatusBarIcon ic = new StatusBarIcon( notification.getUser(), - n.icon, + n.getSmallIcon(), n.iconLevel, n.number, n.tickerText); @@ -1938,9 +1938,9 @@ public abstract class BaseStatusBar extends SystemUI implements } if (!updateSuccessful) { if (DEBUG) Log.d(TAG, "not reusing notification for key: " + key); - final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(), + final StatusBarIcon ic = new StatusBarIcon( notification.getUser(), - n.icon, + n.getSmallIcon(), n.iconLevel, n.number, n.tickerText); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index e6847d8..3294e15 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -24,6 +24,7 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; import android.os.UserHandle; import android.text.TextUtils; import android.util.AttributeSet; @@ -100,13 +101,23 @@ public class StatusBarIconView extends AnimatedImageView { return a.equals(b); } + public boolean equalIcons(Icon a, Icon b) { + if (a == b) return true; + if (a.getType() != b.getType()) return false; + switch (a.getType()) { + case Icon.TYPE_RESOURCE: + return a.getResPackage().equals(b.getResPackage()) && a.getResId() == b.getResId(); + case Icon.TYPE_URI: + return a.getUriString().equals(b.getUriString()); + default: + return false; + } + } /** * Returns whether the set succeeded. */ public boolean set(StatusBarIcon icon) { - final boolean iconEquals = mIcon != null - && streq(mIcon.iconPackage, icon.iconPackage) - && mIcon.iconId == icon.iconId; + final boolean iconEquals = mIcon != null && equalIcons(mIcon.icon, icon.icon); final boolean levelEquals = iconEquals && mIcon.iconLevel == icon.iconLevel; final boolean visibilityEquals = mIcon != null @@ -167,45 +178,18 @@ public class StatusBarIconView extends AnimatedImageView { } /** - * Returns the right icon to use for this item, respecting the iconId and - * iconPackage (if set) + * Returns the right icon to use for this item * - * @param context Context to use to get resources if iconPackage is not set + * @param context Context to use to get resources * @return Drawable for this item, or null if the package or item could not * be found */ public static Drawable getIcon(Context context, StatusBarIcon icon) { - Resources r = null; - - if (icon.iconPackage != null) { - try { - int userId = icon.user.getIdentifier(); - if (userId == UserHandle.USER_ALL) { - userId = UserHandle.USER_OWNER; - } - r = context.getPackageManager() - .getResourcesForApplicationAsUser(icon.iconPackage, userId); - } catch (PackageManager.NameNotFoundException ex) { - Log.e(TAG, "Icon package not found: " + icon.iconPackage); - return null; - } - } else { - r = context.getResources(); + int userId = icon.user.getIdentifier(); + if (userId == UserHandle.USER_ALL) { + userId = UserHandle.USER_OWNER; } - - if (icon.iconId == 0) { - return null; - } - - try { - return r.getDrawable(icon.iconId); - } catch (RuntimeException e) { - Log.w(TAG, "Icon not found in " - + (icon.iconPackage != null ? icon.iconId : "<system>") - + ": " + Integer.toHexString(icon.iconId)); - } - - return null; + return icon.icon.loadDrawableAsUser(context, userId); } public StatusBarIcon getStatusBarIcon() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java index 44168bc..26d1c86 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.phone; +import android.graphics.drawable.Icon; import android.os.Bundle; import android.os.UserHandle; import android.view.Gravity; @@ -132,8 +133,7 @@ public class DemoStatusIcons extends LinearLayout implements DemoMode { break; } else { StatusBarIcon icon = v.getStatusBarIcon(); - icon.iconPackage = iconPkg; - icon.iconId = iconId; + icon.icon = Icon.createWithResource(icon.icon.getResPackage(), iconId); v.set(icon); v.updateDrawable(); return; @@ -152,4 +152,4 @@ public class DemoStatusIcons extends LinearLayout implements DemoMode { v.set(icon); addView(v, 0, new LinearLayout.LayoutParams(mIconSize, mIconSize)); } -}
\ No newline at end of file +} diff --git a/services/core/java/com/android/server/display/OverlayDisplayAdapter.java b/services/core/java/com/android/server/display/OverlayDisplayAdapter.java index 080665a..0462035 100644 --- a/services/core/java/com/android/server/display/OverlayDisplayAdapter.java +++ b/services/core/java/com/android/server/display/OverlayDisplayAdapter.java @@ -34,6 +34,8 @@ import android.view.SurfaceControl; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -47,6 +49,21 @@ import java.util.regex.Pattern; * service as usual. The UI handler is only used by the {@link OverlayDisplayWindow}. * </p><p> * Display adapters are guarded by the {@link DisplayManagerService.SyncRoot} lock. + * </p><p> + * This adapter is configured via the + * {@link android.provider.Settings.Global#OVERLAY_DISPLAY_DEVICES} setting. This setting should be + * formatted as follows: + * <pre> + * [mode1]|[mode2]|...,[flag1],[flag2],... + * </pre> + * with each mode specified as: + * <pre> + * [width]x[height]/[densityDpi] + * </pre> + * Supported flags: + * <ul> + * <li><pre>secure</pre>: creates a secure display</li> + * </ul> * </p> */ final class OverlayDisplayAdapter extends DisplayAdapter { @@ -58,8 +75,10 @@ final class OverlayDisplayAdapter extends DisplayAdapter { private static final int MAX_WIDTH = 4096; private static final int MAX_HEIGHT = 4096; - private static final Pattern SETTING_PATTERN = - Pattern.compile("(\\d+)x(\\d+)/(\\d+)(,[a-z]+)*"); + private static final Pattern DISPLAY_PATTERN = + Pattern.compile("([^,]+)(,[a-z]+)*"); + private static final Pattern MODE_PATTERN = + Pattern.compile("(\\d+)x(\\d+)/(\\d+)"); // Unique id prefix for overlay displays. private static final String UNIQUE_ID_PREFIX = "overlay:"; @@ -136,40 +155,49 @@ final class OverlayDisplayAdapter extends DisplayAdapter { int count = 0; for (String part : value.split(";")) { - Matcher matcher = SETTING_PATTERN.matcher(part); - if (matcher.matches()) { + Matcher displayMatcher = DISPLAY_PATTERN.matcher(part); + if (displayMatcher.matches()) { if (count >= 4) { Slog.w(TAG, "Too many overlay display devices specified: " + value); break; } - try { - int width = Integer.parseInt(matcher.group(1), 10); - int height = Integer.parseInt(matcher.group(2), 10); - int densityDpi = Integer.parseInt(matcher.group(3), 10); - String flagString = matcher.group(4); - if (width >= MIN_WIDTH && width <= MAX_WIDTH - && height >= MIN_HEIGHT && height <= MAX_HEIGHT - && densityDpi >= DisplayMetrics.DENSITY_LOW - && densityDpi <= DisplayMetrics.DENSITY_XXHIGH) { - int number = ++count; - String name = getContext().getResources().getString( - com.android.internal.R.string.display_manager_overlay_display_name, - number); - int gravity = chooseOverlayGravity(number); - boolean secure = flagString != null && flagString.contains(",secure"); - - Slog.i(TAG, "Showing overlay display device #" + number - + ": name=" + name + ", width=" + width + ", height=" + height - + ", densityDpi=" + densityDpi + ", secure=" + secure); - - mOverlays.add(new OverlayDisplayHandle(name, - width, height, densityDpi, gravity, secure, number)); + String modeString = displayMatcher.group(1); + String flagString = displayMatcher.group(2); + ArrayList<OverlayMode> modes = new ArrayList<>(); + for (String mode : modeString.split("\\|")) { + Matcher modeMatcher = MODE_PATTERN.matcher(mode); + if (modeMatcher.matches()) { + try { + int width = Integer.parseInt(modeMatcher.group(1), 10); + int height = Integer.parseInt(modeMatcher.group(2), 10); + int densityDpi = Integer.parseInt(modeMatcher.group(3), 10); + if (width >= MIN_WIDTH && width <= MAX_WIDTH + && height >= MIN_HEIGHT && height <= MAX_HEIGHT + && densityDpi >= DisplayMetrics.DENSITY_LOW + && densityDpi <= DisplayMetrics.DENSITY_XXHIGH) { + modes.add(new OverlayMode(width, height, densityDpi)); + continue; + } + } catch (NumberFormatException ex) { + } + } else if (mode.isEmpty()) { continue; } - } catch (NumberFormatException ex) { } - } else if (part.isEmpty()) { - continue; + if (!modes.isEmpty()) { + int number = ++count; + String name = getContext().getResources().getString( + com.android.internal.R.string.display_manager_overlay_display_name, + number); + int gravity = chooseOverlayGravity(number); + boolean secure = flagString != null && flagString.contains(",secure"); + + Slog.i(TAG, "Showing overlay display device #" + number + + ": name=" + name + ", modes=" + Arrays.toString(modes.toArray())); + + mOverlays.add(new OverlayDisplayHandle(name, modes, gravity, secure, number)); + continue; + } } Slog.w(TAG, "Malformed overlay display devices setting: " + value); } @@ -189,36 +217,41 @@ final class OverlayDisplayAdapter extends DisplayAdapter { } } - private final class OverlayDisplayDevice extends DisplayDevice { + private abstract class OverlayDisplayDevice extends DisplayDevice { private final String mName; - private final int mWidth; - private final int mHeight; private final float mRefreshRate; private final long mDisplayPresentationDeadlineNanos; - private final int mDensityDpi; private final boolean mSecure; - private final Display.Mode mMode; + private final List<OverlayMode> mRawModes; + private final Display.Mode[] mModes; + private final int mDefaultMode; private int mState; private SurfaceTexture mSurfaceTexture; private Surface mSurface; private DisplayDeviceInfo mInfo; + private int mActiveMode; public OverlayDisplayDevice(IBinder displayToken, String name, - int width, int height, float refreshRate, long presentationDeadlineNanos, - int densityDpi, boolean secure, int state, + List<OverlayMode> modes, int activeMode, int defaultMode, + float refreshRate, long presentationDeadlineNanos, + boolean secure, int state, SurfaceTexture surfaceTexture, int number) { super(OverlayDisplayAdapter.this, displayToken, UNIQUE_ID_PREFIX + number); mName = name; - mWidth = width; - mHeight = height; mRefreshRate = refreshRate; mDisplayPresentationDeadlineNanos = presentationDeadlineNanos; - mDensityDpi = densityDpi; mSecure = secure; mState = state; mSurfaceTexture = surfaceTexture; - mMode = createMode(width, height, refreshRate); + mRawModes = modes; + mModes = new Display.Mode[modes.size()]; + for (int i = 0; i < modes.size(); i++) { + OverlayMode mode = modes.get(i); + mModes[i] = createMode(mode.mWidth, mode.mHeight, refreshRate); + } + mActiveMode = activeMode; + mDefaultMode = defaultMode; } public void destroyLocked() { @@ -248,17 +281,19 @@ final class OverlayDisplayAdapter extends DisplayAdapter { @Override public DisplayDeviceInfo getDisplayDeviceInfoLocked() { if (mInfo == null) { + Display.Mode mode = mModes[mActiveMode]; + OverlayMode rawMode = mRawModes.get(mActiveMode); mInfo = new DisplayDeviceInfo(); mInfo.name = mName; mInfo.uniqueId = getUniqueId(); - mInfo.width = mWidth; - mInfo.height = mHeight; - mInfo.modeId = mMode.getModeId(); - mInfo.defaultModeId = mMode.getModeId(); - mInfo.supportedModes = new Display.Mode[] { mMode }; - mInfo.densityDpi = mDensityDpi; - mInfo.xDpi = mDensityDpi; - mInfo.yDpi = mDensityDpi; + mInfo.width = mode.getPhysicalWidth(); + mInfo.height = mode.getPhysicalHeight(); + mInfo.modeId = mode.getModeId(); + mInfo.defaultModeId = mModes[0].getModeId(); + mInfo.supportedModes = mModes; + mInfo.densityDpi = rawMode.mDensityDpi; + mInfo.xDpi = rawMode.mDensityDpi; + mInfo.yDpi = rawMode.mDensityDpi; mInfo.presentationDeadlineNanos = mDisplayPresentationDeadlineNanos + 1000000000L / (int) mRefreshRate; // display's deadline + 1 frame mInfo.flags = DisplayDeviceInfo.FLAG_PRESENTATION; @@ -271,6 +306,40 @@ final class OverlayDisplayAdapter extends DisplayAdapter { } return mInfo; } + + @Override + public void requestModeInTransactionLocked(int id) { + int index = -1; + if (id == 0) { + // Use the default. + index = 0; + } else { + for (int i = 0; i < mModes.length; i++) { + if (mModes[i].getModeId() == id) { + index = i; + break; + } + } + } + if (index == -1) { + Slog.w(TAG, "Unable to locate mode " + id + ", reverting to default."); + index = mDefaultMode; + } + if (mActiveMode == index) { + return; + } + mActiveMode = index; + mInfo = null; + sendDisplayDeviceEventLocked(this, DISPLAY_DEVICE_EVENT_CHANGED); + onModeChangedLocked(index); + } + + /** + * Called when the device switched to a new mode. + * + * @param index index of the mode in the list of modes + */ + public abstract void onModeChangedLocked(int index); } /** @@ -280,27 +349,32 @@ final class OverlayDisplayAdapter extends DisplayAdapter { * Guarded by the {@link DisplayManagerService.SyncRoot} lock. */ private final class OverlayDisplayHandle implements OverlayDisplayWindow.Listener { + private static final int DEFAULT_MODE_INDEX = 0; + private final String mName; - private final int mWidth; - private final int mHeight; - private final int mDensityDpi; + private final List<OverlayMode> mModes; private final int mGravity; private final boolean mSecure; private final int mNumber; private OverlayDisplayWindow mWindow; private OverlayDisplayDevice mDevice; + private int mActiveMode; - public OverlayDisplayHandle(String name, int width, - int height, int densityDpi, int gravity, boolean secure, int number) { + public OverlayDisplayHandle(String name, List<OverlayMode> modes, int gravity, + boolean secure, int number) { mName = name; - mWidth = width; - mHeight = height; - mDensityDpi = densityDpi; + mModes = modes; mGravity = gravity; mSecure = secure; mNumber = number; + mActiveMode = 0; + + showLocked(); + } + + private void showLocked() { mUiHandler.post(mShowRunnable); } @@ -309,15 +383,28 @@ final class OverlayDisplayAdapter extends DisplayAdapter { mUiHandler.post(mDismissRunnable); } + private void onActiveModeChangedLocked(int index) { + mUiHandler.removeCallbacks(mResizeRunnable); + mActiveMode = index; + if (mWindow != null) { + mUiHandler.post(mResizeRunnable); + } + } + // Called on the UI thread. @Override public void onWindowCreated(SurfaceTexture surfaceTexture, float refreshRate, long presentationDeadlineNanos, int state) { synchronized (getSyncRoot()) { IBinder displayToken = SurfaceControl.createDisplay(mName, mSecure); - mDevice = new OverlayDisplayDevice(displayToken, mName, - mWidth, mHeight, refreshRate, presentationDeadlineNanos, - mDensityDpi, mSecure, state, surfaceTexture, mNumber); + mDevice = new OverlayDisplayDevice(displayToken, mName, mModes, mActiveMode, + DEFAULT_MODE_INDEX, refreshRate, presentationDeadlineNanos, + mSecure, state, surfaceTexture, mNumber) { + @Override + public void onModeChangedLocked(int index) { + onActiveModeChangedLocked(index); + } + }; sendDisplayDeviceEventLocked(mDevice, DISPLAY_DEVICE_EVENT_ADDED); } @@ -347,9 +434,8 @@ final class OverlayDisplayAdapter extends DisplayAdapter { public void dumpLocked(PrintWriter pw) { pw.println(" " + mName + ":"); - pw.println(" mWidth=" + mWidth); - pw.println(" mHeight=" + mHeight); - pw.println(" mDensityDpi=" + mDensityDpi); + pw.println(" mModes=" + Arrays.toString(mModes.toArray())); + pw.println(" mActiveMode=" + mActiveMode); pw.println(" mGravity=" + mGravity); pw.println(" mSecure=" + mSecure); pw.println(" mNumber=" + mNumber); @@ -366,8 +452,9 @@ final class OverlayDisplayAdapter extends DisplayAdapter { private final Runnable mShowRunnable = new Runnable() { @Override public void run() { + OverlayMode mode = mModes.get(mActiveMode); OverlayDisplayWindow window = new OverlayDisplayWindow(getContext(), - mName, mWidth, mHeight, mDensityDpi, mGravity, mSecure, + mName, mode.mWidth, mode.mHeight, mode.mDensityDpi, mGravity, mSecure, OverlayDisplayHandle.this); window.show(); @@ -392,5 +479,47 @@ final class OverlayDisplayAdapter extends DisplayAdapter { } } }; + + // Runs on the UI thread. + private final Runnable mResizeRunnable = new Runnable() { + @Override + public void run() { + OverlayMode mode; + OverlayDisplayWindow window; + synchronized (getSyncRoot()) { + if (mWindow == null) { + return; + } + mode = mModes.get(mActiveMode); + window = mWindow; + } + window.resize(mode.mWidth, mode.mHeight, mode.mDensityDpi); + } + }; + } + + /** + * A display mode for an overlay display. + */ + private static final class OverlayMode { + final int mWidth; + final int mHeight; + final int mDensityDpi; + + OverlayMode(int width, int height, int densityDpi) { + mWidth = width; + mHeight = height; + mDensityDpi = densityDpi; + } + + @Override + public String toString() { + return new StringBuilder("{") + .append("width=").append(mWidth) + .append(", height=").append(mHeight) + .append(", densityDpi=").append(mDensityDpi) + .append("}") + .toString(); + } } } diff --git a/services/core/java/com/android/server/display/OverlayDisplayWindow.java b/services/core/java/com/android/server/display/OverlayDisplayWindow.java index 786889a..f23caf2 100644 --- a/services/core/java/com/android/server/display/OverlayDisplayWindow.java +++ b/services/core/java/com/android/server/display/OverlayDisplayWindow.java @@ -60,9 +60,9 @@ final class OverlayDisplayWindow implements DumpUtils.Dump { private final Context mContext; private final String mName; - private final int mWidth; - private final int mHeight; - private final int mDensityDpi; + private int mWidth; + private int mHeight; + private int mDensityDpi; private final int mGravity; private final boolean mSecure; private final Listener mListener; @@ -97,19 +97,9 @@ final class OverlayDisplayWindow implements DumpUtils.Dump { Listener listener) { mContext = context; mName = name; - mWidth = width; - mHeight = height; - mDensityDpi = densityDpi; mGravity = gravity; mSecure = secure; mListener = listener; - mTitle = context.getResources().getString( - com.android.internal.R.string.display_manager_overlay_display_title, - mName, mWidth, mHeight, mDensityDpi); - if (secure) { - mTitle += context.getResources().getString( - com.android.internal.R.string.display_manager_overlay_display_secure_suffix); - } mDisplayManager = (DisplayManager)context.getSystemService( Context.DISPLAY_SERVICE); @@ -119,6 +109,8 @@ final class OverlayDisplayWindow implements DumpUtils.Dump { mDefaultDisplay = mWindowManager.getDefaultDisplay(); updateDefaultDisplayInfo(); + resize(width, height, densityDpi, false /* doLayout */); + createWindow(); } @@ -145,6 +137,26 @@ final class OverlayDisplayWindow implements DumpUtils.Dump { } } + public void resize(int width, int height, int densityDpi) { + resize(width, height, densityDpi, true /* doLayout */); + } + + private void resize(int width, int height, int densityDpi, boolean doLayout) { + mWidth = width; + mHeight = height; + mDensityDpi = densityDpi; + mTitle = mContext.getResources().getString( + com.android.internal.R.string.display_manager_overlay_display_title, + mName, mWidth, mHeight, mDensityDpi); + if (mSecure) { + mTitle += mContext.getResources().getString( + com.android.internal.R.string.display_manager_overlay_display_secure_suffix); + } + if (doLayout) { + relayout(); + } + } + public void relayout() { if (mWindowVisible) { updateWindowParams(); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 290fb65..de74a04 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -2017,7 +2017,7 @@ public class NotificationManagerService extends SystemService { throw new IllegalArgumentException("null not allowed: pkg=" + pkg + " id=" + id + " notification=" + notification); } - if (notification.icon != 0) { + if (notification.getSmallIcon() != null) { if (!notification.isValid()) { throw new IllegalArgumentException("Invalid notification (): pkg=" + pkg + " id=" + id + " notification=" + notification); @@ -2138,11 +2138,11 @@ public class NotificationManagerService extends SystemService { applyZenModeLocked(r); mRankingHelper.sort(mNotificationList); - if (notification.icon != 0) { + if (notification.getSmallIcon() != null) { StatusBarNotification oldSbn = (old != null) ? old.sbn : null; mListeners.notifyPostedLocked(n, oldSbn); } else { - Slog.e(TAG, "Not posting notification with icon==0: " + notification); + Slog.e(TAG, "Not posting notification without small icon: " + notification); if (old != null && !old.isCanceled) { mListeners.notifyRemovedLocked(n); } @@ -2715,7 +2715,7 @@ public class NotificationManagerService extends SystemService { } // status bar - if (r.getNotification().icon != 0) { + if (r.getNotification().getSmallIcon() != null) { r.isCanceled = true; mListeners.notifyRemovedLocked(r.sbn); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 19210c9..145786f 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4137,7 +4137,9 @@ public class PackageManagerService extends IPackageManager.Stub { synchronized (mPackages) { final int count = candidates.size(); - // First, try to use the domain prefered App + // First, try to use the domain prefered App. Partition the candidates into four lists: + // one for the final results, one for the "do not use ever", one for "undefined status" + // and finally one for "Browser App type". for (int n=0; n<count; n++) { ResolveInfo info = candidates.get(n); String packageName = info.activityInfo.packageName; @@ -4159,19 +4161,19 @@ public class PackageManagerService extends IPackageManager.Stub { } } } + // Add all undefined Apps as we want them to appear in the Disambiguation dialog. + result.addAll(undefinedList); // If there is nothing selected, add all candidates and remove the ones that the User // has explicitely put into the INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER state and - // also remove any undefined ones and Browser Apps ones. - // If there is still none after this pass, add all undefined one and Browser Apps and + // also remove Browser Apps ones. + // If there is still none after this pass, add all Browser Apps and // let the User decide with the Disambiguation dialog if there are several ones. if (result.size() == 0) { result.addAll(candidates); } result.removeAll(neverList); result.removeAll(matchAllList); - result.removeAll(undefinedList); if (result.size() == 0) { - result.addAll(undefinedList); if ((flags & MATCH_ALL) != 0) { result.addAll(matchAllList); } else { @@ -11459,6 +11461,21 @@ public class PackageManagerService extends IPackageManager.Stub { replace = true; if (DEBUG_INSTALL) Slog.d(TAG, "Replace existing pacakge: " + pkgName); } + + // Prevent apps opting out from runtime permissions + if (replace) { + PackageParser.Package oldPackage = mPackages.get(pkgName); + final int oldTargetSdk = oldPackage.applicationInfo.targetSdkVersion; + final int newTargetSdk = pkg.applicationInfo.targetSdkVersion; + if (oldTargetSdk > Build.VERSION_CODES.LOLLIPOP_MR1 + && newTargetSdk <= Build.VERSION_CODES.LOLLIPOP_MR1) { + res.setError(PackageManager.INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE, + "Package " + pkg.packageName + " new target SDK " + newTargetSdk + + " doesn't support runtime permissions but the old" + + " target SDK " + oldTargetSdk + " does."); + return; + } + } } PackageSetting ps = mSettings.mPackages.get(pkgName); diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index e649e48..a869c20 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -39,6 +39,7 @@ import android.content.pm.ServiceInfo; import android.graphics.Rect; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; +import android.media.tv.DvbDeviceInfo; import android.media.tv.ITvInputClient; import android.media.tv.ITvInputHardware; import android.media.tv.ITvInputHardwareCallback; @@ -64,6 +65,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.Message; +import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; @@ -80,23 +82,34 @@ import com.android.server.SystemService; import org.xmlpull.v1.XmlPullParserException; +import java.io.File; import java.io.FileDescriptor; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; +import java.lang.IllegalArgumentException; +import java.lang.Integer; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** This class provides a system service that manages television inputs. */ public final class TvInputManagerService extends SystemService { private static final boolean DEBUG = false; private static final String TAG = "TvInputManagerService"; + // Pattern for selecting the DVB frontend devices from the list of files in the /dev directory. + private static final Pattern sFrontEndDevicePattern = + Pattern.compile("^dvb([0-9]+)\\.frontend([0-9]+)$"); + private final Context mContext; private final TvInputHardwareManager mTvInputHardwareManager; @@ -1507,6 +1520,74 @@ public final class TvInputManagerService extends SystemService { } @Override + public List<DvbDeviceInfo> getDvbDeviceList() throws RemoteException { + if (mContext.checkCallingPermission(android.Manifest.permission.DVB_DEVICE) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Requires DVB_DEVICE permission"); + } + + final long identity = Binder.clearCallingIdentity(); + try { + ArrayList<DvbDeviceInfo> deviceInfos = new ArrayList<>(); + File devDirectory = new File("/dev"); + for (String fileName : devDirectory.list()) { + Matcher matcher = sFrontEndDevicePattern.matcher(fileName); + if (matcher.find()) { + int adapterId = Integer.parseInt(matcher.group(1)); + int deviceId = Integer.parseInt(matcher.group(2)); + deviceInfos.add(new DvbDeviceInfo(adapterId, deviceId)); + } + } + return Collections.unmodifiableList(deviceInfos); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @Override + public ParcelFileDescriptor openDvbDevice(DvbDeviceInfo info, int device) + throws RemoteException { + if (mContext.checkCallingPermission(android.Manifest.permission.DVB_DEVICE) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Requires DVB_DEVICE permission"); + } + + final long identity = Binder.clearCallingIdentity(); + try { + String deviceFileName; + switch (device) { + case TvInputManager.DVB_DEVICE_DEMUX: + deviceFileName = String.format("/dev/dvb%d.demux%d", info.getAdapterId(), + info.getDeviceId()); + break; + case TvInputManager.DVB_DEVICE_DVR: + deviceFileName = String.format("/dev/dvb%d.dvr%d", info.getAdapterId(), + info.getDeviceId()); + break; + case TvInputManager.DVB_DEVICE_FRONTEND: + deviceFileName = String.format("/dev/dvb%d.frontend%d", info.getAdapterId(), + info.getDeviceId()); + break; + default: + throw new IllegalArgumentException("Invalid DVB device: " + device); + } + try { + // The DVB frontend device only needs to be opened in read/write mode, which + // allows performing tuning operations. The DVB demux and DVR device are enough + // to be opened in read only mode. + return ParcelFileDescriptor.open(new File(deviceFileName), + TvInputManager.DVB_DEVICE_FRONTEND == device + ? ParcelFileDescriptor.MODE_READ_WRITE + : ParcelFileDescriptor.MODE_READ_ONLY); + } catch (FileNotFoundException e) { + return null; + } + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @Override public List<TvStreamConfig> getAvailableTvStreamConfigList(String inputId, int userId) throws RemoteException { if (mContext.checkCallingPermission( diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index 9033c9c..0357de2 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -289,11 +289,13 @@ public class AppTransition implements Dump { return mNextAppTransitionStartY; } - void prepare() { + boolean prepare() { if (!isRunning()) { mAppTransitionState = APP_STATE_IDLE; notifyAppTransitionPendingLocked(); + return true; } + return false; } void goodToGo(AppWindowAnimator openingAppAnimator, AppWindowAnimator closingAppAnimator) { @@ -953,8 +955,8 @@ public class AppTransition implements Dump { : com.android.internal.R.anim.voice_activity_open_exit); if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG, "applyAnimation voice:" - + " anim=" + a + " transit=" + transit + " isEntrance=" + enter - + " Callers=" + Debug.getCallers(3)); + + " anim=" + a + " transit=" + appTransitionToString(transit) + + " isEntrance=" + enter + " Callers=" + Debug.getCallers(3)); } else if (isVoiceInteraction && (transit == TRANSIT_ACTIVITY_CLOSE || transit == TRANSIT_TASK_CLOSE || transit == TRANSIT_TASK_TO_BACK)) { @@ -963,22 +965,23 @@ public class AppTransition implements Dump { : com.android.internal.R.anim.voice_activity_close_exit); if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG, "applyAnimation voice:" - + " anim=" + a + " transit=" + transit + " isEntrance=" + enter - + " Callers=" + Debug.getCallers(3)); + + " anim=" + a + " transit=" + appTransitionToString(transit) + + " isEntrance=" + enter + " Callers=" + Debug.getCallers(3)); } else if (mNextAppTransitionType == NEXT_TRANSIT_TYPE_CUSTOM) { a = loadAnimationRes(mNextAppTransitionPackage, enter ? mNextAppTransitionEnter : mNextAppTransitionExit); if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG, "applyAnimation:" + " anim=" + a + " nextAppTransition=ANIM_CUSTOM" - + " transit=" + transit + " isEntrance=" + enter + + " transit=" + appTransitionToString(transit) + " isEntrance=" + enter + " Callers=" + Debug.getCallers(3)); } else if (mNextAppTransitionType == NEXT_TRANSIT_TYPE_CUSTOM_IN_PLACE) { a = loadAnimationRes(mNextAppTransitionPackage, mNextAppTransitionInPlace); if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG, "applyAnimation:" - + " anim=" + a + " nextAppTransition=ANIM_CUSTOM_IN_PLACE" - + " transit=" + transit + " Callers=" + Debug.getCallers(3)); + + " anim=" + a + " nextAppTransition=ANIM_CUSTOM_IN_PLACE" + + " transit=" + appTransitionToString(transit) + + " Callers=" + Debug.getCallers(3)); } else if (mNextAppTransitionType == NEXT_TRANSIT_TYPE_CLIP_REVEAL) { a = createClipRevealAnimationLocked(transit, enter, appFrame); if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG, @@ -990,7 +993,7 @@ public class AppTransition implements Dump { if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.v(TAG, "applyAnimation:" + " anim=" + a + " nextAppTransition=ANIM_SCALE_UP" - + " transit=" + transit + " isEntrance=" + enter + + " transit=" + appTransitionToString(transit) + " isEntrance=" + enter + " Callers=" + Debug.getCallers(3)); } else if (mNextAppTransitionType == NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_UP || mNextAppTransitionType == NEXT_TRANSIT_TYPE_THUMBNAIL_SCALE_DOWN) { @@ -1003,7 +1006,7 @@ public class AppTransition implements Dump { "ANIM_THUMBNAIL_SCALE_UP" : "ANIM_THUMBNAIL_SCALE_DOWN"; Slog.v(TAG, "applyAnimation:" + " anim=" + a + " nextAppTransition=" + animName - + " transit=" + transit + " isEntrance=" + enter + + " transit=" + appTransitionToString(transit) + " isEntrance=" + enter + " Callers=" + Debug.getCallers(3)); } } else if (mNextAppTransitionType == NEXT_TRANSIT_TYPE_THUMBNAIL_ASPECT_SCALE_UP || @@ -1018,7 +1021,7 @@ public class AppTransition implements Dump { "ANIM_THUMBNAIL_ASPECT_SCALE_UP" : "ANIM_THUMBNAIL_ASPECT_SCALE_DOWN"; Slog.v(TAG, "applyAnimation:" + " anim=" + a + " nextAppTransition=" + animName - + " transit=" + transit + " isEntrance=" + enter + + " transit=" + appTransitionToString(transit) + " isEntrance=" + enter + " Callers=" + Debug.getCallers(3)); } } else { @@ -1084,7 +1087,7 @@ public class AppTransition implements Dump { "applyAnimation:" + " anim=" + a + " animAttr=0x" + Integer.toHexString(animAttr) - + " transit=" + transit + " isEntrance=" + enter + + " transit=" + appTransitionToString(transit) + " isEntrance=" + enter + " Callers=" + Debug.getCallers(3)); } return a; @@ -1188,7 +1191,7 @@ public class AppTransition implements Dump { @Override public String toString() { - return "mNextAppTransition=0x" + Integer.toHexString(mNextAppTransition); + return "mNextAppTransition=" + appTransitionToString(mNextAppTransition); } /** diff --git a/services/core/java/com/android/server/wm/AppWindowAnimator.java b/services/core/java/com/android/server/wm/AppWindowAnimator.java index 21011e8..3feec82 100644 --- a/services/core/java/com/android/server/wm/AppWindowAnimator.java +++ b/services/core/java/com/android/server/wm/AppWindowAnimator.java @@ -16,6 +16,11 @@ package com.android.server.wm; +import static com.android.server.wm.WindowManagerService.DEBUG_ANIM; +import static com.android.server.wm.WindowManagerService.DEBUG_LAYERS; +import static com.android.server.wm.WindowManagerService.SHOW_TRANSACTIONS; +import static com.android.server.wm.WindowManagerService.TYPE_LAYER_OFFSET; + import android.graphics.Matrix; import android.util.Slog; import android.util.TimeUtils; @@ -78,7 +83,11 @@ public class AppWindowAnimator { boolean deferFinalFrameCleanup; /** WindowStateAnimator from mAppAnimator.allAppWindows as of last performLayout */ - ArrayList<WindowStateAnimator> mAllAppWinAnimators = new ArrayList<WindowStateAnimator>(); + ArrayList<WindowStateAnimator> mAllAppWinAnimators = new ArrayList<>(); + + /** True if the current animation was transferred from another AppWindowAnimator. + * See {@link #transferCurrentAnimation}*/ + boolean usingTransferredAnimation = false; static final Animation sDummyAnimation = new DummyAnimation(); @@ -102,9 +111,9 @@ public class AppWindowAnimator { int zorder = anim.getZAdjustment(); int adj = 0; if (zorder == Animation.ZORDER_TOP) { - adj = WindowManagerService.TYPE_LAYER_OFFSET; + adj = TYPE_LAYER_OFFSET; } else if (zorder == Animation.ZORDER_BOTTOM) { - adj = -WindowManagerService.TYPE_LAYER_OFFSET; + adj = -TYPE_LAYER_OFFSET; } if (animLayerAdjustment != adj) { @@ -140,6 +149,7 @@ public class AppWindowAnimator { mAppToken.allDrawn = false; mAppToken.deferClearAllDrawn = false; } + usingTransferredAnimation = false; } public boolean isAnimating() { @@ -154,19 +164,38 @@ public class AppWindowAnimator { deferThumbnailDestruction = false; } + void transferCurrentAnimation( + AppWindowAnimator toAppAnimator, WindowStateAnimator transferWinAnimator) { + + if (animation != null) { + toAppAnimator.animation = animation; + animation = null; + toAppAnimator.animating = animating; + toAppAnimator.animLayerAdjustment = animLayerAdjustment; + animLayerAdjustment = 0; + toAppAnimator.updateLayers(); + updateLayers(); + toAppAnimator.usingTransferredAnimation = true; + } + if (transferWinAnimator != null) { + mAllAppWinAnimators.remove(transferWinAnimator); + toAppAnimator.mAllAppWinAnimators.add(transferWinAnimator); + transferWinAnimator.mAppAnimator = toAppAnimator; + } + } + void updateLayers() { - final int N = mAppToken.allAppWindows.size(); + final int windowCount = mAppToken.allAppWindows.size(); final int adj = animLayerAdjustment; thumbnailLayer = -1; - for (int i=0; i<N; i++) { + for (int i = 0; i < windowCount; i++) { final WindowState w = mAppToken.allAppWindows.get(i); final WindowStateAnimator winAnimator = w.mWinAnimator; winAnimator.mAnimLayer = w.mLayer + adj; if (winAnimator.mAnimLayer > thumbnailLayer) { thumbnailLayer = winAnimator.mAnimLayer; } - if (WindowManagerService.DEBUG_LAYERS) Slog.v(TAG, "Updating layer " + w + ": " - + winAnimator.mAnimLayer); + if (DEBUG_LAYERS) Slog.v(TAG, "Updating layer " + w + ": " + winAnimator.mAnimLayer); if (w == mService.mInputMethodTarget && !mService.mInputMethodTargetWaitingAnim) { mService.setInputMethodAnimLayerAdjustment(adj); } @@ -191,11 +220,11 @@ public class AppWindowAnimator { // cache often used attributes locally final float tmpFloats[] = mService.mTmpFloats; thumbnailTransformation.getMatrix().getValues(tmpFloats); - if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(thumbnail, + if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(thumbnail, "thumbnail", "POS " + tmpFloats[Matrix.MTRANS_X] + ", " + tmpFloats[Matrix.MTRANS_Y], null); thumbnail.setPosition(tmpFloats[Matrix.MTRANS_X], tmpFloats[Matrix.MTRANS_Y]); - if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(thumbnail, + if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(thumbnail, "thumbnail", "alpha=" + thumbnailTransformation.getAlpha() + " layer=" + thumbnailLayer + " matrix=[" + tmpFloats[Matrix.MSCALE_X] @@ -228,14 +257,14 @@ public class AppWindowAnimator { deferFinalFrameCleanup = true; hasMoreFrames = true; } else { - if (false && WindowManagerService.DEBUG_ANIM) Slog.v( - TAG, "Stepped animation in " + mAppToken + ": more=" + hasMoreFrames + - ", xform=" + transformation); + if (false && DEBUG_ANIM) Slog.v(TAG, + "Stepped animation in " + mAppToken + ": more=" + hasMoreFrames + + ", xform=" + transformation); deferFinalFrameCleanup = false; animation = null; clearThumbnail(); - if (WindowManagerService.DEBUG_ANIM) Slog.v( - TAG, "Finished animation in " + mAppToken + " @ " + currentTime); + if (DEBUG_ANIM) Slog.v(TAG, + "Finished animation in " + mAppToken + " @ " + currentTime); } } hasTransformation = hasMoreFrames; @@ -258,8 +287,8 @@ public class AppWindowAnimator { if ((mAppToken.allDrawn || animating || mAppToken.startingDisplayed) && animation != null) { if (!animating) { - if (WindowManagerService.DEBUG_ANIM) Slog.v( - TAG, "Starting animation in " + mAppToken + + if (DEBUG_ANIM) Slog.v(TAG, + "Starting animation in " + mAppToken + " @ " + currentTime + " scale=" + mService.getTransitionAnimationScaleLocked() + " allDrawn=" + mAppToken.allDrawn + " animating=" + animating); @@ -306,8 +335,8 @@ public class AppWindowAnimator { mService.moveInputMethodWindowsIfNeededLocked(true); } - if (WindowManagerService.DEBUG_ANIM) Slog.v( - TAG, "Animation done in " + mAppToken + if (DEBUG_ANIM) Slog.v(TAG, + "Animation done in " + mAppToken + ": reportedVisible=" + mAppToken.reportedVisible); transformation.clear(); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 77694b6..4972ce4 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -495,7 +495,7 @@ public class WindowManagerService extends IWindowManager.Stub String mLastANRState; /** All DisplayContents in the world, kept here */ - SparseArray<DisplayContent> mDisplayContents = new SparseArray<DisplayContent>(2); + SparseArray<DisplayContent> mDisplayContents = new SparseArray<>(2); int mRotation = 0; int mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; @@ -511,7 +511,7 @@ public class WindowManagerService extends IWindowManager.Stub deathRecipient = d; } } - ArrayList<RotationWatcher> mRotationWatchers = new ArrayList<RotationWatcher>(); + ArrayList<RotationWatcher> mRotationWatchers = new ArrayList<>(); int mDeferredRotationPauseCount; int mSystemDecorLayer = 0; @@ -552,11 +552,10 @@ public class WindowManagerService extends IWindowManager.Stub private final PowerManager.WakeLock mScreenFrozenLock; final AppTransition mAppTransition; - boolean mStartingIconInTransition = false; boolean mSkipAppTransitionAnimation = false; - final ArraySet<AppWindowToken> mOpeningApps = new ArraySet<AppWindowToken>(); - final ArraySet<AppWindowToken> mClosingApps = new ArraySet<AppWindowToken>(); + final ArraySet<AppWindowToken> mOpeningApps = new ArraySet<>(); + final ArraySet<AppWindowToken> mClosingApps = new ArraySet<>(); boolean mIsTouchDevice; @@ -581,7 +580,7 @@ public class WindowManagerService extends IWindowManager.Stub int mInputMethodAnimLayerAdjustment; WindowState mInputMethodWindow = null; - final ArrayList<WindowState> mInputMethodDialogs = new ArrayList<WindowState>(); + final ArrayList<WindowState> mInputMethodDialogs = new ArrayList<>(); /** Temporary list for comparison. Always clear this after use so we don't end up with * orphaned windows references */ @@ -4146,8 +4145,8 @@ public class WindowManagerService extends IWindowManager.Stub } synchronized(mWindowMap) { - if (DEBUG_APP_TRANSITIONS) Slog.v( - TAG, "Prepare app transition: transit=" + transit + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Prepare app transition:" + + " transit=" + AppTransition.appTransitionToString(transit) + " " + mAppTransition + " alwaysKeepCurrent=" + alwaysKeepCurrent + " Callers=" + Debug.getCallers(3)); @@ -4166,9 +4165,7 @@ public class WindowManagerService extends IWindowManager.Stub mAppTransition.setAppTransition(transit); } } - if (okToDisplay()) { - mAppTransition.prepare(); - mStartingIconInTransition = false; + if (okToDisplay() && mAppTransition.prepare()) { mSkipAppTransitionAnimation = false; } if (mAppTransition.isTransitionSet()) { @@ -4295,19 +4292,16 @@ public class WindowManagerService extends IWindowManager.Stub if (ttoken != null) { WindowState startingWindow = ttoken.startingWindow; if (startingWindow != null) { - if (mStartingIconInTransition) { - // In this case, the starting icon has already - // been displayed, so start letting windows get - // shown immediately without any more transitions. - mSkipAppTransitionAnimation = true; - } + // In this case, the starting icon has already been displayed, so start + // letting windows get shown immediately without any more transitions. + mSkipAppTransitionAnimation = true; + if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Moving existing starting " + startingWindow + " from " + ttoken + " to " + wtoken); final long origId = Binder.clearCallingIdentity(); - // Transfer the starting window over to the new - // token. + // Transfer the starting window over to the new token. wtoken.startingData = ttoken.startingData; wtoken.startingView = ttoken.startingView; wtoken.startingDisplayed = ttoken.startingDisplayed; @@ -4321,7 +4315,6 @@ public class WindowManagerService extends IWindowManager.Stub startingWindow.mToken = wtoken; startingWindow.mRootToken = wtoken; startingWindow.mAppToken = wtoken; - startingWindow.mWinAnimator.mAppAnimator = wtoken.mAppAnimator; if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE || DEBUG_STARTING_WINDOW) { Slog.v(TAG, "Removing starting window: " + startingWindow); @@ -4355,17 +4348,8 @@ public class WindowManagerService extends IWindowManager.Stub wtoken.clientHidden = ttoken.clientHidden; wtoken.sendAppVisibilityToClients(); } - final AppWindowAnimator tAppAnimator = ttoken.mAppAnimator; - final AppWindowAnimator wAppAnimator = wtoken.mAppAnimator; - if (tAppAnimator.animation != null) { - wAppAnimator.animation = tAppAnimator.animation; - wAppAnimator.animating = tAppAnimator.animating; - wAppAnimator.animLayerAdjustment = tAppAnimator.animLayerAdjustment; - tAppAnimator.animation = null; - tAppAnimator.animLayerAdjustment = 0; - wAppAnimator.updateLayers(); - tAppAnimator.updateLayers(); - } + ttoken.mAppAnimator.transferCurrentAnimation( + wtoken.mAppAnimator, startingWindow.mWinAnimator); updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, true /*updateInputWindows*/); @@ -4465,7 +4449,6 @@ public class WindowManagerService extends IWindowManager.Stub } if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Creating StartingData"); - mStartingIconInTransition = true; wtoken.startingData = new StartingData(pkg, theme, compatInfo, nonLocalizedLabel, labelRes, icon, logo, windowFlags); Message m = mH.obtainMessage(H.ADD_STARTING, wtoken); @@ -4566,8 +4549,8 @@ public class WindowManagerService extends IWindowManager.Stub changed = true; } - final int N = wtoken.allAppWindows.size(); - for (int i=0; i<N; i++) { + final int windowsCount = wtoken.allAppWindows.size(); + for (int i = 0; i < windowsCount; i++) { WindowState win = wtoken.allAppWindows.get(i); if (win == wtoken.startingWindow) { continue; @@ -4696,7 +4679,7 @@ public class WindowManagerService extends IWindowManager.Stub // If we are preparing an app transition, then delay changing // the visibility of this token until we execute that transition. if (okToDisplay() && mAppTransition.isTransitionSet()) { - if (!wtoken.startingDisplayed) { + if (!wtoken.startingDisplayed || mSkipAppTransitionAnimation) { if (DEBUG_APP_TRANSITIONS) Slog.v( TAG, "Setting dummy animation on: " + wtoken); wtoken.mAppAnimator.setDummyAnimation(); @@ -9178,14 +9161,14 @@ public class WindowManagerService extends IWindowManager.Stub public int handleAppTransitionReadyLocked(WindowList windows) { int changes = 0; int i; - int NN = mOpeningApps.size(); + int appsCount = mOpeningApps.size(); boolean goodToGo = true; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, - "Checking " + NN + " opening apps (frozen=" + "Checking " + appsCount + " opening apps (frozen=" + mDisplayFrozen + " timeout=" + mAppTransition.isTimeout() + ")..."); if (!mAppTransition.isTimeout()) { - for (i=0; i<NN && goodToGo; i++) { + for (i = 0; i < appsCount && goodToGo; i++) { AppWindowToken wtoken = mOpeningApps.valueAt(i); if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Check opening app=" + wtoken + ": allDrawn=" @@ -9238,7 +9221,6 @@ public class WindowManagerService extends IWindowManager.Stub if (mSkipAppTransitionAnimation) { transit = AppTransition.TRANSIT_UNSET; } - mStartingIconInTransition = false; mSkipAppTransitionAnimation = false; mH.removeMessages(H.APP_TRANSITION_TIMEOUT); @@ -9287,17 +9269,17 @@ public class WindowManagerService extends IWindowManager.Stub // (2) Find the layout params of the top-most // application window in the tokens, which is // what will control the animation theme. - final int NC = mClosingApps.size(); - NN = NC + mOpeningApps.size(); - for (i=0; i<NN; i++) { + final int closingAppsCount = mClosingApps.size(); + appsCount = closingAppsCount + mOpeningApps.size(); + for (i = 0; i < appsCount; i++) { final AppWindowToken wtoken; - if (i < NC) { + if (i < closingAppsCount) { wtoken = mClosingApps.valueAt(i); if (wtoken == lowerWallpaperAppToken || wtoken == upperWallpaperAppToken) { closingAppHasWallpaper = true; } } else { - wtoken = mOpeningApps.valueAt(i - NC); + wtoken = mOpeningApps.valueAt(i - closingAppsCount); if (wtoken == lowerWallpaperAppToken || wtoken == upperWallpaperAppToken) { openingAppHasWallpaper = true; } @@ -9338,20 +9320,23 @@ public class WindowManagerService extends IWindowManager.Stub transit = AppTransition.TRANSIT_WALLPAPER_INTRA_CLOSE; break; } - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit: " + transit); + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, + "New transit: " + AppTransition.appTransitionToString(transit)); } else if ((oldWallpaper != null) && !mOpeningApps.isEmpty() && !mOpeningApps.contains(oldWallpaper.mAppToken)) { // We are transitioning from an activity with // a wallpaper to one without. transit = AppTransition.TRANSIT_WALLPAPER_CLOSE; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, - "New transit away from wallpaper: " + transit); + "New transit away from wallpaper: " + + AppTransition.appTransitionToString(transit)); } else if (mWallpaperTarget != null && mWallpaperTarget.isVisibleLw()) { // We are transitioning from an activity without // a wallpaper to now showing the wallpaper transit = AppTransition.TRANSIT_WALLPAPER_OPEN; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, - "New transit into wallpaper: " + transit); + "New transit into wallpaper: " + + AppTransition.appTransitionToString(transit)); } else { mAnimateWallpaperWithTarget = true; } @@ -9395,21 +9380,24 @@ public class WindowManagerService extends IWindowManager.Stub } } - NN = mOpeningApps.size(); - for (i=0; i<NN; i++) { + appsCount = mOpeningApps.size(); + for (i = 0; i < appsCount; i++) { AppWindowToken wtoken = mOpeningApps.valueAt(i); final AppWindowAnimator appAnimator = wtoken.mAppAnimator; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now opening app" + wtoken); - appAnimator.clearThumbnail(); - appAnimator.animation = null; + + if (!appAnimator.usingTransferredAnimation) { + appAnimator.clearThumbnail(); + appAnimator.animation = null; + } wtoken.inPendingTransaction = false; setTokenVisibilityLocked(wtoken, animLp, true, transit, false, voiceInteraction); wtoken.updateReportedVisibilityLocked(); wtoken.waitingToShow = false; appAnimator.mAllAppWinAnimators.clear(); - final int N = wtoken.allAppWindows.size(); - for (int j = 0; j < N; j++) { + final int windowsCount = wtoken.allAppWindows.size(); + for (int j = 0; j < windowsCount; j++) { appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator); } mAnimator.mAnimating |= appAnimator.showAllWindowsLocked(); @@ -9417,7 +9405,7 @@ public class WindowManagerService extends IWindowManager.Stub if (animLp != null) { int layer = -1; - for (int j=0; j<wtoken.windows.size(); j++) { + for (int j = 0; j < wtoken.windows.size(); j++) { WindowState win = wtoken.windows.get(j); if (win.mWinAnimator.mAnimLayer > layer) { layer = win.mWinAnimator.mAnimLayer; @@ -9429,8 +9417,8 @@ public class WindowManagerService extends IWindowManager.Stub } } } - NN = mClosingApps.size(); - for (i=0; i<NN; i++) { + appsCount = mClosingApps.size(); + for (i = 0; i < appsCount; i++) { AppWindowToken wtoken = mClosingApps.valueAt(i); final AppWindowAnimator appAnimator = wtoken.mAppAnimator; if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now closing app " + wtoken); @@ -9454,7 +9442,7 @@ public class WindowManagerService extends IWindowManager.Stub if (animLp != null) { int layer = -1; - for (int j=0; j<wtoken.windows.size(); j++) { + for (int j = 0; j < wtoken.windows.size(); j++) { WindowState win = wtoken.windows.get(j); if (win.mWinAnimator.mAnimLayer > layer) { layer = win.mWinAnimator.mAnimLayer; @@ -11407,8 +11395,7 @@ public class WindowManagerService extends IWindowManager.Stub pw.print(" transition="); pw.print(mTransitionAnimationScaleSetting); pw.print(" animator="); pw.println(mAnimatorDurationScaleSetting); pw.print(" mTraversalScheduled="); pw.println(mTraversalScheduled); - pw.print(" mStartingIconInTransition="); pw.print(mStartingIconInTransition); - pw.print(" mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation); + pw.print(" mSkipAppTransitionAnimation="); pw.println(mSkipAppTransitionAnimation); pw.println(" mLayoutToAnim:"); mAppTransition.dump(pw, " "); } diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index bfd6cc0..f7bcf2a 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -100,7 +100,7 @@ public class UsageStatsService extends SystemService implements static final long DEFAULT_APP_IDLE_THRESHOLD_MILLIS = DEBUG ? ONE_MINUTE * 4 : 1L * 24 * 60 * ONE_MINUTE; // 1 day - static final long DEFAULT_CHECK_IDLE_INTERVAL = DEBUG ? ONE_MINUTE / 4 + static final long DEFAULT_CHECK_IDLE_INTERVAL = DEBUG ? ONE_MINUTE : 8 * 60 * ONE_MINUTE; // 8 hours static final long DEFAULT_PAROLE_INTERVAL = DEBUG ? ONE_MINUTE * 10 : 24 * 60 * ONE_MINUTE; // 24 hours between paroles @@ -336,6 +336,7 @@ public class UsageStatsService extends SystemService implements /** Check all running users' apps to see if they enter an idle state. */ void checkIdleStates() { + if (DEBUG) Slog.d(TAG, "Checking idle state"); final int[] runningUsers; try { runningUsers = ActivityManagerNative.getDefault().getRunningUserIds(); diff --git a/telecomm/java/android/telecom/AudioState.java b/telecomm/java/android/telecom/AudioState.java index 465c5f4..33013ac 100644 --- a/telecomm/java/android/telecom/AudioState.java +++ b/telecomm/java/android/telecom/AudioState.java @@ -16,6 +16,7 @@ package android.telecom; +import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; @@ -24,8 +25,12 @@ import java.util.Locale; /** * Encapsulates the telecom audio state, including the current audio routing, supported audio * routing and mute. + * @deprecated - use {@link CallAudioState} instead. + * @hide */ -public final class AudioState implements Parcelable { +@Deprecated +@SystemApi +public class AudioState implements Parcelable { /** Direct the audio stream through the device's earpiece. */ public static final int ROUTE_EARPIECE = 0x00000001; @@ -64,6 +69,12 @@ public final class AudioState implements Parcelable { supportedRouteMask = state.getSupportedRouteMask(); } + public AudioState(CallAudioState state) { + isMuted = state.isMuted(); + route = state.getRoute(); + supportedRouteMask = state.getSupportedRouteMask(); + } + @Override public boolean equals(Object obj) { if (obj == null) { diff --git a/telecomm/java/android/telecom/CallAudioState.aidl b/telecomm/java/android/telecom/CallAudioState.aidl new file mode 100644 index 0000000..90dbbe5 --- /dev/null +++ b/telecomm/java/android/telecom/CallAudioState.aidl @@ -0,0 +1,22 @@ +/* + * 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 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.telecom; + +/** + * {@hide} + */ +parcelable CallAudioState; diff --git a/telecomm/java/android/telecom/CallAudioState.java b/telecomm/java/android/telecom/CallAudioState.java new file mode 100644 index 0000000..2b16722 --- /dev/null +++ b/telecomm/java/android/telecom/CallAudioState.java @@ -0,0 +1,209 @@ +/* + * 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.telecom; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.Locale; + +/** + * Encapsulates the telecom audio state, including the current audio routing, supported audio + * routing and mute. + */ +public final class CallAudioState implements Parcelable { + /** Direct the audio stream through the device's earpiece. */ + public static final int ROUTE_EARPIECE = 0x00000001; + + /** Direct the audio stream through Bluetooth. */ + public static final int ROUTE_BLUETOOTH = 0x00000002; + + /** Direct the audio stream through a wired headset. */ + public static final int ROUTE_WIRED_HEADSET = 0x00000004; + + /** Direct the audio stream through the device's speakerphone. */ + public static final int ROUTE_SPEAKER = 0x00000008; + + /** + * Direct the audio stream through the device's earpiece or wired headset if one is + * connected. + */ + public static final int ROUTE_WIRED_OR_EARPIECE = ROUTE_EARPIECE | ROUTE_WIRED_HEADSET; + + /** Bit mask of all possible audio routes. */ + private static final int ROUTE_ALL = ROUTE_EARPIECE | ROUTE_BLUETOOTH | ROUTE_WIRED_HEADSET | + ROUTE_SPEAKER; + + private final boolean isMuted; + private final int route; + private final int supportedRouteMask; + + /** + * Constructor for a {@link CallAudioState} object. + * + * @param muted {@code true} if the call is muted, {@code false} otherwise. + * @param route The current audio route being used. + * Allowed values: + * {@link #ROUTE_EARPIECE} + * {@link #ROUTE_BLUETOOTH} + * {@link #ROUTE_WIRED_HEADSET} + * {@link #ROUTE_SPEAKER} + * @param supportedRouteMask Bit mask of all routes supported by this call. This should be a + * bitwise combination of the following values: + * {@link #ROUTE_EARPIECE} + * {@link #ROUTE_BLUETOOTH} + * {@link #ROUTE_WIRED_HEADSET} + * {@link #ROUTE_SPEAKER} + */ + public CallAudioState(boolean muted, int route, int supportedRouteMask) { + this.isMuted = muted; + this.route = route; + this.supportedRouteMask = supportedRouteMask; + } + + /** @hide */ + public CallAudioState(CallAudioState state) { + isMuted = state.isMuted(); + route = state.getRoute(); + supportedRouteMask = state.getSupportedRouteMask(); + } + + /** @hide */ + @SuppressWarnings("deprecation") + public CallAudioState(AudioState state) { + isMuted = state.isMuted(); + route = state.getRoute(); + supportedRouteMask = state.getSupportedRouteMask(); + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (!(obj instanceof CallAudioState)) { + return false; + } + CallAudioState state = (CallAudioState) obj; + return isMuted() == state.isMuted() && getRoute() == state.getRoute() && + getSupportedRouteMask() == state.getSupportedRouteMask(); + } + + @Override + public String toString() { + return String.format(Locale.US, + "[AudioState isMuted: %b, route: %s, supportedRouteMask: %s]", + isMuted, + audioRouteToString(route), + audioRouteToString(supportedRouteMask)); + } + + /** + * @return {@code true} if the call is muted, {@code false} otherwise. + */ + public boolean isMuted() { + return isMuted; + } + + /** + * @return The current audio route being used. + */ + public int getRoute() { + return route; + } + + /** + * @return Bit mask of all routes supported by this call. + */ + public int getSupportedRouteMask() { + return supportedRouteMask; + } + + /** + * Converts the provided audio route into a human readable string representation. + * + * @param route to convert into a string. + * + * @return String representation of the provided audio route. + */ + public static String audioRouteToString(int route) { + if (route == 0 || (route & ~ROUTE_ALL) != 0x0) { + return "UNKNOWN"; + } + + StringBuffer buffer = new StringBuffer(); + if ((route & ROUTE_EARPIECE) == ROUTE_EARPIECE) { + listAppend(buffer, "EARPIECE"); + } + if ((route & ROUTE_BLUETOOTH) == ROUTE_BLUETOOTH) { + listAppend(buffer, "BLUETOOTH"); + } + if ((route & ROUTE_WIRED_HEADSET) == ROUTE_WIRED_HEADSET) { + listAppend(buffer, "WIRED_HEADSET"); + } + if ((route & ROUTE_SPEAKER) == ROUTE_SPEAKER) { + listAppend(buffer, "SPEAKER"); + } + + return buffer.toString(); + } + + /** + * Responsible for creating AudioState objects for deserialized Parcels. + */ + public static final Parcelable.Creator<CallAudioState> CREATOR = + new Parcelable.Creator<CallAudioState> () { + + @Override + public CallAudioState createFromParcel(Parcel source) { + boolean isMuted = source.readByte() == 0 ? false : true; + int route = source.readInt(); + int supportedRouteMask = source.readInt(); + return new CallAudioState(isMuted, route, supportedRouteMask); + } + + @Override + public CallAudioState[] newArray(int size) { + return new CallAudioState[size]; + } + }; + + /** + * {@inheritDoc} + */ + @Override + public int describeContents() { + return 0; + } + + /** + * Writes AudioState object into a serializeable Parcel. + */ + @Override + public void writeToParcel(Parcel destination, int flags) { + destination.writeByte((byte) (isMuted ? 1 : 0)); + destination.writeInt(route); + destination.writeInt(supportedRouteMask); + } + + private static void listAppend(StringBuffer buffer, String str) { + if (buffer.length() > 0) { + buffer.append(", "); + } + buffer.append(str); + } +} diff --git a/telecomm/java/android/telecom/Conference.java b/telecomm/java/android/telecom/Conference.java index 6fa94b9..d8d9ab6 100644 --- a/telecomm/java/android/telecom/Conference.java +++ b/telecomm/java/android/telecom/Conference.java @@ -63,7 +63,7 @@ public abstract class Conference implements Conferenceable { Collections.unmodifiableList(mConferenceableConnections); private PhoneAccountHandle mPhoneAccount; - private AudioState mAudioState; + private CallAudioState mCallAudioState; private int mState = Connection.STATE_NEW; private DisconnectCause mDisconnectCause; private int mConnectionCapabilities; @@ -173,9 +173,22 @@ public abstract class Conference implements Conferenceable { * @return The audio state of the conference, describing how its audio is currently * being routed by the system. This is {@code null} if this Conference * does not directly know about its audio state. + * @deprecated Use {@link #getCallAudioState()} instead. + * @hide */ + @Deprecated + @SystemApi public final AudioState getAudioState() { - return mAudioState; + return new AudioState(mCallAudioState); + } + + /** + * @return The audio state of the conference, describing how its audio is currently + * being routed by the system. This is {@code null} if this Conference + * does not directly know about its audio state. + */ + public final CallAudioState getCallAudioState() { + return mCallAudioState; } /** @@ -249,10 +262,21 @@ public abstract class Conference implements Conferenceable { * Notifies this conference that the {@link #getAudioState()} property has a new value. * * @param state The new call audio state. + * @deprecated Use {@link #onCallAudioStateChanged(CallAudioState)} instead. + * @hide */ + @SystemApi + @Deprecated public void onAudioStateChanged(AudioState state) {} /** + * Notifies this conference that the {@link #getCallAudioState()} property has a new value. + * + * @param state The new call audio state. + */ + public void onCallAudioStateChanged(CallAudioState state) {} + + /** * Notifies this conference that a connection has been added to it. * * @param connection The newly added connection. @@ -515,10 +539,11 @@ public abstract class Conference implements Conferenceable { * @param state The new audio state. * @hide */ - final void setAudioState(AudioState state) { - Log.d(this, "setAudioState %s", state); - mAudioState = state; - onAudioStateChanged(state); + final void setCallAudioState(CallAudioState state) { + Log.d(this, "setCallAudioState %s", state); + mCallAudioState = state; + onAudioStateChanged(getAudioState()); + onCallAudioStateChanged(state); } private void setState(int newState) { diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index 2ee5d25..f39f813 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -20,6 +20,7 @@ import com.android.internal.os.SomeArgs; import com.android.internal.telecom.IVideoCallback; import com.android.internal.telecom.IVideoProvider; +import android.annotation.SystemApi; import android.net.Uri; import android.os.Handler; import android.os.IBinder; @@ -817,7 +818,7 @@ public abstract class Connection implements Conferenceable { Collections.unmodifiableList(mConferenceables); private int mState = STATE_NEW; - private AudioState mAudioState; + private CallAudioState mCallAudioState; private Uri mAddress; private int mAddressPresentation; private String mCallerDisplayName; @@ -892,9 +893,22 @@ public abstract class Connection implements Conferenceable { * @return The audio state of the connection, describing how its audio is currently * being routed by the system. This is {@code null} if this Connection * does not directly know about its audio state. + * @deprecated Use {@link #getCallAudioState()} instead. + * @hide */ + @SystemApi + @Deprecated public final AudioState getAudioState() { - return mAudioState; + return new AudioState(mCallAudioState); + } + + /** + * @return The audio state of the connection, describing how its audio is currently + * being routed by the system. This is {@code null} if this Connection + * does not directly know about its audio state. + */ + public final CallAudioState getCallAudioState() { + return mCallAudioState; } /** @@ -968,11 +982,12 @@ public abstract class Connection implements Conferenceable { * @param state The new audio state. * @hide */ - final void setAudioState(AudioState state) { + final void setCallAudioState(CallAudioState state) { checkImmutable(); Log.d(this, "setAudioState %s", state); - mAudioState = state; - onAudioStateChanged(state); + mCallAudioState = state; + onAudioStateChanged(getAudioState()); + onCallAudioStateChanged(state); } /** @@ -1359,10 +1374,21 @@ public abstract class Connection implements Conferenceable { * Notifies this Connection that the {@link #getAudioState()} property has a new value. * * @param state The new connection audio state. + * @deprecated Use {@link #onCallAudioStateChanged(CallAudioState)} instead. + * @hide */ + @SystemApi + @Deprecated public void onAudioStateChanged(AudioState state) {} /** + * Notifies this Connection that the {@link #getCallAudioState()} property has a new value. + * + * @param state The new connection audio state. + */ + public void onCallAudioStateChanged(CallAudioState state) {} + + /** * Notifies this Connection of an internal state change. This method is called after the * state is changed. * diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java index 13eb016..199100b 100644 --- a/telecomm/java/android/telecom/ConnectionService.java +++ b/telecomm/java/android/telecom/ConnectionService.java @@ -50,7 +50,7 @@ import java.util.concurrent.ConcurrentHashMap; * <pre> * <service android:name="com.example.package.MyConnectionService" * android:label="@string/some_label_for_my_connection_service" - * android:permission="android.permission.BIND_CONNECTION_SERVICE"> + * android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE"> * <intent-filter> * <action android:name="android.telecom.ConnectionService" /> * </intent-filter> @@ -90,7 +90,7 @@ public abstract class ConnectionService extends Service { private static final int MSG_DISCONNECT = 6; private static final int MSG_HOLD = 7; private static final int MSG_UNHOLD = 8; - private static final int MSG_ON_AUDIO_STATE_CHANGED = 9; + private static final int MSG_ON_CALL_AUDIO_STATE_CHANGED = 9; private static final int MSG_PLAY_DTMF_TONE = 10; private static final int MSG_STOP_DTMF_TONE = 11; private static final int MSG_CONFERENCE = 12; @@ -180,11 +180,11 @@ public abstract class ConnectionService extends Service { } @Override - public void onAudioStateChanged(String callId, AudioState audioState) { + public void onCallAudioStateChanged(String callId, CallAudioState callAudioState) { SomeArgs args = SomeArgs.obtain(); args.arg1 = callId; - args.arg2 = audioState; - mHandler.obtainMessage(MSG_ON_AUDIO_STATE_CHANGED, args).sendToTarget(); + args.arg2 = callAudioState; + mHandler.obtainMessage(MSG_ON_CALL_AUDIO_STATE_CHANGED, args).sendToTarget(); } @Override @@ -304,12 +304,12 @@ public abstract class ConnectionService extends Service { case MSG_UNHOLD: unhold((String) msg.obj); break; - case MSG_ON_AUDIO_STATE_CHANGED: { + case MSG_ON_CALL_AUDIO_STATE_CHANGED: { SomeArgs args = (SomeArgs) msg.obj; try { String callId = (String) args.arg1; - AudioState audioState = (AudioState) args.arg2; - onAudioStateChanged(callId, audioState); + CallAudioState audioState = (CallAudioState) args.arg2; + onCallAudioStateChanged(callId, new CallAudioState(audioState)); } finally { args.recycle(); } @@ -688,12 +688,14 @@ public abstract class ConnectionService extends Service { } } - private void onAudioStateChanged(String callId, AudioState audioState) { - Log.d(this, "onAudioStateChanged %s %s", callId, audioState); + private void onCallAudioStateChanged(String callId, CallAudioState callAudioState) { + Log.d(this, "onAudioStateChanged %s %s", callId, callAudioState); if (mConnectionById.containsKey(callId)) { - findConnectionForAction(callId, "onAudioStateChanged").setAudioState(audioState); + findConnectionForAction(callId, "onCallAudioStateChanged").setCallAudioState( + callAudioState); } else { - findConferenceForAction(callId, "onAudioStateChanged").setAudioState(audioState); + findConferenceForAction(callId, "onCallAudioStateChanged").setCallAudioState( + callAudioState); } } diff --git a/telecomm/java/android/telecom/InCallAdapter.java b/telecomm/java/android/telecom/InCallAdapter.java index 62b8dea..0cf7212 100644 --- a/telecomm/java/android/telecom/InCallAdapter.java +++ b/telecomm/java/android/telecom/InCallAdapter.java @@ -119,7 +119,7 @@ public final class InCallAdapter { } /** - * Sets the audio route (speaker, bluetooth, etc...). See {@link AudioState}. + * Sets the audio route (speaker, bluetooth, etc...). See {@link CallAudioState}. * * @param route The audio route to use. */ diff --git a/telecomm/java/android/telecom/InCallService.java b/telecomm/java/android/telecom/InCallService.java index 182a7f5..e37cff7 100644 --- a/telecomm/java/android/telecom/InCallService.java +++ b/telecomm/java/android/telecom/InCallService.java @@ -52,7 +52,7 @@ public abstract class InCallService extends Service { private static final int MSG_ADD_CALL = 2; private static final int MSG_UPDATE_CALL = 3; private static final int MSG_SET_POST_DIAL_WAIT = 4; - private static final int MSG_ON_AUDIO_STATE_CHANGED = 5; + private static final int MSG_ON_CALL_AUDIO_STATE_CHANGED = 5; private static final int MSG_BRING_TO_FOREGROUND = 6; private static final int MSG_ON_CAN_ADD_CALL_CHANGED = 7; @@ -87,8 +87,8 @@ public abstract class InCallService extends Service { } break; } - case MSG_ON_AUDIO_STATE_CHANGED: - mPhone.internalAudioStateChanged((AudioState) msg.obj); + case MSG_ON_CALL_AUDIO_STATE_CHANGED: + mPhone.internalCallAudioStateChanged((CallAudioState) msg.obj); break; case MSG_BRING_TO_FOREGROUND: mPhone.internalBringToForeground(msg.arg1 == 1); @@ -133,8 +133,8 @@ public abstract class InCallService extends Service { } @Override - public void onAudioStateChanged(AudioState audioState) { - mHandler.obtainMessage(MSG_ON_AUDIO_STATE_CHANGED, audioState).sendToTarget(); + public void onCallAudioStateChanged(CallAudioState callAudioState) { + mHandler.obtainMessage(MSG_ON_CALL_AUDIO_STATE_CHANGED, callAudioState).sendToTarget(); } @Override @@ -156,6 +156,10 @@ public abstract class InCallService extends Service { InCallService.this.onAudioStateChanged(audioState); } + public void onCallAudioStateChanged(Phone phone, CallAudioState callAudioState) { + InCallService.this.onCallAudioStateChanged(callAudioState); + }; + /** ${inheritDoc} */ @Override public void onBringToForeground(Phone phone, boolean showDialpad) { @@ -248,14 +252,27 @@ public abstract class InCallService extends Service { * * @return An object encapsulating the audio state. Returns null if the service is not * fully initialized. + * @deprecated Use {@link #getCallAudioState()} instead. + * @hide */ + @Deprecated public final AudioState getAudioState() { return mPhone == null ? null : mPhone.getAudioState(); } /** + * Obtains the current phone call audio state. + * + * @return An object encapsulating the audio state. Returns null if the service is not + * fully initialized. + */ + public final CallAudioState getCallAudioState() { + return mPhone == null ? null : mPhone.getCallAudioState(); + } + + /** * Sets the microphone mute state. When this request is honored, there will be change to - * the {@link #getAudioState()}. + * the {@link #getCallAudioState()}. * * @param state {@code true} if the microphone should be muted; {@code false} otherwise. */ @@ -267,7 +284,7 @@ public abstract class InCallService extends Service { /** * Sets the audio route (speaker, bluetooth, etc...). When this request is honored, there will - * be change to the {@link #getAudioState()}. + * be change to the {@link #getCallAudioState()}. * * @param route The audio route to use. */ @@ -311,11 +328,22 @@ public abstract class InCallService extends Service { * Called when the audio state changes. * * @param audioState The new {@link AudioState}. + * @deprecated Use {@link #onCallAudioStateChanged(CallAudioState) instead}. + * @hide */ + @Deprecated public void onAudioStateChanged(AudioState audioState) { } /** + * Called when the audio state changes. + * + * @param audioState The new {@link CallAudioState}. + */ + public void onCallAudioStateChanged(CallAudioState audioState) { + } + + /** * Called to bring the in-call screen to the foreground. The in-call experience should * respond immediately by coming to the foreground to inform the user of the state of * ongoing {@code Call}s. diff --git a/telecomm/java/android/telecom/Phone.java b/telecomm/java/android/telecom/Phone.java index 4cdfd2e..8eb091b 100644 --- a/telecomm/java/android/telecom/Phone.java +++ b/telecomm/java/android/telecom/Phone.java @@ -41,10 +41,21 @@ public final class Phone { * * @param phone The {@code Phone} calling this method. * @param audioState The new {@link AudioState}. + * + * @deprecated Use {@link #onCallAudioStateChanged(Phone, CallAudioState)} instead. */ + @Deprecated public void onAudioStateChanged(Phone phone, AudioState audioState) { } /** + * Called when the audio state changes. + * + * @param phone The {@code Phone} calling this method. + * @param callAudioState The new {@link CallAudioState}. + */ + public void onCallAudioStateChanged(Phone phone, CallAudioState callAudioState) { } + + /** * Called to bring the in-call screen to the foreground. The in-call experience should * respond immediately by coming to the foreground to inform the user of the state of * ongoing {@code Call}s. @@ -100,7 +111,7 @@ public final class Phone { private final InCallAdapter mInCallAdapter; - private AudioState mAudioState; + private CallAudioState mCallAudioState; private final List<Listener> mListeners = new CopyOnWriteArrayList<>(); @@ -145,10 +156,10 @@ public final class Phone { } } - final void internalAudioStateChanged(AudioState audioState) { - if (!Objects.equals(mAudioState, audioState)) { - mAudioState = audioState; - fireAudioStateChanged(audioState); + final void internalCallAudioStateChanged(CallAudioState callAudioState) { + if (!Objects.equals(mCallAudioState, callAudioState)) { + mCallAudioState = callAudioState; + fireCallAudioStateChanged(callAudioState); } } @@ -271,9 +282,20 @@ public final class Phone { * Obtains the current phone call audio state of the {@code Phone}. * * @return An object encapsulating the audio state. + * @deprecated Use {@link #getCallAudioState()} instead. */ + @Deprecated public final AudioState getAudioState() { - return mAudioState; + return new AudioState(mCallAudioState); + } + + /** + * Obtains the current phone call audio state of the {@code Phone}. + * + * @return An object encapsulating the audio state. + */ + public final CallAudioState getCallAudioState() { + return mCallAudioState; } private void fireCallAdded(Call call) { @@ -288,9 +310,10 @@ public final class Phone { } } - private void fireAudioStateChanged(AudioState audioState) { + private void fireCallAudioStateChanged(CallAudioState audioState) { for (Listener listener : mListeners) { - listener.onAudioStateChanged(this, audioState); + listener.onCallAudioStateChanged(this, audioState); + listener.onAudioStateChanged(this, new AudioState(audioState)); } } diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java index 86475b1..f05a1ef 100644 --- a/telecomm/java/android/telecom/PhoneAccount.java +++ b/telecomm/java/android/telecom/PhoneAccount.java @@ -26,6 +26,7 @@ import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; @@ -127,6 +128,7 @@ public final class PhoneAccount implements Parcelable { /** * Indicating no icon tint is set. + * @hide */ public static final int NO_ICON_TINT = 0; @@ -144,14 +146,11 @@ public final class PhoneAccount implements Parcelable { private final Uri mAddress; private final Uri mSubscriptionAddress; private final int mCapabilities; - private final int mIconResId; - private final String mIconPackageName; - private final Bitmap mIconBitmap; - private final int mIconTint; private final int mHighlightColor; private final CharSequence mLabel; private final CharSequence mShortDescription; private final List<String> mSupportedUriSchemes; + private final Icon mIcon; /** * Helper class for creating a {@link PhoneAccount}. @@ -161,14 +160,11 @@ public final class PhoneAccount implements Parcelable { private Uri mAddress; private Uri mSubscriptionAddress; private int mCapabilities; - private int mIconResId; - private String mIconPackageName; - private Bitmap mIconBitmap; - private int mIconTint = NO_ICON_TINT; private int mHighlightColor = NO_HIGHLIGHT_COLOR; private CharSequence mLabel; private CharSequence mShortDescription; private List<String> mSupportedUriSchemes = new ArrayList<String>(); + private Icon mIcon; /** * Creates a builder with the specified {@link PhoneAccountHandle} and label. @@ -189,14 +185,11 @@ public final class PhoneAccount implements Parcelable { mAddress = phoneAccount.getAddress(); mSubscriptionAddress = phoneAccount.getSubscriptionAddress(); mCapabilities = phoneAccount.getCapabilities(); - mIconResId = phoneAccount.getIconResId(); - mIconPackageName = phoneAccount.getIconPackageName(); - mIconBitmap = phoneAccount.getIconBitmap(); - mIconTint = phoneAccount.getIconTint(); mHighlightColor = phoneAccount.getHighlightColor(); mLabel = phoneAccount.getLabel(); mShortDescription = phoneAccount.getShortDescription(); mSupportedUriSchemes.addAll(phoneAccount.getSupportedUriSchemes()); + mIcon = phoneAccount.getIcon(); } /** @@ -233,65 +226,12 @@ public final class PhoneAccount implements Parcelable { } /** - * Sets the icon. See {@link PhoneAccount#createIconDrawable}. - * - * @param packageContext The package from which to load an icon. - * @param iconResId The resource in {@code iconPackageName} representing the icon. - * @return The builder. - */ - public Builder setIcon(Context packageContext, int iconResId) { - return setIcon(packageContext.getPackageName(), iconResId); - } - - /** - * Sets the icon. See {@link PhoneAccount#createIconDrawable}. - * - * @param iconPackageName The package from which to load an icon. - * @param iconResId The resource in {@code iconPackageName} representing the icon. - * @return The builder. - */ - public Builder setIcon(String iconPackageName, int iconResId) { - return setIcon(iconPackageName, iconResId, NO_ICON_TINT); - } - - /** - * Sets the icon. See {@link PhoneAccount#createIconDrawable}. + * Sets the icon. See {@link PhoneAccount#getIcon}. * - * @param packageContext The package from which to load an icon. - * @param iconResId The resource in {@code iconPackageName} representing the icon. - * @param iconTint A color with which to tint this icon. - * @return The builder. + * @param icon The icon to set. */ - public Builder setIcon(Context packageContext, int iconResId, int iconTint) { - return setIcon(packageContext.getPackageName(), iconResId, iconTint); - } - - /** - * Sets the icon. See {@link PhoneAccount#createIconDrawable}. - * - * @param iconPackageName The package from which to load an icon. - * @param iconResId The resource in {@code iconPackageName} representing the icon. - * @param iconTint A color with which to tint this icon. - * @return The builder. - */ - public Builder setIcon(String iconPackageName, int iconResId, int iconTint) { - this.mIconPackageName = iconPackageName; - this.mIconResId = iconResId; - this.mIconTint = iconTint; - return this; - } - - /** - * Sets the icon. See {@link PhoneAccount#createIconDrawable}. - * - * @param iconBitmap The icon bitmap. - * @return The builder. - */ - public Builder setIcon(Bitmap iconBitmap) { - this.mIconBitmap = iconBitmap; - this.mIconPackageName = null; - this.mIconResId = NO_RESOURCE_ID; - this.mIconTint = NO_ICON_TINT; + public Builder setIcon(Icon icon) { + mIcon = icon; return this; } @@ -363,10 +303,7 @@ public final class PhoneAccount implements Parcelable { mAddress, mSubscriptionAddress, mCapabilities, - mIconResId, - mIconPackageName, - mIconBitmap, - mIconTint, + mIcon, mHighlightColor, mLabel, mShortDescription, @@ -379,10 +316,7 @@ public final class PhoneAccount implements Parcelable { Uri address, Uri subscriptionAddress, int capabilities, - int iconResId, - String iconPackageName, - Bitmap iconBitmap, - int iconTint, + Icon icon, int highlightColor, CharSequence label, CharSequence shortDescription, @@ -391,10 +325,7 @@ public final class PhoneAccount implements Parcelable { mAddress = address; mSubscriptionAddress = subscriptionAddress; mCapabilities = capabilities; - mIconResId = iconResId; - mIconPackageName = iconPackageName; - mIconBitmap = iconBitmap; - mIconTint = iconTint; + mIcon = icon; mHighlightColor = highlightColor; mLabel = label; mShortDescription = shortDescription; @@ -497,6 +428,15 @@ public final class PhoneAccount implements Parcelable { } /** + * The icon to represent this {@code PhoneAccount}. + * + * @return The icon. + */ + public Icon getIcon() { + return mIcon; + } + + /** * Determines if the {@link PhoneAccount} supports calls to/from addresses with a specified URI * scheme. * @@ -518,59 +458,6 @@ public final class PhoneAccount implements Parcelable { } /** - * The icon resource ID for the icon of this {@code PhoneAccount}. - * <p> - * Creators of a {@code PhoneAccount} who possess the icon in static resources should prefer - * this method of indicating the icon rather than using {@link #getIconBitmap()}, since it - * leads to less resource usage. - * <p> - * Clients wishing to display a {@code PhoneAccount} should use {@link #createIconDrawable(Context)}. - * - * @return A resource ID. - */ - public int getIconResId() { - return mIconResId; - } - - /** - * The package name from which to load the icon of this {@code PhoneAccount}. - * <p> - * If this property is {@code null}, the resource {@link #getIconResId()} will be loaded from - * the package in the {@link ComponentName} of the {@link #getAccountHandle()}. - * <p> - * Clients wishing to display a {@code PhoneAccount} should use {@link #createIconDrawable(Context)}. - * - * @return A package name. - */ - public String getIconPackageName() { - return mIconPackageName; - } - - /** - * A tint to apply to the icon of this {@code PhoneAccount}. - * - * @return A hexadecimal color value. - */ - public int getIconTint() { - return mIconTint; - } - - /** - * A literal icon bitmap to represent this {@code PhoneAccount} in a user interface. - * <p> - * If this property is specified, it is to be considered the preferred icon. Otherwise, the - * resource specified by {@link #getIconResId()} should be used. - * <p> - * Clients wishing to display a {@code PhoneAccount} should use - * {@link #createIconDrawable(Context)}. - * - * @return A bitmap. - */ - public Bitmap getIconBitmap() { - return mIconBitmap; - } - - /** * A highlight color to use in displaying information about this {@code PhoneAccount}. * * @return A hexadecimal color value. @@ -579,41 +466,6 @@ public final class PhoneAccount implements Parcelable { return mHighlightColor; } - /** - * Builds and returns an icon {@code Drawable} to represent this {@code PhoneAccount} in a user - * interface. Uses the properties {@link #getIconResId()}, {@link #getIconPackageName()}, and - * {@link #getIconBitmap()} as necessary. - * - * @param context A {@code Context} to use for loading {@code Drawable}s. - * - * @return An icon for this {@code PhoneAccount}. - */ - public Drawable createIconDrawable(Context context) { - if (mIconBitmap != null) { - return new BitmapDrawable(context.getResources(), mIconBitmap); - } - - if (mIconResId != 0) { - try { - Context packageContext = context.createPackageContext(mIconPackageName, 0); - try { - Drawable iconDrawable = packageContext.getDrawable(mIconResId); - if (mIconTint != NO_ICON_TINT) { - iconDrawable.setTint(mIconTint); - } - return iconDrawable; - } catch (NotFoundException | MissingResourceException e) { - Log.e(this, e, "Cannot find icon %d in package %s", - mIconResId, mIconPackageName); - } - } catch (PackageManager.NameNotFoundException e) { - Log.w(this, "Cannot find package %s", mIconPackageName); - } - } - - return new ColorDrawable(Color.TRANSPARENT); - } - // // Parcelable implementation // @@ -644,19 +496,16 @@ public final class PhoneAccount implements Parcelable { mSubscriptionAddress.writeToParcel(out, flags); } out.writeInt(mCapabilities); - out.writeInt(mIconResId); - out.writeString(mIconPackageName); - if (mIconBitmap == null) { - out.writeInt(0); - } else { - out.writeInt(1); - mIconBitmap.writeToParcel(out, flags); - } - out.writeInt(mIconTint); out.writeInt(mHighlightColor); out.writeCharSequence(mLabel); out.writeCharSequence(mShortDescription); out.writeStringList(mSupportedUriSchemes); + if (mIcon == null) { + out.writeInt(0); + } else { + out.writeInt(1); + mIcon.writeToParcel(out, flags); + } } public static final Creator<PhoneAccount> CREATOR @@ -689,18 +538,15 @@ public final class PhoneAccount implements Parcelable { mSubscriptionAddress = null; } mCapabilities = in.readInt(); - mIconResId = in.readInt(); - mIconPackageName = in.readString(); - if (in.readInt() > 0) { - mIconBitmap = Bitmap.CREATOR.createFromParcel(in); - } else { - mIconBitmap = null; - } - mIconTint = in.readInt(); mHighlightColor = in.readInt(); mLabel = in.readCharSequence(); mShortDescription = in.readCharSequence(); mSupportedUriSchemes = Collections.unmodifiableList(in.createStringArrayList()); + if (in.readInt() > 0) { + mIcon = Icon.CREATOR.createFromParcel(in); + } else { + mIcon = null; + } } @Override diff --git a/telecomm/java/android/telecom/RemoteConference.java b/telecomm/java/android/telecom/RemoteConference.java index b59584b..095a88f 100644 --- a/telecomm/java/android/telecom/RemoteConference.java +++ b/telecomm/java/android/telecom/RemoteConference.java @@ -18,6 +18,7 @@ package android.telecom; import com.android.internal.telecom.IConnectionService; +import android.annotation.SystemApi; import android.os.Handler; import android.os.RemoteException; @@ -355,14 +356,27 @@ public final class RemoteConference { * can include audio routing (Bluetooth, Speaker, etc) and muting state. * * @see android.telecom.AudioState + * @deprecated Use {@link #setCallAudioState(CallAudioState)} instead. + * @hide */ + @SystemApi + @Deprecated public void setAudioState(AudioState state) { + setCallAudioState(new CallAudioState(state)); + } + + /** + * Request to change the conference's audio routing to the specified state. The specified state + * can include audio routing (Bluetooth, Speaker, etc) and muting state. + */ + public void setCallAudioState(CallAudioState state) { try { - mConnectionService.onAudioStateChanged(mId, state); + mConnectionService.onCallAudioStateChanged(mId, state); } catch (RemoteException e) { } } + /** * Returns a list of independent connections that can me merged with this conference. * diff --git a/telecomm/java/android/telecom/RemoteConnection.java b/telecomm/java/android/telecom/RemoteConnection.java index 19bb3f1..08485a3 100644 --- a/telecomm/java/android/telecom/RemoteConnection.java +++ b/telecomm/java/android/telecom/RemoteConnection.java @@ -20,6 +20,7 @@ import com.android.internal.telecom.IConnectionService; import com.android.internal.telecom.IVideoCallback; import com.android.internal.telecom.IVideoProvider; +import android.annotation.SystemApi; import android.net.Uri; import android.os.Handler; import android.os.IBinder; @@ -776,11 +777,24 @@ public final class RemoteConnection { * Set the audio state of this {@code RemoteConnection}. * * @param state The audio state of this {@code RemoteConnection}. + * @hide + * @deprecated Use {@link #setCallAudioState(CallAudioState) instead. */ + @SystemApi + @Deprecated public void setAudioState(AudioState state) { + setCallAudioState(new CallAudioState(state)); + } + + /** + * Set the audio state of this {@code RemoteConnection}. + * + * @param state The audio state of this {@code RemoteConnection}. + */ + public void setCallAudioState(CallAudioState state) { try { if (mConnected) { - mConnectionService.onAudioStateChanged(mConnectionId, state); + mConnectionService.onCallAudioStateChanged(mConnectionId, state); } } catch (RemoteException ignored) { } diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index b2c036c..c8ed2b0 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -333,16 +333,24 @@ public class TelecomManager { * displayed to the user. */ - /** Property is displayed normally. */ + /** + * Indicates that the address or number of a call is allowed to be displayed for caller ID. + */ public static final int PRESENTATION_ALLOWED = 1; - /** Property was blocked. */ + /** + * Indicates that the address or number of a call is blocked by the other party. + */ public static final int PRESENTATION_RESTRICTED = 2; - /** Presentation was not specified or is unknown. */ + /** + * Indicates that the address or number of a call is not specified or known by the carrier. + */ public static final int PRESENTATION_UNKNOWN = 3; - /** Property should be displayed as a pay phone. */ + /** + * Indicates that the address or number of a call belongs to a pay phone. + */ public static final int PRESENTATION_PAYPHONE = 4; private static final String TAG = "TelecomManager"; diff --git a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl index 339a982..c2e8530 100644 --- a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl +++ b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl @@ -17,7 +17,7 @@ package com.android.internal.telecom; import android.os.Bundle; -import android.telecom.AudioState; +import android.telecom.CallAudioState; import android.telecom.ConnectionRequest; import android.telecom.PhoneAccountHandle; @@ -56,7 +56,7 @@ oneway interface IConnectionService { void unhold(String callId); - void onAudioStateChanged(String activeCallId, in AudioState audioState); + void onCallAudioStateChanged(String activeCallId, in CallAudioState callAudioState); void playDtmfTone(String callId, char digit); diff --git a/telecomm/java/com/android/internal/telecom/IInCallService.aidl b/telecomm/java/com/android/internal/telecom/IInCallService.aidl index d26f6cb..ded47d5 100644 --- a/telecomm/java/com/android/internal/telecom/IInCallService.aidl +++ b/telecomm/java/com/android/internal/telecom/IInCallService.aidl @@ -17,7 +17,7 @@ package com.android.internal.telecom; import android.app.PendingIntent; -import android.telecom.AudioState; +import android.telecom.CallAudioState; import android.telecom.ParcelableCall; import com.android.internal.telecom.IInCallAdapter; @@ -40,7 +40,7 @@ oneway interface IInCallService { void setPostDialWait(String callId, String remaining); - void onAudioStateChanged(in AudioState audioState); + void onCallAudioStateChanged(in CallAudioState callAudioState); void bringToForeground(boolean showDialpad); diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 5e99672..a2b1858 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -757,7 +757,7 @@ public class WifiManager { * of state change events. * <p> * <b>Note:</b> If an application's target SDK version is - * {@link android.os.Build.VERSION_CODES#MNC} or newer, network + * {@link android.os.Build.VERSION_CODES#LOLLIPOP} or newer, network * communication may not use Wi-Fi even if Wi-Fi is connected; traffic may * instead be sent through another network, such as cellular data, * Bluetooth tethering, or Ethernet. For example, traffic will never use a @@ -776,7 +776,7 @@ public class WifiManager { * @return {@code true} if the operation succeeded */ public boolean enableNetwork(int netId, boolean disableOthers) { - final boolean pin = disableOthers && mTargetSdkVersion < Build.VERSION_CODES.MNC; + final boolean pin = disableOthers && mTargetSdkVersion < Build.VERSION_CODES.LOLLIPOP; if (pin) { registerPinningNetworkCallback(); } @@ -1057,7 +1057,7 @@ public class WifiManager { } synchronized(this) { record = mService.reportActivityInfo(); - if (record.isValid()) { + if (record != null && record.isValid()) { return record; } else { return null; |