diff options
449 files changed, 9538 insertions, 3583 deletions
diff --git a/apex/jobscheduler/framework/java/android/app/AlarmManager.java b/apex/jobscheduler/framework/java/android/app/AlarmManager.java index 7ed4d35b3ccc..c2a72b745478 100644 --- a/apex/jobscheduler/framework/java/android/app/AlarmManager.java +++ b/apex/jobscheduler/framework/java/android/app/AlarmManager.java @@ -667,7 +667,7 @@ public class AlarmManager { * than supplying a PendingIntent to be sent when the alarm time is reached, this variant * supplies an {@link OnAlarmListener} instance that will be invoked at that time. * <p> - * The OnAlarmListener {@link OnAlarmListener#onAlarm() onAlarm()} method will be + * The OnAlarmListener's {@link OnAlarmListener#onAlarm() onAlarm()} method will be * invoked via the specified target Executor. * * <p> @@ -919,8 +919,19 @@ public class AlarmManager { * invoked via the specified target Handler, or on the application's main looper * if {@code null} is passed as the {@code targetHandler} parameter. * + * <p>The behavior of this API when {@code windowMillis < 0} is undefined. + * + * @deprecated Better alternative APIs exist for setting an alarm with this method: + * <ul> + * <li>For alarms with {@code windowMillis > 0}, use + * {@link #setWindow(int, long, long, String, Executor, WorkSource, OnAlarmListener)}</li> + * <li>For alarms with {@code windowMillis = 0}, use + * {@link #setExact(int, long, String, Executor, WorkSource, OnAlarmListener)}</li> + * </ul> + * * @hide */ + @Deprecated @SystemApi @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void set(@AlarmType int type, long triggerAtMillis, long windowMillis, diff --git a/core/api/current.txt b/core/api/current.txt index 5f1ac76356d0..fd2b82878144 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -1989,17 +1989,17 @@ package android { field public static final int system_primary_container_light; field public static final int system_primary_dark; field public static final int system_primary_fixed_dark; + field public static final int system_primary_fixed_darker_dark; field public static final int system_primary_fixed_darker_light; field public static final int system_primary_fixed_light; - field public static final int system_primary_fixeder_dark; field public static final int system_primary_light; field public static final int system_secondary_container_dark; field public static final int system_secondary_container_light; field public static final int system_secondary_dark; field public static final int system_secondary_fixed_dark; + field public static final int system_secondary_fixed_darker_dark; field public static final int system_secondary_fixed_darker_light; field public static final int system_secondary_fixed_light; - field public static final int system_secondary_fixeder_dark; field public static final int system_secondary_light; field public static final int system_surface_bright_dark; field public static final int system_surface_bright_light; @@ -2023,9 +2023,9 @@ package android { field public static final int system_tertiary_container_light; field public static final int system_tertiary_dark; field public static final int system_tertiary_fixed_dark; + field public static final int system_tertiary_fixed_darker_dark; field public static final int system_tertiary_fixed_darker_light; field public static final int system_tertiary_fixed_light; - field public static final int system_tertiary_fixeder_dark; field public static final int system_tertiary_light; field public static final int system_text_hint_inverse_dark; field public static final int system_text_hint_inverse_light; @@ -7279,6 +7279,7 @@ package android.app { method public android.view.accessibility.AccessibilityEvent executeAndWaitForEvent(Runnable, android.app.UiAutomation.AccessibilityEventFilter, long) throws java.util.concurrent.TimeoutException; method public android.os.ParcelFileDescriptor executeShellCommand(String); method @NonNull public android.os.ParcelFileDescriptor[] executeShellCommandRw(@NonNull String); + method @NonNull public android.os.ParcelFileDescriptor[] executeShellCommandRwe(@NonNull String); method public android.view.accessibility.AccessibilityNodeInfo findFocus(int); method public android.view.accessibility.AccessibilityNodeInfo getRootInActiveWindow(); method public android.accessibilityservice.AccessibilityServiceInfo getServiceInfo(); @@ -12629,7 +12630,8 @@ package android.content.pm { field public static final int FLAG_PERMISSION_WHITELIST_SYSTEM = 1; // 0x1 field public static final int FLAG_PERMISSION_WHITELIST_UPGRADE = 4; // 0x4 field public static final int GET_ACTIVITIES = 1; // 0x1 - field public static final int GET_ATTRIBUTIONS = -2147483648; // 0x80000000 + field @Deprecated public static final int GET_ATTRIBUTIONS = -2147483648; // 0x80000000 + field public static final long GET_ATTRIBUTIONS_LONG = 2147483648L; // 0x80000000L field public static final int GET_CONFIGURATIONS = 16384; // 0x4000 field @Deprecated public static final int GET_DISABLED_COMPONENTS = 512; // 0x200 field @Deprecated public static final int GET_DISABLED_UNTIL_USED_COMPONENTS = 32768; // 0x8000 @@ -12670,6 +12672,7 @@ package android.content.pm { field public static final int PERMISSION_DENIED = -1; // 0xffffffff field public static final int PERMISSION_GRANTED = 0; // 0x0 field public static final String PROPERTY_MEDIA_CAPABILITIES = "android.media.PROPERTY_MEDIA_CAPABILITIES"; + field public static final String PROPERTY_SELF_CERTIFIED_NETWORK_CAPABILITIES = "android.net.PROPERTY_SELF_CERTIFIED_NETWORK_CAPABILITIES"; field public static final String PROPERTY_SPECIAL_USE_FGS_SUBTYPE = "android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"; field public static final int SIGNATURE_FIRST_NOT_SIGNED = -1; // 0xffffffff field public static final int SIGNATURE_MATCH = 0; // 0x0 @@ -13507,6 +13510,7 @@ package android.credentials { method public void clearCredentialState(@NonNull android.credentials.ClearCredentialStateRequest, @Nullable android.os.CancellationSignal, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<java.lang.Void,android.credentials.ClearCredentialStateException>); method public void createCredential(@NonNull android.credentials.CreateCredentialRequest, @NonNull android.app.Activity, @Nullable android.os.CancellationSignal, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.credentials.CreateCredentialResponse,android.credentials.CreateCredentialException>); method public void getCredential(@NonNull android.credentials.GetCredentialRequest, @NonNull android.app.Activity, @Nullable android.os.CancellationSignal, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.credentials.GetCredentialResponse,android.credentials.GetCredentialException>); + method public boolean isEnabledCredentialProviderService(@NonNull android.content.ComponentName); method public void registerCredentialDescription(@NonNull android.credentials.RegisterCredentialDescriptionRequest); method public void unregisterCredentialDescription(@NonNull android.credentials.UnregisterCredentialDescriptionRequest); } @@ -15011,7 +15015,7 @@ package android.graphics { method public void drawLine(float, float, float, float, @NonNull android.graphics.Paint); method public void drawLines(@NonNull @Size(multiple=4) float[], int, int, @NonNull android.graphics.Paint); method public void drawLines(@NonNull @Size(multiple=4) float[], @NonNull android.graphics.Paint); - method public void drawMesh(@NonNull android.graphics.Mesh, android.graphics.BlendMode, @NonNull android.graphics.Paint); + method public void drawMesh(@NonNull android.graphics.Mesh, @Nullable android.graphics.BlendMode, @NonNull android.graphics.Paint); method public void drawOval(@NonNull android.graphics.RectF, @NonNull android.graphics.Paint); method public void drawOval(float, float, float, float, @NonNull android.graphics.Paint); method public void drawPaint(@NonNull android.graphics.Paint); @@ -15613,10 +15617,10 @@ package android.graphics { } public class Mesh { - method @NonNull public static android.graphics.Mesh make(@NonNull android.graphics.MeshSpecification, int, @NonNull java.nio.Buffer, int, @NonNull android.graphics.Rect); - method @NonNull public static android.graphics.Mesh makeIndexed(@NonNull android.graphics.MeshSpecification, int, @NonNull java.nio.Buffer, int, @NonNull java.nio.ShortBuffer, @NonNull android.graphics.Rect); - method public void setColorUniform(@NonNull String, int); - method public void setColorUniform(@NonNull String, long); + ctor public Mesh(@NonNull android.graphics.MeshSpecification, int, @NonNull java.nio.Buffer, int, @NonNull android.graphics.RectF); + ctor public Mesh(@NonNull android.graphics.MeshSpecification, int, @NonNull java.nio.Buffer, int, @NonNull java.nio.ShortBuffer, @NonNull android.graphics.RectF); + method public void setColorUniform(@NonNull String, @ColorInt int); + method public void setColorUniform(@NonNull String, @ColorLong long); method public void setColorUniform(@NonNull String, @NonNull android.graphics.Color); method public void setFloatUniform(@NonNull String, float); method public void setFloatUniform(@NonNull String, float, float); @@ -24032,6 +24036,7 @@ package android.media { method @Nullable public android.net.Uri getIconUri(); method @NonNull public String getId(); method @NonNull public CharSequence getName(); + method public int getType(); method public int getVolume(); method public int getVolumeHandling(); method public int getVolumeMax(); @@ -24048,6 +24053,22 @@ package android.media { field public static final String FEATURE_REMOTE_VIDEO_PLAYBACK = "android.media.route.feature.REMOTE_VIDEO_PLAYBACK"; field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0 field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1 + field public static final int TYPE_BLE_HEADSET = 26; // 0x1a + field public static final int TYPE_BLUETOOTH_A2DP = 8; // 0x8 + field public static final int TYPE_BUILTIN_SPEAKER = 2; // 0x2 + field public static final int TYPE_DOCK = 13; // 0xd + field public static final int TYPE_GROUP = 2000; // 0x7d0 + field public static final int TYPE_HDMI = 9; // 0x9 + field public static final int TYPE_HEARING_AID = 23; // 0x17 + field public static final int TYPE_REMOTE_AUDIO_VIDEO_RECEIVER = 1003; // 0x3eb + field public static final int TYPE_REMOTE_SPEAKER = 1002; // 0x3ea + field public static final int TYPE_REMOTE_TV = 1001; // 0x3e9 + field public static final int TYPE_UNKNOWN = 0; // 0x0 + field public static final int TYPE_USB_ACCESSORY = 12; // 0xc + field public static final int TYPE_USB_DEVICE = 11; // 0xb + field public static final int TYPE_USB_HEADSET = 22; // 0x16 + field public static final int TYPE_WIRED_HEADPHONES = 4; // 0x4 + field public static final int TYPE_WIRED_HEADSET = 3; // 0x3 } public static final class MediaRoute2Info.Builder { @@ -24063,6 +24084,7 @@ package android.media { method @NonNull public android.media.MediaRoute2Info.Builder setDescription(@Nullable CharSequence); method @NonNull public android.media.MediaRoute2Info.Builder setExtras(@Nullable android.os.Bundle); method @NonNull public android.media.MediaRoute2Info.Builder setIconUri(@Nullable android.net.Uri); + method @NonNull public android.media.MediaRoute2Info.Builder setType(int); method @NonNull public android.media.MediaRoute2Info.Builder setVisibilityPublic(); method @NonNull public android.media.MediaRoute2Info.Builder setVisibilityRestricted(@NonNull java.util.Set<java.lang.String>); method @NonNull public android.media.MediaRoute2Info.Builder setVolume(int); @@ -24636,7 +24658,7 @@ package android.media { field @NonNull public static final android.os.Parcelable.Creator<android.media.RouteListingPreference.Item> CREATOR; field public static final int FLAG_ONGOING_SESSION = 1; // 0x1 field public static final int FLAG_ONGOING_SESSION_MANAGED = 2; // 0x2 - field public static final int FLAG_SUGGESTED_ROUTE = 4; // 0x4 + field public static final int FLAG_SUGGESTED = 4; // 0x4 field public static final int SELECTION_BEHAVIOR_GO_TO_APP = 2; // 0x2 field public static final int SELECTION_BEHAVIOR_NONE = 0; // 0x0 field public static final int SELECTION_BEHAVIOR_TRANSFER = 1; // 0x1 @@ -27052,6 +27074,8 @@ package android.media.tv { field public static final int TIME_SHIFT_STATUS_UNAVAILABLE = 2; // 0x2 field public static final int TIME_SHIFT_STATUS_UNKNOWN = 0; // 0x0 field public static final int TIME_SHIFT_STATUS_UNSUPPORTED = 1; // 0x1 + field public static final String TV_MESSAGE_TYPE_CLOSED_CAPTION = "CC"; + field public static final String TV_MESSAGE_TYPE_WATERMARK = "Watermark"; field public static final int VIDEO_UNAVAILABLE_REASON_AUDIO_ONLY = 4; // 0x4 field public static final int VIDEO_UNAVAILABLE_REASON_BUFFERING = 3; // 0x3 field public static final int VIDEO_UNAVAILABLE_REASON_CAS_BLACKOUT = 16; // 0x10 @@ -27139,6 +27163,7 @@ package android.media.tv { method public void notifyTrackSelected(int, String); method public void notifyTracksChanged(java.util.List<android.media.tv.TvTrackInfo>); method public void notifyTuned(@NonNull android.net.Uri); + method public void notifyTvMessage(@NonNull String, @NonNull android.os.Bundle); method public void notifyVideoAvailable(); method public void notifyVideoUnavailable(int); method public void onAdBuffer(@NonNull android.media.tv.AdBuffer); @@ -27160,6 +27185,7 @@ package android.media.tv { method public void onSetInteractiveAppNotificationEnabled(boolean); method public abstract void onSetStreamVolume(@FloatRange(from=0.0, to=1.0) float); method public abstract boolean onSetSurface(@Nullable android.view.Surface); + method public void onSetTvMessageEnabled(@NonNull String, boolean); method public void onSurfaceChanged(int, int, int); method public long onTimeShiftGetCurrentPosition(); method public long onTimeShiftGetStartPosition(); @@ -27299,6 +27325,7 @@ package android.media.tv { method public void setOnUnhandledInputEventListener(android.media.tv.TvView.OnUnhandledInputEventListener); method public void setStreamVolume(@FloatRange(from=0.0, to=1.0) float); method public void setTimeShiftPositionCallback(@Nullable android.media.tv.TvView.TimeShiftPositionCallback); + method public void setTvMessageEnabled(@NonNull String, boolean); method public void setZOrderMediaOverlay(boolean); method public void setZOrderOnTop(boolean); method public void timeShiftPause(); @@ -27335,6 +27362,7 @@ package android.media.tv { method public void onTrackSelected(String, int, String); method public void onTracksChanged(String, java.util.List<android.media.tv.TvTrackInfo>); method public void onTuned(@NonNull String, @NonNull android.net.Uri); + method public void onTvMessage(@NonNull String, @NonNull String, @NonNull android.os.Bundle); method public void onVideoAvailable(String); method public void onVideoSizeChanged(String, int, int); method public void onVideoUnavailable(String, int); @@ -27468,6 +27496,7 @@ package android.media.tv.interactive { method public boolean onTrackballEvent(@NonNull android.view.MotionEvent); method public void onTracksChanged(@NonNull java.util.List<android.media.tv.TvTrackInfo>); method public void onTuned(@NonNull android.net.Uri); + method public void onTvMessage(@NonNull String, @NonNull android.os.Bundle); method public void onTvRecordingInfo(@Nullable android.media.tv.TvRecordingInfo); method public void onTvRecordingInfoList(@NonNull java.util.List<android.media.tv.TvRecordingInfo>); method public void onVideoAvailable(); @@ -27517,6 +27546,7 @@ package android.media.tv.interactive { method public void notifyError(@NonNull String, @NonNull android.os.Bundle); method public void notifyRecordingStarted(@NonNull String); method public void notifyRecordingStopped(@NonNull String); + method public void notifyTvMessage(@NonNull String, @NonNull android.os.Bundle); method public void onAttachedToWindow(); method public void onDetachedFromWindow(); method public void onLayout(boolean, int, int, int, int); @@ -40240,15 +40270,27 @@ package android.service.credentials { } public final class BeginGetCredentialResponse implements android.os.Parcelable { - method @NonNull public static android.service.credentials.BeginGetCredentialResponse createWithAuthentication(@NonNull android.service.credentials.Action); - method @NonNull public static android.service.credentials.BeginGetCredentialResponse createWithResponseContent(@NonNull android.service.credentials.CredentialsResponseContent); method public int describeContents(); - method @Nullable public android.service.credentials.Action getAuthenticationAction(); - method @Nullable public android.service.credentials.CredentialsResponseContent getCredentialsResponseContent(); + method @NonNull public java.util.List<android.service.credentials.Action> getActions(); + method @NonNull public java.util.List<android.service.credentials.Action> getAuthenticationActions(); + method @NonNull public java.util.List<android.service.credentials.CredentialEntry> getCredentialEntries(); + method @Nullable public android.service.credentials.CredentialEntry getRemoteCredentialEntry(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.service.credentials.BeginGetCredentialResponse> CREATOR; } + public static final class BeginGetCredentialResponse.Builder { + ctor public BeginGetCredentialResponse.Builder(); + method @NonNull public android.service.credentials.BeginGetCredentialResponse.Builder addAction(@NonNull android.service.credentials.Action); + method @NonNull public android.service.credentials.BeginGetCredentialResponse.Builder addAuthenticationAction(@NonNull android.service.credentials.Action); + method @NonNull public android.service.credentials.BeginGetCredentialResponse.Builder addCredentialEntry(@NonNull android.service.credentials.CredentialEntry); + method @NonNull public android.service.credentials.BeginGetCredentialResponse build(); + method @NonNull public android.service.credentials.BeginGetCredentialResponse.Builder setActions(@NonNull java.util.List<android.service.credentials.Action>); + method @NonNull public android.service.credentials.BeginGetCredentialResponse.Builder setAuthenticationActions(@NonNull java.util.List<android.service.credentials.Action>); + method @NonNull public android.service.credentials.BeginGetCredentialResponse.Builder setCredentialEntries(@NonNull java.util.List<android.service.credentials.CredentialEntry>); + method @NonNull public android.service.credentials.BeginGetCredentialResponse.Builder setRemoteCredentialEntry(@Nullable android.service.credentials.CredentialEntry); + } + public final class CallingAppInfo implements android.os.Parcelable { ctor public CallingAppInfo(@NonNull String, @NonNull android.content.pm.SigningInfo); method public int describeContents(); @@ -40302,35 +40344,16 @@ package android.service.credentials { method public abstract void onClearCredentialState(@NonNull android.service.credentials.ClearCredentialStateRequest, @NonNull android.os.CancellationSignal, @NonNull android.os.OutcomeReceiver<java.lang.Void,android.credentials.ClearCredentialStateException>); field public static final String CAPABILITY_META_DATA_KEY = "android.credentials.capabilities"; field public static final String EXTRA_BEGIN_GET_CREDENTIAL_REQUEST = "android.service.credentials.extra.BEGIN_GET_CREDENTIAL_REQUEST"; + field public static final String EXTRA_BEGIN_GET_CREDENTIAL_RESPONSE = "android.service.credentials.extra.BEGIN_GET_CREDENTIAL_RESPONSE"; field public static final String EXTRA_CREATE_CREDENTIAL_EXCEPTION = "android.service.credentials.extra.CREATE_CREDENTIAL_EXCEPTION"; field public static final String EXTRA_CREATE_CREDENTIAL_REQUEST = "android.service.credentials.extra.CREATE_CREDENTIAL_REQUEST"; field public static final String EXTRA_CREATE_CREDENTIAL_RESPONSE = "android.service.credentials.extra.CREATE_CREDENTIAL_RESPONSE"; - field public static final String EXTRA_CREDENTIALS_RESPONSE_CONTENT = "android.service.credentials.extra.CREDENTIALS_RESPONSE_CONTENT"; field public static final String EXTRA_GET_CREDENTIAL_EXCEPTION = "android.service.credentials.extra.GET_CREDENTIAL_EXCEPTION"; field public static final String EXTRA_GET_CREDENTIAL_REQUEST = "android.service.credentials.extra.GET_CREDENTIAL_REQUEST"; field public static final String EXTRA_GET_CREDENTIAL_RESPONSE = "android.service.credentials.extra.GET_CREDENTIAL_RESPONSE"; field public static final String SERVICE_INTERFACE = "android.service.credentials.CredentialProviderService"; } - public final class CredentialsResponseContent implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public java.util.List<android.service.credentials.Action> getActions(); - method @NonNull public java.util.List<android.service.credentials.CredentialEntry> getCredentialEntries(); - method @Nullable public android.service.credentials.CredentialEntry getRemoteCredentialEntry(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.service.credentials.CredentialsResponseContent> CREATOR; - } - - public static final class CredentialsResponseContent.Builder { - ctor public CredentialsResponseContent.Builder(); - method @NonNull public android.service.credentials.CredentialsResponseContent.Builder addAction(@NonNull android.service.credentials.Action); - method @NonNull public android.service.credentials.CredentialsResponseContent.Builder addCredentialEntry(@NonNull android.service.credentials.CredentialEntry); - method @NonNull public android.service.credentials.CredentialsResponseContent build(); - method @NonNull public android.service.credentials.CredentialsResponseContent.Builder setActions(@NonNull java.util.List<android.service.credentials.Action>); - method @NonNull public android.service.credentials.CredentialsResponseContent.Builder setCredentialEntries(@NonNull java.util.List<android.service.credentials.CredentialEntry>); - method @NonNull public android.service.credentials.CredentialsResponseContent.Builder setRemoteCredentialEntry(@Nullable android.service.credentials.CredentialEntry); - } - public final class GetCredentialRequest implements android.os.Parcelable { ctor public GetCredentialRequest(@NonNull android.service.credentials.CallingAppInfo, @NonNull android.credentials.CredentialOption); method public int describeContents(); diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 4a0b2eb502dd..d6aa7fc4bf90 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -547,7 +547,7 @@ package android.app { public class AlarmManager { method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void set(int, long, long, long, @NonNull android.app.PendingIntent, @Nullable android.os.WorkSource); - method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void set(int, long, long, long, @NonNull android.app.AlarmManager.OnAlarmListener, @Nullable android.os.Handler, @Nullable android.os.WorkSource); + method @Deprecated @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void set(int, long, long, long, @NonNull android.app.AlarmManager.OnAlarmListener, @Nullable android.os.Handler, @Nullable android.os.WorkSource); method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void setExact(int, long, @Nullable String, @NonNull java.util.concurrent.Executor, @NonNull android.os.WorkSource, @NonNull android.app.AlarmManager.OnAlarmListener); method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void setExactAndAllowWhileIdle(int, long, @Nullable String, @NonNull java.util.concurrent.Executor, @Nullable android.os.WorkSource, @NonNull android.app.AlarmManager.OnAlarmListener); method @RequiresPermission(android.Manifest.permission.SCHEDULE_PRIORITIZED_ALARM) public void setPrioritized(int, long, long, @Nullable String, @NonNull java.util.concurrent.Executor, @NonNull android.app.AlarmManager.OnAlarmListener); @@ -5832,6 +5832,7 @@ package android.hardware.usb { method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public long getCurrentFunctions(); method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_USB) public java.util.List<android.hardware.usb.UsbPort> getPorts(); method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public void grantPermission(android.hardware.usb.UsbDevice, String); + method public static boolean isUvcSupportEnabled(); method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public boolean registerDisplayPortAltModeInfoListener(@NonNull java.util.concurrent.Executor, @NonNull android.hardware.usb.UsbManager.DisplayPortAltModeInfoListener); method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public void resetUsbGadget(); method @RequiresPermission(android.Manifest.permission.MANAGE_USB) public void setCurrentFunctions(long); @@ -5853,6 +5854,7 @@ package android.hardware.usb { field public static final long FUNCTION_NONE = 0L; // 0x0L field public static final long FUNCTION_PTP = 16L; // 0x10L field public static final long FUNCTION_RNDIS = 32L; // 0x20L + field public static final long FUNCTION_UVC = 128L; // 0x80L field public static final String USB_CONFIGURED = "configured"; field public static final String USB_CONNECTED = "connected"; field public static final String USB_FUNCTION_NCM = "ncm"; diff --git a/core/api/test-current.txt b/core/api/test-current.txt index b3e3f35452ce..6a4584b39135 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -444,7 +444,6 @@ package android.app { public final class UiAutomation { method public void destroy(); - method @NonNull public android.os.ParcelFileDescriptor[] executeShellCommandRwe(@NonNull String); method @NonNull public java.util.Set<java.lang.String> getAdoptedShellPermissions(); method @Deprecated public boolean grantRuntimePermission(String, String, android.os.UserHandle); method public boolean injectInputEvent(@NonNull android.view.InputEvent, boolean, boolean); @@ -1031,9 +1030,9 @@ package android.credentials.ui { } public final class GetCredentialProviderData extends android.credentials.ui.ProviderData implements android.os.Parcelable { - ctor public GetCredentialProviderData(@NonNull String, @NonNull java.util.List<android.credentials.ui.Entry>, @NonNull java.util.List<android.credentials.ui.Entry>, @Nullable android.credentials.ui.Entry, @Nullable android.credentials.ui.Entry); + ctor public GetCredentialProviderData(@NonNull String, @NonNull java.util.List<android.credentials.ui.Entry>, @NonNull java.util.List<android.credentials.ui.Entry>, @NonNull java.util.List<android.credentials.ui.Entry>, @Nullable android.credentials.ui.Entry); method @NonNull public java.util.List<android.credentials.ui.Entry> getActionChips(); - method @Nullable public android.credentials.ui.Entry getAuthenticationEntry(); + method @NonNull public java.util.List<android.credentials.ui.Entry> getAuthenticationEntries(); method @NonNull public java.util.List<android.credentials.ui.Entry> getCredentialEntries(); method @Nullable public android.credentials.ui.Entry getRemoteEntry(); field @NonNull public static final android.os.Parcelable.Creator<android.credentials.ui.GetCredentialProviderData> CREATOR; @@ -1043,7 +1042,7 @@ package android.credentials.ui { ctor public GetCredentialProviderData.Builder(@NonNull String); method @NonNull public android.credentials.ui.GetCredentialProviderData build(); method @NonNull public android.credentials.ui.GetCredentialProviderData.Builder setActionChips(@NonNull java.util.List<android.credentials.ui.Entry>); - method @NonNull public android.credentials.ui.GetCredentialProviderData.Builder setAuthenticationEntry(@Nullable android.credentials.ui.Entry); + method @NonNull public android.credentials.ui.GetCredentialProviderData.Builder setAuthenticationEntries(@NonNull java.util.List<android.credentials.ui.Entry>); method @NonNull public android.credentials.ui.GetCredentialProviderData.Builder setCredentialEntries(@NonNull java.util.List<android.credentials.ui.Entry>); method @NonNull public android.credentials.ui.GetCredentialProviderData.Builder setRemoteEntry(@Nullable android.credentials.ui.Entry); } diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java index b3337b6352e1..3b882571507f 100644 --- a/core/java/android/app/ActivityOptions.java +++ b/core/java/android/app/ActivityOptions.java @@ -343,6 +343,13 @@ public class ActivityOptions extends ComponentOptions { "android:activity.applyActivityFlagsForBubbles"; /** + * Indicates to apply {@link Intent#FLAG_ACTIVITY_MULTIPLE_TASK} to the launching shortcut. + * @hide + */ + private static final String KEY_APPLY_MULTIPLE_TASK_FLAG_FOR_SHORTCUT = + "android:activity.applyMultipleTaskFlagForShortcut"; + + /** * For Activity transitions, the calling Activity's TransitionListener used to * notify the called Activity when the shared element and the exit transitions * complete. @@ -476,6 +483,7 @@ public class ActivityOptions extends ComponentOptions { private boolean mShareIdentity = false; private boolean mDisallowEnterPictureInPictureWhileLaunching; private boolean mApplyActivityFlagsForBubbles; + private boolean mApplyMultipleTaskFlagForShortcut; private boolean mTaskAlwaysOnTop; private boolean mTaskOverlay; private boolean mTaskOverlayCanResume; @@ -1278,6 +1286,8 @@ public class ActivityOptions extends ComponentOptions { KEY_DISALLOW_ENTER_PICTURE_IN_PICTURE_WHILE_LAUNCHING, false); mApplyActivityFlagsForBubbles = opts.getBoolean( KEY_APPLY_ACTIVITY_FLAGS_FOR_BUBBLES, false); + mApplyMultipleTaskFlagForShortcut = opts.getBoolean( + KEY_APPLY_MULTIPLE_TASK_FLAG_FOR_SHORTCUT, false); if (opts.containsKey(KEY_ANIM_SPECS)) { Parcelable[] specs = opts.getParcelableArray(KEY_ANIM_SPECS); mAnimSpecs = new AppTransitionAnimationSpec[specs.length]; @@ -1906,6 +1916,16 @@ public class ActivityOptions extends ComponentOptions { return mApplyActivityFlagsForBubbles; } + /** @hide */ + public void setApplyMultipleTaskFlagForShortcut(boolean apply) { + mApplyMultipleTaskFlagForShortcut = apply; + } + + /** @hide */ + public boolean isApplyMultipleTaskFlagForShortcut() { + return mApplyMultipleTaskFlagForShortcut; + } + /** * Sets a launch cookie that can be used to track the activity and task that are launch as a * result of this option. If the launched activity is a trampoline that starts another activity @@ -2262,6 +2282,10 @@ public class ActivityOptions extends ComponentOptions { if (mApplyActivityFlagsForBubbles) { b.putBoolean(KEY_APPLY_ACTIVITY_FLAGS_FOR_BUBBLES, mApplyActivityFlagsForBubbles); } + if (mApplyMultipleTaskFlagForShortcut) { + b.putBoolean(KEY_APPLY_MULTIPLE_TASK_FLAG_FOR_SHORTCUT, + mApplyMultipleTaskFlagForShortcut); + } if (mAnimSpecs != null) { b.putParcelableArray(KEY_ANIM_SPECS, mAnimSpecs); } diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 170c0b4e0bb1..eb57b3ddfc66 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -505,6 +505,7 @@ public final class ActivityThread extends ClientTransactionHandler @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) static volatile Handler sMainThreadHandler; // set once in main() + private long mStartSeq; // Only accesssed from the main thread Bundle mCoreSettings = null; @@ -6987,6 +6988,12 @@ public final class ActivityThread extends ClientTransactionHandler throw e.rethrowFromSystemServer(); } } + + try { + mgr.finishAttachApplication(mStartSeq); + } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); + } } @UnsupportedAppUsage @@ -7791,6 +7798,8 @@ public final class ActivityThread extends ClientTransactionHandler sCurrentActivityThread = this; mConfigurationController = new ConfigurationController(this); mSystemThread = system; + mStartSeq = startSeq; + if (!system) { android.ddm.DdmHandleAppName.setAppName("<pre-initialized>", UserHandle.myUserId()); diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 73f34ebd8bc5..7d40a2299a80 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -1432,14 +1432,14 @@ public class AppOpsManager { .APP_OP_SYSTEM_EXEMPT_FROM_FGS_BG_START_WHILE_IN_USE_PERMISSION_RESTRICTION; /** - * Hide foreground service stop button in quick settings. + * Allows an application to start an activity while running in the background. * * Only to be used by the system. * * @hide */ - public static final int OP_SYSTEM_EXEMPT_FROM_FGS_STOP_BUTTON = - AppProtoEnums.APP_OP_SYSTEM_EXEMPT_FROM_FGS_STOP_BUTTON; + public static final int OP_SYSTEM_EXEMPT_FROM_ACTIVITY_BG_START_RESTRICTION = + AppProtoEnums.APP_OP_SYSTEM_EXEMPT_FROM_ACTIVITY_BG_START_RESTRICTION; /** * Allows an application to capture bugreport directly without consent dialog when using the @@ -2027,14 +2027,14 @@ public class AppOpsManager { "android:system_exempt_from_fgs_bg_start_while_in_use_permission_restriction"; /** - * Hide foreground service stop button in quick settings. + * Allows an application to start an activity while running in the background. * * Only to be used by the system. * * @hide */ - public static final String OPSTR_SYSTEM_EXEMPT_FROM_FGS_STOP_BUTTON = - "android:system_exempt_from_fgs_stop_button"; + public static final String OPSTR_SYSTEM_EXEMPT_FROM_ACTIVITY_BG_START_RESTRICTION = + "android:system_exempt_from_activity_bg_start_restriction"; /** * Allows an application to capture bugreport directly without consent dialog when using the @@ -2562,9 +2562,9 @@ public class AppOpsManager { OPSTR_SYSTEM_EXEMPT_FROM_FGS_BG_START_WHILE_IN_USE_PERMISSION_RESTRICTION, "SYSTEM_EXEMPT_FROM_FGS_BG_START_WHILE_IN_USE_PERMISSION_RESTRICTION") .build(), - new AppOpInfo.Builder(OP_SYSTEM_EXEMPT_FROM_FGS_STOP_BUTTON, - OPSTR_SYSTEM_EXEMPT_FROM_FGS_STOP_BUTTON, - "SYSTEM_EXEMPT_FROM_FGS_STOP_BUTTON").build(), + new AppOpInfo.Builder(OP_SYSTEM_EXEMPT_FROM_ACTIVITY_BG_START_RESTRICTION, + OPSTR_SYSTEM_EXEMPT_FROM_ACTIVITY_BG_START_RESTRICTION, + "SYSTEM_EXEMPT_FROM_ACTIVITY_BG_START_RESTRICTION").build(), new AppOpInfo.Builder( OP_CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD, OPSTR_CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD, diff --git a/core/java/android/app/ForegroundServiceTypePolicy.java b/core/java/android/app/ForegroundServiceTypePolicy.java index 20d19c16f8d1..5ef29e4e0b5b 100644 --- a/core/java/android/app/ForegroundServiceTypePolicy.java +++ b/core/java/android/app/ForegroundServiceTypePolicy.java @@ -388,7 +388,6 @@ public abstract class ForegroundServiceTypePolicy { new RegularPermission(Manifest.permission.SCHEDULE_EXACT_ALARM), new RegularPermission(Manifest.permission.USE_EXACT_ALARM), new AppOpPermission(AppOpsManager.OP_ACTIVATE_VPN), - new AppOpPermission(AppOpsManager.OP_ACTIVATE_PLATFORM_VPN), }, false) ); diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 058c38989371..46a17b52ce1f 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -147,6 +147,7 @@ interface IActivityManager { oneway void finishReceiver(in IBinder who, int resultCode, in String resultData, in Bundle map, boolean abortBroadcast, int flags); void attachApplication(in IApplicationThread app, long startSeq); + void finishAttachApplication(long startSeq); List<ActivityManager.RunningTaskInfo> getTasks(int maxNum); @UnsupportedAppUsage void moveTaskToFront(in IApplicationThread caller, in String callingPackage, int task, @@ -719,8 +720,8 @@ interface IActivityManager { /** * Control the app freezer state. Returns true in case of success, false if the operation - * didn't succeed (for example, when the app freezer isn't supported). - * Handling the freezer state via this method is reentrant, that is it can be + * didn't succeed (for example, when the app freezer isn't supported). + * Handling the freezer state via this method is reentrant, that is it can be * disabled and re-enabled multiple times in parallel. As long as there's a 1:1 disable to * enable match, the freezer is re-enabled at last enable only. * @param enable set it to true to enable the app freezer, false to disable it. diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java index e75b503d5f69..249937a72d74 100644 --- a/core/java/android/app/UiAutomation.java +++ b/core/java/android/app/UiAutomation.java @@ -1447,10 +1447,7 @@ public final class UiAutomation { * * @param command The command to execute. * @return File descriptors (out, in, err) to the standard output/input/error streams. - * - * @hide */ - @TestApi @SuppressLint("ArrayReturn") // For consistency with other APIs public @NonNull ParcelFileDescriptor[] executeShellCommandRwe(@NonNull String command) { return executeShellCommandInternal(command, true /* includeStderr */); diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index d8ec7cc10159..b494a2002689 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -39,6 +39,7 @@ import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.StringDef; +import android.annotation.SupportsCoexistence; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; @@ -8596,6 +8597,7 @@ public class DevicePolicyManager { * primary user, or a profile owner of an organization-owned managed profile or a holder of the * permission {@link android.Manifest.permission#SET_TIME_ZONE}. */ + @SupportsCoexistence @RequiresPermission(value = SET_TIME_ZONE, conditional = true) public void setAutoTimeZoneEnabled(@NonNull ComponentName admin, boolean enabled) { throwIfParentInstance("setAutoTimeZone"); @@ -9665,6 +9667,7 @@ public class DevicePolicyManager { * @param activity The Activity that is added as default intent handler. * @throws SecurityException if {@code admin} is not a device or profile owner. */ + @SupportsCoexistence public void addPersistentPreferredActivity(@NonNull ComponentName admin, IntentFilter filter, @NonNull ComponentName activity) { throwIfParentInstance("addPersistentPreferredActivity"); @@ -10624,6 +10627,7 @@ public class DevicePolicyManager { * profile owner of an organization-owned managed profile and the * list of permitted input method package names is not null or empty. */ + @SupportsCoexistence public boolean setPermittedInputMethods( @NonNull ComponentName admin, List<String> packageNames) { if (mService != null) { @@ -11696,6 +11700,7 @@ public class DevicePolicyManager { * @see DeviceAdminReceiver#onLockTaskModeExiting(Context, Intent) * @see UserManager#DISALLOW_CREATE_WINDOWS */ + @SupportsCoexistence public void setLockTaskPackages(@NonNull ComponentName admin, @NonNull String[] packages) throws SecurityException { throwIfParentInstance("setLockTaskPackages"); @@ -11764,6 +11769,7 @@ public class DevicePolicyManager { * affiliated user or profile, or the profile owner when no device owner is set. * @see #isAffiliatedUser **/ + @SupportsCoexistence public void setLockTaskFeatures(@NonNull ComponentName admin, @LockTaskFeature int flags) { throwIfParentInstance("setLockTaskFeatures"); if (mService != null) { @@ -12267,6 +12273,7 @@ public class DevicePolicyManager { * @see #setDelegatedScopes * @see #DELEGATION_BLOCK_UNINSTALL */ + @SupportsCoexistence public void setUninstallBlocked(@Nullable ComponentName admin, String packageName, boolean uninstallBlocked) { throwIfParentInstance("setUninstallBlocked"); @@ -12755,6 +12762,7 @@ public class DevicePolicyManager { * @see #setDelegatedScopes * @see #DELEGATION_PERMISSION_GRANT */ + @SupportsCoexistence public boolean setPermissionGrantState(@NonNull ComponentName admin, @NonNull String packageName, @NonNull String permission, @PermissionGrantState int grantState) { @@ -15301,6 +15309,7 @@ public class DevicePolicyManager { * @param packages The package names for the apps. * @throws SecurityException if {@code admin} is not a device owner or a profile owner. */ + @SupportsCoexistence public void setUserControlDisabledPackages(@NonNull ComponentName admin, @NonNull List<String> packages) { throwIfParentInstance("setUserControlDisabledPackages"); diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java index 6e49e956fe7e..b7ec7b55d7db 100644 --- a/core/java/android/app/assist/AssistStructure.java +++ b/core/java/android/app/assist/AssistStructure.java @@ -545,6 +545,7 @@ public class AssistStructure implements Parcelable { int resolveViewAutofillFlags(Context context, int fillRequestFlags) { return (fillRequestFlags & FillRequest.FLAG_MANUAL_REQUEST) != 0 || context.isAutofillCompatibilityEnabled() + || (fillRequestFlags & FillRequest.FLAG_PCC_DETECTION) != 0 ? View.AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS : 0; } diff --git a/core/java/android/companion/CompanionDeviceService.java b/core/java/android/companion/CompanionDeviceService.java index 01c5fa152fc6..f660377d7924 100644 --- a/core/java/android/companion/CompanionDeviceService.java +++ b/core/java/android/companion/CompanionDeviceService.java @@ -210,6 +210,10 @@ public abstract class CompanionDeviceService extends Service { * As an example, it's valid to provide streams obtained from a * {@link BluetoothSocket} to this method, since {@link BluetoothSocket} * meets the API contract described above. + * <p> + * This method passes through to + * {@link CompanionDeviceManager#attachSystemDataTransport(int, InputStream, OutputStream)} + * for your convenience if you get callbacks in this class. * * @param associationId id of the associated device * @param in already connected stream of data incoming from remote @@ -229,6 +233,10 @@ public abstract class CompanionDeviceService extends Service { /** * Detach any bidirectional communication streams previously configured * through {@link #attachSystemDataTransport}. + * <p> + * This method passes through to + * {@link CompanionDeviceManager#detachSystemDataTransport(int)} + * for your convenience if you get callbacks in this class. * * @param associationId id of the associated device */ diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index d7ab6d7af77a..fea557711be6 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -578,6 +578,13 @@ import java.util.TimeZone; * <li> {@link #ACTION_SHUTDOWN} * </ul> * + * <p class="note"><strong>Note: </strong>If your app targets Android 11 + * (API level 30) or higher, registering broadcast such as + * {@link #ACTION_PACKAGES_SUSPENDED} that includes package details in the + * extras receives a filtered list of apps or nothing. Learn more about how to + * <a href="/training/basics/intents/package-visibility">manage package visibility</a>. + * </p> + * * <h3>Standard Categories</h3> * * <p>These are the current standard categories that can be used to further @@ -4551,8 +4558,8 @@ public class Intent implements Parcelable, Cloneable { * @see #EXTRA_SIM_LOCKED_REASON * @see #EXTRA_REBROADCAST_ON_UNLOCK * - * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED} or - * {@link #ACTION_SIM_APPLICATION_STATE_CHANGED} + * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED} or + * {@link android.telephony.TelephonyManager#ACTION_SIM_APPLICATION_STATE_CHANGED} * * @hide */ @@ -4575,42 +4582,42 @@ public class Intent implements Parcelable, Cloneable { * @see #SIM_STATE_IMSI * @see #SIM_STATE_LOADED * @hide - * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED} + * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED} */ public static final String EXTRA_SIM_STATE = "ss"; /** * The intent value UNKNOWN represents the SIM state unknown * @hide - * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED} + * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED} */ public static final String SIM_STATE_UNKNOWN = "UNKNOWN"; /** * The intent value NOT_READY means that the SIM is not ready eg. radio is off or powering on * @hide - * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED} + * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED} */ public static final String SIM_STATE_NOT_READY = "NOT_READY"; /** * The intent value ABSENT means the SIM card is missing * @hide - * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED} + * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED} */ public static final String SIM_STATE_ABSENT = "ABSENT"; /** * The intent value PRESENT means the device has a SIM card inserted * @hide - * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED} + * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED} */ public static final String SIM_STATE_PRESENT = "PRESENT"; /** * The intent value CARD_IO_ERROR means for three consecutive times there was SIM IO error * @hide - * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED} + * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED} */ static public final String SIM_STATE_CARD_IO_ERROR = "CARD_IO_ERROR"; @@ -4618,35 +4625,35 @@ public class Intent implements Parcelable, Cloneable { * The intent value CARD_RESTRICTED means card is present but not usable due to carrier * restrictions * @hide - * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED} + * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED} */ static public final String SIM_STATE_CARD_RESTRICTED = "CARD_RESTRICTED"; /** * The intent value LOCKED means the SIM is locked by PIN or by network * @hide - * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED} + * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED} */ public static final String SIM_STATE_LOCKED = "LOCKED"; /** * The intent value READY means the SIM is ready to be accessed * @hide - * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED} + * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED} */ public static final String SIM_STATE_READY = "READY"; /** * The intent value IMSI means the SIM IMSI is ready in property * @hide - * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED} + * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED} */ public static final String SIM_STATE_IMSI = "IMSI"; /** * The intent value LOADED means all SIM records, including IMSI, are loaded * @hide - * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED} + * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED} */ public static final String SIM_STATE_LOADED = "LOADED"; @@ -4660,21 +4667,24 @@ public class Intent implements Parcelable, Cloneable { * @see #SIM_ABSENT_ON_PERM_DISABLED * * @hide - * @deprecated Use {@link #ACTION_SIM_APPLICATION_STATE_CHANGED} + * @deprecated Use + * {@link android.telephony.TelephonyManager#ACTION_SIM_APPLICATION_STATE_CHANGED} */ public static final String EXTRA_SIM_LOCKED_REASON = "reason"; /** * The intent value PIN means the SIM is locked on PIN1 * @hide - * @deprecated Use {@link #ACTION_SIM_APPLICATION_STATE_CHANGED} + * @deprecated Use + * {@link android.telephony.TelephonyManager#ACTION_SIM_APPLICATION_STATE_CHANGED} */ public static final String SIM_LOCKED_ON_PIN = "PIN"; /** * The intent value PUK means the SIM is locked on PUK1 * @hide - * @deprecated Use {@link #ACTION_SIM_APPLICATION_STATE_CHANGED} + * @deprecated Use + * {@link android.telephony.TelephonyManager#ACTION_SIM_APPLICATION_STATE_CHANGED} */ /* PUK means ICC is locked on PUK1 */ public static final String SIM_LOCKED_ON_PUK = "PUK"; @@ -4682,14 +4692,16 @@ public class Intent implements Parcelable, Cloneable { /** * The intent value NETWORK means the SIM is locked on NETWORK PERSONALIZATION * @hide - * @deprecated Use {@link #ACTION_SIM_APPLICATION_STATE_CHANGED} + * @deprecated Use + * {@link android.telephony.TelephonyManager#ACTION_SIM_APPLICATION_STATE_CHANGED} */ public static final String SIM_LOCKED_NETWORK = "NETWORK"; /** * The intent value PERM_DISABLED means SIM is permanently disabled due to puk fails * @hide - * @deprecated Use {@link #ACTION_SIM_APPLICATION_STATE_CHANGED} + * @deprecated Use + * {@link android.telephony.TelephonyManager#ACTION_SIM_APPLICATION_STATE_CHANGED} */ public static final String SIM_ABSENT_ON_PERM_DISABLED = "PERM_DISABLED"; @@ -4698,8 +4710,8 @@ public class Intent implements Parcelable, Cloneable { * is a rebroadcast on unlock. Defaults to {@code false} if not specified. * * @hide - * @deprecated Use {@link #ACTION_SIM_CARD_STATE_CHANGED} or - * {@link #ACTION_SIM_APPLICATION_STATE_CHANGED} + * @deprecated Use {@link android.telephony.TelephonyManager#ACTION_SIM_CARD_STATE_CHANGED} or + * {@link android.telephony.TelephonyManager#ACTION_SIM_APPLICATION_STATE_CHANGED} */ public static final String EXTRA_REBROADCAST_ON_UNLOCK = "rebroadcastOnUnlock"; diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 94c5e25b25f9..ffe73d6656a7 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -2576,7 +2576,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { /** * Returns whether attributions provided by the application are meant to be user-visible. * Defaults to false if application info is retrieved without - * {@link PackageManager#GET_ATTRIBUTIONS}. + * {@link PackageManager#GET_ATTRIBUTIONS_LONG}. */ public boolean areAttributionsUserVisible() { return (privateFlagsExt & PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE) != 0; diff --git a/core/java/android/content/pm/PackageInfo.java b/core/java/android/content/pm/PackageInfo.java index 4259600e8e92..a89d17bb2343 100644 --- a/core/java/android/content/pm/PackageInfo.java +++ b/core/java/android/content/pm/PackageInfo.java @@ -221,7 +221,7 @@ public class PackageInfo implements Parcelable { /** * Array of all {@link android.R.styleable#AndroidManifestAttribution * <attribution>} tags included under <manifest>, or null if there were none. This - * is only filled if the flag {@link PackageManager#GET_ATTRIBUTIONS} was set. + * is only filled if the flag {@link PackageManager#GET_ATTRIBUTIONS_LONG} was set. */ @SuppressWarnings({"ArrayReturn", "NullableCollection"}) public @Nullable Attribution[] attributions; diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 09b68e22b85e..fce9f4cb4660 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -151,6 +151,29 @@ public abstract class PackageManager { "android.media.PROPERTY_MEDIA_CAPABILITIES"; /** + * <application> level {@link android.content.pm.PackageManager.Property} tag + * specifying the XML resource ID containing the declaration of the self-certified network + * capabilities used by the application. + * + * <p> Starting from Android 14, usage of some network capabilities in + * {@link android.net.ConnectivityManager#requestNetwork} require the application to + * declare its usage of that particular capability in this resource. Only some capabilities + * require a declaration. Please look up the specific capability you want to use in + * {@link android.net.NetworkCapabilities} to see if it needs declaration in this property. + * + * For example: + * <application> + * <property android:name="android.net.PROPERTY_SELF_CERTIFIED_NETWORK_CAPABILITIES" + * android:resource="@xml/self_certified_network_capabilities"> + * <application> + * + * <p> The detail format of self_certified_network_capabilities.xml is described in + * {@link android.net.NetworkRequest} + */ + public static final String PROPERTY_SELF_CERTIFIED_NETWORK_CAPABILITIES = + "android.net.PROPERTY_SELF_CERTIFIED_NETWORK_CAPABILITIES"; + + /** * Application level property that an app can specify to opt-out from having private data * directories both on the internal and external storages. * @@ -717,7 +740,7 @@ public abstract class PackageManager { GET_DISABLED_UNTIL_USED_COMPONENTS, GET_UNINSTALLED_PACKAGES, MATCH_HIDDEN_UNTIL_INSTALLED_COMPONENTS, - GET_ATTRIBUTIONS, + GET_ATTRIBUTIONS_LONG, }) @Retention(RetentionPolicy.SOURCE) public @interface PackageInfoFlagsBits {} @@ -1127,8 +1150,9 @@ public abstract class PackageManager { public static final int MATCH_CLONE_PROFILE = 0x20000000; /** - * {@link PackageInfo} flag: return all attributions declared in the package manifest + * @deprecated Use {@link #GET_ATTRIBUTIONS_LONG} to avoid unintended sign extension. */ + @Deprecated public static final int GET_ATTRIBUTIONS = 0x80000000; /** @hide */ @@ -1153,6 +1177,11 @@ public abstract class PackageManager { public static final int MATCH_APEX = 0x40000000; /** + * {@link PackageInfo} flag: return all attributions declared in the package manifest + */ + public static final long GET_ATTRIBUTIONS_LONG = 0x80000000L; + + /** * Flag for {@link #addCrossProfileIntentFilter}: if this flag is set: when * resolving an intent that matches the {@code CrossProfileIntentFilter}, * the current profile will be skipped. Only activities in the target user diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index 335975bae393..1c8276cb8276 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -1107,7 +1107,7 @@ public final class Configuration implements Parcelable, Comparable<Configuration } else { sb.append("?mcc"); } - if (mnc != 0) { + if (mnc != MNC_ZERO) { sb.append(mnc); sb.append("mnc"); } else { @@ -1998,7 +1998,7 @@ public final class Configuration implements Parcelable, Comparable<Configuration changed |= ActivityInfo.CONFIG_FONT_WEIGHT_ADJUSTMENT; } - if (!publicOnly && mGrammaticalGender != delta.mGrammaticalGender) { + if (mGrammaticalGender != delta.mGrammaticalGender) { changed |= ActivityInfo.CONFIG_GRAMMATICAL_GENDER; } return changed; diff --git a/core/java/android/credentials/CredentialManager.java b/core/java/android/credentials/CredentialManager.java index 1db14a3dda16..8b43a21c2fb7 100644 --- a/core/java/android/credentials/CredentialManager.java +++ b/core/java/android/credentials/CredentialManager.java @@ -25,6 +25,7 @@ import android.annotation.RequiresPermission; import android.annotation.SystemService; import android.app.Activity; import android.app.PendingIntent; +import android.content.ComponentName; import android.content.Context; import android.content.IntentSender; import android.os.CancellationSignal; @@ -222,7 +223,7 @@ public final class CredentialManager { * @param callback the callback invoked when the request succeeds or fails * @hide */ - @RequiresPermission(android.Manifest.permission.LIST_ENABLED_CREDENTIAL_PROVIDERS) + @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void listEnabledProviders( @Nullable CancellationSignal cancellationSignal, @CallbackExecutor @NonNull Executor executor, @@ -280,13 +281,32 @@ public final class CredentialManager { } /** + * Returns {@code true} if the calling application provides a CredentialProviderService that is + * enabled for the current user, or {@code false} otherwise. CredentialProviderServices are + * enabled on a per-service basis so the individual component name of the service should be + * passed in here. + * + * @param componentName the component name to check is enabled + */ + public boolean isEnabledCredentialProviderService(@NonNull ComponentName componentName) { + requireNonNull(componentName, "componentName must not be null"); + + try { + return mService.isEnabledCredentialProviderService( + componentName, mContext.getOpPackageName()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * Returns whether the service is enabled. * * @hide */ public static boolean isServiceEnabled(Context context) { if (context == null) { - return false; + return false; } CredentialManager credentialManager = (CredentialManager) context.getSystemService(Context.CREDENTIAL_SERVICE); @@ -298,8 +318,7 @@ public final class CredentialManager { private boolean isServiceEnabled() { return DeviceConfig.getBoolean( - DeviceConfig.NAMESPACE_CREDENTIAL, DEVICE_CONFIG_ENABLE_CREDENTIAL_MANAGER, - true); + DeviceConfig.NAMESPACE_CREDENTIAL, DEVICE_CONFIG_ENABLE_CREDENTIAL_MANAGER, true); } /** @@ -313,22 +332,19 @@ public final class CredentialManager { } /** - * Registers a {@link CredentialDescription} for an actively provisioned {@link Credential} - * a CredentialProvider has. This registry will then be used to determine where to - * fetch the requested {@link Credential} from. Not all credential types will be supported. - * The distinction will be made by the JetPack layer. For the types that are supported, - * JetPack will add a new key-value pair into {@link GetCredentialRequest}. These will not - * be persistent on the device. The Credential Providers will need to call this API again - * upon device reboot. + * Registers a {@link CredentialDescription} for an actively provisioned {@link Credential} a + * CredentialProvider has. This registry will then be used to determine where to fetch the + * requested {@link Credential} from. Not all credential types will be supported. The + * distinction will be made by the JetPack layer. For the types that are supported, JetPack will + * add a new key-value pair into {@link GetCredentialRequest}. These will not be persistent on + * the device. The Credential Providers will need to call this API again upon device reboot. * * @param request the request data - * - * @throws {@link UnsupportedOperationException} if the feature has not been enabled. - * @throws {@link com.android.server.credentials.NonCredentialProviderCallerException} - * if the calling package name is not also listed as a Credential Provider. - * @throws {@link IllegalArgumentException} if the calling Credential Provider can not handle - * one or more of the Credential Types that are sent for registration. - * + * @throws {@link UnsupportedOperationException} if the feature has not been enabled. + * @throws {@link com.android.server.credentials.NonCredentialProviderCallerException} if the + * calling package name is not also listed as a Credential Provider. + * @throws {@link IllegalArgumentException} if the calling Credential Provider can not handle + * one or more of the Credential Types that are sent for registration. */ public void registerCredentialDescription( @NonNull RegisterCredentialDescriptionRequest request) { @@ -346,16 +362,12 @@ public final class CredentialManager { } } - /** - * Unregisters a {@link CredentialDescription} for an actively provisioned {@link Credential} + * Unregisters a {@link CredentialDescription} for an actively provisioned {@link Credential} * that has been registered previously. * - * * @param request the request data - * - * @throws {@link UnsupportedOperationException} if the feature has not been enabled. - * + * @throws {@link UnsupportedOperationException} if the feature has not been enabled. */ public void unregisterCredentialDescription( @NonNull UnregisterCredentialDescriptionRequest request) { @@ -371,7 +383,6 @@ public final class CredentialManager { } catch (RemoteException e) { e.rethrowFromSystemServer(); } - } private static class GetCredentialTransport extends IGetCredentialCallback.Stub { diff --git a/core/java/android/credentials/ICredentialManager.aidl b/core/java/android/credentials/ICredentialManager.aidl index 4ca3124f5c81..885acd4f712b 100644 --- a/core/java/android/credentials/ICredentialManager.aidl +++ b/core/java/android/credentials/ICredentialManager.aidl @@ -28,6 +28,7 @@ import android.credentials.ICreateCredentialCallback; import android.credentials.IGetCredentialCallback; import android.credentials.IListEnabledProvidersCallback; import android.credentials.ISetEnabledProvidersCallback; +import android.content.ComponentName; import android.os.ICancellationSignal; /** @@ -50,5 +51,7 @@ interface ICredentialManager { void registerCredentialDescription(in RegisterCredentialDescriptionRequest request, String callingPackage); void unregisterCredentialDescription(in UnregisterCredentialDescriptionRequest request, String callingPackage); + + boolean isEnabledCredentialProviderService(in ComponentName componentName, String callingPackage); } diff --git a/core/java/android/credentials/ui/GetCredentialProviderData.java b/core/java/android/credentials/ui/GetCredentialProviderData.java index 5fe1441f8b3f..f106ed54c477 100644 --- a/core/java/android/credentials/ui/GetCredentialProviderData.java +++ b/core/java/android/credentials/ui/GetCredentialProviderData.java @@ -39,18 +39,18 @@ public final class GetCredentialProviderData extends ProviderData implements Par @NonNull private final List<Entry> mActionChips; @Nullable - private final Entry mAuthenticationEntry; + private final List<Entry> mAuthenticationEntries; @Nullable private final Entry mRemoteEntry; public GetCredentialProviderData( @NonNull String providerFlattenedComponentName, @NonNull List<Entry> credentialEntries, - @NonNull List<Entry> actionChips, @Nullable Entry authenticationEntry, + @NonNull List<Entry> actionChips, @NonNull List<Entry> authenticationEntries, @Nullable Entry remoteEntry) { super(providerFlattenedComponentName); mCredentialEntries = credentialEntries; mActionChips = actionChips; - mAuthenticationEntry = authenticationEntry; + mAuthenticationEntries = authenticationEntries; mRemoteEntry = remoteEntry; } @@ -64,9 +64,9 @@ public final class GetCredentialProviderData extends ProviderData implements Par return mActionChips; } - @Nullable - public Entry getAuthenticationEntry() { - return mAuthenticationEntry; + @NonNull + public List<Entry> getAuthenticationEntries() { + return mAuthenticationEntries; } @Nullable @@ -87,8 +87,10 @@ public final class GetCredentialProviderData extends ProviderData implements Par mActionChips = actionChips; AnnotationValidations.validate(NonNull.class, null, mActionChips); - Entry authenticationEntry = in.readTypedObject(Entry.CREATOR); - mAuthenticationEntry = authenticationEntry; + List<Entry> authenticationEntries = new ArrayList<>(); + in.readTypedList(authenticationEntries, Entry.CREATOR); + mAuthenticationEntries = actionChips; + AnnotationValidations.validate(NonNull.class, null, mAuthenticationEntries); Entry remoteEntry = in.readTypedObject(Entry.CREATOR); mRemoteEntry = remoteEntry; @@ -99,7 +101,7 @@ public final class GetCredentialProviderData extends ProviderData implements Par super.writeToParcel(dest, flags); dest.writeTypedList(mCredentialEntries); dest.writeTypedList(mActionChips); - dest.writeTypedObject(mAuthenticationEntry, flags); + dest.writeTypedList(mAuthenticationEntries); dest.writeTypedObject(mRemoteEntry, flags); } @@ -131,7 +133,7 @@ public final class GetCredentialProviderData extends ProviderData implements Par @NonNull private String mProviderFlattenedComponentName; @NonNull private List<Entry> mCredentialEntries = new ArrayList<>(); @NonNull private List<Entry> mActionChips = new ArrayList<>(); - @Nullable private Entry mAuthenticationEntry = null; + @Nullable private List<Entry> mAuthenticationEntries = new ArrayList<>(); @Nullable private Entry mRemoteEntry = null; /** Constructor with required properties. */ @@ -155,8 +157,8 @@ public final class GetCredentialProviderData extends ProviderData implements Par /** Sets the authentication entry to be displayed to the user. */ @NonNull - public Builder setAuthenticationEntry(@Nullable Entry authenticationEntry) { - mAuthenticationEntry = authenticationEntry; + public Builder setAuthenticationEntries(@NonNull List<Entry> authenticationEntry) { + mAuthenticationEntries = authenticationEntry; return this; } @@ -171,7 +173,7 @@ public final class GetCredentialProviderData extends ProviderData implements Par @NonNull public GetCredentialProviderData build() { return new GetCredentialProviderData(mProviderFlattenedComponentName, - mCredentialEntries, mActionChips, mAuthenticationEntry, mRemoteEntry); + mCredentialEntries, mActionChips, mAuthenticationEntries, mRemoteEntry); } } } diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java index 0483b71d5587..71ec1c640d48 100644 --- a/core/java/android/hardware/usb/UsbManager.java +++ b/core/java/android/hardware/usb/UsbManager.java @@ -45,6 +45,7 @@ import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.RemoteException; +import android.os.SystemProperties; import android.util.ArrayMap; import android.util.Log; import android.util.Slog; @@ -99,6 +100,8 @@ public class UsbManager { * audio source function is enabled * <li> {@link #USB_FUNCTION_MIDI} boolean extra indicating whether the * MIDI function is enabled + * <li> {@link #USB_FUNCTION_UVC} boolean extra indicating whether the + * UVC function is enabled * </ul> * If the sticky intent has not been found, that indicates USB is disconnected, * USB is not configured, MTP function is enabled, and all the other functions are disabled. @@ -314,6 +317,14 @@ public class UsbManager { public static final String USB_FUNCTION_NCM = "ncm"; /** + * Name of the UVC USB function. + * Used in extras for the {@link #ACTION_USB_STATE} broadcast + * + * @hide + */ + public static final String USB_FUNCTION_UVC = "uvc"; + + /** * Name of Gadget Hal Not Present; * * @hide @@ -683,8 +694,17 @@ public class UsbManager { @SystemApi public static final long FUNCTION_NCM = 1 << 10; + /** + * Code for the uvc usb function. Passed as a mask into {@link #setCurrentFunctions(long)} + * Only supported if {@link #isUvcSupportEnabled()} returns true. + * Must be equal to {@link GadgetFunction#UVC} + * @hide + */ + @SystemApi + public static final long FUNCTION_UVC = 1 << 7; + private static final long SETTABLE_FUNCTIONS = FUNCTION_MTP | FUNCTION_PTP | FUNCTION_RNDIS - | FUNCTION_MIDI | FUNCTION_NCM; + | FUNCTION_MIDI | FUNCTION_NCM | FUNCTION_UVC; private static final Map<String, Long> FUNCTION_NAME_TO_CODE = new HashMap<>(); @@ -702,6 +722,7 @@ public class UsbManager { FUNCTION_NAME_TO_CODE.put(UsbManager.USB_FUNCTION_AUDIO_SOURCE, FUNCTION_AUDIO_SOURCE); FUNCTION_NAME_TO_CODE.put(UsbManager.USB_FUNCTION_ADB, FUNCTION_ADB); FUNCTION_NAME_TO_CODE.put(UsbManager.USB_FUNCTION_NCM, FUNCTION_NCM); + FUNCTION_NAME_TO_CODE.put(UsbManager.USB_FUNCTION_UVC, FUNCTION_UVC); } /** @hide */ @@ -715,6 +736,7 @@ public class UsbManager { FUNCTION_AUDIO_SOURCE, FUNCTION_ADB, FUNCTION_NCM, + FUNCTION_UVC, }) public @interface UsbFunctionMode {} @@ -1337,6 +1359,21 @@ public class UsbManager { } /** + * Returns whether UVC is advertised to be supported or not. SELinux + * enforces that this function returns {@code false} when called from a + * process that doesn't belong either to a system app, or the + * DeviceAsWebcam Service. + * + * @return true if UVC is supported, false if UVC is not supported or if + * called from a non-system app that isn't DeviceAsWebcam Service. + * @hide + */ + @SystemApi + public static boolean isUvcSupportEnabled() { + return SystemProperties.getBoolean("ro.usb.uvc.enabled", false); + } + + /** * Enable/Disable the USB data signaling. * <p> * Enables/Disables USB data path of all USB ports. @@ -1716,7 +1753,7 @@ public class UsbManager { /** * Returns whether the given functions are valid inputs to UsbManager. - * Currently the empty functions or any of MTP, PTP, RNDIS, MIDI, NCM are accepted. + * Currently the empty functions or any of MTP, PTP, RNDIS, MIDI, NCM, UVC are accepted. * * Only one function may be set at a time, except for RNDIS and NCM, which can be set together * because from a user perspective they are the same function (tethering). @@ -1762,6 +1799,9 @@ public class UsbManager { if ((functions & FUNCTION_NCM) != 0) { joiner.add(UsbManager.USB_FUNCTION_NCM); } + if ((functions & FUNCTION_UVC) != 0) { + joiner.add(UsbManager.USB_FUNCTION_UVC); + } if ((functions & FUNCTION_ADB) != 0) { joiner.add(UsbManager.USB_FUNCTION_ADB); } diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java index 7378ac7638de..6dc80cf4c374 100644 --- a/core/java/android/nfc/NfcAdapter.java +++ b/core/java/android/nfc/NfcAdapter.java @@ -32,7 +32,6 @@ import android.app.PendingIntent; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.IntentFilter; -import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.net.Uri; import android.nfc.tech.MifareClassic; @@ -572,66 +571,6 @@ public final class NfcAdapter { } /** - * Helper to check if this device has FEATURE_NFC_BEAM, but without using - * a context. - * Equivalent to - * context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC_BEAM) - */ - private static boolean hasBeamFeature() { - IPackageManager pm = ActivityThread.getPackageManager(); - if (pm == null) { - Log.e(TAG, "Cannot get package manager, assuming no Android Beam feature"); - return false; - } - try { - return pm.hasSystemFeature(PackageManager.FEATURE_NFC_BEAM, 0); - } catch (RemoteException e) { - Log.e(TAG, "Package manager query failed, assuming no Android Beam feature", e); - return false; - } - } - - /** - * Helper to check if this device has FEATURE_NFC, but without using - * a context. - * Equivalent to - * context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC) - */ - private static boolean hasNfcFeature() { - IPackageManager pm = ActivityThread.getPackageManager(); - if (pm == null) { - Log.e(TAG, "Cannot get package manager, assuming no NFC feature"); - return false; - } - try { - return pm.hasSystemFeature(PackageManager.FEATURE_NFC, 0); - } catch (RemoteException e) { - Log.e(TAG, "Package manager query failed, assuming no NFC feature", e); - return false; - } - } - - /** - * Helper to check if this device is NFC HCE capable, by checking for - * FEATURE_NFC_HOST_CARD_EMULATION and/or FEATURE_NFC_HOST_CARD_EMULATION_NFCF, - * but without using a context. - */ - private static boolean hasNfcHceFeature() { - IPackageManager pm = ActivityThread.getPackageManager(); - if (pm == null) { - Log.e(TAG, "Cannot get package manager, assuming no NFC feature"); - return false; - } - try { - return pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION, 0) - || pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION_NFCF, 0); - } catch (RemoteException e) { - Log.e(TAG, "Package manager query failed, assuming no NFC feature", e); - return false; - } - } - - /** * Return list of Secure Elements which support off host card emulation. * * @return List<String> containing secure elements on the device which supports @@ -640,23 +579,21 @@ public final class NfcAdapter { * @hide */ public @NonNull List<String> getSupportedOffHostSecureElements() { + if (mContext == null) { + throw new UnsupportedOperationException("You need a context on NfcAdapter to use the " + + " getSupportedOffHostSecureElements APIs"); + } List<String> offHostSE = new ArrayList<String>(); - IPackageManager pm = ActivityThread.getPackageManager(); + PackageManager pm = mContext.getPackageManager(); if (pm == null) { Log.e(TAG, "Cannot get package manager, assuming no off-host CE feature"); return offHostSE; } - try { - if (pm.hasSystemFeature(PackageManager.FEATURE_NFC_OFF_HOST_CARD_EMULATION_UICC, 0)) { - offHostSE.add("SIM"); - } - if (pm.hasSystemFeature(PackageManager.FEATURE_NFC_OFF_HOST_CARD_EMULATION_ESE, 0)) { - offHostSE.add("eSE"); - } - } catch (RemoteException e) { - Log.e(TAG, "Package manager query failed, assuming no off-host CE feature", e); - offHostSE.clear(); - return offHostSE; + if (pm.hasSystemFeature(PackageManager.FEATURE_NFC_OFF_HOST_CARD_EMULATION_UICC)) { + offHostSE.add("SIM"); + } + if (pm.hasSystemFeature(PackageManager.FEATURE_NFC_OFF_HOST_CARD_EMULATION_ESE)) { + offHostSE.add("eSE"); } return offHostSE; } @@ -668,10 +605,20 @@ public final class NfcAdapter { */ @UnsupportedAppUsage public static synchronized NfcAdapter getNfcAdapter(Context context) { + if (context == null) { + if (sNullContextNfcAdapter == null) { + sNullContextNfcAdapter = new NfcAdapter(null); + } + return sNullContextNfcAdapter; + } if (!sIsInitialized) { - sHasNfcFeature = hasNfcFeature(); - sHasBeamFeature = hasBeamFeature(); - boolean hasHceFeature = hasNfcHceFeature(); + PackageManager pm; + pm = context.getPackageManager(); + sHasNfcFeature = pm.hasSystemFeature(PackageManager.FEATURE_NFC); + sHasBeamFeature = pm.hasSystemFeature(PackageManager.FEATURE_NFC_BEAM); + boolean hasHceFeature = + pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION) + || pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION_NFCF); /* is this device meant to have NFC */ if (!sHasNfcFeature && !hasHceFeature) { Log.v(TAG, "this device does not have NFC support"); @@ -707,12 +654,6 @@ public final class NfcAdapter { sIsInitialized = true; } - if (context == null) { - if (sNullContextNfcAdapter == null) { - sNullContextNfcAdapter = new NfcAdapter(null); - } - return sNullContextNfcAdapter; - } NfcAdapter adapter = sNfcAdapters.get(context); if (adapter == null) { adapter = new NfcAdapter(context); diff --git a/core/java/android/nfc/cardemulation/CardEmulation.java b/core/java/android/nfc/cardemulation/CardEmulation.java index 0b56d19201fb..6a4209135c66 100644 --- a/core/java/android/nfc/cardemulation/CardEmulation.java +++ b/core/java/android/nfc/cardemulation/CardEmulation.java @@ -22,11 +22,9 @@ import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.app.Activity; -import android.app.ActivityThread; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.nfc.INfcCardEmulation; import android.nfc.NfcAdapter; @@ -158,18 +156,13 @@ public final class CardEmulation { throw new UnsupportedOperationException(); } if (!sIsInitialized) { - IPackageManager pm = ActivityThread.getPackageManager(); + PackageManager pm = context.getPackageManager(); if (pm == null) { Log.e(TAG, "Cannot get PackageManager"); throw new UnsupportedOperationException(); } - try { - if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION, 0)) { - Log.e(TAG, "This device does not support card emulation"); - throw new UnsupportedOperationException(); - } - } catch (RemoteException e) { - Log.e(TAG, "PackageManager query failed."); + if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) { + Log.e(TAG, "This device does not support card emulation"); throw new UnsupportedOperationException(); } sIsInitialized = true; diff --git a/core/java/android/nfc/cardemulation/NfcFCardEmulation.java b/core/java/android/nfc/cardemulation/NfcFCardEmulation.java index 3c924556365e..48bbf5b61052 100644 --- a/core/java/android/nfc/cardemulation/NfcFCardEmulation.java +++ b/core/java/android/nfc/cardemulation/NfcFCardEmulation.java @@ -17,10 +17,8 @@ package android.nfc.cardemulation; import android.app.Activity; -import android.app.ActivityThread; import android.content.ComponentName; import android.content.Context; -import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.nfc.INfcFCardEmulation; import android.nfc.NfcAdapter; @@ -70,18 +68,13 @@ public final class NfcFCardEmulation { throw new UnsupportedOperationException(); } if (!sIsInitialized) { - IPackageManager pm = ActivityThread.getPackageManager(); + PackageManager pm = context.getPackageManager(); if (pm == null) { Log.e(TAG, "Cannot get PackageManager"); throw new UnsupportedOperationException(); } - try { - if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION_NFCF, 0)) { - Log.e(TAG, "This device does not support NFC-F card emulation"); - throw new UnsupportedOperationException(); - } - } catch (RemoteException e) { - Log.e(TAG, "PackageManager query failed."); + if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION_NFCF)) { + Log.e(TAG, "This device does not support NFC-F card emulation"); throw new UnsupportedOperationException(); } sIsInitialized = true; diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 0efd264335a2..1df45d132f34 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -1069,11 +1069,6 @@ public class UserManager { * Specifies that windows besides app windows should not be * created. This will block the creation of the following types of windows. * <li>{@link LayoutParams#TYPE_TOAST}</li> - * <li>{@link LayoutParams#TYPE_PHONE}</li> - * <li>{@link LayoutParams#TYPE_PRIORITY_PHONE}</li> - * <li>{@link LayoutParams#TYPE_SYSTEM_ALERT}</li> - * <li>{@link LayoutParams#TYPE_SYSTEM_ERROR}</li> - * <li>{@link LayoutParams#TYPE_SYSTEM_OVERLAY}</li> * <li>{@link LayoutParams#TYPE_APPLICATION_OVERLAY}</li> * * <p>This can only be set by device owners and profile owners on the primary user. diff --git a/core/java/android/os/storage/OWNERS b/core/java/android/os/storage/OWNERS index c80c57ce917a..e5b76f6c1c15 100644 --- a/core/java/android/os/storage/OWNERS +++ b/core/java/android/os/storage/OWNERS @@ -1,7 +1,9 @@ # Bug component: 95221 +# Please assign new bugs to android-storage-triage@, not to individual people + # Android Storage Team -abkaur@google.com +alukin@google.com corinac@google.com dipankarb@google.com krishang@google.com diff --git a/core/java/android/permission/PermissionUsageHelper.java b/core/java/android/permission/PermissionUsageHelper.java index f5f1c374b636..2a4c01e1c46e 100644 --- a/core/java/android/permission/PermissionUsageHelper.java +++ b/core/java/android/permission/PermissionUsageHelper.java @@ -398,7 +398,8 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis Context userContext = getUserContext(user); PackageInfo packageInfo = userContext.getPackageManager().getPackageInfo( packageName, - PackageManager.GET_PERMISSIONS | PackageManager.GET_ATTRIBUTIONS); + PackageManager.PackageInfoFlags.of( + PackageManager.GET_PERMISSIONS | PackageManager.GET_ATTRIBUTIONS_LONG)); Context pkgContext = userContext.createPackageContext(packageInfo.packageName, 0); for (Attribution attribution : packageInfo.attributions) { try { diff --git a/core/java/android/security/rkp/IGetKeyCallback.aidl b/core/java/android/security/rkp/IGetKeyCallback.aidl index 85ceae62aadc..a36d054f7ed4 100644 --- a/core/java/android/security/rkp/IGetKeyCallback.aidl +++ b/core/java/android/security/rkp/IGetKeyCallback.aidl @@ -25,6 +25,36 @@ import android.security.rkp.RemotelyProvisionedKey; * @hide */ oneway interface IGetKeyCallback { + enum ErrorCode { + /** + * An unexpected error occurred and there's no standard way to describe it. See the + * corresponding error string for more information. + */ + ERROR_UNKNOWN = 1, + + /** + * Device will not receive remotely provisioned keys because it's running vulnerable + * code. The device needs to be updated to a fixed build to recover. + */ + ERROR_REQUIRES_SECURITY_PATCH = 2, + + /** + * Indicates that the attestation key pool has been exhausted, and the remote key + * provisioning server cannot currently be reached. Clients should wait for the + * device to have connectivity, then retry. + */ + ERROR_PENDING_INTERNET_CONNECTIVITY = 3, + + /** + * Indicates that this device will never be able to provision attestation keys using + * the remote provsisioning server. This may be due to multiple causes, such as the + * device is not registered with the remote provisioning backend or the device has + * been permanently revoked. Clients who receive this error should not attempt to + * retry key creation. + */ + ERROR_PERMANENT = 5, + } + /** * Called in response to {@link IRegistration.getKey}, indicating * a remotely-provisioned key is available. @@ -42,8 +72,9 @@ oneway interface IGetKeyCallback { /** * Called when an error has occurred while trying to get a remotely provisioned key. * - * @param error A description of what failed, suitable for logging. + * @param error allows code to handle certain errors, if desired + * @param description human-readable explanation of what failed, suitable for logging. */ - void onError(String error); + void onError(ErrorCode error, String description); } diff --git a/core/java/android/service/autofill/FillRequest.java b/core/java/android/service/autofill/FillRequest.java index 0f7c9b63dac0..eb5e893416c7 100644 --- a/core/java/android/service/autofill/FillRequest.java +++ b/core/java/android/service/autofill/FillRequest.java @@ -117,6 +117,12 @@ public final class FillRequest implements Parcelable { */ public static final @RequestFlags int FLAG_RESET_FILL_DIALOG_STATE = 0x100; + /** + * Indicate the fill request is made for PCC detection + * @hide + */ + public static final @RequestFlags int FLAG_PCC_DETECTION = 0x200; + /** @hide */ public static final int INVALID_REQUEST_ID = Integer.MIN_VALUE; @@ -200,7 +206,7 @@ public final class FillRequest implements Parcelable { // CHECKSTYLE:OFF Generated code // // To regenerate run: - // $ codegen $ANDROID_BUILD_TOP/./frameworks/base/core/java/android/service/autofill/FillRequest.java + // $ codegen $ANDROID_BUILD_TOP/frameworks/base/core/java/android/service/autofill/FillRequest.java // // To exclude the generated code from IntelliJ auto-formatting enable (one-time): // Settings > Editor > Code Style > Formatter Control @@ -215,7 +221,8 @@ public final class FillRequest implements Parcelable { FLAG_VIEW_NOT_FOCUSED, FLAG_SUPPORTS_FILL_DIALOG, FLAG_IME_SHOWING, - FLAG_RESET_FILL_DIALOG_STATE + FLAG_RESET_FILL_DIALOG_STATE, + FLAG_PCC_DETECTION }) @Retention(RetentionPolicy.SOURCE) @DataClass.Generated.Member @@ -245,6 +252,8 @@ public final class FillRequest implements Parcelable { return "FLAG_IME_SHOWING"; case FLAG_RESET_FILL_DIALOG_STATE: return "FLAG_RESET_FILL_DIALOG_STATE"; + case FLAG_PCC_DETECTION: + return "FLAG_PCC_DETECTION"; default: return Integer.toHexString(value); } } @@ -322,7 +331,8 @@ public final class FillRequest implements Parcelable { | FLAG_VIEW_NOT_FOCUSED | FLAG_SUPPORTS_FILL_DIALOG | FLAG_IME_SHOWING - | FLAG_RESET_FILL_DIALOG_STATE); + | FLAG_RESET_FILL_DIALOG_STATE + | FLAG_PCC_DETECTION); this.mInlineSuggestionsRequest = inlineSuggestionsRequest; this.mDelayedFillIntentSender = delayedFillIntentSender; @@ -463,7 +473,7 @@ public final class FillRequest implements Parcelable { byte flg = in.readByte(); int id = in.readInt(); List<FillContext> fillContexts = new ArrayList<>(); - in.readParcelableList(fillContexts, FillContext.class.getClassLoader(), android.service.autofill.FillContext.class); + in.readParcelableList(fillContexts, FillContext.class.getClassLoader()); Bundle clientState = (flg & 0x4) == 0 ? null : in.readBundle(); int flags = in.readInt(); InlineSuggestionsRequest inlineSuggestionsRequest = (flg & 0x10) == 0 ? null : (InlineSuggestionsRequest) in.readTypedObject(InlineSuggestionsRequest.CREATOR); @@ -484,7 +494,8 @@ public final class FillRequest implements Parcelable { | FLAG_VIEW_NOT_FOCUSED | FLAG_SUPPORTS_FILL_DIALOG | FLAG_IME_SHOWING - | FLAG_RESET_FILL_DIALOG_STATE); + | FLAG_RESET_FILL_DIALOG_STATE + | FLAG_PCC_DETECTION); this.mInlineSuggestionsRequest = inlineSuggestionsRequest; this.mDelayedFillIntentSender = delayedFillIntentSender; @@ -506,10 +517,10 @@ public final class FillRequest implements Parcelable { }; @DataClass.Generated( - time = 1663290803064L, + time = 1675460688829L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/service/autofill/FillRequest.java", - inputSignatures = "public static final @android.service.autofill.FillRequest.RequestFlags int FLAG_MANUAL_REQUEST\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_PASSWORD_INPUT_TYPE\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_VIEW_NOT_FOCUSED\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_SUPPORTS_FILL_DIALOG\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_IME_SHOWING\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_RESET_FILL_DIALOG_STATE\npublic static final int INVALID_REQUEST_ID\nprivate final int mId\nprivate final @android.annotation.NonNull java.util.List<android.service.autofill.FillContext> mFillContexts\nprivate final @android.annotation.Nullable android.os.Bundle mClientState\nprivate final @android.service.autofill.FillRequest.RequestFlags int mFlags\nprivate final @android.annotation.Nullable android.view.inputmethod.InlineSuggestionsRequest mInlineSuggestionsRequest\nprivate final @android.annotation.Nullable android.content.IntentSender mDelayedFillIntentSender\nprivate void onConstructed()\nclass FillRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genHiddenConstructor=true, genHiddenConstDefs=true)") + inputSignatures = "public static final @android.service.autofill.FillRequest.RequestFlags int FLAG_MANUAL_REQUEST\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_COMPATIBILITY_MODE_REQUEST\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_PASSWORD_INPUT_TYPE\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_VIEW_NOT_FOCUSED\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_SUPPORTS_FILL_DIALOG\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_IME_SHOWING\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_RESET_FILL_DIALOG_STATE\npublic static final @android.service.autofill.FillRequest.RequestFlags int FLAG_PCC_DETECTION\npublic static final int INVALID_REQUEST_ID\nprivate final int mId\nprivate final @android.annotation.NonNull java.util.List<android.service.autofill.FillContext> mFillContexts\nprivate final @android.annotation.Nullable android.os.Bundle mClientState\nprivate final @android.service.autofill.FillRequest.RequestFlags int mFlags\nprivate final @android.annotation.Nullable android.view.inputmethod.InlineSuggestionsRequest mInlineSuggestionsRequest\nprivate final @android.annotation.Nullable android.content.IntentSender mDelayedFillIntentSender\nprivate void onConstructed()\nclass FillRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genToString=true, genHiddenConstructor=true, genHiddenConstDefs=true)") @Deprecated private void __metadata() {} diff --git a/core/java/android/service/credentials/BeginGetCredentialRequest.java b/core/java/android/service/credentials/BeginGetCredentialRequest.java index 5d040dbc9240..1e0473906832 100644 --- a/core/java/android/service/credentials/BeginGetCredentialRequest.java +++ b/core/java/android/service/credentials/BeginGetCredentialRequest.java @@ -51,7 +51,7 @@ public final class BeginGetCredentialRequest implements Parcelable { * * This request does not reveal sensitive parameters. Complete list of parameters * is retrieved through the {@link PendingIntent} set on each {@link CredentialEntry} - * on {@link CredentialsResponseContent} set on {@link BeginGetCredentialResponse}, + * on {@link BeginGetCredentialResponse} set on {@link BeginGetCredentialResponse}, * when the user selects one of these entries. */ @NonNull private final List<BeginGetCredentialOption> mBeginGetCredentialOptions; diff --git a/core/java/android/service/credentials/BeginGetCredentialResponse.java b/core/java/android/service/credentials/BeginGetCredentialResponse.java index 85e8d85036fd..0f64c63d56fb 100644 --- a/core/java/android/service/credentials/BeginGetCredentialResponse.java +++ b/core/java/android/service/credentials/BeginGetCredentialResponse.java @@ -21,6 +21,10 @@ import android.annotation.Nullable; import android.os.Parcel; import android.os.Parcelable; +import com.android.internal.util.Preconditions; + +import java.util.ArrayList; +import java.util.List; import java.util.Objects; /** @@ -28,70 +32,44 @@ import java.util.Objects; * data to be shown on the account selector UI. */ public final class BeginGetCredentialResponse implements Parcelable { - /** Content to be used for the UI. */ - private final @Nullable CredentialsResponseContent mCredentialsResponseContent; + /** List of credential entries to be displayed on the UI. */ + private final @NonNull List<CredentialEntry> mCredentialEntries; - /** - * Authentication action that must be launched and completed before showing any content - * from the provider. - */ - private final @Nullable Action mAuthenticationAction; + /** List of authentication entries to be displayed on the UI. */ + private final @NonNull List<Action> mAuthenticationEntries; - /** - * Creates a {@link BeginGetCredentialResponse} instance with an authentication - * {@link Action} set. Providers must use this method when no content can be shown - * before authentication. - * - * <p> When the user selects this {@code authenticationAction}, the system invokes the - * corresponding {@code pendingIntent}. Once the authentication flow is complete, - * the {@link android.app.Activity} result should be set - * to {@link android.app.Activity#RESULT_OK} and the - * {@link CredentialProviderService#EXTRA_CREDENTIALS_RESPONSE_CONTENT} extra should be set - * with a fully populated {@link CredentialsResponseContent} object. - * the authentication action activity is launched, and the user is authenticated, providers - * should create another response with {@link CredentialsResponseContent} using - * {@code createWithDisplayContent}, and add that response to the result of the authentication - * activity. - * - * @throws NullPointerException If {@code authenticationAction} is null. - */ - public static @NonNull BeginGetCredentialResponse createWithAuthentication( - @NonNull Action authenticationAction) { - Objects.requireNonNull(authenticationAction, - "authenticationAction must not be null"); - return new BeginGetCredentialResponse(null, authenticationAction); - } + /** List of provider actions to be displayed on the UI. */ + private final @NonNull List<Action> mActions; - /** - * Creates a {@link BeginGetCredentialRequest} instance with content to be shown on the UI. - * Providers must use this method when there is content to be shown without top level - * authentication required, including credential entries, action entries or a remote entry, - * - * @throws NullPointerException If {@code credentialsResponseContent} is null. - */ - public static @NonNull BeginGetCredentialResponse createWithResponseContent( - @NonNull CredentialsResponseContent credentialsResponseContent) { - Objects.requireNonNull(credentialsResponseContent, - "credentialsResponseContent must not be null"); - return new BeginGetCredentialResponse(credentialsResponseContent, null); - } + /** Remote credential entry to get the response from a different device. */ + private final @Nullable CredentialEntry mRemoteCredentialEntry; - private BeginGetCredentialResponse(@Nullable CredentialsResponseContent - credentialsResponseContent, - @Nullable Action authenticationAction) { - mCredentialsResponseContent = credentialsResponseContent; - mAuthenticationAction = authenticationAction; + private BeginGetCredentialResponse(@NonNull List<CredentialEntry> credentialEntries, + @NonNull List<Action> authenticationEntries, @NonNull List<Action> actions, + @Nullable CredentialEntry remoteCredentialEntry) { + mCredentialEntries = new ArrayList<>(credentialEntries); + mAuthenticationEntries = new ArrayList<>(authenticationEntries); + mActions = new ArrayList<>(actions); + mRemoteCredentialEntry = remoteCredentialEntry; } private BeginGetCredentialResponse(@NonNull Parcel in) { - mCredentialsResponseContent = in.readTypedObject(CredentialsResponseContent.CREATOR); - mAuthenticationAction = in.readTypedObject(Action.CREATOR); + List<CredentialEntry> credentialEntries = new ArrayList<>(); + in.readTypedList(credentialEntries, CredentialEntry.CREATOR); + mCredentialEntries = credentialEntries; + List<Action> authenticationEntries = new ArrayList<>(); + in.readTypedList(authenticationEntries, Action.CREATOR); + mAuthenticationEntries = authenticationEntries; + List<Action> actions = new ArrayList<>(); + in.readTypedList(actions, Action.CREATOR); + mActions = actions; + mRemoteCredentialEntry = in.readTypedObject(CredentialEntry.CREATOR); } public static final @NonNull Creator<BeginGetCredentialResponse> CREATOR = new Creator<BeginGetCredentialResponse>() { @Override - public BeginGetCredentialResponse createFromParcel(Parcel in) { + public BeginGetCredentialResponse createFromParcel(@NonNull Parcel in) { return new BeginGetCredentialResponse(in); } @@ -108,23 +86,175 @@ public final class BeginGetCredentialResponse implements Parcelable { @Override public void writeToParcel(@NonNull Parcel dest, int flags) { - dest.writeTypedObject(mCredentialsResponseContent, flags); - dest.writeTypedObject(mAuthenticationAction, flags); + dest.writeTypedList(mCredentialEntries, flags); + dest.writeTypedList(mAuthenticationEntries, flags); + dest.writeTypedList(mActions, flags); + dest.writeTypedObject(mRemoteCredentialEntry, flags); + } + + /** + * Returns the list of credential entries to be displayed on the UI. + */ + public @NonNull List<CredentialEntry> getCredentialEntries() { + return mCredentialEntries; + } + + /** + * Returns the list of authentication entries to be displayed on the UI. + */ + public @NonNull List<Action> getAuthenticationActions() { + return mAuthenticationEntries; + } + + /** + * Returns the list of actions to be displayed on the UI. + */ + public @NonNull List<Action> getActions() { + return mActions; } /** - * If this response represents a top level authentication action, returns the authentication - * action to be invoked before any other content can be shown to the user. + * Returns the remote credential entry to be displayed on the UI. */ - public @Nullable Action getAuthenticationAction() { - return mAuthenticationAction; + public @Nullable CredentialEntry getRemoteCredentialEntry() { + return mRemoteCredentialEntry; } /** - * Returns the actual content to be displayed on the selector, if this response does not - * require any top level authentication. + * Builds an instance of {@link BeginGetCredentialResponse}. */ - public @Nullable CredentialsResponseContent getCredentialsResponseContent() { - return mCredentialsResponseContent; + public static final class Builder { + private List<CredentialEntry> mCredentialEntries = new ArrayList<>(); + + private List<Action> mAuthenticationEntries = new ArrayList<>(); + private List<Action> mActions = new ArrayList<>(); + private CredentialEntry mRemoteCredentialEntry; + + /** + * Sets a remote credential entry to be shown on the UI. Provider must set this if they + * wish to get the credential from a different device. + * + * <p> When constructing the {@link CredentialEntry} object, the {@code pendingIntent} + * must be set such that it leads to an activity that can provide UI to fulfill the request + * on a remote device. When user selects this {@code remoteCredentialEntry}, the system will + * invoke the {@code pendingIntent} set on the {@link CredentialEntry}. + * + * <p> Once the remote credential flow is complete, the {@link android.app.Activity} + * result should be set to {@link android.app.Activity#RESULT_OK} and an extra with the + * {@link CredentialProviderService#EXTRA_GET_CREDENTIAL_RESPONSE} key should be populated + * with a {@link android.credentials.Credential} object. + */ + public @NonNull Builder setRemoteCredentialEntry(@Nullable CredentialEntry + remoteCredentialEntry) { + mRemoteCredentialEntry = remoteCredentialEntry; + return this; + } + + /** + * Adds a {@link CredentialEntry} to the list of entries to be displayed on + * the UI. + * + * @throws NullPointerException If the {@code credentialEntry} is null. + */ + public @NonNull Builder addCredentialEntry(@NonNull CredentialEntry credentialEntry) { + mCredentialEntries.add(Objects.requireNonNull(credentialEntry)); + return this; + } + + /** + * Add an authentication entry to be shown on the UI. Providers must set this entry if + * the corresponding account is locked and no underlying credentials can be returned. + * + * <p> When the user selects this {@code authenticationAction}, the system invokes the + * corresponding {@code pendingIntent}. + * Once the authentication action activity is launched, and the user is authenticated, + * providers should create another response with {@link BeginGetCredentialResponse} using + * this time adding the unlocked credentials in the form of {@link CredentialEntry}'s. + * + * <p>The new response object must be set on the authentication activity's + * result. The result code should be set to {@link android.app.Activity#RESULT_OK} and + * the {@link CredentialProviderService#EXTRA_BEGIN_GET_CREDENTIAL_RESPONSE} extra + * should be set with the new fully populated {@link BeginGetCredentialResponse} object. + * + * @throws NullPointerException If {@code authenticationAction} is null. + */ + public @NonNull Builder addAuthenticationAction(@NonNull Action authenticationAction) { + mAuthenticationEntries.add(Objects.requireNonNull(authenticationAction)); + return this; + } + + /** + * Adds an {@link Action} to the list of actions to be displayed on + * the UI. + * + * <p> An {@code action} must be used for independent user actions, + * such as opening the app, intenting directly into a certain app activity etc. The + * {@code pendingIntent} set with the {@code action} must invoke the corresponding + * activity. + * + * @throws NullPointerException If {@code action} is null. + */ + public @NonNull Builder addAction(@NonNull Action action) { + mActions.add(Objects.requireNonNull(action, "action must not be null")); + return this; + } + + /** + * Sets the list of actions to be displayed on the UI. + * + * @throws NullPointerException If {@code actions} is null, or any of its elements + * is null. + */ + public @NonNull Builder setActions(@NonNull List<Action> actions) { + mActions = Preconditions.checkCollectionElementsNotNull(actions, + "actions"); + return this; + } + + /** + * Sets the list of credential entries to be displayed on the + * account selector UI. + * + * @throws NullPointerException If {@code credentialEntries} is null, or any of its + * elements is null. + */ + public @NonNull Builder setCredentialEntries( + @NonNull List<CredentialEntry> credentialEntries) { + mCredentialEntries = Preconditions.checkCollectionElementsNotNull( + credentialEntries, + "credentialEntries"); + return this; + } + + /** + * Sets the list of authentication entries to be displayed on the + * account selector UI. + * + * @throws NullPointerException If {@code authenticationEntries} is null, or any of its + * elements is null. + */ + public @NonNull Builder setAuthenticationActions( + @NonNull List<Action> authenticationActions) { + mAuthenticationEntries = Preconditions.checkCollectionElementsNotNull( + authenticationActions, + "authenticationActions"); + return this; + } + + /** + * Builds a {@link BeginGetCredentialResponse} instance. + * + * @throws IllegalStateException if {@code credentialEntries}, {@code actions} + * and {@code remoteCredentialEntry} are all null or empty. + */ + public @NonNull BeginGetCredentialResponse build() { + if (mCredentialEntries.isEmpty() && mActions.isEmpty() + && mRemoteCredentialEntry == null && mAuthenticationEntries.isEmpty()) { + throw new IllegalStateException("must set either an authentication, " + + "credential, action or remote entry"); + } + return new BeginGetCredentialResponse(mCredentialEntries, mAuthenticationEntries, + mActions, mRemoteCredentialEntry); + } } } diff --git a/core/java/android/service/credentials/CredentialProviderService.java b/core/java/android/service/credentials/CredentialProviderService.java index f92fd3a4e328..dabf08e2a2fc 100644 --- a/core/java/android/service/credentials/CredentialProviderService.java +++ b/core/java/android/service/credentials/CredentialProviderService.java @@ -90,14 +90,15 @@ public abstract class CredentialProviderService extends Service { /** * Intent extra: The result of an authentication flow, to be set on finish of the * {@link android.app.Activity} invoked through the {@link android.app.PendingIntent} set on - * a {@link BeginGetCredentialResponse}. This result should contain the actual content, + * an authentication {@link Action}, as part of the original + * {@link BeginGetCredentialResponse}. This result should contain the actual content, * including credential entries and action entries, to be shown on the selector. * * <p> - * Type: {@link CredentialsResponseContent} + * Type: {@link BeginGetCredentialResponse} */ - public static final String EXTRA_CREDENTIALS_RESPONSE_CONTENT = - "android.service.credentials.extra.CREDENTIALS_RESPONSE_CONTENT"; + public static final String EXTRA_BEGIN_GET_CREDENTIAL_RESPONSE = + "android.service.credentials.extra.BEGIN_GET_CREDENTIAL_RESPONSE"; /** * Intent extra: The failure exception set at the final stage of a get flow. @@ -133,7 +134,7 @@ public abstract class CredentialProviderService extends Service { * <p>When a provider app receives a {@link BeginGetCredentialRequest} through the * {@link CredentialProviderService#onBeginGetCredential} call, it can construct the * {@link BeginGetCredentialResponse} with either an authentication {@link Action} (if the app - * is locked), or a {@link CredentialsResponseContent} (if the app is unlocked). In the former + * is locked), or a {@link BeginGetCredentialResponse} (if the app is unlocked). In the former * case, i.e. the app is locked, user will be shown the authentication action. When selected, * the underlying {@link PendingIntent} will be invoked which will lead the user to provider's * unlock activity. This pending intent will also contain the original @@ -141,7 +142,7 @@ public abstract class CredentialProviderService extends Service { * flow is complete. * * <p>After the app is unlocked, the {@link BeginGetCredentialResponse} must be constructed - * using a {@link CredentialsResponseContent}, which must be set on an {@link Intent} as an + * using a {@link BeginGetCredentialResponse}, which must be set on an {@link Intent} as an * intent extra against CredentialProviderService#EXTRA_CREDENTIALS_RESPONSE_CONTENT}. * This intent should then be set as a result through {@link android.app.Activity#setResult} * before finishing the activity. diff --git a/core/java/android/service/credentials/CredentialsResponseContent.java b/core/java/android/service/credentials/CredentialsResponseContent.java deleted file mode 100644 index ce6972df88e1..000000000000 --- a/core/java/android/service/credentials/CredentialsResponseContent.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (C) 2022 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.service.credentials; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.os.Parcel; -import android.os.Parcelable; - -import com.android.internal.util.Preconditions; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -/** - * The content to be displayed on the account selector UI, including credential entries, - * actions etc. Returned as part of {@link BeginGetCredentialResponse} - */ -public final class CredentialsResponseContent implements Parcelable { - /** List of credential entries to be displayed on the UI. */ - private final @NonNull List<CredentialEntry> mCredentialEntries; - - /** List of provider actions to be displayed on the UI. */ - private final @NonNull List<Action> mActions; - - /** Remote credential entry to get the response from a different device. */ - private final @Nullable CredentialEntry mRemoteCredentialEntry; - - private CredentialsResponseContent(@NonNull List<CredentialEntry> credentialEntries, - @NonNull List<Action> actions, - @Nullable CredentialEntry remoteCredentialEntry) { - mCredentialEntries = credentialEntries; - mActions = actions; - mRemoteCredentialEntry = remoteCredentialEntry; - } - - private CredentialsResponseContent(@NonNull Parcel in) { - List<CredentialEntry> credentialEntries = new ArrayList<>(); - in.readTypedList(credentialEntries, CredentialEntry.CREATOR); - mCredentialEntries = credentialEntries; - List<Action> actions = new ArrayList<>(); - in.readTypedList(actions, Action.CREATOR); - mActions = actions; - mRemoteCredentialEntry = in.readTypedObject(CredentialEntry.CREATOR); - } - - public static final @NonNull Creator<CredentialsResponseContent> CREATOR = - new Creator<CredentialsResponseContent>() { - @Override - public CredentialsResponseContent createFromParcel(@NonNull Parcel in) { - return new CredentialsResponseContent(in); - } - - @Override - public CredentialsResponseContent[] newArray(int size) { - return new CredentialsResponseContent[size]; - } - }; - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(@NonNull Parcel dest, int flags) { - dest.writeTypedList(mCredentialEntries, flags); - dest.writeTypedList(mActions, flags); - dest.writeTypedObject(mRemoteCredentialEntry, flags); - } - - /** - * Returns the list of credential entries to be displayed on the UI. - */ - public @NonNull List<CredentialEntry> getCredentialEntries() { - return mCredentialEntries; - } - - /** - * Returns the list of actions to be displayed on the UI. - */ - public @NonNull List<Action> getActions() { - return mActions; - } - - /** - * Returns the remote credential entry to be displayed on the UI. - */ - public @Nullable CredentialEntry getRemoteCredentialEntry() { - return mRemoteCredentialEntry; - } - - /** - * Builds an instance of {@link CredentialsResponseContent}. - */ - public static final class Builder { - private List<CredentialEntry> mCredentialEntries = new ArrayList<>(); - private List<Action> mActions = new ArrayList<>(); - private CredentialEntry mRemoteCredentialEntry; - - /** - * Sets a remote credential entry to be shown on the UI. Provider must set this if they - * wish to get the credential from a different device. - * - * <p> When constructing the {@link CredentialEntry} object, the {@code pendingIntent} - * must be set such that it leads to an activity that can provide UI to fulfill the request - * on a remote device. When user selects this {@code remoteCredentialEntry}, the system will - * invoke the {@code pendingIntent} set on the {@link CredentialEntry}. - * - * <p> Once the remote credential flow is complete, the {@link android.app.Activity} - * result should be set to {@link android.app.Activity#RESULT_OK} and an extra with the - * {@link CredentialProviderService#EXTRA_GET_CREDENTIAL_RESPONSE} key should be populated - * with a {@link android.credentials.Credential} object. - */ - public @NonNull Builder setRemoteCredentialEntry(@Nullable CredentialEntry - remoteCredentialEntry) { - mRemoteCredentialEntry = remoteCredentialEntry; - return this; - } - - /** - * Adds a {@link CredentialEntry} to the list of entries to be displayed on - * the UI. - * - * @throws NullPointerException If the {@code credentialEntry} is null. - */ - public @NonNull Builder addCredentialEntry(@NonNull CredentialEntry credentialEntry) { - mCredentialEntries.add(Objects.requireNonNull(credentialEntry)); - return this; - } - - /** - * Adds an {@link Action} to the list of actions to be displayed on - * the UI. - * - * <p> An {@code action} must be used for independent user actions, - * such as opening the app, intenting directly into a certain app activity etc. The - * {@code pendingIntent} set with the {@code action} must invoke the corresponding - * activity. - * - * @throws NullPointerException If {@code action} is null. - */ - public @NonNull Builder addAction(@NonNull Action action) { - mActions.add(Objects.requireNonNull(action, "action must not be null")); - return this; - } - - /** - * Sets the list of actions to be displayed on the UI. - * - * @throws NullPointerException If {@code actions} is null, or any of its elements - * is null. - */ - public @NonNull Builder setActions(@NonNull List<Action> actions) { - mActions = Preconditions.checkCollectionElementsNotNull(actions, - "actions"); - return this; - } - - /** - * Sets the list of credential entries to be displayed on the - * account selector UI. - * - * @throws NullPointerException If {@code credentialEntries} is null, or any of its - * elements is null. - */ - public @NonNull Builder setCredentialEntries( - @NonNull List<CredentialEntry> credentialEntries) { - mCredentialEntries = Preconditions.checkCollectionElementsNotNull( - credentialEntries, - "credentialEntries"); - return this; - } - - /** - * Builds a {@link CredentialsResponseContent} instance. - * - * @throws IllegalStateException if {@code credentialEntries}, {@code actions} - * and {@code remoteCredentialEntry} are all null or empty. - */ - public @NonNull CredentialsResponseContent build() { - if (mCredentialEntries != null && mCredentialEntries.isEmpty() - && mActions != null && mActions.isEmpty() && mRemoteCredentialEntry == null) { - throw new IllegalStateException("credentialEntries and actions must not both " - + "be empty"); - } - return new CredentialsResponseContent(mCredentialEntries, mActions, - mRemoteCredentialEntry); - } - } -} diff --git a/core/java/android/view/InsetsState.java b/core/java/android/view/InsetsState.java index 70a773994926..ba7d823750a3 100644 --- a/core/java/android/view/InsetsState.java +++ b/core/java/android/view/InsetsState.java @@ -781,19 +781,6 @@ public class InsetsState implements Parcelable { } } - public static boolean containsType(@InternalInsetsType int[] types, - @InternalInsetsType int type) { - if (types == null) { - return false; - } - for (int t : types) { - if (t == type) { - return true; - } - } - return false; - } - public void dump(String prefix, PrintWriter pw) { final String newPrefix = prefix + " "; pw.println(prefix + "InsetsState"); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index a5693f3b447b..20f6baf3780f 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -14119,7 +14119,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // working solution. View source = this; while (true) { - if (source.includeForAccessibility()) { + if (source.includeForAccessibility(false)) { source.sendAccessibilityEvent(eventType); return; } @@ -14473,11 +14473,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // importance, since we'll need to check it later to make sure. final boolean maySkipNotify = oldMode == IMPORTANT_FOR_ACCESSIBILITY_AUTO || mode == IMPORTANT_FOR_ACCESSIBILITY_AUTO; - final boolean oldIncludeForAccessibility = maySkipNotify && includeForAccessibility(); + final boolean oldIncludeForAccessibility = + maySkipNotify && includeForAccessibility(false); mPrivateFlags2 &= ~PFLAG2_IMPORTANT_FOR_ACCESSIBILITY_MASK; mPrivateFlags2 |= (mode << PFLAG2_IMPORTANT_FOR_ACCESSIBILITY_SHIFT) & PFLAG2_IMPORTANT_FOR_ACCESSIBILITY_MASK; - if (!maySkipNotify || oldIncludeForAccessibility != includeForAccessibility()) { + if (!maySkipNotify || oldIncludeForAccessibility != includeForAccessibility(false)) { notifySubtreeAccessibilityStateChangedIfNeeded(); } else { notifyViewAccessibilityStateChangedIfNeeded( @@ -14609,28 +14610,53 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** - * Whether to regard this view for accessibility. A view is regarded for - * accessibility if it is important for accessibility or the querying - * accessibility service has explicitly requested that view not - * important for accessibility are regarded. - * - * @return Whether to regard the view for accessibility. - * + * @see #includeForAccessibility(boolean) * @hide */ @UnsupportedAppUsage public boolean includeForAccessibility() { - if (mAttachInfo != null) { + return includeForAccessibility(true); + } + + /** + * Whether to regard this view for accessibility. + * + * <p> + * If this decision is used for generating the accessibility node tree then this returns false + * for {@link #isAccessibilityDataPrivate()} views queried by non-accessibility tools. + * </p> + * <p> + * Otherwise, a view is regarded for accessibility if: + * <li>the view returns true for {@link #isImportantForAccessibility()}, or</li> + * <li>the querying accessibility service has explicitly requested that views not important for + * accessibility are regarded by setting + * {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_INCLUDE_NOT_IMPORTANT_VIEWS}</li> + * </p> + * + * @param forNodeTree True if the result of this function will be used for generating a node + * tree, otherwise false (like when sending {@link AccessibilityEvent}s). + * @return Whether to regard the view for accessibility. + * @hide + */ + public boolean includeForAccessibility(boolean forNodeTree) { + if (mAttachInfo == null) { + return false; + } + + if (forNodeTree) { + // The AccessibilityDataPrivate property should not effect whether this View is + // included for consideration when sending AccessibilityEvents. Events copy their + // source View's AccessibilityDataPrivate value, and then filtering is done when + // AccessibilityManagerService propagates events to each recipient AccessibilityService. if (!AccessibilityManager.getInstance(mContext).isRequestFromAccessibilityTool() && isAccessibilityDataPrivate()) { return false; } - - return (mAttachInfo.mAccessibilityFetchFlags - & AccessibilityNodeInfo.FLAG_SERVICE_REQUESTS_INCLUDE_NOT_IMPORTANT_VIEWS) != 0 - || isImportantForAccessibility(); } - return false; + + return (mAttachInfo.mAccessibilityFetchFlags + & AccessibilityNodeInfo.FLAG_SERVICE_REQUESTS_INCLUDE_NOT_IMPORTANT_VIEWS) != 0 + || isImportantForAccessibility(); } /** @@ -17178,7 +17204,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, void setFlags(int flags, int mask) { final boolean accessibilityEnabled = AccessibilityManager.getInstance(mContext).isEnabled(); - final boolean oldIncludeForAccessibility = accessibilityEnabled && includeForAccessibility(); + final boolean oldIncludeForAccessibility = + accessibilityEnabled && includeForAccessibility(false); int old = mViewFlags; mViewFlags = (mViewFlags & ~mask) | (flags & mask); @@ -17404,7 +17431,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if ((changed & FOCUSABLE) != 0 || (changed & VISIBILITY_MASK) != 0 || (changed & CLICKABLE) != 0 || (changed & LONG_CLICKABLE) != 0 || (changed & CONTEXT_CLICKABLE) != 0) { - if (oldIncludeForAccessibility != includeForAccessibility()) { + if (oldIncludeForAccessibility != includeForAccessibility(false)) { notifySubtreeAccessibilityStateChangedIfNeeded(); } else { notifyViewAccessibilityStateChangedIfNeeded( diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 0e4ac0109f8e..73d447141cc1 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -3532,7 +3532,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager @Override public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) { boolean handled = false; - if (includeForAccessibility()) { + if (includeForAccessibility(false)) { handled = super.dispatchPopulateAccessibilityEventInternal(event); if (handled) { return handled; diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java index 3ce419eff33f..79695186ace7 100644 --- a/core/java/android/view/accessibility/AccessibilityManager.java +++ b/core/java/android/view/accessibility/AccessibilityManager.java @@ -186,6 +186,18 @@ public final class AccessibilityManager { */ public static final int ACCESSIBILITY_SHORTCUT_KEY = 1; + /** @hide */ + public static final int FLASH_REASON_CALL = 1; + + /** @hide */ + public static final int FLASH_REASON_ALARM = 2; + + /** @hide */ + public static final int FLASH_REASON_NOTIFICATION = 3; + + /** @hide */ + public static final int FLASH_REASON_PREVIEW = 4; + /** * Annotations for the shortcut type. * @hide @@ -210,6 +222,19 @@ public final class AccessibilityManager { public @interface ContentFlag {} /** + * Annotations for reason of Flash notification. + * @hide + */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(prefix = { "FLASH_REASON_" }, value = { + FLASH_REASON_CALL, + FLASH_REASON_ALARM, + FLASH_REASON_NOTIFICATION, + FLASH_REASON_PREVIEW + }) + public @interface FlashNotificationReason {} + + /** * Use this flag to indicate the content of a UI that times out contains icons. * * @see #getRecommendedTimeoutMillis(int, int) @@ -317,6 +342,13 @@ public final class AccessibilityManager { private SparseArray<List<AccessibilityRequestPreparer>> mRequestPreparerLists; /** + * Binder for flash notification. + * + * @see #startFlashNotificationSequence(Context, int) + */ + private final Binder mBinder = new Binder(); + + /** * Listener for the system accessibility state. To listen for changes to the * accessibility state on the device, implement this interface and register * it with the system by calling {@link #addAccessibilityStateChangeListener}. @@ -2096,6 +2128,95 @@ public final class AccessibilityManager { } } + /** + * Start sequence (infinite) type of flash notification. Use + * {@code Context.getOpPackageName()} as the identifier of this flash notification. + * The notification can be cancelled later by calling {@link #stopFlashNotificationSequence} + * with same {@code Context.getOpPackageName()}. + * If the binder associated with this {@link AccessibilityManager} instance dies then the + * sequence will stop automatically. It is strongly recommended to call + * {@link #stopFlashNotificationSequence} within a reasonable amount of time after calling + * this method. + * + * @param context The context in which this manager operates. + * @param reason The triggering reason of flash notification. + * @return {@code true} if flash notification works properly. + * @hide + */ + public boolean startFlashNotificationSequence(@NonNull Context context, + @FlashNotificationReason int reason) { + final IAccessibilityManager service; + synchronized (mLock) { + service = getServiceLocked(); + if (service == null) { + return false; + } + } + + try { + return service.startFlashNotificationSequence(context.getOpPackageName(), + reason, mBinder); + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error while start flash notification sequence", re); + return false; + } + } + + /** + * Stop sequence (infinite) type of flash notification. The flash notification with + * {@code Context.getOpPackageName()} as identifier will be stopped if exist. + * It is strongly recommended to call this method within a reasonable amount of time after + * calling {@link #startFlashNotificationSequence} method. + * + * @param context The context in which this manager operates. + * @return {@code true} if flash notification stops properly. + * @hide + */ + public boolean stopFlashNotificationSequence(@NonNull Context context) { + final IAccessibilityManager service; + synchronized (mLock) { + service = getServiceLocked(); + if (service == null) { + return false; + } + } + + try { + return service.stopFlashNotificationSequence(context.getOpPackageName()); + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error while stop flash notification sequence", re); + return false; + } + } + + /** + * Start event (finite) type of flash notification. + * + * @param context The context in which this manager operates. + * @param reason The triggering reason of flash notification. + * @param reasonPkg The package that trigger the flash notification. + * @return {@code true} if flash notification works properly. + * @hide + */ + public boolean startFlashNotificationEvent(@NonNull Context context, + @FlashNotificationReason int reason, @Nullable String reasonPkg) { + final IAccessibilityManager service; + synchronized (mLock) { + service = getServiceLocked(); + if (service == null) { + return false; + } + } + + try { + return service.startFlashNotificationEvent(context.getOpPackageName(), + reason, reasonPkg); + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error while start flash notification event", re); + return false; + } + } + private IAccessibilityManager getServiceLocked() { if (mService == null) { tryConnectToServiceLocked(null); diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java index 5629e0f15043..d88cdf1493e1 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java @@ -1817,13 +1817,12 @@ public class AccessibilityNodeInfo implements Parcelable { * </p> * * @see AccessibilityEvent#getContentChangeTypes for all content change types. - * @param minDurationBetweenContentChanges the minimum duration between content change events. + * @param duration the minimum duration between content change events. * Negative duration would be treated as zero. */ - public void setMinDurationBetweenContentChanges( - @NonNull Duration minDurationBetweenContentChanges) { + public void setMinDurationBetweenContentChanges(@NonNull Duration duration) { enforceNotSealed(); - mMinDurationBetweenContentChanges = minDurationBetweenContentChanges.toMillis(); + mMinDurationBetweenContentChanges = duration.toMillis(); } /** diff --git a/core/java/android/view/accessibility/IAccessibilityManager.aidl b/core/java/android/view/accessibility/IAccessibilityManager.aidl index c2d899a50d4e..098e97c49fcc 100644 --- a/core/java/android/view/accessibility/IAccessibilityManager.aidl +++ b/core/java/android/view/accessibility/IAccessibilityManager.aidl @@ -120,4 +120,8 @@ interface IAccessibilityManager { void injectInputEventToInputFilter(in InputEvent event); float getUiContrast(); + + boolean startFlashNotificationSequence(String opPkg, int reason, IBinder token); + boolean stopFlashNotificationSequence(String opPkg); + boolean startFlashNotificationEvent(String opPkg, int reason, String reasonPkg); } diff --git a/core/java/android/view/animation/AnimationUtils.java b/core/java/android/view/animation/AnimationUtils.java index 7d1dc7660871..c8c910d98bbb 100644 --- a/core/java/android/view/animation/AnimationUtils.java +++ b/core/java/android/view/animation/AnimationUtils.java @@ -28,6 +28,7 @@ import android.content.res.XmlResourceParser; import android.os.SystemClock; import android.util.AttributeSet; import android.util.Xml; +import android.view.InflateException; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -137,16 +138,9 @@ public class AnimationUtils { try { parser = context.getResources().getAnimation(id); return createAnimationFromXml(context, parser); - } catch (XmlPullParserException ex) { - NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + - Integer.toHexString(id)); - rnf.initCause(ex); - throw rnf; - } catch (IOException ex) { - NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + - Integer.toHexString(id)); - rnf.initCause(ex); - throw rnf; + } catch (XmlPullParserException | IOException | InflateException ex) { + throw new NotFoundException( + "Can't load animation resource ID #0x" + Integer.toHexString(id), ex); } finally { if (parser != null) parser.close(); } @@ -159,8 +153,9 @@ public class AnimationUtils { } @UnsupportedAppUsage - private static Animation createAnimationFromXml(Context c, XmlPullParser parser, - AnimationSet parent, AttributeSet attrs) throws XmlPullParserException, IOException { + private static Animation createAnimationFromXml( + Context c, XmlPullParser parser, AnimationSet parent, AttributeSet attrs) + throws XmlPullParserException, IOException, InflateException { Animation anim = null; @@ -168,8 +163,8 @@ public class AnimationUtils { int type; int depth = parser.getDepth(); - while (((type=parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) - && type != XmlPullParser.END_DOCUMENT) { + while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) + && type != XmlPullParser.END_DOCUMENT) { if (type != XmlPullParser.START_TAG) { continue; @@ -193,7 +188,7 @@ public class AnimationUtils { } else if (name.equals("extend")) { anim = new ExtendAnimation(c, attrs); } else { - throw new RuntimeException("Unknown animation name: " + parser.getName()); + throw new InflateException("Unknown animation name: " + parser.getName()); } if (parent != null) { @@ -220,29 +215,24 @@ public class AnimationUtils { try { parser = context.getResources().getAnimation(id); return createLayoutAnimationFromXml(context, parser); - } catch (XmlPullParserException ex) { - NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + - Integer.toHexString(id)); - rnf.initCause(ex); - throw rnf; - } catch (IOException ex) { - NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + - Integer.toHexString(id)); - rnf.initCause(ex); - throw rnf; + } catch (XmlPullParserException | IOException | InflateException ex) { + throw new NotFoundException( + "Can't load animation resource ID #0x" + Integer.toHexString(id), ex); } finally { if (parser != null) parser.close(); } } - private static LayoutAnimationController createLayoutAnimationFromXml(Context c, - XmlPullParser parser) throws XmlPullParserException, IOException { + private static LayoutAnimationController createLayoutAnimationFromXml( + Context c, XmlPullParser parser) + throws XmlPullParserException, IOException, InflateException { return createLayoutAnimationFromXml(c, parser, Xml.asAttributeSet(parser)); } - private static LayoutAnimationController createLayoutAnimationFromXml(Context c, - XmlPullParser parser, AttributeSet attrs) throws XmlPullParserException, IOException { + private static LayoutAnimationController createLayoutAnimationFromXml( + Context c, XmlPullParser parser, AttributeSet attrs) + throws XmlPullParserException, IOException, InflateException { LayoutAnimationController controller = null; @@ -263,7 +253,7 @@ public class AnimationUtils { } else if ("gridLayoutAnimation".equals(name)) { controller = new GridLayoutAnimationController(c, attrs); } else { - throw new RuntimeException("Unknown layout animation name: " + name); + throw new InflateException("Unknown layout animation name: " + name); } } @@ -342,16 +332,9 @@ public class AnimationUtils { try { parser = context.getResources().getAnimation(id); return createInterpolatorFromXml(context.getResources(), context.getTheme(), parser); - } catch (XmlPullParserException ex) { - NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + - Integer.toHexString(id)); - rnf.initCause(ex); - throw rnf; - } catch (IOException ex) { - NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + - Integer.toHexString(id)); - rnf.initCause(ex); - throw rnf; + } catch (XmlPullParserException | IOException | InflateException ex) { + throw new NotFoundException( + "Can't load animation resource ID #0x" + Integer.toHexString(id), ex); } finally { if (parser != null) parser.close(); } @@ -372,25 +355,20 @@ public class AnimationUtils { try { parser = res.getAnimation(id); return createInterpolatorFromXml(res, theme, parser); - } catch (XmlPullParserException ex) { - NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + - Integer.toHexString(id)); - rnf.initCause(ex); - throw rnf; - } catch (IOException ex) { - NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + - Integer.toHexString(id)); - rnf.initCause(ex); - throw rnf; + } catch (XmlPullParserException | IOException | InflateException ex) { + throw new NotFoundException( + "Can't load animation resource ID #0x" + Integer.toHexString(id), ex); } finally { - if (parser != null) + if (parser != null) { parser.close(); + } } } - private static Interpolator createInterpolatorFromXml(Resources res, Theme theme, XmlPullParser parser) - throws XmlPullParserException, IOException { + private static Interpolator createInterpolatorFromXml( + Resources res, Theme theme, XmlPullParser parser) + throws XmlPullParserException, IOException, InflateException { BaseInterpolator interpolator = null; @@ -430,7 +408,7 @@ public class AnimationUtils { } else if (name.equals("pathInterpolator")) { interpolator = new PathInterpolator(res, theme, attrs); } else { - throw new RuntimeException("Unknown interpolator name: " + parser.getName()); + throw new InflateException("Unknown interpolator name: " + parser.getName()); } } return interpolator; diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java index b5764c50ccc2..bdc7333f2751 100644 --- a/core/java/android/view/autofill/AutofillManager.java +++ b/core/java/android/view/autofill/AutofillManager.java @@ -19,6 +19,7 @@ package android.view.autofill; import static android.service.autofill.FillRequest.FLAG_IME_SHOWING; import static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST; import static android.service.autofill.FillRequest.FLAG_PASSWORD_INPUT_TYPE; +import static android.service.autofill.FillRequest.FLAG_PCC_DETECTION; import static android.service.autofill.FillRequest.FLAG_RESET_FILL_DIALOG_STATE; import static android.service.autofill.FillRequest.FLAG_SUPPORTS_FILL_DIALOG; import static android.service.autofill.FillRequest.FLAG_VIEW_NOT_FOCUSED; @@ -1312,6 +1313,22 @@ public final class AutofillManager { return; } + // Start session with PCC flag to get assist structure and send field classification request + // to PCC classification service. + if (AutofillFeatureFlags.isAutofillPccClassificationEnabled()) { + synchronized (mLock) { + final boolean clientAdded = tryAddServiceClientIfNeededLocked(); + if (clientAdded){ + startSessionLocked(/* id= */ AutofillId.NO_AUTOFILL_ID, + /* bounds= */ null, /* value= */ null, /* flags= */ FLAG_PCC_DETECTION); + } else { + if (sVerbose) { + Log.v(TAG, "not starting session: no service client"); + } + } + } + } + if (mIsFillDialogEnabled || ArrayUtils.containsAny(autofillHints, mFillDialogEnabledHints)) { if (sDebug) { diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index be58893fe246..77df1f1ab2d1 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -6505,7 +6505,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } boolean hasGesturePreviewHighlight() { - return mGesturePreviewHighlightStart > 0; + return mGesturePreviewHighlightStart >= 0; } /** @@ -10229,8 +10229,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // The point is not within lineMargin of a line. return -1; } - if (point.x < mLayout.getLineLeft(line) - lineMargin - || point.x > mLayout.getLineRight(line) + lineMargin) { + if (point.x < -lineMargin || point.x > mLayout.getWidth() + lineMargin) { // The point is not within lineMargin of a line. return -1; } diff --git a/core/java/android/window/ImeOnBackInvokedDispatcher.java b/core/java/android/window/ImeOnBackInvokedDispatcher.java index 34b75a4788c4..9ef68807419a 100644 --- a/core/java/android/window/ImeOnBackInvokedDispatcher.java +++ b/core/java/android/window/ImeOnBackInvokedDispatcher.java @@ -82,8 +82,13 @@ public class ImeOnBackInvokedDispatcher implements OnBackInvokedDispatcher, Parc @NonNull OnBackInvokedCallback callback) { final Bundle bundle = new Bundle(); // Always invoke back for ime without checking the window focus. + // We use strong reference in the binder wrapper to avoid accidentally GC the callback. + // This is necessary because the callback is sent to and registered from + // the app process, which may treat the IME callback as weakly referenced. This will not + // cause a memory leak because the app side already clears the reference correctly. final IOnBackInvokedCallback iCallback = - new WindowOnBackInvokedDispatcher.OnBackInvokedCallbackWrapper(callback); + new WindowOnBackInvokedDispatcher.OnBackInvokedCallbackWrapper( + callback, false /* useWeakRef */); bundle.putBinder(RESULT_KEY_CALLBACK, iCallback.asBinder()); bundle.putInt(RESULT_KEY_PRIORITY, priority); bundle.putInt(RESULT_KEY_ID, callback.hashCode()); diff --git a/core/java/android/window/WindowOnBackInvokedDispatcher.java b/core/java/android/window/WindowOnBackInvokedDispatcher.java index d34ece902778..a8c2b2f28df4 100644 --- a/core/java/android/window/WindowOnBackInvokedDispatcher.java +++ b/core/java/android/window/WindowOnBackInvokedDispatcher.java @@ -254,10 +254,34 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher { } static class OnBackInvokedCallbackWrapper extends IOnBackInvokedCallback.Stub { - private final WeakReference<OnBackInvokedCallback> mCallback; + static class CallbackRef { + final WeakReference<OnBackInvokedCallback> mWeakRef; + final OnBackInvokedCallback mStrongRef; + CallbackRef(@NonNull OnBackInvokedCallback callback, boolean useWeakRef) { + if (useWeakRef) { + mWeakRef = new WeakReference<>(callback); + mStrongRef = null; + } else { + mStrongRef = callback; + mWeakRef = null; + } + } + + OnBackInvokedCallback get() { + if (mStrongRef != null) { + return mStrongRef; + } + return mWeakRef.get(); + } + } + final CallbackRef mCallbackRef; OnBackInvokedCallbackWrapper(@NonNull OnBackInvokedCallback callback) { - mCallback = new WeakReference<>(callback); + mCallbackRef = new CallbackRef(callback, true /* useWeakRef */); + } + + OnBackInvokedCallbackWrapper(@NonNull OnBackInvokedCallback callback, boolean useWeakRef) { + mCallbackRef = new CallbackRef(callback, useWeakRef); } @Override @@ -300,8 +324,9 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher { public void onBackInvoked() throws RemoteException { Handler.getMain().post(() -> { mProgressAnimator.reset(); - final OnBackInvokedCallback callback = mCallback.get(); + final OnBackInvokedCallback callback = mCallbackRef.get(); if (callback == null) { + Log.d(TAG, "Trying to call onBackInvoked() on a null callback reference."); return; } callback.onBackInvoked(); @@ -310,7 +335,7 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher { @Nullable private OnBackAnimationCallback getBackAnimationCallback() { - OnBackInvokedCallback callback = mCallback.get(); + OnBackInvokedCallback callback = mCallbackRef.get(); return callback instanceof OnBackAnimationCallback ? (OnBackAnimationCallback) callback : null; } diff --git a/core/java/com/android/internal/app/ChooserListAdapter.java b/core/java/com/android/internal/app/ChooserListAdapter.java index 681bc7a0a03f..1eecb413adcb 100644 --- a/core/java/com/android/internal/app/ChooserListAdapter.java +++ b/core/java/com/android/internal/app/ChooserListAdapter.java @@ -202,12 +202,12 @@ public class ChooserListAdapter extends ResolverListAdapter { ri.nonLocalizedLabel = li.getNonLocalizedLabel(); ri.icon = li.getIconResource(); ri.iconResourceId = ri.icon; - ri.userHandle = mInitialIntentsUserSpace; } if (userManager.isManagedProfile()) { ri.noResourceId = true; ri.icon = 0; } + ri.userHandle = mInitialIntentsUserSpace; mCallerTargets.add(new DisplayResolveInfo(ii, ri, ii, makePresentationGetter(ri))); if (mCallerTargets.size() == MAX_SUGGESTED_APP_TARGETS) break; } diff --git a/core/java/com/android/internal/app/ResolverListAdapter.java b/core/java/com/android/internal/app/ResolverListAdapter.java index 0ea60a7ddbfe..18c8eb4ec46b 100644 --- a/core/java/com/android/internal/app/ResolverListAdapter.java +++ b/core/java/com/android/internal/app/ResolverListAdapter.java @@ -447,13 +447,13 @@ public class ResolverListAdapter extends BaseAdapter { ri.nonLocalizedLabel = li.getNonLocalizedLabel(); ri.icon = li.getIconResource(); ri.iconResourceId = ri.icon; - ri.userHandle = mInitialIntentsUserSpace; } if (userManager.isManagedProfile()) { ri.noResourceId = true; ri.icon = 0; } + ri.userHandle = mInitialIntentsUserSpace; addResolveInfo(new DisplayResolveInfo(ii, ri, ri.loadLabel(mPm), null, ii, makePresentationGetter(ri))); } diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index 1c85ca2bb269..b529a1016464 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -214,11 +214,11 @@ oneway interface IStatusBar * bar and navigation bar which are temporarily visible to the user. * * @param displayId the ID of the display to notify. - * @param types the internal insets types of the bars are about to show transiently. + * @param types the insets types of the bars are about to show transiently. * @param isGestureOnSystemBar whether the gesture to show the transient bar was a gesture on * one of the bars itself. */ - void showTransient(int displayId, in int[] types, boolean isGestureOnSystemBar); + void showTransient(int displayId, int types, boolean isGestureOnSystemBar); /** * Notifies System UI to abort the transient state of system bars, which prevents the bars being @@ -226,9 +226,9 @@ oneway interface IStatusBar * bars again. * * @param displayId the ID of the display to notify. - * @param types the internal insets types of the bars are about to abort the transient state. + * @param types the insets types of the bars are about to abort the transient state. */ - void abortTransient(int displayId, in int[] types); + void abortTransient(int displayId, int types); /** * Show a warning that the device is about to go to sleep due to user inactivity. diff --git a/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java b/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java index 54221ce92dc4..4f827cda6afa 100644 --- a/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java +++ b/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java @@ -16,7 +16,6 @@ package com.android.internal.statusbar; -import android.annotation.NonNull; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; @@ -41,15 +40,14 @@ public final class RegisterStatusBarResult implements Parcelable { public final int mBehavior; public final int mRequestedVisibleTypes; public final String mPackageName; - public final int[] mTransientBarTypes; + public final int mTransientBarTypes; public final LetterboxDetails[] mLetterboxDetails; public RegisterStatusBarResult(ArrayMap<String, StatusBarIcon> icons, int disabledFlags1, int appearance, AppearanceRegion[] appearanceRegions, int imeWindowVis, int imeBackDisposition, boolean showImeSwitcher, int disabledFlags2, IBinder imeToken, boolean navbarColorManagedByIme, int behavior, int requestedVisibleTypes, - String packageName, @NonNull int[] transientBarTypes, - LetterboxDetails[] letterboxDetails) { + String packageName, int transientBarTypes, LetterboxDetails[] letterboxDetails) { mIcons = new ArrayMap<>(icons); mDisabledFlags1 = disabledFlags1; mAppearance = appearance; @@ -87,7 +85,7 @@ public final class RegisterStatusBarResult implements Parcelable { dest.writeInt(mBehavior); dest.writeInt(mRequestedVisibleTypes); dest.writeString(mPackageName); - dest.writeIntArray(mTransientBarTypes); + dest.writeInt(mTransientBarTypes); dest.writeParcelableArray(mLetterboxDetails, flags); } @@ -113,7 +111,7 @@ public final class RegisterStatusBarResult implements Parcelable { final int behavior = source.readInt(); final int requestedVisibleTypes = source.readInt(); final String packageName = source.readString(); - final int[] transientBarTypes = source.createIntArray(); + final int transientBarTypes = source.readInt(); final LetterboxDetails[] letterboxDetails = source.readParcelableArray(null, LetterboxDetails.class); return new RegisterStatusBarResult(icons, disabledFlags1, appearance, diff --git a/core/java/com/android/internal/widget/LockPatternChecker.java b/core/java/com/android/internal/widget/LockPatternChecker.java index e56c381ead33..5c3759f96764 100644 --- a/core/java/com/android/internal/widget/LockPatternChecker.java +++ b/core/java/com/android/internal/widget/LockPatternChecker.java @@ -1,10 +1,7 @@ package com.android.internal.widget; -import static android.provider.DeviceConfig.NAMESPACE_AUTO_PIN_CONFIRMATION; - import android.annotation.NonNull; import android.os.AsyncTask; -import android.provider.DeviceConfig; import com.android.internal.widget.LockPatternUtils.RequestThrottledException; @@ -120,8 +117,7 @@ public final class LockPatternChecker { @Override protected void onPostExecute(Boolean result) { callback.onChecked(result, mThrottleTimeout); - if (DeviceConfig.getBoolean(NAMESPACE_AUTO_PIN_CONFIRMATION, - "enable_auto_pin_confirmation", false)) { + if (LockPatternUtils.isAutoPinConfirmFeatureAvailable()) { utils.setPinLength(userId, credentialCopy.size()); } credentialCopy.zeroize(); diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index 2f514795f342..4d820acd77b2 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -681,7 +681,7 @@ public class LockPatternUtils { * @return true, if deviceConfig flag is set to true or the flag is not propagated and * defaultValue is true. */ - public boolean isAutoPinConfirmFeatureAvailable() { + public static boolean isAutoPinConfirmFeatureAvailable() { return DeviceConfig.getBoolean( DeviceConfig.NAMESPACE_AUTO_PIN_CONFIRMATION, FLAG_ENABLE_AUTO_PIN_CONFIRMATION, diff --git a/core/proto/android/service/usb.proto b/core/proto/android/service/usb.proto index c98e346d50ec..88893205c79e 100644 --- a/core/proto/android/service/usb.proto +++ b/core/proto/android/service/usb.proto @@ -45,7 +45,7 @@ message UsbDeviceManagerProto { message UsbHandlerProto { option (android.msg_privacy).dest = DEST_AUTOMATIC; - /* Same as android.hardware.usb.gadget.V1_0.GadgetFunction.* */ + /* Same as android.hardware.usb.gadget.GadgetFunction.* */ enum Function { FUNCTION_ADB = 1; FUNCTION_ACCESSORY = 2; @@ -54,6 +54,7 @@ message UsbHandlerProto { FUNCTION_PTP = 16; FUNCTION_RNDIS = 32; FUNCTION_AUDIO_SOURCE = 64; + FUNCTION_UVC = 128; } repeated Function current_functions = 1; diff --git a/core/res/res/drawable-nodpi/stat_sys_adb.xml b/core/res/res/drawable-nodpi/stat_sys_adb.xml index cb4462c9a169..53a6836b4367 100644 --- a/core/res/res/drawable-nodpi/stat_sys_adb.xml +++ b/core/res/res/drawable-nodpi/stat_sys_adb.xml @@ -1,5 +1,5 @@ <!-- -Copyright (C) 2022 The Android Open Source Project +Copyright (C) 2023 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. @@ -13,78 +13,42 @@ Copyright (C) 2022 The Android Open Source Project See the License for the specific language governing permissions and limitations under the License. --> -<vector android:width="24dp" android:height="24dp" - android:viewportWidth="24" android:viewportHeight="24" - xmlns:android="http://schemas.android.com/apk/res/android"> - <path android:pathData=" - M22.45 11.94 - l-.58-.21 - a1.19 1.19 0 0 1-.26-2.12 - l.51-.34 - a1.2 1.2 0 0 0-.83-2.19 - l-.61.08 - a1.2 1.2 0 0 1-1.21-1.76 - l.29-.54 - A1.2 1.2 0 0 0 18 3.31 - l-.5.36 - a1.21 1.21 0 0 1-1.9-1 - v-.61 - a1.2 1.2 0 0 0-2.27-.56 - l-.26.5 - a1.2 1.2 0 0 1-2.14 0 - l-.28-.54 - a1.2 1.2 0 0 0-2.27.56 - v.61 - a1.21 1.21 0 0 1-1.9 1 - L6 3.31 - a1.2 1.2 0 0 0-1.76 1.55 - l.29.54 - a1.2 1.2 0 0 1-1.21 1.76 - l-.61-.08 - a1.2 1.2 0 0 0-.83 2.19 - l.51.34 - a1.19 1.19 0 0 1-.26 2.12 - l-.58.21 - a1.21 1.21 0 0 0 .29 2.33 - l.61.06 - a1.2 1.2 0 0 1 .76 2 - l-.42.46 - a1.2 1.2 0 0 0 1.33 1.92 - l.57-.22 - a1.21 1.21 0 0 1 1.61 1.42 - l-.16.59 - a1.2 1.2 0 0 0 2.07 1.09 - l.4-.47 - a1.2 1.2 0 0 1 2.08.51 - l.14.6 - a1.2 1.2 0 0 0 2.34 0 - l.14-.6 - a1.2 1.2 0 0 1 2.08-.51 - l.4.47 - a1.2 1.2 0 0 0 2.07-1.09 - l-.16-.59 - a1.21 1.21 0 0 1 1.61-1.42 - l.57.22 - a1.2 1.2 0 0 0 1.33-1.92 - l-.42-.46 - a1.2 1.2 0 0 1 .76-2 - l.61-.06 - a1.21 1.21 0 0 0 .29-2.33 - z - M12 19 - a7 7 0 1 1 7-7 7 7 0 0 1-7 7 - z - " - android:fillColor="#000000" /> - <path android:pathData=" - M9 7.75 - a.75.75 0 1 0 0 1.5.75.75 0 1 0 0-1.5 - z - M15 7.75 - a.75.75 0 1 0 0 1.5.75.75 0 1 0 0-1.5 - z - " - android:fillColor="#000000" /> - <path android:strokeColor="#000000" android:strokeMiterLimit="10" android:strokeWidth="2" - android:pathData="M4 12h16M12 12v8" /> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:name="ring" + android:pathData="M 12 21 C 16.971 21 21 16.971 21 12 C 21 7.029 16.971 3 12 3 C 7.029 3 3 7.029 3 12 C 3 16.971 7.029 21 12 21 Z" + android:fillColor="#00000000" + android:strokeColor="#ffffff" + android:strokeWidth="2"/> + <group android:name="group"> + <clip-path + android:pathData="M 20.5 12 C 20.5 16.694 16.694 20.5 12 20.5 C 7.306 20.5 3.5 16.694 3.5 12 C 3.5 7.306 7.306 3.5 12 3.5 C 16.694 3.5 20.5 7.306 20.5 12 Z"/> + <path + android:pathData="M 14.812 9.023 C 13.014 9.707 11.027 9.707 9.229 9.023 L 8.265 10.693 C 8.06 11.048 7.605 11.17 7.25 10.964 C 6.895 10.759 6.773 10.305 6.978 9.949 L 7.899 8.355 C 5.988 7.137 4.702 5.084 4.502 2.695 L 4.456 2.153 L 19.584 2.153 L 19.539 2.695 C 19.339 5.084 18.052 7.137 16.142 8.355 L 17.067 9.958 C 17.259 10.307 17.142 10.746 16.801 10.952 C 16.45 11.165 15.993 11.052 15.781 10.701 L 15.775 10.693 L 14.812 9.023 Z" + android:fillColor="#ffffff"/> + <group android:name="stars"> + <path android:pathData=" + M 7,14 h1v1h-1z + M 13,15 h1v1h-1z + M 14,11 h1v1h-1z + + M 11,17 h0.5v0.5h-0.5z + M 10,15 h0.5v0.5h-0.5z + M 13,18 h0.5v0.5h-0.5z + M 17,15 h0.5v0.5h-0.5z + M 15,14 h0.5v0.5h-0.5z + M 18,12 h0.5v0.5h-0.5z + M 5,13 h0.5v0.5h-0.5z + M 5,10 h0.5v0.5h-0.5z + M 9,11 h0.5v0.5h-0.5z + M 8,17 h0.5v0.5h-0.5z + M 12,12 h0.5v0.5h-0.5z + " android:fillColor="#ffffff"/> + </group> + </group> </vector> diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml index c3366cf0e306..4468ebe90ba0 100644 --- a/core/res/res/values/arrays.xml +++ b/core/res/res/values/arrays.xml @@ -210,8 +210,7 @@ <!-- Device state identifiers and strings for system notifications. The string arrays must have the same length and order as the identifier array. --> <integer-array name="device_state_notification_state_identifiers"> - <!-- TODO(b/267231269) change to concurrent display identifier when ready --> - <item>-1</item> + <item>@integer/config_deviceStateConcurrentRearDisplay</item> </integer-array> <string-array name="device_state_notification_names"> <item>@string/concurrent_display_notification_name</item> diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml index e242e208ec8c..0befa8b35fc5 100644 --- a/core/res/res/values/colors.xml +++ b/core/res/res/values/colors.xml @@ -523,15 +523,15 @@ <color name="system_error_container_dark">#930001</color> <color name="system_on_error_container_dark">#FFDAD5</color> <color name="system_primary_fixed_dark">#D8E2FF</color> - <color name="system_primary_fixeder_dark">#ADC6FF</color> + <color name="system_primary_fixed_darker_dark">#ADC6FF</color> <color name="system_on_primary_fixed_dark">#001A41</color> <color name="system_on_primary_fixed_variant_dark">#2B4678</color> <color name="system_secondary_fixed_dark">#DBE2F9</color> - <color name="system_secondary_fixeder_dark">#BFC6DC</color> + <color name="system_secondary_fixed_darker_dark">#BFC6DC</color> <color name="system_on_secondary_fixed_dark">#141B2C</color> <color name="system_on_secondary_fixed_variant_dark">#3F4759</color> <color name="system_tertiary_fixed_dark">#FBD7FC</color> - <color name="system_tertiary_fixeder_dark">#DEBCDF</color> + <color name="system_tertiary_fixed_darker_dark">#DEBCDF</color> <color name="system_on_tertiary_fixed_dark">#29132D</color> <color name="system_on_tertiary_fixed_variant_dark">#583E5B</color> <color name="system_control_activated_dark">#2B4678</color> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 82de7b8ec77e..4030082d65c8 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1316,7 +1316,7 @@ <!-- Default value for led color when battery is medium charged --> <integer name="config_notificationsBatteryMediumARGB">0xFFFFFF00</integer> - <!-- Default value for led color when battery is fully charged --> + <!-- Default value for led color when battery is fully or nearly fully charged --> <integer name="config_notificationsBatteryFullARGB">0xFF00FF00</integer> <!-- Default value for LED on time when the battery is low on charge in miliseconds --> @@ -1331,6 +1331,9 @@ <!-- Default value for LED off time when the battery is low on charge in miliseconds --> <integer name="config_notificationsBatteryLedOff">2875</integer> + <!-- Battery level percent that is treated as nearly full. --> + <integer name="config_notificationsBatteryNearlyFullLevel">90</integer> + <!-- If true, only colorized CallStyle notifications will apply custom colors --> <bool name="config_callNotificationActionColorsRequireColorized">true</bool> diff --git a/core/res/res/values/public-staging.xml b/core/res/res/values/public-staging.xml index 0ec3ef729bc9..7d41f76ed644 100644 --- a/core/res/res/values/public-staging.xml +++ b/core/res/res/values/public-staging.xml @@ -242,15 +242,15 @@ <public name="system_error_container_dark"/> <public name="system_on_error_container_dark"/> <public name="system_primary_fixed_dark"/> - <public name="system_primary_fixeder_dark"/> + <public name="system_primary_fixed_darker_dark"/> <public name="system_on_primary_fixed_dark"/> <public name="system_on_primary_fixed_variant_dark"/> <public name="system_secondary_fixed_dark"/> - <public name="system_secondary_fixeder_dark"/> + <public name="system_secondary_fixed_darker_dark"/> <public name="system_on_secondary_fixed_dark"/> <public name="system_on_secondary_fixed_variant_dark"/> <public name="system_tertiary_fixed_dark"/> - <public name="system_tertiary_fixeder_dark"/> + <public name="system_tertiary_fixed_darker_dark"/> <public name="system_on_tertiary_fixed_dark"/> <public name="system_on_tertiary_fixed_variant_dark"/> <public name="system_control_activated_dark"/> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index da44c2efe14e..55c39d085e12 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -3699,6 +3699,8 @@ <string name="usb_tether_notification_title">USB tethering turned on</string> <!-- USB_PREFERENCES: Notification for when the user connects the phone to a computer via USB in MIDI mode. This is the title --> <string name="usb_midi_notification_title">MIDI via USB turned on</string> + <!-- USB_PREFERENCES: Notification for when the user connects the phone to a computer via USB in UVC mode. This is the title --> + <string name="usb_uvc_notification_title">Device connected as Webcam</string> <!-- USB_PREFERENCES: Notification for when a USB accessory is attached. This is the title --> <string name="usb_accessory_notification_title">USB accessory connected</string> <!-- See USB_PREFERENCES. This is the message. --> @@ -4713,7 +4715,7 @@ <!-- Title of Color Inversion feature shown in the warning dialog about the accessibility shortcut. --> - <string name="color_inversion_feature_name">Color Inversion</string> + <string name="color_inversion_feature_name">Color inversion</string> <!-- Title of Color Correction feature, which is mostly used to help users who are colorblind, shown in the warning dialog about the accessibility shortcut. --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index aeb46cc18815..1fc7baf9522c 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2001,6 +2001,7 @@ <java-symbol type="integer" name="config_notificationsBatteryLedOn" /> <java-symbol type="integer" name="config_notificationsBatteryLowARGB" /> <java-symbol type="integer" name="config_notificationsBatteryMediumARGB" /> + <java-symbol type="integer" name="config_notificationsBatteryNearlyFullLevel" /> <java-symbol type="integer" name="config_notificationServiceArchiveSize" /> <java-symbol type="integer" name="config_previousVibrationsDumpLimit" /> <java-symbol type="integer" name="config_defaultVibrationAmplitude" /> @@ -2143,6 +2144,7 @@ <java-symbol type="string" name="usb_power_notification_message" /> <java-symbol type="string" name="usb_ptp_notification_title" /> <java-symbol type="string" name="usb_midi_notification_title" /> + <java-symbol type="string" name="usb_uvc_notification_title" /> <java-symbol type="string" name="usb_tether_notification_title" /> <java-symbol type="string" name="usb_supplying_notification_title" /> <java-symbol type="string" name="usb_unsupported_audio_accessory_title" /> diff --git a/core/tests/coretests/src/android/app/admin/PackagePolicyTest.java b/core/tests/coretests/src/android/app/admin/PackagePolicyTest.java new file mode 100644 index 000000000000..d8298fdb284d --- /dev/null +++ b/core/tests/coretests/src/android/app/admin/PackagePolicyTest.java @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2023 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.app.admin; + +import static android.app.admin.PackagePolicy.PACKAGE_POLICY_ALLOWLIST; +import static android.app.admin.PackagePolicy.PACKAGE_POLICY_ALLOWLIST_AND_SYSTEM; +import static android.app.admin.PackagePolicy.PACKAGE_POLICY_BLOCKLIST; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import android.os.Parcel; +import android.platform.test.annotations.Presubmit; +import android.util.ArraySet; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.Collections; +import java.util.Set; + +@RunWith(AndroidJUnit4.class) +@SmallTest +@Presubmit +public class PackagePolicyTest { + + private static final String TEST_PACKAGE_NAME = "com.example"; + + private static final String TEST_PACKAGE_NAME_2 = "com.example.2"; + + private static final String TEST_SYSTEM_PACKAGE_NAME = "com.system"; + + + @Test + public void testParceling() { + final int policyType = PACKAGE_POLICY_BLOCKLIST; + final Set<String> packageNames = new ArraySet<>(); + packageNames.add(TEST_PACKAGE_NAME); + + final Parcel parcel = Parcel.obtain(); + PackagePolicy packagePolicy = new PackagePolicy(policyType, packageNames); + try { + packagePolicy.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + packagePolicy = PackagePolicy.CREATOR.createFromParcel(parcel); + } finally { + parcel.recycle(); + } + + assertEquals(policyType, packagePolicy.getPolicyType()); + assertNotNull(packagePolicy.getPackageNames()); + assertEquals(1, packagePolicy.getPackageNames().size()); + assertTrue(packagePolicy.getPackageNames().contains(TEST_PACKAGE_NAME)); + } + + @Test + public void testEmptyBlocklistCreation() { + PackagePolicy policy = new PackagePolicy(PACKAGE_POLICY_BLOCKLIST); + assertEquals(PACKAGE_POLICY_BLOCKLIST, policy.getPolicyType()); + assertNotNull(policy.getPackageNames()); + assertTrue(policy.getPackageNames().isEmpty()); + } + + @Test + public void testEmptyAllowlistCreation() { + PackagePolicy policy = new PackagePolicy(PACKAGE_POLICY_ALLOWLIST); + assertEquals(PACKAGE_POLICY_ALLOWLIST, policy.getPolicyType()); + assertNotNull(policy.getPackageNames()); + assertTrue(policy.getPackageNames().isEmpty()); + } + + @Test + public void testEmptyAllowlistAndSystemCreation() { + PackagePolicy policy = new PackagePolicy(PACKAGE_POLICY_ALLOWLIST_AND_SYSTEM); + assertEquals(PACKAGE_POLICY_ALLOWLIST_AND_SYSTEM, policy.getPolicyType()); + assertNotNull(policy.getPackageNames()); + assertTrue(policy.getPackageNames().isEmpty()); + } + + @Test + public void testSuppliedBlocklistCreation() { + final Set<String> packageNames = new ArraySet<>(); + packageNames.add(TEST_PACKAGE_NAME); + PackagePolicy policy = new PackagePolicy(PACKAGE_POLICY_BLOCKLIST, packageNames); + assertEquals(PACKAGE_POLICY_BLOCKLIST, policy.getPolicyType()); + assertNotNull(policy.getPackageNames()); + assertEquals(1, policy.getPackageNames().size()); + assertTrue(policy.getPackageNames().contains(TEST_PACKAGE_NAME)); + } + + @Test + public void testSuppliedAllowlistCreation() { + final Set<String> packageNames = new ArraySet<>(); + packageNames.add(TEST_PACKAGE_NAME); + PackagePolicy policy = new PackagePolicy(PACKAGE_POLICY_ALLOWLIST, packageNames); + assertEquals(PACKAGE_POLICY_ALLOWLIST, policy.getPolicyType()); + assertNotNull(policy.getPackageNames()); + assertEquals(1, policy.getPackageNames().size()); + assertTrue(policy.getPackageNames().contains(TEST_PACKAGE_NAME)); + } + + @Test + public void testSuppliedAllowlistAndSystemCreation() { + final Set<String> packageNames = new ArraySet<>(); + packageNames.add(TEST_PACKAGE_NAME); + PackagePolicy policy = new PackagePolicy(PACKAGE_POLICY_ALLOWLIST_AND_SYSTEM, packageNames); + assertEquals(PACKAGE_POLICY_ALLOWLIST_AND_SYSTEM, policy.getPolicyType()); + assertNotNull(policy.getPackageNames()); + assertEquals(1, policy.getPackageNames().size()); + assertTrue(policy.getPackageNames().contains(TEST_PACKAGE_NAME)); + } + + @Test + public void testBlocklist_isPackageAllowed() { + final Set<String> packageNames = new ArraySet<>(); + packageNames.add(TEST_PACKAGE_NAME); + final Set<String> systemPackages = new ArraySet<>(); + systemPackages.add(TEST_SYSTEM_PACKAGE_NAME); + + PackagePolicy policy = new PackagePolicy(PACKAGE_POLICY_BLOCKLIST, packageNames); + + assertFalse(policy.isPackageAllowed(TEST_PACKAGE_NAME, Collections.emptySet())); + assertFalse(policy.isPackageAllowed(TEST_PACKAGE_NAME, systemPackages)); + assertTrue(policy.isPackageAllowed(TEST_PACKAGE_NAME_2, Collections.emptySet())); + assertTrue(policy.isPackageAllowed(TEST_PACKAGE_NAME_2, systemPackages)); + assertTrue(policy.isPackageAllowed(TEST_SYSTEM_PACKAGE_NAME, Collections.emptySet())); + assertTrue(policy.isPackageAllowed(TEST_SYSTEM_PACKAGE_NAME, systemPackages)); + } + + @Test + public void testAllowlist_isPackageAllowed() { + final Set<String> packageNames = new ArraySet<>(); + packageNames.add(TEST_PACKAGE_NAME); + final Set<String> systemPackages = new ArraySet<>(); + systemPackages.add(TEST_SYSTEM_PACKAGE_NAME); + PackagePolicy policy = new PackagePolicy(PACKAGE_POLICY_ALLOWLIST, packageNames); + + assertTrue(policy.isPackageAllowed(TEST_PACKAGE_NAME, Collections.emptySet())); + assertTrue(policy.isPackageAllowed(TEST_PACKAGE_NAME, systemPackages)); + assertFalse(policy.isPackageAllowed(TEST_PACKAGE_NAME_2, Collections.emptySet())); + assertFalse(policy.isPackageAllowed(TEST_PACKAGE_NAME_2, systemPackages)); + assertFalse(policy.isPackageAllowed(TEST_SYSTEM_PACKAGE_NAME, Collections.emptySet())); + assertFalse(policy.isPackageAllowed(TEST_SYSTEM_PACKAGE_NAME, systemPackages)); + } + + @Test + public void testAllowlistAndSystem_isPackageAllowed() { + final Set<String> packageNames = new ArraySet<>(); + packageNames.add(TEST_PACKAGE_NAME); + final Set<String> systemPackages = new ArraySet<>(); + systemPackages.add(TEST_SYSTEM_PACKAGE_NAME); + PackagePolicy policy = new PackagePolicy(PACKAGE_POLICY_ALLOWLIST_AND_SYSTEM, packageNames); + + assertTrue(policy.isPackageAllowed(TEST_PACKAGE_NAME, Collections.emptySet())); + assertTrue(policy.isPackageAllowed(TEST_PACKAGE_NAME, systemPackages)); + assertFalse(policy.isPackageAllowed(TEST_PACKAGE_NAME_2, Collections.emptySet())); + assertFalse(policy.isPackageAllowed(TEST_PACKAGE_NAME_2, systemPackages)); + assertFalse(policy.isPackageAllowed(TEST_SYSTEM_PACKAGE_NAME, Collections.emptySet())); + assertTrue(policy.isPackageAllowed(TEST_SYSTEM_PACKAGE_NAME, systemPackages)); + } + +} diff --git a/core/tests/coretests/src/android/view/SurfaceControlViewHostInsetsTest.java b/core/tests/coretests/src/android/view/SurfaceControlViewHostInsetsTest.java index 4a00b00fbafe..a65830fe1d77 100644 --- a/core/tests/coretests/src/android/view/SurfaceControlViewHostInsetsTest.java +++ b/core/tests/coretests/src/android/view/SurfaceControlViewHostInsetsTest.java @@ -69,7 +69,6 @@ public class SurfaceControlViewHostInsetsTest { private InsetsState statusBarState(boolean visible) { final InsetsState insetsState = new InsetsState(); - final int id = InsetsSource.createId(null /* owner */, 0 /* index */, statusBars()); insetsState.setDisplayFrame(new Rect(0, 0, 1000, 1000)); insetsState.getOrCreateSource( InsetsSource.createId(null /* owner */, 0 /* index */, statusBars()), statusBars()) diff --git a/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java b/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java index 048c48bc45fa..f79ba28d946f 100644 --- a/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java +++ b/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java @@ -67,7 +67,7 @@ public class RegisterStatusBarResultTest { BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, WindowInsets.Type.defaultVisible(), "test" /* packageName */, - new int[0] /* transientBarTypes */, + 0 /* transientBarTypes */, new LetterboxDetails[] {letterboxDetails}); final RegisterStatusBarResult copy = clone(original); diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java index 8cd8ddf68832..a7acaf924c15 100644 --- a/graphics/java/android/graphics/BaseCanvas.java +++ b/graphics/java/android/graphics/BaseCanvas.java @@ -675,10 +675,11 @@ public abstract class BaseCanvas { * * @param mesh {@link Mesh} object that will be drawn to the screen * @param blendMode {@link BlendMode} used to blend mesh primitives as the destination color - * with the Paint color/shader as the source color. + * with the Paint color/shader as the source color. This defaults to + * {@link BlendMode#MODULATE} if null. * @param paint {@link Paint} used to provide a color/shader/blend mode. */ - public void drawMesh(@NonNull Mesh mesh, BlendMode blendMode, @NonNull Paint paint) { + public void drawMesh(@NonNull Mesh mesh, @Nullable BlendMode blendMode, @NonNull Paint paint) { if (!isHardwareAccelerated() && onHwFeatureInSwMode()) { throw new RuntimeException("software rendering doesn't support meshes"); } diff --git a/graphics/java/android/graphics/Mesh.java b/graphics/java/android/graphics/Mesh.java index a599b2c17604..6a1313e16ce5 100644 --- a/graphics/java/android/graphics/Mesh.java +++ b/graphics/java/android/graphics/Mesh.java @@ -16,6 +16,8 @@ package android.graphics; +import android.annotation.ColorInt; +import android.annotation.ColorLong; import android.annotation.IntDef; import android.annotation.NonNull; @@ -27,10 +29,8 @@ import java.nio.ShortBuffer; /** * Class representing a mesh object. * - * This class generates Mesh objects via the - * {@link #make(MeshSpecification, int, Buffer, int, Rect)} and - * {@link #makeIndexed(MeshSpecification, int, Buffer, int, ShortBuffer, Rect)} methods, - * where a {@link MeshSpecification} is required along with various attributes for + * This class represents a Mesh object that can optionally be indexed. + * A {@link MeshSpecification} is required along with various attributes for * detailing the mesh object, including a mode, vertex buffer, optional index buffer, and bounds * for the mesh. Once generated, a mesh object can be drawn through * {@link Canvas#drawMesh(Mesh, BlendMode, Paint)} @@ -62,7 +62,7 @@ public class Mesh { } /** - * Generates a {@link Mesh} object. + * Constructor for a non-indexed Mesh. * * @param meshSpec {@link MeshSpecification} used when generating the mesh. * @param mode Determines what mode to draw the mesh in. Must be one of @@ -74,11 +74,9 @@ public class Mesh { * backed buffer generated. * @param vertexCount the number of vertices represented in the vertexBuffer and mesh. * @param bounds bounds of the mesh object. - * @return a new Mesh object. */ - @NonNull - public static Mesh make(@NonNull MeshSpecification meshSpec, @Mode int mode, - @NonNull Buffer vertexBuffer, int vertexCount, @NonNull Rect bounds) { + public Mesh(@NonNull MeshSpecification meshSpec, @Mode int mode, + @NonNull Buffer vertexBuffer, int vertexCount, @NonNull RectF bounds) { if (mode != TRIANGLES && mode != TRIANGLE_STRIP) { throw new IllegalArgumentException("Invalid value passed in for mode parameter"); } @@ -88,11 +86,12 @@ public class Mesh { if (nativeMesh == 0) { throw new IllegalArgumentException("Mesh construction failed."); } - return new Mesh(nativeMesh, false); + + meshSetup(nativeMesh, false); } /** - * Generates a {@link Mesh} object. + * Constructor for an indexed Mesh. * * @param meshSpec {@link MeshSpecification} used when generating the mesh. * @param mode Determines what mode to draw the mesh in. Must be one of @@ -108,12 +107,10 @@ public class Mesh { * currently implementation will have a CPU * backed buffer generated. * @param bounds bounds of the mesh object. - * @return a new Mesh object. */ - @NonNull - public static Mesh makeIndexed(@NonNull MeshSpecification meshSpec, @Mode int mode, + public Mesh(@NonNull MeshSpecification meshSpec, @Mode int mode, @NonNull Buffer vertexBuffer, int vertexCount, @NonNull ShortBuffer indexBuffer, - @NonNull Rect bounds) { + @NonNull RectF bounds) { if (mode != TRIANGLES && mode != TRIANGLE_STRIP) { throw new IllegalArgumentException("Invalid value passed in for mode parameter"); } @@ -124,7 +121,8 @@ public class Mesh { if (nativeMesh == 0) { throw new IllegalArgumentException("Mesh construction failed."); } - return new Mesh(nativeMesh, true); + + meshSetup(nativeMesh, true); } /** @@ -137,7 +135,7 @@ public class Mesh { * @param color the provided sRGB color will be converted into the shader program's output * colorspace and be available as a vec4 uniform in the program. */ - public void setColorUniform(@NonNull String uniformName, int color) { + public void setColorUniform(@NonNull String uniformName, @ColorInt int color) { setUniform(uniformName, Color.valueOf(color).getComponents(), true); } @@ -151,7 +149,7 @@ public class Mesh { * @param color the provided sRGB color will be converted into the shader program's output * colorspace and be available as a vec4 uniform in the program. */ - public void setColorUniform(@NonNull String uniformName, long color) { + public void setColorUniform(@NonNull String uniformName, @ColorLong long color) { Color exSRGB = Color.valueOf(color).convert(ColorSpace.get(ColorSpace.Named.EXTENDED_SRGB)); setUniform(uniformName, exSRGB.getComponents(), true); } @@ -357,7 +355,7 @@ public class Mesh { mNativeMeshWrapper, uniformName, value1, value2, value3, value4, count); } - private Mesh(long nativeMeshWrapper, boolean isIndexed) { + private void meshSetup(long nativeMeshWrapper, boolean isIndexed) { mNativeMeshWrapper = nativeMeshWrapper; this.mIsIndexed = isIndexed; MeshHolder.MESH_SPECIFICATION_REGISTRY.registerNativeAllocation(this, mNativeMeshWrapper); @@ -366,13 +364,13 @@ public class Mesh { private static native long nativeGetFinalizer(); private static native long nativeMake(long meshSpec, int mode, Buffer vertexBuffer, - boolean isDirect, int vertexCount, int vertexOffset, int left, int top, int right, - int bottom); + boolean isDirect, int vertexCount, int vertexOffset, float left, float top, float right, + float bottom); private static native long nativeMakeIndexed(long meshSpec, int mode, Buffer vertexBuffer, boolean isVertexDirect, int vertexCount, int vertexOffset, ShortBuffer indexBuffer, - boolean isIndexDirect, int indexCount, int indexOffset, int left, int top, int right, - int bottom); + boolean isIndexDirect, int indexCount, int indexOffset, float left, float top, + float right, float bottom); private static native void nativeUpdateUniforms(long builder, String uniformName, float value1, float value2, float value3, float value4, int count); diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java index 471504588673..c1f6c29ca86e 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java @@ -801,7 +801,8 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato )); if (mSpec.isDevicePropertiesAttestationIncluded()) { - final String platformReportedBrand = TextUtils.isEmpty(Build.BRAND_FOR_ATTESTATION) + final String platformReportedBrand = + isPropertyEmptyOrUnknown(Build.BRAND_FOR_ATTESTATION) ? Build.BRAND : Build.BRAND_FOR_ATTESTATION; params.add(KeyStore2ParameterUtils.makeBytes( KeymasterDefs.KM_TAG_ATTESTATION_ID_BRAND, @@ -812,8 +813,8 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato Build.DEVICE.getBytes(StandardCharsets.UTF_8) )); final String platformReportedProduct = - TextUtils.isEmpty(Build.PRODUCT_FOR_ATTESTATION) ? Build.PRODUCT : - Build.PRODUCT_FOR_ATTESTATION; + isPropertyEmptyOrUnknown(Build.PRODUCT_FOR_ATTESTATION) + ? Build.PRODUCT : Build.PRODUCT_FOR_ATTESTATION; params.add(KeyStore2ParameterUtils.makeBytes( KeymasterDefs.KM_TAG_ATTESTATION_ID_PRODUCT, platformReportedProduct.getBytes(StandardCharsets.UTF_8) @@ -822,7 +823,8 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato KeymasterDefs.KM_TAG_ATTESTATION_ID_MANUFACTURER, Build.MANUFACTURER.getBytes(StandardCharsets.UTF_8) )); - final String platformReportedModel = TextUtils.isEmpty(Build.MODEL_FOR_ATTESTATION) + final String platformReportedModel = + isPropertyEmptyOrUnknown(Build.MODEL_FOR_ATTESTATION) ? Build.MODEL : Build.MODEL_FOR_ATTESTATION; params.add(KeyStore2ParameterUtils.makeBytes( KeymasterDefs.KM_TAG_ATTESTATION_ID_MODEL, @@ -1227,4 +1229,8 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato result.retainAll(authorizedKeymasterKeyDigests); return result; } + + private boolean isPropertyEmptyOrUnknown(String property) { + return TextUtils.isEmpty(property) || property.equals(Build.UNKNOWN); + } } diff --git a/libs/WindowManager/Jetpack/window-extensions-release.aar b/libs/WindowManager/Jetpack/window-extensions-release.aar Binary files differindex 9596c2233ecc..7cd5dd69ef8f 100644 --- a/libs/WindowManager/Jetpack/window-extensions-release.aar +++ b/libs/WindowManager/Jetpack/window-extensions-release.aar diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java index 5d451a5006e1..7a6aec718006 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java @@ -173,7 +173,7 @@ public class TaskView extends SurfaceView implements SurfaceHolder.Callback, */ public void onLocationChanged() { getBoundsOnScreen(mTmpRect); - mTaskViewTaskController.onLocationChanged(mTmpRect); + mTaskViewTaskController.setWindowBounds(mTmpRect); } /** @@ -198,7 +198,7 @@ public class TaskView extends SurfaceView implements SurfaceHolder.Callback, public void surfaceChanged(@androidx.annotation.NonNull SurfaceHolder holder, int format, int width, int height) { getBoundsOnScreen(mTmpRect); - mTaskViewTaskController.surfaceChanged(mTmpRect); + mTaskViewTaskController.setWindowBounds(mTmpRect); } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewTaskController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewTaskController.java index 69ce35f43401..1f223a6ec5d0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewTaskController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/TaskViewTaskController.java @@ -183,26 +183,6 @@ public class TaskViewTaskController implements ShellTaskOrganizer.TaskListener { } /** - * Call when view position or size has changed. Do not call when animating. - */ - public void onLocationChanged(Rect newBounds) { - if (mTaskToken == null) { - return; - } - // Sync Transactions can't operate simultaneously with shell transition collection. - // The transition animation (upon showing) will sync the location itself. - if (isUsingShellTransitions() && mTaskViewTransitions.hasPending()) return; - - WindowContainerTransaction wct = new WindowContainerTransaction(); - updateWindowBounds(wct); - mSyncQueue.queue(wct); - } - - private void updateWindowBounds(WindowContainerTransaction wct) { - wct.setBounds(mTaskToken, mTaskViewBase.getCurrentBoundsOnScreen()); - } - - /** * Release this container if it is initialized. */ public void release() { @@ -394,15 +374,24 @@ public class TaskViewTaskController implements ShellTaskOrganizer.TaskListener { } /** - * Should be called when the client surface is changed. + * Sets the window bounds to {@code boundsOnScreen}. + * Call when view position or size has changed. Can also be called before the animation when + * the final bounds are known. + * Do not call during the animation. * * @param boundsOnScreen the on screen bounds of the surface view. */ - public void surfaceChanged(Rect boundsOnScreen) { + public void setWindowBounds(Rect boundsOnScreen) { if (mTaskToken == null) { return; } - onLocationChanged(boundsOnScreen); + // Sync Transactions can't operate simultaneously with shell transition collection. + // The transition animation (upon showing) will sync the location itself. + if (isUsingShellTransitions() && mTaskViewTransitions.hasPending()) return; + + WindowContainerTransaction wct = new WindowContainerTransaction(); + wct.setBounds(mTaskToken, boundsOnScreen); + mSyncQueue.queue(wct); } /** Should be called when the client surface is destroyed. */ @@ -493,7 +482,7 @@ public class TaskViewTaskController implements ShellTaskOrganizer.TaskListener { .setPosition(mTaskLeash, 0, 0) .apply(); - updateWindowBounds(wct); + wct.setBounds(mTaskToken, mTaskViewBase.getCurrentBoundsOnScreen()); } else { // The surface has already been destroyed before the task has appeared, // so go ahead and hide the task entirely diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java index e36dfc3e49be..36c0cb6dfe19 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java @@ -1058,6 +1058,11 @@ public class BubbleController implements ConfigurationChangeListener { } } + /** Sets the app bubble's taskId which is cached for SysUI. */ + public void setAppBubbleTaskId(int taskId) { + mImpl.mCachedState.setAppBubbleTaskId(taskId); + } + /** * Fills the overflow bubbles by loading them from disk. */ @@ -1636,6 +1641,7 @@ public class BubbleController implements ConfigurationChangeListener { private HashSet<String> mSuppressedBubbleKeys = new HashSet<>(); private HashMap<String, String> mSuppressedGroupToNotifKeys = new HashMap<>(); private HashMap<String, Bubble> mShortcutIdToBubble = new HashMap<>(); + private int mAppBubbleTaskId = INVALID_TASK_ID; private ArrayList<Bubble> mTmpBubbles = new ArrayList<>(); @@ -1667,12 +1673,22 @@ public class BubbleController implements ConfigurationChangeListener { mSuppressedBubbleKeys.clear(); mShortcutIdToBubble.clear(); + mAppBubbleTaskId = INVALID_TASK_ID; for (Bubble b : mTmpBubbles) { mShortcutIdToBubble.put(b.getShortcutId(), b); updateBubbleSuppressedState(b); + + if (KEY_APP_BUBBLE.equals(b.getKey())) { + mAppBubbleTaskId = b.getTaskId(); + } } } + /** Sets the app bubble's taskId which is cached for SysUI. */ + synchronized void setAppBubbleTaskId(int taskId) { + mAppBubbleTaskId = taskId; + } + /** * Updates a specific bubble suppressed state. This is used mainly because notification * suppression changes don't go through the same BubbleData update mechanism. @@ -1722,6 +1738,8 @@ public class BubbleController implements ConfigurationChangeListener { for (String key : mSuppressedGroupToNotifKeys.keySet()) { pw.println(" suppressing: " + key); } + + pw.print("mAppBubbleTaskId: " + mAppBubbleTaskId); } } @@ -1773,8 +1791,7 @@ public class BubbleController implements ConfigurationChangeListener { @Override public boolean isAppBubbleTaskId(int taskId) { - Bubble appBubble = mBubbleData.getBubbleInStackWithKey(KEY_APP_BUBBLE); - return appBubble != null && appBubble.getTaskId() == taskId; + return mCachedState.mAppBubbleTaskId == taskId; } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java index 1feff18fd68e..57c7731e69ed 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java @@ -278,6 +278,11 @@ public class BubbleExpandedView extends LinearLayout { // The taskId is saved to use for removeTask, preventing appearance in recent tasks. mTaskId = taskId; + if (Bubble.KEY_APP_BUBBLE.equals(getBubbleKey())) { + // Let the controller know sooner what the taskId is. + mController.setAppBubbleTaskId(mTaskId); + } + // With the task org, the taskAppeared callback will only happen once the task has // already drawn setContentVisibility(true); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java index 45b234a6398a..f616e6f64750 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java @@ -699,19 +699,6 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange return bounds.width() > bounds.height(); } - /** Reverse the split position. */ - @SplitPosition - public static int reversePosition(@SplitPosition int position) { - switch (position) { - case SPLIT_POSITION_TOP_OR_LEFT: - return SPLIT_POSITION_BOTTOM_OR_RIGHT; - case SPLIT_POSITION_BOTTOM_OR_RIGHT: - return SPLIT_POSITION_TOP_OR_LEFT; - default: - return SPLIT_POSITION_UNDEFINED; - } - } - /** * Return if this layout is landscape. */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenUtils.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenUtils.java new file mode 100644 index 000000000000..042721c97053 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitScreenUtils.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.common.split; + +import static com.android.wm.shell.common.split.SplitScreenConstants.CONTROLLED_ACTIVITY_TYPES; +import static com.android.wm.shell.common.split.SplitScreenConstants.CONTROLLED_WINDOWING_MODES; +import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT; +import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT; +import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_UNDEFINED; + +import android.annotation.Nullable; +import android.app.ActivityManager; +import android.app.PendingIntent; +import android.content.Intent; + +import com.android.internal.util.ArrayUtils; +import com.android.wm.shell.ShellTaskOrganizer; + +/** Helper utility class for split screen components to use. */ +public class SplitScreenUtils { + /** Reverse the split position. */ + @SplitScreenConstants.SplitPosition + public static int reverseSplitPosition(@SplitScreenConstants.SplitPosition int position) { + switch (position) { + case SPLIT_POSITION_TOP_OR_LEFT: + return SPLIT_POSITION_BOTTOM_OR_RIGHT; + case SPLIT_POSITION_BOTTOM_OR_RIGHT: + return SPLIT_POSITION_TOP_OR_LEFT; + case SPLIT_POSITION_UNDEFINED: + default: + return SPLIT_POSITION_UNDEFINED; + } + } + + /** Returns true if the task is valid for split screen. */ + public static boolean isValidToSplit(ActivityManager.RunningTaskInfo taskInfo) { + return taskInfo != null && taskInfo.supportsMultiWindow + && ArrayUtils.contains(CONTROLLED_ACTIVITY_TYPES, taskInfo.getActivityType()) + && ArrayUtils.contains(CONTROLLED_WINDOWING_MODES, taskInfo.getWindowingMode()); + } + + /** Retrieve package name from an intent */ + @Nullable + public static String getPackageName(Intent intent) { + if (intent == null || intent.getComponent() == null) { + return null; + } + return intent.getComponent().getPackageName(); + } + + /** Retrieve package name from a PendingIntent */ + @Nullable + public static String getPackageName(PendingIntent pendingIntent) { + if (pendingIntent == null || pendingIntent.getIntent() == null) { + return null; + } + return getPackageName(pendingIntent.getIntent()); + } + + /** Retrieve package name from a taskId */ + @Nullable + public static String getPackageName(int taskId, ShellTaskOrganizer taskOrganizer) { + final ActivityManager.RunningTaskInfo taskInfo = taskOrganizer.getRunningTaskInfo(taskId); + return taskInfo != null ? getPackageName(taskInfo.baseIntent) : null; + } + + /** Returns true if they are the same package. */ + public static boolean samePackage(String packageName1, String packageName2) { + return packageName1 != null && packageName1.equals(packageName2); + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java index 8490f9f156c7..0d9faa3c6f83 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java @@ -308,7 +308,6 @@ public class RecentTasksController implements TaskStackListenerCallback, rawMapping.put(taskInfo.taskId, taskInfo); } - boolean desktopModeActive = DesktopModeStatus.isActive(mContext); ArrayList<ActivityManager.RecentTaskInfo> freeformTasks = new ArrayList<>(); // Pull out the pairs as we iterate back in the list @@ -320,7 +319,7 @@ public class RecentTasksController implements TaskStackListenerCallback, continue; } - if (desktopModeActive && mDesktopModeTaskRepository.isPresent() + if (DesktopModeStatus.isProto2Enabled() && mDesktopModeTaskRepository.isPresent() && mDesktopModeTaskRepository.get().isActiveTask(taskInfo.taskId)) { // Freeform tasks will be added as a separate entry freeformTasks.add(taskInfo); @@ -328,7 +327,7 @@ public class RecentTasksController implements TaskStackListenerCallback, } final int pairedTaskId = mSplitTasks.get(taskInfo.taskId); - if (!desktopModeActive && pairedTaskId != INVALID_TASK_ID && rawMapping.contains( + if (pairedTaskId != INVALID_TASK_ID && rawMapping.contains( pairedTaskId)) { final ActivityManager.RecentTaskInfo pairedTaskInfo = rawMapping.get(pairedTaskId); rawMapping.remove(pairedTaskId); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java index 21eeaa2cafb3..7cb5cf2ea177 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java @@ -28,6 +28,9 @@ import static com.android.wm.shell.common.ExecutorUtils.executeRemoteCallWithTas import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_UNDEFINED; +import static com.android.wm.shell.common.split.SplitScreenUtils.isValidToSplit; +import static com.android.wm.shell.common.split.SplitScreenUtils.reverseSplitPosition; +import static com.android.wm.shell.common.split.SplitScreenUtils.samePackage; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_SIDE; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_UNDEFINED; import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_SPLIT_SCREEN; @@ -39,11 +42,8 @@ import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.ActivityTaskManager; import android.app.PendingIntent; -import android.content.ActivityNotFoundException; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.content.pm.LauncherApps; import android.content.pm.ShortcutInfo; import android.graphics.Rect; import android.os.Bundle; @@ -82,8 +82,8 @@ import com.android.wm.shell.common.SingleInstanceRemoteListener; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.common.annotations.ExternalThread; -import com.android.wm.shell.common.split.SplitLayout; import com.android.wm.shell.common.split.SplitScreenConstants.SplitPosition; +import com.android.wm.shell.common.split.SplitScreenUtils; import com.android.wm.shell.draganddrop.DragAndDropController; import com.android.wm.shell.draganddrop.DragAndDropPolicy; import com.android.wm.shell.protolog.ShellProtoLogGroup; @@ -318,10 +318,6 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, return mStageCoordinator; } - public boolean isValidToEnterSplitScreen(@NonNull ActivityManager.RunningTaskInfo taskInfo) { - return mStageCoordinator.isValidToEnterSplitScreen(taskInfo); - } - @Nullable public ActivityManager.RunningTaskInfo getTaskInfo(@SplitPosition int splitPosition) { if (!isSplitScreenVisible() || splitPosition == SPLIT_POSITION_UNDEFINED) { @@ -480,39 +476,54 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, @Override public void startShortcut(String packageName, String shortcutId, @SplitPosition int position, @Nullable Bundle options, UserHandle user) { - IRemoteAnimationRunner wrapper = new IRemoteAnimationRunner.Stub() { - @Override - public void onAnimationStart(@WindowManager.TransitionOldType int transit, - RemoteAnimationTarget[] apps, - RemoteAnimationTarget[] wallpapers, - RemoteAnimationTarget[] nonApps, - final IRemoteAnimationFinishedCallback finishedCallback) { - try { - finishedCallback.onAnimationFinished(); - } catch (RemoteException e) { - Slog.e(TAG, "Failed to invoke onAnimationFinished", e); - } - final WindowContainerTransaction evictWct = new WindowContainerTransaction(); - mStageCoordinator.prepareEvictNonOpeningChildTasks(position, apps, evictWct); - mSyncQueue.queue(evictWct); + if (options == null) options = new Bundle(); + final ActivityOptions activityOptions = ActivityOptions.fromBundle(options); + + if (samePackage(packageName, getPackageName(reverseSplitPosition(position)))) { + if (supportMultiInstancesSplit(packageName)) { + activityOptions.setApplyMultipleTaskFlagForShortcut(true); + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK"); + } else if (isSplitScreenVisible()) { + mStageCoordinator.switchSplitPosition("startShortcut"); + return; + } else { + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, + "Cancel entering split as not supporting multi-instances"); + Toast.makeText(mContext, R.string.dock_multi_instances_not_supported_text, + Toast.LENGTH_SHORT).show(); + return; } - @Override - public void onAnimationCancelled(boolean isKeyguardOccluded) { + } + + mStageCoordinator.startShortcut(packageName, shortcutId, position, + activityOptions.toBundle(), user); + } + + void startShortcutAndTaskWithLegacyTransition(ShortcutInfo shortcutInfo, + @Nullable Bundle options1, int taskId, @Nullable Bundle options2, + @SplitPosition int splitPosition, float splitRatio, RemoteAnimationAdapter adapter, + InstanceId instanceId) { + if (options1 == null) options1 = new Bundle(); + final ActivityOptions activityOptions = ActivityOptions.fromBundle(options1); + + final String packageName1 = shortcutInfo.getPackage(); + final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer); + if (samePackage(packageName1, packageName2)) { + if (supportMultiInstancesSplit(shortcutInfo.getPackage())) { + activityOptions.setApplyMultipleTaskFlagForShortcut(true); + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK"); + } else { + taskId = INVALID_TASK_ID; + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, + "Cancel entering split as not supporting multi-instances"); + Toast.makeText(mContext, R.string.dock_multi_instances_not_supported_text, + Toast.LENGTH_SHORT).show(); } - }; - options = mStageCoordinator.resolveStartStage(STAGE_TYPE_UNDEFINED, position, options, - null /* wct */); - RemoteAnimationAdapter wrappedAdapter = new RemoteAnimationAdapter(wrapper, - 0 /* duration */, 0 /* statusBarTransitionDelay */); - ActivityOptions activityOptions = ActivityOptions.fromBundle(options); - activityOptions.update(ActivityOptions.makeRemoteAnimation(wrappedAdapter)); - try { - LauncherApps launcherApps = mContext.getSystemService(LauncherApps.class); - launcherApps.startShortcut(packageName, shortcutId, null /* sourceBounds */, - activityOptions.toBundle(), user); - } catch (ActivityNotFoundException e) { - Slog.e(TAG, "Failed to launch shortcut", e); } + + mStageCoordinator.startShortcutAndTaskWithLegacyTransition(shortcutInfo, + activityOptions.toBundle(), taskId, options2, splitPosition, splitRatio, adapter, + instanceId); } /** @@ -530,8 +541,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, @SplitPosition int splitPosition, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { Intent fillInIntent = null; - if (launchSameAppAdjacently(pendingIntent, taskId)) { - if (supportMultiInstancesSplit(pendingIntent.getIntent().getComponent())) { + final String packageName1 = SplitScreenUtils.getPackageName(pendingIntent); + final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer); + if (samePackage(packageName1, packageName2)) { + if (supportMultiInstancesSplit(packageName1)) { fillInIntent = new Intent(); fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK"); @@ -551,8 +564,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, int taskId, @Nullable Bundle options2, @SplitPosition int splitPosition, float splitRatio, @Nullable RemoteTransition remoteTransition, InstanceId instanceId) { Intent fillInIntent = null; - if (launchSameAppAdjacently(pendingIntent, taskId)) { - if (supportMultiInstancesSplit(pendingIntent.getIntent().getComponent())) { + final String packageName1 = SplitScreenUtils.getPackageName(pendingIntent); + final String packageName2 = SplitScreenUtils.getPackageName(taskId, mTaskOrganizer); + if (samePackage(packageName1, packageName2)) { + if (supportMultiInstancesSplit(packageName1)) { fillInIntent = new Intent(); fillInIntent.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_SPLIT_SCREEN, "Adding MULTIPLE_TASK"); @@ -573,8 +588,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { Intent fillInIntent1 = null; Intent fillInIntent2 = null; - if (launchSameAppAdjacently(pendingIntent1, pendingIntent2)) { - if (supportMultiInstancesSplit(pendingIntent1.getIntent().getComponent())) { + final String packageName1 = SplitScreenUtils.getPackageName(pendingIntent1); + final String packageName2 = SplitScreenUtils.getPackageName(pendingIntent2); + if (samePackage(packageName1, packageName2)) { + if (supportMultiInstancesSplit(packageName1)) { fillInIntent1 = new Intent(); fillInIntent1.addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); fillInIntent2 = new Intent(); @@ -602,13 +619,15 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, if (fillInIntent == null) fillInIntent = new Intent(); fillInIntent.addFlags(FLAG_ACTIVITY_NO_USER_ACTION); - if (launchSameAppAdjacently(position, intent)) { - final ComponentName launching = intent.getIntent().getComponent(); - if (supportMultiInstancesSplit(launching)) { + final String packageName1 = SplitScreenUtils.getPackageName(intent); + final String packageName2 = getPackageName(reverseSplitPosition(position)); + if (SplitScreenUtils.samePackage(packageName1, packageName2)) { + if (supportMultiInstancesSplit(packageName1)) { // To prevent accumulating large number of instances in the background, reuse task // in the background with priority. final ActivityManager.RecentTaskInfo taskInfo = mRecentTasksOptional - .map(recentTasks -> recentTasks.findTaskInBackground(launching)) + .map(recentTasks -> recentTasks.findTaskInBackground( + intent.getIntent().getComponent())) .orElse(null); if (taskInfo != null) { startTask(taskInfo.taskId, position, options); @@ -636,63 +655,32 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, mStageCoordinator.startIntent(intent, fillInIntent, position, options); } + /** Retrieve package name of a specific split position if split screen is activated, otherwise + * returns the package name of the top running task. */ @Nullable - private String getPackageName(Intent intent) { - if (intent == null || intent.getComponent() == null) { - return null; - } - return intent.getComponent().getPackageName(); - } - - private boolean launchSameAppAdjacently(@SplitPosition int position, - PendingIntent pendingIntent) { - ActivityManager.RunningTaskInfo adjacentTaskInfo = null; + private String getPackageName(@SplitPosition int position) { + ActivityManager.RunningTaskInfo taskInfo; if (isSplitScreenVisible()) { - adjacentTaskInfo = getTaskInfo(SplitLayout.reversePosition(position)); + taskInfo = getTaskInfo(position); } else { - adjacentTaskInfo = mRecentTasksOptional - .map(recentTasks -> recentTasks.getTopRunningTask()).orElse(null); - if (!isValidToEnterSplitScreen(adjacentTaskInfo)) { - return false; + taskInfo = mRecentTasksOptional + .map(recentTasks -> recentTasks.getTopRunningTask()) + .orElse(null); + if (!isValidToSplit(taskInfo)) { + return null; } } - if (adjacentTaskInfo == null) { - return false; - } - - final String targetPackageName = getPackageName(pendingIntent.getIntent()); - final String adjacentPackageName = getPackageName(adjacentTaskInfo.baseIntent); - return targetPackageName != null && targetPackageName.equals(adjacentPackageName); - } - - private boolean launchSameAppAdjacently(PendingIntent pendingIntent, int taskId) { - final ActivityManager.RunningTaskInfo adjacentTaskInfo = - mTaskOrganizer.getRunningTaskInfo(taskId); - if (adjacentTaskInfo == null) { - return false; - } - final String targetPackageName = getPackageName(pendingIntent.getIntent()); - final String adjacentPackageName = getPackageName(adjacentTaskInfo.baseIntent); - return targetPackageName != null && targetPackageName.equals(adjacentPackageName); - } - - private boolean launchSameAppAdjacently(PendingIntent pendingIntent1, - PendingIntent pendingIntent2) { - final String targetPackageName = getPackageName(pendingIntent1.getIntent()); - final String adjacentPackageName = getPackageName(pendingIntent2.getIntent()); - return targetPackageName != null && targetPackageName.equals(adjacentPackageName); + return taskInfo != null ? SplitScreenUtils.getPackageName(taskInfo.baseIntent) : null; } @VisibleForTesting - /** Returns {@code true} if the component supports multi-instances split. */ - boolean supportMultiInstancesSplit(@Nullable ComponentName launching) { - if (launching == null) return false; - - final String packageName = launching.getPackageName(); - for (int i = 0; i < mAppsSupportMultiInstances.length; i++) { - if (mAppsSupportMultiInstances[i].equals(packageName)) { - return true; + boolean supportMultiInstancesSplit(String packageName) { + if (packageName != null) { + for (int i = 0; i < mAppsSupportMultiInstances.length; i++) { + if (mAppsSupportMultiInstances[i].equals(packageName)) { + return true; + } } } @@ -1011,7 +999,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, InstanceId instanceId) { executeRemoteCallWithTaskPermission(mController, "startShortcutAndTaskWithLegacyTransition", (controller) -> - controller.mStageCoordinator.startShortcutAndTaskWithLegacyTransition( + controller.startShortcutAndTaskWithLegacyTransition( shortcutInfo, options1, taskId, options2, splitPosition, splitRatio, adapter, instanceId)); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 9624ae9b741b..5a9170b48ede 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -36,12 +36,11 @@ import static android.window.TransitionInfo.FLAG_IS_DISPLAY; import static android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REORDER; import static com.android.wm.shell.common.split.SplitLayout.PARALLAX_ALIGN_CENTER; -import static com.android.wm.shell.common.split.SplitScreenConstants.CONTROLLED_ACTIVITY_TYPES; -import static com.android.wm.shell.common.split.SplitScreenConstants.CONTROLLED_WINDOWING_MODES; import static com.android.wm.shell.common.split.SplitScreenConstants.FLAG_IS_DIVIDER_BAR; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT; import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_UNDEFINED; +import static com.android.wm.shell.common.split.SplitScreenUtils.reverseSplitPosition; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_MAIN; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_SIDE; import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_UNDEFINED; @@ -76,8 +75,10 @@ import android.app.ActivityOptions; import android.app.IActivityTaskManager; import android.app.PendingIntent; import android.app.WindowConfiguration; +import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; +import android.content.pm.LauncherApps; import android.content.pm.ShortcutInfo; import android.content.res.Configuration; import android.graphics.Rect; @@ -87,6 +88,7 @@ import android.os.Debug; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.UserHandle; import android.util.Log; import android.util.Slog; import android.view.Choreographer; @@ -370,7 +372,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, int sideStagePosition; if (stageType == STAGE_TYPE_MAIN) { targetStage = mMainStage; - sideStagePosition = SplitLayout.reversePosition(stagePosition); + sideStagePosition = reverseSplitPosition(stagePosition); } else if (stageType == STAGE_TYPE_SIDE) { targetStage = mSideStage; sideStagePosition = stagePosition; @@ -428,6 +430,72 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, return mLogger; } + void startShortcut(String packageName, String shortcutId, @SplitPosition int position, + Bundle options, UserHandle user) { + final boolean isEnteringSplit = !isSplitActive(); + + IRemoteAnimationRunner wrapper = new IRemoteAnimationRunner.Stub() { + @Override + public void onAnimationStart(@WindowManager.TransitionOldType int transit, + RemoteAnimationTarget[] apps, + RemoteAnimationTarget[] wallpapers, + RemoteAnimationTarget[] nonApps, + final IRemoteAnimationFinishedCallback finishedCallback) { + boolean openingToSide = false; + if (apps != null) { + for (int i = 0; i < apps.length; ++i) { + if (apps[i].mode == MODE_OPENING + && mSideStage.containsTask(apps[i].taskId)) { + openingToSide = true; + break; + } + } + } + + if (isEnteringSplit && !openingToSide) { + mMainExecutor.execute(() -> exitSplitScreen( + mSideStage.getChildCount() == 0 ? mMainStage : mSideStage, + EXIT_REASON_UNKNOWN)); + } + + if (finishedCallback != null) { + try { + finishedCallback.onAnimationFinished(); + } catch (RemoteException e) { + Slog.e(TAG, "Error finishing legacy transition: ", e); + } + } + + if (!isEnteringSplit && openingToSide) { + final WindowContainerTransaction evictWct = new WindowContainerTransaction(); + prepareEvictNonOpeningChildTasks(position, apps, evictWct); + mSyncQueue.queue(evictWct); + } + } + @Override + public void onAnimationCancelled(boolean isKeyguardOccluded) { + if (isEnteringSplit) { + mMainExecutor.execute(() -> exitSplitScreen( + mSideStage.getChildCount() == 0 ? mMainStage : mSideStage, + EXIT_REASON_UNKNOWN)); + } + } + }; + options = resolveStartStage(STAGE_TYPE_UNDEFINED, position, options, + null /* wct */); + RemoteAnimationAdapter wrappedAdapter = new RemoteAnimationAdapter(wrapper, + 0 /* duration */, 0 /* statusBarTransitionDelay */); + ActivityOptions activityOptions = ActivityOptions.fromBundle(options); + activityOptions.update(ActivityOptions.makeRemoteAnimation(wrappedAdapter)); + try { + LauncherApps launcherApps = mContext.getSystemService(LauncherApps.class); + launcherApps.startShortcut(packageName, shortcutId, null /* sourceBounds */, + activityOptions.toBundle(), user); + } catch (ActivityNotFoundException e) { + Slog.e(TAG, "Failed to launch shortcut", e); + } + } + /** Launches an activity into split. */ void startIntent(PendingIntent intent, Intent fillInIntent, @SplitPosition int position, @Nullable Bundle options) { @@ -899,7 +967,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, case STAGE_TYPE_MAIN: { if (position != SPLIT_POSITION_UNDEFINED) { // Set the side stage opposite of what we want to the main stage. - setSideStagePosition(SplitLayout.reversePosition(position), wct); + setSideStagePosition(reverseSplitPosition(position), wct); } else { position = getMainStagePosition(); } @@ -923,7 +991,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, @SplitPosition int getMainStagePosition() { - return SplitLayout.reversePosition(mSideStagePosition); + return reverseSplitPosition(mSideStagePosition); } int getTaskId(@SplitPosition int splitPosition) { @@ -950,7 +1018,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mSplitLayout.splitSwitching(t, topLeftStage.mRootLeash, bottomRightStage.mRootLeash, insets -> { WindowContainerTransaction wct = new WindowContainerTransaction(); - setSideStagePosition(SplitLayout.reversePosition(mSideStagePosition), wct); + setSideStagePosition(reverseSplitPosition(mSideStagePosition), wct); mSyncQueue.queue(wct); mSyncQueue.runInSync(st -> { updateSurfaceBounds(mSplitLayout, st, false /* applyResizingOffset */); @@ -1694,12 +1762,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } - boolean isValidToEnterSplitScreen(@NonNull ActivityManager.RunningTaskInfo taskInfo) { - return taskInfo.supportsMultiWindow - && ArrayUtils.contains(CONTROLLED_ACTIVITY_TYPES, taskInfo.getActivityType()) - && ArrayUtils.contains(CONTROLLED_WINDOWING_MODES, taskInfo.getWindowingMode()); - } - @Override public void onSnappedToDismiss(boolean bottomOrRight, int reason) { final boolean mainStageToTop = diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index 606cf2854802..db6cbdc5176d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -301,18 +301,11 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { mDragPositioningCallback.onDragPositioningEnd( e.getRawX(dragPointerIdx), e.getRawY(dragPointerIdx)); if (e.getRawY(dragPointerIdx) <= statusBarHeight) { - if (DesktopModeStatus.isProto2Enabled()) { - if (taskInfo.getWindowingMode() == WINDOWING_MODE_FREEFORM) { - // Switch a single task to fullscreen - mDesktopTasksController.ifPresent( - c -> c.moveToFullscreen(taskInfo)); - } - } else if (DesktopModeStatus.isProto1Enabled()) { - if (DesktopModeStatus.isActive(mContext)) { - // Turn off desktop mode - mDesktopModeController.ifPresent( - c -> c.setDesktopModeActive(false)); - } + if (DesktopModeStatus.isProto2Enabled() + && taskInfo.getWindowingMode() == WINDOWING_MODE_FREEFORM) { + // Switch a single task to fullscreen + mDesktopTasksController.ifPresent( + c -> c.moveToFullscreen(taskInfo)); } } break; @@ -402,10 +395,6 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { || focusedDecor.mTaskInfo.getWindowingMode() != WINDOWING_MODE_FREEFORM) { handleCaptionThroughStatusBar(ev); } - } else if (DesktopModeStatus.isProto1Enabled()) { - if (!DesktopModeStatus.isActive(mContext)) { - handleCaptionThroughStatusBar(ev); - } } handleEventOutsideFocusedCaption(ev); // Prevent status bar from reacting to a caption drag. @@ -451,9 +440,6 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { // In proto2 any full screen task can be dragged to freeform dragFromStatusBarAllowed = focusedDecor.mTaskInfo.getWindowingMode() == WINDOWING_MODE_FULLSCREEN; - } else if (DesktopModeStatus.isProto1Enabled()) { - // In proto1 task can be dragged to freeform when not in desktop mode - dragFromStatusBarAllowed = !DesktopModeStatus.isActive(mContext); } if (dragFromStatusBarAllowed && focusedDecor.checkTouchEventInHandle(ev)) { @@ -524,7 +510,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { private boolean shouldShowWindowDecor(RunningTaskInfo taskInfo) { if (taskInfo.getWindowingMode() == WINDOWING_MODE_FREEFORM) return true; - return DesktopModeStatus.isAnyEnabled() + return DesktopModeStatus.isProto2Enabled() && taskInfo.getActivityType() == ACTIVITY_TYPE_STANDARD && mDisplayController.getDisplayContext(taskInfo.displayId) .getResources().getConfiguration().smallestScreenWidthDp >= 600; diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java index 82392ad9a3eb..b542fae060d1 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java @@ -253,10 +253,10 @@ public class RecentTasksControllerTest extends ShellTestCase { } @Test - public void testGetRecentTasks_groupActiveFreeformTasks() { + public void testGetRecentTasks_hasActiveDesktopTasks_proto2Enabled_groupFreeformTasks() { StaticMockitoSession mockitoSession = mockitoSession().mockStatic( DesktopModeStatus.class).startMocking(); - when(DesktopModeStatus.isActive(any())).thenReturn(true); + when(DesktopModeStatus.isProto2Enabled()).thenReturn(true); ActivityManager.RecentTaskInfo t1 = makeTaskInfo(1); ActivityManager.RecentTaskInfo t2 = makeTaskInfo(2); @@ -293,6 +293,39 @@ public class RecentTasksControllerTest extends ShellTestCase { } @Test + public void testGetRecentTasks_hasActiveDesktopTasks_proto2Disabled_doNotGroupFreeformTasks() { + StaticMockitoSession mockitoSession = mockitoSession().mockStatic( + DesktopModeStatus.class).startMocking(); + when(DesktopModeStatus.isProto2Enabled()).thenReturn(false); + + ActivityManager.RecentTaskInfo t1 = makeTaskInfo(1); + ActivityManager.RecentTaskInfo t2 = makeTaskInfo(2); + ActivityManager.RecentTaskInfo t3 = makeTaskInfo(3); + ActivityManager.RecentTaskInfo t4 = makeTaskInfo(4); + setRawList(t1, t2, t3, t4); + + when(mDesktopModeTaskRepository.isActiveTask(1)).thenReturn(true); + when(mDesktopModeTaskRepository.isActiveTask(3)).thenReturn(true); + + ArrayList<GroupedRecentTaskInfo> recentTasks = mRecentTasksController.getRecentTasks( + MAX_VALUE, RECENT_IGNORE_UNAVAILABLE, 0); + + // Expect no grouping of tasks + assertEquals(4, recentTasks.size()); + assertEquals(GroupedRecentTaskInfo.TYPE_SINGLE, recentTasks.get(0).getType()); + assertEquals(GroupedRecentTaskInfo.TYPE_SINGLE, recentTasks.get(1).getType()); + assertEquals(GroupedRecentTaskInfo.TYPE_SINGLE, recentTasks.get(2).getType()); + assertEquals(GroupedRecentTaskInfo.TYPE_SINGLE, recentTasks.get(3).getType()); + + assertEquals(t1, recentTasks.get(0).getTaskInfo1()); + assertEquals(t2, recentTasks.get(1).getTaskInfo1()); + assertEquals(t3, recentTasks.get(2).getTaskInfo1()); + assertEquals(t4, recentTasks.get(3).getTaskInfo1()); + + mockitoSession.finishMocking(); + } + + @Test public void testRemovedTaskRemovesSplit() { ActivityManager.RecentTaskInfo t1 = makeTaskInfo(1); ActivityManager.RecentTaskInfo t2 = makeTaskInfo(2); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenControllerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenControllerTests.java index ea3af9d96aa4..d0e26019f9bf 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenControllerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitScreenControllerTests.java @@ -27,8 +27,6 @@ import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSIT import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; @@ -201,7 +199,6 @@ public class SplitScreenControllerTests extends ShellTestCase { ActivityManager.RunningTaskInfo topRunningTask = createTaskInfo(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, startIntent); doReturn(topRunningTask).when(mRecentTasks).getTopRunningTask(); - doReturn(true).when(mStageCoordinator).isValidToEnterSplitScreen(any()); mSplitScreenController.startIntent(pendingIntent, null, SPLIT_POSITION_TOP_OR_LEFT, null); @@ -222,7 +219,6 @@ public class SplitScreenControllerTests extends ShellTestCase { ActivityManager.RunningTaskInfo topRunningTask = createTaskInfo(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, startIntent); doReturn(topRunningTask).when(mRecentTasks).getTopRunningTask(); - doReturn(true).when(mStageCoordinator).isValidToEnterSplitScreen(any()); // Put the same component into a task in the background ActivityManager.RecentTaskInfo sameTaskInfo = new ActivityManager.RecentTaskInfo(); doReturn(sameTaskInfo).when(mRecentTasks).findTaskInBackground(any()); diff --git a/libs/hwui/jni/Mesh.cpp b/libs/hwui/jni/Mesh.cpp index 3aac48dd08b1..b13d9bafb417 100644 --- a/libs/hwui/jni/Mesh.cpp +++ b/libs/hwui/jni/Mesh.cpp @@ -38,8 +38,8 @@ sk_sp<SkMesh::IndexBuffer> genIndexBuffer(JNIEnv* env, jobject buffer, int size, } static jlong make(JNIEnv* env, jobject, jlong meshSpec, jint mode, jobject vertexBuffer, - jboolean isDirect, jint vertexCount, jint vertexOffset, jint left, jint top, - jint right, jint bottom) { + jboolean isDirect, jint vertexCount, jint vertexOffset, jfloat left, jfloat top, + jfloat right, jfloat bottom) { auto skMeshSpec = sk_ref_sp(reinterpret_cast<SkMeshSpecification*>(meshSpec)); sk_sp<SkMesh::VertexBuffer> skVertexBuffer = genVertexBuffer(env, vertexBuffer, vertexCount * skMeshSpec->stride(), isDirect); @@ -60,7 +60,7 @@ static jlong make(JNIEnv* env, jobject, jlong meshSpec, jint mode, jobject verte static jlong makeIndexed(JNIEnv* env, jobject, jlong meshSpec, jint mode, jobject vertexBuffer, jboolean isVertexDirect, jint vertexCount, jint vertexOffset, jobject indexBuffer, jboolean isIndexDirect, jint indexCount, - jint indexOffset, jint left, jint top, jint right, jint bottom) { + jint indexOffset, jfloat left, jfloat top, jfloat right, jfloat bottom) { auto skMeshSpec = sk_ref_sp(reinterpret_cast<SkMeshSpecification*>(meshSpec)); sk_sp<SkMesh::VertexBuffer> skVertexBuffer = genVertexBuffer(env, vertexBuffer, vertexCount * skMeshSpec->stride(), isVertexDirect); @@ -210,8 +210,8 @@ static jlong getMeshFinalizer(JNIEnv*, jobject) { static const JNINativeMethod gMeshMethods[] = { {"nativeGetFinalizer", "()J", (void*)getMeshFinalizer}, - {"nativeMake", "(JILjava/nio/Buffer;ZIIIIII)J", (void*)make}, - {"nativeMakeIndexed", "(JILjava/nio/Buffer;ZIILjava/nio/ShortBuffer;ZIIIIII)J", + {"nativeMake", "(JILjava/nio/Buffer;ZIIFFFF)J", (void*)make}, + {"nativeMakeIndexed", "(JILjava/nio/Buffer;ZIILjava/nio/ShortBuffer;ZIIFFFF)J", (void*)makeIndexed}, {"nativeUpdateMesh", "(JZ)V", (void*)updateMesh}, {"nativeUpdateUniforms", "(JLjava/lang/String;[FZ)V", (void*)updateFloatArrayUniforms}, diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 063645152228..39d965f698c0 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -1422,7 +1422,7 @@ public class AudioManager { public int getVolumeGroupIdForAttributes(@NonNull AudioAttributes attributes) { Preconditions.checkNotNull(attributes, "Audio Attributes must not be null"); return AudioProductStrategy.getVolumeGroupIdForAudioAttributes(attributes, - /* fallbackOnDefault= */ false); + /* fallbackOnDefault= */ true); } /** diff --git a/media/java/android/media/MediaCas.java b/media/java/android/media/MediaCas.java index 015602e95533..0704da4fb63d 100644 --- a/media/java/android/media/MediaCas.java +++ b/media/java/android/media/MediaCas.java @@ -41,6 +41,7 @@ import android.os.Message; import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.ServiceSpecificException; import android.util.Log; import android.util.Singleton; @@ -360,14 +361,14 @@ public final class MediaCas implements AutoCloseable { @Override public void handleMessage(Message msg) { if (msg.what == MSG_CAS_EVENT) { - mListener.onEvent(MediaCas.this, msg.arg1, msg.arg2, - toBytes((ArrayList<Byte>) msg.obj)); + byte[] data = (msg.obj == null) ? new byte[0] : (byte[]) msg.obj; + mListener.onEvent(MediaCas.this, msg.arg1, msg.arg2, data); } else if (msg.what == MSG_CAS_SESSION_EVENT) { Bundle bundle = msg.getData(); byte[] sessionId = bundle.getByteArray(SESSION_KEY); - mListener.onSessionEvent(MediaCas.this, - createFromSessionId(sessionId), msg.arg1, msg.arg2, - bundle.getByteArray(DATA_KEY)); + byte[] data = bundle.getByteArray(DATA_KEY); + mListener.onSessionEvent( + MediaCas.this, createFromSessionId(sessionId), msg.arg1, msg.arg2, data); } else if (msg.what == MSG_CAS_STATUS_EVENT) { if ((msg.arg1 == PLUGIN_STATUS_SESSION_NUMBER_CHANGED) && (mTunerResourceManager != null)) { @@ -599,7 +600,11 @@ public final class MediaCas implements AutoCloseable { try { if (mICas != null) { - mICas.setSessionPrivateData(mSessionId, data); + try { + mICas.setSessionPrivateData(mSessionId, data); + } catch (ServiceSpecificException se) { + MediaCasException.throwExceptionIfNeeded(se.errorCode); + } } else { MediaCasException.throwExceptionIfNeeded( mICasHidl.setSessionPrivateData( @@ -628,7 +633,12 @@ public final class MediaCas implements AutoCloseable { try { if (mICas != null) { - mICas.processEcm(mSessionId, data); + try { + mICas.processEcm( + mSessionId, Arrays.copyOfRange(data, offset, length + offset)); + } catch (ServiceSpecificException se) { + MediaCasException.throwExceptionIfNeeded(se.errorCode); + } } else { MediaCasException.throwExceptionIfNeeded( mICasHidl.processEcm( @@ -671,23 +681,26 @@ public final class MediaCas implements AutoCloseable { validateSessionInternalStates(); if (mICas != null) { try { + if (data == null) { + data = new byte[0]; + } mICas.sendSessionEvent(mSessionId, event, arg, data); } catch (RemoteException e) { cleanupAndRethrowIllegalState(); } - } - - if (mICasHidl11 == null) { - Log.d(TAG, "Send Session Event isn't supported by cas@1.0 interface"); - throw new UnsupportedCasException("Send Session Event is not supported"); - } + } else { + if (mICasHidl11 == null) { + Log.d(TAG, "Send Session Event isn't supported by cas@1.0 interface"); + throw new UnsupportedCasException("Send Session Event is not supported"); + } - try { - MediaCasException.throwExceptionIfNeeded( - mICasHidl11.sendSessionEvent( - toByteArray(mSessionId), event, arg, toByteArray(data))); - } catch (RemoteException e) { - cleanupAndRethrowIllegalState(); + try { + MediaCasException.throwExceptionIfNeeded( + mICasHidl11.sendSessionEvent( + toByteArray(mSessionId), event, arg, toByteArray(data))); + } catch (RemoteException e) { + cleanupAndRethrowIllegalState(); + } } } @@ -1038,7 +1051,11 @@ public final class MediaCas implements AutoCloseable { try { if (mICas != null) { - mICas.setPrivateData(data); + try { + mICas.setPrivateData(data); + } catch (ServiceSpecificException se) { + MediaCasException.throwExceptionIfNeeded(se.errorCode); + } } else { MediaCasException.throwExceptionIfNeeded( mICasHidl.setPrivateData(toByteArray(data, 0, data.length))); @@ -1126,7 +1143,21 @@ public final class MediaCas implements AutoCloseable { int sessionResourceHandle = getSessionResourceHandle(); try { - if (mICasHidl != null) { + if (mICas != null) { + try { + byte[] sessionId = mICas.openSessionDefault(); + Session session = createFromSessionId(sessionId); + Log.d(TAG, "Write Stats Log for succeed to Open Session."); + FrameworkStatsLog.write( + FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS, + mUserId, + mCasSystemId, + FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS__STATE__SUCCEEDED); + return session; + } catch (ServiceSpecificException se) { + MediaCasException.throwExceptionIfNeeded(se.errorCode); + } + } else if (mICasHidl != null) { OpenSessionCallback cb = new OpenSessionCallback(); mICasHidl.openSession(cb); MediaCasException.throwExceptionIfNeeded(cb.mStatus); @@ -1183,7 +1214,7 @@ public final class MediaCas implements AutoCloseable { mCasSystemId, FrameworkStatsLog.TV_CAS_SESSION_OPEN_STATUS__STATE__SUCCEEDED); return session; - } catch (RemoteException e) { + } catch (ServiceSpecificException | RemoteException e) { cleanupAndRethrowIllegalState(); } } @@ -1229,7 +1260,11 @@ public final class MediaCas implements AutoCloseable { try { if (mICas != null) { - mICas.processEmm(Arrays.copyOfRange(data, offset, length)); + try { + mICas.processEmm(Arrays.copyOfRange(data, offset, length)); + } catch (ServiceSpecificException se) { + MediaCasException.throwExceptionIfNeeded(se.errorCode); + } } else { MediaCasException.throwExceptionIfNeeded( mICasHidl.processEmm(toByteArray(data, offset, length))); @@ -1272,7 +1307,14 @@ public final class MediaCas implements AutoCloseable { try { if (mICas != null) { - mICas.sendEvent(event, arg, data); + try { + if (data == null) { + data = new byte[0]; + } + mICas.sendEvent(event, arg, data); + } catch (ServiceSpecificException se) { + MediaCasException.throwExceptionIfNeeded(se.errorCode); + } } else { MediaCasException.throwExceptionIfNeeded( mICasHidl.sendEvent(event, arg, toByteArray(data))); @@ -1298,7 +1340,11 @@ public final class MediaCas implements AutoCloseable { try { if (mICas != null) { - mICas.provision(provisionString); + try { + mICas.provision(provisionString); + } catch (ServiceSpecificException se) { + MediaCasException.throwExceptionIfNeeded(se.errorCode); + } } else { MediaCasException.throwExceptionIfNeeded(mICasHidl.provision(provisionString)); } @@ -1323,7 +1369,14 @@ public final class MediaCas implements AutoCloseable { try { if (mICas != null) { - mICas.refreshEntitlements(refreshType, refreshData); + try { + if (refreshData == null) { + refreshData = new byte[0]; + } + mICas.refreshEntitlements(refreshType, refreshData); + } catch (ServiceSpecificException se) { + MediaCasException.throwExceptionIfNeeded(se.errorCode); + } } else { MediaCasException.throwExceptionIfNeeded( mICasHidl.refreshEntitlements(refreshType, toByteArray(refreshData))); diff --git a/media/java/android/media/MediaDescrambler.java b/media/java/android/media/MediaDescrambler.java index b4bdf93db3ab..15dee8516f0c 100644 --- a/media/java/android/media/MediaDescrambler.java +++ b/media/java/android/media/MediaDescrambler.java @@ -17,24 +17,15 @@ package android.media; import android.annotation.NonNull; -import android.hardware.cas.DestinationBuffer; import android.hardware.cas.IDescrambler; import android.hardware.cas.ScramblingControl; -import android.hardware.cas.SharedBuffer; -import android.hardware.cas.SubSample; import android.hardware.cas.V1_0.IDescramblerBase; -import android.hardware.common.Ashmem; -import android.hardware.common.NativeHandle; import android.media.MediaCasException.UnsupportedCasException; import android.os.IHwBinder; -import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.ServiceSpecificException; -import android.os.SharedMemory; -import android.system.ErrnoException; import android.util.Log; -import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -52,6 +43,7 @@ import java.util.ArrayList; public final class MediaDescrambler implements AutoCloseable { private static final String TAG = "MediaDescrambler"; private DescramblerWrapper mIDescrambler; + private boolean mIsAidlHal; private interface DescramblerWrapper { @@ -68,50 +60,18 @@ public final class MediaDescrambler implements AutoCloseable { void setMediaCasSession(byte[] sessionId) throws RemoteException; void release() throws RemoteException; - } - ; - - private long getSubsampleInfo( - int numSubSamples, - int[] numBytesOfClearData, - int[] numBytesOfEncryptedData, - SubSample[] subSamples) { - long totalSize = 0; - - for (int i = 0; i < numSubSamples; i++) { - totalSize += numBytesOfClearData[i]; - subSamples[i].numBytesOfClearData = numBytesOfClearData[i]; - totalSize += numBytesOfEncryptedData[i]; - subSamples[i].numBytesOfEncryptedData = numBytesOfEncryptedData[i]; - } - return totalSize; - } - - private ParcelFileDescriptor createSharedMemory(ByteBuffer buffer, String name) - throws RemoteException { - byte[] source = buffer.array(); - if (source.length == 0) { - return null; - } - ParcelFileDescriptor fd = null; - try { - SharedMemory ashmem = SharedMemory.create(name == null ? "" : name, source.length); - ByteBuffer ptr = ashmem.mapReadWrite(); - ptr.put(buffer); - ashmem.unmap(ptr); - fd = ashmem.getFdDup(); - return fd; - } catch (ErrnoException | IOException e) { - throw new RemoteException(e); - } - } + }; private class AidlDescrambler implements DescramblerWrapper { IDescrambler mAidlDescrambler; - AidlDescrambler(IDescrambler aidlDescrambler) { - mAidlDescrambler = aidlDescrambler; + AidlDescrambler(IDescrambler aidlDescrambler) throws Exception { + if (aidlDescrambler != null) { + mAidlDescrambler = aidlDescrambler; + } else { + throw new Exception("Descrambler could not be created"); + } } @Override @@ -125,47 +85,17 @@ public final class MediaDescrambler implements AutoCloseable { @NonNull ByteBuffer dst, @NonNull MediaCodec.CryptoInfo cryptoInfo) throws RemoteException { - SubSample[] subSamples = new SubSample[cryptoInfo.numSubSamples]; - long totalLength = - getSubsampleInfo( - cryptoInfo.numSubSamples, - cryptoInfo.numBytesOfClearData, - cryptoInfo.numBytesOfEncryptedData, - subSamples); - SharedBuffer srcBuffer = new SharedBuffer(); - DestinationBuffer dstBuffer; - srcBuffer.heapBase = new Ashmem(); - srcBuffer.heapBase.fd = createSharedMemory(src, "Descrambler Source Buffer"); - srcBuffer.heapBase.size = src.array().length; - if (dst == null) { - dstBuffer = DestinationBuffer.nonsecureMemory(srcBuffer); - } else { - ParcelFileDescriptor pfd = - createSharedMemory(dst, "Descrambler Destination Buffer"); - NativeHandle nh = new NativeHandle(); - nh.fds = new ParcelFileDescriptor[] {pfd}; - nh.ints = new int[] {1}; // Mark 1 since source buffer also uses it? - dstBuffer = DestinationBuffer.secureMemory(nh); - } - @ScramblingControl int control = cryptoInfo.key[0]; - - return mAidlDescrambler.descramble( - (byte) control, - subSamples, - srcBuffer, - src.position(), - dstBuffer, - dst.position()); + throw new RemoteException("Not supported"); } @Override public boolean requiresSecureDecoderComponent(@NonNull String mime) throws RemoteException { - return mAidlDescrambler.requiresSecureDecoderComponent(mime); + throw new RemoteException("Not supported"); } @Override public void setMediaCasSession(byte[] sessionId) throws RemoteException { - mAidlDescrambler.setMediaCasSession(sessionId); + throw new RemoteException("Not supported"); } @Override @@ -178,9 +108,13 @@ public final class MediaDescrambler implements AutoCloseable { IDescramblerBase mHidlDescrambler; - HidlDescrambler(IDescramblerBase hidlDescrambler) { - mHidlDescrambler = hidlDescrambler; - native_setup(hidlDescrambler.asBinder()); + HidlDescrambler(IDescramblerBase hidlDescrambler) throws Exception { + if (hidlDescrambler != null) { + mHidlDescrambler = hidlDescrambler; + native_setup(hidlDescrambler.asBinder()); + } else { + throw new Exception("Descrambler could not be created"); + } } @Override @@ -267,10 +201,14 @@ public final class MediaDescrambler implements AutoCloseable { if (MediaCas.getService() != null) { mIDescrambler = new AidlDescrambler(MediaCas.getService().createDescrambler(CA_system_id)); + mIsAidlHal = true; } else if (MediaCas.getServiceHidl() != null) { mIDescrambler = new HidlDescrambler( MediaCas.getServiceHidl().createDescrambler(CA_system_id)); + mIsAidlHal = false; + } else { + throw new Exception("No CAS service found!"); } } catch(Exception e) { Log.e(TAG, "Failed to create descrambler: " + e); @@ -282,6 +220,15 @@ public final class MediaDescrambler implements AutoCloseable { } } + /** + * Check if the underlying HAL is AIDL. Used only for CTS. + * + * @hide + */ + public boolean isAidlHal() { + return mIsAidlHal; + } + IHwBinder getBinder() { validateInternalStates(); diff --git a/media/java/android/media/MediaRoute2Info.java b/media/java/android/media/MediaRoute2Info.java index 28496f135890..c5202dcd4879 100644 --- a/media/java/android/media/MediaRoute2Info.java +++ b/media/java/android/media/MediaRoute2Info.java @@ -108,133 +108,148 @@ public final class MediaRoute2Info implements Parcelable { public static final int PLAYBACK_VOLUME_VARIABLE = 1; /** @hide */ - @IntDef({ - TYPE_UNKNOWN, TYPE_BUILTIN_SPEAKER, TYPE_WIRED_HEADSET, - TYPE_WIRED_HEADPHONES, TYPE_BLUETOOTH_A2DP, TYPE_HDMI, TYPE_USB_DEVICE, - TYPE_USB_ACCESSORY, TYPE_DOCK, TYPE_USB_HEADSET, TYPE_HEARING_AID, TYPE_BLE_HEADSET, - TYPE_REMOTE_TV, TYPE_REMOTE_SPEAKER, TYPE_GROUP}) + @IntDef( + prefix = {"TYPE_"}, + value = { + TYPE_UNKNOWN, + TYPE_BUILTIN_SPEAKER, + TYPE_WIRED_HEADSET, + TYPE_WIRED_HEADPHONES, + TYPE_BLUETOOTH_A2DP, + TYPE_HDMI, + TYPE_USB_DEVICE, + TYPE_USB_ACCESSORY, + TYPE_DOCK, + TYPE_USB_HEADSET, + TYPE_HEARING_AID, + TYPE_BLE_HEADSET, + TYPE_REMOTE_TV, + TYPE_REMOTE_SPEAKER, + TYPE_REMOTE_AUDIO_VIDEO_RECEIVER, + TYPE_GROUP + }) @Retention(RetentionPolicy.SOURCE) public @interface Type {} /** - * The default route type indicating the type is unknown. + * Indicates the route's type is unknown or undefined. * * @see #getType - * @hide */ public static final int TYPE_UNKNOWN = 0; /** - * A route type describing the speaker system (i.e. a mono speaker or stereo speakers) built - * in a device. + * Indicates the route is the speaker system (i.e. a mono speaker or stereo speakers) built into + * the device. * * @see #getType - * @hide */ public static final int TYPE_BUILTIN_SPEAKER = AudioDeviceInfo.TYPE_BUILTIN_SPEAKER; /** - * A route type describing a headset, which is the combination of a headphones and microphone. + * Indicates the route is a headset, which is the combination of a headphones and a microphone. * * @see #getType - * @hide */ public static final int TYPE_WIRED_HEADSET = AudioDeviceInfo.TYPE_WIRED_HEADSET; /** - * A route type describing a pair of wired headphones. + * Indicates the route is a pair of wired headphones. * * @see #getType - * @hide */ public static final int TYPE_WIRED_HEADPHONES = AudioDeviceInfo.TYPE_WIRED_HEADPHONES; /** - * A route type indicating the presentation of the media is happening - * on a bluetooth device such as a bluetooth speaker. + * Indicates the route is a bluetooth device, such as a bluetooth speaker or headphones. * * @see #getType - * @hide */ public static final int TYPE_BLUETOOTH_A2DP = AudioDeviceInfo.TYPE_BLUETOOTH_A2DP; /** - * A route type describing an HDMI connection. + * Indicates the route is an HDMI connection. * * @see #getType - * @hide */ public static final int TYPE_HDMI = AudioDeviceInfo.TYPE_HDMI; /** - * A route type describing a USB audio device. + * Indicates the route is a USB audio device. * * @see #getType - * @hide */ public static final int TYPE_USB_DEVICE = AudioDeviceInfo.TYPE_USB_DEVICE; /** - * A route type describing a USB audio device in accessory mode. + * Indicates the route is a USB audio device in accessory mode. * * @see #getType - * @hide */ public static final int TYPE_USB_ACCESSORY = AudioDeviceInfo.TYPE_USB_ACCESSORY; /** - * A route type describing the audio device associated with a dock. + * Indicates the route is the audio device associated with a dock. * * @see #getType - * @hide */ public static final int TYPE_DOCK = AudioDeviceInfo.TYPE_DOCK; /** - * A device type describing a USB audio headset. + * Indicates the route is a USB audio headset. * * @see #getType - * @hide */ public static final int TYPE_USB_HEADSET = AudioDeviceInfo.TYPE_USB_HEADSET; /** - * A route type describing a Hearing Aid. + * Indicates the route is a hearing aid. * * @see #getType - * @hide */ public static final int TYPE_HEARING_AID = AudioDeviceInfo.TYPE_HEARING_AID; /** - * A route type describing a BLE HEADSET. + * Indicates the route is a Bluetooth Low Energy (BLE) HEADSET. * * @see #getType - * @hide */ public static final int TYPE_BLE_HEADSET = AudioDeviceInfo.TYPE_BLE_HEADSET; /** - * A route type indicating the presentation of the media is happening on a TV. + * Indicates the route is a remote TV. + * + * <p>A remote device uses a routing protocol managed by the application, as opposed to the + * routing being done by the system. * * @see #getType - * @hide */ public static final int TYPE_REMOTE_TV = 1001; /** - * A route type indicating the presentation of the media is happening on a speaker. + * Indicates the route is a remote speaker. + * + * <p>A remote device uses a routing protocol managed by the application, as opposed to the + * routing being done by the system. * * @see #getType - * @hide */ public static final int TYPE_REMOTE_SPEAKER = 1002; /** - * A route type indicating the presentation of the media is happening on multiple devices. + * Indicates the route is a remote Audio/Video Receiver (AVR). + * + * <p>A remote device uses a routing protocol managed by the application, as opposed to the + * routing being done by the system. + * + * @see #getType + */ + public static final int TYPE_REMOTE_AUDIO_VIDEO_RECEIVER = 1003; + + /** + * Indicates the route is a group of devices. * * @see #getType - * @hide */ public static final int TYPE_GROUP = 2000; @@ -436,16 +451,23 @@ public final class MediaRoute2Info implements Parcelable { } /** - * Gets the type of this route. + * Returns the type of this route. * - * @return The type of this route: - * {@link #TYPE_UNKNOWN}, - * {@link #TYPE_BUILTIN_SPEAKER}, {@link #TYPE_WIRED_HEADSET}, {@link #TYPE_WIRED_HEADPHONES}, - * {@link #TYPE_BLUETOOTH_A2DP}, {@link #TYPE_HDMI}, {@link #TYPE_DOCK}, - * {@Link #TYPE_USB_DEVICE}, {@link #TYPE_USB_ACCESSORY}, {@link #TYPE_USB_HEADSET} - * {@link #TYPE_HEARING_AID}, - * {@link #TYPE_REMOTE_TV}, {@link #TYPE_REMOTE_SPEAKER}, {@link #TYPE_GROUP}. - * @hide + * @see #TYPE_UNKNOWN + * @see #TYPE_BUILTIN_SPEAKER + * @see #TYPE_WIRED_HEADSET + * @see #TYPE_WIRED_HEADPHONES + * @see #TYPE_BLUETOOTH_A2DP + * @see #TYPE_HDMI + * @see #TYPE_DOCK + * @see #TYPE_USB_DEVICE + * @see #TYPE_USB_ACCESSORY + * @see #TYPE_USB_HEADSET + * @see #TYPE_HEARING_AID + * @see #TYPE_REMOTE_TV + * @see #TYPE_REMOTE_SPEAKER + * @see #TYPE_REMOTE_AUDIO_VIDEO_RECEIVER + * @see #TYPE_GROUP */ @Type public int getType() { @@ -657,6 +679,7 @@ public final class MediaRoute2Info implements Parcelable { pw.println(indent + "mId=" + mId); pw.println(indent + "mName=" + mName); pw.println(indent + "mFeatures=" + mFeatures); + pw.println(indent + "mType=" + getDeviceTypeString(mType)); pw.println(indent + "mIsSystem=" + mIsSystem); pw.println(indent + "mIconUri=" + mIconUri); pw.println(indent + "mDescription=" + mDescription); @@ -787,6 +810,42 @@ public final class MediaRoute2Info implements Parcelable { dest.writeString8Array(mAllowedPackages.toArray(new String[0])); } + private static String getDeviceTypeString(@Type int deviceType) { + switch (deviceType) { + case TYPE_BUILTIN_SPEAKER: + return "BUILTIN_SPEAKER"; + case TYPE_WIRED_HEADSET: + return "WIRED_HEADSET"; + case TYPE_WIRED_HEADPHONES: + return "WIRED_HEADPHONES"; + case TYPE_BLUETOOTH_A2DP: + return "BLUETOOTH_A2DP"; + case TYPE_HDMI: + return "HDMI"; + case TYPE_DOCK: + return "DOCK"; + case TYPE_USB_DEVICE: + return "USB_DEVICE"; + case TYPE_USB_ACCESSORY: + return "USB_ACCESSORY"; + case TYPE_USB_HEADSET: + return "USB_HEADSET"; + case TYPE_HEARING_AID: + return "HEARING_AID"; + case TYPE_REMOTE_TV: + return "REMOTE_TV"; + case TYPE_REMOTE_SPEAKER: + return "REMOTE_SPEAKER"; + case TYPE_REMOTE_AUDIO_VIDEO_RECEIVER: + return "REMOTE_AUDIO_VIDEO_RECEIVER"; + case TYPE_GROUP: + return "GROUP"; + case TYPE_UNKNOWN: + default: + return TextUtils.formatSimple("UNKNOWN(%d)", deviceType); + } + } + /** * Builder for {@link MediaRoute2Info media route info}. */ @@ -932,7 +991,8 @@ public final class MediaRoute2Info implements Parcelable { /** * Sets the route's type. - * @hide + * + * @see MediaRoute2Info#getType() */ @NonNull public Builder setType(@Type int type) { diff --git a/media/java/android/media/RouteListingPreference.java b/media/java/android/media/RouteListingPreference.java index ab785367a507..6caedda56689 100644 --- a/media/java/android/media/RouteListingPreference.java +++ b/media/java/android/media/RouteListingPreference.java @@ -259,7 +259,7 @@ public final class RouteListingPreference implements Parcelable { @IntDef( flag = true, prefix = {"FLAG_"}, - value = {FLAG_ONGOING_SESSION, FLAG_SUGGESTED_ROUTE, FLAG_ONGOING_SESSION_MANAGED}) + value = {FLAG_ONGOING_SESSION, FLAG_SUGGESTED, FLAG_ONGOING_SESSION_MANAGED}) public @interface Flags {} /** @@ -292,7 +292,7 @@ public final class RouteListingPreference implements Parcelable { * number supported by the UI, the routes listed first in {@link * RouteListingPreference#getItems()} will take priority. */ - public static final int FLAG_SUGGESTED_ROUTE = 1 << 2; + public static final int FLAG_SUGGESTED = 1 << 2; /** @hide */ @Retention(RetentionPolicy.SOURCE) @@ -399,7 +399,7 @@ public final class RouteListingPreference implements Parcelable { * Returns the flags associated to the route that corresponds to this item. * * @see #FLAG_ONGOING_SESSION - * @see #FLAG_SUGGESTED_ROUTE + * @see #FLAG_SUGGESTED */ @Flags public int getFlags() { diff --git a/media/java/android/media/projection/TEST_MAPPING b/media/java/android/media/projection/TEST_MAPPING index a792498b8521..4324930ab2b0 100644 --- a/media/java/android/media/projection/TEST_MAPPING +++ b/media/java/android/media/projection/TEST_MAPPING @@ -13,6 +13,20 @@ "exclude-annotation": "org.junit.Ignore" } ] + }, + { + "name": "CtsMediaProjectionTestCases", + "options": [ + { + "exclude-annotation": "android.platform.test.annotations.FlakyTest" + }, + { + "exclude-annotation": "androidx.test.filters.FlakyTest" + }, + { + "exclude-annotation": "org.junit.Ignore" + } + ] } ] } diff --git a/media/java/android/media/tv/ITvInputSessionWrapper.java b/media/java/android/media/tv/ITvInputSessionWrapper.java index 46573f2118c3..465b617db1f4 100644 --- a/media/java/android/media/tv/ITvInputSessionWrapper.java +++ b/media/java/android/media/tv/ITvInputSessionWrapper.java @@ -77,6 +77,7 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand private static final int DO_NOTIFY_AD_BUFFER = 28; private static final int DO_SELECT_AUDIO_PRESENTATION = 29; private static final int DO_TIME_SHIFT_SET_MODE = 30; + private static final int DO_SET_TV_MESSAGE_ENABLED = 31; private final boolean mIsRecordingSession; private final HandlerCaller mCaller; @@ -263,6 +264,11 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand mTvInputSessionImpl.setInteractiveAppNotificationEnabled((Boolean) msg.obj); break; } + case DO_SET_TV_MESSAGE_ENABLED: { + SomeArgs args = (SomeArgs) msg.obj; + mTvInputSessionImpl.setTvMessageEnabled((String) args.arg1, (Boolean) args.arg2); + break; + } case DO_REQUEST_AD: { mTvInputSessionImpl.requestAd((AdRequest) msg.obj); break; diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java index 67d28d04fa8d..de1b1640ad45 100644 --- a/media/java/android/media/tv/TvInputManager.java +++ b/media/java/android/media/tv/TvInputManager.java @@ -133,18 +133,15 @@ public final class TvInputManager { VIDEO_UNAVAILABLE_REASON_CAS_REBOOTING, VIDEO_UNAVAILABLE_REASON_CAS_UNKNOWN}) public @interface VideoUnavailableReason {} - /** - * @hide - */ + /** Indicates that this TV message contains watermarking data */ public static final String TV_MESSAGE_TYPE_WATERMARK = "Watermark"; - /** - * @hide - */ - public static final String TV_MESSAGE_TYPE_ATSC_CC = "ATSC_CC"; + + /** Indicates that this TV message contains Closed Captioning data */ + public static final String TV_MESSAGE_TYPE_CLOSED_CAPTION = "CC"; /** @hide */ @Retention(RetentionPolicy.SOURCE) - @StringDef({TV_MESSAGE_TYPE_WATERMARK, TV_MESSAGE_TYPE_ATSC_CC}) + @StringDef({TV_MESSAGE_TYPE_WATERMARK, TV_MESSAGE_TYPE_CLOSED_CAPTION}) public @interface TvMessageType {} static final int VIDEO_UNAVAILABLE_REASON_START = 0; @@ -792,11 +789,11 @@ public final class TvInputManager { } /** - * This is called when the session receives a new Tv Message + * This is called when the session receives a new TV Message * - * @param type the type of {@link TvMessageType} - * @param data the raw data of the message - * @hide + * @param session A {@link TvInputManager.Session} associated with this callback. + * @param type The type of message received, such as {@link #TV_MESSAGE_TYPE_WATERMARK} + * @param data The raw data of the message */ public void onTvMessage(Session session, @TvInputManager.TvMessageType String type, Bundle data) { diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java index 8166114a90bf..000ed3b0758e 100644 --- a/media/java/android/media/tv/TvInputService.java +++ b/media/java/android/media/tv/TvInputService.java @@ -1025,6 +1025,31 @@ public abstract class TvInputService extends Service { }); } + /** + * Sends the raw data from the received TV message as well as the type of message received. + * + * @param type The of message that was sent, such as + * {@link TvInputManager#TV_MESSAGE_TYPE_WATERMARK} + * @param data The data sent with the message. + */ + public void notifyTvMessage(@NonNull @TvInputManager.TvMessageType String type, + @NonNull Bundle data) { + executeOrPostRunnableOnMainThread(new Runnable() { + @MainThread + @Override + public void run() { + try { + if (DEBUG) Log.d(TAG, "notifyTvMessage"); + if (mSessionCallback != null) { + mSessionCallback.onTvMessage(type, data); + } + } catch (RemoteException e) { + Log.w(TAG, "error in notifyTvMessage", e); + } + } + }); + } + private void notifyTimeShiftStartPositionChanged(final long timeMs) { executeOrPostRunnableOnMainThread(new Runnable() { @MainThread @@ -1458,6 +1483,17 @@ public abstract class TvInputService extends Service { } /** + * Called when the application enables or disables the detection of the specified message + * type. + * @param type The {@link TvInputManager.TvMessageType} of message that was sent. + * @param enabled {@code true} if TV message detection is enabled, + * {@code false} otherwise. + */ + public void onSetTvMessageEnabled(@NonNull @TvInputManager.TvMessageType String type, + boolean enabled){ + } + + /** * Called when the application requests to play a given recorded TV program. * * @param recordedProgramUri The URI of a recorded TV program. @@ -1809,6 +1845,13 @@ public abstract class TvInputService extends Service { } /** + * Calls {@link #onSetTvMessageEnabled(String, boolean)}. + */ + void setTvMessageEnabled(String type, boolean enabled) { + onSetTvMessageEnabled(type, enabled); + } + + /** * Calls {@link #onAppPrivateCommand}. */ void appPrivateCommand(String action, Bundle data) { @@ -2278,27 +2321,6 @@ public abstract class TvInputService extends Service { } /** - * Informs the application of the raw data from the TV message. - * @param type The {@link TvInputManager.TvMessageType} of message that was sent. - * @param data The data sent with the message. - * @hide - */ - public void notifyTvMessage(@TvInputManager.TvMessageType String type, Bundle data) { - } - - /** - * Called when the application enables or disables the detection of the specified message - * type. - * @param type The {@link TvInputManager.TvMessageType} of message that was sent. - * @param enabled {@code true} if you want to enable TV message detecting - * {@code false} otherwise. - * @hide - */ - public void onSetTvMessageEnabled(@TvInputManager.TvMessageType String type, - boolean enabled) { - } - - /** * Called when the application requests to tune to a given channel for TV program recording. * * <p>The application may call this method before starting or after stopping recording, but diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java index 3864983bd179..372fa6d53b4c 100644 --- a/media/java/android/media/tv/TvView.java +++ b/media/java/android/media/tv/TvView.java @@ -722,14 +722,14 @@ public class TvView extends ViewGroup { } /** - * Enables or disables TV message detecting in the streams of bound TV input. + * Enables or disables TV message detection in the stream of the bound TV input. * * @param type The type of {@link android.media.tv.TvInputManager.TvMessageType} - * @param enabled {@code true} if you want to enable TV message detecting + * @param enabled {@code true} if you want to enable TV message detection * {@code false} otherwise. - * @hide */ - public void setTvMessageEnabled(@TvInputManager.TvMessageType String type, boolean enabled) { + public void setTvMessageEnabled(@NonNull @TvInputManager.TvMessageType String type, + boolean enabled) { } @Override @@ -1233,14 +1233,14 @@ public class TvView extends ViewGroup { } /** - * This is called when the session has been tuned to the given channel. + * This is called when a new TV Message has been received. * + * @param inputId The ID of the TV input bound to this view. * @param type The type of {@link android.media.tv.TvInputManager.TvMessageType} * @param data The raw data of the message - * @hide */ - public void onTvMessage(@NonNull String inputId, @TvInputManager.TvMessageType String type, - Bundle data) { + public void onTvMessage(@NonNull String inputId, + @NonNull @TvInputManager.TvMessageType String type, @NonNull Bundle data) { } } diff --git a/media/java/android/media/tv/interactive/ITvInteractiveAppSessionWrapper.java b/media/java/android/media/tv/interactive/ITvInteractiveAppSessionWrapper.java index fa339ce435a2..f009ceab0a75 100644 --- a/media/java/android/media/tv/interactive/ITvInteractiveAppSessionWrapper.java +++ b/media/java/android/media/tv/interactive/ITvInteractiveAppSessionWrapper.java @@ -521,7 +521,7 @@ public class ITvInteractiveAppSessionWrapper @Override public void notifyTvMessage(String type, Bundle data) { mCaller.executeOrSendMessage( - mCaller.obtainMessageOO(DO_NOTIFY_TRACK_SELECTED, type, data)); + mCaller.obtainMessageOO(DO_NOTIFY_TV_MESSAGE, type, data)); } @Override diff --git a/media/java/android/media/tv/interactive/TvInteractiveAppService.java b/media/java/android/media/tv/interactive/TvInteractiveAppService.java index 8b85fa189ac9..999ff0d1ad73 100755 --- a/media/java/android/media/tv/interactive/TvInteractiveAppService.java +++ b/media/java/android/media/tv/interactive/TvInteractiveAppService.java @@ -903,10 +903,14 @@ public abstract class TvInteractiveAppService extends Service { } /** - * Called when a tv message is received - * @hide + * Called when a TV message is received + * + * @param type The type of message received, such as + * {@link TvInputManager#TV_MESSAGE_TYPE_WATERMARK} + * @param data The raw data of the message */ - public void onTvMessage(@NonNull String type, @NonNull Bundle data) { + public void onTvMessage(@NonNull @TvInputManager.TvMessageType String type, + @NonNull Bundle data) { } @Override diff --git a/media/java/android/media/tv/interactive/TvInteractiveAppView.java b/media/java/android/media/tv/interactive/TvInteractiveAppView.java index 0b44a890f7cc..29a96f7bdc49 100755 --- a/media/java/android/media/tv/interactive/TvInteractiveAppView.java +++ b/media/java/android/media/tv/interactive/TvInteractiveAppView.java @@ -918,6 +918,25 @@ public class TvInteractiveAppView extends ViewGroup { } } + /** + * This is called to notify the corresponding interactive app service when a new TV message + * is received. + * + * @param type The type of message received, such as + * {@link TvInputManager#TV_MESSAGE_TYPE_WATERMARK} + * @param data The raw data of the message + */ + public void notifyTvMessage(@NonNull @TvInputManager.TvMessageType String type, + @NonNull Bundle data) { + if (DEBUG) { + Log.d(TAG, "notifyTvMessage type=" + type + + "; data=" + data); + } + if (mSession != null) { + mSession.notifyTvMessage(type, data); + } + } + private void resetInternal() { mSessionCallback = null; if (mSession != null) { diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt index 6ea1d8d522f9..7b8175973faf 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt @@ -64,7 +64,7 @@ class CredentialManagerRepo( requestInfo = intent.extras?.getParcelable( RequestInfo.EXTRA_REQUEST_INFO, RequestInfo::class.java - ) ?: testCreatePasswordRequestInfo() + ) ?: testGetRequestInfo() providerEnabledList = when (requestInfo.type) { RequestInfo.TYPE_CREATE -> @@ -240,8 +240,10 @@ class CredentialManagerRepo( "Elisa Beckett", Instant.ofEpochSecond(500L) ), ) - ).setAuthenticationEntry( - GetTestUtils.newAuthenticationEntry(context, "key2", "subkey-1") + ).setAuthenticationEntries( + listOf<Entry>( + GetTestUtils.newAuthenticationEntry(context, "key2", "subkey-1"), + ) ).setActionChips( listOf( GetTestUtils.newActionEntry( @@ -268,8 +270,10 @@ class CredentialManagerRepo( Instant.ofEpochSecond(11000L) ), ) - ).setAuthenticationEntry( - GetTestUtils.newAuthenticationEntry(context, "key2", "subkey-1") + ).setAuthenticationEntries( + listOf<Entry>( + GetTestUtils.newAuthenticationEntry(context, "key2", "subkey-1"), + ) ).setActionChips( listOf( GetTestUtils.newActionEntry( diff --git a/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt b/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt index d8420cdd7ff1..df5bd046d5ac 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt @@ -147,12 +147,11 @@ class GetFlowUtils { credentialEntryList = getCredentialOptionInfoList( it.providerFlattenedComponentName, it.credentialEntries, context ), - authenticationEntry = getAuthenticationEntry( - it.providerFlattenedComponentName, - providerLabel, - providerIcon, - it.authenticationEntry - ), + authenticationEntryList = getAuthenticationEntryList( + it.providerFlattenedComponentName, + providerLabel, + providerIcon, + it.authenticationEntries), remoteEntry = getRemoteEntry( it.providerFlattenedComponentName, it.remoteEntry @@ -198,7 +197,7 @@ class GetFlowUtils { credentialTypeDisplayName = credentialEntry.typeDisplayName.toString(), userName = credentialEntry.username.toString(), displayName = credentialEntry.displayName?.toString(), - icon = credentialEntry.icon.loadDrawable(context), + icon = credentialEntry.icon?.loadDrawable(context), lastUsedTimeMillis = credentialEntry.lastUsedTime, )) } @@ -213,7 +212,7 @@ class GetFlowUtils { credentialTypeDisplayName = credentialEntry.typeDisplayName.toString(), userName = credentialEntry.username.toString(), displayName = credentialEntry.displayName?.toString(), - icon = credentialEntry.icon.loadDrawable(context), + icon = credentialEntry.icon?.loadDrawable(context), lastUsedTimeMillis = credentialEntry.lastUsedTime, )) } @@ -228,7 +227,7 @@ class GetFlowUtils { credentialTypeDisplayName = credentialEntry.typeDisplayName.toString(), userName = credentialEntry.title.toString(), displayName = credentialEntry.subtitle?.toString(), - icon = credentialEntry.icon.loadDrawable(context), + icon = credentialEntry.icon?.loadDrawable(context), lastUsedTimeMillis = credentialEntry.lastUsedTime, )) } @@ -256,18 +255,19 @@ class GetFlowUtils { } } - private fun getAuthenticationEntry( + private fun getAuthenticationEntryList( providerId: String, providerDisplayName: String, providerIcon: Drawable, - authEntry: Entry?, - ): AuthenticationEntryInfo? { - if (authEntry == null) { - return null - } + authEntryList: List<Entry>, + ): List<AuthenticationEntryInfo> { + if (authEntryList.isEmpty()) { + return listOf() + } + val authEntry = authEntryList[0] val structuredAuthEntry = - AuthenticationAction.fromSlice(authEntry.slice) ?: return null - return AuthenticationEntryInfo( + AuthenticationAction.fromSlice(authEntry.slice) ?: return listOf() + return listOf(AuthenticationEntryInfo( providerId = providerId, entryKey = authEntry.key, entrySubkey = authEntry.subkey, @@ -275,7 +275,7 @@ class GetFlowUtils { fillInIntent = authEntry.frameworkExtrasIntent, title = providerDisplayName, icon = providerIcon, - ) + )) } private fun getRemoteEntry(providerId: String, remoteEntry: Entry?): RemoteEntryInfo? { diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/material/ModalBottomSheet.kt b/packages/CredentialManager/src/com/android/credentialmanager/common/material/ModalBottomSheet.kt index f1f453da4f38..58edb25336f8 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/common/material/ModalBottomSheet.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/common/material/ModalBottomSheet.kt @@ -28,6 +28,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.sizeIn import androidx.compose.foundation.layout.offset import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface @@ -40,6 +41,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.Saver import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape @@ -131,7 +133,7 @@ class ModalBottomSheetState( if (isSkipHalfExpanded) { require(initialValue != HalfExpanded) { "The initial value must not be set to HalfExpanded if skipHalfExpanded is set to" + - " true." + " true." } } } @@ -209,10 +211,10 @@ class ModalBottomSheetState( message = "Please specify the skipHalfExpanded parameter", replaceWith = ReplaceWith( "ModalBottomSheetState.Saver(" + - "animationSpec = animationSpec," + - "skipHalfExpanded = ," + - "confirmStateChange = confirmStateChange" + - ")" + "animationSpec = animationSpec," + + "skipHalfExpanded = ," + + "confirmStateChange = confirmStateChange" + + ")" ) ) fun Saver( @@ -339,55 +341,77 @@ fun ModalBottomSheetLayout( visible = sheetState.targetValue != Hidden ) } - Surface( - Modifier - .fillMaxWidth() - .nestedScroll(sheetState.nestedScrollConnection) - .offset { - val y = if (sheetState.anchors.isEmpty()) { - // if we don't know our anchors yet, render the sheet as hidden - fullHeight.roundToInt() - } else { - // if we do know our anchors, respect them - sheetState.offset.value.roundToInt() - } - IntOffset(0, y) - } - .bottomSheetSwipeable(sheetState, fullHeight, sheetHeightState) - .onGloballyPositioned { - sheetHeightState.value = it.size.height.toFloat() - } - .semantics { - if (sheetState.isVisible) { - dismiss { - if (sheetState.confirmStateChange(Hidden)) { - scope.launch { sheetState.hide() } - } - true + + // For large screen, allow enough horizontal scrim space. + // Manually calculate the > compact width due to lack of corresponding jetpack dependency. + val maxSheetContentWidth: Dp = + if (maxWidth >= ModalBottomSheetDefaults.MaxCompactWidth && + maxWidth <= ModalBottomSheetDefaults.MaxCompactWidth + + ModalBottomSheetDefaults.StartPadding + ModalBottomSheetDefaults.EndPadding + ) + (maxWidth - ModalBottomSheetDefaults.StartPadding - + ModalBottomSheetDefaults.EndPadding) + else ModalBottomSheetDefaults.MaxSheetWidth + val maxSheetContentHeight = maxHeight - ModalBottomSheetDefaults.MinScrimHeight + Box( + Modifier.sizeIn( + maxWidth = maxSheetContentWidth, + // Allow enough vertical scrim space. + maxHeight = maxSheetContentHeight + ).align(Alignment.TopCenter) + ) { + Surface( + Modifier + .fillMaxWidth() + .nestedScroll(sheetState.nestedScrollConnection) + .offset { + val y = if (sheetState.anchors.isEmpty()) { + // if we don't know our anchors yet, render the sheet as hidden + fullHeight.roundToInt() + } else { + // if we do know our anchors, respect them + sheetState.offset.value.roundToInt() } - if (sheetState.currentValue == HalfExpanded) { - expand { - if (sheetState.confirmStateChange(Expanded)) { - scope.launch { sheetState.expand() } + IntOffset(0, y) + } + .bottomSheetSwipeable(sheetState, fullHeight, sheetHeightState) + .onGloballyPositioned { + sheetHeightState.value = it.size.height.toFloat() + } + .semantics { + if (sheetState.isVisible) { + dismiss { + if (sheetState.confirmStateChange(Hidden)) { + scope.launch { sheetState.hide() } } true } - } else if (sheetState.hasHalfExpandedState) { - collapse { - if (sheetState.confirmStateChange(HalfExpanded)) { - scope.launch { sheetState.halfExpand() } + if (sheetState.currentValue == HalfExpanded) { + expand { + if (sheetState.confirmStateChange(Expanded)) { + scope.launch { sheetState.expand() } + } + true + } + } else if (sheetState.hasHalfExpandedState) { + collapse { + if (sheetState.confirmStateChange(HalfExpanded)) { + scope.launch { sheetState.halfExpand() } + } + true } - true } } - } - }, - shape = sheetShape, - shadowElevation = sheetElevation, - color = sheetBackgroundColor, - contentColor = sheetContentColor - ) { - Column(content = sheetContent) + }, + shape = sheetShape, + shadowElevation = sheetElevation, + color = sheetBackgroundColor, + contentColor = sheetContentColor + ) { + Column( + content = sheetContent + ) + } } } } @@ -465,6 +489,11 @@ private fun Scrim( * Contains useful Defaults for [ModalBottomSheetLayout]. */ object ModalBottomSheetDefaults { + val MaxCompactWidth = 600.dp + val MaxSheetWidth = 640.dp + val MinScrimHeight = 56.dp + val StartPadding = 56.dp + val EndPadding = 56.dp /** * The default elevation used by [ModalBottomSheetLayout]. diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/BottomSheet.kt b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/BottomSheet.kt new file mode 100644 index 000000000000..c4d96ccf51f8 --- /dev/null +++ b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/BottomSheet.kt @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.credentialmanager.common.ui + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import com.android.credentialmanager.common.material.ModalBottomSheetLayout +import com.android.credentialmanager.common.material.ModalBottomSheetValue +import com.android.credentialmanager.common.material.rememberModalBottomSheetState +import com.android.credentialmanager.ui.theme.EntryShape + +/** Draws a modal bottom sheet with the same styles and effects shared by various flows. */ +@Composable +fun ModalBottomSheet( + sheetContent: @Composable ColumnScope.() -> Unit, + onDismiss: () -> Unit +) { + val state = rememberModalBottomSheetState( + initialValue = ModalBottomSheetValue.Expanded, + skipHalfExpanded = true + ) + ModalBottomSheetLayout( + sheetBackgroundColor = MaterialTheme.colorScheme.surface, + modifier = Modifier.background(Color.Transparent), + sheetState = state, + sheetContent = sheetContent, + scrimColor = MaterialTheme.colorScheme.scrim.copy(alpha = 0.8f), + sheetShape = EntryShape.TopRoundedCorner, + ) {} + LaunchedEffect(state.currentValue) { + if (state.currentValue == ModalBottomSheetValue.Hidden) { + onDismiss() + } + } +}
\ No newline at end of file diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/Cards.kt b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/Cards.kt index aaabce36c003..85e5c1ee69d5 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/Cards.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/Cards.kt @@ -18,9 +18,9 @@ package com.android.credentialmanager.common.ui import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -30,7 +30,6 @@ import androidx.compose.ui.graphics.Shape * By default the card is filled with surfaceVariant color. This container card instead fills the * background color with surface corlor. */ -@OptIn(ExperimentalMaterial3Api::class) @Composable fun ContainerCard( modifier: Modifier = Modifier, @@ -39,7 +38,7 @@ fun ContainerCard( content: @Composable ColumnScope.() -> Unit, ) { Card( - modifier = modifier, + modifier = modifier.fillMaxWidth(), shape = shape, border = border, colors = CardDefaults.cardColors( diff --git a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt index 0b9e57821d12..216428c3c10c 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/createflow/CreateCredentialComponents.kt @@ -45,18 +45,15 @@ import androidx.core.graphics.drawable.toBitmap import com.android.credentialmanager.R import com.android.credentialmanager.common.CredentialType import com.android.credentialmanager.common.ProviderActivityState -import com.android.credentialmanager.common.material.ModalBottomSheetLayout -import com.android.credentialmanager.common.material.ModalBottomSheetValue -import com.android.credentialmanager.common.material.rememberModalBottomSheetState import com.android.credentialmanager.common.ui.ActionButton import com.android.credentialmanager.common.ui.ConfirmButton import com.android.credentialmanager.common.ui.Entry +import com.android.credentialmanager.common.ui.ModalBottomSheet import com.android.credentialmanager.common.ui.TextOnSurface import com.android.credentialmanager.common.ui.TextSecondary import com.android.credentialmanager.common.ui.TextOnSurfaceVariant import com.android.credentialmanager.common.ui.ContainerCard import com.android.credentialmanager.common.ui.ToggleVisibilityButton -import com.android.credentialmanager.ui.theme.EntryShape import com.android.credentialmanager.ui.theme.LocalAndroidColorScheme @OptIn(ExperimentalMaterial3Api::class) @@ -65,13 +62,7 @@ fun CreateCredentialScreen( viewModel: CreateCredentialViewModel, providerActivityLauncher: ManagedActivityResultLauncher<IntentSenderRequest, ActivityResult> ) { - val state = rememberModalBottomSheetState( - initialValue = ModalBottomSheetValue.Expanded, - skipHalfExpanded = true - ) - ModalBottomSheetLayout( - sheetBackgroundColor = MaterialTheme.colorScheme.surface, - sheetState = state, + ModalBottomSheet( sheetContent = { val uiState = viewModel.uiState // Hide the sheet content as opposed to the whole bottom sheet to maintain the scrim @@ -153,14 +144,8 @@ fun CreateCredentialScreen( } } }, - scrimColor = MaterialTheme.colorScheme.scrim.copy(alpha = 0.8f), - sheetShape = EntryShape.TopRoundedCorner, - ) {} - LaunchedEffect(state.currentValue) { - if (state.currentValue == ModalBottomSheetValue.Hidden) { - viewModel.onCancel() - } - } + onDismiss = viewModel::onCancel + ) } @OptIn(ExperimentalMaterial3Api::class) diff --git a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt index a5e19b69e470..59d2f4dd8936 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialComponents.kt @@ -22,7 +22,6 @@ import androidx.activity.result.ActivityResult import androidx.activity.result.IntentSenderRequest import androidx.compose.foundation.Image -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -60,12 +59,10 @@ import androidx.core.graphics.drawable.toBitmap import com.android.credentialmanager.R import com.android.credentialmanager.common.CredentialType import com.android.credentialmanager.common.ProviderActivityState -import com.android.credentialmanager.common.material.ModalBottomSheetLayout -import com.android.credentialmanager.common.material.ModalBottomSheetValue -import com.android.credentialmanager.common.material.rememberModalBottomSheetState import com.android.credentialmanager.common.ui.ActionButton import com.android.credentialmanager.common.ui.ConfirmButton import com.android.credentialmanager.common.ui.Entry +import com.android.credentialmanager.common.ui.ModalBottomSheet import com.android.credentialmanager.common.ui.TextOnSurface import com.android.credentialmanager.common.ui.TextSecondary import com.android.credentialmanager.common.ui.TextOnSurfaceVariant @@ -79,16 +76,9 @@ fun GetCredentialScreen( viewModel: GetCredentialViewModel, providerActivityLauncher: ManagedActivityResultLauncher<IntentSenderRequest, ActivityResult> ) { - val state = rememberModalBottomSheetState( - initialValue = ModalBottomSheetValue.Expanded, - skipHalfExpanded = true - ) val uiState = viewModel.uiState if (uiState.currentScreenState != GetScreenState.REMOTE_ONLY) { - ModalBottomSheetLayout( - sheetBackgroundColor = MaterialTheme.colorScheme.surface, - modifier = Modifier.background(Color.Transparent), - sheetState = state, + ModalBottomSheet( sheetContent = { // Hide the sheet content as opposed to the whole bottom sheet to maintain the scrim // background color even when the content should be hidden while waiting for @@ -128,14 +118,8 @@ fun GetCredentialScreen( } } }, - scrimColor = MaterialTheme.colorScheme.scrim.copy(alpha = 0.8f), - sheetShape = EntryShape.TopRoundedCorner, - ) {} - LaunchedEffect(state.currentValue) { - if (state.currentValue == ModalBottomSheetValue.Hidden) { - viewModel.onCancel() - } - } + onDismiss = viewModel::onCancel, + ) } else { SnackBarScreen( onClick = viewModel::onMoreOptionOnSnackBarSelected, diff --git a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialViewModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialViewModel.kt index 5741f368f4f6..8148082e58e6 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialViewModel.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetCredentialViewModel.kt @@ -170,8 +170,9 @@ private fun toProviderDisplayInfo( val authenticationEntryList = mutableListOf<AuthenticationEntryInfo>() val remoteEntryList = mutableListOf<RemoteEntryInfo>() providerInfoList.forEach { providerInfo -> - if (providerInfo.authenticationEntry != null) { - authenticationEntryList.add(providerInfo.authenticationEntry) + if (providerInfo.authenticationEntryList != null && + !providerInfo.authenticationEntryList.isEmpty()) { + authenticationEntryList.add(providerInfo.authenticationEntryList[0]) } if (providerInfo.remoteEntry != null) { remoteEntryList.add(providerInfo.remoteEntry) @@ -190,9 +191,9 @@ private fun toProviderDisplayInfo( } } } - // There can only be at most one remote entry - // TODO: fail elegantly - Preconditions.checkState(remoteEntryList.size <= 1) + // There can only be at most one remote entry + // TODO: fail elegantly + Preconditions.checkState(remoteEntryList.size <= 1) // Compose sortedUserNameToCredentialEntryList val comparator = CredentialEntryInfoComparatorByTypeThenTimestamp() @@ -241,7 +242,8 @@ private fun toGetScreenState( var remoteInfo: RemoteEntryInfo? = null providerInfoList.forEach { providerInfo -> if (providerInfo.credentialEntryList.isNotEmpty() || - providerInfo.authenticationEntry != null) { + (providerInfo.authenticationEntryList != null && + !providerInfo.authenticationEntryList.isEmpty())) { noLocalAccount = false } // TODO: handle the error situation that if multiple remoteInfos exists diff --git a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt index 4c05dea5c13e..b3183493d650 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/getflow/GetModel.kt @@ -32,7 +32,7 @@ data class ProviderInfo( val icon: Drawable, val displayName: String, val credentialEntryList: List<CredentialEntryInfo>, - val authenticationEntry: AuthenticationEntryInfo?, + val authenticationEntryList: List<AuthenticationEntryInfo>, val remoteEntry: RemoteEntryInfo?, val actionEntryList: List<ActionEntryInfo>, ) diff --git a/packages/PackageInstaller/res/values-af/strings.xml b/packages/PackageInstaller/res/values-af/strings.xml index fd2aeb13ec7b..72fb5d6c09ae 100644 --- a/packages/PackageInstaller/res/values-af/strings.xml +++ b/packages/PackageInstaller/res/values-af/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Program geïnstalleer."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Wil jy hierdie program installeer?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Wil jy hierdie program opdateer?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Opdaterings vir hierdie app word tans deur <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> bestuur.\n\nAs jy opdateer, sal jy toekomstige opdaterings eerder van <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> af ontvang."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Opdaterings vir hierdie app word tans deur <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> bestuur.\n\nWil jy hierdie opdatering vanaf <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> installeer?"</string> <string name="install_failed" msgid="5777824004474125469">"Program nie geïnstalleer nie."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Die installering van die pakket is geblokkeer."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Program is nie geïnstalleer nie omdat pakket met \'n bestaande pakket bots."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Deïnstalleer tans <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> …"</string> <string name="uninstall_done" msgid="439354138387969269">"Deïnstallering is klaar."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Het <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> gedeïnstalleer"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Het <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-kloon uitgevee"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Deïnstallering onsuksesvol."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Kon nie <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> deïnstalleer nie."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Vee tans <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-kloon uit …"</string> diff --git a/packages/PackageInstaller/res/values-am/strings.xml b/packages/PackageInstaller/res/values-am/strings.xml index 4ebcd335bae9..378770d86f86 100644 --- a/packages/PackageInstaller/res/values-am/strings.xml +++ b/packages/PackageInstaller/res/values-am/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"መተግበሪያ ተጭኗል።"</string> <string name="install_confirm_question" msgid="7663733664476363311">"ይህን መተግበሪያ መጫን ይፈልጋሉ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ይህን መተግበሪያ ማዘመን ይፈልጋሉ?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"የዚህ መተግበሪያ ዝማኔዎች አሁን በ<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> በመተዳደር ላይ ናቸው።\n\nበማዘመንዎ የወደፊት ዝማኔዎችን በምትኩ ከ<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> ያገኛሉ።"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"የዚህ መተግበሪያ ዝማኔዎች አሁን በ<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> በመተዳደር ላይ ናቸው።\n\nይህን ዝማኔ ከ<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> መጫን ይፈልጋሉ።"</string> <string name="install_failed" msgid="5777824004474125469">"መተግበሪያ አልተጫነም።"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ጥቅሉ እንዳይጫን ታግዷል።"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"እንደ ጥቅል ያልተጫነ መተግበሪያ ከነባር ጥቅል ጋር ይጋጫል።"</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ን በማራገፍ ላይ…"</string> <string name="uninstall_done" msgid="439354138387969269">"ማራግፍ ተጠናቅቋል።"</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ተራግፏል"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"የተሰረዘ <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ብዜት"</string> <string name="uninstall_failed" msgid="1847750968168364332">"ማራገፍ አልተሳካም።"</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ን ማራገፍ ስኬታማ አልነበረም።"</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"የተባዛ <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ን በመሰረዝ ላይ…"</string> diff --git a/packages/PackageInstaller/res/values-ar/strings.xml b/packages/PackageInstaller/res/values-ar/strings.xml index 88fd1a5b4feb..c60f9500a470 100644 --- a/packages/PackageInstaller/res/values-ar/strings.xml +++ b/packages/PackageInstaller/res/values-ar/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"تم تثبيت التطبيق."</string> <string name="install_confirm_question" msgid="7663733664476363311">"هل تريد تثبيت هذا التطبيق؟"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"هل تريد تحديث هذا التطبيق؟"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"تتم إدارة تحديثات هذا التطبيق حاليًا من قِبل \"<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>\".\n\nمن خلال التحديث، ستتلقّى التحديثات المتوفّرة من \"<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>\" بدلاً من ذلك."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"تتم إدارة تحديثات هذا التطبيق حاليًا من قِبل \"<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>\".\n\nهل تريد تثبيت هذا التحديث من <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>\"؟"</string> <string name="install_failed" msgid="5777824004474125469">"التطبيق ليس مثبتًا."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"تم حظر تثبيت الحزمة."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"لم يتم تثبيت التطبيق لأن حزمة التثبيت تتعارض مع حزمة حالية."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"جارٍ إلغاء تثبيت <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"تمّ إلغاء تثبيت التطبيق."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"تم إلغاء تثبيت <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"تم حذف النسخة الطبق الأصل عن \"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>\"."</string> <string name="uninstall_failed" msgid="1847750968168364332">"تعذّر إلغاء تثبيت التطبيق."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"لم يتم إلغاء تثبيت <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> بنجاح."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"جارٍ حذف النسخة الطبق الأصل عن \"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>\"…"</string> diff --git a/packages/PackageInstaller/res/values-as/strings.xml b/packages/PackageInstaller/res/values-as/strings.xml index 401ffdb4b4c6..2b41b1e84dc0 100644 --- a/packages/PackageInstaller/res/values-as/strings.xml +++ b/packages/PackageInstaller/res/values-as/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"এপ্ ইনষ্টল কৰা হ’ল।"</string> <string name="install_confirm_question" msgid="7663733664476363311">"আপুনি এই এপ্টো ইনষ্টল কৰিবলৈ বিচাৰেনে?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"আপুনি এই এপ্টো আপডে’ট কৰিবলৈ বিচাৰেনে?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"এই এপ্টোৰ আপডে’টসমূহ বৰ্তমান <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>এ পৰিচালনা কৰি আছে।\n\nআপডে’ট কৰিলে, আপুনি ইয়াৰ পৰিবৰ্তে <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>ৰ পৰা ভৱিষ্যত আপডে’টসমূহ পাব।"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"এই এপ্টোৰ আপডে’টসমূহ বৰ্তমান <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>এ পৰিচালনা কৰি আছে।\n\nআপুনি <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>ৰ পৰা অহা এই আপডে’টটো ইনষ্টল কৰিব বিচাৰেনে?"</string> <string name="install_failed" msgid="5777824004474125469">"এপ্ ইনষ্টল কৰা হোৱা নাই।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"পেকেজটোৰ ইনষ্টল অৱৰোধ কৰা হৈছে।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"এপ্টো ইনষ্টল কৰিব পৰা নগ\'ল কাৰণ ইয়াৰ সৈতে আগৰে পৰা থকা এটা পেকেজৰ সংঘাত হৈছে।"</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> আনইনষ্টল কৰি থকা হৈছে…"</string> <string name="uninstall_done" msgid="439354138387969269">"আনইনষ্টল কৰা হ’ল।"</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> আনইনষ্টল কৰা হ’ল"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ৰ ক্ল’ন মচা হৈছে"</string> <string name="uninstall_failed" msgid="1847750968168364332">"আনইনষ্টল কৰিব পৰা নগ\'ল।"</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> আনইনষ্টল কৰিব পৰা নগ\'ল।"</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ৰ ক্ল’ন মচি থকা হৈছে…"</string> diff --git a/packages/PackageInstaller/res/values-az/strings.xml b/packages/PackageInstaller/res/values-az/strings.xml index 7d46f9dfdd1f..9e915e349766 100644 --- a/packages/PackageInstaller/res/values-az/strings.xml +++ b/packages/PackageInstaller/res/values-az/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Tətbiq quraşdırılıb."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Bu tətbiqi quraşdırmaq istəyirsiniz?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Bu tətbiqi güncəlləmək istəyirsiniz?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Bu tətbiq üzrə güncəlləmələr hazırda <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> tərəfindən idarə olunur.\n\nGüncəlləməklə, <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> adlı mənbədən gələcək güncəlləmələri əldə edəcəksiniz."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Bu tətbiq üzrə güncəlləmələr hazırda <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> tərəfindən idarə olunur.\n\n<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> adlı mənbədən bu güncəlləməni quraşdırmaq istəyirsinizmi."</string> <string name="install_failed" msgid="5777824004474125469">"Tətbiq quraşdırılmayıb."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketin quraşdırılması blok edildi."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Bu paketin mövcud paket ilə ziddiyətinə görə tətbiq quraşdırılmadı."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> sistemdən silinir…"</string> <string name="uninstall_done" msgid="439354138387969269">"Sistemdən silindi."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> sistemdən silindi"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> klonu silinib"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Sistemdən silinmədi."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> sistemdən silinmədi."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> kopya silinir…"</string> diff --git a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml index 9837d1512127..b8dbad52cabc 100644 --- a/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml +++ b/packages/PackageInstaller/res/values-b+sr+Latn/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Želite da instalirate ovu aplikaciju?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Želite da ažurirate ovu aplikaciju?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Ažuriranjima ove aplikacije trenutno upravlja <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nAko ažurirate, buduća ažuriranja ćete dobijati od vlasnika <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Ažuriranjima ove aplikacije trenutno upravlja <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nŽelite li da instalirate ovo ažuriranje vlasnika <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje paketa je blokirano."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija nije instalirana jer je paket neusaglašen sa postojećim paketom."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> se deinstalira…"</string> <string name="uninstall_done" msgid="439354138387969269">"Deinstaliranje je završeno."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Aplikacija <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> je deinstalirana"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Izbrisan je <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> klon"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Deinstaliranje nije uspelo."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Deinstaliranje aplikacije <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> nije uspelo."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Briše se klon aplikacije <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-be/strings.xml b/packages/PackageInstaller/res/values-be/strings.xml index 052750f2c6cf..05c24fffbde8 100644 --- a/packages/PackageInstaller/res/values-be/strings.xml +++ b/packages/PackageInstaller/res/values-be/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Праграма ўсталявана."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Усталяваць гэту праграму?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Абнавіць гэту праграму?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Абнаўленнямі гэтай праграмы цяпер кіруе <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nВыканаўшы гэта абнаўленне, усе наступныя вы будзеце атрымліваць ад <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Абнаўленнямі гэтай праграмы цяпер кіруе <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nВы хочаце ўсталяваць гэта абнаўленне ад <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Праграма не ўсталявана."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Усталяванне пакета заблакіравана."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Праграма не ўсталявана, таму што пакет канфліктуе з існуючым пакетам."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> выдаляецца…"</string> <string name="uninstall_done" msgid="439354138387969269">"Выдаленне завершана."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Выдалена: <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Выдалена копія \"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>\""</string> <string name="uninstall_failed" msgid="1847750968168364332">"Не выдалена."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Не ўдалося выдаліць <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Выдаленне клона \"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>\"…"</string> diff --git a/packages/PackageInstaller/res/values-bg/strings.xml b/packages/PackageInstaller/res/values-bg/strings.xml index abbd499fa492..110860b1f754 100644 --- a/packages/PackageInstaller/res/values-bg/strings.xml +++ b/packages/PackageInstaller/res/values-bg/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Приложението бе инсталирано."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Искате ли да инсталирате това приложение?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Искате ли да актуализирате това приложение?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Актуализациите на това приложение понастоящем се управляват от <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nСлед актуализирането ще получавате бъдещите актуализации от <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Актуализациите на това приложение понастоящем се управляват от <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nИскате ли да инсталирате тази актуализация от <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"Приложението не бе инсталирано."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирането на пакета бе блокирано."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Приложението не бе инсталирано, тъй като пакетът е в конфликт със съществуващ пакет."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> се деинсталира…"</string> <string name="uninstall_done" msgid="439354138387969269">"Деинсталирането завърши."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Деинсталирахте <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Копието на <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> бе изтрито"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Деинсталирането не бе успешно."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Деинсталирането на <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> не бе успешно."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Копието на <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> се изтрива…"</string> diff --git a/packages/PackageInstaller/res/values-bn/strings.xml b/packages/PackageInstaller/res/values-bn/strings.xml index 610412119844..16353dfdda3b 100644 --- a/packages/PackageInstaller/res/values-bn/strings.xml +++ b/packages/PackageInstaller/res/values-bn/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"অ্যাপটি ইনস্টল করা হয়ে গেছে।"</string> <string name="install_confirm_question" msgid="7663733664476363311">"আপনি কি এই অ্যাপটি ইনস্টল করতে চান?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"আপনি কি এই অ্যাপটি আপডেট করতে চান?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"এই অ্যাপের আপডেট বর্তমানে <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ম্যানেজ করছেন।\n\nআপডেট করা হলে, আপনি পরিবর্তে <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>-এর থেকে ভবিষ্যতের আপডেট পাবেন।"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"বর্তমানে <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> এই অ্যাপের আপডেট ম্যানেজ করছেন।\n\n<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> থেকে আসা এই আপডেট ইনস্টল করতে চান।"</string> <string name="install_failed" msgid="5777824004474125469">"অ্যাপটি ইনস্টল করা হয়নি।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ইনস্টল হওয়া থেকে প্যাকেজটিকে ব্লক করা হয়েছে।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"আগে থেকেই থাকা একটি প্যাকেজের সাথে প্যাকেজটির সমস্যা সৃষ্টি হওয়ায় অ্যাপটি ইনস্টল করা যায়নি।"</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> আনইনস্টল করা হচ্ছে…"</string> <string name="uninstall_done" msgid="439354138387969269">"আনইনস্টল করা শেষ হয়েছে।"</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> আনইনস্টল করা হয়ে গেছে"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"ক্লোনের <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> মুছে ফেলা হয়েছে"</string> <string name="uninstall_failed" msgid="1847750968168364332">"আনইনস্টল করা যায়নি।"</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> আনইনস্টল করা যায়নি।"</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ক্লোন মুছে ফেলা হচ্ছে…"</string> diff --git a/packages/PackageInstaller/res/values-bs/strings.xml b/packages/PackageInstaller/res/values-bs/strings.xml index 2f03d027fcd3..10ed009ac973 100644 --- a/packages/PackageInstaller/res/values-bs/strings.xml +++ b/packages/PackageInstaller/res/values-bs/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Želite li instalirati ovu aplikaciju?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Želite li ažurirati ovu aplikaciju?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Ažuriranjima ove aplikacije trenutno upravlja <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nAžuriranjem ćete dobivati buduća ažuriranja od <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Ažuriranjima ove aplikacije trenutno upravlja <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nŽelite li instalirati ažuriranje od <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje ovog paketa je blokirano."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija nije instalirana jer paket nije usaglašen s postojećim paketom."</string> diff --git a/packages/PackageInstaller/res/values-ca/strings.xml b/packages/PackageInstaller/res/values-ca/strings.xml index 369c33b59426..337e6d9682a8 100644 --- a/packages/PackageInstaller/res/values-ca/strings.xml +++ b/packages/PackageInstaller/res/values-ca/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"S\'ha instal·lat l\'aplicació."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vols instal·lar aquesta aplicació?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vols actualitzar aquesta aplicació?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Actualment, <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> gestiona les actualitzacions d\'aquesta aplicació.\n\nSi l\'actualitzes, obtindràs novetats de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> en el futur."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Actualment, <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> gestiona les actualitzacions d\'aquesta aplicació.\n\nVols instal·lar aquesta actualització de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"No s\'ha instal·lat l\'aplicació."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"El paquet s\'ha bloquejat perquè no es pugui instal·lar."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"L\'aplicació no s\'ha instal·lat perquè el paquet entra en conflicte amb un d\'existent."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"S\'està desinstal·lant <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"La desinstal·lació ha finalitzat."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"S\'ha desinstal·lat <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"S\'ha suprimit el clon de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> <string name="uninstall_failed" msgid="1847750968168364332">"No s\'ha pogut desinstal·lar."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"No s\'ha pogut desinstal·lar <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"S\'està suprimint el clon de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-cs/strings.xml b/packages/PackageInstaller/res/values-cs/strings.xml index 85fcfbec18f8..33ec41c1928d 100644 --- a/packages/PackageInstaller/res/values-cs/strings.xml +++ b/packages/PackageInstaller/res/values-cs/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Aplikace je nainstalována."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Chcete tuto aplikaci nainstalovat?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Chcete tuto aplikaci aktualizovat?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Aktualizace této aplikace aktuálně spravuje vlastník <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nPokud ji aktualizujete, budete místo toho v budoucnu dostávat aktualizace od vlastníka <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Aktualizace této aplikace aktuálně spravuje vlastník <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nChcete nainstalovat tuto aktualizaci od vlastníka <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Aplikaci nelze nainstalovat."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instalace balíčku byla zablokována."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikaci nelze nainstalovat, protože balíček je v konfliktu se stávajícím balíčkem."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Odinstalace balíčku <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Odinstalace byla dokončena."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Balíček <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> byl odinstalován"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Byl smazán klon balíčku <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Odinstalace se nezdařila."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Odinstalace balíčku <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> se nezdařila."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Mazání klonu <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-da/strings.xml b/packages/PackageInstaller/res/values-da/strings.xml index b2219a783163..657eccb869ca 100644 --- a/packages/PackageInstaller/res/values-da/strings.xml +++ b/packages/PackageInstaller/res/values-da/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Appen er installeret."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vil du installere denne app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vil du opdatere denne app?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Opdateringer af denne app administreres i øjeblikket af <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nNår du opdaterer, vil du fremover få opdateringer fra <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> i stedet."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Opdateringer af denne app administreres i øjeblikket af <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nVil du installere denne opdatering fra <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Appen blev ikke installeret."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Pakken blev forhindret i at blive installeret."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Appen blev ikke installeret, da pakken er i strid med en eksisterende pakke."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Afinstallerer <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Afinstallationen er gennemført."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> blev afinstalleret"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Klonen af <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> blev slettet"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Appen blev ikke afinstalleret."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> kunne ikke afinstalleres."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Sletter klonen af <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-de/strings.xml b/packages/PackageInstaller/res/values-de/strings.xml index 0e595297cd6b..669bae6abd40 100644 --- a/packages/PackageInstaller/res/values-de/strings.xml +++ b/packages/PackageInstaller/res/values-de/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"App wurde installiert."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Möchtest du diese App installieren?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Möchtest du diese App aktualisieren?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Updates für diese App werden momentan von <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> verwaltet.\n\nWenn du sie aktualisierst, erhältst du zukünftige Updates stattdessen von <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Updates für diese App werden momentan von <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> verwaltet.\n\nMöchtest du dieses Update von <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> installieren?"</string> <string name="install_failed" msgid="5777824004474125469">"App wurde nicht installiert."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Die Installation des Pakets wurde blockiert."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Die App wurde nicht installiert, da das Paket in Konflikt mit einem bestehenden Paket steht."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> wird deinstalliert…"</string> <string name="uninstall_done" msgid="439354138387969269">"Deinstallation abgeschlossen."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> deinstalliert"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Duplikat von „<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>“ gelöscht"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Deinstallation fehlgeschlagen."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Deinstallation von <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> fehlgeschlagen."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-Klon wird gelöscht…"</string> diff --git a/packages/PackageInstaller/res/values-el/strings.xml b/packages/PackageInstaller/res/values-el/strings.xml index 11cd8f47f2db..ec0cfc7a4d76 100644 --- a/packages/PackageInstaller/res/values-el/strings.xml +++ b/packages/PackageInstaller/res/values-el/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Η εφαρμογή εγκαταστάθηκε."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Θέλετε να εγκαταστήσετε αυτήν την εφαρμογή;"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Θέλετε να ενημερώσετε αυτήν την εφαρμογή;"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Η διαχείριση των ενημερώσεων σε αυτήν την εφαρμογή πραγματοποιείται προς το παρόν από τον κάτοχο <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nΚάνοντας την ενημέρωση, θα λαμβάνετε αντ\' αυτού τις μελλοντικές ενημερώσεις από τον κάτοχο <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Η διαχείριση των ενημερώσεων σε αυτήν την εφαρμογή πραγματοποιείται προς το παρόν από τον κάτοχο <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nΘέλετε να εγκαταστήσετε αυτήν την ενημέρωση από τον κάτοχο <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"Η εφαρμογή δεν εγκαταστάθηκε."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Η εγκατάσταση του πακέτου αποκλείστηκε."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Η εφαρμογή δεν εγκαταστάθηκε, επειδή το πακέτο είναι σε διένεξη με κάποιο υπάρχον πακέτο."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Απεγκατάσταση <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Η απεγκατάσταση ολοκληρώθηκε."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Απεγκαταστάθηκε το πακέτο <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Έγινε διαγραφή κλώνου <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Μη επιτυχής απεγκατάσταση."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Μη επιτυχής απεγκατάσταση <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Διαγραφή διπλότυπου εφαρμογής <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-en-rAU/strings.xml b/packages/PackageInstaller/res/values-en-rAU/strings.xml index 7bcc90fb881a..b718868f2e28 100644 --- a/packages/PackageInstaller/res/values-en-rAU/strings.xml +++ b/packages/PackageInstaller/res/values-en-rAU/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"App installed."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Updates to this app are currently managed by <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nBy updating, you\'ll get future updates from <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> instead."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Updates to this app are currently managed by <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nDo you want to install this update from <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> diff --git a/packages/PackageInstaller/res/values-en-rCA/strings.xml b/packages/PackageInstaller/res/values-en-rCA/strings.xml index 1c3197dbb6e4..03f24c96747c 100644 --- a/packages/PackageInstaller/res/values-en-rCA/strings.xml +++ b/packages/PackageInstaller/res/values-en-rCA/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"App installed."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Updates to this app are currently managed by <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nBy updating, you\'ll get future updates from <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> instead."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Updates to this app are currently managed by <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nDo you want to install this update from <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> diff --git a/packages/PackageInstaller/res/values-en-rGB/strings.xml b/packages/PackageInstaller/res/values-en-rGB/strings.xml index 7bcc90fb881a..b718868f2e28 100644 --- a/packages/PackageInstaller/res/values-en-rGB/strings.xml +++ b/packages/PackageInstaller/res/values-en-rGB/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"App installed."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Updates to this app are currently managed by <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nBy updating, you\'ll get future updates from <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> instead."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Updates to this app are currently managed by <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nDo you want to install this update from <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> diff --git a/packages/PackageInstaller/res/values-en-rIN/strings.xml b/packages/PackageInstaller/res/values-en-rIN/strings.xml index 7bcc90fb881a..b718868f2e28 100644 --- a/packages/PackageInstaller/res/values-en-rIN/strings.xml +++ b/packages/PackageInstaller/res/values-en-rIN/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"App installed."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Updates to this app are currently managed by <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nBy updating, you\'ll get future updates from <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> instead."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Updates to this app are currently managed by <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nDo you want to install this update from <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> diff --git a/packages/PackageInstaller/res/values-en-rXC/strings.xml b/packages/PackageInstaller/res/values-en-rXC/strings.xml index a0aaabb6ddde..a095216e2272 100644 --- a/packages/PackageInstaller/res/values-en-rXC/strings.xml +++ b/packages/PackageInstaller/res/values-en-rXC/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"App installed."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Do you want to install this app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Do you want to update this app?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Updates to this app are currently managed by <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nBy updating, you\'ll get future updates from <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> instead."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Updates to this app are currently managed by <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nDo you want to install this update from <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"App not installed."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"The package was blocked from being installed."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App not installed as package conflicts with an existing package."</string> diff --git a/packages/PackageInstaller/res/values-es-rUS/strings.xml b/packages/PackageInstaller/res/values-es-rUS/strings.xml index 9808e2a5a97d..07485abee8da 100644 --- a/packages/PackageInstaller/res/values-es-rUS/strings.xml +++ b/packages/PackageInstaller/res/values-es-rUS/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Se instaló la app."</string> <string name="install_confirm_question" msgid="7663733664476363311">"¿Deseas instalar esta app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"¿Deseas actualizar esta app?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"En este momento, las actualizaciones de esta app están administradas por <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nSi continúas con la actualización, recibirás actualizaciones futuras de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"En este momento, las actualizaciones de esta app están administradas por <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\n¿Quieres instalar esta actualización de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"No se instaló la app."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Se bloqueó el paquete para impedir la instalación."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"No se instaló la app debido a un conflicto con un paquete."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Desinstalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Se completó la desinstalación."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Se desinstaló <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Se borró el clon de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> <string name="uninstall_failed" msgid="1847750968168364332">"No se pudo completar la desinstalación."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"No se pudo desinstalar <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Borrando la clonación de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-es/strings.xml b/packages/PackageInstaller/res/values-es/strings.xml index de337d3faba0..482ccf6dcf54 100644 --- a/packages/PackageInstaller/res/values-es/strings.xml +++ b/packages/PackageInstaller/res/values-es/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Aplicación instalada."</string> <string name="install_confirm_question" msgid="7663733664476363311">"¿Quieres instalar esta aplicación?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"¿Quieres actualizar esta aplicación?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Las actualizaciones de esta aplicación las gestiona <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nSi actualizas, recibirás las futuras actualizaciones por parte de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Las actualizaciones de esta aplicación las gestiona <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\n¿Quieres instalar esta actualización de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"No se ha instalado la aplicación."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Se ha bloqueado la instalación del paquete."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"La aplicación no se ha instalado debido a un conflicto con un paquete."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Desinstalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Se ha completado la desinstalación."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Se ha desinstalado <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Se ha eliminado el clon de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> <string name="uninstall_failed" msgid="1847750968168364332">"No se ha podido completar la desinstalación."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"No se ha podido desinstalar <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Eliminando clon de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-et/strings.xml b/packages/PackageInstaller/res/values-et/strings.xml index 555c8bfe28e7..71b22dbaf147 100644 --- a/packages/PackageInstaller/res/values-et/strings.xml +++ b/packages/PackageInstaller/res/values-et/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Rakendus on installitud."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Kas soovite selle rakenduse installida?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Kas soovite seda rakendust värskendada?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Selle rakenduse värskendusi haldab praegu <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nVärskendamisel saate tulevasi värskendusi hoopis omanikult <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Selle rakenduse värskendusi haldab praegu <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nKas soovite installida omaniku <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> värskenduse."</string> <string name="install_failed" msgid="5777824004474125469">"Rakendus pole installitud."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketi installimine blokeeriti."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Rakendust ei installitud, kuna pakett on olemasoleva paketiga vastuolus."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Paketi <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> desinstallimine …"</string> <string name="uninstall_done" msgid="439354138387969269">"Desinstallimine on lõpetatud."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> on desinstallitud"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Kustutati üksuse <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> kloon"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Desinstallimine ebaõnnestus."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Üksuse <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> desinstallimine ebaõnnestus."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Üksuse <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> klooni kustutamine …"</string> diff --git a/packages/PackageInstaller/res/values-eu/strings.xml b/packages/PackageInstaller/res/values-eu/strings.xml index 1a50a26835d7..c57102011b89 100644 --- a/packages/PackageInstaller/res/values-eu/strings.xml +++ b/packages/PackageInstaller/res/values-eu/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Instalatu da aplikazioa."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Aplikazioa instalatu nahi duzu?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Aplikazioa eguneratu nahi duzu?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> arduratzen da aplikazio hau eguneratzeaz.\n\n Eguneratuz gero, hemendik aurrera <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> arduratuko da eguneratzeez."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> arduratzen da aplikazio hau eguneratzeaz.\n\n<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> bidez jasotako eguneratze hau instalatu nahi duzu?"</string> <string name="install_failed" msgid="5777824004474125469">"Ez da instalatu aplikazioa."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketea instalatzeko aukera blokeatu egin da."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Ez da instalatu aplikazioa, gatazka bat sortu delako lehendik dagoen pakete batekin."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> desinstalatzen…"</string> <string name="uninstall_done" msgid="439354138387969269">"Desinstalatu da."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Desinstalatu da <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Ezabatu da <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> paketearen klona"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Ezin izan da desinstalatu."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Ezin izan da desinstalatu <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> aplikazioaren klona ezabatzen…"</string> diff --git a/packages/PackageInstaller/res/values-fa/strings.xml b/packages/PackageInstaller/res/values-fa/strings.xml index 1c636c724bbc..e9775ce41da1 100644 --- a/packages/PackageInstaller/res/values-fa/strings.xml +++ b/packages/PackageInstaller/res/values-fa/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"برنامه نصب شد."</string> <string name="install_confirm_question" msgid="7663733664476363311">"میخواهید این برنامه را نصب کنید؟"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"میخواهید این برنامه را بهروزرسانی کنید؟"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"درحالحاضر <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> بهروزرسانیهای این برنامه را مدیریت میکند.\n\nبا بهروز کردن، بهروزرسانیهای آتی را بهجای مالک قبلی از <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> دریافت خواهید کرد."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"درحالحاضر <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> بهروزرسانیهای این برنامه را مدیریت میکند.\n\nمیخواهید این بهروزرسانی را از <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> نصب کنید؟"</string> <string name="install_failed" msgid="5777824004474125469">"برنامه نصب نشد."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"از نصب شدن بسته جلوگیری شد."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"برنامه نصب نشد چون بسته با بسته موجود تداخل دارد."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"درحال حذف نصب <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"حذف نصب انجام شد."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> را حذف نصب کرد"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"همسانه <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> حذف شد"</string> <string name="uninstall_failed" msgid="1847750968168364332">"حذف نصب انجام نشد."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> باموفقیت حذف نصب شد."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"درحال حذف همسانه <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-fi/strings.xml b/packages/PackageInstaller/res/values-fi/strings.xml index e117dfb47469..058633b4638a 100644 --- a/packages/PackageInstaller/res/values-fi/strings.xml +++ b/packages/PackageInstaller/res/values-fi/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Sovellus on asennettu."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Haluatko asentaa tämän sovelluksen?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Haluatko päivittää tämän sovelluksen?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> hallitsee tämän sovelluksen päivityksiä.\n\nPäivittämisen jälkeen päivityksiä hallitsee <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> hallitsee tämän sovelluksen päivityksiä.\n\nHaluatko ladata tämän päivityksen täältä: <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Sovellusta ei asennettu."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketin asennus estettiin."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Sovellusta ei asennettu, koska paketti on ristiriidassa nykyisen paketin kanssa."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Poistetaan pakettia <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Poisto valmis"</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> poistettu"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Kopio (<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>) poistettu"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Poisto epäonnistui."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> on poistettu."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Poistetaan kloonia (<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>)…"</string> diff --git a/packages/PackageInstaller/res/values-fr-rCA/strings.xml b/packages/PackageInstaller/res/values-fr-rCA/strings.xml index 8e196905445c..c1c411c06581 100644 --- a/packages/PackageInstaller/res/values-fr-rCA/strings.xml +++ b/packages/PackageInstaller/res/values-fr-rCA/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Application installée."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Voulez-vous installer cette application?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Voulez-vous mettre à jour cette application?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Les mises à jour pour cette application sont actuellement gérées par <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nEn effectuant une mise à jour, vous recevrez plutôt les futures mises à jour de la part de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Les mises à jour de cette application sont actuellement gérées par <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nVoulez-vous installer cette mise à jour de la part de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Application non installée."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"L\'installation du paquet a été bloquée."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"L\'application n\'a pas été installée, car le paquet entre en conflit avec un paquet existant."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Désinstallation de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> en cours…"</string> <string name="uninstall_done" msgid="439354138387969269">"Désinstallation terminée."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"L\'application <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> a bien été désinstallée"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Le clone de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> a été supprimé"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Échec de la désinstallation."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"La désinstallation de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> n\'a pas réussi."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Suppression du clone <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-fr/strings.xml b/packages/PackageInstaller/res/values-fr/strings.xml index b3e76f9f61b6..4a6119696366 100644 --- a/packages/PackageInstaller/res/values-fr/strings.xml +++ b/packages/PackageInstaller/res/values-fr/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Application installée."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Voulez-vous installer cette appli ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Voulez-vous mettre à jour cette appli ?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Les mises à jour de cette appli sont actuellement gérées par <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nEn procédant à la mise à jour, vous recevrez les futures mises à jour de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> à la place."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Les mises à jour de cette appli sont actuellement gérées par <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nVoulez-vous installer cette mise à jour de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> ?"</string> <string name="install_failed" msgid="5777824004474125469">"Application non installée."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"L\'installation du package a été bloquée."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"L\'application n\'a pas été installée, car le package est en conflit avec un package déjà présent."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Désinstallation de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Désinstallation terminée."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> a été désinstallé"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Clone de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> supprimé"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Échec de la désinstallation."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Échec de la désinstallation du package <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Suppression du clone <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-gl/strings.xml b/packages/PackageInstaller/res/values-gl/strings.xml index b3d9973c5d94..6a37d7b04070 100644 --- a/packages/PackageInstaller/res/values-gl/strings.xml +++ b/packages/PackageInstaller/res/values-gl/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Instalouse a aplicación."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Queres instalar esta aplicación?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Queres actualizar esta aplicación?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Actualmente, as actualizacións desta aplicación xestiónaas <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nSe a actualizas, as futuras actualizacións recibiralas de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Actualmente, as actualizacións desta aplicación xestiónaas <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nQueres instalar esta actualización de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Non se instalou a aplicación"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Bloqueouse a instalación do paquete."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"A aplicación non se instalou porque o paquete presenta un conflito cun paquete que xa hai."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Desinstalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Finalizou a desinstalación."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Desinstalouse <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Eliminouse o clon de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Produciuse un erro na desinstalación."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"A desinstalación de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> non se realizou correctamente."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Eliminando clon de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-gu/strings.xml b/packages/PackageInstaller/res/values-gu/strings.xml index 08312709148e..863c1aa0623a 100644 --- a/packages/PackageInstaller/res/values-gu/strings.xml +++ b/packages/PackageInstaller/res/values-gu/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"ઍપ્લિકેશન ઇન્સ્ટૉલ કરી."</string> <string name="install_confirm_question" msgid="7663733664476363311">"શું તમે આ ઍપ ઇન્સ્ટૉલ કરવા માગો છો?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"શું તમે આ ઍપ અપડેટ કરવા માગો છો?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"આ ઍપની અપડેટને હાલમાં <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> દ્વારા મેનેજ કરવામાં આવે છે.\n\nઅપડેટ કરવાથી, તમને તેના બદલે <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> તરફથી ભવિષ્યની અપડેટ પ્રાપ્ત થશે."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"આ ઍપની અપડેટને હાલમાં <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> દ્વારા મેનેજ કરવામાં આવે છે.\n\nશું તમે <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> તરફથી આ અપડેટ ઇન્સ્ટૉલ કરવા માગો છો."</string> <string name="install_failed" msgid="5777824004474125469">"ઍપ્લિકેશન ઇન્સ્ટૉલ કરી નથી."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"પૅકેજને ઇન્સ્ટૉલ થવાથી બ્લૉક કરવામાં આવ્યું હતું."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"પૅકેજનો અસ્તિત્વમાંના પૅકેજ સાથે વિરોધાભાસ હોવાને કારણે ઍપ્લિકેશન ઇન્સ્ટૉલ થઈ નથી."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ને અનઇન્સ્ટૉલ કરી રહ્યાં છીએ…"</string> <string name="uninstall_done" msgid="439354138387969269">"અનઇન્સ્ટૉલ કરવાનું સમાપ્ત થયું."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> અનઇન્સ્ટૉલ કર્યું"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ની ક્લોન ડિલીટ કરવામાં આવી"</string> <string name="uninstall_failed" msgid="1847750968168364332">"અનઇન્સ્ટૉલ કરવું નિષ્ફળ રહ્યું."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ને અનઇન્સ્ટૉલ કરવું અસફળ રહ્યું."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ની ક્લોન ડિલીટ કરી રહ્યાં છીએ…"</string> diff --git a/packages/PackageInstaller/res/values-hi/strings.xml b/packages/PackageInstaller/res/values-hi/strings.xml index 43e6e4d533bc..3339d35d0c1e 100644 --- a/packages/PackageInstaller/res/values-hi/strings.xml +++ b/packages/PackageInstaller/res/values-hi/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"ऐप्लिकेशन इंस्टॉल हो गया."</string> <string name="install_confirm_question" msgid="7663733664476363311">"क्या आपको यह ऐप्लिकेशन इंस्टॉल करना है?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"क्या आप इस ऐप्लिकेशन को अपडेट करना चाहते हैं?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"फ़िलहाल, इस ऐप्लिकेशन के अपडेट <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> मैनेज करता है.\n\nऐप्लिकेशन अपडेट करने के बाद, नए अपडेट <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> से मिलेंगे."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"फ़िलहाल, इस ऐप्लिकेशन के अपडेट <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> मैनेज करता है.\n\nक्या यह अपडेट <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> से करवाना है."</string> <string name="install_failed" msgid="5777824004474125469">"ऐप्लिकेशन इंस्टॉल नहीं हुआ."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"पैकेज को इंस्टॉल होने से ब्लॉक किया हुआ है."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ऐप्लिकेशन इंस्टॉल नहीं हुआ क्योंकि पैकेज का किसी मौजूदा पैकेज से विरोध है."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> अनइंस्टॉल किया जा रहा है…"</string> <string name="uninstall_done" msgid="439354138387969269">"अनइंस्टॉल हो गया."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> अनइंस्टॉल किया गया"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> का क्लोन मिटा दिया गया है"</string> <string name="uninstall_failed" msgid="1847750968168364332">"अनइंस्टॉल नहीं किया जा सका."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> को अनइंस्टॉल नहीं किया जा सका."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> का क्लोन मिटाया जा रहा है…"</string> diff --git a/packages/PackageInstaller/res/values-hr/strings.xml b/packages/PackageInstaller/res/values-hr/strings.xml index 8e7f6feeab68..8961b851b2ab 100644 --- a/packages/PackageInstaller/res/values-hr/strings.xml +++ b/packages/PackageInstaller/res/values-hr/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacija je instalirana."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Želite li instalirati ovu aplikaciju?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Želite li ažurirati ovu aplikaciju?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Ažuriranjima ove aplikacije trenutačno upravlja <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nAko je ažurirate, buduća ažuriranja primat ćete od vlasnika <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Ažuriranjima ove aplikacije trenutačno upravlja <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nŽelite li instalirati ažuriranje od vlasnika <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Aplikacija nije instalirana."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instaliranje paketa blokirano je."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija koja nije instalirana kao paket u sukobu je s postojećim paketom."</string> diff --git a/packages/PackageInstaller/res/values-hu/strings.xml b/packages/PackageInstaller/res/values-hu/strings.xml index 79b1f3d772f9..db085cafcd44 100644 --- a/packages/PackageInstaller/res/values-hu/strings.xml +++ b/packages/PackageInstaller/res/values-hu/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Alkalmazás telepítve."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Telepíti ezt az alkalmazást?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Frissíti ezt az alkalmazást?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Az alkalmazást érintő frissítéseket jelenleg <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> kezeli.\n\nA mostani frissítés után a jövőbeli frissítéseket helyette tőle érkeznek majd: <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Az alkalmazást érintő frissítéseket jelenleg <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> kezeli.\n\nSzeretné telepíteni a tőle származó frissítést: <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Az alkalmazás nincs telepítve."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"A csomag telepítését letiltotta a rendszer."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"A nem csomagként telepített alkalmazás ütközik egy már létező csomaggal."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"A(z) <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> eltávolítása folyamatban van…"</string> <string name="uninstall_done" msgid="439354138387969269">"Az eltávolítás befejeződött."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"A(z) <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> eltávolítása befejeződött"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> klónja törölve"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Az eltávolítás sikertelen."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"A(z) <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> eltávolítása nem sikerült."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Klónozott <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> törlése…"</string> diff --git a/packages/PackageInstaller/res/values-hy/strings.xml b/packages/PackageInstaller/res/values-hy/strings.xml index 4b0b5490d8bf..211d5bc079d3 100644 --- a/packages/PackageInstaller/res/values-hy/strings.xml +++ b/packages/PackageInstaller/res/values-hy/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Հավելվածը տեղադրված է:"</string> <string name="install_confirm_question" msgid="7663733664476363311">"Տեղադրե՞լ այս հավելվածը:"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Թարմացնե՞լ այս հավելվածը։"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Այս հավելվածի թարմացումները ներկայումս կառավարվում են <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>-ի կողմից։\n\nԹարմացնելով՝ դուք հետագայում թարմացումներ կստանաք <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>-ից։"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Այս հավելվածի թարմացումները ներկայումս կառավարվում են <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>-ի կողմից։\n\nՈւզո՞ւմ եք տեղադրել այս թարմացումը <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>-ից։"</string> <string name="install_failed" msgid="5777824004474125469">"Հավելվածը տեղադրված չէ:"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Փաթեթի տեղադրումն արգելափակվել է:"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Հավելվածը չի տեղադրվել, քանի որ տեղադրման փաթեթն ունի հակասություն առկա փաթեթի հետ:"</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> հավելվածն ապատեղադրվում է…"</string> <string name="uninstall_done" msgid="439354138387969269">"Ապատեղադրվեց:"</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> հավելվածն ապատեղադրվեց"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> կլոնը ջնջվել է"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Չհաջողվեց ապատեղադրել:"</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Չհաջողվեց ապատեղադրել <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> հավելվածը:"</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-ի կրկնօրինակը ջնջվում է…"</string> diff --git a/packages/PackageInstaller/res/values-in/strings.xml b/packages/PackageInstaller/res/values-in/strings.xml index a50bf0cd9961..ed6d23f0cfa7 100644 --- a/packages/PackageInstaller/res/values-in/strings.xml +++ b/packages/PackageInstaller/res/values-in/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Aplikasi terinstal."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Ingin menginstal aplikasi ini?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Ingin mengupdate aplikasi ini?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Update aplikasi ini sekarang dikelola oleh <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nDengan mengupdate, Anda akan mendapatkan update mendatang dari <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Update aplikasi ini sekarang dikelola oleh <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nIngin menginstal update ini dari <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"Aplikasi tidak terinstal."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paket diblokir sehingga tidak dapat diinstal."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikasi tidak diinstal karena paket ini bentrok dengan paket yang sudah ada."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Meng-uninstal <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Uninstal selesai."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> di-uninstal"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Clone <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> dihapus"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Uninstal gagal."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Gagal meng-uninstal <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Menghapus clone <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> …"</string> diff --git a/packages/PackageInstaller/res/values-is/strings.xml b/packages/PackageInstaller/res/values-is/strings.xml index 7bfaff48a24c..1da54cbf188e 100644 --- a/packages/PackageInstaller/res/values-is/strings.xml +++ b/packages/PackageInstaller/res/values-is/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Forritið er uppsett."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Viltu setja upp þetta forrit?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Viltu uppfæra þetta forrit?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> stjórnar uppfærslum þessa forrits eins og er.\n\nMeð því að uppfæra færðu síðari uppfærslur frá <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> í staðinn."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> stjórnar uppfærslum þessa forrits eins og er.\n\nViltu setja upp þessa uppfærslu frá <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"Forritið er ekki uppsett."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Lokað var á uppsetningu pakkans."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Forritið var ekki sett upp vegna árekstra á milli pakkans og annars pakka."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Fjarlægir <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Forritið hefur verið fjarlægt."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Fjarlægði <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Afriti af <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> var eytt"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Ekki tókst að fjarlægja forritið."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Ekki tókst að fjarlægja <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Eyðir afriti af <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-it/strings.xml b/packages/PackageInstaller/res/values-it/strings.xml index b3eb19b80310..c288d96dc7ac 100644 --- a/packages/PackageInstaller/res/values-it/strings.xml +++ b/packages/PackageInstaller/res/values-it/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"App installata."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vuoi installare questa app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vuoi aggiornare questa app?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Gli aggiornamenti a questa app sono attualmente gestiti da <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nEseguendo l\'aggiornamento, gli aggiornamenti futuri saranno forniti invece da <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Gli aggiornamenti a questa app sono attualmente gestiti da <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nVuoi installare questo aggiornamento da <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"App non installata."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"È stata bloccata l\'installazione del pacchetto."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App non installata poiché il pacchetto è in conflitto con un pacchetto esistente."</string> diff --git a/packages/PackageInstaller/res/values-iw/strings.xml b/packages/PackageInstaller/res/values-iw/strings.xml index 2542f0eeabb2..e3893d21441f 100644 --- a/packages/PackageInstaller/res/values-iw/strings.xml +++ b/packages/PackageInstaller/res/values-iw/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"האפליקציה הותקנה."</string> <string name="install_confirm_question" msgid="7663733664476363311">"האם ברצונך להתקין אפליקציה זו?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"האם ברצונך לעדכן אפליקציה זו?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"העדכונים של האפליקציה הזו מנוהלים כרגע על ידי <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nלאחר העדכון הנוכחי, העדכונים העתידיים ינוהלו על ידי <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> במקום זאת."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"העדכונים של האפליקציה הזו מנוהלים כרגע על ידי <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nלהתקין את העדכון הזה של <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"האפליקציה לא הותקנה."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"החבילה נחסמה להתקנה."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"האפליקציה לא הותקנה כי החבילה מתנגשת עם חבילה קיימת."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"המערכת מסירה את ההתקנה של <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"הסרת ההתקנה הסתיימה."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"ההתקנה של <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> הוסרה"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"מחיקת השכפול של <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> <string name="uninstall_failed" msgid="1847750968168364332">"לא ניתן היה להסיר את ההתקנה."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"לא ניתן היה להסיר את ההתקנה של <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"מחיקת השכפול של <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> מתבצעת…"</string> diff --git a/packages/PackageInstaller/res/values-ja/strings.xml b/packages/PackageInstaller/res/values-ja/strings.xml index cacd02257e9a..fd1094051f68 100644 --- a/packages/PackageInstaller/res/values-ja/strings.xml +++ b/packages/PackageInstaller/res/values-ja/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"アプリをインストールしました。"</string> <string name="install_confirm_question" msgid="7663733664476363311">"このアプリをインストールしますか?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"このアプリを更新しますか?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"このアプリのアップデートは現在 <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> によって管理されています。\n\n更新すると、今後は代わりに <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> からアップデートを入手するようになります。"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"このアプリのアップデートは現在 <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> によって管理されています。\n\nこのアップデートを <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> からインストールしますか?"</string> <string name="install_failed" msgid="5777824004474125469">"アプリはインストールされていません。"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"パッケージのインストールはブロックされています。"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"パッケージが既存のパッケージと競合するため、アプリをインストールできませんでした。"</string> diff --git a/packages/PackageInstaller/res/values-ka/strings.xml b/packages/PackageInstaller/res/values-ka/strings.xml index c10074001a45..507a262b48e4 100644 --- a/packages/PackageInstaller/res/values-ka/strings.xml +++ b/packages/PackageInstaller/res/values-ka/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"აპი დაინსტალირებულია."</string> <string name="install_confirm_question" msgid="7663733664476363311">"გნებავთ ამ აპის დაყენება?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"გსურთ ამ აპის განახლება?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"ამ აპის განახლებებს ამჟამად მართავს <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nგანახლებით მომავალ განახლებებს მიიღებთ <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>-გან."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"ამ აპის განახლებებს ამჟამად მართავს <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nგსურთ <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>-გან განახლების ინსტალაცია?"</string> <string name="install_failed" msgid="5777824004474125469">"აპი დაუინსტალირებელია."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ამ პაკეტის ინსტალაცია დაბლოკილია."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"აპი ვერ დაინსტალირდა, რადგან პაკეტი კონფლიქტშია არსებულ პაკეტთან."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"მიმდინარეობს <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-ის დეინსტალაცია…"</string> <string name="uninstall_done" msgid="439354138387969269">"დეინსტალაცია დასრულდა."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> დეინსტალირებულია"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"წაიშალა <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> კლონი"</string> <string name="uninstall_failed" msgid="1847750968168364332">"დეინსტალაცია ვერ მოხერხდა."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-ის დეინსტალაცია ვერ მოხერხდა."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"მიმდინარეობს <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> კლონის წაშლა…"</string> diff --git a/packages/PackageInstaller/res/values-kk/strings.xml b/packages/PackageInstaller/res/values-kk/strings.xml index b973362c97c4..6e11f2a3a263 100644 --- a/packages/PackageInstaller/res/values-kk/strings.xml +++ b/packages/PackageInstaller/res/values-kk/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Қолданба орнатылды."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Бұл қолданбаны орнатқыңыз келе ме?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Бұл қолданбаны жаңартқыңыз келе ме?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Бұл қолданбаны жаңартуды қазір <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> басқарады.\n\nЖаңартсаңыз, келесі жаңартуды <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> беретін болады."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Бұл қолданбаны жаңартуды қазір <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> басқарады.\n\n<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> беретін жаңартуды пайдаланғыңыз келе ме?"</string> <string name="install_failed" msgid="5777824004474125469">"Қолданба орнатылмады."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Пакетті орнатуға тыйым салынды."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Жаңа пакет пен бұрыннан бар пакеттің арасында қайшылық туындағандықтан, қолданба орнатылмады."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> жойылуда…"</string> <string name="uninstall_done" msgid="439354138387969269">"Жою аяқталды."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> жойылды"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> клоны жойылды."</string> <string name="uninstall_failed" msgid="1847750968168364332">"Жою мүмкін болмады."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> жою сәтсіз аяқталды."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> клоны жойылып жатыр…"</string> diff --git a/packages/PackageInstaller/res/values-km/strings.xml b/packages/PackageInstaller/res/values-km/strings.xml index 7b65679be429..46e29145a9b4 100644 --- a/packages/PackageInstaller/res/values-km/strings.xml +++ b/packages/PackageInstaller/res/values-km/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"បានដំឡើងកម្មវិធី។"</string> <string name="install_confirm_question" msgid="7663733664476363311">"តើអ្នកចង់ដំឡើងកម្មវិធីនេះដែរទេ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"តើអ្នកចង់ដំឡើងកំណែកម្មវិធីនេះដែរទេ?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"បច្ចុប្បន្ន ការដំឡើងកំណែកម្មវិធីនេះត្រូវបានគ្រប់គ្រងដោយ <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>។\n\nតាមរយៈការដំឡើងកំណែ អ្នកនឹងទទួលបានកំណែថ្មីៗនៅពេលក្រោយពី <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> ជំនួសវិញ។"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"បច្ចុប្បន្ន ការដំឡើងកំណែកម្មវិធីនេះត្រូវបានគ្រប់គ្រងដោយ <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>។\n\nតើអ្នកចង់ដំឡើងកំណែថ្មីនេះពី <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> ឬ។"</string> <string name="install_failed" msgid="5777824004474125469">"មិនបានដំឡើងកម្មវិធីទេ។"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"កញ្ចប់ត្រូវបានទប់ស្កាត់មិនឱ្យដំឡើង។"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"កម្មវិធីមិនបានដំឡើងទេ ដោយសារកញ្ចប់កម្មវិធីមិនត្រូវគ្នាជាមួយកញ្ចប់ដែលមានស្រាប់។"</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"កំពុងលុប <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"បានបញ្ចប់ការលុប។"</string> <string name="uninstall_done_app" msgid="4588850984473605768">"បានលុប <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"ក្លូន <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ដែលបានលុប"</string> <string name="uninstall_failed" msgid="1847750968168364332">"មិនអាចលុបបានទេ។"</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"មិនអាចលុប <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> បានទេ។"</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"កំពុងលុបក្លូន <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-kn/strings.xml b/packages/PackageInstaller/res/values-kn/strings.xml index ab00502859d3..fe8144ea2c22 100644 --- a/packages/PackageInstaller/res/values-kn/strings.xml +++ b/packages/PackageInstaller/res/values-kn/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ."</string> <string name="install_confirm_question" msgid="7663733664476363311">"ನೀವು ಈ ಆ್ಯಪ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಬಯಸುವಿರಾ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ನೀವು ಈ ಆ್ಯಪ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲು ಬಯಸುವಿರಾ?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"ಈ ಆ್ಯಪ್ನ ಅಪ್ಡೇಟ್ಗಳನ್ನು ಪ್ರಸ್ತುತ <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ಅವರು ನಿರ್ವಹಿಸುತ್ತಿದ್ದಾರೆ.\n\nಅಪ್ಡೇಟ್ ಮಾಡುವುದರಿಂದ, ಬದಲಿಗೆ ನೀವು ಭವಿಷ್ಯದ ಅಪ್ಡೇಟ್ಗಳನ್ನು <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> ಅವರಿಂದ ಪಡೆಯುತ್ತೀರಿ."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"ಈ ಆ್ಯಪ್ನ ಅಪ್ಡೇಟ್ಗಳನ್ನು ಪ್ರಸ್ತುತ <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ಅವರು ನಿರ್ವಹಿಸುತ್ತಿದ್ದಾರೆ.\n\nನೀವು <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> ಅವರ ಈ ಅಪ್ಡೇಟ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಬಯಸುವಿರಾ."</string> <string name="install_failed" msgid="5777824004474125469">"ಆ್ಯಪ್ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿಲ್ಲ."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವ ಪ್ಯಾಕೇಜ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ಪ್ಯಾಕೇಜ್ನಂತೆ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿರುವ ಆ್ಯಪ್ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಪ್ಯಾಕೇಜ್ ಜೊತೆಗೆ ಸಂಘರ್ಷವಾಗುತ್ತದೆ."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ಅನ್ನು ಅನ್ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string> <string name="uninstall_done" msgid="439354138387969269">"ಅನ್ಇನ್ಸ್ಟಾಲ್ ಪೂರ್ಣಗೊಂಡಿದೆ."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ಅನ್ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ಕ್ಲೋನ್ ಅನ್ನು ಅಳಿಸಲಾಗಿದೆ"</string> <string name="uninstall_failed" msgid="1847750968168364332">"ಅನ್ಇನ್ಸ್ಟಾಲ್ ವಿಫಲವಾಗಿದೆ."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ಅನ್ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವಿಕೆ ಯಶಸ್ವಿಯಾಗಿಲ್ಲ."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ಕ್ಲೋನ್ ಅನ್ನು ಅಳಿಸಲಾಗುತ್ತಿದೆ…"</string> diff --git a/packages/PackageInstaller/res/values-ko/strings.xml b/packages/PackageInstaller/res/values-ko/strings.xml index c4014306fb32..4bfa3cc00d17 100644 --- a/packages/PackageInstaller/res/values-ko/strings.xml +++ b/packages/PackageInstaller/res/values-ko/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"앱이 설치되었습니다."</string> <string name="install_confirm_question" msgid="7663733664476363311">"이 앱을 설치하시겠습니까?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"이 앱을 업데이트하시겠습니까?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"이 앱 업데이트는 현재 <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>에서 관리합니다.\n\n업데이트할 경우 대신 <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>에서 향후 업데이트를 제공합니다."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"이 앱 업데이트는 현재 <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>에서 관리합니다.\n\n<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>에서 제공하는 업데이트를 설치하시겠습니까?"</string> <string name="install_failed" msgid="5777824004474125469">"앱이 설치되지 않았습니다."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"패키지 설치가 차단되었습니다."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"패키지가 기존 패키지와 충돌하여 앱이 설치되지 않았습니다."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> 제거 중…"</string> <string name="uninstall_done" msgid="439354138387969269">"제거를 완료했습니다."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>를 제거했습니다."</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> 클론 삭제됨"</string> <string name="uninstall_failed" msgid="1847750968168364332">"제거하지 못했습니다."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>을(를) 제거하지 못했습니다."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> 클론 삭제 중…"</string> diff --git a/packages/PackageInstaller/res/values-ky/strings.xml b/packages/PackageInstaller/res/values-ky/strings.xml index d3d82c3117b4..5888b7b4d98e 100644 --- a/packages/PackageInstaller/res/values-ky/strings.xml +++ b/packages/PackageInstaller/res/values-ky/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Колдонмо орнотулду."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Бул колдонмону орнотоюн деп жатасызбы?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Бул колдонмону жаңыртайын деп жатасызбы?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Бул колдонмонун жаңыртууларын учурда <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> тескеп жатат.\n\nЖаңыртуу менен келечектеги жаңыртууларды анын ордуна <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> жөнөтүп калат."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Бул колдонмонун жаңыртууларын учурда <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> тескеп жатат.\n\n<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> жөнөткөн жаңыртуунун чыгарып саласызбы?"</string> <string name="install_failed" msgid="5777824004474125469">"Колдонмо орнотулган жок."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Топтомду орнотууга болбойт."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Башка топтом менен дал келбегендиктен колдонмо орнотулган жок."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> чыгарылууда…"</string> <string name="uninstall_done" msgid="439354138387969269">"Чыгарылып салынды."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> чыгарылып салынды"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> клону өчүрүлдү"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Чыгарылып салынган жок."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> чыгарылып салынган жок."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> клону өчүрүлүүдө…"</string> diff --git a/packages/PackageInstaller/res/values-lo/strings.xml b/packages/PackageInstaller/res/values-lo/strings.xml index 7ab33a9d3521..f9866b0a8e14 100644 --- a/packages/PackageInstaller/res/values-lo/strings.xml +++ b/packages/PackageInstaller/res/values-lo/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"ຕິດຕັ້ງແອັບແລ້ວ."</string> <string name="install_confirm_question" msgid="7663733664476363311">"ທ່ານຕ້ອງການຕິດຕັ້ງແອັບນີ້ບໍ່?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ທ່ານຕ້ອງການອັບເດດແອັບນີ້ບໍ່?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"ໃນຕອນນີ້ <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ເປັນຜູ້ຈັດການການອັບເດດແອັບນີ້.\n\nຫາກອັບເດດ, ທ່ານຈະໄດ້ຮັບການອັບເດດໃນອະນາຄົດຈາກ <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> ແທນ."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"ໃນຕອນນີ້ <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ເປັນຜູ້ຈັດການການອັບເດດແອັບນີ້.\n\nທ່ານຕ້ອງການຕິດຕັ້ງການອັບເດດນີ້ຈາກ <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> ຫຼືບໍ່."</string> <string name="install_failed" msgid="5777824004474125469">"ບໍ່ໄດ້ຕິດຕັ້ງແອັບເທື່ອ."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ແພັກເກດຖືກບລັອກບໍ່ໃຫ້ໄດ້ຮັບການຕິດຕັ້ງ."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ບໍ່ໄດ້ຕິດຕັ້ງແອັບເນື່ອງຈາກແພັກເກດຂັດແຍ່ງກັບແພັກເກດທີ່ມີຢູ່ກ່ອນແລ້ວ."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"ກຳລັງຖອນການຕິດຕັ້ງ <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"ຖອນການຕິດຕັ້ງສຳເລັດແລ້ວ."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"ຖອນການຕິດຕັ້ງ <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ແລ້ວ"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"ລຶບສຳເນົາ <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ແລ້ວ"</string> <string name="uninstall_failed" msgid="1847750968168364332">"ຖອນການຕິດຕັ້ງບໍ່ສຳເລັດ."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"ຖອນການຕິດຕັ້ງ <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ບໍ່ສຳເລັດ."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"ກຳລັງລຶບ <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ໂຄລນ…"</string> diff --git a/packages/PackageInstaller/res/values-lt/strings.xml b/packages/PackageInstaller/res/values-lt/strings.xml index 9ffa09cd971f..9bf018b733ba 100644 --- a/packages/PackageInstaller/res/values-lt/strings.xml +++ b/packages/PackageInstaller/res/values-lt/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Programa įdiegta."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Ar norite įdiegti šią programą?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Ar norite atnaujinti šią programą?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Šios programos naujinius šiuo metu valdo <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nAtnaujinę būsimus naujinius gausite iš <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Šios programos naujinius šiuo metu valdo <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nAr norite įdiegti šį naujinį iš <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"Programa neįdiegta."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketas užblokuotas ir negali būti įdiegtas."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Programa neįdiegta, nes paketas nesuderinamas su esamu paketu."</string> diff --git a/packages/PackageInstaller/res/values-lv/strings.xml b/packages/PackageInstaller/res/values-lv/strings.xml index c3e1a88c7eaf..823858c79171 100644 --- a/packages/PackageInstaller/res/values-lv/strings.xml +++ b/packages/PackageInstaller/res/values-lv/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Lietotne ir instalēta."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vai vēlaties instalēt šo lietotni?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vai vēlaties atjaunināt šo lietotni?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Šīs lietotnes atjauninājumus pašlaik pārvalda <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nJa veiksiet atjaunināšanu, turpmākos atjauninājumus nodrošinās <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Šīs lietotnes atjauninājumus pašlaik pārvalda <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nVai vēlaties instalēt atjauninājumu, ko nodrošina <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Lietotne nav instalēta."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Pakotnes instalēšana tika bloķēta."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Lietotne netika instalēta, jo pastāv pakotnes konflikts ar esošu pakotni."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Notiek lietotnes <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> atinstalēšana…"</string> <string name="uninstall_done" msgid="439354138387969269">"Atinstalēšana ir pabeigta."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Lietotne <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ir atinstalēta"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Izdzēsts lietotnes <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> klons"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Atinstalēšana neizdevās."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Lietotnes <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> atinstalēšana nebija sekmīga."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Notiek lietotnes <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> klona dzēšana…"</string> diff --git a/packages/PackageInstaller/res/values-mk/strings.xml b/packages/PackageInstaller/res/values-mk/strings.xml index e10025733790..6135e658969a 100644 --- a/packages/PackageInstaller/res/values-mk/strings.xml +++ b/packages/PackageInstaller/res/values-mk/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Апликацијата е инсталирана."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Дали сакате да ја инсталирате апликацијава?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Дали сакате да ја ажурирате апликацијава?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Ажурирањата на апликацијава тековно се управуваат од <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nСо ажурирање, ќе добивате ажурирања во иднината од <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Ажурирањата на апликацијава тековно се управуваат од <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nДали сакате да го инсталирате ажурирањево од <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"Апликацијата не е инсталирана."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирањето на пакетот е блокирано."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Апликација што не е инсталирана како пакет е во конфликт со постоечки пакет."</string> diff --git a/packages/PackageInstaller/res/values-ml/strings.xml b/packages/PackageInstaller/res/values-ml/strings.xml index ca1ae385c76f..43cac7a6d0e2 100644 --- a/packages/PackageInstaller/res/values-ml/strings.xml +++ b/packages/PackageInstaller/res/values-ml/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തു."</string> <string name="install_confirm_question" msgid="7663733664476363311">"ഈ ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യണോ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ഈ ആപ്പ് അപ്ഡേറ്റ് ചെയ്യണോ?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"ഈ ആപ്പിലെ അപ്ഡേറ്റുകൾ നിലവിൽ മാനേജ് ചെയ്യുന്നത് <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ആണ്.\n\nഅപ്ഡേറ്റ് ചെയ്യുന്നതിലൂടെ, പകരം നിങ്ങൾക്ക് ഭാവി അപ്ഡേറ്റുകൾ <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> എന്നയാളിൽ നിന്ന് ലഭിക്കും."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"ഈ ആപ്പിലെ അപ്ഡേറ്റുകൾ നിലവിൽ മാനേജ് ചെയ്യുന്നത് <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ആണ്.\n\n<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> എന്നയാളിൽ നിന്ന് ഈ അപ്ഡേറ്റ് ഇൻസ്റ്റാൾ ചെയ്യാൻ നിങ്ങൾ താൽപ്പര്യപ്പെടുന്നുണ്ടോ."</string> <string name="install_failed" msgid="5777824004474125469">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തിട്ടില്ല."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"പാക്കേജ് ഇൻസ്റ്റാൾ ചെയ്യുന്നത് ബ്ലോക്ക് ചെയ്തു."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"പാക്കേജിന് നിലവിലുള്ള പാക്കേജുമായി പൊരുത്തക്കേടുള്ളതിനാൽ, ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തില്ല."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> അൺ ഇൻസ്റ്റാൾ ചെയ്യുന്നു…"</string> <string name="uninstall_done" msgid="439354138387969269">"അൺ ഇൻസ്റ്റാൾ ചെയ്യൽ പൂർത്തിയായി."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> അൺ ഇൻസ്റ്റാൾ ചെയ്തു"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ക്ലോൺ ഇല്ലാതാക്കി"</string> <string name="uninstall_failed" msgid="1847750968168364332">"അൺ ഇൻസ്റ്റാൾ ചെയ്യാനായില്ല."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> അൺ ഇൻസ്റ്റാൾ ചെയ്യാനായില്ല."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ക്ലോൺ ചെയ്യൽ ഇല്ലാതാക്കുന്നു…"</string> diff --git a/packages/PackageInstaller/res/values-mn/strings.xml b/packages/PackageInstaller/res/values-mn/strings.xml index 3be98b574030..52bca70d7fa0 100644 --- a/packages/PackageInstaller/res/values-mn/strings.xml +++ b/packages/PackageInstaller/res/values-mn/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Аппыг суулгасан."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Та энэ аппыг суулгахыг хүсэж байна уу?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Та энэ аппыг шинэчлэхийг хүсэж байна уу?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Энэ аппын шинэчлэлтийг одоогоор <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>-с удирддаг.\n\nШинэчилснээр та цаашдын шинэчлэлтийг оронд нь <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>-с авна."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Энэ аппын шинэчлэлтийг одоогоор <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>-с удирддаг.\n\nТа <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>-н энэ шинэчлэлтийг суулгахыг хүсэж байна уу?"</string> <string name="install_failed" msgid="5777824004474125469">"Аппыг суулгаагүй."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Багц суулгахыг блоклосон байна."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Багц одоо байгаа багцтай тохирохгүй байгаа тул аппыг суулгаж чадсангүй."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-г устгаж байна…"</string> <string name="uninstall_done" msgid="439354138387969269">"Устгаж дууслаа."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-г устгасан"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> клоныг устгасан"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Устгах амжилтгүй боллоо."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-г устгах амжилтгүй боллоо."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> клоныг устгаж байна…"</string> diff --git a/packages/PackageInstaller/res/values-mr/strings.xml b/packages/PackageInstaller/res/values-mr/strings.xml index ffd6610e44f3..8a4ff440d610 100644 --- a/packages/PackageInstaller/res/values-mr/strings.xml +++ b/packages/PackageInstaller/res/values-mr/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"अॅप इंस्टॉल झाले."</string> <string name="install_confirm_question" msgid="7663733664476363311">"तुम्हाला हे ॲप इंस्टॉल करायचे आहे का?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"तुम्हाला हे ॲप अपडेट करायचे आहे का?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"या अॅपसाठीचे अपडेट सध्या <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> द्वारे व्यवस्थापित केले जात आहेत.\n\nत्या ऐवजी, अपडेट केल्याने, तुम्हाला भविष्यातील अपडेट <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> कडून मिळतील."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"या अॅपसाठीचे अपडेट सध्या <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> द्वारे व्यवस्थापित केले जात आहेत.\n\nतुम्हाला हे अपडेट <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> कडून इंस्टॉल करायचे आहे का."</string> <string name="install_failed" msgid="5777824004474125469">"अॅप इंस्टॉल झाले नाही."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"पॅकेज इंस्टॉल होण्यापासून ब्लॉक केले होते."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"पॅकेजचा विद्यमान पॅकेजशी विरोध असल्याने अॅप इंस्टॉल झाले नाही."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> अनइंस्टॉल करत आहे…"</string> <string name="uninstall_done" msgid="439354138387969269">"अनइंस्टॉल पूर्ण झाले."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> अनइंस्टॉल केले"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> क्लोन हटवला आहे"</string> <string name="uninstall_failed" msgid="1847750968168364332">"अनइंस्टॉल करता आले नाही."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> अनइंस्टॉल करता आले नाही."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"क्लोन <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> हटवत आहे…"</string> diff --git a/packages/PackageInstaller/res/values-ms/strings.xml b/packages/PackageInstaller/res/values-ms/strings.xml index 1c369bc3236f..13531bd13154 100644 --- a/packages/PackageInstaller/res/values-ms/strings.xml +++ b/packages/PackageInstaller/res/values-ms/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Aplikasi dipasang."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Adakah anda ingin memasang aplikasi ini?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Adakah anda mahu mengemas kini apl ini?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Kemaskinian pada apl ini diuruskan oleh <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> pada masa ini.\n\nDengan membuat pengemaskinian, anda akan mendapat kemaskinian akan datang daripada <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Kemaskinian pada apl ini diuruskan oleh <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> pada masa ini.\n\nAdakah anda mahu memasang kemaskinian ini daripada <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"Aplikasi tidak dipasang."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Pakej ini telah disekat daripada dipasang."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Apl tidak dipasang kerana pakej bercanggah dengan pakej yang sedia ada."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Menyahpasang <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Nyahpasang selesai."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> dinyahpasang"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Klon <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> dipadamkan"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Penyahpasangan tidak berjaya."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Tidak berjaya menyahpasang <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Memadamkan klon <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-my/strings.xml b/packages/PackageInstaller/res/values-my/strings.xml index 08135d202b9b..4dbf3fc816eb 100644 --- a/packages/PackageInstaller/res/values-my/strings.xml +++ b/packages/PackageInstaller/res/values-my/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"အက်ပ်ထည့်သွင်းပြီးပါပြီ။"</string> <string name="install_confirm_question" msgid="7663733664476363311">"ဤအက်ပ်ကို ထည့်သွင်းလိုသလား။"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ဤအက်ပ်ကို အပ်ဒိတ်လုပ်လိုသလား။"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"ဤအက်ပ်ရှိ အပ်ဒိတ်များကို လောလောဆယ်တွင် <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> က စီမံထားသည်။\n\n၎င်းအစား အပ်ဒိတ်လုပ်ခြင်းဖြင့် <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> ထံမှ နောက်အပ်ဒိတ်များ ရရှိပါမည်။"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"ဤအက်ပ်ရှိ အပ်ဒိတ်များကို လောလောဆယ်တွင် <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> က စီမံထားသည်။\n\n<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> ထံမှ ဤအပ်ဒိတ်ကို ထည့်သွင်းလိုပါသလား။"</string> <string name="install_failed" msgid="5777824004474125469">"အက်ပ်မထည့်သွင်းရသေးပါ"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ပက်ကေ့ဂျ်ထည့်သွင်းခြင်းကို ပိတ်ထားသည်။"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ပက်ကေ့ဂျ်အဖြစ် ထည့်သွင်းမထားသော အက်ပ်သည် လက်ရှိပက်ကေ့ဂျ်နှင့် တိုက်နေသည်။"</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ကို ဖယ်ရှားနေပါသည်…"</string> <string name="uninstall_done" msgid="439354138387969269">"ဖယ်ရှားပြီးပါပြီ။"</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ကို ဖယ်ရှားလိုက်ပါပြီ"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ပုံတူပွားကို ဖျက်လိုက်ပါပြီ"</string> <string name="uninstall_failed" msgid="1847750968168364332">"ဖယ်ရှား၍ မရပါ။"</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ကို ဖယ်ရှား၍မရပါ။"</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ပုံတူပွားကို ဖျက်နေသည်…"</string> diff --git a/packages/PackageInstaller/res/values-nb/strings.xml b/packages/PackageInstaller/res/values-nb/strings.xml index ad49d5253cce..8ec94e012476 100644 --- a/packages/PackageInstaller/res/values-nb/strings.xml +++ b/packages/PackageInstaller/res/values-nb/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Appen er installert."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vil du installere denne appen?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vil du oppdatere denne appen?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Oppdateringer for denne appen administreres nå av <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nVed å oppdatere får du fremtidige oppdateringer fra <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> i stedet."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Oppdateringer for denne appen administreres nå av <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nVil du installere denne oppdateringen fra <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Appen ble ikke installert."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Pakken er blokkert fra å bli installert."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Appen ble ikke installert fordi pakken er i konflikt med en eksisterende pakke."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Avinstallerer <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> …"</string> <string name="uninstall_done" msgid="439354138387969269">"Avinstalleringen er fullført."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Avinstallerte <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Klonen av <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> er slettet"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Avinstalleringen mislyktes."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Kunne ikke avinstallere <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Sletter <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-klonen …"</string> diff --git a/packages/PackageInstaller/res/values-ne/strings.xml b/packages/PackageInstaller/res/values-ne/strings.xml index 034c6f6617e2..e763ae1ceefd 100644 --- a/packages/PackageInstaller/res/values-ne/strings.xml +++ b/packages/PackageInstaller/res/values-ne/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"एप इन्स्टल गरियो।"</string> <string name="install_confirm_question" msgid="7663733664476363311">"तपाईं यो एप इन्स्टल गर्न चाहनुहुन्छ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"तपाईं यो एप अपडेट गर्न चाहनुहुन्छ?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ले हाल यो एपका अपडेटहरू व्यवस्थापन गर्छ।\n\nतपाईंले अपडेट गर्नुभयो भने तपाईं भविष्यमा <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> बाट अपडेटहरू प्राप्त गर्नु हुने छ।"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ले हाल यो एपका अपडेटहरू व्यवस्थापन गर्छ।\n\nतपाईं <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> ले उपलब्ध गराएको यो अपडेट इन्स्टल गर्न चाहनुहुन्छ?"</string> <string name="install_failed" msgid="5777824004474125469">"एप स्थापना गरिएन।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"यो प्याकेज स्थापना गर्ने क्रममा अवरोध गरियो।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"प्याकेजका रूपमा स्थापना नगरिएको एप विद्यमान प्याकेजसँग मेल खाँदैन।"</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> को स्थापना रद्द गर्दै…"</string> <string name="uninstall_done" msgid="439354138387969269">"स्थापना रद्द गर्ने काम सम्पन्न भयो।"</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> अनइन्स्टल गरियो"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> क्लोन मेटाइयो"</string> <string name="uninstall_failed" msgid="1847750968168364332">"स्थापना रद्द गर्न सकिएन।"</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> को स्थापना रद्द गर्ने कार्य असफल भयो।"</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> क्लोन मेटाइँदै छ…"</string> diff --git a/packages/PackageInstaller/res/values-nl/strings.xml b/packages/PackageInstaller/res/values-nl/strings.xml index 1a732823073c..c0a3c8ee872e 100644 --- a/packages/PackageInstaller/res/values-nl/strings.xml +++ b/packages/PackageInstaller/res/values-nl/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"App geïnstalleerd."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Wil je deze app installeren?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Wil je deze app updaten?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Updates voor deze app worden momenteel beheerd door <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nAls je updatet, krijg je volgende updates in plaats daarvan van <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Updates voor deze app worden momenteel beheerd door <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nWil je deze update van <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> installeren?"</string> <string name="install_failed" msgid="5777824004474125469">"App niet geïnstalleerd."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"De installatie van het pakket is geblokkeerd."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"App die niet is geïnstalleerd als pakket conflicteert met een bestaand pakket."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> verwijderen…"</string> <string name="uninstall_done" msgid="439354138387969269">"Verwijdering voltooid."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> verwijderd"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Kloon van <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> verwijderd"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Verwijdering mislukt."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> kan niet worden verwijderd."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>-kloon verwijderen…"</string> diff --git a/packages/PackageInstaller/res/values-or/strings.xml b/packages/PackageInstaller/res/values-or/strings.xml index 95ad47055093..965c7d8a5d98 100644 --- a/packages/PackageInstaller/res/values-or/strings.xml +++ b/packages/PackageInstaller/res/values-or/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"ଆପ ଇନଷ୍ଟଲ ହୋଇଗଲା।"</string> <string name="install_confirm_question" msgid="7663733664476363311">"ଆପଣ ଏହି ଆପକୁ ଇନଷ୍ଟଲ୍ କରିବା ପାଇଁ ଚାହୁଁଛନ୍ତି କି?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ଆପଣ ଏହି ଆପକୁ ଅପଡେଟ୍ କରିବା ପାଇଁ ଚାହୁଁଛନ୍ତି କି?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"ଏହି ଆପରେ ଅପଡେଟଗୁଡ଼ିକ ବର୍ତ୍ତମାନ <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି।\n\nଅପଡେଟ କରି, ଆପଣ ଏହା ପରିବର୍ତ୍ତେ <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>ରୁ ଭବିଷ୍ୟତର ଅପଡେଟଗୁଡ଼ିକ ପାଇବେ।"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"ଏହି ଆପରେ ଅପଡେଟଗୁଡ଼ିକ ବର୍ତ୍ତମାନ <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି।\n\nଆପଣ <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>ରୁ ଏହି ଅପଡେଟ ଇନଷ୍ଟଲ କରିବାକୁ ଚାହାଁନ୍ତି?"</string> <string name="install_failed" msgid="5777824004474125469">"ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇନାହିଁ।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ଏହି ପ୍ୟାକେଜ୍କୁ ଇନଷ୍ଟଲ୍ କରାଯିବାରୁ ଅବରୋଧ କରାଯାଇଥିଲା।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ପୂର୍ବରୁ ଥିବା ପ୍ୟାକେଜ୍ ସହ ଏହି ପ୍ୟାକେଜ୍ର ସମସ୍ୟା ଉପୁଯିବାରୁ ଆପ୍ ଇନଷ୍ଟଲ୍ ହୋଇପାରିଲା ନାହିଁ।"</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ଅନଇନଷ୍ଟଲ୍ କରାଯାଉଛି…"</string> <string name="uninstall_done" msgid="439354138387969269">"ଅନଇନଷ୍ଟଲ୍ ହୋଇଗଲା।"</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>କୁ ଅନଇନଷ୍ଟଲ୍ କରାଗଲା"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ର କ୍ଲୋନକୁ ଡିଲିଟ କରାଯାଇଛି"</string> <string name="uninstall_failed" msgid="1847750968168364332">"ଅନଇନଷ୍ଟଲ୍ କରିହେଲା ନାହିଁ।"</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ଅନଇନଷ୍ଟଲ୍ କରିବା ସଫଳ ହେଲାନାହିଁ।"</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> କ୍ଲୋନକୁ ଡିଲିଟ କରାଯାଉଛି…"</string> diff --git a/packages/PackageInstaller/res/values-pa/strings.xml b/packages/PackageInstaller/res/values-pa/strings.xml index 9e6b9b82cc58..2a3068c42cb0 100644 --- a/packages/PackageInstaller/res/values-pa/strings.xml +++ b/packages/PackageInstaller/res/values-pa/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"ਐਪ ਸਥਾਪਤ ਕੀਤੀ ਗਈ।"</string> <string name="install_confirm_question" msgid="7663733664476363311">"ਕੀ ਤੁਸੀਂ ਇਸ ਐਪ ਨੂੰ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ਕੀ ਤੁਸੀਂ ਇਸ ਐਪ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"ਫ਼ਿਲਹਾਲ ਇਸ ਐਪ ਦੇ ਅੱਪਡੇਟਾਂ ਦਾ ਪ੍ਰਬੰਧਨ <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n\nਅੱਪਡੇਟ ਕਰਨ ਨਾਲ, ਇਸਦੀ ਬਜਾਏ ਤੁਹਾਨੂੰ <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> ਤੋਂ ਭਵਿੱਖੀ ਅੱਪਡੇਟ ਪ੍ਰਾਪਤ ਹੋਣਗੇ।"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"ਫ਼ਿਲਹਾਲ ਇਸ ਐਪ ਦੇ ਅੱਪਡੇਟਾਂ ਦਾ ਪ੍ਰਬੰਧਨ <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n\nਕੀ ਤੁਸੀਂ <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> ਵੱਲੋਂ ਇਸ ਅੱਪਡੇਟ ਨੂੰ ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ।"</string> <string name="install_failed" msgid="5777824004474125469">"ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੀ ਗਈ।"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ਪੈਕੇਜ ਨੂੰ ਸਥਾਪਤ ਹੋਣ ਤੋਂ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਸੀ।"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ਪੈਕੇਜ ਦੇ ਇੱਕ ਮੌਜੂਦਾ ਪੈਕੇਜ ਨਾਲ ਵਿਵਾਦ ਹੋਣ ਕਰਕੇ ਐਪ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤੀ ਗਈ।"</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ਨੂੰ ਅਣਸਥਾਪਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string> <string name="uninstall_done" msgid="439354138387969269">"ਅਣਸਥਾਪਤ ਕਰਨਾ ਮੁਕੰਮਲ ਹੋਇਆ।"</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ਨੂੰ ਅਣਸਥਾਪਤ ਕੀਤਾ ਗਿਆ"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ਕਲੋਨ ਨੂੰ ਮਿਟਾਇਆ ਗਿਆ"</string> <string name="uninstall_failed" msgid="1847750968168364332">"ਅਣਸਥਾਪਤ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ।"</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ਨੂੰ ਅਣਸਥਾਪਤ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ।"</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ਦੇ ਕਲੋਨ ਨੂੰ ਮਿਟਾਇਆ ਜਾ ਰਿਹਾ ਹੈ…"</string> diff --git a/packages/PackageInstaller/res/values-pl/strings.xml b/packages/PackageInstaller/res/values-pl/strings.xml index 678432558d03..dc4e0c98aa9c 100644 --- a/packages/PackageInstaller/res/values-pl/strings.xml +++ b/packages/PackageInstaller/res/values-pl/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacja została zainstalowana."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Zainstalować tę aplikację?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Zaktualizować tę aplikację?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Aktualizacjami tej aplikacji zarządza obecnie <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nJeśli pobierzesz aktualizację, przyszłe aktualizacje będzie zapewniać <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Aktualizacjami tej aplikacji zarządza obecnie <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nChcesz zainstalować tę aktualizację ze źródła <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Aplikacja nie została zainstalowana."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instalacja pakietu została zablokowana."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacja nie została zainstalowana, bo powoduje konflikt z istniejącym pakietem."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Odinstalowuję <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Odinstalowywanie zakończone."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Odinstalowano aplikację <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Usunięto klon aplikacji <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Nie udało się odinstalować."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Nie udało się odinstalować pakietu <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Usuwam klona aplikacji <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-pt-rBR/strings.xml b/packages/PackageInstaller/res/values-pt-rBR/strings.xml index 8514aebabe50..a5ee82bd4840 100644 --- a/packages/PackageInstaller/res/values-pt-rBR/strings.xml +++ b/packages/PackageInstaller/res/values-pt-rBR/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"App instalado."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Quer instalar esse app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Quer atualizar esse app?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"No momento, as atualizações deste app são gerenciadas por <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nAo atualizar, você receberá as atualizações futuras de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"No momento, as atualizações deste app são gerenciadas por <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nGostaria de instalar esta atualização de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"O app não foi instalado."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"A instalação do pacote foi bloqueada."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Como o pacote tem um conflito com um pacote já existente, o app não foi instalado."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Desinstalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Desinstalação concluída."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> desinstalado"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"O clone de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> foi excluído"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Falha na desinstalação."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Falha na desinstalação de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Excluindo o clone <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-pt-rPT/strings.xml b/packages/PackageInstaller/res/values-pt-rPT/strings.xml index 248c3668cd52..9e80a970099f 100644 --- a/packages/PackageInstaller/res/values-pt-rPT/strings.xml +++ b/packages/PackageInstaller/res/values-pt-rPT/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"App instalada."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Instalar esta app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Pretende atualizar esta app?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Atualmente, as atualizações desta app são geridas por <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nAo atualizar, vai obter atualizações futuras de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Atualmente, as atualizações desta app são geridas por <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nQuer instalar esta atualização de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Aplicação não instalada."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Foi bloqueada a instalação do pacote."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"A app não foi instalada porque o pacote entra em conflito com um pacote existente."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"A desinstalar a app <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Desinstalação concluída."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"A app <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> foi desinstalada"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Clone de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> apagado"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Desinstalação sem êxito."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Falha ao desinstalar a app <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"A apagar o clone de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-pt/strings.xml b/packages/PackageInstaller/res/values-pt/strings.xml index 8514aebabe50..a5ee82bd4840 100644 --- a/packages/PackageInstaller/res/values-pt/strings.xml +++ b/packages/PackageInstaller/res/values-pt/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"App instalado."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Quer instalar esse app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Quer atualizar esse app?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"No momento, as atualizações deste app são gerenciadas por <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nAo atualizar, você receberá as atualizações futuras de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"No momento, as atualizações deste app são gerenciadas por <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nGostaria de instalar esta atualização de <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"O app não foi instalado."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"A instalação do pacote foi bloqueada."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Como o pacote tem um conflito com um pacote já existente, o app não foi instalado."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Desinstalando <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Desinstalação concluída."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> desinstalado"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"O clone de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> foi excluído"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Falha na desinstalação."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Falha na desinstalação de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Excluindo o clone <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-ro/strings.xml b/packages/PackageInstaller/res/values-ro/strings.xml index 2dc2b0c43831..09693bffdc5e 100644 --- a/packages/PackageInstaller/res/values-ro/strings.xml +++ b/packages/PackageInstaller/res/values-ro/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Aplicație instalată."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vrei să instalezi această aplicație?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vrei să actualizezi această aplicație?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Actualizările acestei aplicații sunt gestionate de <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nDacă actualizezi, vei primi actualizări de la <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Actualizările acestei aplicații sunt gestionate de <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nVrei să instalezi această actualizare de la <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Aplicația nu a fost instalată."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instalarea pachetului a fost blocată."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplicația nu a fost instalată deoarece pachetul intră în conflict cu un pachet existent."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Se dezinstalează <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Dezinstalare finalizată."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> s-a dezinstalat"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Clona pentru <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> a fost ștearsă"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Dezinstalare nefinalizată."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> nu s-a putut dezinstala."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Se șterge clona <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-ru/strings.xml b/packages/PackageInstaller/res/values-ru/strings.xml index e811b4e34544..957f294e54ca 100644 --- a/packages/PackageInstaller/res/values-ru/strings.xml +++ b/packages/PackageInstaller/res/values-ru/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Приложение установлено."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Установить приложение?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Обновить приложение?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"В настоящее время обновлениями этого приложения управляет <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nЕсли вы установите обновление, то все последующие будете получать от <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"В настоящее время обновлениями этого приложения управляет <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nВы хотите установить это обновление от <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Приложение не установлено."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Установка пакета заблокирована."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Приложение не установлено, так как оно конфликтует с другим пакетом."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Удаление приложения \"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>\"…"</string> <string name="uninstall_done" msgid="439354138387969269">"Удаление завершено."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Приложение \"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>\" удалено."</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Клон приложения \"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>\" удален."</string> <string name="uninstall_failed" msgid="1847750968168364332">"При удалении произошла ошибка."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Не удалось удалить приложение \"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>\"."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Удаление клона пакета \"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>\"…"</string> diff --git a/packages/PackageInstaller/res/values-si/strings.xml b/packages/PackageInstaller/res/values-si/strings.xml index dfd88ef7f05e..cfe29cb32cdd 100644 --- a/packages/PackageInstaller/res/values-si/strings.xml +++ b/packages/PackageInstaller/res/values-si/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"යෙදුම ස්ථාපනය කර ඇත."</string> <string name="install_confirm_question" msgid="7663733664476363311">"මෙම යෙදුම ස්ථාපනය කිරීමට ඔබට අවශ්යද?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"ඔබට මෙම යෙදුම යාවත්කාලීන කිරීමට අවශ්යද?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"මෙම යෙදුම වෙත යාවත්කාලීන කිරීම් දැනට <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> විසින් කළමනාකරණය කරනු ලැබේ.\n\nයාවත්කාලීන කිරීමෙන්, ඔබට <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> වෙතින් අනාගත යාවත්කාලීන ලැබෙනු ඇත."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"මෙම යෙදුම වෙත යාවත්කාලීන කිරීම් දැනට <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> විසින් කළමනාකරණය කරනු ලැබේ.\n\nඔබට <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> වෙතින් මෙම යාවත්කාලීනය ස්ථාපනය කිරීමට අවශ්ය ද?"</string> <string name="install_failed" msgid="5777824004474125469">"යෙදුම ස්ථාපනය කර නැත."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"මෙම පැකේජය ස්ථාපනය කිරීම අවහිර කරන ලදි."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"පැකේජය දැනට පවතින පැකේජයක් සමග ගැටෙන නිසා යෙදුම ස්ථාපනය නොකරන ලදී."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> අස්ථාපනය කරමින්…"</string> <string name="uninstall_done" msgid="439354138387969269">"අස්ථාපනය කිරීම අවසානයි."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> අස්ථාපනය කරන ලදී"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ක්ලෝනය මකන ලදි"</string> <string name="uninstall_failed" msgid="1847750968168364332">"අස්ථාපනය කිරිම අසාර්ථක විය."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> අස්ථාපනය කිරීම සාර්ථකයි."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ක්ලෝනය මකමින්…"</string> diff --git a/packages/PackageInstaller/res/values-sk/strings.xml b/packages/PackageInstaller/res/values-sk/strings.xml index 8620d60338ac..f4d5631ba6b8 100644 --- a/packages/PackageInstaller/res/values-sk/strings.xml +++ b/packages/PackageInstaller/res/values-sk/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Aplikácia bola nainštalovaná."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Chcete túto aplikáciu nainštalovať?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Chcete túto aplikáciu aktualizovať?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Aktualizácie tejto aplikácie momentálne spravuje vlastník <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nPo aktualizovaní budete namiesto toho získavať budúce aplikácie od vlastníka <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Aktualizácie tejto aplikácie momentálne spravuje vlastník <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nChcete túto aktualizáciu nainštalovať od vlastníka <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Aplikácia nebola nainštalovaná."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Inštalácia balíka bola zablokovaná."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikácia sa nenainštalovala, pretože balík je v konflikte s existujúcim balíkom."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Prebieha odinštalovanie balíka <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Odinštalovanie bolo dokončené."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Balík <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> bol odinštalovaný"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Klon balíka <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> bol odstránený"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Nepodarilo sa odinštalovať."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Balík <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> sa nepodarilo odinštalovať."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Klon <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> sa odstraňuje…"</string> diff --git a/packages/PackageInstaller/res/values-sl/strings.xml b/packages/PackageInstaller/res/values-sl/strings.xml index f083ec264f5a..f12935e29be5 100644 --- a/packages/PackageInstaller/res/values-sl/strings.xml +++ b/packages/PackageInstaller/res/values-sl/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacija je nameščena."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Ali želite namestiti to aplikacijo?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Ali želite posodobiti to aplikacijo?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Posodobitve te aplikacije trenutno upravlja <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nČe posodobite, bo pošiljatelj prihodnjih posodobitev <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Posodobitve te aplikacije trenutno upravlja <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nAli želite namestiti to posodobitev, ki jo je poslal <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Aplikacija ni nameščena."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Namestitev paketa je bila blokirana."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacija ni bila nameščena, ker je paket v navzkrižju z obstoječim paketom."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Odmeščanje aplikacije <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> …"</string> <string name="uninstall_done" msgid="439354138387969269">"Odstranitev je končana."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Aplikacija <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> je bila odstranjena."</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Klonirani paket <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> je izbrisan"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Odstranitev ni uspela."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Odmeščanje aplikacije <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ni uspelo."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Brisanje kloniranega paketa <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> …"</string> diff --git a/packages/PackageInstaller/res/values-sq/strings.xml b/packages/PackageInstaller/res/values-sq/strings.xml index 271a7b30128f..f58efea0d2ba 100644 --- a/packages/PackageInstaller/res/values-sq/strings.xml +++ b/packages/PackageInstaller/res/values-sq/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Aplikacioni u instalua."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Dëshiron ta instalosh këtë aplikacion?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Dëshiron ta përditësosh këtë aplikacion?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Përditësimet për këtë aplikacion menaxhohen aktualisht nga <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nDuke e përditësuar, përditësimet në të ardhmen do t\'i marrësh nga <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Përditësimet për këtë aplikacion menaxhohen aktualisht nga <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nDëshiron ta instalosh këtë përditësim nga <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Aplikacioni nuk u instalua."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Instalimi paketës u bllokua."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Aplikacioni nuk u instalua pasi paketa është në konflikt me një paketë ekzistuese."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> po çinstalohet…"</string> <string name="uninstall_done" msgid="439354138387969269">"Çinstalimi përfundoi."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> u çinstalua"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"U fshi kloni i <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Çinstalimi nuk pati sukses."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Çinstalimi i <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> nuk u krye me sukses."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Po fshihet kloni i <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-sr/strings.xml b/packages/PackageInstaller/res/values-sr/strings.xml index 3ac1995481a0..2bfcf653401e 100644 --- a/packages/PackageInstaller/res/values-sr/strings.xml +++ b/packages/PackageInstaller/res/values-sr/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Апликација је инсталирана."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Желите да инсталирате ову апликацију?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Желите да ажурирате ову апликацију?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Ажурирањима ове апликације тренутно управља <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nАко ажурирате, будућа ажурирања ћете добијати од власника <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Ажурирањима ове апликације тренутно управља <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nЖелите ли да инсталирате ово ажурирање власника <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Апликација није инсталирана."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Инсталирање пакета је блокирано."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Апликација није инсталирана јер је пакет неусаглашен са постојећим пакетом."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> се деинсталира…"</string> <string name="uninstall_done" msgid="439354138387969269">"Деинсталирање је завршено."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Апликација <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> је деинсталирана"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Избрисан је <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> клон"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Деинсталирање није успело."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Деинсталирање апликације <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> није успело."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Брише се клон апликације <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-sv/strings.xml b/packages/PackageInstaller/res/values-sv/strings.xml index 86813922df0d..cb12c9148915 100644 --- a/packages/PackageInstaller/res/values-sv/strings.xml +++ b/packages/PackageInstaller/res/values-sv/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Appen har installerats."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Vill du installera den här appen?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Vill du uppdatera den här appen?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Uppdateringar av den här appen hanteras för närvarande av <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nNär du uppdaterar får du i stället uppdateringar från <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Uppdateringar av den här appen hanteras för närvarande av <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nVill du installera den här uppdateringen från <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"Appen har inte installerats."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketet har blockerats för installation."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Appen har inte installerats på grund av en konflikt mellan detta paket och ett befintligt paket."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> avinstalleras …"</string> <string name="uninstall_done" msgid="439354138387969269">"Avinstallationen har slutförts."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> har avinstallerats"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Klonen <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> har raderats"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Det gick inte att avinstallera."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Det gick inte att avinstallera <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Raderar klonen av <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> …"</string> diff --git a/packages/PackageInstaller/res/values-sw/strings.xml b/packages/PackageInstaller/res/values-sw/strings.xml index 849a0424bd67..64e24f94ec57 100644 --- a/packages/PackageInstaller/res/values-sw/strings.xml +++ b/packages/PackageInstaller/res/values-sw/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Imesakinisha programu."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Ungependa kusakinisha programu hii?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Ungependa kusasisha programu hii?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Masasisho ya programu hii kwa sasa yanadhibitiwa na <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nKwa kusasisha, utapata masasisho yajayo kutoka kwa <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> badala yake."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Masasisho ya programu hii kwa sasa yanasimamiwa na <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>\n\nJe, ungependa kusakinisha sasisho hili kutoka kwa <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"Imeshindwa kusakinisha programu."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Kifurushi kimezuiwa kisisakinishwe."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Programu haikusakinishwa kwa sababu kifurushi kinakinzana na kifurushi kingine kilichopo."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Inaondoa <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Imeondolewa."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Imeondoa <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Nakala ya <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> imefutwa"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Imeshindwa kuondoa."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Imeshindwa kuondoa <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Inafuta nakala ya <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-ta/strings.xml b/packages/PackageInstaller/res/values-ta/strings.xml index 564606a7edbf..71970c49cf37 100644 --- a/packages/PackageInstaller/res/values-ta/strings.xml +++ b/packages/PackageInstaller/res/values-ta/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"ஆப்ஸ் நிறுவப்பட்டது."</string> <string name="install_confirm_question" msgid="7663733664476363311">"இந்த ஆப்ஸை நிறுவ வேண்டுமா?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"இந்த ஆப்ஸைப் புதுப்பிக்க வேண்டுமா?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"இந்த ஆப்ஸுக்கான புதுப்பிப்புகள் தற்போது <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> மூலம் நிர்வகிக்கப்படுகின்றன.\n\nபுதுப்பிப்பதன் மூலம் இனிவரும் புதுப்பிப்புகளை <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> மூலம் பெறுவீர்கள்."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"இந்த ஆப்ஸுக்கான புதுப்பிப்புகள் தற்போது <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> மூலம் நிர்வகிக்கப்படுகின்றன.\n\n<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> மூலம் இந்தப் புதுப்பிப்பை நிறுவ விரும்புகிறீர்களா?"</string> <string name="install_failed" msgid="5777824004474125469">"ஆப்ஸ் நிறுவப்படவில்லை."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"இந்தத் தொகுப்பு நிறுவப்படுவதிலிருந்து தடுக்கப்பட்டது."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"இந்தத் தொகுப்பு ஏற்கனவே உள்ள தொகுப்புடன் முரண்படுவதால் ஆப்ஸ் நிறுவப்படவில்லை."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ஐ நிறுவல் நீக்குகிறது…"</string> <string name="uninstall_done" msgid="439354138387969269">"நிறுவல் நீக்கம் முடிந்தது."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> நிறுவல் நீக்கப்பட்டது"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> குளோன் நீக்கபட்டது"</string> <string name="uninstall_failed" msgid="1847750968168364332">"நிறுவல் நீக்க இயலவில்லை."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ஐ நிறுவல் நீக்குவதில் தோல்வி."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> குளோனை நீக்குகிறது…"</string> diff --git a/packages/PackageInstaller/res/values-te/strings.xml b/packages/PackageInstaller/res/values-te/strings.xml index b1662eb084f5..67a15fb9f0c1 100644 --- a/packages/PackageInstaller/res/values-te/strings.xml +++ b/packages/PackageInstaller/res/values-te/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"యాప్ ఇన్స్టాల్ చేయబడింది."</string> <string name="install_confirm_question" msgid="7663733664476363311">"మీరు ఈ యాప్ను ఇన్స్టాల్ చేయాలనుకుంటున్నారా?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"మీరు ఈ యాప్ను అప్డేట్ చేయాలనుకుంటున్నారా?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"ఈ యాప్కి అప్డేట్లు ప్రస్తుతం <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ద్వారా మేనేజ్ చేయబడుతున్నాయి.\n\nఅప్డేట్ చేయడం ద్వారా, మీరు అందుకు బదులుగా <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> నుండి భవిష్యత్తు అప్డేట్లను పొందుతారు."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"ఈ యాప్కి అప్డేట్లు ప్రస్తుతం<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ద్వారా మేనేజ్ చేయబడుతున్నాయి.\n\nమీరు <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> నుండి ఈ అప్డేట్ను ఇన్స్టాల్ చేయాలనుకుంటున్నారా."</string> <string name="install_failed" msgid="5777824004474125469">"యాప్ ఇన్స్టాల్ చేయబడలేదు."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"ప్యాకేజీ ఇన్స్టాల్ కాకుండా బ్లాక్ చేయబడింది."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ప్యాకేజీ, అలాగే ఇప్పటికే ఉన్న ప్యాకేజీ మధ్య వైరుధ్యం ఉన్నందున యాప్ ఇన్స్టాల్ చేయబడలేదు."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>ని అన్ఇన్స్టాల్ చేస్తోంది…"</string> <string name="uninstall_done" msgid="439354138387969269">"అన్ఇన్స్టాల్ చేయడం ముగిసింది."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> అన్ఇన్స్టాల్ చేయబడింది"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"తొలగించబడిన <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> క్లోన్"</string> <string name="uninstall_failed" msgid="1847750968168364332">"అన్ఇన్స్టాల్ చేయడం విజయవంతం కాలేదు."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> అన్ఇన్స్టాల్ చేయడంలో విఫలమైంది."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> క్లోన్ను తొలగిస్తోంది…"</string> diff --git a/packages/PackageInstaller/res/values-th/strings.xml b/packages/PackageInstaller/res/values-th/strings.xml index c0fe2ed1bde2..de8f727e9d62 100644 --- a/packages/PackageInstaller/res/values-th/strings.xml +++ b/packages/PackageInstaller/res/values-th/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"ติดตั้งแอปแล้ว"</string> <string name="install_confirm_question" msgid="7663733664476363311">"คุณต้องการติดตั้งแอปนี้ไหม"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"คุณต้องการอัปเดตแอปนี้ไหม"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"ขณะนี้ <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> เป็นผู้จัดการการอัปเดตแอปนี้\n\nหากอัปเดต คุณจะได้รับการอัปเดตในอนาคตจาก <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> แทน"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"ขณะนี้ <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> เป็นผู้จัดการการอัปเดตแอปนี้\n\nคุณต้องการติดตั้งการอัปเดตนี้จาก <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> ไหม"</string> <string name="install_failed" msgid="5777824004474125469">"ไม่ได้ติดตั้งแอป"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"มีการบล็อกแพ็กเกจไม่ให้ติดตั้ง"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ไม่ได้ติดตั้งแอปเพราะแพ็กเกจขัดแย้งกับแพ็กเกจที่มีอยู่"</string> diff --git a/packages/PackageInstaller/res/values-tl/strings.xml b/packages/PackageInstaller/res/values-tl/strings.xml index f194e86fb03d..add425806c42 100644 --- a/packages/PackageInstaller/res/values-tl/strings.xml +++ b/packages/PackageInstaller/res/values-tl/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Na-install na ang app."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Gusto mo bang i-install ang app na ito?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Gusto mo bang i-update ang app na ito?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Kasalukuyang pinamamahalaan ng <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ang mga update sa app na ito.\n\nSa pamamagitan ng pag-update, makakakuha ka na lang ng mga update sa hinaharap mula sa <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Kasalukuyang pinamamahalaan ng <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> ang mga update sa app na ito.\n\nGusto mo bang i-install ang update na ito mula sa <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"Hindi na-install ang app."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Na-block ang pag-install sa package."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Hindi na-install ang app dahil nagkakaproblema ang package sa isang dati nang package."</string> diff --git a/packages/PackageInstaller/res/values-tr/strings.xml b/packages/PackageInstaller/res/values-tr/strings.xml index fb64517cc707..a006c068c818 100644 --- a/packages/PackageInstaller/res/values-tr/strings.xml +++ b/packages/PackageInstaller/res/values-tr/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Uygulama yüklendi."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Bu uygulamayı yüklemek istiyor musunuz?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Bu uygulamayı güncellemek istiyor musunuz?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Bu uygulamadaki güncellemeler şu anda <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> tarafından yönetiliyor.\n\nUygulamayı güncellerseniz bundan sonraki güncellemeleri <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> gönderecektir."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Bu uygulamadaki güncellemeler şu anda <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> tarafından yönetiliyor.\n\n<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> tarafından gönderilen bu güncellemeyi yüklemek istiyor musunuz?"</string> <string name="install_failed" msgid="5777824004474125469">"Uygulama yüklenmedi."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paketin yüklemesi engellendi."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Paket, mevcut bir paketle çakıştığından uygulama yüklenemedi."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> uygulamasının yüklemesi kaldırılıyor…"</string> <string name="uninstall_done" msgid="439354138387969269">"Yüklemeyi kaldırma işlemi tamamlandı."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> uygulamasının yüklemesi kaldırıldı"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> klonu silindi"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Yükleme kaldırılamadı."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> uygulamasının yüklemesi kaldırılamadı."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> klonu siliniyor…"</string> diff --git a/packages/PackageInstaller/res/values-uk/strings.xml b/packages/PackageInstaller/res/values-uk/strings.xml index 1b805d3047f4..d8928e53e80a 100644 --- a/packages/PackageInstaller/res/values-uk/strings.xml +++ b/packages/PackageInstaller/res/values-uk/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Програму встановлено."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Установити цей додаток?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Оновити цей додаток?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Оновленнями для цього додатка наразі керує <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nОновивши його зараз, ви надалі отримуватимете оновлення від <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Оновленнями для цього додатка наразі керує <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nУстановити це оновлення від <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>?"</string> <string name="install_failed" msgid="5777824004474125469">"Програму не встановлено."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Встановлення пакета заблоковано."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Додаток не встановлено, оскільки пакет конфліктує з наявним пакетом."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Видалення додатка <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Видалено."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Додаток <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> видалено"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Копію <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> видалено"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Не видалено."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Не вдалося видалити додаток <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Видалення копії додатка <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-ur/strings.xml b/packages/PackageInstaller/res/values-ur/strings.xml index 03ee46a52e41..ab11cd871a54 100644 --- a/packages/PackageInstaller/res/values-ur/strings.xml +++ b/packages/PackageInstaller/res/values-ur/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"ایپ انسٹال ہو گئی۔"</string> <string name="install_confirm_question" msgid="7663733664476363311">"کیا آپ یہ ایپ انسٹال کرنا چاہتے ہیں؟"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"کیا آپ یہ ایپ اپ ڈیٹ کرنا چاہتے ہیں؟"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"اس ایپس میں اپ ڈیٹس <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> کے زیر انتظام ہیں۔\n\nاپ ڈیٹ کر کے، آپ اس کے بجائے <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> سے مستقبل کی اپ ڈیٹس موصول کر سکتے ہیں۔"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"اس ایپس میں اپ ڈیٹس <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> کے زیر انتظام ہیں۔\n\nآپ یہ اپ ڈیٹ <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> سے انسٹال کرنا چاہتے ہیں۔"</string> <string name="install_failed" msgid="5777824004474125469">"ایپ انسٹال نہیں ہوئی۔"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"پیکج کو انسٹال ہونے سے مسدود کر دیا گیا تھا۔"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"ایپ انسٹال نہیں ہوئی کیونکہ پیکج ایک موجودہ پیکیج سے متصادم ہے۔"</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ان انسٹال ہو رہا ہے…"</string> <string name="uninstall_done" msgid="439354138387969269">"اَن انسٹال مکمل ہو گیا۔"</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> اَن انسٹال ہو گیا"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> کا کلون حذف کر دیا گیا ہے"</string> <string name="uninstall_failed" msgid="1847750968168364332">"اَن انسٹال ناکام ہو گیا۔"</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> کو ان انسٹال کرنا ناکام ہو گیا۔"</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> کلون کو حذف کیا جا رہا ہے…"</string> diff --git a/packages/PackageInstaller/res/values-uz/strings.xml b/packages/PackageInstaller/res/values-uz/strings.xml index aeb00cc6d624..bb225bccbf26 100644 --- a/packages/PackageInstaller/res/values-uz/strings.xml +++ b/packages/PackageInstaller/res/values-uz/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Ilova o‘rnatildi."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Bu ilovani oʻrnatmoqchimisiz?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Bu ilova yangilansinmi?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Bu ilova yangilanishlari hozirda <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> boshqaruvida.\n\nYangilanishida kelgusi oʻzgarishlar <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> dan keladi."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Bu ilova yangilanishlari hozirda <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> boshqaruvida.\n\nBu yangilanish <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> dan oʻrnatilsinmi?"</string> <string name="install_failed" msgid="5777824004474125469">"Ilova o‘rnatilmadi."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Paket o‘rnatilishga qarshi bloklangan."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Paket mavjud paket bilan zid kelganligi uchun ilovani o‘rnatib bo‘lmadi."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> o‘chirilmoqda…"</string> <string name="uninstall_done" msgid="439354138387969269">"O‘chirib tashlandi."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> o‘chirib tashlandi"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> nusxasi oʻchirildi"</string> <string name="uninstall_failed" msgid="1847750968168364332">"O‘chirib tashlanmadi."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> ilovasini o‘chirib bo‘lmadi."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> nusxasi oʻchirilmoqda…"</string> diff --git a/packages/PackageInstaller/res/values-vi/strings.xml b/packages/PackageInstaller/res/values-vi/strings.xml index 7fbc74cd50ed..1e0df14fbf01 100644 --- a/packages/PackageInstaller/res/values-vi/strings.xml +++ b/packages/PackageInstaller/res/values-vi/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Ứng dụng đã được cài đặt."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Bạn có muốn cài đặt ứng dụng này không?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Bạn có muốn cập nhật ứng dụng này không?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Hiện tại, <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> đang quản lý các bản cập nhật của ứng dụng này.\n\nBằng việc cập nhật, bạn sẽ nhận được các bản cập nhật sau này của <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Hiện tại, <xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g> đang quản lý các bản cập nhật của ứng dụng này.\n\nBạn có muốn cài đặt bản cập nhật này của <xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> không?"</string> <string name="install_failed" msgid="5777824004474125469">"Ứng dụng chưa được cài đặt."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Đã chặn cài đặt gói."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Chưa cài đặt được ứng dụng do gói xung đột với một gói hiện có."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Đang gỡ cài đặt <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Đã gỡ cài đặt xong."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Đã gỡ cài đặt <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Đã xoá bản sao của <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Gỡ cài đặt không thành công."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Gỡ cài đặt <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> không thành công."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Đang xoá bản sao của <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> diff --git a/packages/PackageInstaller/res/values-zh-rCN/strings.xml b/packages/PackageInstaller/res/values-zh-rCN/strings.xml index b5f3cba5801b..f25da81a2212 100644 --- a/packages/PackageInstaller/res/values-zh-rCN/strings.xml +++ b/packages/PackageInstaller/res/values-zh-rCN/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"已安装应用。"</string> <string name="install_confirm_question" msgid="7663733664476363311">"要安装此应用吗?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"要更新此应用吗?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"此应用的更新目前由<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>管理。\n\n更新后,将改由<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>向您提供日后的更新。"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"此应用的更新目前由<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>管理。\n\n要安装这个来自<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>的更新吗?"</string> <string name="install_failed" msgid="5777824004474125469">"未安装应用。"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"系统已禁止安装该软件包。"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"应用未安装:软件包与现有软件包存在冲突。"</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"正在卸载<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"卸载完成。"</string> <string name="uninstall_done_app" msgid="4588850984473605768">"已卸载<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"已删除<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>克隆"</string> <string name="uninstall_failed" msgid="1847750968168364332">"卸载失败。"</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"卸载<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>失败。"</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"正在删除 <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> 克隆应用…"</string> diff --git a/packages/PackageInstaller/res/values-zh-rHK/strings.xml b/packages/PackageInstaller/res/values-zh-rHK/strings.xml index 74e8bea236a5..46f3b9f7a4d3 100644 --- a/packages/PackageInstaller/res/values-zh-rHK/strings.xml +++ b/packages/PackageInstaller/res/values-zh-rHK/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"已安裝應用程式。"</string> <string name="install_confirm_question" msgid="7663733664476363311">"要安裝此應用程式嗎?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"要更新此應用程式嗎?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"此應用程式的更新目前由「<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>」管理。\n\n更新後將改由「<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>」提供更新。"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"此應用程式的更新目前由「<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>」管理。\n\n是否要安裝這項由「<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>」提供的更新?"</string> <string name="install_failed" msgid="5777824004474125469">"未安裝應用程式。"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"套件已遭封鎖,無法安裝。"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"套件與現有的套件發生衝突,無法安裝應用程式。"</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"正在解除安裝「<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>」…"</string> <string name="uninstall_done" msgid="439354138387969269">"完成解除安裝。"</string> <string name="uninstall_done_app" msgid="4588850984473605768">"已解除安裝「<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>」"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"已刪除「<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>」複製本"</string> <string name="uninstall_failed" msgid="1847750968168364332">"解除安裝失敗。"</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"解除安裝「<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>」失敗。"</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"正在刪除「<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>」複製本…"</string> diff --git a/packages/PackageInstaller/res/values-zh-rTW/strings.xml b/packages/PackageInstaller/res/values-zh-rTW/strings.xml index a3380158f42f..cf8cd599ba08 100644 --- a/packages/PackageInstaller/res/values-zh-rTW/strings.xml +++ b/packages/PackageInstaller/res/values-zh-rTW/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"已安裝應用程式。"</string> <string name="install_confirm_question" msgid="7663733664476363311">"要安裝這個應用程式嗎?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"要更新這個應用程式嗎?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"這個應用程式的更新目前是由「<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>」管理。\n\n更新後,將改由「<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>」提供更新。"</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"這個應用程式的更新目前是由「<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>」管理。\n\n是否要安裝「<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>」提供的這項更新?"</string> <string name="install_failed" msgid="5777824004474125469">"未安裝應用程式。"</string> <string name="install_failed_blocked" msgid="8512284352994752094">"系統已封鎖這個套件,因此無法安裝。"</string> <string name="install_failed_conflict" msgid="3493184212162521426">"應用程式套件與現有套件衝突,因此未能完成安裝。"</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"正在解除安裝「<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>」…"</string> <string name="uninstall_done" msgid="439354138387969269">"已順利解除安裝。"</string> <string name="uninstall_done_app" msgid="4588850984473605768">"已解除安裝「<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>」"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"已刪除「<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>」副本"</string> <string name="uninstall_failed" msgid="1847750968168364332">"無法解除安裝。"</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"無法解除安裝「<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>」。"</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"正在刪除「<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>」副本…"</string> diff --git a/packages/PackageInstaller/res/values-zu/strings.xml b/packages/PackageInstaller/res/values-zu/strings.xml index 9298cbd783e1..afdfd822996e 100644 --- a/packages/PackageInstaller/res/values-zu/strings.xml +++ b/packages/PackageInstaller/res/values-zu/strings.xml @@ -26,8 +26,6 @@ <string name="install_done" msgid="5987363587661783896">"Uhlelo lokusebenza olufakiwe."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Ingabe ufuna ukufaka le app?"</string> <string name="install_confirm_question_update" msgid="3348888852318388584">"Ingabe ufuna ukubuyekeza le app?"</string> - <string name="install_confirm_question_update_owner_changed" msgid="4215696609006069124">"Izibuyekezo zale app okwamanje ziphethwe yi-<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nNgokubuyekeza, kunalokho uzothola izibuyekezo zesikhathi esizayo ezivela ku-<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g> esikhundleni."</string> - <string name="install_confirm_question_update_owner_reminder" msgid="8778026710268011466">"Izibuyekezo zale app okwamanje ziphethwe yi-<xliff:g id="EXISTING_UPDATE_OWNER">%1$s</xliff:g>.\n\nUyafuna ukufaka lesi sibuyekezo esivela ku-<xliff:g id="NEW_UPDATE_OWNER">%2$s</xliff:g>."</string> <string name="install_failed" msgid="5777824004474125469">"Uhlelo lokusebenza alufakiwe."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Iphakheji livinjiwe kusukela ekufakweni."</string> <string name="install_failed_conflict" msgid="3493184212162521426">"Uhlelo lokusebenza alufakiwe njengoba ukuphakheja kushayisana nephakheji elikhona."</string> @@ -70,8 +68,7 @@ <string name="uninstalling_app" msgid="8866082646836981397">"Ikhipha i-<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="uninstall_done" msgid="439354138387969269">"Ukukhipha kuqedile."</string> <string name="uninstall_done_app" msgid="4588850984473605768">"Kukhishwe i-<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> - <!-- no translation found for uninstall_done_clone_app (5578308154544195413) --> - <skip /> + <string name="uninstall_done_clone_app" msgid="5578308154544195413">"Sula iclone ye-<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>"</string> <string name="uninstall_failed" msgid="1847750968168364332">"Ukukhipha akuphumelelanga."</string> <string name="uninstall_failed_app" msgid="5506028705017601412">"Ukukhipha i-<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> akuphumelele."</string> <string name="uninstalling_cloned_app" msgid="1826380164974984870">"Isula <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> i-clone…"</string> diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java index 7338e645440c..ac32020e842a 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java @@ -80,7 +80,10 @@ public class InstallStart extends Activity { final int originatingUid = getOriginatingUid(sourceInfo); boolean isTrustedSource = false; if (sourceInfo != null && sourceInfo.isPrivilegedApp()) { - isTrustedSource = intent.getBooleanExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, false); + isTrustedSource = intent.getBooleanExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, false) || ( + originatingUid != Process.INVALID_UID && checkPermission( + Manifest.permission.INSTALL_PACKAGES, -1 /* pid */, originatingUid) + == PackageManager.PERMISSION_GRANTED); } if (!isTrustedSource && originatingUid != Process.INVALID_UID) { diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java index 3ec81aa38065..1283f81adab5 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java @@ -297,6 +297,10 @@ public class PackageInstallerActivity extends AlertActivity { return false; } } + if (mSourceInfo != null && checkPermission(Manifest.permission.INSTALL_PACKAGES, + -1 /* pid */, mSourceInfo.uid) == PackageManager.PERMISSION_GRANTED) { + return false; + } return true; } diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt index 4b73e948e1e6..b92729dab7c0 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntry.kt @@ -24,10 +24,6 @@ import androidx.compose.runtime.ProvidedValue import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.remember import com.android.settingslib.spa.framework.compose.LocalNavController -import com.android.settingslib.spa.framework.util.genEntryId - -private const val INJECT_ENTRY_NAME = "INJECT" -private const val ROOT_ENTRY_NAME = "ROOT" interface EntryData { val pageId: String? @@ -164,143 +160,3 @@ data class SettingsEntry( } } } - -/** - * The helper to build a Settings Entry instance. - */ -class SettingsEntryBuilder(private val name: String, private val owner: SettingsPage) { - private var displayName = name - private var fromPage: SettingsPage? = null - private var toPage: SettingsPage? = null - - // Attributes - private var isAllowSearch: Boolean = false - private var isSearchDataDynamic: Boolean = false - private var hasMutableStatus: Boolean = false - private var hasSliceSupport: Boolean = false - - // Functions - private var uiLayoutFn: UiLayerRenderer = { } - private var statusDataFn: StatusDataGetter = { null } - private var searchDataFn: SearchDataGetter = { null } - private var sliceDataFn: SliceDataGetter = { _: Uri, _: Bundle? -> null } - - fun build(): SettingsEntry { - val page = fromPage ?: owner - val isEnabled = page.isEnabled() - return SettingsEntry( - id = genEntryId(name, owner, fromPage, toPage), - name = name, - owner = owner, - displayName = displayName, - - // linking data - fromPage = fromPage, - toPage = toPage, - - // attributes - // TODO: set isEnabled & (isAllowSearch, hasSliceSupport) separately - isAllowSearch = isEnabled && isAllowSearch, - isSearchDataDynamic = isSearchDataDynamic, - hasMutableStatus = hasMutableStatus, - hasSliceSupport = isEnabled && hasSliceSupport, - - // functions - statusDataImpl = statusDataFn, - searchDataImpl = searchDataFn, - sliceDataImpl = sliceDataFn, - uiLayoutImpl = uiLayoutFn, - ) - } - - fun setDisplayName(displayName: String): SettingsEntryBuilder { - this.displayName = displayName - return this - } - - fun setLink( - fromPage: SettingsPage? = null, - toPage: SettingsPage? = null - ): SettingsEntryBuilder { - if (fromPage != null) this.fromPage = fromPage - if (toPage != null) this.toPage = toPage - return this - } - - fun setIsSearchDataDynamic(isDynamic: Boolean): SettingsEntryBuilder { - this.isSearchDataDynamic = isDynamic - return this - } - - fun setHasMutableStatus(hasMutableStatus: Boolean): SettingsEntryBuilder { - this.hasMutableStatus = hasMutableStatus - return this - } - - fun setMacro(fn: (arguments: Bundle?) -> EntryMacro): SettingsEntryBuilder { - setStatusDataFn { fn(it).getStatusData() } - setSearchDataFn { fn(it).getSearchData() } - setUiLayoutFn { - val macro = remember { fn(it) } - macro.UiLayout() - } - return this - } - - fun setStatusDataFn(fn: StatusDataGetter): SettingsEntryBuilder { - this.statusDataFn = fn - return this - } - - fun setSearchDataFn(fn: SearchDataGetter): SettingsEntryBuilder { - this.searchDataFn = fn - this.isAllowSearch = true - return this - } - - fun clearSearchDataFn(): SettingsEntryBuilder { - this.searchDataFn = { null } - this.isAllowSearch = false - return this - } - - fun setSliceDataFn(fn: SliceDataGetter): SettingsEntryBuilder { - this.sliceDataFn = fn - this.hasSliceSupport = true - return this - } - - fun setUiLayoutFn(fn: UiLayerRenderer): SettingsEntryBuilder { - this.uiLayoutFn = fn - return this - } - - companion object { - fun create(entryName: String, owner: SettingsPage): SettingsEntryBuilder { - return SettingsEntryBuilder(entryName, owner) - } - - fun createLinkFrom(entryName: String, owner: SettingsPage): SettingsEntryBuilder { - return create(entryName, owner).setLink(fromPage = owner) - } - - fun createLinkTo(entryName: String, owner: SettingsPage): SettingsEntryBuilder { - return create(entryName, owner).setLink(toPage = owner) - } - - fun create(owner: SettingsPage, entryName: String, displayName: String? = null): - SettingsEntryBuilder { - return SettingsEntryBuilder(entryName, owner).setDisplayName(displayName ?: entryName) - } - - fun createInject(owner: SettingsPage, displayName: String? = null): SettingsEntryBuilder { - val name = displayName ?: "${INJECT_ENTRY_NAME}_${owner.displayName}" - return createLinkTo(INJECT_ENTRY_NAME, owner).setDisplayName(name) - } - - fun createRoot(owner: SettingsPage, displayName: String? = null): SettingsEntryBuilder { - val name = displayName ?: "${ROOT_ENTRY_NAME}_${owner.displayName}" - return createLinkTo(ROOT_ENTRY_NAME, owner).setDisplayName(name) - } - } -} diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntryBuilder.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntryBuilder.kt new file mode 100644 index 000000000000..67f9ea52a40d --- /dev/null +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntryBuilder.kt @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.spa.framework.common + +import android.net.Uri +import android.os.Bundle +import androidx.compose.runtime.remember +import com.android.settingslib.spa.framework.util.genEntryId + +private const val INJECT_ENTRY_NAME = "INJECT" +private const val ROOT_ENTRY_NAME = "ROOT" + +/** + * The helper to build a Settings Entry instance. + */ +class SettingsEntryBuilder(private val name: String, private val owner: SettingsPage) { + private var displayName = name + private var fromPage: SettingsPage? = null + private var toPage: SettingsPage? = null + + // Attributes + private var isAllowSearch: Boolean = false + private var isSearchDataDynamic: Boolean = false + private var hasMutableStatus: Boolean = false + private var hasSliceSupport: Boolean = false + + // Functions + private var uiLayoutFn: UiLayerRenderer = { } + private var statusDataFn: StatusDataGetter = { null } + private var searchDataFn: SearchDataGetter = { null } + private var sliceDataFn: SliceDataGetter = { _: Uri, _: Bundle? -> null } + + fun build(): SettingsEntry { + val page = fromPage ?: owner + val isEnabled = page.isEnabled() + return SettingsEntry( + id = genEntryId(name, owner, fromPage, toPage), + name = name, + owner = owner, + displayName = displayName, + + // linking data + fromPage = fromPage, + toPage = toPage, + + // attributes + // TODO: set isEnabled & (isAllowSearch, hasSliceSupport) separately + isAllowSearch = isEnabled && isAllowSearch, + isSearchDataDynamic = isSearchDataDynamic, + hasMutableStatus = hasMutableStatus, + hasSliceSupport = isEnabled && hasSliceSupport, + + // functions + statusDataImpl = statusDataFn, + searchDataImpl = searchDataFn, + sliceDataImpl = sliceDataFn, + uiLayoutImpl = uiLayoutFn, + ) + } + + fun setDisplayName(displayName: String): SettingsEntryBuilder { + this.displayName = displayName + return this + } + + fun setLink( + fromPage: SettingsPage? = null, + toPage: SettingsPage? = null + ): SettingsEntryBuilder { + if (fromPage != null) this.fromPage = fromPage + if (toPage != null) this.toPage = toPage + return this + } + + fun setIsSearchDataDynamic(isDynamic: Boolean): SettingsEntryBuilder { + this.isSearchDataDynamic = isDynamic + return this + } + + fun setHasMutableStatus(hasMutableStatus: Boolean): SettingsEntryBuilder { + this.hasMutableStatus = hasMutableStatus + return this + } + + fun setMacro(fn: (arguments: Bundle?) -> EntryMacro): SettingsEntryBuilder { + setStatusDataFn { fn(it).getStatusData() } + setSearchDataFn { fn(it).getSearchData() } + setUiLayoutFn { + val macro = remember { fn(it) } + macro.UiLayout() + } + return this + } + + fun setStatusDataFn(fn: StatusDataGetter): SettingsEntryBuilder { + this.statusDataFn = fn + return this + } + + fun setSearchDataFn(fn: SearchDataGetter): SettingsEntryBuilder { + this.searchDataFn = fn + this.isAllowSearch = true + return this + } + + fun clearSearchDataFn(): SettingsEntryBuilder { + this.searchDataFn = { null } + this.isAllowSearch = false + return this + } + + fun setSliceDataFn(fn: SliceDataGetter): SettingsEntryBuilder { + this.sliceDataFn = fn + this.hasSliceSupport = true + return this + } + + fun setUiLayoutFn(fn: UiLayerRenderer): SettingsEntryBuilder { + this.uiLayoutFn = fn + return this + } + + companion object { + fun create(entryName: String, owner: SettingsPage): SettingsEntryBuilder { + return SettingsEntryBuilder(entryName, owner) + } + + fun createLinkFrom(entryName: String, owner: SettingsPage): SettingsEntryBuilder { + return create(entryName, owner).setLink(fromPage = owner) + } + + fun createLinkTo(entryName: String, owner: SettingsPage): SettingsEntryBuilder { + return create(entryName, owner).setLink(toPage = owner) + } + + fun create(owner: SettingsPage, entryName: String, displayName: String? = null): + SettingsEntryBuilder { + return SettingsEntryBuilder(entryName, owner).setDisplayName(displayName ?: entryName) + } + + fun createInject(owner: SettingsPage, displayName: String? = null): SettingsEntryBuilder { + val name = displayName ?: "${INJECT_ENTRY_NAME}_${owner.displayName}" + return createLinkTo(INJECT_ENTRY_NAME, owner).setDisplayName(name) + } + + fun createRoot(owner: SettingsPage, displayName: String? = null): SettingsEntryBuilder { + val name = displayName ?: "${ROOT_ENTRY_NAME}_${owner.displayName}" + return createLinkTo(ROOT_ENTRY_NAME, owner).setDisplayName(name) + } + } +} diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntryRepository.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntryRepository.kt index 14dc7857dbc7..429f97bb38d0 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntryRepository.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsEntryRepository.kt @@ -30,14 +30,10 @@ data class SettingsPageWithEntry( val injectEntry: SettingsEntry, ) -private fun SettingsPage.getTitle(sppRepository: SettingsPageProviderRepository): String { - return sppRepository.getProviderOrNull(sppName)!!.getTitle(arguments) -} - /** * The repository to maintain all Settings entries */ -class SettingsEntryRepository(private val sppRepository: SettingsPageProviderRepository) { +class SettingsEntryRepository(sppRepository: SettingsPageProviderRepository) { // Map of entry unique Id to entry private val entryMap: Map<String, SettingsEntry> @@ -66,6 +62,9 @@ class SettingsEntryRepository(private val sppRepository: SettingsPageProviderRep if (page == null || pageWithEntryMap.containsKey(page.id)) continue val spp = sppRepository.getProviderOrNull(page.sppName) ?: continue val newEntries = spp.buildEntry(page.arguments) + // The page id could be existed already, if there are 2+ pages go to the same one. + // For now, override the previous ones, which means only the last from-page is kept. + // TODO: support multiple from-pages if necessary. pageWithEntryMap[page.id] = SettingsPageWithEntry( page = page, entries = newEntries, @@ -123,7 +122,7 @@ class SettingsEntryRepository(private val sppRepository: SettingsPageProviderRep if (it.toPage == null) defaultTitle else { - it.toPage.getTitle(sppRepository) + it.toPage.getTitle() } } } diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPage.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPage.kt index c810648524b9..724588f794b4 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPage.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SettingsPage.kt @@ -81,6 +81,10 @@ data class SettingsPage( return getPageProvider(sppName)?.isEnabled(arguments) ?: false } + fun getTitle(): String { + return getPageProvider(sppName)?.getTitle(arguments) ?: "" + } + @Composable fun UiLayout() { getPageProvider(sppName)?.Page(arguments) diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/Actions.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/Actions.kt index 32b283e9a8a9..62189dccc9bf 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/Actions.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/Actions.kt @@ -24,7 +24,12 @@ import androidx.compose.material.icons.outlined.FindInPage import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.composed +import androidx.compose.ui.draw.scale +import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.LayoutDirection import com.android.settingslib.spa.framework.compose.LocalNavController /** Action that navigates back to last page. */ @@ -50,6 +55,7 @@ private fun BackAction(contentDescription: String, onClick: () -> Unit) { Icon( imageVector = Icons.Outlined.ArrowBack, contentDescription = contentDescription, + modifier = Modifier.autoMirrored(), ) } } @@ -75,3 +81,10 @@ internal fun ClearAction(onClick: () -> Unit) { ) } } + +private fun Modifier.autoMirrored() = composed { + when (LocalLayoutDirection.current) { + LayoutDirection.Rtl -> scale(scaleX = -1f, scaleY = 1f) + else -> this + } +} diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/framework/common/SettingsEntryRepositoryTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/framework/common/SettingsEntryRepositoryTest.kt index 730aa8f95e63..379b9a7db09b 100644 --- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/framework/common/SettingsEntryRepositoryTest.kt +++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/framework/common/SettingsEntryRepositoryTest.kt @@ -113,6 +113,7 @@ class SettingsEntryRepositoryTest { @Test fun testGetEntryPath() { + SpaEnvironmentFactory.reset(spaEnvironment) assertThat( entryRepository.getEntryPathWithDisplayName( genEntryId("Layer2Entry1", SppLayer2.createSettingsPage()) diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index 978f7452e8cb..193c51fdee25 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Hierdie foon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Hierdie tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Hierdie foon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Kan nie koppel nie. Skakel toestel af en weer aan"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Bedrade oudiotoestel"</string> <string name="help_label" msgid="3528360748637781274">"Hulp en terugvoer"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Voorspellingteruggebaaranimasies"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Aktiveer stelselanimasies vir voorspellingteruggebaar."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Hierdie instelling aktiveer stelselanimasies vir voorspellinggebaaranimasie. Dit vereis dat enableOnBackInvokedCallback per program op waar gestel word in die manifeslêer."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 8f1a2a9abcea..60812d897131 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ይህ ስልክ"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ይህ ጡባዊ"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"ይህ ስልክ"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"መገናኘት ላይ ችግር። መሳሪያውን ያጥፉት እና እንደገና ያብሩት"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ባለገመድ የኦዲዮ መሣሪያ"</string> <string name="help_label" msgid="3528360748637781274">"እገዛ እና ግብረመልስ"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"የግምት ጀርባ እነማዎች"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"ለግምት ጀርባ የስርዓት እንማዎችን ያንቁ።"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"ይህ ቅንብር የስርዓት እነማዎችን ለመገመት የምልክት እነማን ያነቃል። በዝርዝር ሰነድ ፋይሉ ውስጥ በእያንዳንዱ መተግበሪያ enableOnBackInvokedCallbackን ወደ እውነት ማቀናበር ያስፈልገዋል።"</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 669f85f9d7e9..b8474a79b002 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"هذا الهاتف"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"هذا الجهاز اللوحي"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"هذا الهاتف"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"حدثت مشكلة أثناء الاتصال. يُرجى إيقاف الجهاز ثم إعادة تشغيله."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"جهاز سماعي سلكي"</string> <string name="help_label" msgid="3528360748637781274">"المساعدة والملاحظات"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"صور متحركة تعرض إيماءة الرجوع إلى الخلف التنبؤية"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"فعِّل الصور المتحركة في النظام لإيماءة الرجوع إلى الخلف التنبؤية."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"يفعّل هذا الإعداد الصور المتحركة في النظام للصور المتحركة التي تعرض إيماءة الرجوع إلى الخلف التنبؤية. يتطلب الإعداد ضبط enableOnBackInvokedCallback إلى true لكل تطبيق في ملف البيان."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index f9745e04945a..6afced715328 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"এই ফ’নটো"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"এই টেবলেটটো"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"এই ফ’নটো"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"সংযোগ হোৱাত সমস্যা হৈছে। ডিভাইচটো অফ কৰি পুনৰ অন কৰক"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"তাঁৰযুক্ত অডিঅ’ ডিভাইচ"</string> <string name="help_label" msgid="3528360748637781274">"সহায় আৰু মতামত"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"প্ৰেডিক্টিভ বেক এনিমেশ্বন"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"প্ৰেডিক্টিভ বেকৰ বাবে ছিষ্টেম এনিমেশ্বন সক্ষম কৰক।"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"এই ছেটিংটোৱে প্ৰেডিক্টিভ বেক এনিমেশ্বনৰ বাবে ছিষ্টেম এনিমেশ্বন সক্ষম কৰে। ইয়াৰ বাবে মেনিফেষ্ট ফাইলত প্ৰতি এপত enableOnBackInvokedCallback সত্য বুলি ছেট কৰাৰ প্ৰয়োজন।"</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index efcc0bc7bc41..74bb158f65fc 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Bu telefon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Bu planşet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Bu telefon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Qoşulmaqla bağlı problem. Cihazı deaktiv edin, sonra yenidən aktiv edin"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Simli audio cihaz"</string> <string name="help_label" msgid="3528360748637781274">"Yardım və rəy"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Proqnozlaşdırılan geri animasiyalar"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Proqnozlaşdırıcı geri jest üçün sistem animasiyalarını aktiv edin."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Bu ayar proqnozlaşdırıcı jest animasiyası üçün sistem animasiyalarını aktiv edir. Bu, manifest faylında hər bir tətbiq üçün enableOnBackInvokedCallback-in doğru kimi ayarlanmasını tələb edir."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index c8955e830d79..ff4d0833d349 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ovaj telefon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ovaj tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Ovaj telefon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem pri povezivanju. Isključite uređaj, pa ga ponovo uključite"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audio uređaj"</string> <string name="help_label" msgid="3528360748637781274">"Pomoć i povratne informacije"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animacije za pokret povratka sa predviđanjem"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Omogućite animacije sistema za pokret povratka sa predviđanjem."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Ovo podešavanje omogućava animacije sistema za pokret povratka sa predviđanjem. Zahteva podešavanje dozvole enableOnBackInvokedCallback po aplikaciji na true u fajlu manifesta."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index cd7b1980509c..47404dbd29be 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Гэты тэлефон"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Гэты планшэт"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Гэты тэлефон"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Праблема з падключэннем. Выключыце і зноў уключыце прыладу"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Правадная аўдыяпрылада"</string> <string name="help_label" msgid="3528360748637781274">"Даведка і водгукі"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Анімацыя падказкі для жэста вяртання"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Уключыць сістэмную анімацыю падказкі для жэстаў вяртання."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Гэта налада ўключае сістэмную анімацыю падказкі для жэста вяртання. Для гэтага неабходна задаць у файле маніфеста для параметра enableOnBackInvokedCallback значэнне \"True\" для кожнай праграмы."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index a3374294858a..b98027beef86 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Този телефон"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Този таблет"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Този телефон"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"При свързването възникна проблем. Изключете устройството и го включете отново"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Аудиоустройство с кабел"</string> <string name="help_label" msgid="3528360748637781274">"Помощ и отзиви"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Анимации за предвиждащия жест за връщане назад"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Активиране на системните анимации за предвиждащия жест за връщане назад."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Тази настройка активира системните анимации за предвиждащите жестове. За целта във файла на манифеста трябва да зададете enableOnBackInvokedCallback на true за отделните приложения."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 28a1598ae8ed..f2a574eb9393 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"এই ফোন"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"এই ট্যাবলেট"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"এই ফোনটি"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"কানেক্ট করতে সমস্যা হচ্ছে। ডিভাইস বন্ধ করে আবার চালু করুন"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ওয়্যার অডিও ডিভাইস"</string> <string name="help_label" msgid="3528360748637781274">"সহায়তা ও মতামত"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"ফিরে যাওয়ার পূর্বাভাস সংক্রান্ত অ্যানিমেশন"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"ফিরে যাওয়া সংক্রান্ত পূর্বাভাসের জন্য সিস্টেম অ্যানিমেশন চালু করুন।"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"জেসচারের পূর্বাভাস সংক্রান্ত অ্যানিমেশন দেখাতে এই সেটিং সিস্টেম অ্যানিমেশন চালু করে। এই সেটিংয়ে \'ম্যানিফেস্ট\' ফাইলে প্রত্যেক অ্যাপে enableOnBackInvokedCallback অ্যাট্রিবিউটকে \'ট্রু\' (true) হিসেবে সেট করতে হয়।"</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index e24c68dd0437..947aaaf78457 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ovaj telefon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ovaj tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Ovaj telefon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Došlo je do problema prilikom povezivanja. Isključite, pa ponovo uključite uređaj"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audio uređaj"</string> <string name="help_label" msgid="3528360748637781274">"Pomoć i povratne informacije"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animacije predvidljivog pokreta unazad"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Omogućite animacije sistema za predvidljivi pokret unazad."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Ova postavka omogućava animacije sistema za animaciju predvidljivih pokreta. Potrebno je po aplikaciji postaviti vrijednost za enableOnBackInvokedCallback na tačno u fajlu deklaracije."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 2abdf002ea17..4d1d98312c79 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Aquest telèfon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Aquesta tauleta"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Aquest telèfon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Hi ha hagut un problema amb la connexió. Apaga el dispositiu i torna\'l a encendre."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositiu d\'àudio amb cable"</string> <string name="help_label" msgid="3528360748637781274">"Ajuda i suggeriments"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animacions de retrocés predictiu"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Activa animacions del sistema de retrocés predictiu."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Aquesta configuració activa animacions del sistema per a accions gestuals predictives. Requereix definir enableOnBackInvokedCallback com a \"true\" en cada aplicació al fitxer de manifest."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index d82b4726f40f..530627f1cd62 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Tento telefon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Tento tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Tento telefon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problém s připojením. Vypněte zařízení a znovu jej zapněte"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kabelové audiozařízení"</string> <string name="help_label" msgid="3528360748637781274">"Nápověda a zpětná vazba"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Prediktivní animace gesta Zpět"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Povolit systémové animace prediktivního gesta Zpět"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Toto nastavení aktivuje systémové prediktivní animace gest. Vyžaduje, aby v souborech manifestu jednotlivých aplikací byl nastaven atribut enableOnBackInvokedCallback na hodnotu True."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 9726f8c73274..a071200e85e2 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Denne telefon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Denne tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Denne telefon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Der kunne ikke oprettes forbindelse. Sluk og tænd enheden"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Lydenhed med ledning"</string> <string name="help_label" msgid="3528360748637781274">"Hjælp og feedback"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Foreslåede animationer for Tilbage"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Aktivér systemanimationer for foreslåede animationer for Tilbage."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Denne indstilling aktiverer systemanimationer for de foreslåede animationer for bevægelsen Tilbage. Dette forudsætter konfiguration af enableOnBackInvokedCallback som sand for hver app i manifestfilen."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 68199dd1dbdc..f0bd6baa3287 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Dieses Smartphone"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Dieses Tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Dieses Smartphone"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Verbindung kann nicht hergestellt werden. Schalte das Gerät aus & und wieder ein."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Netzbetriebenes Audiogerät"</string> <string name="help_label" msgid="3528360748637781274">"Hilfe und Feedback"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animationen für intelligente „Zurück“-Touch-Geste"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Du kannst Systemanimationen für die intelligente „Zurück“-Touch-Geste aktivieren."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Diese Einstellung aktiviert Systemanimationen für intelligente Touch-Gesten. Dazu muss in der Manifestdatei enableOnBackInvokedCallback auf App-Ebene auf „true“ gesetzt werden."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 974c99825677..60de1b537728 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Αυτό το τηλέφωνο"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Αυτό το tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Αυτό το τηλέφωνο"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Πρόβλημα κατά τη σύνδεση. Απενεργοποιήστε τη συσκευή και ενεργοποιήστε την ξανά"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Ενσύρματη συσκευή ήχου"</string> <string name="help_label" msgid="3528360748637781274">"Βοήθεια και σχόλια"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Κινούμ. εικόνες μετάβασης προς τα πίσω με πρόβλεψη"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Ενεργοποίηση κινούμενων εικόνων συστήματος για μετάβαση προς τα πίσω με πρόβλεψη."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Αυτή η ρύθμιση ενεργοποιεί τις κινούμενες εικόνες συστήματος για τις κινούμενες εικόνες κινήσεων με πρόβλεψη. Απαιτεί τη ρύθμιση της παραμέτρου enableOnBackInvokedCallback ως αληθούς σε κάθε εφαρμογή στο αρχείο μανιφέστου."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index c6443bdfdb68..521bcf69d6a8 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"This phone"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"This tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"This phone"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string> <string name="help_label" msgid="3528360748637781274">"Help and feedback"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Predictive back animations"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Enable system animations for predictive back."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"This setting enables system animations for predictive gesture animation. It requires setting per-app enableOnBackInvokedCallback to true in the manifest file."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml index 03475be796d8..90d1106b62b1 100644 --- a/packages/SettingsLib/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -540,6 +540,9 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"This phone"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"This tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"This phone"</string> + <string name="media_output_status_require_premium" msgid="8411255800047014822">"Upgrade account to switch"</string> + <string name="media_output_status_not_support_downloads" msgid="4523828729240373315">"Cant play downloads here"</string> + <string name="media_output_status_try_after_ad" msgid="8312579066856015441">"Try again after the ad"</string> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off & back on"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string> <string name="help_label" msgid="3528360748637781274">"Help and feedback"</string> @@ -666,4 +669,10 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Predictive back animations"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Enable system animations for predictive back."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"This setting enables system animations for predictive gesture animation. It requires setting per-app enableOnBackInvokedCallback to true in the manifest file."</string> + <string-array name="udfps_accessibility_touch_hints"> + <item msgid="1737722959616802157">"Move left"</item> + <item msgid="5425394847942513942">"Move down"</item> + <item msgid="7728484337962740316">"Move right"</item> + <item msgid="324200556467459329">"Move up"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index c6443bdfdb68..521bcf69d6a8 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"This phone"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"This tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"This phone"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string> <string name="help_label" msgid="3528360748637781274">"Help and feedback"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Predictive back animations"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Enable system animations for predictive back."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"This setting enables system animations for predictive gesture animation. It requires setting per-app enableOnBackInvokedCallback to true in the manifest file."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index c6443bdfdb68..521bcf69d6a8 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"This phone"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"This tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"This phone"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off and back on"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string> <string name="help_label" msgid="3528360748637781274">"Help and feedback"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Predictive back animations"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Enable system animations for predictive back."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"This setting enables system animations for predictive gesture animation. It requires setting per-app enableOnBackInvokedCallback to true in the manifest file."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml index 113ea194e1d7..1074338fcc32 100644 --- a/packages/SettingsLib/res/values-en-rXC/strings.xml +++ b/packages/SettingsLib/res/values-en-rXC/strings.xml @@ -540,6 +540,9 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"This phone"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"This tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"This phone"</string> + <string name="media_output_status_require_premium" msgid="8411255800047014822">"Upgrade account to switch"</string> + <string name="media_output_status_not_support_downloads" msgid="4523828729240373315">"Cant play downloads here"</string> + <string name="media_output_status_try_after_ad" msgid="8312579066856015441">"Try again after the ad"</string> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem connecting. Turn device off & back on"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired audio device"</string> <string name="help_label" msgid="3528360748637781274">"Help & feedback"</string> @@ -666,4 +669,10 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Predictive back animations"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Enable system animations for predictive back."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"This setting enables system animations for predictive gesture animation. It requires setting per-app enableOnBackInvokedCallback to true in the manifest file."</string> + <string-array name="udfps_accessibility_touch_hints"> + <item msgid="1737722959616802157">"Move left"</item> + <item msgid="5425394847942513942">"Move down"</item> + <item msgid="7728484337962740316">"Move right"</item> + <item msgid="324200556467459329">"Move up"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 220ca44bdb62..7e7fd151c961 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Este teléfono"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Esta tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Este teléfono"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Error al establecer la conexión. Apaga el dispositivo y vuelve a encenderlo."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string> <string name="help_label" msgid="3528360748637781274">"Ayuda y comentarios"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animaciones de retroceso predictivas"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Habilitar animaciones del sistema para gestos de retroceso predictivos."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Esta configuración habilita las animaciones del sistema para la animación de gestos predictiva. Se requiere la configuración por app de enableOnBackInvokedCallback en verdadero en el archivo de manifiesto."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index bdd1ff2b9b08..58206eb44f66 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Este teléfono"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Este tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Este teléfono"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"No se ha podido conectar; reinicia el dispositivo"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string> <string name="help_label" msgid="3528360748637781274">"Ayuda y comentarios"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animaciones para acciones de retorno predictivas"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Habilitar animaciones del sistema para acciones de retorno predictivas."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Este ajuste habilita animaciones del sistema para acciones gestuales predictivas. Exige definir el valor de enableOnBackInvokedCallback en \"verdadero\" para cada aplicación en el archivo de manifiesto."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index cdc5051f0358..6bdb9384e5de 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"See telefon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"See tahvelarvuti"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"See telefon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Probleem ühendamisel. Lülitage seade välja ja uuesti sisse"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Juhtmega heliseade"</string> <string name="help_label" msgid="3528360748637781274">"Abi ja tagasiside"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Tagasiliigutuse prognoosi animatsioon"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Lubage süsteemi animatsioonid, et näha prognoositud tagasiliigutusi."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"See seade võimaldab süsteemi animatsioonidel prognoosida tagasiliigutusi. See nõuab manifestifailis rakendusepõhise atribuudi enableOnBackInvokedCallback määramist tõeseks."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index 9d6a10ae389b..872b3b63adc9 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Telefono hau"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Tableta hau"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Telefono hau"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Arazo bat izan da konektatzean. Itzali gailua eta pitz ezazu berriro."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Audio-gailu kableduna"</string> <string name="help_label" msgid="3528360748637781274">"Laguntza eta iritziak"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Atzera egiteko keinuaren animazio-igarleak"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Gaitu atzera egiteko keinuaren sistemaren animazio-igarleak."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Atzera egiteko keinuaren sistemaren animazio-igarleak gaitzen ditu ezarpenak. enableOnBackInvokedCallback-ek egiazko gisa ezarrita egon behar du aplikazio bakoitzaren manifestu-fitxategian."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index b9226405b0cf..378fa196269c 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -183,7 +183,7 @@ <string name="tts_lang_use_system" msgid="6312945299804012406">"استفاده از زبان سیستم"</string> <string name="tts_lang_not_selected" msgid="7927823081096056147">"زبان انتخاب نشده است"</string> <string name="tts_default_lang_summary" msgid="9042620014800063470">"صدای خاص یک زبان را برای متن گفتاری تنظیم میکند"</string> - <string name="tts_play_example_title" msgid="1599468547216481684">"به نمونهای گوش کنید"</string> + <string name="tts_play_example_title" msgid="1599468547216481684">"شنیدن نمونه"</string> <string name="tts_play_example_summary" msgid="634044730710636383">"قسمت کوتاهی از ترکیب گفتار پخش شود"</string> <string name="tts_install_data_title" msgid="1829942496472751703">"نصب دادههای صوتی"</string> <string name="tts_install_data_summary" msgid="3608874324992243851">"نصب دادههای صوتی مورد نیاز برای ترکیب گفتار"</string> @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"این تلفن"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"این رایانه لوحی"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"این تلفن"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"مشکل در اتصال. دستگاه را خاموش و دوباره روشن کنید"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"دستگاه صوتی سیمی"</string> <string name="help_label" msgid="3528360748637781274">"راهنما و بازخورد"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"پویانماییهای اشاره برگشت پیشگویانه"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"پویانماییهای سیستم را برای اشاره برگشت پیشگویانه فعال کنید."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"این تنظیم پویانماییهای سیستم را برای پویانمایی اشاره برگشت پیشبینانه فعال میکند. این تنظیم مستلزم تنظیم شدن enableOnBackInvokedCallback مربوط به هر برنامه روی صحیح در فایل مانیفست است."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index 1bebe1c003c4..f9527f863703 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Tämä puhelin"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Tämä tabletti"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Tämä puhelin"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Yhteysvirhe. Sammuta laite ja käynnistä se uudelleen."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Langallinen äänilaite"</string> <string name="help_label" msgid="3528360748637781274">"Ohje ja palaute"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Takaisin siirtymisen ennakoivat animaatiot"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Ota käyttöön takaisin siirtymisen ennakoivat järjestelmäanimaatiot."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Asetus ottaa järjestelmäanimaatiot käyttöön ennakoiville eleanimaatioille. Se edellyttää, että enableOnBackInvokedCallback-arvo on Tosi sovelluksen manifestitiedostossa."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 5721d0b82559..0fa7ab23f3dc 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ce téléphone"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Cette tablette"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Ce téléphone"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problème de connexion. Éteingez et rallumez l\'appareil"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Appareil audio à câble"</string> <string name="help_label" msgid="3528360748637781274">"Aide et commentaires"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animations pour le retour prédictif"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Activer les animations système pour le retour prédictif."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Ce paramètre permet d\'activer les animations du système pour l\'animation des gestes prédictifs. Cela exige de définir le paramètre enableOnBackInvokedCallback à Vrai pour chaque application dans le fichier de configuration."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 208885464984..d9efc2d18489 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ce téléphone"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Cette tablette"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Ce téléphone"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problème de connexion. Éteignez l\'appareil, puis rallumez-le"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Appareil audio filaire"</string> <string name="help_label" msgid="3528360748637781274">"Aide et commentaires"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animations pour prévisualiser le retour en arrière"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Activer les animations système pour la prévisualisation du geste de retour."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Ce paramètre active les animations système pour la prévisualisation du geste de retour. Pour cela, enableOnBackInvokedCallback doit être défini sur \"True\" dans le fichier manifeste de chaque appli."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index fec8a71c9924..34dc307ec609 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -180,7 +180,7 @@ <string name="tts_default_pitch_title" msgid="6988592215554485479">"Ton"</string> <string name="tts_default_pitch_summary" msgid="9132719475281551884">"Afecta ao ton da voz sintetizada"</string> <string name="tts_default_lang_title" msgid="4698933575028098940">"Idioma"</string> - <string name="tts_lang_use_system" msgid="6312945299804012406">"Utiliza o idioma do sistema"</string> + <string name="tts_lang_use_system" msgid="6312945299804012406">"Utilizar o idioma do sistema"</string> <string name="tts_lang_not_selected" msgid="7927823081096056147">"Idioma non seleccionado"</string> <string name="tts_default_lang_summary" msgid="9042620014800063470">"Define a voz específica do idioma para o texto falado"</string> <string name="tts_play_example_title" msgid="1599468547216481684">"Escoitar un exemplo"</string> @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Este teléfono"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Esta tableta"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Este teléfono"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Produciuse un problema coa conexión. Apaga e acende o dispositivo."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de audio con cable"</string> <string name="help_label" msgid="3528360748637781274">"Axuda e comentarios"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animacións de retroceso preditivo"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Activa as animacións do sistema para o retroceso preditivo."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Esta opción de configuración activa as animacións xestuais preditivas. É preciso definir enableOnBackInvokedCallback como True (verdadeiro) para cada aplicación no ficheiro de manifesto."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index 0feef07e9347..9533ea8a4a92 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"આ ફોન"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"આ ટૅબ્લેટ"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"આ ફોન"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"કનેક્ટ કરવામાં સમસ્યા આવી રહી છે. ડિવાઇસને બંધ કરીને ફરી ચાલુ કરો"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"વાયરવાળો ઑડિયો ડિવાઇસ"</string> <string name="help_label" msgid="3528360748637781274">"સહાય અને પ્રતિસાદ"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"પાછળના પૂર્વાનુમાનિત ઍનિમેશન્સ"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"પાછળના પૂર્વાનુમાનિત સંકેત માટે સિસ્ટમ ઍનિમેશન ચાલુ કરો."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"આ સેટિંગ પૂર્વાનુમાનિત સંકેત ઍનિમેશન માટે સિસ્ટમ ઍનિમેશન ચાલુ કરે છે. તેના માટે દરેક ઍપ માટે મેનિફેસ્ટ ફાઇલમાં enableOnBackInvokedCallbackને true પર સેટ કરવાની જરૂર પડે છે."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index ea8d4d457180..c575858628b1 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"यह फ़ोन"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"यह टैबलेट"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"यह फ़ोन"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"कनेक्ट करने में समस्या हो रही है. डिवाइस को बंद करके चालू करें"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"वायर वाला ऑडियो डिवाइस"</string> <string name="help_label" msgid="3528360748637781274">"सहायता और सुझाव"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"प्रिडिक्टिव बैक ऐनिमेशन"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"प्रिडिक्टिव बैक के लिए सिस्टम ऐनिमेशन चालू करें."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"यह सेटिंग, सिस्टम के ऐनिमेशन को प्रिडिक्टिव जेस्चर ऐनिमेशन के लिए चालू कर देती है. मेनिफ़ेस्ट फ़ाइल में enableOnBackInvokedCallback की सेटिंग को हर ऐप्लिकेशन के हिसाब से \'सही\' पर सेट होना चाहिए."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index bccb9d78b496..33a6a718b44a 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ovaj telefon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ovaj tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Ovaj telefon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem s povezivanjem. Isključite i ponovo uključite uređaj"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žičani audiouređaj"</string> <string name="help_label" msgid="3528360748637781274">"Pomoć i povratne informacije"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animacije za pokret povratka s predviđanjem"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Omogući animaciju kad korisnik napravi povratnu kretnju."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Ova postavka omogućuje animacije sustava za animaciju pokreta s predviđanjem. Zahtijeva postavljanje dopuštenja enableOnBackInvokedCallback po aplikaciji na True u datoteci manifesta."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index 5af85ead6a27..83e7824e2649 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ez a telefon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ez a táblagép"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Ez a telefon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Sikertelen csatlakozás. Kapcsolja ki az eszközt, majd kapcsolja be újra."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Vezetékes audioeszköz"</string> <string name="help_label" msgid="3528360748637781274">"Súgó és visszajelzés"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Prediktív „vissza” kézmozdulat-animációk"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Rendszeranimációk engedélyezése prediktív „vissza” kézmozdulatok esetén."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"A beállítás engedélyezi a rendszeranimációkat a prediktív kézmozdulat-animációk esetén. A használatukhoz az enableOnBackInvokedCallback beállítást true értékre kell állítani az egyes alkalmazások manifestfájljaiban."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index 2d01b37f1d8d..17ef168aa19a 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Այս հեռախոսը"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Այս պլանշետը"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Այս հեռախոսը"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Կապի խնդիր կա: Սարքն անջատեք և նորից միացրեք:"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Լարով աուդիո սարք"</string> <string name="help_label" msgid="3528360748637781274">"Օգնություն և հետադարձ կապ"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"«Հետ» ժեստի հուշման շարժանկարներ"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Միացնել համակարգի անիմացիաները «Հետ» ժեստի հուշման համար"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Այս կարգավորման միջոցով կարելի է միացնել համակարգային շարժանկարները ժեստի հուշման համար։ Կարգավորումը պահանջում է մանիֆեստի ֆայլում սահմանել true արժեքը per-app enableOnBackInvokedCallback հատկության համար։"</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index e78b33973ff9..761b271b377c 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ponsel ini"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Tablet ini"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Ponsel ini"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ada masalah saat menghubungkan. Nonaktifkan perangkat & aktifkan kembali"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Perangkat audio berkabel"</string> <string name="help_label" msgid="3528360748637781274">"Bantuan & masukan"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animasi kembali prediktif"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Aktifkan animasi sistem untuk kembali prediktif."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Setelan ini mengaktifkan animasi sistem untuk animasi gestur prediktif. Setelan ini mewajibkan enableOnBackInvokedCallback per-aplikasi disetel ke benar (true) dalam file manifes."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index 9094af651827..7374445b7931 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Þessi sími"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Þessi spjaldtölva"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Þessi sími"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Vandamál í tengingu. Slökktu og kveiktu á tækinu"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Snúrutengt hljómtæki"</string> <string name="help_label" msgid="3528360748637781274">"Hjálp og ábendingar"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Hreyfimyndir flýtiritunar við bendinguna „til baka“"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Kveikja á hreyfimyndum í kerfinu til að sýna hreyfimyndir þegar bendingin „til baka“ er gerð."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Þessi stilling kveikir á hreyfimyndum í kerfinu til að sýna hreyfimyndir flýtiritunar með bendingum. Stillingin krefst þess að kveikt sé á enableOnBackInvokedCallback í upplýsingaskránni fyrir hvert forrit."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index 138f341d3aeb..47c5d877468d 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Questo telefono"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Questo tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Questo telefono"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problema di connessione. Spegni e riaccendi il dispositivo"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo audio cablato"</string> <string name="help_label" msgid="3528360748637781274">"Guida e feedback"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animazioni predittive per Indietro"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Attiva le animazioni di sistema per il gesto Indietro predittivo."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Questa impostazione attiva le animazioni di sistema per il gesto Indietro predittivo. Richiede di impostare il metodo enableOnBackInvokedCallback su true nel file manifest di tutte le app."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 58fede96f036..453c3c09345c 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"הטלפון הזה"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"הטאבלט הזה"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"הטלפון הזה"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"יש בעיה בחיבור. עליך לכבות את המכשיר ולהפעיל אותו מחדש"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"התקן אודיו חוטי"</string> <string name="help_label" msgid="3528360748637781274">"עזרה ומשוב"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"חיזוי אנימציה של תנועת החזרה"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"הפעלת אנימציות מערכת עבור חיזוי של תנועת החזרה."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"ההגדרה הזו מפעילה אנימציות מערכת עבור חיזוי אנימציה של תנועת החזרה. היא מחייבת הגדרה בכל אפליקציה של ערך true בשדה enableOnBackInvokedCallback בקובץ המניפסט."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index a2c59ffae101..25006eb722e8 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"このスマートフォン"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"このタブレット"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"このスマートフォン"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"接続エラーです。デバイスを OFF にしてから ON に戻してください"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線オーディオ デバイス"</string> <string name="help_label" msgid="3528360748637781274">"ヘルプとフィードバック"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"予測型「戻る」アニメーション"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"予測型「戻る」のシステム アニメーションを有効にする。"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"この設定は、予測型操作のシステム アニメーションを有効にします。アプリごとにマニフェスト ファイルで enableOnBackInvokedCallback を true に設定する必要があります。"</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index cc04f5654d36..8204c12a13ad 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ეს ტელეფონი"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ეს ტაბლეტი"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"ეს ტელეფონი"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"დაკავშირებისას წარმოიქმნა პრობლემა. გამორთეთ და კვლავ ჩართეთ მოწყობილობა"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"სადენიანი აუდიო მოწყობილობა"</string> <string name="help_label" msgid="3528360748637781274">"დახმარება და გამოხმაურება"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"უკან დაბრუნების ანიმაციის პროგნოზირება"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"უკან დაბრუნების პროგნოზირებადი ანიმაციისთვის სისტემის ანიმაციების ჩართვა."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"ეს პარამეტრი ჩართავს სისტემის ანიმაციებს ჟესტების პროგნოზირებადი ანიმაციებისთვის. საჭიროა, რომ აღწერის ფაილში აპის enableOnBackInvokedCallback პარამეტრი იყოს ჭეშმარიტი."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 43a72db3eba5..c643ae29f20c 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Осы телефон"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Осы планшет"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Осы телефон"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Байланыс орнату қатесі шығуып жатыр. Құрылғыны өшіріп, қайта қосыңыз."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Сымды аудио құрылғысы"</string> <string name="help_label" msgid="3528360748637781274">"Анықтама және пікір"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"\"Артқа\" қимылына арналған тұспал анимациясы"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"\"Артқа\" қимылына арналған жүйелік тұспал анимацияларын іске қосу."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Бұл параметр қимылға арналған жүйелік тұспал анимацияларын іске қосады. Ол үшін әр қолданбаның манифест файлында enableOnBackInvokedCallback үшін \"True\" мәні қойылуы керек."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index a34018821e58..bc9c781d1703 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ទូរសព្ទនេះ"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ថេប្លេតនេះ"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"ទូរសព្ទនេះ"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"មានបញ្ហាក្នុងការភ្ជាប់។ បិទ រួចបើកឧបករណ៍វិញ"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ឧបករណ៍សំឡេងប្រើខ្សែ"</string> <string name="help_label" msgid="3528360748637781274">"ជំនួយ និងមតិកែលម្អ"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"ចលនាថយក្រោយដែលព្យាករ"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"បើកចលនាប្រព័ន្ធសម្រាប់ការថយក្រោយព្យាករ។"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"ការកំណត់នេះបើកចលនាប្រព័ន្ធសម្រាប់ចលនាព្យាករ។ ចលនានេះទាមទារការកំណត់ enableOnBackInvokedCallback នៅក្នុងកម្មវិធីទៅពិតនៅក្នុងឯកសារមេនីហ្វេសថ៍។"</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 0348795b6020..07ca44db739b 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ಈ ಫೋನ್"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ಈ ಟ್ಯಾಬ್ಲೆಟ್"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"ಈ ಫೋನ್"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ಕನೆಕ್ಟ್ ಮಾಡುವಾಗ ಸಮಸ್ಯೆ ಎದುರಾಗಿದೆ ಸಾಧನವನ್ನು ಆಫ್ ಮಾಡಿ ಹಾಗೂ ನಂತರ ಪುನಃ ಆನ್ ಮಾಡಿ"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ವೈರ್ ಹೊಂದಿರುವ ಆಡಿಯೋ ಸಾಧನ"</string> <string name="help_label" msgid="3528360748637781274">"ಸಹಾಯ ಮತ್ತು ಪ್ರತಿಕ್ರಿಯೆ"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"ಮುನ್ಸೂಚಕ ಬ್ಯಾಕ್ ಆ್ಯನಿಮೇಶನ್ಗಳು"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"ಮುನ್ಸೂಚಕ ಬ್ಯಾಕ್ ಗೆಸ್ಚರ್ಗಾಗಿ ಸಿಸ್ಟಂ ಆ್ಯನಿಮೇಶನ್ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"ಮುನ್ನೋಟದ ಗೆಸ್ಚರ್ ಆ್ಯನಿಮೇಶನ್ಗಾಗಿ ಸಿಸ್ಟಂ ಆ್ಯನಿಮೇಶನ್ಗಳನ್ನು ಈ ಸೆಟ್ಟಿಂಗ್ ಸಕ್ರಿಯಗೊಳಿಸುತ್ತವೆ. ಇದನ್ನು ಮಾಡಲು, ಪ್ರತಿ ಆ್ಯಪ್ನ ಮ್ಯಾನಿಫೆಸ್ಟ್ ಫೈಲ್ನಲ್ಲಿರುವ enableOnBackInvokedCallback ಪ್ಯಾರಾಮೀಟರ್ ಅನ್ನು ಸರಿ ಎಂದು ಹೊಂದಿಸಬೇಕು."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 73de9bbfb056..e4285d5985eb 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"이 휴대전화"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"태블릿"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"이 휴대전화"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"연결 중에 문제가 발생했습니다. 기기를 껐다가 다시 켜 보세요."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"유선 오디오 기기"</string> <string name="help_label" msgid="3528360748637781274">"고객센터"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"예측된 뒤로 동작 애니메이션"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"예측된 뒤로 동작에 시스템 애니메이션을 사용하도록 설정합니다."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"이 설정은 예측된 동작 애니메이션에 시스템 애니메이션을 사용하도록 합니다. 매니페스트 파일에서 앱별 enableOnBackInvokedCallback을 True로 설정해야 합니다."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index b2a84592c5b0..ba38500c6fec 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ушул телефон"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ушул планшет"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Ушул телефон"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Туташууда маселе келип чыкты. Түзмөктү өчүрүп, кайра күйгүзүп көрүңүз"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Зымдуу аудио түзмөк"</string> <string name="help_label" msgid="3528360748637781274">"Жардам/Пикир билдирүү"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Божомолдонгон анимациялар"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Божомолдоп билүү үчүн системанын анимацияларын иштетиңиз."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Бул параметр жаңсоо анимациясын божомолдоп билүү үчүн системанын анимацияларын иштетет. Ал үчүн манифест файлындагы enableOnBackInvokedCallback параметри ар бир колдонмо үчүн \"true\" деп коюлушу керек."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index fcc4f044c9d3..8ba766fdcd98 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ໂທລະສັບນີ້"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ແທັບເລັດນີ້"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"ໂທລະສັບນີ້"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ເກີດບັນຫາໃນການເຊື່ອມຕໍ່. ປິດອຸປະກອນແລ້ວເປີດກັບຄືນມາໃໝ່"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ອຸປະກອນສຽງແບບມີສາຍ"</string> <string name="help_label" msgid="3528360748637781274">"ຊ່ວຍເຫຼືອ ແລະ ຕິຊົມ"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"ອະນິເມຊັນກັບຫຼັງແບບຄາດເດົາ"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"ເປີດການນຳໃຊ້ອະນິເມຊັນລະບົບສຳລັບການກັບຫຼັງແບບຄາດເດົາ."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"ການຕັ້ງຄ່ານີ້ຈະເປີດການນຳໃຊ້ອະນິເມຊັນລະບົບສຳລັບອະນິເມຊັນທ່າທາງແບບຄາດເດົາ. ມັນຕ້ອງໃຊ້ການຕັ້ງຄ່າຕໍ່ແອັບ enableOnBackInvokedCallback ເປັນ true ໃນໄຟລ໌ manifest."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index 5b8b93f7bfe9..72de8b2e2f3f 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -540,6 +540,9 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Šis telefonas"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Šis planšetinis kompiuteris"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Šis telefonas"</string> + <string name="media_output_status_require_premium" msgid="8411255800047014822">"Jei norite perjungti, naujovinkite paskyrą"</string> + <string name="media_output_status_not_support_downloads" msgid="4523828729240373315">"Čia negalima paleisti atsisiuntimų"</string> + <string name="media_output_status_try_after_ad" msgid="8312579066856015441">"Bandykite dar kartą po skelbimo"</string> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Prisijungiant kilo problema. Išjunkite įrenginį ir vėl jį įjunkite"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Laidinis garso įrenginys"</string> <string name="help_label" msgid="3528360748637781274">"Pagalba ir atsiliepimai"</string> @@ -666,4 +669,10 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Numatomos grįžimo atgal gestų animacijos"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Įgalinkite sistemos animacijas, kad būtų galima naudoti numatomus grįžimo atgal gestus."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Šis nustatymas įgalina numatomų grįžimo atgal gestų sistemos animacijas. Aprašo faile programos lauką „enableOnBackInvokedCallback“ reikia nustatyti į vertę „true“."</string> + <string-array name="udfps_accessibility_touch_hints"> + <item msgid="1737722959616802157">"Perkelti kairėn"</item> + <item msgid="5425394847942513942">"Perkelti žemyn"</item> + <item msgid="7728484337962740316">"Perkelti dešinėn"</item> + <item msgid="324200556467459329">"Perkelti aukštyn"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 59c3b0f6878a..b2c6aa696fb9 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Šis tālrunis"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Šis planšetdators"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Šis tālrunis"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Radās problēma ar savienojuma izveidi. Izslēdziet un atkal ieslēdziet ierīci."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Vadu audioierīce"</string> <string name="help_label" msgid="3528360748637781274">"Palīdzība un atsauksmes"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animāciju prognozēšana pāriešanai atpakaļ"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Iespējot sistēmas animācijas prognozētam žestam pāriešanai atpakaļ."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Šis iestatījums iespējo sistēmas animācijas prognozēto žestu animācijām. Lai to varētu izmantot, parametram “enableOnBackInvokedCallback” lietotnes manifesta failā jāiestata vērtība “true”."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index 4a010d3f3203..9f02f4a8671b 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Овој телефон"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Овој таблет"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Овој телефон"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Проблем со поврзување. Исклучете го уредот и повторно вклучете го"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Жичен аудиоуред"</string> <string name="help_label" msgid="3528360748637781274">"Помош и повратни информации"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Анимации за движењето за враќање"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Овозможете системски анимации за движењето за враќање."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Поставкава ги овозможува системските анимации за предвидливи движења. Поставката треба да се постави на „точно“ преку апликација enableOnBackInvokedCallback во датотеката за манифест."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index 46ffa9f3e48a..11208aecd6a8 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ഈ ഫോൺ"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ഈ ടാബ്ലെറ്റ്"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"ഈ ഫോൺ"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"കണക്റ്റ് ചെയ്യുന്നതിൽ പ്രശ്നമുണ്ടായി. ഉപകരണം ഓഫാക്കി വീണ്ടും ഓണാക്കുക"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"വയർ മുഖേന ബന്ധിപ്പിച്ച ഓഡിയോ ഉപകരണം"</string> <string name="help_label" msgid="3528360748637781274">"സഹായവും ഫീഡ്ബാക്കും"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"പ്രെഡിക്റ്റീവ് ബാക്ക് ആനിമേഷനുകൾ"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"പ്രെഡിക്റ്റീവ് ബാക്കിനായി സിസ്റ്റം ആനിമേഷനുകൾ പ്രവർത്തനക്ഷമമാക്കുക."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"ഈ ക്രമീകരണം പ്രെഡിക്റ്റീവ് ജെസ്ച്ചർ ആനിമേഷന് വേണ്ടി സിസ്റ്റം ആനിമേഷനുകളെ പ്രവർത്തനക്ഷമമാക്കുന്നു. ഇതിന് ഓരോ ആപ്പിലും enableOnBackInvokedCallback എന്നത് മാനിഫെസ്റ്റ് ഫയലിൽ ശരി എന്ന് സജ്ജീകരിക്കേണ്ടതുണ്ട്."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 0a4e4ae3974a..c7a583e24188 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Энэ утас"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Энэ таблет"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Энэ утас"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Холбогдоход асуудал гарлаа. Төхөөрөмжийг унтраагаад дахин асаана уу"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Утастай аудио төхөөрөмж"</string> <string name="help_label" msgid="3528360748637781274">"Тусламж, санал хүсэлт"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Таамаглах боломжтой буцаах анимаци"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Таамаглах боломжтой буцаах зангаанд системийн анимацийг идэвхжүүлнэ үү."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Энэ тохиргоо нь таамаглах боломжтой зангааны анимацид системийн анимацийг идэвхжүүлнэ. Үүнд апп бүрд тодорхойлогч файлл enableOnBackInvokedCallback-г үнэн болгож тохируулахыг шаардана."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index f74cd54a15a0..952ac41b9f2f 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"हा फोन"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"हा टॅबलेट"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"हा फोन"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"कनेक्ट करण्यात समस्या आली. डिव्हाइस बंद करा आणि नंतर सुरू करा"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"वायर असलेले ऑडिओ डिव्हाइस"</string> <string name="help_label" msgid="3528360748637781274">"मदत आणि फीडबॅक"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"पूर्वानुमानित मागे जाण्याचे अॅनिमेशन"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"पूर्वानुमानित मागे जाण्यासाठीचे सिस्टीम अॅनिमेशन सुरू करा."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"हे सेटिंग पूर्वानुमानित जेश्चर ॲनिमेशनसाठी सिस्टीम ॲनिमेशन सुरू करते. यासाठी मॅनिफेस्ट फाइलमध्ये प्रति ॲप enableOnBackInvokedCallback सत्य वर सेट करणे आवश्यक आहे."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index f6350b36ebc4..b30e4ce7262f 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Telefon ini"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Tablet ini"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Telefon ini"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Masalah penyambungan. Matikan & hidupkan kembali peranti"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Peranti audio berwayar"</string> <string name="help_label" msgid="3528360748637781274">"Bantuan & maklum balas"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animasi kembali ramalan"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Dayakan animasi sistem untuk kembali ramalan."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Tetapan ini mendayakan animasi sistem untuk animasi gerak isyarat ramalan. Animasi sistem memerlukan tetapan enableOnBackInvokedCallback untuk setiap apl kepada benar dalam fail manifes."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index c148ebabd775..2baafde340e3 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ဤဖုန်း"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ဤတက်ဘလက်"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"ဤဖုန်း"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ချိတ်ဆက်ရာတွင် ပြဿနာရှိပါသည်။ စက်ကိုပိတ်ပြီး ပြန်ဖွင့်ပါ"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ကြိုးတပ် အသံစက်ပစ္စည်း"</string> <string name="help_label" msgid="3528360748637781274">"အကူအညီနှင့် အကြံပြုချက်"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"နောက်ခလုတ်၏ ရှေ့ပြေးလှုပ်ရှားသက်ဝင်ပုံ"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"နောက်ခလုတ်ရှေ့ပြေးအတွက် စနစ်လှုပ်ရှားသက်ဝင်ပုံများကို ဖွင့်ပါသည်။"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"ဤဆက်တင်သည် လက်ဟန် ရှေ့ပြေးလှုပ်ရှားသက်ဝင်ပုံအတွက် စနစ်လှုပ်ရှားသက်ဝင်ပုံများကို ဖွင့်ပါသည်။ အက်ပ်တစ်ခုစီ၏ ဆက်တင်အတွက် enableOnBackInvokedCallback ကို မန်နီးဖက်စ် (manifest) ဖိုင်၌ ဖွင့်ထားရန်လိုအပ်သည်။"</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 4f70669a947e..c63dc032f2cb 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Denne telefonen"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Dette nettbrettet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Denne telefonen"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Tilkoblingsproblemer. Slå enheten av og på igjen"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Lydenhet med kabel"</string> <string name="help_label" msgid="3528360748637781274">"Hjelp og tilbakemelding"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Tilbake-animasjoner med forslag"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Slå på systemanimasjoner for tilbakebevegelser med forslag."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Denne innstillingen slår på systemanimasjoner for bevegelsesanimasjoner med forslag. Den krever at enableOnBackInvokedCallback settes til sann i manifestfilen for hver app."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 703ee0a7af64..687b43697b37 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"यो फोन"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"यो ट्याब्लेट"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"यो फोन"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"जोड्ने क्रममा समस्या भयो। यन्त्रलाई निष्क्रिय पारेर फेरि अन गर्नुहोस्"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"तारयुक्त अडियो यन्त्र"</string> <string name="help_label" msgid="3528360748637781274">"मद्दत र प्रतिक्रिया"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"पूर्वानुमानयुक्त ब्याक एनिमेसनहरू"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"पूर्वानुमानयुक्त ब्याक एनिमेसनका हकमा सिस्टम एनिमेसनहरू लागू गर्नुहोस्।"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"यो सेटिङले पूर्वानुमानयुक्त जेस्चर एनिमेसनका हकमा सिस्टम एनिमेनसहरू लागू गर्छ। म्यानिफेस्ट फाइलमा हरेक एपका हकमा enableOnBackInvokedCallback सेट गरी TRUE बनाएपछि मात्र यो सेटिङ अन गर्न मिल्छ।"</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 344cf01ebb4c..455aa9900ccb 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Deze telefoon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Deze tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Deze telefoon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Probleem bij verbinding maken. Zet het apparaat uit en weer aan."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Bedraad audioapparaat"</string> <string name="help_label" msgid="3528360748637781274">"Hulp en feedback"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Voorspellende animaties voor gebaren voor terug"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Systeemanimaties aanzetten voor voorspellende animaties voor gebaren voor terug."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Met deze instelling zet je systeemanimaties aan voor voorspellende gebaaranimaties. Je moet enableOnBackInvokedCallback per app instellen op True in het manifestbestand."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 445942d5ad6d..d58c817009d0 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ଏହି ଫୋନ"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ଏହି ଟାବଲେଟ"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"ଏହି ଫୋନ୍"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ସଂଯୋଗ କରିବାରେ ସମସ୍ୟା ହେଉଛି। ଡିଭାଇସ୍ ବନ୍ଦ କରି ପୁଣି ଚାଲୁ କରନ୍ତୁ"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ତାରଯୁକ୍ତ ଅଡିଓ ଡିଭାଇସ୍"</string> <string name="help_label" msgid="3528360748637781274">"ସାହାଯ୍ୟ ଓ ମତାମତ"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"ପ୍ରେଡିକ୍ଟିଭ ବ୍ୟାକ ଆନିମେସନ"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"ପ୍ରେଡିକ୍ଟିଭ ବ୍ୟାକ ପାଇଁ ସିଷ୍ଟମ ଆନିମେସନଗୁଡ଼ିକୁ ସକ୍ଷମ କରନ୍ତୁ।"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"ଏହି ସେଟିଂ ପ୍ରେଡିକ୍ଟିଭ ଜେଶ୍ଚର ଆନିମେସନ ପାଇଁ ସିଷ୍ଟମ ଆନିମେସନଗୁଡ଼ିକୁ ସକ୍ଷମ କରେ। ଏଥିପାଇଁ ମାନିଫେଷ୍ଟ ଫାଇଲରେ ପ୍ରତି-ଆପ enableOnBackInvokedCallbackକୁ \"ଠିକ\"ରେ ସେଟ କରିବା ଆବଶ୍ୟକ।"</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index 36694db7bf2e..1ccfdb79d017 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ਇਹ ਫ਼ੋਨ"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ਇਹ ਟੈਬਲੈੱਟ"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"ਇਹ ਫ਼ੋਨ"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"ਕਨੈਕਟ ਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆ ਆਈ। ਡੀਵਾਈਸ ਨੂੰ ਬੰਦ ਕਰਕੇ ਵਾਪਸ ਚਾਲੂ ਕਰੋ"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"ਤਾਰ ਵਾਲਾ ਆਡੀਓ ਡੀਵਾਈਸ"</string> <string name="help_label" msgid="3528360748637781274">"ਮਦਦ ਅਤੇ ਵਿਚਾਰ"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"ਪਿਛਲੇ ਐਨੀਮੇਸ਼ਨਾਂ ਦਾ ਪੂਰਵ-ਅਨੁਮਾਨ"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"ਪੂਰਵ-ਅਨੁਮਾਨ ਵਾਪਸੀ ਲਈ ਸਿਸਟਮ ਐਨੀਮੇਸ਼ਨਾਂ ਨੂੰ ਚਾਲੂ ਕਰੋ।"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"ਇਹ ਸੈਟਿੰਗ ਪੂਰਵ-ਅਨੁਮਾਨ ਇਸ਼ਾਰਾ ਐਨੀਮੇਸ਼ਨ ਲਈ ਸਿਸਟਮ ਐਨੀਮੇਸ਼ਨਾਂ ਨੂੰ ਚਾਲੂ ਕਰਦੀ ਹੈ। ਮੈਨੀਫ਼ੈਸਟ ਫ਼ਾਈਲ ਵਿੱਚ enableOnBackInvokedCallback ਸੈਟਿੰਗ ਨੂੰ ਪ੍ਰਤੀ-ਐਪ \'ਸਹੀ\' \'ਤੇ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।"</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index debc6c9b8886..ab45681f203e 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ten telefon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ten tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Ten telefon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem z połączeniem. Wyłącz i ponownie włącz urządzenie"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Przewodowe urządzenie audio"</string> <string name="help_label" msgid="3528360748637781274">"Pomoc i opinie"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animacje przewidywanego przejścia wstecz"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Włącz animacje systemowe dla przewidywanego przejścia wstecz."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"To ustawienie uruchamia animacje systemowe dla przewidywanych gestów. Wymaga ustawienia w pliku manifestu wartości true w polu enableOnBackInvokedCallback dla każdej aplikacji."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index c0c1c72aff56..7b501f3c83b3 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Este smartphone"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Este tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Este smartphone"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ocorreu um problema na conexão. Desligue o dispositivo e ligue-o novamente"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fio"</string> <string name="help_label" msgid="3528360748637781274">"Ajuda e feedback"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animações de gestos \"Voltar\" preditivos"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Ativar animações do sistema para gestos \"Voltar\" preditivos."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Esta configuração ativa animações do sistema para gestos preditivos. Ela requer que a política enableOnBackInvokedCallback por app seja definida como verdadeira no arquivo de manifesto."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 69245dc72444..3bef621c67ba 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -540,6 +540,9 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Este telemóvel"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Este tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Este telemóvel"</string> + <string name="media_output_status_require_premium" msgid="8411255800047014822">"Atualize a conta para mudar"</string> + <string name="media_output_status_not_support_downloads" msgid="4523828729240373315">"Não é possível reproduzir as transferências aqui"</string> + <string name="media_output_status_try_after_ad" msgid="8312579066856015441">"Tente novamente depois do anúncio"</string> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problema ao ligar. Desligue e volte a ligar o dispositivo."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fios"</string> <string name="help_label" msgid="3528360748637781274">"Ajuda e comentários"</string> @@ -666,4 +669,10 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animações de gestos para voltar preditivos"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Ative as animações do sistema para gestos para voltar preditivos."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Esta definição ativa animações do sistema para a animação de gestos preditivos. Requer a definição do atributo enableOnBackInvokedCallback por app como verdadeiro no ficheiro de manifesto."</string> + <string-array name="udfps_accessibility_touch_hints"> + <item msgid="1737722959616802157">"Mover para a esquerda"</item> + <item msgid="5425394847942513942">"Mover para baixo"</item> + <item msgid="7728484337962740316">"Mover para a direita"</item> + <item msgid="324200556467459329">"Mover para cima"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index c0c1c72aff56..7b501f3c83b3 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Este smartphone"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Este tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Este smartphone"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ocorreu um problema na conexão. Desligue o dispositivo e ligue-o novamente"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispositivo de áudio com fio"</string> <string name="help_label" msgid="3528360748637781274">"Ajuda e feedback"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animações de gestos \"Voltar\" preditivos"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Ativar animações do sistema para gestos \"Voltar\" preditivos."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Esta configuração ativa animações do sistema para gestos preditivos. Ela requer que a política enableOnBackInvokedCallback por app seja definida como verdadeira no arquivo de manifesto."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 9edca36fcefb..b209676b97dc 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Acest telefon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Această tabletă"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Acest telefon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problemă la conectare. Oprește și repornește dispozitivul."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Dispozitiv audio cu fir"</string> <string name="help_label" msgid="3528360748637781274">"Ajutor și feedback"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animații pentru gestul înapoi predictiv"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Activează animațiile de sistem pentru gestul înapoi predictiv."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Această setare activează animațiile de sistem pentru animația gesturilor predictive. Necesită setarea valorii true în cazul atributului enableOnBackInvokedCallback pentru fiecare aplicație în fișierul manifest."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index 98a8e883222e..b92fb4f4e4dc 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Этот смартфон"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Этот планшет"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Этот смартфон"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ошибка подключения. Выключите и снова включите устройство."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Проводное аудиоустройство"</string> <string name="help_label" msgid="3528360748637781274">"Справка/отзыв"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Анимации подсказки для жеста \"Назад\""</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Включить системную анимацию подсказки для жеста \"Назад\"."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"С помощью этого параметра можно включить системные анимации подсказок для жестов. Для этого нужно установить значение true для enableOnBackInvokedCallback в файле манифеста приложения."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index f5437fec8b3f..16a0886937ff 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"මෙම දුරකථනය"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"මෙම ටැබ්ලටය"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"මෙම දුරකථනය"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"සම්බන්ධ කිරීමේ ගැටලුවකි උපාංගය ක්රියාවිරහිත කර & ආපසු ක්රියාත්මක කරන්න"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"රැහැන්ගත කළ ඕඩියෝ උපාංගය"</string> <string name="help_label" msgid="3528360748637781274">"උදවු & ප්රතිපෝෂණ"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"පුරෝකථනමය පසු සජීවිකරණ"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"පුරෝකථනමය ආපසු සඳහා පද්ධති සජීවිකරණ සබල කරන්න."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"මෙම සැකසීම පුරෝකථනමය ඉංගිත සජීවිකරණය සඳහා පද්ධති සජීවිකරණ සබල කරයි. එයට මැනිෆෙස්ට් ගොනුව තුළ එක් යෙදුමකට enableOnBackInvokedCallback සත්ය ලෙස සැකසීම අවශ්ය වේ."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index fb46ed9bceaf..cfe5d3943d8c 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -540,6 +540,9 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Tento telefón"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Tento tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Tento telefón"</string> + <string name="media_output_status_require_premium" msgid="8411255800047014822">"Inovujte účet a prejdite naň"</string> + <string name="media_output_status_not_support_downloads" msgid="4523828729240373315">"Tu sa nedajú prehrať stiahnuté súbory"</string> + <string name="media_output_status_try_after_ad" msgid="8312579066856015441">"Skúste to znova po reklame"</string> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Pri pripájaní sa vyskytol problém. Zariadenie vypnite a znova zapnite."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Audio zariadenie s káblom"</string> <string name="help_label" msgid="3528360748637781274">"Pomocník a spätná väzba"</string> @@ -666,4 +669,10 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Prediktívne animácie gesta Späť"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Povoľte animácie v systéme pre prediktívne gesto Späť"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Toto nastavenie povoľuje animácie v systéme na účely prediktívnej animácie gest. Vyžaduje nastavenie povolenia enableOnBackInvokedCallback na pravdu v súbore manifestu konkrétnej aplikácie."</string> + <string-array name="udfps_accessibility_touch_hints"> + <item msgid="1737722959616802157">"Posuňte doľava"</item> + <item msgid="5425394847942513942">"Posuňte nadol"</item> + <item msgid="7728484337962740316">"Posuňte doprava"</item> + <item msgid="324200556467459329">"Presuňte nahor"</item> + </string-array> </resources> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index c9f869249d00..2d653286e711 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ta telefon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ta tablični računalnik"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Ta telefon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Težava pri povezovanju. Napravo izklopite in znova vklopite."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Žična zvočna naprava"</string> <string name="help_label" msgid="3528360748637781274">"Pomoč in povratne informacije"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animacije poteze za nazaj s predvidevanjem"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Omogoči sistemske animacije za potezo za nazaj s predvidevanjem."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Ta nastavitev omogoča sistemske animacije za animacijo poteze s predvidevanjem. V datoteki manifesta mora biti parameter »enableOnBackInvokedCallback« za posamezno aplikacijo nastavljen na »true«."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index 73b52dee47a8..4dab50619488 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ky telefon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ky tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Ky telefon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problem me lidhjen. Fike dhe ndize përsëri pajisjen"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Pajisja audio me tel"</string> <string name="help_label" msgid="3528360748637781274">"Ndihma dhe komentet"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Animacionet për gjestin e parashikuar të kthimit prapa"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Aktivizo animacionet e sistemit për gjestin e parashikuar të kthimit prapa."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Ky cilësim aktivizon animacionet e sistemit për animacionin e gjestit të parashikuar. Ai kërkon që enableOnBackInvokedCallback për aplikacionin të jetë caktuar si i vërtetë në skedarin e manifestit."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index 957c243ae739..b8d6ab4079ed 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Овај телефон"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Овај таблет"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Овај телефон"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Проблем при повезивању. Искључите уређај, па га поново укључите"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Жичани аудио уређај"</string> <string name="help_label" msgid="3528360748637781274">"Помоћ и повратне информације"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Анимације за покрет повратка са предвиђањем"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Омогућите анимације система за покрет повратка са предвиђањем."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Ово подешавање омогућава анимације система за покрет повратка са предвиђањем. Захтева подешавање дозволе enableOnBackInvokedCallback по апликацији на true у фајлу манифеста."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 4e10e549aee6..faf62125d6cd 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Den här telefonen"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Den här surfplattan"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Den här telefonen"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Det gick inte att ansluta. Stäng av enheten och slå på den igen"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Ljudenhet med kabelanslutning"</string> <string name="help_label" msgid="3528360748637781274">"Hjälp och feedback"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Förhandsanimationer för bakåtrörelser"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Aktivera systemanimationer som förhandsvisar bakåtrörelser."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Den här inställningen aktiverar systemanimationer som förhandsvisar vart rörelserna leder. Du måste ställa in enableOnBackInvokedCallback som sant per app i manifestfilen."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 2c4166a96be3..5023fed0d0c2 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Simu hii"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Kompyuta kibao hii"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Simu hii"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Kuna tatizo la kuunganisha kwenye Intaneti. Zima kisha uwashe kifaa"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kifaa cha sauti kinachotumia waya"</string> <string name="help_label" msgid="3528360748637781274">"Usaidizi na maoni"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Uhuishaji wa utabiri wa kurudi nyuma"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Ruhusu uhuishaji wa mfumo wa utabiri wa kurudi nyuma."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Mipangilio hii inaruhusu uhuishaji wa mfumo wa uhuishaji wa utabiri wa ishara. Inahitaji kuweka mipangilio kwa kila programu enableOnBackInvokedCallback kuwa true katika faili ya maelezo."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index eb2b7b28ac33..44c8354fe045 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"இந்த மொபைல்"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"இந்த டேப்லெட்"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"இந்த மொபைல்"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"இணைப்பதில் சிக்கல். சாதனத்தை ஆஃப் செய்து மீண்டும் ஆன் செய்யவும்"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"வயருடன்கூடிய ஆடியோ சாதனம்"</string> <string name="help_label" msgid="3528360748637781274">"உதவியும் கருத்தும்"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"கணிக்கக்கூடிய பின்செல் சைகைக்கான அனிமேஷன்கள்"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"கணிக்கக்கூடிய பின்செல் சைகைக்காகச் சிஸ்டம் அனிமேஷன்களை இயக்கும்."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"கணிக்கக்கூடிய சைகைக்கான அனிமேஷனுக்காக இந்த அமைப்பு சிஸ்டம் அனிமேஷன்களை இயக்கும். மெனிஃபெஸ்ட் ஃபைலில் ஒவ்வொரு ஆப்ஸுக்கும் enableOnBackInvokedCallbackகை \'சரி\' என அமைக்க வேண்டும்."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 9d6c29d0f719..3c2b4dfc06ec 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ఈ ఫోన్"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ఈ టాబ్లెట్"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"ఈ ఫోన్"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"కనెక్ట్ చేయడంలో సమస్య ఉంది. పరికరాన్ని ఆఫ్ చేసి, ఆపై తిరిగి ఆన్ చేయండి"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"వైర్ గల ఆడియో పరికరం"</string> <string name="help_label" msgid="3528360748637781274">"సహాయం & ఫీడ్బ్యాక్"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"ఊహించదగిన బ్యాక్ యానిమేషన్లు"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"ఊహించదగిన బ్యాక్ యానిమేషన్ల కోసం సిస్టమ్ యానిమేషన్లను ఎనేబుల్ చేయండి."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"ఊహించదగిన సంజ్ఞ యానిమేషన్ కోసం ఈ సెట్టింగ్ సిస్టమ్ యానిమేషన్లను ఎనేబుల్ చేస్తుంది. దీనికి మ్యానిఫెస్ట్ ఫైల్లో ఒక్కో యాప్లో enableOnBackInvokedCallback సెట్టింగ్ను ఒప్పునకు సెట్ చేయవలసి ఉంటుంది."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 6dc26082a9f3..aeae2e158b91 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"โทรศัพท์เครื่องนี้"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"แท็บเล็ตเครื่องนี้"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"โทรศัพท์เครื่องนี้"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"เกิดปัญหาในการเชื่อมต่อ ปิดอุปกรณ์แล้วเปิดใหม่อีกครั้ง"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"อุปกรณ์เสียงแบบมีสาย"</string> <string name="help_label" msgid="3528360748637781274">"ความช่วยเหลือและความคิดเห็น"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"การเคลื่อนไหวย้อนกลับแบบคาดเดา"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"เปิดใช้การเคลื่อนไหวของระบบสำหรับท่าทางสัมผัสย้อนกลับแบบคาดเดา"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"การตั้งค่านี้จะเปิดใช้การเคลื่อนไหวของระบบสำหรับการเคลื่อนไหวจากท่าทางสัมผัสแบบคาดเดา โดยต้องตั้งค่า enableOnBackInvokedCallback สำหรับแต่ละแอปให้เป็น \"จริง\" ในไฟล์ Manifest"</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 71b1fdceadb0..9b01d54c7dbd 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Ang teleponong ito"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Ang tablet na ito"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Ang teleponong ito"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Nagkaproblema sa pagkonekta. I-off at pagkatapos ay i-on ang device"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Wired na audio device"</string> <string name="help_label" msgid="3528360748637781274">"Tulong at feedback"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Mga animation ng predictive na pagbalik"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"I-enable ang mga animation ng system para sa predictive na pagbalik."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Ine-enable ng setting na ito ang mga animation ng system para sa animation ng predictive na galaw. Kinakailangan nitong itakda sa true ang enableOnBackInvokedCallback sa bawat app sa manifest file."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 76449d5c3a4c..ad8152df34b6 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Bu telefon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Bu tablet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Bu telefon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Bağlanırken sorun oluştu. Cihazı kapatıp tekrar açın"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Kablolu ses cihazı"</string> <string name="help_label" msgid="3528360748637781274">"Yardım ve geri bildirim"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Tahmine dayalı geri hareketi animasyonları"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Tahmine dayalı geri hareketi için sistem animasyonlarını etkinleştirin"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Bu ayar, tahmine dayalı hareket animasyonu için sistem animasyonlarını etkinleştirir. Her uygulamanın manifest dosyasında enableOnBackInvokedCallback\'in doğru değerine ayarlanması gerekir."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index e23dae7d991e..71aff76dd229 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Цей телефон"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Цей планшет"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Цей телефон"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Не вдається підключитися. Перезавантажте пристрій."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Дротовий аудіопристрій"</string> <string name="help_label" msgid="3528360748637781274">"Довідка й відгуки"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Анімації з підказками для жесту \"Назад\""</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Увімкніть системну анімацію з підказками для жесту \"Назад\"."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Якщо вибрати це налаштування, для жесту \"Назад\" відображатиметься анімація з підказками. У файлі маніфесту атрибуту enableOnBackInvokedCallback додатка потрібно присвоїти значення true."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index 452cf77b1520..0707658f1661 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"یہ فون"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"یہ ٹیبلیٹ"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"یہ فون"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"منسلک کرنے میں مسئلہ پیش آ گیا۔ آلہ کو آف اور بیک آن کریں"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"وائرڈ آڈیو آلہ"</string> <string name="help_label" msgid="3528360748637781274">"مدد اور تاثرات"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"پیچھے جانے کے اشارے کی پیش گوئی والی اینیمیشنز"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"پیچھے جانے کے پیش گوئی والے اشارے کے لیے سسٹم اینیمیشنز فعال کریں۔"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"یہ ترتیب پیش گوئی والی اشارے کی اینیمیشن کے لیے سسٹم کی اینیمیشنز کو فعال کرتی ہے۔ اس کے لیے manifest فائل میں فی ایپ enableOnBackInvokedCallback کو درست پر سیٹ کرنے کی ضرورت ہے۔"</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index e55c40ec0c8f..7551536515a3 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Shu telefon"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Shu planshet"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Shu telefon"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Ulanishda muammo yuz berdi. Qurilmani oʻchiring va yoqing"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Simli audio qurilma"</string> <string name="help_label" msgid="3528360748637781274">"Yordam/fikr-mulohaza"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Taxminiy qaytish animatsiyalari"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Taxminiy qaytish uchun tizim animatsiyalarini yoqish."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Bu sozlamalar taxminiy qaytish animatsiyalari uchun tizim animatsiyalarini faollashtiradi. Buning uchun har bir ilovaning manifest faylida enableOnBackInvokedCallback parametri “true” qiymatida boʻlishi lozim."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index 359fab99251c..76de4a89698b 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -315,7 +315,7 @@ <string name="select_usb_configuration_dialog_title" msgid="3579567144722589237">"Chọn cấu hình USB"</string> <string name="allow_mock_location" msgid="2102650981552527884">"Cho phép vị trí mô phỏng"</string> <string name="allow_mock_location_summary" msgid="179780881081354579">"Cho phép vị trí mô phỏng"</string> - <string name="debug_view_attributes" msgid="3539609843984208216">"Cho phép kiểm tra thuộc tính của chế độ xem"</string> + <string name="debug_view_attributes" msgid="3539609843984208216">"Cho phép kiểm tra thuộc tính khung hiển thị"</string> <string name="mobile_data_always_on_summary" msgid="1112156365594371019">"Luôn bật dữ liệu di động ngay cả khi Wi-Fi đang hoạt động (để chuyển đổi mạng nhanh)."</string> <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"Sử dụng tính năng tăng tốc phần cứng khi chia sẻ Internet nếu có"</string> <string name="adb_warning_title" msgid="7708653449506485728">"Cho phép gỡ lỗi qua USB?"</string> @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Điện thoại này"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Máy tính bảng này"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Điện thoại này"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Sự cố kết nối. Hãy tắt thiết bị rồi bật lại"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Thiết bị âm thanh có dây"</string> <string name="help_label" msgid="3528360748637781274">"Trợ giúp và phản hồi"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Ảnh xem trước thao tác quay lại"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Bật ảnh của hệ thống để xem trước thao tác quay lại"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Cài đặt này cho phép sử dụng ảnh động hệ thống cho ảnh động cử chỉ dự đoán. Nó yêu cầu cài đặt cho mỗi ứng dụng chuyển enableOnBackInvokedCallback thành lệnh true trong tệp kê khai."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 73c5a97d1b48..20d4c17e33e2 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"这部手机"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"这台平板电脑"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"这部手机"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"连接时遇到问题。请关闭并重新开启设备"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有线音频设备"</string> <string name="help_label" msgid="3528360748637781274">"帮助和反馈"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"预见式返回动画"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"启用系统动画作为预见式返回动画。"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"此设置将启用系统动画作为预测性手势动画。这要求在清单文件中将单个应用的 enableOnBackInvokedCallback 设为 true。"</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 36267e2ec280..cc741d887e76 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"此手機"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"此平板電腦"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"這部手機"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"無法連接,請關閉裝置然後重新開機"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線音響裝置"</string> <string name="help_label" msgid="3528360748637781274">"說明與意見反映"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"預測返回手勢動畫"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"為預測返回手勢啟用系統動畫。"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"此設定會啟用系統動畫作為預測手勢動畫。這必須在資訊清單檔案中將個別應用程式的 enableOnBackInvokedCallback 設定為 true。"</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index 24bf57e07b64..8af3e34b5920 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"這支手機"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"這台平板電腦"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"這支手機"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"無法連線,請關閉裝置後再重新開啟"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有線音訊裝置"</string> <string name="help_label" msgid="3528360748637781274">"說明與意見回饋"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"預測返回操作動畫"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"為預測返回操作啟用系統動畫。"</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"這項設定會啟用系統動畫做為預測手勢動畫。這必須在資訊清單檔案中將個別應用程式的 enableOnBackInvokedCallback 設為 true。"</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 4413d3a62679..939702086ec3 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -540,6 +540,12 @@ <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Le foni"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Le thebulethi"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Le foni"</string> + <!-- no translation found for media_output_status_require_premium (8411255800047014822) --> + <skip /> + <!-- no translation found for media_output_status_not_support_downloads (4523828729240373315) --> + <skip /> + <!-- no translation found for media_output_status_try_after_ad (8312579066856015441) --> + <skip /> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Inkinga yokuxhumeka. Vala idivayisi futhi uphinde uyivule"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Idivayisi yomsindo enentambo"</string> <string name="help_label" msgid="3528360748637781274">"Usizo nempendulo"</string> @@ -666,4 +672,8 @@ <string name="back_navigation_animation" msgid="8105467568421689484">"Ukubikezelwa kwasemuva kopopayi"</string> <string name="back_navigation_animation_summary" msgid="741292224121599456">"Nika amandla ukubikezela emuva kopopayi besistimu."</string> <string name="back_navigation_animation_dialog" msgid="8696966520944625596">"Leli sethingi livumela opopayi besistimu mayelana nokuthinta okubikezelwayo kopopayi. Idinga ukusetha i-app ngayinye ku-enableOnBackInvokedCallback ukuze iqinisekise ifayela le-manifest."</string> + <!-- no translation found for udfps_accessibility_touch_hints:0 (1737722959616802157) --> + <!-- no translation found for udfps_accessibility_touch_hints:1 (5425394847942513942) --> + <!-- no translation found for udfps_accessibility_touch_hints:2 (7728484337962740316) --> + <!-- no translation found for udfps_accessibility_touch_hints:3 (324200556467459329) --> </resources> diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java index 6fb5555bb50e..c036fdb7982f 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaDevice.java @@ -73,6 +73,8 @@ public class InfoMediaDevice extends MediaDevice { } @VisibleForTesting + // MediaRoute2Info.getType was made public on API 34, but exists since API 30. + @SuppressWarnings("NewApi") int getDrawableResId() { int resId; switch (mRouteInfo.getType()) { diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index d222b981dc91..77e514f7e037 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -443,6 +443,8 @@ public class InfoMediaManager extends MediaManager { dispatchDeviceListAdded(); } + // MediaRoute2Info.getType was made public on API 34, but exists since API 30. + @SuppressWarnings("NewApi") private void buildAllRoutes() { for (MediaRoute2Info route : mRouterManager.getAllRoutes()) { if (DEBUG) { @@ -462,6 +464,8 @@ public class InfoMediaManager extends MediaManager { return infos; } + // MediaRoute2Info.getType was made public on API 34, but exists since API 30. + @SuppressWarnings("NewApi") private synchronized void buildAvailableRoutes() { for (MediaRoute2Info route : getAvailableRoutes(mPackageName)) { if (DEBUG) { @@ -512,6 +516,8 @@ public class InfoMediaManager extends MediaManager { } } + // MediaRoute2Info.getType was made public on API 34, but exists since API 30. + @SuppressWarnings("NewApi") @VisibleForTesting void addMediaDevice(MediaRoute2Info route) { //TODO(b/258141461): Attach flag and disable reason in MediaDevice @@ -635,8 +641,8 @@ public class InfoMediaManager extends MediaManager { List<RouteListingPreference.Item> finalizedItemList = new ArrayList<>(); List<RouteListingPreference.Item> itemList = routeListingPreference.getItems(); for (RouteListingPreference.Item item : itemList) { - //Put suggested devices on the top first before further organization - if (item.getFlags() == RouteListingPreference.Item.FLAG_SUGGESTED_ROUTE) { + // Put suggested devices on the top first before further organization + if (item.getFlags() == RouteListingPreference.Item.FLAG_SUGGESTED) { finalizedItemList.add(0, item); } else { finalizedItemList.add(item); diff --git a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java index 50f371351f61..d24219817ad4 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java @@ -31,7 +31,7 @@ import static android.media.MediaRoute2Info.TYPE_USB_HEADSET; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET; import static android.media.RouteListingPreference.Item.FLAG_ONGOING_SESSION; -import static android.media.RouteListingPreference.Item.FLAG_SUGGESTED_ROUTE; +import static android.media.RouteListingPreference.Item.FLAG_SUGGESTED; import static android.media.RouteListingPreference.Item.SELECTION_BEHAVIOR_TRANSFER; import static android.media.RouteListingPreference.Item.SUBTEXT_AD_ROUTING_DISALLOWED; import static android.media.RouteListingPreference.Item.SUBTEXT_CUSTOM; @@ -114,6 +114,8 @@ public abstract class MediaDevice implements Comparable<MediaDevice> { setType(info); } + // MediaRoute2Info.getType was made public on API 34, but exists since API 30. + @SuppressWarnings("NewApi") private void setType(MediaRoute2Info info) { if (info == null) { mType = MediaDeviceType.TYPE_BLUETOOTH_DEVICE; @@ -335,6 +337,8 @@ public abstract class MediaDevice implements Comparable<MediaDevice> { * * @return true if the RouteInfo equals TYPE_BLE_HEADSET. */ + // MediaRoute2Info.getType was made public on API 34, but exists since API 30. + @SuppressWarnings("NewApi") public boolean isBLEDevice() { return mRouteInfo.getType() == TYPE_BLE_HEADSET; } @@ -551,7 +555,7 @@ public abstract class MediaDevice implements Comparable<MediaDevice> { private static class Api34Impl { @DoNotInline static boolean isSuggestedDevice(RouteListingPreference.Item item) { - return item != null && (item.getFlags() & FLAG_SUGGESTED_ROUTE) != 0; + return item != null && (item.getFlags() & FLAG_SUGGESTED) != 0; } @DoNotInline diff --git a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java index de16d4add0ea..1c82be9c801f 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java @@ -56,6 +56,8 @@ public class PhoneMediaDevice extends MediaDevice { initDeviceRecord(); } + // MediaRoute2Info.getType was made public on API 34, but exists since API 30. + @SuppressWarnings("NewApi") @Override public String getName() { CharSequence name; @@ -94,11 +96,15 @@ public class PhoneMediaDevice extends MediaDevice { return mContext.getDrawable(getDrawableResId()); } + // MediaRoute2Info.getType was made public on API 34, but exists since API 30. + @SuppressWarnings("NewApi") @VisibleForTesting int getDrawableResId() { return mDeviceIconUtil.getIconResIdFromMediaRouteType(mRouteInfo.getType()); } + // MediaRoute2Info.getType was made public on API 34, but exists since API 30. + @SuppressWarnings("NewApi") @Override public String getId() { String id; diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java index 31038cdf184e..04c1c31dc1df 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java @@ -259,8 +259,10 @@ public class InfoMediaManagerTest { ReflectionHelpers.setStaticField(Build.VERSION.class, "SDK_INT", Build.VERSION_CODES.UPSIDE_DOWN_CAKE); final List<RouteListingPreference.Item> preferenceItemList = new ArrayList<>(); - RouteListingPreference.Item item1 = new RouteListingPreference.Item.Builder( - TEST_ID_4).setFlags(RouteListingPreference.Item.FLAG_SUGGESTED_ROUTE).build(); + RouteListingPreference.Item item1 = + new RouteListingPreference.Item.Builder(TEST_ID_4) + .setFlags(RouteListingPreference.Item.FLAG_SUGGESTED) + .build(); RouteListingPreference.Item item2 = new RouteListingPreference.Item.Builder( TEST_ID_3).build(); preferenceItemList.add(item1); diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java index ca6c332579e1..1d0becd8db98 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java +++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java @@ -110,6 +110,7 @@ public class AccessibilityMenuService extends AccessibilityService @Override public void onCreate() { super.onCreate(); + setTheme(R.style.ServiceTheme); getAccessibilityButtonController().registerAccessibilityButtonCallback( new AccessibilityButtonController.AccessibilityButtonCallback() { diff --git a/packages/SystemUI/animation/Android.bp b/packages/SystemUI/animation/Android.bp index 8acc2f8adcf9..978ab5d9ddd8 100644 --- a/packages/SystemUI/animation/Android.bp +++ b/packages/SystemUI/animation/Android.bp @@ -35,7 +35,6 @@ android_library { ], static_libs: [ - "PluginCoreLib", "androidx.core_core-animation-nodeps", "androidx.core_core-ktx", "androidx.annotation_annotation", diff --git a/packages/SystemUI/res-keyguard/values/arrays.xml b/packages/SystemUI/res-keyguard/values/arrays.xml index a8b3c1bf9797..26bc865bcaf7 100644 --- a/packages/SystemUI/res-keyguard/values/arrays.xml +++ b/packages/SystemUI/res-keyguard/values/arrays.xml @@ -32,4 +32,13 @@ <item>TUV</item><!-- 8 --> <item>WXYZ</item><!-- 9 --> </string-array> + + <integer-array name="bouncer_pin_shapes"> + <item>@drawable/pin_dot_shape_1_avd</item> + <item>@drawable/pin_dot_shape_2_avd</item> + <item>@drawable/pin_dot_shape_3_avd</item> + <item>@drawable/pin_dot_shape_4_avd</item> + <item>@drawable/pin_dot_shape_5_avd</item> + <item>@drawable/pin_dot_shape_6_avd</item> + </integer-array> </resources> diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml index 6cc5b9d7b7e8..b9c7be204d9d 100644 --- a/packages/SystemUI/res-keyguard/values/dimens.xml +++ b/packages/SystemUI/res-keyguard/values/dimens.xml @@ -69,6 +69,10 @@ <!-- The size of the dots in the PIN unlock method. --> <dimen name="password_dot_size">9dp</dimen> + + <!-- The size of the shape in the PIN unlock method. --> + <dimen name="password_shape_size">34dp</dimen> + <!-- The size of PIN text in the PIN unlock method. --> <integer name="scaled_password_text_size">40</integer> @@ -139,4 +143,9 @@ <!-- Translation y for appear animation --> <dimen name="keyguard_host_view_translation_y">80dp</dimen> + + <!-- Attributes for placeholder dots in 6 digit PIN view --> + <dimen name="default_dot_diameter">34dp</dimen> + <dimen name="default_dot_spacing">0dp</dimen> + </resources> diff --git a/packages/SystemUI/res/drawable/pin_dot_avd.xml b/packages/SystemUI/res/drawable/pin_dot_avd.xml new file mode 100644 index 000000000000..e0cd1fb2e129 --- /dev/null +++ b/packages/SystemUI/res/drawable/pin_dot_avd.xml @@ -0,0 +1,56 @@ +<!-- + ~ Copyright (C) 2023 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. + --> + +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt"> + <target android:name="time_group"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator + android:duration="500" + android:propertyName="translateX" + android:startOffset="0" + android:valueFrom="0" + android:valueTo="1" + android:valueType="floatType" /> + </set> + </aapt:attr> + </target> + <aapt:attr name="android:drawable"> + <vector + android:width="60dp" + android:height="61dp" + android:viewportHeight="60" + android:viewportWidth="60"> + <group android:name="_R_G"> + <group + android:name="_R_G_L_0_G" + android:translateX="43.237" + android:translateY="38.112"> + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:pathData=" M-13.24 -12.11 C-11.03,-12.11 -9.24,-10.32 -9.24,-8.11 C-9.24,-5.9 -11.03,-4.11 -13.24,-4.11 C-15.44,-4.11 -17.24,-5.9 -17.24,-8.11 C-17.24,-10.32 -15.44,-12.11 -13.24,-12.11c " + android:strokeAlpha="1" + android:strokeColor="#ffffff" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="2" /> + </group> + </group> + <group android:name="time_group" /> + </vector> + </aapt:attr> +</animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/pin_dot_delete_avd.xml b/packages/SystemUI/res/drawable/pin_dot_delete_avd.xml new file mode 100644 index 000000000000..33f995cfb7b6 --- /dev/null +++ b/packages/SystemUI/res/drawable/pin_dot_delete_avd.xml @@ -0,0 +1 @@ +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"><aapt:attr name="android:drawable"><vector android:height="60dp" android:width="60dp" android:viewportHeight="60" android:viewportWidth="60"><group android:name="_R_G"><group android:name="_R_G_L_0_G" android:translateX="43.54" android:translateY="38.54"><path android:name="_R_G_L_0_G_D_0_P_0" android:fillColor="#ffffff" android:fillAlpha="1" android:fillType="nonZero" android:pathData=" M-13.54 -16.54 C-9.12,-16.54 -5.54,-12.96 -5.54,-8.54 C-5.54,-4.12 -9.12,-0.54 -13.54,-0.54 C-17.96,-0.54 -21.54,-4.12 -21.54,-8.54 C-21.54,-12.96 -17.96,-16.54 -13.54,-16.54c "/><path android:name="_R_G_L_0_G_D_1_P_0" android:strokeColor="#ffffff" android:strokeLineCap="round" android:strokeLineJoin="round" android:strokeWidth="0" android:strokeAlpha="1" android:pathData=" M-13.54 -16.54 C-9.12,-16.54 -5.54,-12.96 -5.54,-8.54 C-5.54,-4.12 -9.12,-0.54 -13.54,-0.54 C-17.96,-0.54 -21.54,-4.12 -21.54,-8.54 C-21.54,-12.96 -17.96,-16.54 -13.54,-16.54c "/></group></group><group android:name="time_group"/></vector></aapt:attr><target android:name="_R_G_L_0_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="fillAlpha" android:duration="150" android:startOffset="0" android:valueFrom="1" android:valueTo="1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="fillAlpha" android:duration="200" android:startOffset="150" android:valueFrom="1" android:valueTo="0" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="pathData" android:duration="150" android:startOffset="0" android:valueFrom="M-13.54 -16.54 C-9.12,-16.54 -5.54,-12.96 -5.54,-8.54 C-5.54,-4.12 -9.12,-0.54 -13.54,-0.54 C-17.96,-0.54 -21.54,-4.12 -21.54,-8.54 C-21.54,-12.96 -17.96,-16.54 -13.54,-16.54c " android:valueTo="M-13.54 -11.54 C-11.88,-11.54 -10.54,-10.2 -10.54,-8.54 C-10.54,-6.88 -11.88,-5.54 -13.54,-5.54 C-15.2,-5.54 -16.54,-6.88 -16.54,-8.54 C-16.54,-10.2 -15.2,-11.54 -13.54,-11.54c " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="pathData" android:duration="200" android:startOffset="150" android:valueFrom="M-13.54 -11.54 C-11.88,-11.54 -10.54,-10.2 -10.54,-8.54 C-10.54,-6.88 -11.88,-5.54 -13.54,-5.54 C-15.2,-5.54 -16.54,-6.88 -16.54,-8.54 C-16.54,-10.2 -15.2,-11.54 -13.54,-11.54c " android:valueTo="M-13.54 -12.54 C-11.33,-12.54 -9.54,-10.75 -9.54,-8.54 C-9.54,-6.33 -11.33,-4.54 -13.54,-4.54 C-15.75,-4.54 -17.54,-6.33 -17.54,-8.54 C-17.54,-10.75 -15.75,-12.54 -13.54,-12.54c " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G_D_1_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="strokeWidth" android:duration="150" android:startOffset="0" android:valueFrom="0" android:valueTo="0" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="strokeWidth" android:duration="50" android:startOffset="150" android:valueFrom="0" android:valueTo="2" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G_D_1_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="pathData" android:duration="150" android:startOffset="0" android:valueFrom="M-13.54 -16.54 C-9.12,-16.54 -5.54,-12.96 -5.54,-8.54 C-5.54,-4.12 -9.12,-0.54 -13.54,-0.54 C-17.96,-0.54 -21.54,-4.12 -21.54,-8.54 C-21.54,-12.96 -17.96,-16.54 -13.54,-16.54c " android:valueTo="M-13.54 -11.54 C-11.88,-11.54 -10.54,-10.2 -10.54,-8.54 C-10.54,-6.88 -11.88,-5.54 -13.54,-5.54 C-15.2,-5.54 -16.54,-6.88 -16.54,-8.54 C-16.54,-10.2 -15.2,-11.54 -13.54,-11.54c " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="pathData" android:duration="200" android:startOffset="150" android:valueFrom="M-13.54 -11.54 C-11.88,-11.54 -10.54,-10.2 -10.54,-8.54 C-10.54,-6.88 -11.88,-5.54 -13.54,-5.54 C-15.2,-5.54 -16.54,-6.88 -16.54,-8.54 C-16.54,-10.2 -15.2,-11.54 -13.54,-11.54c " android:valueTo="M-13.54 -12.54 C-11.33,-12.54 -9.54,-10.75 -9.54,-8.54 C-9.54,-6.33 -11.33,-4.54 -13.54,-4.54 C-15.75,-4.54 -17.54,-6.33 -17.54,-8.54 C-17.54,-10.75 -15.75,-12.54 -13.54,-12.54c " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="time_group"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateX" android:duration="500" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"/></set></aapt:attr></target></animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/pin_dot_shape_1_avd.xml b/packages/SystemUI/res/drawable/pin_dot_shape_1_avd.xml new file mode 100644 index 000000000000..da936a28e34f --- /dev/null +++ b/packages/SystemUI/res/drawable/pin_dot_shape_1_avd.xml @@ -0,0 +1 @@ +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"><aapt:attr name="android:drawable"><vector android:height="60dp" android:width="60dp" android:viewportHeight="60" android:viewportWidth="60"><group android:name="_R_G"><group android:name="_R_G_L_0_G" android:translateX="-187.543" android:translateY="-188.546"><path android:name="_R_G_L_0_G_D_0_P_0" android:fillColor="#ffffff" android:fillAlpha="0" android:fillType="nonZero" android:pathData=" M217.62 214.55 C217.62,214.55 217.68,214.55 217.68,214.55 C217.68,214.55 217.74,214.56 217.74,214.56 C217.74,214.56 217.81,214.56 217.81,214.56 C217.81,214.56 217.87,214.56 217.87,214.56 C217.87,214.56 217.93,214.57 217.93,214.57 C217.93,214.57 218,214.57 218,214.57 C218,214.57 218.06,214.58 218.06,214.58 C218.06,214.58 218.12,214.59 218.12,214.59 C218.12,214.59 218.18,214.6 218.18,214.6 C218.18,214.6 218.24,214.61 218.24,214.61 C218.24,214.61 218.31,214.62 218.31,214.62 C218.31,214.62 218.37,214.63 218.37,214.63 C218.37,214.63 218.43,214.65 218.43,214.65 C218.43,214.65 218.49,214.66 218.49,214.66 C218.49,214.66 218.55,214.68 218.55,214.68 C218.55,214.68 218.61,214.69 218.61,214.69 C218.61,214.69 218.67,214.71 218.67,214.71 C218.67,214.71 218.73,214.73 218.73,214.73 C218.73,214.73 218.79,214.75 218.79,214.75 C218.79,214.75 218.85,214.77 218.85,214.77 C218.85,214.77 218.91,214.79 218.91,214.79 C218.91,214.79 218.97,214.81 218.97,214.81 C218.97,214.81 219.03,214.83 219.03,214.83 C219.03,214.83 219.09,214.85 219.09,214.85 C219.09,214.85 219.15,214.88 219.15,214.88 C219.15,214.88 219.2,214.9 219.2,214.9 C219.2,214.9 219.26,214.93 219.26,214.93 C219.26,214.93 219.32,214.96 219.32,214.96 C219.32,214.96 219.37,214.98 219.37,214.98 C219.37,214.98 219.43,215.01 219.43,215.01 C219.43,215.01 219.48,215.05 219.48,215.05 C219.48,215.05 219.54,215.08 219.54,215.08 C219.54,215.08 219.59,215.11 219.59,215.11 C219.59,215.11 219.65,215.14 219.65,215.14 C219.65,215.14 219.7,215.17 219.7,215.17 C219.7,215.17 219.75,215.21 219.75,215.21 C219.75,215.21 219.81,215.24 219.81,215.24 C219.81,215.24 219.86,215.28 219.86,215.28 C219.86,215.28 219.91,215.32 219.91,215.32 C219.91,215.32 219.96,215.35 219.96,215.35 C219.96,215.35 220.01,215.39 220.01,215.39 C220.01,215.39 220.06,215.43 220.06,215.43 C220.06,215.43 220.11,215.47 220.11,215.47 C220.11,215.47 220.16,215.51 220.16,215.51 C220.16,215.51 220.2,215.55 220.2,215.55 C220.2,215.55 220.25,215.59 220.25,215.59 C220.25,215.59 220.3,215.63 220.3,215.63 C220.3,215.63 220.34,215.68 220.34,215.68 C220.34,215.68 220.39,215.72 220.39,215.72 C220.39,215.72 220.43,215.77 220.43,215.77 C220.43,215.77 220.47,215.81 220.47,215.81 C220.47,215.81 220.52,215.86 220.52,215.86 C220.52,215.86 220.56,215.9 220.56,215.9 C220.56,215.9 220.6,215.95 220.6,215.95 C220.6,215.95 220.64,216 220.64,216 C220.64,216 220.68,216.05 220.68,216.05 C220.68,216.05 220.72,216.1 220.72,216.1 C220.72,216.1 220.76,216.15 220.76,216.15 C220.76,216.15 220.8,216.2 220.8,216.2 C220.8,216.2 220.83,216.25 220.83,216.25 C220.83,216.25 220.87,216.3 220.87,216.3 C220.87,216.3 220.9,216.36 220.9,216.36 C220.9,216.36 220.94,216.41 220.94,216.41 C220.94,216.41 220.97,216.46 220.97,216.46 C220.97,216.46 221,216.51 221,216.51 C221,216.51 221.03,216.57 221.03,216.57 C221.03,216.57 221.06,216.63 221.06,216.63 C221.06,216.63 221.09,216.68 221.09,216.68 C221.09,216.68 221.12,216.74 221.12,216.74 C221.12,216.74 221.15,216.79 221.15,216.79 C221.15,216.79 221.18,216.85 221.18,216.85 C221.18,216.85 221.21,216.91 221.21,216.91 C221.21,216.91 221.23,216.96 221.23,216.96 C221.23,216.96 221.25,217.02 221.25,217.02 C221.25,217.02 221.28,217.08 221.28,217.08 C221.28,217.08 221.3,217.14 221.3,217.14 C221.3,217.14 221.33,217.2 221.33,217.2 C221.33,217.2 221.34,217.26 221.34,217.26 C221.34,217.26 221.36,217.32 221.36,217.32 C221.36,217.32 221.38,217.38 221.38,217.38 C221.38,217.38 221.4,217.44 221.4,217.44 C221.4,217.44 221.42,217.5 221.42,217.5 C221.42,217.5 221.44,217.56 221.44,217.56 C221.44,217.56 221.45,217.62 221.45,217.62 C221.45,217.62 221.46,217.68 221.46,217.68 C221.46,217.68 221.48,217.74 221.48,217.74 C221.48,217.74 221.49,217.8 221.49,217.8 C221.49,217.8 221.5,217.87 221.5,217.87 C221.5,217.87 221.51,217.93 221.51,217.93 C221.51,217.93 221.52,217.99 221.52,217.99 C221.52,217.99 221.53,218.05 221.53,218.05 C221.53,218.05 221.54,218.11 221.54,218.11 C221.54,218.11 221.54,218.18 221.54,218.18 C221.54,218.18 221.55,218.24 221.55,218.24 C221.55,218.24 221.55,218.3 221.55,218.3 C221.55,218.3 221.55,218.37 221.55,218.37 C221.55,218.37 221.56,218.43 221.56,218.43 C221.56,218.43 221.56,218.49 221.56,218.49 C221.56,218.49 221.56,218.55 221.56,218.55 C221.56,218.55 221.56,218.62 221.56,218.62 C221.56,218.62 221.56,218.68 221.56,218.68 C221.56,218.68 221.55,218.74 221.55,218.74 C221.55,218.74 221.55,218.81 221.55,218.81 C221.55,218.81 221.55,218.87 221.55,218.87 C221.55,218.87 221.54,218.93 221.54,218.93 C221.54,218.93 221.54,218.99 221.54,218.99 C221.54,218.99 221.53,219.06 221.53,219.06 C221.53,219.06 221.52,219.12 221.52,219.12 C221.52,219.12 221.51,219.18 221.51,219.18 C221.51,219.18 221.5,219.24 221.5,219.24 C221.5,219.24 221.49,219.3 221.49,219.3 C221.49,219.3 221.48,219.37 221.48,219.37 C221.48,219.37 221.46,219.43 221.46,219.43 C221.46,219.43 221.45,219.49 221.45,219.49 C221.45,219.49 221.43,219.55 221.43,219.55 C221.43,219.55 221.42,219.61 221.42,219.61 C221.42,219.61 221.4,219.67 221.4,219.67 C221.4,219.67 221.39,219.73 221.39,219.73 C221.39,219.73 221.37,219.79 221.37,219.79 C221.37,219.79 221.34,219.85 221.34,219.85 C221.34,219.85 221.32,219.91 221.32,219.91 C221.32,219.91 221.3,219.97 221.3,219.97 C221.3,219.97 221.28,220.03 221.28,220.03 C221.28,220.03 221.26,220.09 221.26,220.09 C221.26,220.09 221.23,220.14 221.23,220.14 C221.23,220.14 221.21,220.2 221.21,220.2 C221.21,220.2 221.18,220.26 221.18,220.26 C221.18,220.26 221.15,220.32 221.15,220.32 C221.15,220.32 221.13,220.37 221.13,220.37 C221.13,220.37 221.1,220.43 221.1,220.43 C221.1,220.43 221.07,220.48 221.07,220.48 C221.07,220.48 221.03,220.54 221.03,220.54 C221.03,220.54 221,220.59 221,220.59 C221,220.59 220.97,220.65 220.97,220.65 C220.97,220.65 220.94,220.7 220.94,220.7 C220.94,220.7 220.9,220.75 220.9,220.75 C220.9,220.75 220.87,220.8 220.87,220.8 C220.87,220.8 220.83,220.86 220.83,220.86 C220.83,220.86 220.8,220.91 220.8,220.91 C220.8,220.91 220.76,220.96 220.76,220.96 C220.76,220.96 220.72,221.01 220.72,221.01 C220.72,221.01 220.68,221.06 220.68,221.06 C220.68,221.06 220.64,221.11 220.64,221.11 C220.64,221.11 220.6,221.15 220.6,221.15 C220.6,221.15 220.56,221.2 220.56,221.2 C220.56,221.2 220.52,221.25 220.52,221.25 C220.52,221.25 220.48,221.3 220.48,221.3 C220.48,221.3 220.43,221.34 220.43,221.34 C220.43,221.34 220.39,221.38 220.39,221.38 C220.39,221.38 220.34,221.43 220.34,221.43 C220.34,221.43 220.3,221.47 220.3,221.47 C220.3,221.47 220.25,221.52 220.25,221.52 C220.25,221.52 220.21,221.56 220.21,221.56 C220.21,221.56 220.16,221.6 220.16,221.6 C220.16,221.6 220.11,221.64 220.11,221.64 C220.11,221.64 220.06,221.68 220.06,221.68 C220.06,221.68 220.01,221.72 220.01,221.72 C220.01,221.72 219.96,221.76 219.96,221.76 C219.96,221.76 219.91,221.8 219.91,221.8 C219.91,221.8 219.86,221.83 219.86,221.83 C219.86,221.83 219.81,221.87 219.81,221.87 C219.81,221.87 219.75,221.9 219.75,221.9 C219.75,221.9 219.7,221.93 219.7,221.93 C219.7,221.93 219.65,221.97 219.65,221.97 C219.65,221.97 219.6,222 219.6,222 C219.6,222 219.54,222.03 219.54,222.03 C219.54,222.03 219.49,222.06 219.49,222.06 C219.49,222.06 219.43,222.09 219.43,222.09 C219.43,222.09 219.37,222.12 219.37,222.12 C219.37,222.12 219.32,222.15 219.32,222.15 C219.32,222.15 219.26,222.18 219.26,222.18 C219.26,222.18 219.21,222.2 219.21,222.2 C219.21,222.2 219.15,222.23 219.15,222.23 C219.15,222.23 219.09,222.25 219.09,222.25 C219.09,222.25 219.03,222.28 219.03,222.28 C219.03,222.28 218.97,222.3 218.97,222.3 C218.97,222.3 218.91,222.32 218.91,222.32 C218.91,222.32 218.85,222.34 218.85,222.34 C218.85,222.34 218.79,222.36 218.79,222.36 C218.79,222.36 218.73,222.38 218.73,222.38 C218.73,222.38 218.67,222.4 218.67,222.4 C218.67,222.4 218.61,222.42 218.61,222.42 C218.61,222.42 218.55,222.44 218.55,222.44 C218.55,222.44 218.49,222.45 218.49,222.45 C218.49,222.45 218.43,222.46 218.43,222.46 C218.43,222.46 218.37,222.47 218.37,222.47 C218.37,222.47 218.31,222.49 218.31,222.49 C218.31,222.49 218.25,222.5 218.25,222.5 C218.25,222.5 218.18,222.51 218.18,222.51 C218.18,222.51 218.12,222.52 218.12,222.52 C218.12,222.52 218.06,222.53 218.06,222.53 C218.06,222.53 218,222.54 218,222.54 C218,222.54 217.93,222.54 217.93,222.54 C217.93,222.54 217.87,222.55 217.87,222.55 C217.87,222.55 217.81,222.55 217.81,222.55 C217.81,222.55 217.75,222.55 217.75,222.55 C217.75,222.55 217.68,222.56 217.68,222.56 C217.68,222.56 217.62,222.56 217.62,222.56 C217.62,222.56 217.56,222.56 217.56,222.56 C217.56,222.56 217.49,222.56 217.49,222.56 C217.49,222.56 217.43,222.56 217.43,222.56 C217.43,222.56 217.37,222.55 217.37,222.55 C217.37,222.55 217.3,222.55 217.3,222.55 C217.3,222.55 217.24,222.55 217.24,222.55 C217.24,222.55 217.18,222.54 217.18,222.54 C217.18,222.54 217.12,222.54 217.12,222.54 C217.12,222.54 217.05,222.53 217.05,222.53 C217.05,222.53 216.99,222.52 216.99,222.52 C216.99,222.52 216.93,222.51 216.93,222.51 C216.93,222.51 216.87,222.5 216.87,222.5 C216.87,222.5 216.81,222.49 216.81,222.49 C216.81,222.49 216.74,222.48 216.74,222.48 C216.74,222.48 216.68,222.46 216.68,222.46 C216.68,222.46 216.62,222.45 216.62,222.45 C216.62,222.45 216.56,222.43 216.56,222.43 C216.56,222.43 216.5,222.42 216.5,222.42 C216.5,222.42 216.44,222.4 216.44,222.4 C216.44,222.4 216.38,222.38 216.38,222.38 C216.38,222.38 216.32,222.36 216.32,222.36 C216.32,222.36 216.26,222.34 216.26,222.34 C216.26,222.34 216.2,222.32 216.2,222.32 C216.2,222.32 216.14,222.3 216.14,222.3 C216.14,222.3 216.08,222.28 216.08,222.28 C216.08,222.28 216.02,222.26 216.02,222.26 C216.02,222.26 215.97,222.23 215.97,222.23 C215.97,222.23 215.91,222.2 215.91,222.2 C215.91,222.2 215.85,222.18 215.85,222.18 C215.85,222.18 215.79,222.15 215.79,222.15 C215.79,222.15 215.74,222.12 215.74,222.12 C215.74,222.12 215.68,222.1 215.68,222.1 C215.68,222.1 215.63,222.06 215.63,222.06 C215.63,222.06 215.57,222.03 215.57,222.03 C215.57,222.03 215.52,222 215.52,222 C215.52,222 215.46,221.97 215.46,221.97 C215.46,221.97 215.41,221.94 215.41,221.94 C215.41,221.94 215.36,221.9 215.36,221.9 C215.36,221.9 215.31,221.87 215.31,221.87 C215.31,221.87 215.25,221.83 215.25,221.83 C215.25,221.83 215.2,221.79 215.2,221.79 C215.2,221.79 215.15,221.76 215.15,221.76 C215.15,221.76 215.1,221.72 215.1,221.72 C215.1,221.72 215.05,221.68 215.05,221.68 C215.05,221.68 215,221.64 215,221.64 C215,221.64 214.96,221.6 214.96,221.6 C214.96,221.6 214.91,221.56 214.91,221.56 C214.91,221.56 214.86,221.52 214.86,221.52 C214.86,221.52 214.81,221.48 214.81,221.48 C214.81,221.48 214.77,221.43 214.77,221.43 C214.77,221.43 214.73,221.39 214.73,221.39 C214.73,221.39 214.68,221.34 214.68,221.34 C214.68,221.34 214.64,221.3 214.64,221.3 C214.64,221.3 214.59,221.25 214.59,221.25 C214.59,221.25 214.55,221.2 214.55,221.2 C214.55,221.2 214.51,221.15 214.51,221.15 C214.51,221.15 214.47,221.11 214.47,221.11 C214.47,221.11 214.43,221.06 214.43,221.06 C214.43,221.06 214.39,221.01 214.39,221.01 C214.39,221.01 214.35,220.96 214.35,220.96 C214.35,220.96 214.31,220.91 214.31,220.91 C214.31,220.91 214.28,220.86 214.28,220.86 C214.28,220.86 214.25,220.81 214.25,220.81 C214.25,220.81 214.21,220.75 214.21,220.75 C214.21,220.75 214.18,220.7 214.18,220.7 C214.18,220.7 214.14,220.65 214.14,220.65 C214.14,220.65 214.11,220.59 214.11,220.59 C214.11,220.59 214.08,220.54 214.08,220.54 C214.08,220.54 214.05,220.48 214.05,220.48 C214.05,220.48 214.02,220.43 214.02,220.43 C214.02,220.43 213.99,220.37 213.99,220.37 C213.99,220.37 213.96,220.32 213.96,220.32 C213.96,220.32 213.93,220.26 213.93,220.26 C213.93,220.26 213.91,220.2 213.91,220.2 C213.91,220.2 213.88,220.14 213.88,220.14 C213.88,220.14 213.86,220.09 213.86,220.09 C213.86,220.09 213.83,220.03 213.83,220.03 C213.83,220.03 213.81,219.97 213.81,219.97 C213.81,219.97 213.79,219.91 213.79,219.91 C213.79,219.91 213.77,219.85 213.77,219.85 C213.77,219.85 213.75,219.79 213.75,219.79 C213.75,219.79 213.73,219.73 213.73,219.73 C213.73,219.73 213.71,219.67 213.71,219.67 C213.71,219.67 213.69,219.61 213.69,219.61 C213.69,219.61 213.68,219.55 213.68,219.55 C213.68,219.55 213.66,219.49 213.66,219.49 C213.66,219.49 213.65,219.43 213.65,219.43 C213.65,219.43 213.64,219.37 213.64,219.37 C213.64,219.37 213.62,219.31 213.62,219.31 C213.62,219.31 213.61,219.24 213.61,219.24 C213.61,219.24 213.6,219.18 213.6,219.18 C213.6,219.18 213.59,219.12 213.59,219.12 C213.59,219.12 213.58,219.06 213.58,219.06 C213.58,219.06 213.57,218.99 213.57,218.99 C213.57,218.99 213.57,218.93 213.57,218.93 C213.57,218.93 213.56,218.87 213.56,218.87 C213.56,218.87 213.56,218.81 213.56,218.81 C213.56,218.81 213.56,218.74 213.56,218.74 C213.56,218.74 213.56,218.68 213.56,218.68 C213.56,218.68 213.55,218.62 213.55,218.62 C213.55,218.62 213.55,218.55 213.55,218.55 C213.55,218.55 213.55,218.49 213.55,218.49 C213.55,218.49 213.56,218.43 213.56,218.43 C213.56,218.43 213.56,218.37 213.56,218.37 C213.56,218.37 213.56,218.3 213.56,218.3 C213.56,218.3 213.56,218.24 213.56,218.24 C213.56,218.24 213.57,218.18 213.57,218.18 C213.57,218.18 213.57,218.12 213.57,218.12 C213.57,218.12 213.58,218.05 213.58,218.05 C213.58,218.05 213.59,217.99 213.59,217.99 C213.59,217.99 213.6,217.93 213.6,217.93 C213.6,217.93 213.61,217.87 213.61,217.87 C213.61,217.87 213.62,217.8 213.62,217.8 C213.62,217.8 213.63,217.74 213.63,217.74 C213.63,217.74 213.65,217.68 213.65,217.68 C213.65,217.68 213.66,217.62 213.66,217.62 C213.66,217.62 213.68,217.56 213.68,217.56 C213.68,217.56 213.69,217.5 213.69,217.5 C213.69,217.5 213.71,217.44 213.71,217.44 C213.71,217.44 213.73,217.38 213.73,217.38 C213.73,217.38 213.75,217.32 213.75,217.32 C213.75,217.32 213.77,217.26 213.77,217.26 C213.77,217.26 213.79,217.2 213.79,217.2 C213.79,217.2 213.81,217.14 213.81,217.14 C213.81,217.14 213.83,217.08 213.83,217.08 C213.83,217.08 213.85,217.02 213.85,217.02 C213.85,217.02 213.88,216.96 213.88,216.96 C213.88,216.96 213.91,216.91 213.91,216.91 C213.91,216.91 213.93,216.85 213.93,216.85 C213.93,216.85 213.96,216.79 213.96,216.79 C213.96,216.79 213.99,216.74 213.99,216.74 C213.99,216.74 214.02,216.68 214.02,216.68 C214.02,216.68 214.05,216.63 214.05,216.63 C214.05,216.63 214.08,216.57 214.08,216.57 C214.08,216.57 214.11,216.52 214.11,216.52 C214.11,216.52 214.14,216.46 214.14,216.46 C214.14,216.46 214.17,216.41 214.17,216.41 C214.17,216.41 214.21,216.36 214.21,216.36 C214.21,216.36 214.24,216.3 214.24,216.3 C214.24,216.3 214.28,216.25 214.28,216.25 C214.28,216.25 214.32,216.2 214.32,216.2 C214.32,216.2 214.35,216.15 214.35,216.15 C214.35,216.15 214.39,216.1 214.39,216.1 C214.39,216.1 214.43,216.05 214.43,216.05 C214.43,216.05 214.47,216 214.47,216 C214.47,216 214.51,215.96 214.51,215.96 C214.51,215.96 214.55,215.91 214.55,215.91 C214.55,215.91 214.59,215.86 214.59,215.86 C214.59,215.86 214.64,215.81 214.64,215.81 C214.64,215.81 214.68,215.77 214.68,215.77 C214.68,215.77 214.73,215.72 214.73,215.72 C214.73,215.72 214.77,215.68 214.77,215.68 C214.77,215.68 214.82,215.64 214.82,215.64 C214.82,215.64 214.86,215.59 214.86,215.59 C214.86,215.59 214.91,215.55 214.91,215.55 C214.91,215.55 214.96,215.51 214.96,215.51 C214.96,215.51 215,215.47 215,215.47 C215,215.47 215.05,215.43 215.05,215.43 C215.05,215.43 215.1,215.39 215.1,215.39 C215.1,215.39 215.15,215.35 215.15,215.35 C215.15,215.35 215.2,215.31 215.2,215.31 C215.2,215.31 215.25,215.28 215.25,215.28 C215.25,215.28 215.31,215.24 215.31,215.24 C215.31,215.24 215.36,215.21 215.36,215.21 C215.36,215.21 215.41,215.17 215.41,215.17 C215.41,215.17 215.46,215.14 215.46,215.14 C215.46,215.14 215.52,215.11 215.52,215.11 C215.52,215.11 215.57,215.08 215.57,215.08 C215.57,215.08 215.63,215.05 215.63,215.05 C215.63,215.05 215.68,215.02 215.68,215.02 C215.68,215.02 215.74,214.99 215.74,214.99 C215.74,214.99 215.79,214.96 215.79,214.96 C215.79,214.96 215.85,214.93 215.85,214.93 C215.85,214.93 215.91,214.9 215.91,214.9 C215.91,214.9 215.97,214.88 215.97,214.88 C215.97,214.88 216.02,214.86 216.02,214.86 C216.02,214.86 216.08,214.83 216.08,214.83 C216.08,214.83 216.14,214.81 216.14,214.81 C216.14,214.81 216.2,214.78 216.2,214.78 C216.2,214.78 216.26,214.77 216.26,214.77 C216.26,214.77 216.32,214.75 216.32,214.75 C216.32,214.75 216.38,214.73 216.38,214.73 C216.38,214.73 216.44,214.71 216.44,214.71 C216.44,214.71 216.5,214.69 216.5,214.69 C216.5,214.69 216.56,214.67 216.56,214.67 C216.56,214.67 216.62,214.66 216.62,214.66 C216.62,214.66 216.68,214.65 216.68,214.65 C216.68,214.65 216.74,214.63 216.74,214.63 C216.74,214.63 216.81,214.62 216.81,214.62 C216.81,214.62 216.87,214.61 216.87,214.61 C216.87,214.61 216.93,214.6 216.93,214.6 C216.93,214.6 216.99,214.59 216.99,214.59 C216.99,214.59 217.05,214.58 217.05,214.58 C217.05,214.58 217.12,214.57 217.12,214.57 C217.12,214.57 217.18,214.57 217.18,214.57 C217.18,214.57 217.24,214.56 217.24,214.56 C217.24,214.56 217.3,214.56 217.3,214.56 C217.3,214.56 217.37,214.56 217.37,214.56 C217.37,214.56 217.43,214.55 217.43,214.55 C217.43,214.55 217.49,214.55 217.49,214.55 C217.49,214.55 217.56,214.55 217.56,214.55 C217.56,214.55 217.62,214.55 217.62,214.55c "/></group></group><group android:name="time_group"/></vector></aapt:attr><target android:name="_R_G_L_0_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="fillAlpha" android:duration="33" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="pathData" android:duration="67" android:startOffset="0" android:valueFrom="M217.62 214.55 C217.62,214.55 217.68,214.55 217.68,214.55 C217.68,214.55 217.74,214.56 217.74,214.56 C217.74,214.56 217.81,214.56 217.81,214.56 C217.81,214.56 217.87,214.56 217.87,214.56 C217.87,214.56 217.93,214.57 217.93,214.57 C217.93,214.57 218,214.57 218,214.57 C218,214.57 218.06,214.58 218.06,214.58 C218.06,214.58 218.12,214.59 218.12,214.59 C218.12,214.59 218.18,214.6 218.18,214.6 C218.18,214.6 218.24,214.61 218.24,214.61 C218.24,214.61 218.31,214.62 218.31,214.62 C218.31,214.62 218.37,214.63 218.37,214.63 C218.37,214.63 218.43,214.65 218.43,214.65 C218.43,214.65 218.49,214.66 218.49,214.66 C218.49,214.66 218.55,214.68 218.55,214.68 C218.55,214.68 218.61,214.69 218.61,214.69 C218.61,214.69 218.67,214.71 218.67,214.71 C218.67,214.71 218.73,214.73 218.73,214.73 C218.73,214.73 218.79,214.75 218.79,214.75 C218.79,214.75 218.85,214.77 218.85,214.77 C218.85,214.77 218.91,214.79 218.91,214.79 C218.91,214.79 218.97,214.81 218.97,214.81 C218.97,214.81 219.03,214.83 219.03,214.83 C219.03,214.83 219.09,214.85 219.09,214.85 C219.09,214.85 219.15,214.88 219.15,214.88 C219.15,214.88 219.2,214.9 219.2,214.9 C219.2,214.9 219.26,214.93 219.26,214.93 C219.26,214.93 219.32,214.96 219.32,214.96 C219.32,214.96 219.37,214.98 219.37,214.98 C219.37,214.98 219.43,215.01 219.43,215.01 C219.43,215.01 219.48,215.05 219.48,215.05 C219.48,215.05 219.54,215.08 219.54,215.08 C219.54,215.08 219.59,215.11 219.59,215.11 C219.59,215.11 219.65,215.14 219.65,215.14 C219.65,215.14 219.7,215.17 219.7,215.17 C219.7,215.17 219.75,215.21 219.75,215.21 C219.75,215.21 219.81,215.24 219.81,215.24 C219.81,215.24 219.86,215.28 219.86,215.28 C219.86,215.28 219.91,215.32 219.91,215.32 C219.91,215.32 219.96,215.35 219.96,215.35 C219.96,215.35 220.01,215.39 220.01,215.39 C220.01,215.39 220.06,215.43 220.06,215.43 C220.06,215.43 220.11,215.47 220.11,215.47 C220.11,215.47 220.16,215.51 220.16,215.51 C220.16,215.51 220.2,215.55 220.2,215.55 C220.2,215.55 220.25,215.59 220.25,215.59 C220.25,215.59 220.3,215.63 220.3,215.63 C220.3,215.63 220.34,215.68 220.34,215.68 C220.34,215.68 220.39,215.72 220.39,215.72 C220.39,215.72 220.43,215.77 220.43,215.77 C220.43,215.77 220.47,215.81 220.47,215.81 C220.47,215.81 220.52,215.86 220.52,215.86 C220.52,215.86 220.56,215.9 220.56,215.9 C220.56,215.9 220.6,215.95 220.6,215.95 C220.6,215.95 220.64,216 220.64,216 C220.64,216 220.68,216.05 220.68,216.05 C220.68,216.05 220.72,216.1 220.72,216.1 C220.72,216.1 220.76,216.15 220.76,216.15 C220.76,216.15 220.8,216.2 220.8,216.2 C220.8,216.2 220.83,216.25 220.83,216.25 C220.83,216.25 220.87,216.3 220.87,216.3 C220.87,216.3 220.9,216.36 220.9,216.36 C220.9,216.36 220.94,216.41 220.94,216.41 C220.94,216.41 220.97,216.46 220.97,216.46 C220.97,216.46 221,216.51 221,216.51 C221,216.51 221.03,216.57 221.03,216.57 C221.03,216.57 221.06,216.63 221.06,216.63 C221.06,216.63 221.09,216.68 221.09,216.68 C221.09,216.68 221.12,216.74 221.12,216.74 C221.12,216.74 221.15,216.79 221.15,216.79 C221.15,216.79 221.18,216.85 221.18,216.85 C221.18,216.85 221.21,216.91 221.21,216.91 C221.21,216.91 221.23,216.96 221.23,216.96 C221.23,216.96 221.25,217.02 221.25,217.02 C221.25,217.02 221.28,217.08 221.28,217.08 C221.28,217.08 221.3,217.14 221.3,217.14 C221.3,217.14 221.33,217.2 221.33,217.2 C221.33,217.2 221.34,217.26 221.34,217.26 C221.34,217.26 221.36,217.32 221.36,217.32 C221.36,217.32 221.38,217.38 221.38,217.38 C221.38,217.38 221.4,217.44 221.4,217.44 C221.4,217.44 221.42,217.5 221.42,217.5 C221.42,217.5 221.44,217.56 221.44,217.56 C221.44,217.56 221.45,217.62 221.45,217.62 C221.45,217.62 221.46,217.68 221.46,217.68 C221.46,217.68 221.48,217.74 221.48,217.74 C221.48,217.74 221.49,217.8 221.49,217.8 C221.49,217.8 221.5,217.87 221.5,217.87 C221.5,217.87 221.51,217.93 221.51,217.93 C221.51,217.93 221.52,217.99 221.52,217.99 C221.52,217.99 221.53,218.05 221.53,218.05 C221.53,218.05 221.54,218.11 221.54,218.11 C221.54,218.11 221.54,218.18 221.54,218.18 C221.54,218.18 221.55,218.24 221.55,218.24 C221.55,218.24 221.55,218.3 221.55,218.3 C221.55,218.3 221.55,218.37 221.55,218.37 C221.55,218.37 221.56,218.43 221.56,218.43 C221.56,218.43 221.56,218.49 221.56,218.49 C221.56,218.49 221.56,218.55 221.56,218.55 C221.56,218.55 221.56,218.62 221.56,218.62 C221.56,218.62 221.56,218.68 221.56,218.68 C221.56,218.68 221.55,218.74 221.55,218.74 C221.55,218.74 221.55,218.81 221.55,218.81 C221.55,218.81 221.55,218.87 221.55,218.87 C221.55,218.87 221.54,218.93 221.54,218.93 C221.54,218.93 221.54,218.99 221.54,218.99 C221.54,218.99 221.53,219.06 221.53,219.06 C221.53,219.06 221.52,219.12 221.52,219.12 C221.52,219.12 221.51,219.18 221.51,219.18 C221.51,219.18 221.5,219.24 221.5,219.24 C221.5,219.24 221.49,219.3 221.49,219.3 C221.49,219.3 221.48,219.37 221.48,219.37 C221.48,219.37 221.46,219.43 221.46,219.43 C221.46,219.43 221.45,219.49 221.45,219.49 C221.45,219.49 221.43,219.55 221.43,219.55 C221.43,219.55 221.42,219.61 221.42,219.61 C221.42,219.61 221.4,219.67 221.4,219.67 C221.4,219.67 221.39,219.73 221.39,219.73 C221.39,219.73 221.37,219.79 221.37,219.79 C221.37,219.79 221.34,219.85 221.34,219.85 C221.34,219.85 221.32,219.91 221.32,219.91 C221.32,219.91 221.3,219.97 221.3,219.97 C221.3,219.97 221.28,220.03 221.28,220.03 C221.28,220.03 221.26,220.09 221.26,220.09 C221.26,220.09 221.23,220.14 221.23,220.14 C221.23,220.14 221.21,220.2 221.21,220.2 C221.21,220.2 221.18,220.26 221.18,220.26 C221.18,220.26 221.15,220.32 221.15,220.32 C221.15,220.32 221.13,220.37 221.13,220.37 C221.13,220.37 221.1,220.43 221.1,220.43 C221.1,220.43 221.07,220.48 221.07,220.48 C221.07,220.48 221.03,220.54 221.03,220.54 C221.03,220.54 221,220.59 221,220.59 C221,220.59 220.97,220.65 220.97,220.65 C220.97,220.65 220.94,220.7 220.94,220.7 C220.94,220.7 220.9,220.75 220.9,220.75 C220.9,220.75 220.87,220.8 220.87,220.8 C220.87,220.8 220.83,220.86 220.83,220.86 C220.83,220.86 220.8,220.91 220.8,220.91 C220.8,220.91 220.76,220.96 220.76,220.96 C220.76,220.96 220.72,221.01 220.72,221.01 C220.72,221.01 220.68,221.06 220.68,221.06 C220.68,221.06 220.64,221.11 220.64,221.11 C220.64,221.11 220.6,221.15 220.6,221.15 C220.6,221.15 220.56,221.2 220.56,221.2 C220.56,221.2 220.52,221.25 220.52,221.25 C220.52,221.25 220.48,221.3 220.48,221.3 C220.48,221.3 220.43,221.34 220.43,221.34 C220.43,221.34 220.39,221.38 220.39,221.38 C220.39,221.38 220.34,221.43 220.34,221.43 C220.34,221.43 220.3,221.47 220.3,221.47 C220.3,221.47 220.25,221.52 220.25,221.52 C220.25,221.52 220.21,221.56 220.21,221.56 C220.21,221.56 220.16,221.6 220.16,221.6 C220.16,221.6 220.11,221.64 220.11,221.64 C220.11,221.64 220.06,221.68 220.06,221.68 C220.06,221.68 220.01,221.72 220.01,221.72 C220.01,221.72 219.96,221.76 219.96,221.76 C219.96,221.76 219.91,221.8 219.91,221.8 C219.91,221.8 219.86,221.83 219.86,221.83 C219.86,221.83 219.81,221.87 219.81,221.87 C219.81,221.87 219.75,221.9 219.75,221.9 C219.75,221.9 219.7,221.93 219.7,221.93 C219.7,221.93 219.65,221.97 219.65,221.97 C219.65,221.97 219.6,222 219.6,222 C219.6,222 219.54,222.03 219.54,222.03 C219.54,222.03 219.49,222.06 219.49,222.06 C219.49,222.06 219.43,222.09 219.43,222.09 C219.43,222.09 219.37,222.12 219.37,222.12 C219.37,222.12 219.32,222.15 219.32,222.15 C219.32,222.15 219.26,222.18 219.26,222.18 C219.26,222.18 219.21,222.2 219.21,222.2 C219.21,222.2 219.15,222.23 219.15,222.23 C219.15,222.23 219.09,222.25 219.09,222.25 C219.09,222.25 219.03,222.28 219.03,222.28 C219.03,222.28 218.97,222.3 218.97,222.3 C218.97,222.3 218.91,222.32 218.91,222.32 C218.91,222.32 218.85,222.34 218.85,222.34 C218.85,222.34 218.79,222.36 218.79,222.36 C218.79,222.36 218.73,222.38 218.73,222.38 C218.73,222.38 218.67,222.4 218.67,222.4 C218.67,222.4 218.61,222.42 218.61,222.42 C218.61,222.42 218.55,222.44 218.55,222.44 C218.55,222.44 218.49,222.45 218.49,222.45 C218.49,222.45 218.43,222.46 218.43,222.46 C218.43,222.46 218.37,222.47 218.37,222.47 C218.37,222.47 218.31,222.49 218.31,222.49 C218.31,222.49 218.25,222.5 218.25,222.5 C218.25,222.5 218.18,222.51 218.18,222.51 C218.18,222.51 218.12,222.52 218.12,222.52 C218.12,222.52 218.06,222.53 218.06,222.53 C218.06,222.53 218,222.54 218,222.54 C218,222.54 217.93,222.54 217.93,222.54 C217.93,222.54 217.87,222.55 217.87,222.55 C217.87,222.55 217.81,222.55 217.81,222.55 C217.81,222.55 217.75,222.55 217.75,222.55 C217.75,222.55 217.68,222.56 217.68,222.56 C217.68,222.56 217.62,222.56 217.62,222.56 C217.62,222.56 217.56,222.56 217.56,222.56 C217.56,222.56 217.49,222.56 217.49,222.56 C217.49,222.56 217.43,222.56 217.43,222.56 C217.43,222.56 217.37,222.55 217.37,222.55 C217.37,222.55 217.3,222.55 217.3,222.55 C217.3,222.55 217.24,222.55 217.24,222.55 C217.24,222.55 217.18,222.54 217.18,222.54 C217.18,222.54 217.12,222.54 217.12,222.54 C217.12,222.54 217.05,222.53 217.05,222.53 C217.05,222.53 216.99,222.52 216.99,222.52 C216.99,222.52 216.93,222.51 216.93,222.51 C216.93,222.51 216.87,222.5 216.87,222.5 C216.87,222.5 216.81,222.49 216.81,222.49 C216.81,222.49 216.74,222.48 216.74,222.48 C216.74,222.48 216.68,222.46 216.68,222.46 C216.68,222.46 216.62,222.45 216.62,222.45 C216.62,222.45 216.56,222.43 216.56,222.43 C216.56,222.43 216.5,222.42 216.5,222.42 C216.5,222.42 216.44,222.4 216.44,222.4 C216.44,222.4 216.38,222.38 216.38,222.38 C216.38,222.38 216.32,222.36 216.32,222.36 C216.32,222.36 216.26,222.34 216.26,222.34 C216.26,222.34 216.2,222.32 216.2,222.32 C216.2,222.32 216.14,222.3 216.14,222.3 C216.14,222.3 216.08,222.28 216.08,222.28 C216.08,222.28 216.02,222.26 216.02,222.26 C216.02,222.26 215.97,222.23 215.97,222.23 C215.97,222.23 215.91,222.2 215.91,222.2 C215.91,222.2 215.85,222.18 215.85,222.18 C215.85,222.18 215.79,222.15 215.79,222.15 C215.79,222.15 215.74,222.12 215.74,222.12 C215.74,222.12 215.68,222.1 215.68,222.1 C215.68,222.1 215.63,222.06 215.63,222.06 C215.63,222.06 215.57,222.03 215.57,222.03 C215.57,222.03 215.52,222 215.52,222 C215.52,222 215.46,221.97 215.46,221.97 C215.46,221.97 215.41,221.94 215.41,221.94 C215.41,221.94 215.36,221.9 215.36,221.9 C215.36,221.9 215.31,221.87 215.31,221.87 C215.31,221.87 215.25,221.83 215.25,221.83 C215.25,221.83 215.2,221.79 215.2,221.79 C215.2,221.79 215.15,221.76 215.15,221.76 C215.15,221.76 215.1,221.72 215.1,221.72 C215.1,221.72 215.05,221.68 215.05,221.68 C215.05,221.68 215,221.64 215,221.64 C215,221.64 214.96,221.6 214.96,221.6 C214.96,221.6 214.91,221.56 214.91,221.56 C214.91,221.56 214.86,221.52 214.86,221.52 C214.86,221.52 214.81,221.48 214.81,221.48 C214.81,221.48 214.77,221.43 214.77,221.43 C214.77,221.43 214.73,221.39 214.73,221.39 C214.73,221.39 214.68,221.34 214.68,221.34 C214.68,221.34 214.64,221.3 214.64,221.3 C214.64,221.3 214.59,221.25 214.59,221.25 C214.59,221.25 214.55,221.2 214.55,221.2 C214.55,221.2 214.51,221.15 214.51,221.15 C214.51,221.15 214.47,221.11 214.47,221.11 C214.47,221.11 214.43,221.06 214.43,221.06 C214.43,221.06 214.39,221.01 214.39,221.01 C214.39,221.01 214.35,220.96 214.35,220.96 C214.35,220.96 214.31,220.91 214.31,220.91 C214.31,220.91 214.28,220.86 214.28,220.86 C214.28,220.86 214.25,220.81 214.25,220.81 C214.25,220.81 214.21,220.75 214.21,220.75 C214.21,220.75 214.18,220.7 214.18,220.7 C214.18,220.7 214.14,220.65 214.14,220.65 C214.14,220.65 214.11,220.59 214.11,220.59 C214.11,220.59 214.08,220.54 214.08,220.54 C214.08,220.54 214.05,220.48 214.05,220.48 C214.05,220.48 214.02,220.43 214.02,220.43 C214.02,220.43 213.99,220.37 213.99,220.37 C213.99,220.37 213.96,220.32 213.96,220.32 C213.96,220.32 213.93,220.26 213.93,220.26 C213.93,220.26 213.91,220.2 213.91,220.2 C213.91,220.2 213.88,220.14 213.88,220.14 C213.88,220.14 213.86,220.09 213.86,220.09 C213.86,220.09 213.83,220.03 213.83,220.03 C213.83,220.03 213.81,219.97 213.81,219.97 C213.81,219.97 213.79,219.91 213.79,219.91 C213.79,219.91 213.77,219.85 213.77,219.85 C213.77,219.85 213.75,219.79 213.75,219.79 C213.75,219.79 213.73,219.73 213.73,219.73 C213.73,219.73 213.71,219.67 213.71,219.67 C213.71,219.67 213.69,219.61 213.69,219.61 C213.69,219.61 213.68,219.55 213.68,219.55 C213.68,219.55 213.66,219.49 213.66,219.49 C213.66,219.49 213.65,219.43 213.65,219.43 C213.65,219.43 213.64,219.37 213.64,219.37 C213.64,219.37 213.62,219.31 213.62,219.31 C213.62,219.31 213.61,219.24 213.61,219.24 C213.61,219.24 213.6,219.18 213.6,219.18 C213.6,219.18 213.59,219.12 213.59,219.12 C213.59,219.12 213.58,219.06 213.58,219.06 C213.58,219.06 213.57,218.99 213.57,218.99 C213.57,218.99 213.57,218.93 213.57,218.93 C213.57,218.93 213.56,218.87 213.56,218.87 C213.56,218.87 213.56,218.81 213.56,218.81 C213.56,218.81 213.56,218.74 213.56,218.74 C213.56,218.74 213.56,218.68 213.56,218.68 C213.56,218.68 213.55,218.62 213.55,218.62 C213.55,218.62 213.55,218.55 213.55,218.55 C213.55,218.55 213.55,218.49 213.55,218.49 C213.55,218.49 213.56,218.43 213.56,218.43 C213.56,218.43 213.56,218.37 213.56,218.37 C213.56,218.37 213.56,218.3 213.56,218.3 C213.56,218.3 213.56,218.24 213.56,218.24 C213.56,218.24 213.57,218.18 213.57,218.18 C213.57,218.18 213.57,218.12 213.57,218.12 C213.57,218.12 213.58,218.05 213.58,218.05 C213.58,218.05 213.59,217.99 213.59,217.99 C213.59,217.99 213.6,217.93 213.6,217.93 C213.6,217.93 213.61,217.87 213.61,217.87 C213.61,217.87 213.62,217.8 213.62,217.8 C213.62,217.8 213.63,217.74 213.63,217.74 C213.63,217.74 213.65,217.68 213.65,217.68 C213.65,217.68 213.66,217.62 213.66,217.62 C213.66,217.62 213.68,217.56 213.68,217.56 C213.68,217.56 213.69,217.5 213.69,217.5 C213.69,217.5 213.71,217.44 213.71,217.44 C213.71,217.44 213.73,217.38 213.73,217.38 C213.73,217.38 213.75,217.32 213.75,217.32 C213.75,217.32 213.77,217.26 213.77,217.26 C213.77,217.26 213.79,217.2 213.79,217.2 C213.79,217.2 213.81,217.14 213.81,217.14 C213.81,217.14 213.83,217.08 213.83,217.08 C213.83,217.08 213.85,217.02 213.85,217.02 C213.85,217.02 213.88,216.96 213.88,216.96 C213.88,216.96 213.91,216.91 213.91,216.91 C213.91,216.91 213.93,216.85 213.93,216.85 C213.93,216.85 213.96,216.79 213.96,216.79 C213.96,216.79 213.99,216.74 213.99,216.74 C213.99,216.74 214.02,216.68 214.02,216.68 C214.02,216.68 214.05,216.63 214.05,216.63 C214.05,216.63 214.08,216.57 214.08,216.57 C214.08,216.57 214.11,216.52 214.11,216.52 C214.11,216.52 214.14,216.46 214.14,216.46 C214.14,216.46 214.17,216.41 214.17,216.41 C214.17,216.41 214.21,216.36 214.21,216.36 C214.21,216.36 214.24,216.3 214.24,216.3 C214.24,216.3 214.28,216.25 214.28,216.25 C214.28,216.25 214.32,216.2 214.32,216.2 C214.32,216.2 214.35,216.15 214.35,216.15 C214.35,216.15 214.39,216.1 214.39,216.1 C214.39,216.1 214.43,216.05 214.43,216.05 C214.43,216.05 214.47,216 214.47,216 C214.47,216 214.51,215.96 214.51,215.96 C214.51,215.96 214.55,215.91 214.55,215.91 C214.55,215.91 214.59,215.86 214.59,215.86 C214.59,215.86 214.64,215.81 214.64,215.81 C214.64,215.81 214.68,215.77 214.68,215.77 C214.68,215.77 214.73,215.72 214.73,215.72 C214.73,215.72 214.77,215.68 214.77,215.68 C214.77,215.68 214.82,215.64 214.82,215.64 C214.82,215.64 214.86,215.59 214.86,215.59 C214.86,215.59 214.91,215.55 214.91,215.55 C214.91,215.55 214.96,215.51 214.96,215.51 C214.96,215.51 215,215.47 215,215.47 C215,215.47 215.05,215.43 215.05,215.43 C215.05,215.43 215.1,215.39 215.1,215.39 C215.1,215.39 215.15,215.35 215.15,215.35 C215.15,215.35 215.2,215.31 215.2,215.31 C215.2,215.31 215.25,215.28 215.25,215.28 C215.25,215.28 215.31,215.24 215.31,215.24 C215.31,215.24 215.36,215.21 215.36,215.21 C215.36,215.21 215.41,215.17 215.41,215.17 C215.41,215.17 215.46,215.14 215.46,215.14 C215.46,215.14 215.52,215.11 215.52,215.11 C215.52,215.11 215.57,215.08 215.57,215.08 C215.57,215.08 215.63,215.05 215.63,215.05 C215.63,215.05 215.68,215.02 215.68,215.02 C215.68,215.02 215.74,214.99 215.74,214.99 C215.74,214.99 215.79,214.96 215.79,214.96 C215.79,214.96 215.85,214.93 215.85,214.93 C215.85,214.93 215.91,214.9 215.91,214.9 C215.91,214.9 215.97,214.88 215.97,214.88 C215.97,214.88 216.02,214.86 216.02,214.86 C216.02,214.86 216.08,214.83 216.08,214.83 C216.08,214.83 216.14,214.81 216.14,214.81 C216.14,214.81 216.2,214.78 216.2,214.78 C216.2,214.78 216.26,214.77 216.26,214.77 C216.26,214.77 216.32,214.75 216.32,214.75 C216.32,214.75 216.38,214.73 216.38,214.73 C216.38,214.73 216.44,214.71 216.44,214.71 C216.44,214.71 216.5,214.69 216.5,214.69 C216.5,214.69 216.56,214.67 216.56,214.67 C216.56,214.67 216.62,214.66 216.62,214.66 C216.62,214.66 216.68,214.65 216.68,214.65 C216.68,214.65 216.74,214.63 216.74,214.63 C216.74,214.63 216.81,214.62 216.81,214.62 C216.81,214.62 216.87,214.61 216.87,214.61 C216.87,214.61 216.93,214.6 216.93,214.6 C216.93,214.6 216.99,214.59 216.99,214.59 C216.99,214.59 217.05,214.58 217.05,214.58 C217.05,214.58 217.12,214.57 217.12,214.57 C217.12,214.57 217.18,214.57 217.18,214.57 C217.18,214.57 217.24,214.56 217.24,214.56 C217.24,214.56 217.3,214.56 217.3,214.56 C217.3,214.56 217.37,214.56 217.37,214.56 C217.37,214.56 217.43,214.55 217.43,214.55 C217.43,214.55 217.49,214.55 217.49,214.55 C217.49,214.55 217.56,214.55 217.56,214.55 C217.56,214.55 217.62,214.55 217.62,214.55c " android:valueTo="M217.52 203.54 C217.52,203.54 217.83,203.53 217.83,203.53 C217.83,203.53 218.14,203.52 218.14,203.52 C218.14,203.52 218.44,203.49 218.44,203.49 C218.44,203.49 218.75,203.45 218.75,203.45 C218.75,203.45 219.05,203.41 219.05,203.41 C219.05,203.41 219.36,203.35 219.36,203.35 C219.36,203.35 219.66,203.28 219.66,203.28 C219.66,203.28 219.96,203.21 219.96,203.21 C219.96,203.21 220.25,203.11 220.25,203.11 C220.25,203.11 220.54,203.02 220.54,203.02 C220.54,203.02 220.83,202.9 220.83,202.9 C220.83,202.9 221.11,202.79 221.11,202.79 C221.11,202.79 221.4,202.66 221.4,202.66 C221.4,202.66 221.68,202.54 221.68,202.54 C221.68,202.54 221.96,202.42 221.96,202.42 C221.96,202.42 222.25,202.3 222.25,202.3 C222.25,202.3 222.53,202.19 222.53,202.19 C222.53,202.19 222.82,202.08 222.82,202.08 C222.82,202.08 223.11,201.97 223.11,201.97 C223.11,201.97 223.41,201.89 223.41,201.89 C223.41,201.89 223.71,201.81 223.71,201.81 C223.71,201.81 224,201.73 224,201.73 C224,201.73 224.31,201.68 224.31,201.68 C224.31,201.68 224.61,201.63 224.61,201.63 C224.61,201.63 224.92,201.59 224.92,201.59 C224.92,201.59 225.23,201.57 225.23,201.57 C225.23,201.57 225.53,201.55 225.53,201.55 C225.53,201.55 225.84,201.55 225.84,201.55 C225.84,201.55 226.15,201.56 226.15,201.56 C226.15,201.56 226.46,201.57 226.46,201.57 C226.46,201.57 226.76,201.6 226.76,201.6 C226.76,201.6 227.07,201.65 227.07,201.65 C227.07,201.65 227.37,201.69 227.37,201.69 C227.37,201.69 227.67,201.76 227.67,201.76 C227.67,201.76 227.97,201.84 227.97,201.84 C227.97,201.84 228.27,201.92 228.27,201.92 C228.27,201.92 228.56,202.02 228.56,202.02 C228.56,202.02 228.85,202.12 228.85,202.12 C228.85,202.12 229.14,202.24 229.14,202.24 C229.14,202.24 229.42,202.37 229.42,202.37 C229.42,202.37 229.7,202.5 229.7,202.5 C229.7,202.5 229.97,202.65 229.97,202.65 C229.97,202.65 230.23,202.8 230.23,202.8 C230.23,202.8 230.5,202.96 230.5,202.96 C230.5,202.96 230.75,203.14 230.75,203.14 C230.75,203.14 231,203.32 231,203.32 C231,203.32 231.24,203.51 231.24,203.51 C231.24,203.51 231.48,203.71 231.48,203.71 C231.48,203.71 231.71,203.91 231.71,203.91 C231.71,203.91 231.93,204.13 231.93,204.13 C231.93,204.13 232.15,204.35 232.15,204.35 C232.15,204.35 232.35,204.58 232.35,204.58 C232.35,204.58 232.55,204.81 232.55,204.81 C232.55,204.81 232.75,205.05 232.75,205.05 C232.75,205.05 232.92,205.3 232.92,205.3 C232.92,205.3 233.1,205.56 233.1,205.56 C233.1,205.56 233.27,205.81 233.27,205.81 C233.27,205.81 233.42,206.08 233.42,206.08 C233.42,206.08 233.57,206.35 233.57,206.35 C233.57,206.35 233.7,206.63 233.7,206.63 C233.7,206.63 233.83,206.91 233.83,206.91 C233.83,206.91 233.95,207.19 233.95,207.19 C233.95,207.19 234.05,207.48 234.05,207.48 C234.05,207.48 234.16,207.77 234.16,207.77 C234.16,207.77 234.24,208.07 234.24,208.07 C234.24,208.07 234.31,208.37 234.31,208.37 C234.31,208.37 234.39,208.67 234.39,208.67 C234.39,208.67 234.43,208.97 234.43,208.97 C234.43,208.97 234.48,209.28 234.48,209.28 C234.48,209.28 234.52,209.58 234.52,209.58 C234.52,209.58 234.53,209.89 234.53,209.89 C234.53,209.89 234.54,210.2 234.54,210.2 C234.54,210.2 234.54,210.51 234.54,210.51 C234.54,210.51 234.52,210.82 234.52,210.82 C234.52,210.82 234.5,211.12 234.5,211.12 C234.5,211.12 234.46,211.43 234.46,211.43 C234.46,211.43 234.42,211.73 234.42,211.73 C234.42,211.73 234.37,212.04 234.37,212.04 C234.37,212.04 234.29,212.34 234.29,212.34 C234.29,212.34 234.21,212.64 234.21,212.64 C234.21,212.64 234.13,212.93 234.13,212.93 C234.13,212.93 234.03,213.22 234.03,213.22 C234.03,213.22 233.92,213.51 233.92,213.51 C233.92,213.51 233.81,213.8 233.81,213.8 C233.81,213.8 233.69,214.08 233.69,214.08 C233.69,214.08 233.57,214.37 233.57,214.37 C233.57,214.37 233.44,214.65 233.44,214.65 C233.44,214.65 233.32,214.93 233.32,214.93 C233.32,214.93 233.21,215.22 233.21,215.22 C233.21,215.22 233.1,215.51 233.1,215.51 C233.1,215.51 232.99,215.79 232.99,215.79 C232.99,215.79 232.9,216.09 232.9,216.09 C232.9,216.09 232.82,216.39 232.82,216.39 C232.82,216.39 232.74,216.69 232.74,216.69 C232.74,216.69 232.69,216.99 232.69,216.99 C232.69,216.99 232.64,217.29 232.64,217.29 C232.64,217.29 232.6,217.6 232.6,217.6 C232.6,217.6 232.58,217.91 232.58,217.91 C232.58,217.91 232.56,218.21 232.56,218.21 C232.56,218.21 232.55,218.52 232.55,218.52 C232.55,218.52 232.56,218.83 232.56,218.83 C232.56,218.83 232.57,219.14 232.57,219.14 C232.57,219.14 232.6,219.45 232.6,219.45 C232.6,219.45 232.64,219.75 232.64,219.75 C232.64,219.75 232.68,220.06 232.68,220.06 C232.68,220.06 232.74,220.36 232.74,220.36 C232.74,220.36 232.81,220.66 232.81,220.66 C232.81,220.66 232.88,220.96 232.88,220.96 C232.88,220.96 232.98,221.25 232.98,221.25 C232.98,221.25 233.07,221.54 233.07,221.54 C233.07,221.54 233.19,221.83 233.19,221.83 C233.19,221.83 233.3,222.12 233.3,222.12 C233.3,222.12 233.42,222.4 233.42,222.4 C233.42,222.4 233.55,222.68 233.55,222.68 C233.55,222.68 233.67,222.96 233.67,222.96 C233.67,222.96 233.79,223.25 233.79,223.25 C233.79,223.25 233.9,223.54 233.9,223.54 C233.9,223.54 234.01,223.82 234.01,223.82 C234.01,223.82 234.12,224.11 234.12,224.11 C234.12,224.11 234.2,224.41 234.2,224.41 C234.2,224.41 234.28,224.71 234.28,224.71 C234.28,224.71 234.36,225.01 234.36,225.01 C234.36,225.01 234.41,225.31 234.41,225.31 C234.41,225.31 234.46,225.62 234.46,225.62 C234.46,225.62 234.5,225.92 234.5,225.92 C234.5,225.92 234.52,226.23 234.52,226.23 C234.52,226.23 234.54,226.54 234.54,226.54 C234.54,226.54 234.54,226.84 234.54,226.84 C234.54,226.84 234.53,227.15 234.53,227.15 C234.53,227.15 234.52,227.46 234.52,227.46 C234.52,227.46 234.48,227.77 234.48,227.77 C234.48,227.77 234.44,228.07 234.44,228.07 C234.44,228.07 234.4,228.38 234.4,228.38 C234.4,228.38 234.33,228.68 234.33,228.68 C234.33,228.68 234.25,228.98 234.25,228.98 C234.25,228.98 234.17,229.27 234.17,229.27 C234.17,229.27 234.07,229.56 234.07,229.56 C234.07,229.56 233.97,229.86 233.97,229.86 C233.97,229.86 233.85,230.14 233.85,230.14 C233.85,230.14 233.72,230.42 233.72,230.42 C233.72,230.42 233.59,230.7 233.59,230.7 C233.59,230.7 233.44,230.97 233.44,230.97 C233.44,230.97 233.29,231.24 233.29,231.24 C233.29,231.24 233.13,231.5 233.13,231.5 C233.13,231.5 232.95,231.75 232.95,231.75 C232.95,231.75 232.77,232 232.77,232 C232.77,232 232.58,232.24 232.58,232.24 C232.58,232.24 232.38,232.48 232.38,232.48 C232.38,232.48 232.18,232.71 232.18,232.71 C232.18,232.71 231.96,232.93 231.96,232.93 C231.96,232.93 231.74,233.15 231.74,233.15 C231.74,233.15 231.51,233.35 231.51,233.35 C231.51,233.35 231.28,233.55 231.28,233.55 C231.28,233.55 231.04,233.75 231.04,233.75 C231.04,233.75 230.79,233.92 230.79,233.92 C230.79,233.92 230.53,234.1 230.53,234.1 C230.53,234.1 230.28,234.27 230.28,234.27 C230.28,234.27 230.01,234.42 230.01,234.42 C230.01,234.42 229.74,234.57 229.74,234.57 C229.74,234.57 229.46,234.71 229.46,234.71 C229.46,234.71 229.18,234.83 229.18,234.83 C229.18,234.83 228.9,234.96 228.9,234.96 C228.9,234.96 228.61,235.06 228.61,235.06 C228.61,235.06 228.32,235.16 228.32,235.16 C228.32,235.16 228.02,235.24 228.02,235.24 C228.02,235.24 227.72,235.32 227.72,235.32 C227.72,235.32 227.42,235.39 227.42,235.39 C227.42,235.39 227.12,235.44 227.12,235.44 C227.12,235.44 226.81,235.48 226.81,235.48 C226.81,235.48 226.51,235.52 226.51,235.52 C226.51,235.52 226.2,235.53 226.2,235.53 C226.2,235.53 225.89,235.54 225.89,235.54 C225.89,235.54 225.58,235.54 225.58,235.54 C225.58,235.54 225.27,235.52 225.27,235.52 C225.27,235.52 224.97,235.51 224.97,235.51 C224.97,235.51 224.66,235.47 224.66,235.47 C224.66,235.47 224.36,235.42 224.36,235.42 C224.36,235.42 224.05,235.37 224.05,235.37 C224.05,235.37 223.75,235.3 223.75,235.3 C223.75,235.3 223.45,235.22 223.45,235.22 C223.45,235.22 223.16,235.14 223.16,235.14 C223.16,235.14 222.87,235.03 222.87,235.03 C222.87,235.03 222.58,234.92 222.58,234.92 C222.58,234.92 222.29,234.81 222.29,234.81 C222.29,234.81 222.01,234.69 222.01,234.69 C222.01,234.69 221.72,234.57 221.72,234.57 C221.72,234.57 221.44,234.45 221.44,234.45 C221.44,234.45 221.16,234.32 221.16,234.32 C221.16,234.32 220.87,234.21 220.87,234.21 C220.87,234.21 220.58,234.1 220.58,234.1 C220.58,234.1 220.29,233.99 220.29,233.99 C220.29,233.99 220,233.91 220,233.91 C220,233.91 219.7,233.83 219.7,233.83 C219.7,233.83 219.4,233.75 219.4,233.75 C219.4,233.75 219.1,233.7 219.1,233.7 C219.1,233.7 218.8,233.65 218.8,233.65 C218.8,233.65 218.49,233.6 218.49,233.6 C218.49,233.6 218.18,233.58 218.18,233.58 C218.18,233.58 217.88,233.56 217.88,233.56 C217.88,233.56 217.57,233.55 217.57,233.55 C217.57,233.55 217.26,233.56 217.26,233.56 C217.26,233.56 216.95,233.57 216.95,233.57 C216.95,233.57 216.64,233.6 216.64,233.6 C216.64,233.6 216.34,233.64 216.34,233.64 C216.34,233.64 216.03,233.68 216.03,233.68 C216.03,233.68 215.73,233.74 215.73,233.74 C215.73,233.74 215.43,233.81 215.43,233.81 C215.43,233.81 215.13,233.88 215.13,233.88 C215.13,233.88 214.84,233.98 214.84,233.98 C214.84,233.98 214.55,234.08 214.55,234.08 C214.55,234.08 214.26,234.19 214.26,234.19 C214.26,234.19 213.97,234.3 213.97,234.3 C213.97,234.3 213.69,234.43 213.69,234.43 C213.69,234.43 213.41,234.55 213.41,234.55 C213.41,234.55 213.12,234.67 213.12,234.67 C213.12,234.67 212.84,234.8 212.84,234.8 C212.84,234.8 212.55,234.9 212.55,234.9 C212.55,234.9 212.26,235.01 212.26,235.01 C212.26,235.01 211.98,235.12 211.98,235.12 C211.98,235.12 211.68,235.2 211.68,235.2 C211.68,235.2 211.38,235.28 211.38,235.28 C211.38,235.28 211.08,235.36 211.08,235.36 C211.08,235.36 210.78,235.41 210.78,235.41 C210.78,235.41 210.47,235.46 210.47,235.46 C210.47,235.46 210.17,235.5 210.17,235.5 C210.17,235.5 209.86,235.52 209.86,235.52 C209.86,235.52 209.55,235.54 209.55,235.54 C209.55,235.54 209.25,235.55 209.25,235.55 C209.25,235.55 208.94,235.53 208.94,235.53 C208.94,235.53 208.63,235.52 208.63,235.52 C208.63,235.52 208.32,235.49 208.32,235.49 C208.32,235.49 208.02,235.44 208.02,235.44 C208.02,235.44 207.71,235.4 207.71,235.4 C207.71,235.4 207.41,235.33 207.41,235.33 C207.41,235.33 207.11,235.26 207.11,235.26 C207.11,235.26 206.82,235.17 206.82,235.17 C206.82,235.17 206.53,235.07 206.53,235.07 C206.53,235.07 206.23,234.97 206.23,234.97 C206.23,234.97 205.95,234.85 205.95,234.85 C205.95,234.85 205.67,234.73 205.67,234.73 C205.67,234.73 205.39,234.6 205.39,234.6 C205.39,234.6 205.12,234.44 205.12,234.44 C205.12,234.44 204.85,234.29 204.85,234.29 C204.85,234.29 204.59,234.13 204.59,234.13 C204.59,234.13 204.34,233.95 204.34,233.95 C204.34,233.95 204.09,233.78 204.09,233.78 C204.09,233.78 203.85,233.58 203.85,233.58 C203.85,233.58 203.61,233.39 203.61,233.39 C203.61,233.39 203.38,233.18 203.38,233.18 C203.38,233.18 203.16,232.96 203.16,232.96 C203.16,232.96 202.94,232.75 202.94,232.75 C202.94,232.75 202.74,232.52 202.74,232.52 C202.74,232.52 202.54,232.28 202.54,232.28 C202.54,232.28 202.34,232.04 202.34,232.04 C202.34,232.04 202.16,231.79 202.16,231.79 C202.16,231.79 201.99,231.54 201.99,231.54 C201.99,231.54 201.82,231.28 201.82,231.28 C201.82,231.28 201.67,231.01 201.67,231.01 C201.67,231.01 201.52,230.74 201.52,230.74 C201.52,230.74 201.38,230.46 201.38,230.46 C201.38,230.46 201.26,230.19 201.26,230.19 C201.26,230.19 201.13,229.9 201.13,229.9 C201.13,229.9 201.03,229.61 201.03,229.61 C201.03,229.61 200.93,229.32 200.93,229.32 C200.93,229.32 200.84,229.02 200.84,229.02 C200.84,229.02 200.77,228.72 200.77,228.72 C200.77,228.72 200.7,228.43 200.7,228.43 C200.7,228.43 200.65,228.12 200.65,228.12 C200.65,228.12 200.61,227.82 200.61,227.82 C200.61,227.82 200.57,227.51 200.57,227.51 C200.57,227.51 200.56,227.2 200.56,227.2 C200.56,227.2 200.54,226.89 200.54,226.89 C200.54,226.89 200.55,226.58 200.55,226.58 C200.55,226.58 200.56,226.28 200.56,226.28 C200.56,226.28 200.58,225.97 200.58,225.97 C200.58,225.97 200.62,225.66 200.62,225.66 C200.62,225.66 200.67,225.36 200.67,225.36 C200.67,225.36 200.72,225.06 200.72,225.06 C200.72,225.06 200.79,224.76 200.79,224.76 C200.79,224.76 200.87,224.46 200.87,224.46 C200.87,224.46 200.95,224.16 200.95,224.16 C200.95,224.16 201.06,223.87 201.06,223.87 C201.06,223.87 201.17,223.58 201.17,223.58 C201.17,223.58 201.27,223.29 201.27,223.29 C201.27,223.29 201.4,223.01 201.4,223.01 C201.4,223.01 201.52,222.73 201.52,222.73 C201.52,222.73 201.64,222.45 201.64,222.45 C201.64,222.45 201.76,222.16 201.76,222.16 C201.76,222.16 201.88,221.88 201.88,221.88 C201.88,221.88 201.99,221.59 201.99,221.59 C201.99,221.59 202.1,221.3 202.1,221.3 C202.1,221.3 202.18,221 202.18,221 C202.18,221 202.26,220.71 202.26,220.71 C202.26,220.71 202.34,220.41 202.34,220.41 C202.34,220.41 202.39,220.1 202.39,220.1 C202.39,220.1 202.44,219.8 202.44,219.8 C202.44,219.8 202.49,219.5 202.49,219.5 C202.49,219.5 202.51,219.19 202.51,219.19 C202.51,219.19 202.53,218.88 202.53,218.88 C202.53,218.88 202.54,218.57 202.54,218.57 C202.54,218.57 202.53,218.26 202.53,218.26 C202.53,218.26 202.52,217.96 202.52,217.96 C202.52,217.96 202.49,217.65 202.49,217.65 C202.49,217.65 202.45,217.34 202.45,217.34 C202.45,217.34 202.41,217.04 202.41,217.04 C202.41,217.04 202.34,216.74 202.34,216.74 C202.34,216.74 202.27,216.44 202.27,216.44 C202.27,216.44 202.2,216.14 202.2,216.14 C202.2,216.14 202.11,215.84 202.11,215.84 C202.11,215.84 202.01,215.55 202.01,215.55 C202.01,215.55 201.9,215.26 201.9,215.26 C201.9,215.26 201.78,214.98 201.78,214.98 C201.78,214.98 201.66,214.69 201.66,214.69 C201.66,214.69 201.54,214.41 201.54,214.41 C201.54,214.41 201.42,214.13 201.42,214.13 C201.42,214.13 201.29,213.84 201.29,213.84 C201.29,213.84 201.18,213.55 201.18,213.55 C201.18,213.55 201.07,213.26 201.07,213.26 C201.07,213.26 200.96,212.98 200.96,212.98 C200.96,212.98 200.88,212.68 200.88,212.68 C200.88,212.68 200.8,212.38 200.8,212.38 C200.8,212.38 200.73,212.08 200.73,212.08 C200.73,212.08 200.68,211.78 200.68,211.78 C200.68,211.78 200.63,211.47 200.63,211.47 C200.63,211.47 200.58,211.17 200.58,211.17 C200.58,211.17 200.57,210.86 200.57,210.86 C200.57,210.86 200.55,210.55 200.55,210.55 C200.55,210.55 200.54,210.25 200.54,210.25 C200.54,210.25 200.56,209.94 200.56,209.94 C200.56,209.94 200.57,209.63 200.57,209.63 C200.57,209.63 200.6,209.32 200.6,209.32 C200.6,209.32 200.65,209.02 200.65,209.02 C200.65,209.02 200.69,208.71 200.69,208.71 C200.69,208.71 200.76,208.41 200.76,208.41 C200.76,208.41 200.83,208.11 200.83,208.11 C200.83,208.11 200.92,207.82 200.92,207.82 C200.92,207.82 201.02,207.52 201.02,207.52 C201.02,207.52 201.12,207.23 201.12,207.23 C201.12,207.23 201.24,206.95 201.24,206.95 C201.24,206.95 201.36,206.67 201.36,206.67 C201.36,206.67 201.49,206.39 201.49,206.39 C201.49,206.39 201.65,206.12 201.65,206.12 C201.65,206.12 201.8,205.85 201.8,205.85 C201.8,205.85 201.96,205.59 201.96,205.59 C201.96,205.59 202.14,205.34 202.14,205.34 C202.14,205.34 202.31,205.09 202.31,205.09 C202.31,205.09 202.51,204.85 202.51,204.85 C202.51,204.85 202.71,204.61 202.71,204.61 C202.71,204.61 202.91,204.38 202.91,204.38 C202.91,204.38 203.13,204.16 203.13,204.16 C203.13,204.16 203.34,203.94 203.34,203.94 C203.34,203.94 203.57,203.74 203.57,203.74 C203.57,203.74 203.81,203.54 203.81,203.54 C203.81,203.54 204.05,203.34 204.05,203.34 C204.05,203.34 204.3,203.17 204.3,203.17 C204.3,203.17 204.55,202.99 204.55,202.99 C204.55,202.99 204.81,202.82 204.81,202.82 C204.81,202.82 205.08,202.67 205.08,202.67 C205.08,202.67 205.35,202.52 205.35,202.52 C205.35,202.52 205.63,202.38 205.63,202.38 C205.63,202.38 205.91,202.26 205.91,202.26 C205.91,202.26 206.19,202.13 206.19,202.13 C206.19,202.13 206.48,202.03 206.48,202.03 C206.48,202.03 206.77,201.93 206.77,201.93 C206.77,201.93 207.07,201.85 207.07,201.85 C207.07,201.85 207.37,201.77 207.37,201.77 C207.37,201.77 207.67,201.7 207.67,201.7 C207.67,201.7 207.97,201.65 207.97,201.65 C207.97,201.65 208.28,201.61 208.28,201.61 C208.28,201.61 208.58,201.57 208.58,201.57 C208.58,201.57 208.89,201.56 208.89,201.56 C208.89,201.56 209.2,201.55 209.2,201.55 C209.2,201.55 209.51,201.55 209.51,201.55 C209.51,201.55 209.81,201.57 209.81,201.57 C209.81,201.57 210.12,201.58 210.12,201.58 C210.12,201.58 210.43,201.62 210.43,201.62 C210.43,201.62 210.73,201.67 210.73,201.67 C210.73,201.67 211.04,201.72 211.04,201.72 C211.04,201.72 211.34,201.8 211.34,201.8 C211.34,201.8 211.63,201.88 211.63,201.88 C211.63,201.88 211.93,201.96 211.93,201.96 C211.93,201.96 212.22,202.06 212.22,202.06 C212.22,202.06 212.51,202.17 212.51,202.17 C212.51,202.17 212.8,202.28 212.8,202.28 C212.8,202.28 213.08,202.4 213.08,202.4 C213.08,202.4 213.36,202.52 213.36,202.52 C213.36,202.52 213.65,202.65 213.65,202.65 C213.65,202.65 213.93,202.77 213.93,202.77 C213.93,202.77 214.22,202.88 214.22,202.88 C214.22,202.88 214.5,202.99 214.5,202.99 C214.5,202.99 214.79,203.1 214.79,203.1 C214.79,203.1 215.09,203.19 215.09,203.19 C215.09,203.19 215.39,203.27 215.39,203.27 C215.39,203.27 215.68,203.35 215.68,203.35 C215.68,203.35 215.99,203.4 215.99,203.4 C215.99,203.4 216.29,203.45 216.29,203.45 C216.29,203.45 216.6,203.49 216.6,203.49 C216.6,203.49 216.9,203.51 216.9,203.51 C216.9,203.51 217.21,203.53 217.21,203.53 C217.21,203.53 217.52,203.54 217.52,203.54c " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="pathData" android:duration="283" android:startOffset="67" android:valueFrom="M217.52 203.54 C217.52,203.54 217.83,203.53 217.83,203.53 C217.83,203.53 218.14,203.52 218.14,203.52 C218.14,203.52 218.44,203.49 218.44,203.49 C218.44,203.49 218.75,203.45 218.75,203.45 C218.75,203.45 219.05,203.41 219.05,203.41 C219.05,203.41 219.36,203.35 219.36,203.35 C219.36,203.35 219.66,203.28 219.66,203.28 C219.66,203.28 219.96,203.21 219.96,203.21 C219.96,203.21 220.25,203.11 220.25,203.11 C220.25,203.11 220.54,203.02 220.54,203.02 C220.54,203.02 220.83,202.9 220.83,202.9 C220.83,202.9 221.11,202.79 221.11,202.79 C221.11,202.79 221.4,202.66 221.4,202.66 C221.4,202.66 221.68,202.54 221.68,202.54 C221.68,202.54 221.96,202.42 221.96,202.42 C221.96,202.42 222.25,202.3 222.25,202.3 C222.25,202.3 222.53,202.19 222.53,202.19 C222.53,202.19 222.82,202.08 222.82,202.08 C222.82,202.08 223.11,201.97 223.11,201.97 C223.11,201.97 223.41,201.89 223.41,201.89 C223.41,201.89 223.71,201.81 223.71,201.81 C223.71,201.81 224,201.73 224,201.73 C224,201.73 224.31,201.68 224.31,201.68 C224.31,201.68 224.61,201.63 224.61,201.63 C224.61,201.63 224.92,201.59 224.92,201.59 C224.92,201.59 225.23,201.57 225.23,201.57 C225.23,201.57 225.53,201.55 225.53,201.55 C225.53,201.55 225.84,201.55 225.84,201.55 C225.84,201.55 226.15,201.56 226.15,201.56 C226.15,201.56 226.46,201.57 226.46,201.57 C226.46,201.57 226.76,201.6 226.76,201.6 C226.76,201.6 227.07,201.65 227.07,201.65 C227.07,201.65 227.37,201.69 227.37,201.69 C227.37,201.69 227.67,201.76 227.67,201.76 C227.67,201.76 227.97,201.84 227.97,201.84 C227.97,201.84 228.27,201.92 228.27,201.92 C228.27,201.92 228.56,202.02 228.56,202.02 C228.56,202.02 228.85,202.12 228.85,202.12 C228.85,202.12 229.14,202.24 229.14,202.24 C229.14,202.24 229.42,202.37 229.42,202.37 C229.42,202.37 229.7,202.5 229.7,202.5 C229.7,202.5 229.97,202.65 229.97,202.65 C229.97,202.65 230.23,202.8 230.23,202.8 C230.23,202.8 230.5,202.96 230.5,202.96 C230.5,202.96 230.75,203.14 230.75,203.14 C230.75,203.14 231,203.32 231,203.32 C231,203.32 231.24,203.51 231.24,203.51 C231.24,203.51 231.48,203.71 231.48,203.71 C231.48,203.71 231.71,203.91 231.71,203.91 C231.71,203.91 231.93,204.13 231.93,204.13 C231.93,204.13 232.15,204.35 232.15,204.35 C232.15,204.35 232.35,204.58 232.35,204.58 C232.35,204.58 232.55,204.81 232.55,204.81 C232.55,204.81 232.75,205.05 232.75,205.05 C232.75,205.05 232.92,205.3 232.92,205.3 C232.92,205.3 233.1,205.56 233.1,205.56 C233.1,205.56 233.27,205.81 233.27,205.81 C233.27,205.81 233.42,206.08 233.42,206.08 C233.42,206.08 233.57,206.35 233.57,206.35 C233.57,206.35 233.7,206.63 233.7,206.63 C233.7,206.63 233.83,206.91 233.83,206.91 C233.83,206.91 233.95,207.19 233.95,207.19 C233.95,207.19 234.05,207.48 234.05,207.48 C234.05,207.48 234.16,207.77 234.16,207.77 C234.16,207.77 234.24,208.07 234.24,208.07 C234.24,208.07 234.31,208.37 234.31,208.37 C234.31,208.37 234.39,208.67 234.39,208.67 C234.39,208.67 234.43,208.97 234.43,208.97 C234.43,208.97 234.48,209.28 234.48,209.28 C234.48,209.28 234.52,209.58 234.52,209.58 C234.52,209.58 234.53,209.89 234.53,209.89 C234.53,209.89 234.54,210.2 234.54,210.2 C234.54,210.2 234.54,210.51 234.54,210.51 C234.54,210.51 234.52,210.82 234.52,210.82 C234.52,210.82 234.5,211.12 234.5,211.12 C234.5,211.12 234.46,211.43 234.46,211.43 C234.46,211.43 234.42,211.73 234.42,211.73 C234.42,211.73 234.37,212.04 234.37,212.04 C234.37,212.04 234.29,212.34 234.29,212.34 C234.29,212.34 234.21,212.64 234.21,212.64 C234.21,212.64 234.13,212.93 234.13,212.93 C234.13,212.93 234.03,213.22 234.03,213.22 C234.03,213.22 233.92,213.51 233.92,213.51 C233.92,213.51 233.81,213.8 233.81,213.8 C233.81,213.8 233.69,214.08 233.69,214.08 C233.69,214.08 233.57,214.37 233.57,214.37 C233.57,214.37 233.44,214.65 233.44,214.65 C233.44,214.65 233.32,214.93 233.32,214.93 C233.32,214.93 233.21,215.22 233.21,215.22 C233.21,215.22 233.1,215.51 233.1,215.51 C233.1,215.51 232.99,215.79 232.99,215.79 C232.99,215.79 232.9,216.09 232.9,216.09 C232.9,216.09 232.82,216.39 232.82,216.39 C232.82,216.39 232.74,216.69 232.74,216.69 C232.74,216.69 232.69,216.99 232.69,216.99 C232.69,216.99 232.64,217.29 232.64,217.29 C232.64,217.29 232.6,217.6 232.6,217.6 C232.6,217.6 232.58,217.91 232.58,217.91 C232.58,217.91 232.56,218.21 232.56,218.21 C232.56,218.21 232.55,218.52 232.55,218.52 C232.55,218.52 232.56,218.83 232.56,218.83 C232.56,218.83 232.57,219.14 232.57,219.14 C232.57,219.14 232.6,219.45 232.6,219.45 C232.6,219.45 232.64,219.75 232.64,219.75 C232.64,219.75 232.68,220.06 232.68,220.06 C232.68,220.06 232.74,220.36 232.74,220.36 C232.74,220.36 232.81,220.66 232.81,220.66 C232.81,220.66 232.88,220.96 232.88,220.96 C232.88,220.96 232.98,221.25 232.98,221.25 C232.98,221.25 233.07,221.54 233.07,221.54 C233.07,221.54 233.19,221.83 233.19,221.83 C233.19,221.83 233.3,222.12 233.3,222.12 C233.3,222.12 233.42,222.4 233.42,222.4 C233.42,222.4 233.55,222.68 233.55,222.68 C233.55,222.68 233.67,222.96 233.67,222.96 C233.67,222.96 233.79,223.25 233.79,223.25 C233.79,223.25 233.9,223.54 233.9,223.54 C233.9,223.54 234.01,223.82 234.01,223.82 C234.01,223.82 234.12,224.11 234.12,224.11 C234.12,224.11 234.2,224.41 234.2,224.41 C234.2,224.41 234.28,224.71 234.28,224.71 C234.28,224.71 234.36,225.01 234.36,225.01 C234.36,225.01 234.41,225.31 234.41,225.31 C234.41,225.31 234.46,225.62 234.46,225.62 C234.46,225.62 234.5,225.92 234.5,225.92 C234.5,225.92 234.52,226.23 234.52,226.23 C234.52,226.23 234.54,226.54 234.54,226.54 C234.54,226.54 234.54,226.84 234.54,226.84 C234.54,226.84 234.53,227.15 234.53,227.15 C234.53,227.15 234.52,227.46 234.52,227.46 C234.52,227.46 234.48,227.77 234.48,227.77 C234.48,227.77 234.44,228.07 234.44,228.07 C234.44,228.07 234.4,228.38 234.4,228.38 C234.4,228.38 234.33,228.68 234.33,228.68 C234.33,228.68 234.25,228.98 234.25,228.98 C234.25,228.98 234.17,229.27 234.17,229.27 C234.17,229.27 234.07,229.56 234.07,229.56 C234.07,229.56 233.97,229.86 233.97,229.86 C233.97,229.86 233.85,230.14 233.85,230.14 C233.85,230.14 233.72,230.42 233.72,230.42 C233.72,230.42 233.59,230.7 233.59,230.7 C233.59,230.7 233.44,230.97 233.44,230.97 C233.44,230.97 233.29,231.24 233.29,231.24 C233.29,231.24 233.13,231.5 233.13,231.5 C233.13,231.5 232.95,231.75 232.95,231.75 C232.95,231.75 232.77,232 232.77,232 C232.77,232 232.58,232.24 232.58,232.24 C232.58,232.24 232.38,232.48 232.38,232.48 C232.38,232.48 232.18,232.71 232.18,232.71 C232.18,232.71 231.96,232.93 231.96,232.93 C231.96,232.93 231.74,233.15 231.74,233.15 C231.74,233.15 231.51,233.35 231.51,233.35 C231.51,233.35 231.28,233.55 231.28,233.55 C231.28,233.55 231.04,233.75 231.04,233.75 C231.04,233.75 230.79,233.92 230.79,233.92 C230.79,233.92 230.53,234.1 230.53,234.1 C230.53,234.1 230.28,234.27 230.28,234.27 C230.28,234.27 230.01,234.42 230.01,234.42 C230.01,234.42 229.74,234.57 229.74,234.57 C229.74,234.57 229.46,234.71 229.46,234.71 C229.46,234.71 229.18,234.83 229.18,234.83 C229.18,234.83 228.9,234.96 228.9,234.96 C228.9,234.96 228.61,235.06 228.61,235.06 C228.61,235.06 228.32,235.16 228.32,235.16 C228.32,235.16 228.02,235.24 228.02,235.24 C228.02,235.24 227.72,235.32 227.72,235.32 C227.72,235.32 227.42,235.39 227.42,235.39 C227.42,235.39 227.12,235.44 227.12,235.44 C227.12,235.44 226.81,235.48 226.81,235.48 C226.81,235.48 226.51,235.52 226.51,235.52 C226.51,235.52 226.2,235.53 226.2,235.53 C226.2,235.53 225.89,235.54 225.89,235.54 C225.89,235.54 225.58,235.54 225.58,235.54 C225.58,235.54 225.27,235.52 225.27,235.52 C225.27,235.52 224.97,235.51 224.97,235.51 C224.97,235.51 224.66,235.47 224.66,235.47 C224.66,235.47 224.36,235.42 224.36,235.42 C224.36,235.42 224.05,235.37 224.05,235.37 C224.05,235.37 223.75,235.3 223.75,235.3 C223.75,235.3 223.45,235.22 223.45,235.22 C223.45,235.22 223.16,235.14 223.16,235.14 C223.16,235.14 222.87,235.03 222.87,235.03 C222.87,235.03 222.58,234.92 222.58,234.92 C222.58,234.92 222.29,234.81 222.29,234.81 C222.29,234.81 222.01,234.69 222.01,234.69 C222.01,234.69 221.72,234.57 221.72,234.57 C221.72,234.57 221.44,234.45 221.44,234.45 C221.44,234.45 221.16,234.32 221.16,234.32 C221.16,234.32 220.87,234.21 220.87,234.21 C220.87,234.21 220.58,234.1 220.58,234.1 C220.58,234.1 220.29,233.99 220.29,233.99 C220.29,233.99 220,233.91 220,233.91 C220,233.91 219.7,233.83 219.7,233.83 C219.7,233.83 219.4,233.75 219.4,233.75 C219.4,233.75 219.1,233.7 219.1,233.7 C219.1,233.7 218.8,233.65 218.8,233.65 C218.8,233.65 218.49,233.6 218.49,233.6 C218.49,233.6 218.18,233.58 218.18,233.58 C218.18,233.58 217.88,233.56 217.88,233.56 C217.88,233.56 217.57,233.55 217.57,233.55 C217.57,233.55 217.26,233.56 217.26,233.56 C217.26,233.56 216.95,233.57 216.95,233.57 C216.95,233.57 216.64,233.6 216.64,233.6 C216.64,233.6 216.34,233.64 216.34,233.64 C216.34,233.64 216.03,233.68 216.03,233.68 C216.03,233.68 215.73,233.74 215.73,233.74 C215.73,233.74 215.43,233.81 215.43,233.81 C215.43,233.81 215.13,233.88 215.13,233.88 C215.13,233.88 214.84,233.98 214.84,233.98 C214.84,233.98 214.55,234.08 214.55,234.08 C214.55,234.08 214.26,234.19 214.26,234.19 C214.26,234.19 213.97,234.3 213.97,234.3 C213.97,234.3 213.69,234.43 213.69,234.43 C213.69,234.43 213.41,234.55 213.41,234.55 C213.41,234.55 213.12,234.67 213.12,234.67 C213.12,234.67 212.84,234.8 212.84,234.8 C212.84,234.8 212.55,234.9 212.55,234.9 C212.55,234.9 212.26,235.01 212.26,235.01 C212.26,235.01 211.98,235.12 211.98,235.12 C211.98,235.12 211.68,235.2 211.68,235.2 C211.68,235.2 211.38,235.28 211.38,235.28 C211.38,235.28 211.08,235.36 211.08,235.36 C211.08,235.36 210.78,235.41 210.78,235.41 C210.78,235.41 210.47,235.46 210.47,235.46 C210.47,235.46 210.17,235.5 210.17,235.5 C210.17,235.5 209.86,235.52 209.86,235.52 C209.86,235.52 209.55,235.54 209.55,235.54 C209.55,235.54 209.25,235.55 209.25,235.55 C209.25,235.55 208.94,235.53 208.94,235.53 C208.94,235.53 208.63,235.52 208.63,235.52 C208.63,235.52 208.32,235.49 208.32,235.49 C208.32,235.49 208.02,235.44 208.02,235.44 C208.02,235.44 207.71,235.4 207.71,235.4 C207.71,235.4 207.41,235.33 207.41,235.33 C207.41,235.33 207.11,235.26 207.11,235.26 C207.11,235.26 206.82,235.17 206.82,235.17 C206.82,235.17 206.53,235.07 206.53,235.07 C206.53,235.07 206.23,234.97 206.23,234.97 C206.23,234.97 205.95,234.85 205.95,234.85 C205.95,234.85 205.67,234.73 205.67,234.73 C205.67,234.73 205.39,234.6 205.39,234.6 C205.39,234.6 205.12,234.44 205.12,234.44 C205.12,234.44 204.85,234.29 204.85,234.29 C204.85,234.29 204.59,234.13 204.59,234.13 C204.59,234.13 204.34,233.95 204.34,233.95 C204.34,233.95 204.09,233.78 204.09,233.78 C204.09,233.78 203.85,233.58 203.85,233.58 C203.85,233.58 203.61,233.39 203.61,233.39 C203.61,233.39 203.38,233.18 203.38,233.18 C203.38,233.18 203.16,232.96 203.16,232.96 C203.16,232.96 202.94,232.75 202.94,232.75 C202.94,232.75 202.74,232.52 202.74,232.52 C202.74,232.52 202.54,232.28 202.54,232.28 C202.54,232.28 202.34,232.04 202.34,232.04 C202.34,232.04 202.16,231.79 202.16,231.79 C202.16,231.79 201.99,231.54 201.99,231.54 C201.99,231.54 201.82,231.28 201.82,231.28 C201.82,231.28 201.67,231.01 201.67,231.01 C201.67,231.01 201.52,230.74 201.52,230.74 C201.52,230.74 201.38,230.46 201.38,230.46 C201.38,230.46 201.26,230.19 201.26,230.19 C201.26,230.19 201.13,229.9 201.13,229.9 C201.13,229.9 201.03,229.61 201.03,229.61 C201.03,229.61 200.93,229.32 200.93,229.32 C200.93,229.32 200.84,229.02 200.84,229.02 C200.84,229.02 200.77,228.72 200.77,228.72 C200.77,228.72 200.7,228.43 200.7,228.43 C200.7,228.43 200.65,228.12 200.65,228.12 C200.65,228.12 200.61,227.82 200.61,227.82 C200.61,227.82 200.57,227.51 200.57,227.51 C200.57,227.51 200.56,227.2 200.56,227.2 C200.56,227.2 200.54,226.89 200.54,226.89 C200.54,226.89 200.55,226.58 200.55,226.58 C200.55,226.58 200.56,226.28 200.56,226.28 C200.56,226.28 200.58,225.97 200.58,225.97 C200.58,225.97 200.62,225.66 200.62,225.66 C200.62,225.66 200.67,225.36 200.67,225.36 C200.67,225.36 200.72,225.06 200.72,225.06 C200.72,225.06 200.79,224.76 200.79,224.76 C200.79,224.76 200.87,224.46 200.87,224.46 C200.87,224.46 200.95,224.16 200.95,224.16 C200.95,224.16 201.06,223.87 201.06,223.87 C201.06,223.87 201.17,223.58 201.17,223.58 C201.17,223.58 201.27,223.29 201.27,223.29 C201.27,223.29 201.4,223.01 201.4,223.01 C201.4,223.01 201.52,222.73 201.52,222.73 C201.52,222.73 201.64,222.45 201.64,222.45 C201.64,222.45 201.76,222.16 201.76,222.16 C201.76,222.16 201.88,221.88 201.88,221.88 C201.88,221.88 201.99,221.59 201.99,221.59 C201.99,221.59 202.1,221.3 202.1,221.3 C202.1,221.3 202.18,221 202.18,221 C202.18,221 202.26,220.71 202.26,220.71 C202.26,220.71 202.34,220.41 202.34,220.41 C202.34,220.41 202.39,220.1 202.39,220.1 C202.39,220.1 202.44,219.8 202.44,219.8 C202.44,219.8 202.49,219.5 202.49,219.5 C202.49,219.5 202.51,219.19 202.51,219.19 C202.51,219.19 202.53,218.88 202.53,218.88 C202.53,218.88 202.54,218.57 202.54,218.57 C202.54,218.57 202.53,218.26 202.53,218.26 C202.53,218.26 202.52,217.96 202.52,217.96 C202.52,217.96 202.49,217.65 202.49,217.65 C202.49,217.65 202.45,217.34 202.45,217.34 C202.45,217.34 202.41,217.04 202.41,217.04 C202.41,217.04 202.34,216.74 202.34,216.74 C202.34,216.74 202.27,216.44 202.27,216.44 C202.27,216.44 202.2,216.14 202.2,216.14 C202.2,216.14 202.11,215.84 202.11,215.84 C202.11,215.84 202.01,215.55 202.01,215.55 C202.01,215.55 201.9,215.26 201.9,215.26 C201.9,215.26 201.78,214.98 201.78,214.98 C201.78,214.98 201.66,214.69 201.66,214.69 C201.66,214.69 201.54,214.41 201.54,214.41 C201.54,214.41 201.42,214.13 201.42,214.13 C201.42,214.13 201.29,213.84 201.29,213.84 C201.29,213.84 201.18,213.55 201.18,213.55 C201.18,213.55 201.07,213.26 201.07,213.26 C201.07,213.26 200.96,212.98 200.96,212.98 C200.96,212.98 200.88,212.68 200.88,212.68 C200.88,212.68 200.8,212.38 200.8,212.38 C200.8,212.38 200.73,212.08 200.73,212.08 C200.73,212.08 200.68,211.78 200.68,211.78 C200.68,211.78 200.63,211.47 200.63,211.47 C200.63,211.47 200.58,211.17 200.58,211.17 C200.58,211.17 200.57,210.86 200.57,210.86 C200.57,210.86 200.55,210.55 200.55,210.55 C200.55,210.55 200.54,210.25 200.54,210.25 C200.54,210.25 200.56,209.94 200.56,209.94 C200.56,209.94 200.57,209.63 200.57,209.63 C200.57,209.63 200.6,209.32 200.6,209.32 C200.6,209.32 200.65,209.02 200.65,209.02 C200.65,209.02 200.69,208.71 200.69,208.71 C200.69,208.71 200.76,208.41 200.76,208.41 C200.76,208.41 200.83,208.11 200.83,208.11 C200.83,208.11 200.92,207.82 200.92,207.82 C200.92,207.82 201.02,207.52 201.02,207.52 C201.02,207.52 201.12,207.23 201.12,207.23 C201.12,207.23 201.24,206.95 201.24,206.95 C201.24,206.95 201.36,206.67 201.36,206.67 C201.36,206.67 201.49,206.39 201.49,206.39 C201.49,206.39 201.65,206.12 201.65,206.12 C201.65,206.12 201.8,205.85 201.8,205.85 C201.8,205.85 201.96,205.59 201.96,205.59 C201.96,205.59 202.14,205.34 202.14,205.34 C202.14,205.34 202.31,205.09 202.31,205.09 C202.31,205.09 202.51,204.85 202.51,204.85 C202.51,204.85 202.71,204.61 202.71,204.61 C202.71,204.61 202.91,204.38 202.91,204.38 C202.91,204.38 203.13,204.16 203.13,204.16 C203.13,204.16 203.34,203.94 203.34,203.94 C203.34,203.94 203.57,203.74 203.57,203.74 C203.57,203.74 203.81,203.54 203.81,203.54 C203.81,203.54 204.05,203.34 204.05,203.34 C204.05,203.34 204.3,203.17 204.3,203.17 C204.3,203.17 204.55,202.99 204.55,202.99 C204.55,202.99 204.81,202.82 204.81,202.82 C204.81,202.82 205.08,202.67 205.08,202.67 C205.08,202.67 205.35,202.52 205.35,202.52 C205.35,202.52 205.63,202.38 205.63,202.38 C205.63,202.38 205.91,202.26 205.91,202.26 C205.91,202.26 206.19,202.13 206.19,202.13 C206.19,202.13 206.48,202.03 206.48,202.03 C206.48,202.03 206.77,201.93 206.77,201.93 C206.77,201.93 207.07,201.85 207.07,201.85 C207.07,201.85 207.37,201.77 207.37,201.77 C207.37,201.77 207.67,201.7 207.67,201.7 C207.67,201.7 207.97,201.65 207.97,201.65 C207.97,201.65 208.28,201.61 208.28,201.61 C208.28,201.61 208.58,201.57 208.58,201.57 C208.58,201.57 208.89,201.56 208.89,201.56 C208.89,201.56 209.2,201.55 209.2,201.55 C209.2,201.55 209.51,201.55 209.51,201.55 C209.51,201.55 209.81,201.57 209.81,201.57 C209.81,201.57 210.12,201.58 210.12,201.58 C210.12,201.58 210.43,201.62 210.43,201.62 C210.43,201.62 210.73,201.67 210.73,201.67 C210.73,201.67 211.04,201.72 211.04,201.72 C211.04,201.72 211.34,201.8 211.34,201.8 C211.34,201.8 211.63,201.88 211.63,201.88 C211.63,201.88 211.93,201.96 211.93,201.96 C211.93,201.96 212.22,202.06 212.22,202.06 C212.22,202.06 212.51,202.17 212.51,202.17 C212.51,202.17 212.8,202.28 212.8,202.28 C212.8,202.28 213.08,202.4 213.08,202.4 C213.08,202.4 213.36,202.52 213.36,202.52 C213.36,202.52 213.65,202.65 213.65,202.65 C213.65,202.65 213.93,202.77 213.93,202.77 C213.93,202.77 214.22,202.88 214.22,202.88 C214.22,202.88 214.5,202.99 214.5,202.99 C214.5,202.99 214.79,203.1 214.79,203.1 C214.79,203.1 215.09,203.19 215.09,203.19 C215.09,203.19 215.39,203.27 215.39,203.27 C215.39,203.27 215.68,203.35 215.68,203.35 C215.68,203.35 215.99,203.4 215.99,203.4 C215.99,203.4 216.29,203.45 216.29,203.45 C216.29,203.45 216.6,203.49 216.6,203.49 C216.6,203.49 216.9,203.51 216.9,203.51 C216.9,203.51 217.21,203.53 217.21,203.53 C217.21,203.53 217.52,203.54 217.52,203.54c " android:valueTo="M217.68 210.56 C217.68,210.56 217.81,210.57 217.81,210.57 C217.81,210.57 217.93,210.57 217.93,210.57 C217.93,210.57 218.06,210.58 218.06,210.58 C218.06,210.58 218.18,210.59 218.18,210.59 C218.18,210.59 218.31,210.59 218.31,210.59 C218.31,210.59 218.43,210.61 218.43,210.61 C218.43,210.61 218.56,210.63 218.56,210.63 C218.56,210.63 218.68,210.64 218.68,210.64 C218.68,210.64 218.81,210.66 218.81,210.66 C218.81,210.66 218.93,210.68 218.93,210.68 C218.93,210.68 219.05,210.7 219.05,210.7 C219.05,210.7 219.18,210.72 219.18,210.72 C219.18,210.72 219.3,210.75 219.3,210.75 C219.3,210.75 219.42,210.78 219.42,210.78 C219.42,210.78 219.54,210.81 219.54,210.81 C219.54,210.81 219.66,210.84 219.66,210.84 C219.66,210.84 219.79,210.87 219.79,210.87 C219.79,210.87 219.91,210.91 219.91,210.91 C219.91,210.91 220.03,210.95 220.03,210.95 C220.03,210.95 220.14,210.99 220.14,210.99 C220.14,210.99 220.26,211.04 220.26,211.04 C220.26,211.04 220.38,211.08 220.38,211.08 C220.38,211.08 220.5,211.12 220.5,211.12 C220.5,211.12 220.62,211.17 220.62,211.17 C220.62,211.17 220.73,211.22 220.73,211.22 C220.73,211.22 220.84,211.27 220.84,211.27 C220.84,211.27 220.96,211.32 220.96,211.32 C220.96,211.32 221.07,211.38 221.07,211.38 C221.07,211.38 221.19,211.43 221.19,211.43 C221.19,211.43 221.3,211.49 221.3,211.49 C221.3,211.49 221.41,211.55 221.41,211.55 C221.41,211.55 221.51,211.61 221.51,211.61 C221.51,211.61 221.62,211.68 221.62,211.68 C221.62,211.68 221.73,211.74 221.73,211.74 C221.73,211.74 221.84,211.8 221.84,211.8 C221.84,211.8 221.94,211.87 221.94,211.87 C221.94,211.87 222.05,211.94 222.05,211.94 C222.05,211.94 222.15,212.02 222.15,212.02 C222.15,212.02 222.25,212.09 222.25,212.09 C222.25,212.09 222.35,212.16 222.35,212.16 C222.35,212.16 222.46,212.23 222.46,212.23 C222.46,212.23 222.55,212.31 222.55,212.31 C222.55,212.31 222.65,212.4 222.65,212.4 C222.65,212.4 222.74,212.48 222.74,212.48 C222.74,212.48 222.84,212.56 222.84,212.56 C222.84,212.56 222.93,212.64 222.93,212.64 C222.93,212.64 223.03,212.72 223.03,212.72 C223.03,212.72 223.12,212.81 223.12,212.81 C223.12,212.81 223.21,212.9 223.21,212.9 C223.21,212.9 223.29,212.99 223.29,212.99 C223.29,212.99 223.38,213.08 223.38,213.08 C223.38,213.08 223.47,213.17 223.47,213.17 C223.47,213.17 223.55,213.26 223.55,213.26 C223.55,213.26 223.63,213.36 223.63,213.36 C223.63,213.36 223.71,213.46 223.71,213.46 C223.71,213.46 223.79,213.56 223.79,213.56 C223.79,213.56 223.87,213.66 223.87,213.66 C223.87,213.66 223.95,213.75 223.95,213.75 C223.95,213.75 224.03,213.85 224.03,213.85 C224.03,213.85 224.09,213.96 224.09,213.96 C224.09,213.96 224.16,214.06 224.16,214.06 C224.16,214.06 224.23,214.17 224.23,214.17 C224.23,214.17 224.3,214.27 224.3,214.27 C224.3,214.27 224.37,214.38 224.37,214.38 C224.37,214.38 224.44,214.48 224.44,214.48 C224.44,214.48 224.5,214.59 224.5,214.59 C224.5,214.59 224.56,214.7 224.56,214.7 C224.56,214.7 224.62,214.81 224.62,214.81 C224.62,214.81 224.68,214.93 224.68,214.93 C224.68,214.93 224.74,215.04 224.74,215.04 C224.74,215.04 224.79,215.15 224.79,215.15 C224.79,215.15 224.84,215.26 224.84,215.26 C224.84,215.26 224.89,215.38 224.89,215.38 C224.89,215.38 224.94,215.5 224.94,215.5 C224.94,215.5 224.99,215.61 224.99,215.61 C224.99,215.61 225.04,215.73 225.04,215.73 C225.04,215.73 225.08,215.84 225.08,215.84 C225.08,215.84 225.12,215.96 225.12,215.96 C225.12,215.96 225.16,216.08 225.16,216.08 C225.16,216.08 225.19,216.2 225.19,216.2 C225.19,216.2 225.23,216.32 225.23,216.32 C225.23,216.32 225.27,216.44 225.27,216.44 C225.27,216.44 225.3,216.56 225.3,216.56 C225.3,216.56 225.33,216.69 225.33,216.69 C225.33,216.69 225.35,216.81 225.35,216.81 C225.35,216.81 225.38,216.93 225.38,216.93 C225.38,216.93 225.41,217.06 225.41,217.06 C225.41,217.06 225.43,217.18 225.43,217.18 C225.43,217.18 225.46,217.3 225.46,217.3 C225.46,217.3 225.47,217.43 225.47,217.43 C225.47,217.43 225.49,217.55 225.49,217.55 C225.49,217.55 225.5,217.68 225.5,217.68 C225.5,217.68 225.52,217.8 225.52,217.8 C225.52,217.8 225.52,217.93 225.52,217.93 C225.52,217.93 225.53,218.05 225.53,218.05 C225.53,218.05 225.54,218.18 225.54,218.18 C225.54,218.18 225.54,218.3 225.54,218.3 C225.54,218.3 225.55,218.43 225.55,218.43 C225.55,218.43 225.55,218.55 225.55,218.55 C225.55,218.55 225.55,218.68 225.55,218.68 C225.55,218.68 225.54,218.8 225.54,218.8 C225.54,218.8 225.54,218.93 225.54,218.93 C225.54,218.93 225.53,219.05 225.53,219.05 C225.53,219.05 225.52,219.18 225.52,219.18 C225.52,219.18 225.52,219.31 225.52,219.31 C225.52,219.31 225.5,219.43 225.5,219.43 C225.5,219.43 225.48,219.55 225.48,219.55 C225.48,219.55 225.47,219.68 225.47,219.68 C225.47,219.68 225.45,219.8 225.45,219.8 C225.45,219.8 225.43,219.93 225.43,219.93 C225.43,219.93 225.41,220.05 225.41,220.05 C225.41,220.05 225.39,220.17 225.39,220.17 C225.39,220.17 225.36,220.3 225.36,220.3 C225.36,220.3 225.33,220.42 225.33,220.42 C225.33,220.42 225.3,220.54 225.3,220.54 C225.3,220.54 225.27,220.66 225.27,220.66 C225.27,220.66 225.24,220.78 225.24,220.78 C225.24,220.78 225.2,220.9 225.2,220.9 C225.2,220.9 225.16,221.02 225.16,221.02 C225.16,221.02 225.12,221.14 225.12,221.14 C225.12,221.14 225.08,221.26 225.08,221.26 C225.08,221.26 225.03,221.38 225.03,221.38 C225.03,221.38 224.99,221.5 224.99,221.5 C224.99,221.5 224.95,221.61 224.95,221.61 C224.95,221.61 224.89,221.73 224.89,221.73 C224.89,221.73 224.84,221.84 224.84,221.84 C224.84,221.84 224.79,221.96 224.79,221.96 C224.79,221.96 224.73,222.07 224.73,222.07 C224.73,222.07 224.68,222.18 224.68,222.18 C224.68,222.18 224.62,222.29 224.62,222.29 C224.62,222.29 224.56,222.4 224.56,222.4 C224.56,222.4 224.5,222.51 224.5,222.51 C224.5,222.51 224.44,222.62 224.44,222.62 C224.44,222.62 224.37,222.73 224.37,222.73 C224.37,222.73 224.31,222.84 224.31,222.84 C224.31,222.84 224.24,222.94 224.24,222.94 C224.24,222.94 224.17,223.05 224.17,223.05 C224.17,223.05 224.09,223.15 224.09,223.15 C224.09,223.15 224.02,223.25 224.02,223.25 C224.02,223.25 223.95,223.35 223.95,223.35 C223.95,223.35 223.88,223.45 223.88,223.45 C223.88,223.45 223.8,223.55 223.8,223.55 C223.8,223.55 223.71,223.65 223.71,223.65 C223.71,223.65 223.63,223.74 223.63,223.74 C223.63,223.74 223.55,223.84 223.55,223.84 C223.55,223.84 223.47,223.93 223.47,223.93 C223.47,223.93 223.39,224.03 223.39,224.03 C223.39,224.03 223.3,224.12 223.3,224.12 C223.3,224.12 223.21,224.2 223.21,224.2 C223.21,224.2 223.12,224.29 223.12,224.29 C223.12,224.29 223.03,224.38 223.03,224.38 C223.03,224.38 222.94,224.46 222.94,224.46 C222.94,224.46 222.85,224.55 222.85,224.55 C222.85,224.55 222.75,224.63 222.75,224.63 C222.75,224.63 222.65,224.71 222.65,224.71 C222.65,224.71 222.55,224.79 222.55,224.79 C222.55,224.79 222.46,224.87 222.46,224.87 C222.46,224.87 222.36,224.95 222.36,224.95 C222.36,224.95 222.26,225.02 222.26,225.02 C222.26,225.02 222.15,225.09 222.15,225.09 C222.15,225.09 222.05,225.16 222.05,225.16 C222.05,225.16 221.94,225.23 221.94,225.23 C221.94,225.23 221.84,225.3 221.84,225.3 C221.84,225.3 221.74,225.37 221.74,225.37 C221.74,225.37 221.63,225.44 221.63,225.44 C221.63,225.44 221.52,225.5 221.52,225.5 C221.52,225.5 221.41,225.56 221.41,225.56 C221.41,225.56 221.3,225.62 221.3,225.62 C221.3,225.62 221.19,225.68 221.19,225.68 C221.19,225.68 221.08,225.73 221.08,225.73 C221.08,225.73 220.96,225.79 220.96,225.79 C220.96,225.79 220.85,225.84 220.85,225.84 C220.85,225.84 220.73,225.89 220.73,225.89 C220.73,225.89 220.62,225.94 220.62,225.94 C220.62,225.94 220.5,225.99 220.5,225.99 C220.5,225.99 220.38,226.03 220.38,226.03 C220.38,226.03 220.27,226.08 220.27,226.08 C220.27,226.08 220.15,226.12 220.15,226.12 C220.15,226.12 220.03,226.15 220.03,226.15 C220.03,226.15 219.91,226.19 219.91,226.19 C219.91,226.19 219.79,226.23 219.79,226.23 C219.79,226.23 219.67,226.27 219.67,226.27 C219.67,226.27 219.55,226.3 219.55,226.3 C219.55,226.3 219.42,226.33 219.42,226.33 C219.42,226.33 219.3,226.35 219.3,226.35 C219.3,226.35 219.18,226.38 219.18,226.38 C219.18,226.38 219.06,226.4 219.06,226.4 C219.06,226.4 218.93,226.43 218.93,226.43 C218.93,226.43 218.81,226.45 218.81,226.45 C218.81,226.45 218.68,226.47 218.68,226.47 C218.68,226.47 218.56,226.49 218.56,226.49 C218.56,226.49 218.44,226.5 218.44,226.5 C218.44,226.5 218.31,226.52 218.31,226.52 C218.31,226.52 218.19,226.52 218.19,226.52 C218.19,226.52 218.06,226.53 218.06,226.53 C218.06,226.53 217.93,226.53 217.93,226.53 C217.93,226.53 217.81,226.54 217.81,226.54 C217.81,226.54 217.68,226.55 217.68,226.55 C217.68,226.55 217.56,226.55 217.56,226.55 C217.56,226.55 217.43,226.55 217.43,226.55 C217.43,226.55 217.31,226.54 217.31,226.54 C217.31,226.54 217.18,226.53 217.18,226.53 C217.18,226.53 217.05,226.53 217.05,226.53 C217.05,226.53 216.93,226.52 216.93,226.52 C216.93,226.52 216.8,226.52 216.8,226.52 C216.8,226.52 216.68,226.5 216.68,226.5 C216.68,226.5 216.55,226.48 216.55,226.48 C216.55,226.48 216.43,226.46 216.43,226.46 C216.43,226.46 216.31,226.45 216.31,226.45 C216.31,226.45 216.18,226.43 216.18,226.43 C216.18,226.43 216.06,226.41 216.06,226.41 C216.06,226.41 215.93,226.38 215.93,226.38 C215.93,226.38 215.81,226.35 215.81,226.35 C215.81,226.35 215.69,226.32 215.69,226.32 C215.69,226.32 215.57,226.29 215.57,226.29 C215.57,226.29 215.45,226.26 215.45,226.26 C215.45,226.26 215.32,226.23 215.32,226.23 C215.32,226.23 215.2,226.2 215.2,226.2 C215.2,226.2 215.09,226.16 215.09,226.16 C215.09,226.16 214.97,226.12 214.97,226.12 C214.97,226.12 214.85,226.07 214.85,226.07 C214.85,226.07 214.73,226.03 214.73,226.03 C214.73,226.03 214.61,225.99 214.61,225.99 C214.61,225.99 214.5,225.94 214.5,225.94 C214.5,225.94 214.38,225.89 214.38,225.89 C214.38,225.89 214.27,225.84 214.27,225.84 C214.27,225.84 214.15,225.79 214.15,225.79 C214.15,225.79 214.04,225.73 214.04,225.73 C214.04,225.73 213.93,225.68 213.93,225.68 C213.93,225.68 213.81,225.62 213.81,225.62 C213.81,225.62 213.71,225.56 213.71,225.56 C213.71,225.56 213.6,225.5 213.6,225.5 C213.6,225.5 213.49,225.43 213.49,225.43 C213.49,225.43 213.38,225.37 213.38,225.37 C213.38,225.37 213.27,225.31 213.27,225.31 C213.27,225.31 213.17,225.24 213.17,225.24 C213.17,225.24 213.06,225.16 213.06,225.16 C213.06,225.16 212.96,225.09 212.96,225.09 C212.96,225.09 212.86,225.02 212.86,225.02 C212.86,225.02 212.76,224.95 212.76,224.95 C212.76,224.95 212.65,224.87 212.65,224.87 C212.65,224.87 212.56,224.79 212.56,224.79 C212.56,224.79 212.46,224.71 212.46,224.71 C212.46,224.71 212.37,224.63 212.37,224.63 C212.37,224.63 212.27,224.55 212.27,224.55 C212.27,224.55 212.18,224.47 212.18,224.47 C212.18,224.47 212.08,224.38 212.08,224.38 C212.08,224.38 211.99,224.3 211.99,224.3 C211.99,224.3 211.91,224.2 211.91,224.2 C211.91,224.2 211.82,224.11 211.82,224.11 C211.82,224.11 211.73,224.02 211.73,224.02 C211.73,224.02 211.64,223.93 211.64,223.93 C211.64,223.93 211.56,223.84 211.56,223.84 C211.56,223.84 211.48,223.75 211.48,223.75 C211.48,223.75 211.4,223.65 211.4,223.65 C211.4,223.65 211.32,223.55 211.32,223.55 C211.32,223.55 211.24,223.45 211.24,223.45 C211.24,223.45 211.16,223.35 211.16,223.35 C211.16,223.35 211.09,223.26 211.09,223.26 C211.09,223.26 211.02,223.15 211.02,223.15 C211.02,223.15 210.95,223.05 210.95,223.05 C210.95,223.05 210.88,222.94 210.88,222.94 C210.88,222.94 210.81,222.84 210.81,222.84 C210.81,222.84 210.74,222.73 210.74,222.73 C210.74,222.73 210.67,222.63 210.67,222.63 C210.67,222.63 210.61,222.52 210.61,222.52 C210.61,222.52 210.55,222.4 210.55,222.4 C210.55,222.4 210.49,222.29 210.49,222.29 C210.49,222.29 210.43,222.18 210.43,222.18 C210.43,222.18 210.38,222.07 210.38,222.07 C210.38,222.07 210.32,221.96 210.32,221.96 C210.32,221.96 210.27,221.84 210.27,221.84 C210.27,221.84 210.22,221.73 210.22,221.73 C210.22,221.73 210.17,221.61 210.17,221.61 C210.17,221.61 210.12,221.5 210.12,221.5 C210.12,221.5 210.08,221.38 210.08,221.38 C210.08,221.38 210.03,221.26 210.03,221.26 C210.03,221.26 209.99,221.14 209.99,221.14 C209.99,221.14 209.96,221.02 209.96,221.02 C209.96,221.02 209.92,220.9 209.92,220.9 C209.92,220.9 209.88,220.78 209.88,220.78 C209.88,220.78 209.84,220.67 209.84,220.67 C209.84,220.67 209.81,220.54 209.81,220.54 C209.81,220.54 209.78,220.42 209.78,220.42 C209.78,220.42 209.76,220.3 209.76,220.3 C209.76,220.3 209.73,220.18 209.73,220.18 C209.73,220.18 209.71,220.05 209.71,220.05 C209.71,220.05 209.68,219.93 209.68,219.93 C209.68,219.93 209.66,219.81 209.66,219.81 C209.66,219.81 209.64,219.68 209.64,219.68 C209.64,219.68 209.62,219.56 209.62,219.56 C209.62,219.56 209.61,219.43 209.61,219.43 C209.61,219.43 209.59,219.31 209.59,219.31 C209.59,219.31 209.59,219.18 209.59,219.18 C209.59,219.18 209.58,219.06 209.58,219.06 C209.58,219.06 209.58,218.93 209.58,218.93 C209.58,218.93 209.57,218.81 209.57,218.81 C209.57,218.81 209.56,218.68 209.56,218.68 C209.56,218.68 209.56,218.56 209.56,218.56 C209.56,218.56 209.56,218.43 209.56,218.43 C209.56,218.43 209.57,218.3 209.57,218.3 C209.57,218.3 209.58,218.18 209.58,218.18 C209.58,218.18 209.58,218.05 209.58,218.05 C209.58,218.05 209.59,217.93 209.59,217.93 C209.59,217.93 209.59,217.8 209.59,217.8 C209.59,217.8 209.61,217.68 209.61,217.68 C209.61,217.68 209.63,217.55 209.63,217.55 C209.63,217.55 209.65,217.43 209.65,217.43 C209.65,217.43 209.66,217.31 209.66,217.31 C209.66,217.31 209.68,217.18 209.68,217.18 C209.68,217.18 209.7,217.06 209.7,217.06 C209.7,217.06 209.73,216.93 209.73,216.93 C209.73,216.93 209.76,216.81 209.76,216.81 C209.76,216.81 209.79,216.69 209.79,216.69 C209.79,216.69 209.82,216.57 209.82,216.57 C209.82,216.57 209.85,216.45 209.85,216.45 C209.85,216.45 209.88,216.32 209.88,216.32 C209.88,216.32 209.91,216.2 209.91,216.2 C209.91,216.2 209.95,216.08 209.95,216.08 C209.95,216.08 210,215.97 210,215.97 C210,215.97 210.04,215.85 210.04,215.85 C210.04,215.85 210.08,215.73 210.08,215.73 C210.08,215.73 210.12,215.61 210.12,215.61 C210.12,215.61 210.17,215.49 210.17,215.49 C210.17,215.49 210.22,215.38 210.22,215.38 C210.22,215.38 210.27,215.27 210.27,215.27 C210.27,215.27 210.33,215.15 210.33,215.15 C210.33,215.15 210.38,215.04 210.38,215.04 C210.38,215.04 210.43,214.92 210.43,214.92 C210.43,214.92 210.49,214.81 210.49,214.81 C210.49,214.81 210.55,214.7 210.55,214.7 C210.55,214.7 210.61,214.6 210.61,214.6 C210.61,214.6 210.68,214.49 210.68,214.49 C210.68,214.49 210.74,214.38 210.74,214.38 C210.74,214.38 210.8,214.27 210.8,214.27 C210.8,214.27 210.87,214.17 210.87,214.17 C210.87,214.17 210.95,214.06 210.95,214.06 C210.95,214.06 211.02,213.96 211.02,213.96 C211.02,213.96 211.09,213.86 211.09,213.86 C211.09,213.86 211.16,213.76 211.16,213.76 C211.16,213.76 211.24,213.65 211.24,213.65 C211.24,213.65 211.32,213.56 211.32,213.56 C211.32,213.56 211.4,213.46 211.4,213.46 C211.4,213.46 211.48,213.37 211.48,213.37 C211.48,213.37 211.56,213.27 211.56,213.27 C211.56,213.27 211.64,213.18 211.64,213.18 C211.64,213.18 211.73,213.08 211.73,213.08 C211.73,213.08 211.82,212.99 211.82,212.99 C211.82,212.99 211.91,212.9 211.91,212.9 C211.91,212.9 212,212.82 212,212.82 C212,212.82 212.09,212.73 212.09,212.73 C212.09,212.73 212.18,212.64 212.18,212.64 C212.18,212.64 212.27,212.56 212.27,212.56 C212.27,212.56 212.36,212.48 212.36,212.48 C212.36,212.48 212.46,212.4 212.46,212.4 C212.46,212.4 212.56,212.32 212.56,212.32 C212.56,212.32 212.66,212.24 212.66,212.24 C212.66,212.24 212.76,212.16 212.76,212.16 C212.76,212.16 212.85,212.08 212.85,212.08 C212.85,212.08 212.96,212.02 212.96,212.02 C212.96,212.02 213.06,211.95 213.06,211.95 C213.06,211.95 213.17,211.88 213.17,211.88 C213.17,211.88 213.27,211.81 213.27,211.81 C213.27,211.81 213.38,211.74 213.38,211.74 C213.38,211.74 213.48,211.67 213.48,211.67 C213.48,211.67 213.6,211.61 213.6,211.61 C213.6,211.61 213.71,211.55 213.71,211.55 C213.71,211.55 213.82,211.49 213.82,211.49 C213.82,211.49 213.93,211.43 213.93,211.43 C213.93,211.43 214.04,211.37 214.04,211.37 C214.04,211.37 214.15,211.32 214.15,211.32 C214.15,211.32 214.27,211.27 214.27,211.27 C214.27,211.27 214.38,211.22 214.38,211.22 C214.38,211.22 214.5,211.17 214.5,211.17 C214.5,211.17 214.61,211.12 214.61,211.12 C214.61,211.12 214.73,211.07 214.73,211.07 C214.73,211.07 214.85,211.03 214.85,211.03 C214.85,211.03 214.97,210.99 214.97,210.99 C214.97,210.99 215.09,210.95 215.09,210.95 C215.09,210.95 215.21,210.92 215.21,210.92 C215.21,210.92 215.33,210.88 215.33,210.88 C215.33,210.88 215.45,210.84 215.45,210.84 C215.45,210.84 215.57,210.81 215.57,210.81 C215.57,210.81 215.69,210.78 215.69,210.78 C215.69,210.78 215.81,210.76 215.81,210.76 C215.81,210.76 215.93,210.73 215.93,210.73 C215.93,210.73 216.06,210.7 216.06,210.7 C216.06,210.7 216.18,210.68 216.18,210.68 C216.18,210.68 216.3,210.65 216.3,210.65 C216.3,210.65 216.43,210.64 216.43,210.64 C216.43,210.64 216.55,210.62 216.55,210.62 C216.55,210.62 216.68,210.61 216.68,210.61 C216.68,210.61 216.8,210.59 216.8,210.59 C216.8,210.59 216.93,210.59 216.93,210.59 C216.93,210.59 217.05,210.58 217.05,210.58 C217.05,210.58 217.18,210.58 217.18,210.58 C217.18,210.58 217.3,210.57 217.3,210.57 C217.3,210.57 217.43,210.56 217.43,210.56 C217.43,210.56 217.56,210.56 217.56,210.56 C217.56,210.56 217.68,210.56 217.68,210.56c " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.8,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="time_group"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateX" android:duration="500" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"/></set></aapt:attr></target></animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/pin_dot_shape_2_avd.xml b/packages/SystemUI/res/drawable/pin_dot_shape_2_avd.xml new file mode 100644 index 000000000000..d910990ae248 --- /dev/null +++ b/packages/SystemUI/res/drawable/pin_dot_shape_2_avd.xml @@ -0,0 +1 @@ +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"><aapt:attr name="android:drawable"><vector android:height="60dp" android:width="60dp" android:viewportHeight="60" android:viewportWidth="60"><group android:name="_R_G"><group android:name="_R_G_L_0_G" android:translateX="-187.543" android:translateY="-188.546"><path android:name="_R_G_L_0_G_D_0_P_0" android:fillColor="#ffffff" android:fillAlpha="0" android:fillType="nonZero" android:pathData=" M217.62 214.55 C217.62,214.55 217.68,214.55 217.68,214.55 C217.68,214.55 217.74,214.56 217.74,214.56 C217.74,214.56 217.81,214.56 217.81,214.56 C217.81,214.56 217.87,214.56 217.87,214.56 C217.87,214.56 217.93,214.57 217.93,214.57 C217.93,214.57 218,214.57 218,214.57 C218,214.57 218.06,214.58 218.06,214.58 C218.06,214.58 218.12,214.59 218.12,214.59 C218.12,214.59 218.18,214.6 218.18,214.6 C218.18,214.6 218.24,214.61 218.24,214.61 C218.24,214.61 218.31,214.62 218.31,214.62 C218.31,214.62 218.37,214.63 218.37,214.63 C218.37,214.63 218.43,214.65 218.43,214.65 C218.43,214.65 218.49,214.66 218.49,214.66 C218.49,214.66 218.55,214.68 218.55,214.68 C218.55,214.68 218.61,214.69 218.61,214.69 C218.61,214.69 218.67,214.71 218.67,214.71 C218.67,214.71 218.73,214.73 218.73,214.73 C218.73,214.73 218.79,214.75 218.79,214.75 C218.79,214.75 218.85,214.77 218.85,214.77 C218.85,214.77 218.91,214.79 218.91,214.79 C218.91,214.79 218.97,214.81 218.97,214.81 C218.97,214.81 219.03,214.83 219.03,214.83 C219.03,214.83 219.09,214.85 219.09,214.85 C219.09,214.85 219.15,214.88 219.15,214.88 C219.15,214.88 219.2,214.9 219.2,214.9 C219.2,214.9 219.26,214.93 219.26,214.93 C219.26,214.93 219.32,214.96 219.32,214.96 C219.32,214.96 219.37,214.98 219.37,214.98 C219.37,214.98 219.43,215.01 219.43,215.01 C219.43,215.01 219.48,215.05 219.48,215.05 C219.48,215.05 219.54,215.08 219.54,215.08 C219.54,215.08 219.59,215.11 219.59,215.11 C219.59,215.11 219.65,215.14 219.65,215.14 C219.65,215.14 219.7,215.17 219.7,215.17 C219.7,215.17 219.75,215.21 219.75,215.21 C219.75,215.21 219.81,215.24 219.81,215.24 C219.81,215.24 219.86,215.28 219.86,215.28 C219.86,215.28 219.91,215.32 219.91,215.32 C219.91,215.32 219.96,215.35 219.96,215.35 C219.96,215.35 220.01,215.39 220.01,215.39 C220.01,215.39 220.06,215.43 220.06,215.43 C220.06,215.43 220.11,215.47 220.11,215.47 C220.11,215.47 220.16,215.51 220.16,215.51 C220.16,215.51 220.2,215.55 220.2,215.55 C220.2,215.55 220.25,215.59 220.25,215.59 C220.25,215.59 220.3,215.63 220.3,215.63 C220.3,215.63 220.34,215.68 220.34,215.68 C220.34,215.68 220.39,215.72 220.39,215.72 C220.39,215.72 220.43,215.77 220.43,215.77 C220.43,215.77 220.47,215.81 220.47,215.81 C220.47,215.81 220.52,215.86 220.52,215.86 C220.52,215.86 220.56,215.9 220.56,215.9 C220.56,215.9 220.6,215.95 220.6,215.95 C220.6,215.95 220.64,216 220.64,216 C220.64,216 220.68,216.05 220.68,216.05 C220.68,216.05 220.72,216.1 220.72,216.1 C220.72,216.1 220.76,216.15 220.76,216.15 C220.76,216.15 220.8,216.2 220.8,216.2 C220.8,216.2 220.83,216.25 220.83,216.25 C220.83,216.25 220.87,216.3 220.87,216.3 C220.87,216.3 220.9,216.36 220.9,216.36 C220.9,216.36 220.94,216.41 220.94,216.41 C220.94,216.41 220.97,216.46 220.97,216.46 C220.97,216.46 221,216.51 221,216.51 C221,216.51 221.03,216.57 221.03,216.57 C221.03,216.57 221.06,216.63 221.06,216.63 C221.06,216.63 221.09,216.68 221.09,216.68 C221.09,216.68 221.12,216.74 221.12,216.74 C221.12,216.74 221.15,216.79 221.15,216.79 C221.15,216.79 221.18,216.85 221.18,216.85 C221.18,216.85 221.21,216.91 221.21,216.91 C221.21,216.91 221.23,216.96 221.23,216.96 C221.23,216.96 221.25,217.02 221.25,217.02 C221.25,217.02 221.28,217.08 221.28,217.08 C221.28,217.08 221.3,217.14 221.3,217.14 C221.3,217.14 221.33,217.2 221.33,217.2 C221.33,217.2 221.34,217.26 221.34,217.26 C221.34,217.26 221.36,217.32 221.36,217.32 C221.36,217.32 221.38,217.38 221.38,217.38 C221.38,217.38 221.4,217.44 221.4,217.44 C221.4,217.44 221.42,217.5 221.42,217.5 C221.42,217.5 221.44,217.56 221.44,217.56 C221.44,217.56 221.45,217.62 221.45,217.62 C221.45,217.62 221.46,217.68 221.46,217.68 C221.46,217.68 221.48,217.74 221.48,217.74 C221.48,217.74 221.49,217.8 221.49,217.8 C221.49,217.8 221.5,217.87 221.5,217.87 C221.5,217.87 221.51,217.93 221.51,217.93 C221.51,217.93 221.52,217.99 221.52,217.99 C221.52,217.99 221.53,218.05 221.53,218.05 C221.53,218.05 221.54,218.11 221.54,218.11 C221.54,218.11 221.54,218.18 221.54,218.18 C221.54,218.18 221.55,218.24 221.55,218.24 C221.55,218.24 221.55,218.3 221.55,218.3 C221.55,218.3 221.55,218.37 221.55,218.37 C221.55,218.37 221.56,218.43 221.56,218.43 C221.56,218.43 221.56,218.49 221.56,218.49 C221.56,218.49 221.56,218.55 221.56,218.55 C221.56,218.55 221.56,218.62 221.56,218.62 C221.56,218.62 221.56,218.68 221.56,218.68 C221.56,218.68 221.55,218.74 221.55,218.74 C221.55,218.74 221.55,218.81 221.55,218.81 C221.55,218.81 221.55,218.87 221.55,218.87 C221.55,218.87 221.54,218.93 221.54,218.93 C221.54,218.93 221.54,218.99 221.54,218.99 C221.54,218.99 221.53,219.06 221.53,219.06 C221.53,219.06 221.52,219.12 221.52,219.12 C221.52,219.12 221.51,219.18 221.51,219.18 C221.51,219.18 221.5,219.24 221.5,219.24 C221.5,219.24 221.49,219.3 221.49,219.3 C221.49,219.3 221.48,219.37 221.48,219.37 C221.48,219.37 221.46,219.43 221.46,219.43 C221.46,219.43 221.45,219.49 221.45,219.49 C221.45,219.49 221.43,219.55 221.43,219.55 C221.43,219.55 221.42,219.61 221.42,219.61 C221.42,219.61 221.4,219.67 221.4,219.67 C221.4,219.67 221.39,219.73 221.39,219.73 C221.39,219.73 221.37,219.79 221.37,219.79 C221.37,219.79 221.34,219.85 221.34,219.85 C221.34,219.85 221.32,219.91 221.32,219.91 C221.32,219.91 221.3,219.97 221.3,219.97 C221.3,219.97 221.28,220.03 221.28,220.03 C221.28,220.03 221.26,220.09 221.26,220.09 C221.26,220.09 221.23,220.14 221.23,220.14 C221.23,220.14 221.21,220.2 221.21,220.2 C221.21,220.2 221.18,220.26 221.18,220.26 C221.18,220.26 221.15,220.32 221.15,220.32 C221.15,220.32 221.13,220.37 221.13,220.37 C221.13,220.37 221.1,220.43 221.1,220.43 C221.1,220.43 221.07,220.48 221.07,220.48 C221.07,220.48 221.03,220.54 221.03,220.54 C221.03,220.54 221,220.59 221,220.59 C221,220.59 220.97,220.65 220.97,220.65 C220.97,220.65 220.94,220.7 220.94,220.7 C220.94,220.7 220.9,220.75 220.9,220.75 C220.9,220.75 220.87,220.8 220.87,220.8 C220.87,220.8 220.83,220.86 220.83,220.86 C220.83,220.86 220.8,220.91 220.8,220.91 C220.8,220.91 220.76,220.96 220.76,220.96 C220.76,220.96 220.72,221.01 220.72,221.01 C220.72,221.01 220.68,221.06 220.68,221.06 C220.68,221.06 220.64,221.11 220.64,221.11 C220.64,221.11 220.6,221.15 220.6,221.15 C220.6,221.15 220.56,221.2 220.56,221.2 C220.56,221.2 220.52,221.25 220.52,221.25 C220.52,221.25 220.48,221.3 220.48,221.3 C220.48,221.3 220.43,221.34 220.43,221.34 C220.43,221.34 220.39,221.38 220.39,221.38 C220.39,221.38 220.34,221.43 220.34,221.43 C220.34,221.43 220.3,221.47 220.3,221.47 C220.3,221.47 220.25,221.52 220.25,221.52 C220.25,221.52 220.21,221.56 220.21,221.56 C220.21,221.56 220.16,221.6 220.16,221.6 C220.16,221.6 220.11,221.64 220.11,221.64 C220.11,221.64 220.06,221.68 220.06,221.68 C220.06,221.68 220.01,221.72 220.01,221.72 C220.01,221.72 219.96,221.76 219.96,221.76 C219.96,221.76 219.91,221.8 219.91,221.8 C219.91,221.8 219.86,221.83 219.86,221.83 C219.86,221.83 219.81,221.87 219.81,221.87 C219.81,221.87 219.75,221.9 219.75,221.9 C219.75,221.9 219.7,221.93 219.7,221.93 C219.7,221.93 219.65,221.97 219.65,221.97 C219.65,221.97 219.6,222 219.6,222 C219.6,222 219.54,222.03 219.54,222.03 C219.54,222.03 219.49,222.06 219.49,222.06 C219.49,222.06 219.43,222.09 219.43,222.09 C219.43,222.09 219.37,222.12 219.37,222.12 C219.37,222.12 219.32,222.15 219.32,222.15 C219.32,222.15 219.26,222.18 219.26,222.18 C219.26,222.18 219.21,222.2 219.21,222.2 C219.21,222.2 219.15,222.23 219.15,222.23 C219.15,222.23 219.09,222.25 219.09,222.25 C219.09,222.25 219.03,222.28 219.03,222.28 C219.03,222.28 218.97,222.3 218.97,222.3 C218.97,222.3 218.91,222.32 218.91,222.32 C218.91,222.32 218.85,222.34 218.85,222.34 C218.85,222.34 218.79,222.36 218.79,222.36 C218.79,222.36 218.73,222.38 218.73,222.38 C218.73,222.38 218.67,222.4 218.67,222.4 C218.67,222.4 218.61,222.42 218.61,222.42 C218.61,222.42 218.55,222.44 218.55,222.44 C218.55,222.44 218.49,222.45 218.49,222.45 C218.49,222.45 218.43,222.46 218.43,222.46 C218.43,222.46 218.37,222.47 218.37,222.47 C218.37,222.47 218.31,222.49 218.31,222.49 C218.31,222.49 218.25,222.5 218.25,222.5 C218.25,222.5 218.18,222.51 218.18,222.51 C218.18,222.51 218.12,222.52 218.12,222.52 C218.12,222.52 218.06,222.53 218.06,222.53 C218.06,222.53 218,222.54 218,222.54 C218,222.54 217.93,222.54 217.93,222.54 C217.93,222.54 217.87,222.55 217.87,222.55 C217.87,222.55 217.81,222.55 217.81,222.55 C217.81,222.55 217.75,222.55 217.75,222.55 C217.75,222.55 217.68,222.56 217.68,222.56 C217.68,222.56 217.62,222.56 217.62,222.56 C217.62,222.56 217.56,222.56 217.56,222.56 C217.56,222.56 217.49,222.56 217.49,222.56 C217.49,222.56 217.43,222.56 217.43,222.56 C217.43,222.56 217.37,222.55 217.37,222.55 C217.37,222.55 217.3,222.55 217.3,222.55 C217.3,222.55 217.24,222.55 217.24,222.55 C217.24,222.55 217.18,222.54 217.18,222.54 C217.18,222.54 217.12,222.54 217.12,222.54 C217.12,222.54 217.05,222.53 217.05,222.53 C217.05,222.53 216.99,222.52 216.99,222.52 C216.99,222.52 216.93,222.51 216.93,222.51 C216.93,222.51 216.87,222.5 216.87,222.5 C216.87,222.5 216.81,222.49 216.81,222.49 C216.81,222.49 216.74,222.48 216.74,222.48 C216.74,222.48 216.68,222.46 216.68,222.46 C216.68,222.46 216.62,222.45 216.62,222.45 C216.62,222.45 216.56,222.43 216.56,222.43 C216.56,222.43 216.5,222.42 216.5,222.42 C216.5,222.42 216.44,222.4 216.44,222.4 C216.44,222.4 216.38,222.38 216.38,222.38 C216.38,222.38 216.32,222.36 216.32,222.36 C216.32,222.36 216.26,222.34 216.26,222.34 C216.26,222.34 216.2,222.32 216.2,222.32 C216.2,222.32 216.14,222.3 216.14,222.3 C216.14,222.3 216.08,222.28 216.08,222.28 C216.08,222.28 216.02,222.26 216.02,222.26 C216.02,222.26 215.97,222.23 215.97,222.23 C215.97,222.23 215.91,222.2 215.91,222.2 C215.91,222.2 215.85,222.18 215.85,222.18 C215.85,222.18 215.79,222.15 215.79,222.15 C215.79,222.15 215.74,222.12 215.74,222.12 C215.74,222.12 215.68,222.1 215.68,222.1 C215.68,222.1 215.63,222.06 215.63,222.06 C215.63,222.06 215.57,222.03 215.57,222.03 C215.57,222.03 215.52,222 215.52,222 C215.52,222 215.46,221.97 215.46,221.97 C215.46,221.97 215.41,221.94 215.41,221.94 C215.41,221.94 215.36,221.9 215.36,221.9 C215.36,221.9 215.31,221.87 215.31,221.87 C215.31,221.87 215.25,221.83 215.25,221.83 C215.25,221.83 215.2,221.79 215.2,221.79 C215.2,221.79 215.15,221.76 215.15,221.76 C215.15,221.76 215.1,221.72 215.1,221.72 C215.1,221.72 215.05,221.68 215.05,221.68 C215.05,221.68 215,221.64 215,221.64 C215,221.64 214.96,221.6 214.96,221.6 C214.96,221.6 214.91,221.56 214.91,221.56 C214.91,221.56 214.86,221.52 214.86,221.52 C214.86,221.52 214.81,221.48 214.81,221.48 C214.81,221.48 214.77,221.43 214.77,221.43 C214.77,221.43 214.73,221.39 214.73,221.39 C214.73,221.39 214.68,221.34 214.68,221.34 C214.68,221.34 214.64,221.3 214.64,221.3 C214.64,221.3 214.59,221.25 214.59,221.25 C214.59,221.25 214.55,221.2 214.55,221.2 C214.55,221.2 214.51,221.15 214.51,221.15 C214.51,221.15 214.47,221.11 214.47,221.11 C214.47,221.11 214.43,221.06 214.43,221.06 C214.43,221.06 214.39,221.01 214.39,221.01 C214.39,221.01 214.35,220.96 214.35,220.96 C214.35,220.96 214.31,220.91 214.31,220.91 C214.31,220.91 214.28,220.86 214.28,220.86 C214.28,220.86 214.25,220.81 214.25,220.81 C214.25,220.81 214.21,220.75 214.21,220.75 C214.21,220.75 214.18,220.7 214.18,220.7 C214.18,220.7 214.14,220.65 214.14,220.65 C214.14,220.65 214.11,220.59 214.11,220.59 C214.11,220.59 214.08,220.54 214.08,220.54 C214.08,220.54 214.05,220.48 214.05,220.48 C214.05,220.48 214.02,220.43 214.02,220.43 C214.02,220.43 213.99,220.37 213.99,220.37 C213.99,220.37 213.96,220.32 213.96,220.32 C213.96,220.32 213.93,220.26 213.93,220.26 C213.93,220.26 213.91,220.2 213.91,220.2 C213.91,220.2 213.88,220.14 213.88,220.14 C213.88,220.14 213.86,220.09 213.86,220.09 C213.86,220.09 213.83,220.03 213.83,220.03 C213.83,220.03 213.81,219.97 213.81,219.97 C213.81,219.97 213.79,219.91 213.79,219.91 C213.79,219.91 213.77,219.85 213.77,219.85 C213.77,219.85 213.75,219.79 213.75,219.79 C213.75,219.79 213.73,219.73 213.73,219.73 C213.73,219.73 213.71,219.67 213.71,219.67 C213.71,219.67 213.69,219.61 213.69,219.61 C213.69,219.61 213.68,219.55 213.68,219.55 C213.68,219.55 213.66,219.49 213.66,219.49 C213.66,219.49 213.65,219.43 213.65,219.43 C213.65,219.43 213.64,219.37 213.64,219.37 C213.64,219.37 213.62,219.31 213.62,219.31 C213.62,219.31 213.61,219.24 213.61,219.24 C213.61,219.24 213.6,219.18 213.6,219.18 C213.6,219.18 213.59,219.12 213.59,219.12 C213.59,219.12 213.58,219.06 213.58,219.06 C213.58,219.06 213.57,218.99 213.57,218.99 C213.57,218.99 213.57,218.93 213.57,218.93 C213.57,218.93 213.56,218.87 213.56,218.87 C213.56,218.87 213.56,218.81 213.56,218.81 C213.56,218.81 213.56,218.74 213.56,218.74 C213.56,218.74 213.56,218.68 213.56,218.68 C213.56,218.68 213.55,218.62 213.55,218.62 C213.55,218.62 213.55,218.55 213.55,218.55 C213.55,218.55 213.55,218.49 213.55,218.49 C213.55,218.49 213.56,218.43 213.56,218.43 C213.56,218.43 213.56,218.37 213.56,218.37 C213.56,218.37 213.56,218.3 213.56,218.3 C213.56,218.3 213.56,218.24 213.56,218.24 C213.56,218.24 213.57,218.18 213.57,218.18 C213.57,218.18 213.57,218.12 213.57,218.12 C213.57,218.12 213.58,218.05 213.58,218.05 C213.58,218.05 213.59,217.99 213.59,217.99 C213.59,217.99 213.6,217.93 213.6,217.93 C213.6,217.93 213.61,217.87 213.61,217.87 C213.61,217.87 213.62,217.8 213.62,217.8 C213.62,217.8 213.63,217.74 213.63,217.74 C213.63,217.74 213.65,217.68 213.65,217.68 C213.65,217.68 213.66,217.62 213.66,217.62 C213.66,217.62 213.68,217.56 213.68,217.56 C213.68,217.56 213.69,217.5 213.69,217.5 C213.69,217.5 213.71,217.44 213.71,217.44 C213.71,217.44 213.73,217.38 213.73,217.38 C213.73,217.38 213.75,217.32 213.75,217.32 C213.75,217.32 213.77,217.26 213.77,217.26 C213.77,217.26 213.79,217.2 213.79,217.2 C213.79,217.2 213.81,217.14 213.81,217.14 C213.81,217.14 213.83,217.08 213.83,217.08 C213.83,217.08 213.85,217.02 213.85,217.02 C213.85,217.02 213.88,216.96 213.88,216.96 C213.88,216.96 213.91,216.91 213.91,216.91 C213.91,216.91 213.93,216.85 213.93,216.85 C213.93,216.85 213.96,216.79 213.96,216.79 C213.96,216.79 213.99,216.74 213.99,216.74 C213.99,216.74 214.02,216.68 214.02,216.68 C214.02,216.68 214.05,216.63 214.05,216.63 C214.05,216.63 214.08,216.57 214.08,216.57 C214.08,216.57 214.11,216.52 214.11,216.52 C214.11,216.52 214.14,216.46 214.14,216.46 C214.14,216.46 214.17,216.41 214.17,216.41 C214.17,216.41 214.21,216.36 214.21,216.36 C214.21,216.36 214.24,216.3 214.24,216.3 C214.24,216.3 214.28,216.25 214.28,216.25 C214.28,216.25 214.32,216.2 214.32,216.2 C214.32,216.2 214.35,216.15 214.35,216.15 C214.35,216.15 214.39,216.1 214.39,216.1 C214.39,216.1 214.43,216.05 214.43,216.05 C214.43,216.05 214.47,216 214.47,216 C214.47,216 214.51,215.96 214.51,215.96 C214.51,215.96 214.55,215.91 214.55,215.91 C214.55,215.91 214.59,215.86 214.59,215.86 C214.59,215.86 214.64,215.81 214.64,215.81 C214.64,215.81 214.68,215.77 214.68,215.77 C214.68,215.77 214.73,215.72 214.73,215.72 C214.73,215.72 214.77,215.68 214.77,215.68 C214.77,215.68 214.82,215.64 214.82,215.64 C214.82,215.64 214.86,215.59 214.86,215.59 C214.86,215.59 214.91,215.55 214.91,215.55 C214.91,215.55 214.96,215.51 214.96,215.51 C214.96,215.51 215,215.47 215,215.47 C215,215.47 215.05,215.43 215.05,215.43 C215.05,215.43 215.1,215.39 215.1,215.39 C215.1,215.39 215.15,215.35 215.15,215.35 C215.15,215.35 215.2,215.31 215.2,215.31 C215.2,215.31 215.25,215.28 215.25,215.28 C215.25,215.28 215.31,215.24 215.31,215.24 C215.31,215.24 215.36,215.21 215.36,215.21 C215.36,215.21 215.41,215.17 215.41,215.17 C215.41,215.17 215.46,215.14 215.46,215.14 C215.46,215.14 215.52,215.11 215.52,215.11 C215.52,215.11 215.57,215.08 215.57,215.08 C215.57,215.08 215.63,215.05 215.63,215.05 C215.63,215.05 215.68,215.02 215.68,215.02 C215.68,215.02 215.74,214.99 215.74,214.99 C215.74,214.99 215.79,214.96 215.79,214.96 C215.79,214.96 215.85,214.93 215.85,214.93 C215.85,214.93 215.91,214.9 215.91,214.9 C215.91,214.9 215.97,214.88 215.97,214.88 C215.97,214.88 216.02,214.86 216.02,214.86 C216.02,214.86 216.08,214.83 216.08,214.83 C216.08,214.83 216.14,214.81 216.14,214.81 C216.14,214.81 216.2,214.78 216.2,214.78 C216.2,214.78 216.26,214.77 216.26,214.77 C216.26,214.77 216.32,214.75 216.32,214.75 C216.32,214.75 216.38,214.73 216.38,214.73 C216.38,214.73 216.44,214.71 216.44,214.71 C216.44,214.71 216.5,214.69 216.5,214.69 C216.5,214.69 216.56,214.67 216.56,214.67 C216.56,214.67 216.62,214.66 216.62,214.66 C216.62,214.66 216.68,214.65 216.68,214.65 C216.68,214.65 216.74,214.63 216.74,214.63 C216.74,214.63 216.81,214.62 216.81,214.62 C216.81,214.62 216.87,214.61 216.87,214.61 C216.87,214.61 216.93,214.6 216.93,214.6 C216.93,214.6 216.99,214.59 216.99,214.59 C216.99,214.59 217.05,214.58 217.05,214.58 C217.05,214.58 217.12,214.57 217.12,214.57 C217.12,214.57 217.18,214.57 217.18,214.57 C217.18,214.57 217.24,214.56 217.24,214.56 C217.24,214.56 217.3,214.56 217.3,214.56 C217.3,214.56 217.37,214.56 217.37,214.56 C217.37,214.56 217.43,214.55 217.43,214.55 C217.43,214.55 217.49,214.55 217.49,214.55 C217.49,214.55 217.56,214.55 217.56,214.55 C217.56,214.55 217.62,214.55 217.62,214.55c "/></group></group><group android:name="time_group"/></vector></aapt:attr><target android:name="_R_G_L_0_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="fillAlpha" android:duration="33" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="pathData" android:duration="67" android:startOffset="0" android:valueFrom="M217.62 214.55 C217.62,214.55 217.68,214.55 217.68,214.55 C217.68,214.55 217.74,214.56 217.74,214.56 C217.74,214.56 217.81,214.56 217.81,214.56 C217.81,214.56 217.87,214.56 217.87,214.56 C217.87,214.56 217.93,214.57 217.93,214.57 C217.93,214.57 218,214.57 218,214.57 C218,214.57 218.06,214.58 218.06,214.58 C218.06,214.58 218.12,214.59 218.12,214.59 C218.12,214.59 218.18,214.6 218.18,214.6 C218.18,214.6 218.24,214.61 218.24,214.61 C218.24,214.61 218.31,214.62 218.31,214.62 C218.31,214.62 218.37,214.63 218.37,214.63 C218.37,214.63 218.43,214.65 218.43,214.65 C218.43,214.65 218.49,214.66 218.49,214.66 C218.49,214.66 218.55,214.68 218.55,214.68 C218.55,214.68 218.61,214.69 218.61,214.69 C218.61,214.69 218.67,214.71 218.67,214.71 C218.67,214.71 218.73,214.73 218.73,214.73 C218.73,214.73 218.79,214.75 218.79,214.75 C218.79,214.75 218.85,214.77 218.85,214.77 C218.85,214.77 218.91,214.79 218.91,214.79 C218.91,214.79 218.97,214.81 218.97,214.81 C218.97,214.81 219.03,214.83 219.03,214.83 C219.03,214.83 219.09,214.85 219.09,214.85 C219.09,214.85 219.15,214.88 219.15,214.88 C219.15,214.88 219.2,214.9 219.2,214.9 C219.2,214.9 219.26,214.93 219.26,214.93 C219.26,214.93 219.32,214.96 219.32,214.96 C219.32,214.96 219.37,214.98 219.37,214.98 C219.37,214.98 219.43,215.01 219.43,215.01 C219.43,215.01 219.48,215.05 219.48,215.05 C219.48,215.05 219.54,215.08 219.54,215.08 C219.54,215.08 219.59,215.11 219.59,215.11 C219.59,215.11 219.65,215.14 219.65,215.14 C219.65,215.14 219.7,215.17 219.7,215.17 C219.7,215.17 219.75,215.21 219.75,215.21 C219.75,215.21 219.81,215.24 219.81,215.24 C219.81,215.24 219.86,215.28 219.86,215.28 C219.86,215.28 219.91,215.32 219.91,215.32 C219.91,215.32 219.96,215.35 219.96,215.35 C219.96,215.35 220.01,215.39 220.01,215.39 C220.01,215.39 220.06,215.43 220.06,215.43 C220.06,215.43 220.11,215.47 220.11,215.47 C220.11,215.47 220.16,215.51 220.16,215.51 C220.16,215.51 220.2,215.55 220.2,215.55 C220.2,215.55 220.25,215.59 220.25,215.59 C220.25,215.59 220.3,215.63 220.3,215.63 C220.3,215.63 220.34,215.68 220.34,215.68 C220.34,215.68 220.39,215.72 220.39,215.72 C220.39,215.72 220.43,215.77 220.43,215.77 C220.43,215.77 220.47,215.81 220.47,215.81 C220.47,215.81 220.52,215.86 220.52,215.86 C220.52,215.86 220.56,215.9 220.56,215.9 C220.56,215.9 220.6,215.95 220.6,215.95 C220.6,215.95 220.64,216 220.64,216 C220.64,216 220.68,216.05 220.68,216.05 C220.68,216.05 220.72,216.1 220.72,216.1 C220.72,216.1 220.76,216.15 220.76,216.15 C220.76,216.15 220.8,216.2 220.8,216.2 C220.8,216.2 220.83,216.25 220.83,216.25 C220.83,216.25 220.87,216.3 220.87,216.3 C220.87,216.3 220.9,216.36 220.9,216.36 C220.9,216.36 220.94,216.41 220.94,216.41 C220.94,216.41 220.97,216.46 220.97,216.46 C220.97,216.46 221,216.51 221,216.51 C221,216.51 221.03,216.57 221.03,216.57 C221.03,216.57 221.06,216.63 221.06,216.63 C221.06,216.63 221.09,216.68 221.09,216.68 C221.09,216.68 221.12,216.74 221.12,216.74 C221.12,216.74 221.15,216.79 221.15,216.79 C221.15,216.79 221.18,216.85 221.18,216.85 C221.18,216.85 221.21,216.91 221.21,216.91 C221.21,216.91 221.23,216.96 221.23,216.96 C221.23,216.96 221.25,217.02 221.25,217.02 C221.25,217.02 221.28,217.08 221.28,217.08 C221.28,217.08 221.3,217.14 221.3,217.14 C221.3,217.14 221.33,217.2 221.33,217.2 C221.33,217.2 221.34,217.26 221.34,217.26 C221.34,217.26 221.36,217.32 221.36,217.32 C221.36,217.32 221.38,217.38 221.38,217.38 C221.38,217.38 221.4,217.44 221.4,217.44 C221.4,217.44 221.42,217.5 221.42,217.5 C221.42,217.5 221.44,217.56 221.44,217.56 C221.44,217.56 221.45,217.62 221.45,217.62 C221.45,217.62 221.46,217.68 221.46,217.68 C221.46,217.68 221.48,217.74 221.48,217.74 C221.48,217.74 221.49,217.8 221.49,217.8 C221.49,217.8 221.5,217.87 221.5,217.87 C221.5,217.87 221.51,217.93 221.51,217.93 C221.51,217.93 221.52,217.99 221.52,217.99 C221.52,217.99 221.53,218.05 221.53,218.05 C221.53,218.05 221.54,218.11 221.54,218.11 C221.54,218.11 221.54,218.18 221.54,218.18 C221.54,218.18 221.55,218.24 221.55,218.24 C221.55,218.24 221.55,218.3 221.55,218.3 C221.55,218.3 221.55,218.37 221.55,218.37 C221.55,218.37 221.56,218.43 221.56,218.43 C221.56,218.43 221.56,218.49 221.56,218.49 C221.56,218.49 221.56,218.55 221.56,218.55 C221.56,218.55 221.56,218.62 221.56,218.62 C221.56,218.62 221.56,218.68 221.56,218.68 C221.56,218.68 221.55,218.74 221.55,218.74 C221.55,218.74 221.55,218.81 221.55,218.81 C221.55,218.81 221.55,218.87 221.55,218.87 C221.55,218.87 221.54,218.93 221.54,218.93 C221.54,218.93 221.54,218.99 221.54,218.99 C221.54,218.99 221.53,219.06 221.53,219.06 C221.53,219.06 221.52,219.12 221.52,219.12 C221.52,219.12 221.51,219.18 221.51,219.18 C221.51,219.18 221.5,219.24 221.5,219.24 C221.5,219.24 221.49,219.3 221.49,219.3 C221.49,219.3 221.48,219.37 221.48,219.37 C221.48,219.37 221.46,219.43 221.46,219.43 C221.46,219.43 221.45,219.49 221.45,219.49 C221.45,219.49 221.43,219.55 221.43,219.55 C221.43,219.55 221.42,219.61 221.42,219.61 C221.42,219.61 221.4,219.67 221.4,219.67 C221.4,219.67 221.39,219.73 221.39,219.73 C221.39,219.73 221.37,219.79 221.37,219.79 C221.37,219.79 221.34,219.85 221.34,219.85 C221.34,219.85 221.32,219.91 221.32,219.91 C221.32,219.91 221.3,219.97 221.3,219.97 C221.3,219.97 221.28,220.03 221.28,220.03 C221.28,220.03 221.26,220.09 221.26,220.09 C221.26,220.09 221.23,220.14 221.23,220.14 C221.23,220.14 221.21,220.2 221.21,220.2 C221.21,220.2 221.18,220.26 221.18,220.26 C221.18,220.26 221.15,220.32 221.15,220.32 C221.15,220.32 221.13,220.37 221.13,220.37 C221.13,220.37 221.1,220.43 221.1,220.43 C221.1,220.43 221.07,220.48 221.07,220.48 C221.07,220.48 221.03,220.54 221.03,220.54 C221.03,220.54 221,220.59 221,220.59 C221,220.59 220.97,220.65 220.97,220.65 C220.97,220.65 220.94,220.7 220.94,220.7 C220.94,220.7 220.9,220.75 220.9,220.75 C220.9,220.75 220.87,220.8 220.87,220.8 C220.87,220.8 220.83,220.86 220.83,220.86 C220.83,220.86 220.8,220.91 220.8,220.91 C220.8,220.91 220.76,220.96 220.76,220.96 C220.76,220.96 220.72,221.01 220.72,221.01 C220.72,221.01 220.68,221.06 220.68,221.06 C220.68,221.06 220.64,221.11 220.64,221.11 C220.64,221.11 220.6,221.15 220.6,221.15 C220.6,221.15 220.56,221.2 220.56,221.2 C220.56,221.2 220.52,221.25 220.52,221.25 C220.52,221.25 220.48,221.3 220.48,221.3 C220.48,221.3 220.43,221.34 220.43,221.34 C220.43,221.34 220.39,221.38 220.39,221.38 C220.39,221.38 220.34,221.43 220.34,221.43 C220.34,221.43 220.3,221.47 220.3,221.47 C220.3,221.47 220.25,221.52 220.25,221.52 C220.25,221.52 220.21,221.56 220.21,221.56 C220.21,221.56 220.16,221.6 220.16,221.6 C220.16,221.6 220.11,221.64 220.11,221.64 C220.11,221.64 220.06,221.68 220.06,221.68 C220.06,221.68 220.01,221.72 220.01,221.72 C220.01,221.72 219.96,221.76 219.96,221.76 C219.96,221.76 219.91,221.8 219.91,221.8 C219.91,221.8 219.86,221.83 219.86,221.83 C219.86,221.83 219.81,221.87 219.81,221.87 C219.81,221.87 219.75,221.9 219.75,221.9 C219.75,221.9 219.7,221.93 219.7,221.93 C219.7,221.93 219.65,221.97 219.65,221.97 C219.65,221.97 219.6,222 219.6,222 C219.6,222 219.54,222.03 219.54,222.03 C219.54,222.03 219.49,222.06 219.49,222.06 C219.49,222.06 219.43,222.09 219.43,222.09 C219.43,222.09 219.37,222.12 219.37,222.12 C219.37,222.12 219.32,222.15 219.32,222.15 C219.32,222.15 219.26,222.18 219.26,222.18 C219.26,222.18 219.21,222.2 219.21,222.2 C219.21,222.2 219.15,222.23 219.15,222.23 C219.15,222.23 219.09,222.25 219.09,222.25 C219.09,222.25 219.03,222.28 219.03,222.28 C219.03,222.28 218.97,222.3 218.97,222.3 C218.97,222.3 218.91,222.32 218.91,222.32 C218.91,222.32 218.85,222.34 218.85,222.34 C218.85,222.34 218.79,222.36 218.79,222.36 C218.79,222.36 218.73,222.38 218.73,222.38 C218.73,222.38 218.67,222.4 218.67,222.4 C218.67,222.4 218.61,222.42 218.61,222.42 C218.61,222.42 218.55,222.44 218.55,222.44 C218.55,222.44 218.49,222.45 218.49,222.45 C218.49,222.45 218.43,222.46 218.43,222.46 C218.43,222.46 218.37,222.47 218.37,222.47 C218.37,222.47 218.31,222.49 218.31,222.49 C218.31,222.49 218.25,222.5 218.25,222.5 C218.25,222.5 218.18,222.51 218.18,222.51 C218.18,222.51 218.12,222.52 218.12,222.52 C218.12,222.52 218.06,222.53 218.06,222.53 C218.06,222.53 218,222.54 218,222.54 C218,222.54 217.93,222.54 217.93,222.54 C217.93,222.54 217.87,222.55 217.87,222.55 C217.87,222.55 217.81,222.55 217.81,222.55 C217.81,222.55 217.75,222.55 217.75,222.55 C217.75,222.55 217.68,222.56 217.68,222.56 C217.68,222.56 217.62,222.56 217.62,222.56 C217.62,222.56 217.56,222.56 217.56,222.56 C217.56,222.56 217.49,222.56 217.49,222.56 C217.49,222.56 217.43,222.56 217.43,222.56 C217.43,222.56 217.37,222.55 217.37,222.55 C217.37,222.55 217.3,222.55 217.3,222.55 C217.3,222.55 217.24,222.55 217.24,222.55 C217.24,222.55 217.18,222.54 217.18,222.54 C217.18,222.54 217.12,222.54 217.12,222.54 C217.12,222.54 217.05,222.53 217.05,222.53 C217.05,222.53 216.99,222.52 216.99,222.52 C216.99,222.52 216.93,222.51 216.93,222.51 C216.93,222.51 216.87,222.5 216.87,222.5 C216.87,222.5 216.81,222.49 216.81,222.49 C216.81,222.49 216.74,222.48 216.74,222.48 C216.74,222.48 216.68,222.46 216.68,222.46 C216.68,222.46 216.62,222.45 216.62,222.45 C216.62,222.45 216.56,222.43 216.56,222.43 C216.56,222.43 216.5,222.42 216.5,222.42 C216.5,222.42 216.44,222.4 216.44,222.4 C216.44,222.4 216.38,222.38 216.38,222.38 C216.38,222.38 216.32,222.36 216.32,222.36 C216.32,222.36 216.26,222.34 216.26,222.34 C216.26,222.34 216.2,222.32 216.2,222.32 C216.2,222.32 216.14,222.3 216.14,222.3 C216.14,222.3 216.08,222.28 216.08,222.28 C216.08,222.28 216.02,222.26 216.02,222.26 C216.02,222.26 215.97,222.23 215.97,222.23 C215.97,222.23 215.91,222.2 215.91,222.2 C215.91,222.2 215.85,222.18 215.85,222.18 C215.85,222.18 215.79,222.15 215.79,222.15 C215.79,222.15 215.74,222.12 215.74,222.12 C215.74,222.12 215.68,222.1 215.68,222.1 C215.68,222.1 215.63,222.06 215.63,222.06 C215.63,222.06 215.57,222.03 215.57,222.03 C215.57,222.03 215.52,222 215.52,222 C215.52,222 215.46,221.97 215.46,221.97 C215.46,221.97 215.41,221.94 215.41,221.94 C215.41,221.94 215.36,221.9 215.36,221.9 C215.36,221.9 215.31,221.87 215.31,221.87 C215.31,221.87 215.25,221.83 215.25,221.83 C215.25,221.83 215.2,221.79 215.2,221.79 C215.2,221.79 215.15,221.76 215.15,221.76 C215.15,221.76 215.1,221.72 215.1,221.72 C215.1,221.72 215.05,221.68 215.05,221.68 C215.05,221.68 215,221.64 215,221.64 C215,221.64 214.96,221.6 214.96,221.6 C214.96,221.6 214.91,221.56 214.91,221.56 C214.91,221.56 214.86,221.52 214.86,221.52 C214.86,221.52 214.81,221.48 214.81,221.48 C214.81,221.48 214.77,221.43 214.77,221.43 C214.77,221.43 214.73,221.39 214.73,221.39 C214.73,221.39 214.68,221.34 214.68,221.34 C214.68,221.34 214.64,221.3 214.64,221.3 C214.64,221.3 214.59,221.25 214.59,221.25 C214.59,221.25 214.55,221.2 214.55,221.2 C214.55,221.2 214.51,221.15 214.51,221.15 C214.51,221.15 214.47,221.11 214.47,221.11 C214.47,221.11 214.43,221.06 214.43,221.06 C214.43,221.06 214.39,221.01 214.39,221.01 C214.39,221.01 214.35,220.96 214.35,220.96 C214.35,220.96 214.31,220.91 214.31,220.91 C214.31,220.91 214.28,220.86 214.28,220.86 C214.28,220.86 214.25,220.81 214.25,220.81 C214.25,220.81 214.21,220.75 214.21,220.75 C214.21,220.75 214.18,220.7 214.18,220.7 C214.18,220.7 214.14,220.65 214.14,220.65 C214.14,220.65 214.11,220.59 214.11,220.59 C214.11,220.59 214.08,220.54 214.08,220.54 C214.08,220.54 214.05,220.48 214.05,220.48 C214.05,220.48 214.02,220.43 214.02,220.43 C214.02,220.43 213.99,220.37 213.99,220.37 C213.99,220.37 213.96,220.32 213.96,220.32 C213.96,220.32 213.93,220.26 213.93,220.26 C213.93,220.26 213.91,220.2 213.91,220.2 C213.91,220.2 213.88,220.14 213.88,220.14 C213.88,220.14 213.86,220.09 213.86,220.09 C213.86,220.09 213.83,220.03 213.83,220.03 C213.83,220.03 213.81,219.97 213.81,219.97 C213.81,219.97 213.79,219.91 213.79,219.91 C213.79,219.91 213.77,219.85 213.77,219.85 C213.77,219.85 213.75,219.79 213.75,219.79 C213.75,219.79 213.73,219.73 213.73,219.73 C213.73,219.73 213.71,219.67 213.71,219.67 C213.71,219.67 213.69,219.61 213.69,219.61 C213.69,219.61 213.68,219.55 213.68,219.55 C213.68,219.55 213.66,219.49 213.66,219.49 C213.66,219.49 213.65,219.43 213.65,219.43 C213.65,219.43 213.64,219.37 213.64,219.37 C213.64,219.37 213.62,219.31 213.62,219.31 C213.62,219.31 213.61,219.24 213.61,219.24 C213.61,219.24 213.6,219.18 213.6,219.18 C213.6,219.18 213.59,219.12 213.59,219.12 C213.59,219.12 213.58,219.06 213.58,219.06 C213.58,219.06 213.57,218.99 213.57,218.99 C213.57,218.99 213.57,218.93 213.57,218.93 C213.57,218.93 213.56,218.87 213.56,218.87 C213.56,218.87 213.56,218.81 213.56,218.81 C213.56,218.81 213.56,218.74 213.56,218.74 C213.56,218.74 213.56,218.68 213.56,218.68 C213.56,218.68 213.55,218.62 213.55,218.62 C213.55,218.62 213.55,218.55 213.55,218.55 C213.55,218.55 213.55,218.49 213.55,218.49 C213.55,218.49 213.56,218.43 213.56,218.43 C213.56,218.43 213.56,218.37 213.56,218.37 C213.56,218.37 213.56,218.3 213.56,218.3 C213.56,218.3 213.56,218.24 213.56,218.24 C213.56,218.24 213.57,218.18 213.57,218.18 C213.57,218.18 213.57,218.12 213.57,218.12 C213.57,218.12 213.58,218.05 213.58,218.05 C213.58,218.05 213.59,217.99 213.59,217.99 C213.59,217.99 213.6,217.93 213.6,217.93 C213.6,217.93 213.61,217.87 213.61,217.87 C213.61,217.87 213.62,217.8 213.62,217.8 C213.62,217.8 213.63,217.74 213.63,217.74 C213.63,217.74 213.65,217.68 213.65,217.68 C213.65,217.68 213.66,217.62 213.66,217.62 C213.66,217.62 213.68,217.56 213.68,217.56 C213.68,217.56 213.69,217.5 213.69,217.5 C213.69,217.5 213.71,217.44 213.71,217.44 C213.71,217.44 213.73,217.38 213.73,217.38 C213.73,217.38 213.75,217.32 213.75,217.32 C213.75,217.32 213.77,217.26 213.77,217.26 C213.77,217.26 213.79,217.2 213.79,217.2 C213.79,217.2 213.81,217.14 213.81,217.14 C213.81,217.14 213.83,217.08 213.83,217.08 C213.83,217.08 213.85,217.02 213.85,217.02 C213.85,217.02 213.88,216.96 213.88,216.96 C213.88,216.96 213.91,216.91 213.91,216.91 C213.91,216.91 213.93,216.85 213.93,216.85 C213.93,216.85 213.96,216.79 213.96,216.79 C213.96,216.79 213.99,216.74 213.99,216.74 C213.99,216.74 214.02,216.68 214.02,216.68 C214.02,216.68 214.05,216.63 214.05,216.63 C214.05,216.63 214.08,216.57 214.08,216.57 C214.08,216.57 214.11,216.52 214.11,216.52 C214.11,216.52 214.14,216.46 214.14,216.46 C214.14,216.46 214.17,216.41 214.17,216.41 C214.17,216.41 214.21,216.36 214.21,216.36 C214.21,216.36 214.24,216.3 214.24,216.3 C214.24,216.3 214.28,216.25 214.28,216.25 C214.28,216.25 214.32,216.2 214.32,216.2 C214.32,216.2 214.35,216.15 214.35,216.15 C214.35,216.15 214.39,216.1 214.39,216.1 C214.39,216.1 214.43,216.05 214.43,216.05 C214.43,216.05 214.47,216 214.47,216 C214.47,216 214.51,215.96 214.51,215.96 C214.51,215.96 214.55,215.91 214.55,215.91 C214.55,215.91 214.59,215.86 214.59,215.86 C214.59,215.86 214.64,215.81 214.64,215.81 C214.64,215.81 214.68,215.77 214.68,215.77 C214.68,215.77 214.73,215.72 214.73,215.72 C214.73,215.72 214.77,215.68 214.77,215.68 C214.77,215.68 214.82,215.64 214.82,215.64 C214.82,215.64 214.86,215.59 214.86,215.59 C214.86,215.59 214.91,215.55 214.91,215.55 C214.91,215.55 214.96,215.51 214.96,215.51 C214.96,215.51 215,215.47 215,215.47 C215,215.47 215.05,215.43 215.05,215.43 C215.05,215.43 215.1,215.39 215.1,215.39 C215.1,215.39 215.15,215.35 215.15,215.35 C215.15,215.35 215.2,215.31 215.2,215.31 C215.2,215.31 215.25,215.28 215.25,215.28 C215.25,215.28 215.31,215.24 215.31,215.24 C215.31,215.24 215.36,215.21 215.36,215.21 C215.36,215.21 215.41,215.17 215.41,215.17 C215.41,215.17 215.46,215.14 215.46,215.14 C215.46,215.14 215.52,215.11 215.52,215.11 C215.52,215.11 215.57,215.08 215.57,215.08 C215.57,215.08 215.63,215.05 215.63,215.05 C215.63,215.05 215.68,215.02 215.68,215.02 C215.68,215.02 215.74,214.99 215.74,214.99 C215.74,214.99 215.79,214.96 215.79,214.96 C215.79,214.96 215.85,214.93 215.85,214.93 C215.85,214.93 215.91,214.9 215.91,214.9 C215.91,214.9 215.97,214.88 215.97,214.88 C215.97,214.88 216.02,214.86 216.02,214.86 C216.02,214.86 216.08,214.83 216.08,214.83 C216.08,214.83 216.14,214.81 216.14,214.81 C216.14,214.81 216.2,214.78 216.2,214.78 C216.2,214.78 216.26,214.77 216.26,214.77 C216.26,214.77 216.32,214.75 216.32,214.75 C216.32,214.75 216.38,214.73 216.38,214.73 C216.38,214.73 216.44,214.71 216.44,214.71 C216.44,214.71 216.5,214.69 216.5,214.69 C216.5,214.69 216.56,214.67 216.56,214.67 C216.56,214.67 216.62,214.66 216.62,214.66 C216.62,214.66 216.68,214.65 216.68,214.65 C216.68,214.65 216.74,214.63 216.74,214.63 C216.74,214.63 216.81,214.62 216.81,214.62 C216.81,214.62 216.87,214.61 216.87,214.61 C216.87,214.61 216.93,214.6 216.93,214.6 C216.93,214.6 216.99,214.59 216.99,214.59 C216.99,214.59 217.05,214.58 217.05,214.58 C217.05,214.58 217.12,214.57 217.12,214.57 C217.12,214.57 217.18,214.57 217.18,214.57 C217.18,214.57 217.24,214.56 217.24,214.56 C217.24,214.56 217.3,214.56 217.3,214.56 C217.3,214.56 217.37,214.56 217.37,214.56 C217.37,214.56 217.43,214.55 217.43,214.55 C217.43,214.55 217.49,214.55 217.49,214.55 C217.49,214.55 217.56,214.55 217.56,214.55 C217.56,214.55 217.62,214.55 217.62,214.55c " android:valueTo="M217.78 201.61 C217.78,201.61 218.06,201.63 218.06,201.63 C218.06,201.63 218.33,201.65 218.33,201.65 C218.33,201.65 218.6,201.68 218.6,201.68 C218.6,201.68 218.87,201.73 218.87,201.73 C218.87,201.73 219.14,201.78 219.14,201.78 C219.14,201.78 219.41,201.84 219.41,201.84 C219.41,201.84 219.67,201.93 219.67,201.93 C219.67,201.93 219.93,202.01 219.93,202.01 C219.93,202.01 220.19,202.09 220.19,202.09 C220.19,202.09 220.44,202.21 220.44,202.21 C220.44,202.21 220.69,202.32 220.69,202.32 C220.69,202.32 220.93,202.45 220.93,202.45 C220.93,202.45 221.17,202.58 221.17,202.58 C221.17,202.58 221.4,202.73 221.4,202.73 C221.4,202.73 221.62,202.88 221.62,202.88 C221.62,202.88 221.85,203.04 221.85,203.04 C221.85,203.04 222.06,203.22 222.06,203.22 C222.06,203.22 222.27,203.39 222.27,203.39 C222.27,203.39 222.46,203.59 222.46,203.59 C222.46,203.59 222.65,203.78 222.65,203.78 C222.65,203.78 222.83,203.99 222.83,203.99 C222.83,203.99 223.01,204.2 223.01,204.2 C223.01,204.2 223.18,204.41 223.18,204.41 C223.18,204.41 223.33,204.64 223.33,204.64 C223.33,204.64 223.48,204.87 223.48,204.87 C223.48,204.87 223.62,205.11 223.62,205.11 C223.62,205.11 223.75,205.34 223.75,205.34 C223.75,205.34 223.88,205.59 223.88,205.59 C223.88,205.59 224,205.83 224,205.83 C224,205.83 224.12,206.08 224.12,206.08 C224.12,206.08 224.24,206.32 224.24,206.32 C224.24,206.32 224.37,206.57 224.37,206.57 C224.37,206.57 224.49,206.81 224.49,206.81 C224.49,206.81 224.61,207.06 224.61,207.06 C224.61,207.06 224.73,207.3 224.73,207.3 C224.73,207.3 224.86,207.55 224.86,207.55 C224.86,207.55 224.98,207.79 224.98,207.79 C224.98,207.79 225.1,208.04 225.1,208.04 C225.1,208.04 225.22,208.28 225.22,208.28 C225.22,208.28 225.35,208.53 225.35,208.53 C225.35,208.53 225.47,208.77 225.47,208.77 C225.47,208.77 225.59,209.02 225.59,209.02 C225.59,209.02 225.71,209.26 225.71,209.26 C225.71,209.26 225.84,209.51 225.84,209.51 C225.84,209.51 225.96,209.75 225.96,209.75 C225.96,209.75 226.08,210 226.08,210 C226.08,210 226.2,210.24 226.2,210.24 C226.2,210.24 226.33,210.49 226.33,210.49 C226.33,210.49 226.45,210.73 226.45,210.73 C226.45,210.73 226.57,210.98 226.57,210.98 C226.57,210.98 226.69,211.22 226.69,211.22 C226.69,211.22 226.82,211.47 226.82,211.47 C226.82,211.47 226.94,211.71 226.94,211.71 C226.94,211.71 227.06,211.96 227.06,211.96 C227.06,211.96 227.18,212.2 227.18,212.2 C227.18,212.2 227.3,212.45 227.3,212.45 C227.3,212.45 227.43,212.69 227.43,212.69 C227.43,212.69 227.55,212.94 227.55,212.94 C227.55,212.94 227.67,213.18 227.67,213.18 C227.67,213.18 227.79,213.43 227.79,213.43 C227.79,213.43 227.92,213.67 227.92,213.67 C227.92,213.67 228.04,213.92 228.04,213.92 C228.04,213.92 228.16,214.16 228.16,214.16 C228.16,214.16 228.28,214.41 228.28,214.41 C228.28,214.41 228.41,214.65 228.41,214.65 C228.41,214.65 228.53,214.9 228.53,214.9 C228.53,214.9 228.65,215.14 228.65,215.14 C228.65,215.14 228.77,215.39 228.77,215.39 C228.77,215.39 228.9,215.63 228.9,215.63 C228.9,215.63 229.02,215.88 229.02,215.88 C229.02,215.88 229.14,216.12 229.14,216.12 C229.14,216.12 229.26,216.37 229.26,216.37 C229.26,216.37 229.39,216.61 229.39,216.61 C229.39,216.61 229.51,216.86 229.51,216.86 C229.51,216.86 229.63,217.1 229.63,217.1 C229.63,217.1 229.75,217.35 229.75,217.35 C229.75,217.35 229.87,217.59 229.87,217.59 C229.87,217.59 230,217.84 230,217.84 C230,217.84 230.12,218.08 230.12,218.08 C230.12,218.08 230.24,218.33 230.24,218.33 C230.24,218.33 230.36,218.57 230.36,218.57 C230.36,218.57 230.49,218.82 230.49,218.82 C230.49,218.82 230.61,219.06 230.61,219.06 C230.61,219.06 230.73,219.31 230.73,219.31 C230.73,219.31 230.85,219.55 230.85,219.55 C230.85,219.55 230.98,219.8 230.98,219.8 C230.98,219.8 231.1,220.04 231.1,220.04 C231.1,220.04 231.22,220.29 231.22,220.29 C231.22,220.29 231.34,220.53 231.34,220.53 C231.34,220.53 231.47,220.78 231.47,220.78 C231.47,220.78 231.59,221.02 231.59,221.02 C231.59,221.02 231.71,221.27 231.71,221.27 C231.71,221.27 231.83,221.51 231.83,221.51 C231.83,221.51 231.96,221.76 231.96,221.76 C231.96,221.76 232.08,222 232.08,222 C232.08,222 232.2,222.25 232.2,222.25 C232.2,222.25 232.32,222.49 232.32,222.49 C232.32,222.49 232.44,222.74 232.44,222.74 C232.44,222.74 232.57,222.98 232.57,222.98 C232.57,222.98 232.69,223.23 232.69,223.23 C232.69,223.23 232.81,223.47 232.81,223.47 C232.81,223.47 232.93,223.71 232.93,223.71 C232.93,223.71 233.06,223.96 233.06,223.96 C233.06,223.96 233.18,224.21 233.18,224.21 C233.18,224.21 233.3,224.45 233.3,224.45 C233.3,224.45 233.42,224.7 233.42,224.7 C233.42,224.7 233.55,224.94 233.55,224.94 C233.55,224.94 233.67,225.19 233.67,225.19 C233.67,225.19 233.79,225.43 233.79,225.43 C233.79,225.43 233.9,225.69 233.9,225.69 C233.9,225.69 234.01,225.94 234.01,225.94 C234.01,225.94 234.12,226.19 234.12,226.19 C234.12,226.19 234.2,226.45 234.2,226.45 C234.2,226.45 234.28,226.71 234.28,226.71 C234.28,226.71 234.35,226.98 234.35,226.98 C234.35,226.98 234.41,227.24 234.41,227.24 C234.41,227.24 234.47,227.51 234.47,227.51 C234.47,227.51 234.5,227.78 234.5,227.78 C234.5,227.78 234.52,228.06 234.52,228.06 C234.52,228.06 234.54,228.33 234.54,228.33 C234.54,228.33 234.54,228.6 234.54,228.6 C234.54,228.6 234.54,228.88 234.54,228.88 C234.54,228.88 234.52,229.15 234.52,229.15 C234.52,229.15 234.49,229.42 234.49,229.42 C234.49,229.42 234.45,229.69 234.45,229.69 C234.45,229.69 234.4,229.96 234.4,229.96 C234.4,229.96 234.34,230.23 234.34,230.23 C234.34,230.23 234.26,230.49 234.26,230.49 C234.26,230.49 234.18,230.75 234.18,230.75 C234.18,230.75 234.08,231.01 234.08,231.01 C234.08,231.01 233.98,231.26 233.98,231.26 C233.98,231.26 233.87,231.51 233.87,231.51 C233.87,231.51 233.74,231.75 233.74,231.75 C233.74,231.75 233.61,232 233.61,232 C233.61,232 233.46,232.23 233.46,232.23 C233.46,232.23 233.31,232.46 233.31,232.46 C233.31,232.46 233.16,232.68 233.16,232.68 C233.16,232.68 232.98,232.89 232.98,232.89 C232.98,232.89 232.81,233.11 232.81,233.11 C232.81,233.11 232.62,233.3 232.62,233.3 C232.62,233.3 232.44,233.5 232.44,233.5 C232.44,233.5 232.24,233.69 232.24,233.69 C232.24,233.69 232.03,233.87 232.03,233.87 C232.03,233.87 231.82,234.04 231.82,234.04 C231.82,234.04 231.6,234.2 231.6,234.2 C231.6,234.2 231.37,234.37 231.37,234.37 C231.37,234.37 231.14,234.51 231.14,234.51 C231.14,234.51 230.91,234.65 230.91,234.65 C230.91,234.65 230.66,234.78 230.66,234.78 C230.66,234.78 230.42,234.89 230.42,234.89 C230.42,234.89 230.17,235.01 230.17,235.01 C230.17,235.01 229.91,235.1 229.91,235.1 C229.91,235.1 229.65,235.19 229.65,235.19 C229.65,235.19 229.39,235.27 229.39,235.27 C229.39,235.27 229.12,235.33 229.12,235.33 C229.12,235.33 228.86,235.4 228.86,235.4 C228.86,235.4 228.59,235.44 228.59,235.44 C228.59,235.44 228.32,235.48 228.32,235.48 C228.32,235.48 228.04,235.49 228.04,235.49 C228.04,235.49 227.77,235.51 227.77,235.51 C227.77,235.51 227.5,235.51 227.5,235.51 C227.5,235.51 227.22,235.49 227.22,235.49 C227.22,235.49 226.95,235.48 226.95,235.48 C226.95,235.48 226.68,235.44 226.68,235.44 C226.68,235.44 226.41,235.4 226.41,235.4 C226.41,235.4 226.14,235.35 226.14,235.35 C226.14,235.35 225.87,235.27 225.87,235.27 C225.87,235.27 225.61,235.2 225.61,235.2 C225.61,235.2 225.35,235.12 225.35,235.12 C225.35,235.12 225.09,235.02 225.09,235.02 C225.09,235.02 224.84,234.92 224.84,234.92 C224.84,234.92 224.59,234.81 224.59,234.81 C224.59,234.81 224.34,234.7 224.34,234.7 C224.34,234.7 224.09,234.59 224.09,234.59 C224.09,234.59 223.84,234.48 223.84,234.48 C223.84,234.48 223.59,234.36 223.59,234.36 C223.59,234.36 223.34,234.25 223.34,234.25 C223.34,234.25 223.09,234.14 223.09,234.14 C223.09,234.14 222.84,234.02 222.84,234.02 C222.84,234.02 222.59,233.91 222.59,233.91 C222.59,233.91 222.34,233.8 222.34,233.8 C222.34,233.8 222.09,233.69 222.09,233.69 C222.09,233.69 221.84,233.58 221.84,233.58 C221.84,233.58 221.59,233.46 221.59,233.46 C221.59,233.46 221.34,233.35 221.34,233.35 C221.34,233.35 221.09,233.24 221.09,233.24 C221.09,233.24 220.84,233.13 220.84,233.13 C220.84,233.13 220.59,233.01 220.59,233.01 C220.59,233.01 220.34,232.9 220.34,232.9 C220.34,232.9 220.09,232.8 220.09,232.8 C220.09,232.8 219.83,232.71 219.83,232.71 C219.83,232.71 219.57,232.62 219.57,232.62 C219.57,232.62 219.3,232.56 219.3,232.56 C219.3,232.56 219.04,232.49 219.04,232.49 C219.04,232.49 218.77,232.44 218.77,232.44 C218.77,232.44 218.5,232.4 218.5,232.4 C218.5,232.4 218.23,232.37 218.23,232.37 C218.23,232.37 217.95,232.35 217.95,232.35 C217.95,232.35 217.68,232.34 217.68,232.34 C217.68,232.34 217.41,232.34 217.41,232.34 C217.41,232.34 217.13,232.36 217.13,232.36 C217.13,232.36 216.86,232.38 216.86,232.38 C216.86,232.38 216.59,232.42 216.59,232.42 C216.59,232.42 216.32,232.46 216.32,232.46 C216.32,232.46 216.05,232.51 216.05,232.51 C216.05,232.51 215.79,232.58 215.79,232.58 C215.79,232.58 215.52,232.66 215.52,232.66 C215.52,232.66 215.26,232.75 215.26,232.75 C215.26,232.75 215.01,232.84 215.01,232.84 C215.01,232.84 214.75,232.94 214.75,232.94 C214.75,232.94 214.5,233.06 214.5,233.06 C214.5,233.06 214.25,233.17 214.25,233.17 C214.25,233.17 214,233.28 214,233.28 C214,233.28 213.75,233.39 213.75,233.39 C213.75,233.39 213.5,233.51 213.5,233.51 C213.5,233.51 213.25,233.62 213.25,233.62 C213.25,233.62 213,233.73 213,233.73 C213,233.73 212.75,233.84 212.75,233.84 C212.75,233.84 212.5,233.96 212.5,233.96 C212.5,233.96 212.26,234.07 212.26,234.07 C212.26,234.07 212.01,234.18 212.01,234.18 C212.01,234.18 211.76,234.29 211.76,234.29 C211.76,234.29 211.51,234.4 211.51,234.4 C211.51,234.4 211.26,234.52 211.26,234.52 C211.26,234.52 211.01,234.63 211.01,234.63 C211.01,234.63 210.76,234.74 210.76,234.74 C210.76,234.74 210.51,234.86 210.51,234.86 C210.51,234.86 210.25,234.96 210.25,234.96 C210.25,234.96 210,235.06 210,235.06 C210,235.06 209.74,235.16 209.74,235.16 C209.74,235.16 209.48,235.23 209.48,235.23 C209.48,235.23 209.22,235.3 209.22,235.3 C209.22,235.3 208.95,235.37 208.95,235.37 C208.95,235.37 208.68,235.41 208.68,235.41 C208.68,235.41 208.41,235.46 208.41,235.46 C208.41,235.46 208.14,235.48 208.14,235.48 C208.14,235.48 207.86,235.5 207.86,235.5 C207.86,235.5 207.59,235.51 207.59,235.51 C207.59,235.51 207.32,235.5 207.32,235.5 C207.32,235.5 207.04,235.49 207.04,235.49 C207.04,235.49 206.77,235.46 206.77,235.46 C206.77,235.46 206.5,235.42 206.5,235.42 C206.5,235.42 206.23,235.38 206.23,235.38 C206.23,235.38 205.96,235.31 205.96,235.31 C205.96,235.31 205.7,235.24 205.7,235.24 C205.7,235.24 205.44,235.16 205.44,235.16 C205.44,235.16 205.18,235.06 205.18,235.06 C205.18,235.06 204.93,234.96 204.93,234.96 C204.93,234.96 204.68,234.85 204.68,234.85 C204.68,234.85 204.43,234.73 204.43,234.73 C204.43,234.73 204.19,234.59 204.19,234.59 C204.19,234.59 203.96,234.45 203.96,234.45 C203.96,234.45 203.73,234.3 203.73,234.3 C203.73,234.3 203.51,234.14 203.51,234.14 C203.51,234.14 203.29,233.98 203.29,233.98 C203.29,233.98 203.08,233.8 203.08,233.8 C203.08,233.8 202.88,233.62 202.88,233.62 C202.88,233.62 202.68,233.43 202.68,233.43 C202.68,233.43 202.49,233.23 202.49,233.23 C202.49,233.23 202.31,233.02 202.31,233.02 C202.31,233.02 202.14,232.81 202.14,232.81 C202.14,232.81 201.97,232.6 201.97,232.6 C201.97,232.6 201.82,232.37 201.82,232.37 C201.82,232.37 201.67,232.14 201.67,232.14 C201.67,232.14 201.53,231.9 201.53,231.9 C201.53,231.9 201.4,231.66 201.4,231.66 C201.4,231.66 201.28,231.42 201.28,231.42 C201.28,231.42 201.17,231.16 201.17,231.16 C201.17,231.16 201.07,230.91 201.07,230.91 C201.07,230.91 200.98,230.65 200.98,230.65 C200.98,230.65 200.9,230.39 200.9,230.39 C200.9,230.39 200.83,230.13 200.83,230.13 C200.83,230.13 200.77,229.86 200.77,229.86 C200.77,229.86 200.72,229.59 200.72,229.59 C200.72,229.59 200.69,229.32 200.69,229.32 C200.69,229.32 200.66,229.04 200.66,229.04 C200.66,229.04 200.65,228.77 200.65,228.77 C200.65,228.77 200.65,228.5 200.65,228.5 C200.65,228.5 200.65,228.22 200.65,228.22 C200.65,228.22 200.68,227.95 200.68,227.95 C200.68,227.95 200.7,227.68 200.7,227.68 C200.7,227.68 200.75,227.41 200.75,227.41 C200.75,227.41 200.8,227.14 200.8,227.14 C200.8,227.14 200.86,226.87 200.86,226.87 C200.86,226.87 200.94,226.61 200.94,226.61 C200.94,226.61 201.02,226.35 201.02,226.35 C201.02,226.35 201.11,226.09 201.11,226.09 C201.11,226.09 201.22,225.84 201.22,225.84 C201.22,225.84 201.33,225.59 201.33,225.59 C201.33,225.59 201.44,225.34 201.44,225.34 C201.44,225.34 201.57,225.1 201.57,225.1 C201.57,225.1 201.69,224.85 201.69,224.85 C201.69,224.85 201.81,224.61 201.81,224.61 C201.81,224.61 201.93,224.36 201.93,224.36 C201.93,224.36 202.06,224.12 202.06,224.12 C202.06,224.12 202.18,223.87 202.18,223.87 C202.18,223.87 202.3,223.63 202.3,223.63 C202.3,223.63 202.42,223.38 202.42,223.38 C202.42,223.38 202.55,223.14 202.55,223.14 C202.55,223.14 202.67,222.89 202.67,222.89 C202.67,222.89 202.79,222.65 202.79,222.65 C202.79,222.65 202.91,222.4 202.91,222.4 C202.91,222.4 203.04,222.16 203.04,222.16 C203.04,222.16 203.16,221.91 203.16,221.91 C203.16,221.91 203.28,221.67 203.28,221.67 C203.28,221.67 203.4,221.42 203.4,221.42 C203.4,221.42 203.52,221.18 203.52,221.18 C203.52,221.18 203.65,220.93 203.65,220.93 C203.65,220.93 203.77,220.69 203.77,220.69 C203.77,220.69 203.89,220.44 203.89,220.44 C203.89,220.44 204.01,220.2 204.01,220.2 C204.01,220.2 204.14,219.95 204.14,219.95 C204.14,219.95 204.26,219.71 204.26,219.71 C204.26,219.71 204.38,219.46 204.38,219.46 C204.38,219.46 204.5,219.22 204.5,219.22 C204.5,219.22 204.63,218.97 204.63,218.97 C204.63,218.97 204.75,218.73 204.75,218.73 C204.75,218.73 204.87,218.48 204.87,218.48 C204.87,218.48 204.99,218.24 204.99,218.24 C204.99,218.24 205.12,217.99 205.12,217.99 C205.12,217.99 205.24,217.75 205.24,217.75 C205.24,217.75 205.36,217.5 205.36,217.5 C205.36,217.5 205.48,217.26 205.48,217.26 C205.48,217.26 205.61,217.01 205.61,217.01 C205.61,217.01 205.73,216.77 205.73,216.77 C205.73,216.77 205.85,216.52 205.85,216.52 C205.85,216.52 205.97,216.28 205.97,216.28 C205.97,216.28 206.09,216.03 206.09,216.03 C206.09,216.03 206.22,215.79 206.22,215.79 C206.22,215.79 206.34,215.54 206.34,215.54 C206.34,215.54 206.46,215.3 206.46,215.3 C206.46,215.3 206.58,215.05 206.58,215.05 C206.58,215.05 206.71,214.81 206.71,214.81 C206.71,214.81 206.83,214.56 206.83,214.56 C206.83,214.56 206.95,214.32 206.95,214.32 C206.95,214.32 207.07,214.07 207.07,214.07 C207.07,214.07 207.2,213.83 207.2,213.83 C207.2,213.83 207.32,213.58 207.32,213.58 C207.32,213.58 207.44,213.34 207.44,213.34 C207.44,213.34 207.56,213.09 207.56,213.09 C207.56,213.09 207.69,212.85 207.69,212.85 C207.69,212.85 207.81,212.6 207.81,212.6 C207.81,212.6 207.93,212.36 207.93,212.36 C207.93,212.36 208.05,212.11 208.05,212.11 C208.05,212.11 208.18,211.87 208.18,211.87 C208.18,211.87 208.3,211.62 208.3,211.62 C208.3,211.62 208.42,211.38 208.42,211.38 C208.42,211.38 208.54,211.13 208.54,211.13 C208.54,211.13 208.66,210.89 208.66,210.89 C208.66,210.89 208.79,210.64 208.79,210.64 C208.79,210.64 208.91,210.4 208.91,210.4 C208.91,210.4 209.03,210.15 209.03,210.15 C209.03,210.15 209.15,209.91 209.15,209.91 C209.15,209.91 209.28,209.66 209.28,209.66 C209.28,209.66 209.4,209.42 209.4,209.42 C209.4,209.42 209.52,209.17 209.52,209.17 C209.52,209.17 209.64,208.93 209.64,208.93 C209.64,208.93 209.77,208.68 209.77,208.68 C209.77,208.68 209.89,208.44 209.89,208.44 C209.89,208.44 210.01,208.19 210.01,208.19 C210.01,208.19 210.13,207.95 210.13,207.95 C210.13,207.95 210.26,207.7 210.26,207.7 C210.26,207.7 210.38,207.46 210.38,207.46 C210.38,207.46 210.5,207.21 210.5,207.21 C210.5,207.21 210.62,206.97 210.62,206.97 C210.62,206.97 210.75,206.72 210.75,206.72 C210.75,206.72 210.87,206.48 210.87,206.48 C210.87,206.48 210.99,206.23 210.99,206.23 C210.99,206.23 211.11,205.99 211.11,205.99 C211.11,205.99 211.24,205.74 211.24,205.74 C211.24,205.74 211.36,205.5 211.36,205.5 C211.36,205.5 211.49,205.26 211.49,205.26 C211.49,205.26 211.62,205.02 211.62,205.02 C211.62,205.02 211.76,204.78 211.76,204.78 C211.76,204.78 211.92,204.56 211.92,204.56 C211.92,204.56 212.07,204.33 212.07,204.33 C212.07,204.33 212.25,204.12 212.25,204.12 C212.25,204.12 212.42,203.91 212.42,203.91 C212.42,203.91 212.61,203.71 212.61,203.71 C212.61,203.71 212.8,203.52 212.8,203.52 C212.8,203.52 213,203.33 213,203.33 C213,203.33 213.21,203.15 213.21,203.15 C213.21,203.15 213.42,202.98 213.42,202.98 C213.42,202.98 213.65,202.82 213.65,202.82 C213.65,202.82 213.87,202.67 213.87,202.67 C213.87,202.67 214.11,202.53 214.11,202.53 C214.11,202.53 214.35,202.4 214.35,202.4 C214.35,202.4 214.6,202.28 214.6,202.28 C214.6,202.28 214.85,202.16 214.85,202.16 C214.85,202.16 215.1,202.06 215.1,202.06 C215.1,202.06 215.36,201.98 215.36,201.98 C215.36,201.98 215.62,201.89 215.62,201.89 C215.62,201.89 215.88,201.81 215.88,201.81 C215.88,201.81 216.15,201.76 216.15,201.76 C216.15,201.76 216.42,201.71 216.42,201.71 C216.42,201.71 216.69,201.66 216.69,201.66 C216.69,201.66 216.96,201.64 216.96,201.64 C216.96,201.64 217.24,201.62 217.24,201.62 C217.24,201.62 217.51,201.61 217.51,201.61 C217.51,201.61 217.78,201.61 217.78,201.61c " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="pathData" android:duration="283" android:startOffset="67" android:valueFrom="M217.78 201.61 C217.78,201.61 218.06,201.63 218.06,201.63 C218.06,201.63 218.33,201.65 218.33,201.65 C218.33,201.65 218.6,201.68 218.6,201.68 C218.6,201.68 218.87,201.73 218.87,201.73 C218.87,201.73 219.14,201.78 219.14,201.78 C219.14,201.78 219.41,201.84 219.41,201.84 C219.41,201.84 219.67,201.93 219.67,201.93 C219.67,201.93 219.93,202.01 219.93,202.01 C219.93,202.01 220.19,202.09 220.19,202.09 C220.19,202.09 220.44,202.21 220.44,202.21 C220.44,202.21 220.69,202.32 220.69,202.32 C220.69,202.32 220.93,202.45 220.93,202.45 C220.93,202.45 221.17,202.58 221.17,202.58 C221.17,202.58 221.4,202.73 221.4,202.73 C221.4,202.73 221.62,202.88 221.62,202.88 C221.62,202.88 221.85,203.04 221.85,203.04 C221.85,203.04 222.06,203.22 222.06,203.22 C222.06,203.22 222.27,203.39 222.27,203.39 C222.27,203.39 222.46,203.59 222.46,203.59 C222.46,203.59 222.65,203.78 222.65,203.78 C222.65,203.78 222.83,203.99 222.83,203.99 C222.83,203.99 223.01,204.2 223.01,204.2 C223.01,204.2 223.18,204.41 223.18,204.41 C223.18,204.41 223.33,204.64 223.33,204.64 C223.33,204.64 223.48,204.87 223.48,204.87 C223.48,204.87 223.62,205.11 223.62,205.11 C223.62,205.11 223.75,205.34 223.75,205.34 C223.75,205.34 223.88,205.59 223.88,205.59 C223.88,205.59 224,205.83 224,205.83 C224,205.83 224.12,206.08 224.12,206.08 C224.12,206.08 224.24,206.32 224.24,206.32 C224.24,206.32 224.37,206.57 224.37,206.57 C224.37,206.57 224.49,206.81 224.49,206.81 C224.49,206.81 224.61,207.06 224.61,207.06 C224.61,207.06 224.73,207.3 224.73,207.3 C224.73,207.3 224.86,207.55 224.86,207.55 C224.86,207.55 224.98,207.79 224.98,207.79 C224.98,207.79 225.1,208.04 225.1,208.04 C225.1,208.04 225.22,208.28 225.22,208.28 C225.22,208.28 225.35,208.53 225.35,208.53 C225.35,208.53 225.47,208.77 225.47,208.77 C225.47,208.77 225.59,209.02 225.59,209.02 C225.59,209.02 225.71,209.26 225.71,209.26 C225.71,209.26 225.84,209.51 225.84,209.51 C225.84,209.51 225.96,209.75 225.96,209.75 C225.96,209.75 226.08,210 226.08,210 C226.08,210 226.2,210.24 226.2,210.24 C226.2,210.24 226.33,210.49 226.33,210.49 C226.33,210.49 226.45,210.73 226.45,210.73 C226.45,210.73 226.57,210.98 226.57,210.98 C226.57,210.98 226.69,211.22 226.69,211.22 C226.69,211.22 226.82,211.47 226.82,211.47 C226.82,211.47 226.94,211.71 226.94,211.71 C226.94,211.71 227.06,211.96 227.06,211.96 C227.06,211.96 227.18,212.2 227.18,212.2 C227.18,212.2 227.3,212.45 227.3,212.45 C227.3,212.45 227.43,212.69 227.43,212.69 C227.43,212.69 227.55,212.94 227.55,212.94 C227.55,212.94 227.67,213.18 227.67,213.18 C227.67,213.18 227.79,213.43 227.79,213.43 C227.79,213.43 227.92,213.67 227.92,213.67 C227.92,213.67 228.04,213.92 228.04,213.92 C228.04,213.92 228.16,214.16 228.16,214.16 C228.16,214.16 228.28,214.41 228.28,214.41 C228.28,214.41 228.41,214.65 228.41,214.65 C228.41,214.65 228.53,214.9 228.53,214.9 C228.53,214.9 228.65,215.14 228.65,215.14 C228.65,215.14 228.77,215.39 228.77,215.39 C228.77,215.39 228.9,215.63 228.9,215.63 C228.9,215.63 229.02,215.88 229.02,215.88 C229.02,215.88 229.14,216.12 229.14,216.12 C229.14,216.12 229.26,216.37 229.26,216.37 C229.26,216.37 229.39,216.61 229.39,216.61 C229.39,216.61 229.51,216.86 229.51,216.86 C229.51,216.86 229.63,217.1 229.63,217.1 C229.63,217.1 229.75,217.35 229.75,217.35 C229.75,217.35 229.87,217.59 229.87,217.59 C229.87,217.59 230,217.84 230,217.84 C230,217.84 230.12,218.08 230.12,218.08 C230.12,218.08 230.24,218.33 230.24,218.33 C230.24,218.33 230.36,218.57 230.36,218.57 C230.36,218.57 230.49,218.82 230.49,218.82 C230.49,218.82 230.61,219.06 230.61,219.06 C230.61,219.06 230.73,219.31 230.73,219.31 C230.73,219.31 230.85,219.55 230.85,219.55 C230.85,219.55 230.98,219.8 230.98,219.8 C230.98,219.8 231.1,220.04 231.1,220.04 C231.1,220.04 231.22,220.29 231.22,220.29 C231.22,220.29 231.34,220.53 231.34,220.53 C231.34,220.53 231.47,220.78 231.47,220.78 C231.47,220.78 231.59,221.02 231.59,221.02 C231.59,221.02 231.71,221.27 231.71,221.27 C231.71,221.27 231.83,221.51 231.83,221.51 C231.83,221.51 231.96,221.76 231.96,221.76 C231.96,221.76 232.08,222 232.08,222 C232.08,222 232.2,222.25 232.2,222.25 C232.2,222.25 232.32,222.49 232.32,222.49 C232.32,222.49 232.44,222.74 232.44,222.74 C232.44,222.74 232.57,222.98 232.57,222.98 C232.57,222.98 232.69,223.23 232.69,223.23 C232.69,223.23 232.81,223.47 232.81,223.47 C232.81,223.47 232.93,223.71 232.93,223.71 C232.93,223.71 233.06,223.96 233.06,223.96 C233.06,223.96 233.18,224.21 233.18,224.21 C233.18,224.21 233.3,224.45 233.3,224.45 C233.3,224.45 233.42,224.7 233.42,224.7 C233.42,224.7 233.55,224.94 233.55,224.94 C233.55,224.94 233.67,225.19 233.67,225.19 C233.67,225.19 233.79,225.43 233.79,225.43 C233.79,225.43 233.9,225.69 233.9,225.69 C233.9,225.69 234.01,225.94 234.01,225.94 C234.01,225.94 234.12,226.19 234.12,226.19 C234.12,226.19 234.2,226.45 234.2,226.45 C234.2,226.45 234.28,226.71 234.28,226.71 C234.28,226.71 234.35,226.98 234.35,226.98 C234.35,226.98 234.41,227.24 234.41,227.24 C234.41,227.24 234.47,227.51 234.47,227.51 C234.47,227.51 234.5,227.78 234.5,227.78 C234.5,227.78 234.52,228.06 234.52,228.06 C234.52,228.06 234.54,228.33 234.54,228.33 C234.54,228.33 234.54,228.6 234.54,228.6 C234.54,228.6 234.54,228.88 234.54,228.88 C234.54,228.88 234.52,229.15 234.52,229.15 C234.52,229.15 234.49,229.42 234.49,229.42 C234.49,229.42 234.45,229.69 234.45,229.69 C234.45,229.69 234.4,229.96 234.4,229.96 C234.4,229.96 234.34,230.23 234.34,230.23 C234.34,230.23 234.26,230.49 234.26,230.49 C234.26,230.49 234.18,230.75 234.18,230.75 C234.18,230.75 234.08,231.01 234.08,231.01 C234.08,231.01 233.98,231.26 233.98,231.26 C233.98,231.26 233.87,231.51 233.87,231.51 C233.87,231.51 233.74,231.75 233.74,231.75 C233.74,231.75 233.61,232 233.61,232 C233.61,232 233.46,232.23 233.46,232.23 C233.46,232.23 233.31,232.46 233.31,232.46 C233.31,232.46 233.16,232.68 233.16,232.68 C233.16,232.68 232.98,232.89 232.98,232.89 C232.98,232.89 232.81,233.11 232.81,233.11 C232.81,233.11 232.62,233.3 232.62,233.3 C232.62,233.3 232.44,233.5 232.44,233.5 C232.44,233.5 232.24,233.69 232.24,233.69 C232.24,233.69 232.03,233.87 232.03,233.87 C232.03,233.87 231.82,234.04 231.82,234.04 C231.82,234.04 231.6,234.2 231.6,234.2 C231.6,234.2 231.37,234.37 231.37,234.37 C231.37,234.37 231.14,234.51 231.14,234.51 C231.14,234.51 230.91,234.65 230.91,234.65 C230.91,234.65 230.66,234.78 230.66,234.78 C230.66,234.78 230.42,234.89 230.42,234.89 C230.42,234.89 230.17,235.01 230.17,235.01 C230.17,235.01 229.91,235.1 229.91,235.1 C229.91,235.1 229.65,235.19 229.65,235.19 C229.65,235.19 229.39,235.27 229.39,235.27 C229.39,235.27 229.12,235.33 229.12,235.33 C229.12,235.33 228.86,235.4 228.86,235.4 C228.86,235.4 228.59,235.44 228.59,235.44 C228.59,235.44 228.32,235.48 228.32,235.48 C228.32,235.48 228.04,235.49 228.04,235.49 C228.04,235.49 227.77,235.51 227.77,235.51 C227.77,235.51 227.5,235.51 227.5,235.51 C227.5,235.51 227.22,235.49 227.22,235.49 C227.22,235.49 226.95,235.48 226.95,235.48 C226.95,235.48 226.68,235.44 226.68,235.44 C226.68,235.44 226.41,235.4 226.41,235.4 C226.41,235.4 226.14,235.35 226.14,235.35 C226.14,235.35 225.87,235.27 225.87,235.27 C225.87,235.27 225.61,235.2 225.61,235.2 C225.61,235.2 225.35,235.12 225.35,235.12 C225.35,235.12 225.09,235.02 225.09,235.02 C225.09,235.02 224.84,234.92 224.84,234.92 C224.84,234.92 224.59,234.81 224.59,234.81 C224.59,234.81 224.34,234.7 224.34,234.7 C224.34,234.7 224.09,234.59 224.09,234.59 C224.09,234.59 223.84,234.48 223.84,234.48 C223.84,234.48 223.59,234.36 223.59,234.36 C223.59,234.36 223.34,234.25 223.34,234.25 C223.34,234.25 223.09,234.14 223.09,234.14 C223.09,234.14 222.84,234.02 222.84,234.02 C222.84,234.02 222.59,233.91 222.59,233.91 C222.59,233.91 222.34,233.8 222.34,233.8 C222.34,233.8 222.09,233.69 222.09,233.69 C222.09,233.69 221.84,233.58 221.84,233.58 C221.84,233.58 221.59,233.46 221.59,233.46 C221.59,233.46 221.34,233.35 221.34,233.35 C221.34,233.35 221.09,233.24 221.09,233.24 C221.09,233.24 220.84,233.13 220.84,233.13 C220.84,233.13 220.59,233.01 220.59,233.01 C220.59,233.01 220.34,232.9 220.34,232.9 C220.34,232.9 220.09,232.8 220.09,232.8 C220.09,232.8 219.83,232.71 219.83,232.71 C219.83,232.71 219.57,232.62 219.57,232.62 C219.57,232.62 219.3,232.56 219.3,232.56 C219.3,232.56 219.04,232.49 219.04,232.49 C219.04,232.49 218.77,232.44 218.77,232.44 C218.77,232.44 218.5,232.4 218.5,232.4 C218.5,232.4 218.23,232.37 218.23,232.37 C218.23,232.37 217.95,232.35 217.95,232.35 C217.95,232.35 217.68,232.34 217.68,232.34 C217.68,232.34 217.41,232.34 217.41,232.34 C217.41,232.34 217.13,232.36 217.13,232.36 C217.13,232.36 216.86,232.38 216.86,232.38 C216.86,232.38 216.59,232.42 216.59,232.42 C216.59,232.42 216.32,232.46 216.32,232.46 C216.32,232.46 216.05,232.51 216.05,232.51 C216.05,232.51 215.79,232.58 215.79,232.58 C215.79,232.58 215.52,232.66 215.52,232.66 C215.52,232.66 215.26,232.75 215.26,232.75 C215.26,232.75 215.01,232.84 215.01,232.84 C215.01,232.84 214.75,232.94 214.75,232.94 C214.75,232.94 214.5,233.06 214.5,233.06 C214.5,233.06 214.25,233.17 214.25,233.17 C214.25,233.17 214,233.28 214,233.28 C214,233.28 213.75,233.39 213.75,233.39 C213.75,233.39 213.5,233.51 213.5,233.51 C213.5,233.51 213.25,233.62 213.25,233.62 C213.25,233.62 213,233.73 213,233.73 C213,233.73 212.75,233.84 212.75,233.84 C212.75,233.84 212.5,233.96 212.5,233.96 C212.5,233.96 212.26,234.07 212.26,234.07 C212.26,234.07 212.01,234.18 212.01,234.18 C212.01,234.18 211.76,234.29 211.76,234.29 C211.76,234.29 211.51,234.4 211.51,234.4 C211.51,234.4 211.26,234.52 211.26,234.52 C211.26,234.52 211.01,234.63 211.01,234.63 C211.01,234.63 210.76,234.74 210.76,234.74 C210.76,234.74 210.51,234.86 210.51,234.86 C210.51,234.86 210.25,234.96 210.25,234.96 C210.25,234.96 210,235.06 210,235.06 C210,235.06 209.74,235.16 209.74,235.16 C209.74,235.16 209.48,235.23 209.48,235.23 C209.48,235.23 209.22,235.3 209.22,235.3 C209.22,235.3 208.95,235.37 208.95,235.37 C208.95,235.37 208.68,235.41 208.68,235.41 C208.68,235.41 208.41,235.46 208.41,235.46 C208.41,235.46 208.14,235.48 208.14,235.48 C208.14,235.48 207.86,235.5 207.86,235.5 C207.86,235.5 207.59,235.51 207.59,235.51 C207.59,235.51 207.32,235.5 207.32,235.5 C207.32,235.5 207.04,235.49 207.04,235.49 C207.04,235.49 206.77,235.46 206.77,235.46 C206.77,235.46 206.5,235.42 206.5,235.42 C206.5,235.42 206.23,235.38 206.23,235.38 C206.23,235.38 205.96,235.31 205.96,235.31 C205.96,235.31 205.7,235.24 205.7,235.24 C205.7,235.24 205.44,235.16 205.44,235.16 C205.44,235.16 205.18,235.06 205.18,235.06 C205.18,235.06 204.93,234.96 204.93,234.96 C204.93,234.96 204.68,234.85 204.68,234.85 C204.68,234.85 204.43,234.73 204.43,234.73 C204.43,234.73 204.19,234.59 204.19,234.59 C204.19,234.59 203.96,234.45 203.96,234.45 C203.96,234.45 203.73,234.3 203.73,234.3 C203.73,234.3 203.51,234.14 203.51,234.14 C203.51,234.14 203.29,233.98 203.29,233.98 C203.29,233.98 203.08,233.8 203.08,233.8 C203.08,233.8 202.88,233.62 202.88,233.62 C202.88,233.62 202.68,233.43 202.68,233.43 C202.68,233.43 202.49,233.23 202.49,233.23 C202.49,233.23 202.31,233.02 202.31,233.02 C202.31,233.02 202.14,232.81 202.14,232.81 C202.14,232.81 201.97,232.6 201.97,232.6 C201.97,232.6 201.82,232.37 201.82,232.37 C201.82,232.37 201.67,232.14 201.67,232.14 C201.67,232.14 201.53,231.9 201.53,231.9 C201.53,231.9 201.4,231.66 201.4,231.66 C201.4,231.66 201.28,231.42 201.28,231.42 C201.28,231.42 201.17,231.16 201.17,231.16 C201.17,231.16 201.07,230.91 201.07,230.91 C201.07,230.91 200.98,230.65 200.98,230.65 C200.98,230.65 200.9,230.39 200.9,230.39 C200.9,230.39 200.83,230.13 200.83,230.13 C200.83,230.13 200.77,229.86 200.77,229.86 C200.77,229.86 200.72,229.59 200.72,229.59 C200.72,229.59 200.69,229.32 200.69,229.32 C200.69,229.32 200.66,229.04 200.66,229.04 C200.66,229.04 200.65,228.77 200.65,228.77 C200.65,228.77 200.65,228.5 200.65,228.5 C200.65,228.5 200.65,228.22 200.65,228.22 C200.65,228.22 200.68,227.95 200.68,227.95 C200.68,227.95 200.7,227.68 200.7,227.68 C200.7,227.68 200.75,227.41 200.75,227.41 C200.75,227.41 200.8,227.14 200.8,227.14 C200.8,227.14 200.86,226.87 200.86,226.87 C200.86,226.87 200.94,226.61 200.94,226.61 C200.94,226.61 201.02,226.35 201.02,226.35 C201.02,226.35 201.11,226.09 201.11,226.09 C201.11,226.09 201.22,225.84 201.22,225.84 C201.22,225.84 201.33,225.59 201.33,225.59 C201.33,225.59 201.44,225.34 201.44,225.34 C201.44,225.34 201.57,225.1 201.57,225.1 C201.57,225.1 201.69,224.85 201.69,224.85 C201.69,224.85 201.81,224.61 201.81,224.61 C201.81,224.61 201.93,224.36 201.93,224.36 C201.93,224.36 202.06,224.12 202.06,224.12 C202.06,224.12 202.18,223.87 202.18,223.87 C202.18,223.87 202.3,223.63 202.3,223.63 C202.3,223.63 202.42,223.38 202.42,223.38 C202.42,223.38 202.55,223.14 202.55,223.14 C202.55,223.14 202.67,222.89 202.67,222.89 C202.67,222.89 202.79,222.65 202.79,222.65 C202.79,222.65 202.91,222.4 202.91,222.4 C202.91,222.4 203.04,222.16 203.04,222.16 C203.04,222.16 203.16,221.91 203.16,221.91 C203.16,221.91 203.28,221.67 203.28,221.67 C203.28,221.67 203.4,221.42 203.4,221.42 C203.4,221.42 203.52,221.18 203.52,221.18 C203.52,221.18 203.65,220.93 203.65,220.93 C203.65,220.93 203.77,220.69 203.77,220.69 C203.77,220.69 203.89,220.44 203.89,220.44 C203.89,220.44 204.01,220.2 204.01,220.2 C204.01,220.2 204.14,219.95 204.14,219.95 C204.14,219.95 204.26,219.71 204.26,219.71 C204.26,219.71 204.38,219.46 204.38,219.46 C204.38,219.46 204.5,219.22 204.5,219.22 C204.5,219.22 204.63,218.97 204.63,218.97 C204.63,218.97 204.75,218.73 204.75,218.73 C204.75,218.73 204.87,218.48 204.87,218.48 C204.87,218.48 204.99,218.24 204.99,218.24 C204.99,218.24 205.12,217.99 205.12,217.99 C205.12,217.99 205.24,217.75 205.24,217.75 C205.24,217.75 205.36,217.5 205.36,217.5 C205.36,217.5 205.48,217.26 205.48,217.26 C205.48,217.26 205.61,217.01 205.61,217.01 C205.61,217.01 205.73,216.77 205.73,216.77 C205.73,216.77 205.85,216.52 205.85,216.52 C205.85,216.52 205.97,216.28 205.97,216.28 C205.97,216.28 206.09,216.03 206.09,216.03 C206.09,216.03 206.22,215.79 206.22,215.79 C206.22,215.79 206.34,215.54 206.34,215.54 C206.34,215.54 206.46,215.3 206.46,215.3 C206.46,215.3 206.58,215.05 206.58,215.05 C206.58,215.05 206.71,214.81 206.71,214.81 C206.71,214.81 206.83,214.56 206.83,214.56 C206.83,214.56 206.95,214.32 206.95,214.32 C206.95,214.32 207.07,214.07 207.07,214.07 C207.07,214.07 207.2,213.83 207.2,213.83 C207.2,213.83 207.32,213.58 207.32,213.58 C207.32,213.58 207.44,213.34 207.44,213.34 C207.44,213.34 207.56,213.09 207.56,213.09 C207.56,213.09 207.69,212.85 207.69,212.85 C207.69,212.85 207.81,212.6 207.81,212.6 C207.81,212.6 207.93,212.36 207.93,212.36 C207.93,212.36 208.05,212.11 208.05,212.11 C208.05,212.11 208.18,211.87 208.18,211.87 C208.18,211.87 208.3,211.62 208.3,211.62 C208.3,211.62 208.42,211.38 208.42,211.38 C208.42,211.38 208.54,211.13 208.54,211.13 C208.54,211.13 208.66,210.89 208.66,210.89 C208.66,210.89 208.79,210.64 208.79,210.64 C208.79,210.64 208.91,210.4 208.91,210.4 C208.91,210.4 209.03,210.15 209.03,210.15 C209.03,210.15 209.15,209.91 209.15,209.91 C209.15,209.91 209.28,209.66 209.28,209.66 C209.28,209.66 209.4,209.42 209.4,209.42 C209.4,209.42 209.52,209.17 209.52,209.17 C209.52,209.17 209.64,208.93 209.64,208.93 C209.64,208.93 209.77,208.68 209.77,208.68 C209.77,208.68 209.89,208.44 209.89,208.44 C209.89,208.44 210.01,208.19 210.01,208.19 C210.01,208.19 210.13,207.95 210.13,207.95 C210.13,207.95 210.26,207.7 210.26,207.7 C210.26,207.7 210.38,207.46 210.38,207.46 C210.38,207.46 210.5,207.21 210.5,207.21 C210.5,207.21 210.62,206.97 210.62,206.97 C210.62,206.97 210.75,206.72 210.75,206.72 C210.75,206.72 210.87,206.48 210.87,206.48 C210.87,206.48 210.99,206.23 210.99,206.23 C210.99,206.23 211.11,205.99 211.11,205.99 C211.11,205.99 211.24,205.74 211.24,205.74 C211.24,205.74 211.36,205.5 211.36,205.5 C211.36,205.5 211.49,205.26 211.49,205.26 C211.49,205.26 211.62,205.02 211.62,205.02 C211.62,205.02 211.76,204.78 211.76,204.78 C211.76,204.78 211.92,204.56 211.92,204.56 C211.92,204.56 212.07,204.33 212.07,204.33 C212.07,204.33 212.25,204.12 212.25,204.12 C212.25,204.12 212.42,203.91 212.42,203.91 C212.42,203.91 212.61,203.71 212.61,203.71 C212.61,203.71 212.8,203.52 212.8,203.52 C212.8,203.52 213,203.33 213,203.33 C213,203.33 213.21,203.15 213.21,203.15 C213.21,203.15 213.42,202.98 213.42,202.98 C213.42,202.98 213.65,202.82 213.65,202.82 C213.65,202.82 213.87,202.67 213.87,202.67 C213.87,202.67 214.11,202.53 214.11,202.53 C214.11,202.53 214.35,202.4 214.35,202.4 C214.35,202.4 214.6,202.28 214.6,202.28 C214.6,202.28 214.85,202.16 214.85,202.16 C214.85,202.16 215.1,202.06 215.1,202.06 C215.1,202.06 215.36,201.98 215.36,201.98 C215.36,201.98 215.62,201.89 215.62,201.89 C215.62,201.89 215.88,201.81 215.88,201.81 C215.88,201.81 216.15,201.76 216.15,201.76 C216.15,201.76 216.42,201.71 216.42,201.71 C216.42,201.71 216.69,201.66 216.69,201.66 C216.69,201.66 216.96,201.64 216.96,201.64 C216.96,201.64 217.24,201.62 217.24,201.62 C217.24,201.62 217.51,201.61 217.51,201.61 C217.51,201.61 217.78,201.61 217.78,201.61c " android:valueTo="M217.68 210.56 C217.68,210.56 217.81,210.57 217.81,210.57 C217.81,210.57 217.93,210.57 217.93,210.57 C217.93,210.57 218.06,210.58 218.06,210.58 C218.06,210.58 218.18,210.59 218.18,210.59 C218.18,210.59 218.31,210.59 218.31,210.59 C218.31,210.59 218.43,210.61 218.43,210.61 C218.43,210.61 218.56,210.63 218.56,210.63 C218.56,210.63 218.68,210.64 218.68,210.64 C218.68,210.64 218.81,210.66 218.81,210.66 C218.81,210.66 218.93,210.68 218.93,210.68 C218.93,210.68 219.05,210.7 219.05,210.7 C219.05,210.7 219.18,210.72 219.18,210.72 C219.18,210.72 219.3,210.75 219.3,210.75 C219.3,210.75 219.42,210.78 219.42,210.78 C219.42,210.78 219.54,210.81 219.54,210.81 C219.54,210.81 219.66,210.84 219.66,210.84 C219.66,210.84 219.79,210.87 219.79,210.87 C219.79,210.87 219.91,210.91 219.91,210.91 C219.91,210.91 220.03,210.95 220.03,210.95 C220.03,210.95 220.14,210.99 220.14,210.99 C220.14,210.99 220.26,211.04 220.26,211.04 C220.26,211.04 220.38,211.08 220.38,211.08 C220.38,211.08 220.5,211.12 220.5,211.12 C220.5,211.12 220.62,211.17 220.62,211.17 C220.62,211.17 220.73,211.22 220.73,211.22 C220.73,211.22 220.84,211.27 220.84,211.27 C220.84,211.27 220.96,211.32 220.96,211.32 C220.96,211.32 221.07,211.38 221.07,211.38 C221.07,211.38 221.19,211.43 221.19,211.43 C221.19,211.43 221.3,211.49 221.3,211.49 C221.3,211.49 221.41,211.55 221.41,211.55 C221.41,211.55 221.51,211.61 221.51,211.61 C221.51,211.61 221.62,211.68 221.62,211.68 C221.62,211.68 221.73,211.74 221.73,211.74 C221.73,211.74 221.84,211.8 221.84,211.8 C221.84,211.8 221.94,211.87 221.94,211.87 C221.94,211.87 222.05,211.94 222.05,211.94 C222.05,211.94 222.15,212.02 222.15,212.02 C222.15,212.02 222.25,212.09 222.25,212.09 C222.25,212.09 222.35,212.16 222.35,212.16 C222.35,212.16 222.46,212.23 222.46,212.23 C222.46,212.23 222.55,212.31 222.55,212.31 C222.55,212.31 222.65,212.4 222.65,212.4 C222.65,212.4 222.74,212.48 222.74,212.48 C222.74,212.48 222.84,212.56 222.84,212.56 C222.84,212.56 222.93,212.64 222.93,212.64 C222.93,212.64 223.03,212.72 223.03,212.72 C223.03,212.72 223.12,212.81 223.12,212.81 C223.12,212.81 223.21,212.9 223.21,212.9 C223.21,212.9 223.29,212.99 223.29,212.99 C223.29,212.99 223.38,213.08 223.38,213.08 C223.38,213.08 223.47,213.17 223.47,213.17 C223.47,213.17 223.55,213.26 223.55,213.26 C223.55,213.26 223.63,213.36 223.63,213.36 C223.63,213.36 223.71,213.46 223.71,213.46 C223.71,213.46 223.79,213.56 223.79,213.56 C223.79,213.56 223.87,213.66 223.87,213.66 C223.87,213.66 223.95,213.75 223.95,213.75 C223.95,213.75 224.03,213.85 224.03,213.85 C224.03,213.85 224.09,213.96 224.09,213.96 C224.09,213.96 224.16,214.06 224.16,214.06 C224.16,214.06 224.23,214.17 224.23,214.17 C224.23,214.17 224.3,214.27 224.3,214.27 C224.3,214.27 224.37,214.38 224.37,214.38 C224.37,214.38 224.44,214.48 224.44,214.48 C224.44,214.48 224.5,214.59 224.5,214.59 C224.5,214.59 224.56,214.7 224.56,214.7 C224.56,214.7 224.62,214.81 224.62,214.81 C224.62,214.81 224.68,214.93 224.68,214.93 C224.68,214.93 224.74,215.04 224.74,215.04 C224.74,215.04 224.79,215.15 224.79,215.15 C224.79,215.15 224.84,215.26 224.84,215.26 C224.84,215.26 224.89,215.38 224.89,215.38 C224.89,215.38 224.94,215.5 224.94,215.5 C224.94,215.5 224.99,215.61 224.99,215.61 C224.99,215.61 225.04,215.73 225.04,215.73 C225.04,215.73 225.08,215.84 225.08,215.84 C225.08,215.84 225.12,215.96 225.12,215.96 C225.12,215.96 225.16,216.08 225.16,216.08 C225.16,216.08 225.19,216.2 225.19,216.2 C225.19,216.2 225.23,216.32 225.23,216.32 C225.23,216.32 225.27,216.44 225.27,216.44 C225.27,216.44 225.3,216.56 225.3,216.56 C225.3,216.56 225.33,216.69 225.33,216.69 C225.33,216.69 225.35,216.81 225.35,216.81 C225.35,216.81 225.38,216.93 225.38,216.93 C225.38,216.93 225.41,217.06 225.41,217.06 C225.41,217.06 225.43,217.18 225.43,217.18 C225.43,217.18 225.46,217.3 225.46,217.3 C225.46,217.3 225.47,217.43 225.47,217.43 C225.47,217.43 225.49,217.55 225.49,217.55 C225.49,217.55 225.5,217.68 225.5,217.68 C225.5,217.68 225.52,217.8 225.52,217.8 C225.52,217.8 225.52,217.93 225.52,217.93 C225.52,217.93 225.53,218.05 225.53,218.05 C225.53,218.05 225.54,218.18 225.54,218.18 C225.54,218.18 225.54,218.3 225.54,218.3 C225.54,218.3 225.55,218.43 225.55,218.43 C225.55,218.43 225.55,218.55 225.55,218.55 C225.55,218.55 225.55,218.68 225.55,218.68 C225.55,218.68 225.54,218.8 225.54,218.8 C225.54,218.8 225.54,218.93 225.54,218.93 C225.54,218.93 225.53,219.05 225.53,219.05 C225.53,219.05 225.52,219.18 225.52,219.18 C225.52,219.18 225.52,219.31 225.52,219.31 C225.52,219.31 225.5,219.43 225.5,219.43 C225.5,219.43 225.48,219.55 225.48,219.55 C225.48,219.55 225.47,219.68 225.47,219.68 C225.47,219.68 225.45,219.8 225.45,219.8 C225.45,219.8 225.43,219.93 225.43,219.93 C225.43,219.93 225.41,220.05 225.41,220.05 C225.41,220.05 225.39,220.17 225.39,220.17 C225.39,220.17 225.36,220.3 225.36,220.3 C225.36,220.3 225.33,220.42 225.33,220.42 C225.33,220.42 225.3,220.54 225.3,220.54 C225.3,220.54 225.27,220.66 225.27,220.66 C225.27,220.66 225.24,220.78 225.24,220.78 C225.24,220.78 225.2,220.9 225.2,220.9 C225.2,220.9 225.16,221.02 225.16,221.02 C225.16,221.02 225.12,221.14 225.12,221.14 C225.12,221.14 225.08,221.26 225.08,221.26 C225.08,221.26 225.03,221.38 225.03,221.38 C225.03,221.38 224.99,221.5 224.99,221.5 C224.99,221.5 224.95,221.61 224.95,221.61 C224.95,221.61 224.89,221.73 224.89,221.73 C224.89,221.73 224.84,221.84 224.84,221.84 C224.84,221.84 224.79,221.96 224.79,221.96 C224.79,221.96 224.73,222.07 224.73,222.07 C224.73,222.07 224.68,222.18 224.68,222.18 C224.68,222.18 224.62,222.29 224.62,222.29 C224.62,222.29 224.56,222.4 224.56,222.4 C224.56,222.4 224.5,222.51 224.5,222.51 C224.5,222.51 224.44,222.62 224.44,222.62 C224.44,222.62 224.37,222.73 224.37,222.73 C224.37,222.73 224.31,222.84 224.31,222.84 C224.31,222.84 224.24,222.94 224.24,222.94 C224.24,222.94 224.17,223.05 224.17,223.05 C224.17,223.05 224.09,223.15 224.09,223.15 C224.09,223.15 224.02,223.25 224.02,223.25 C224.02,223.25 223.95,223.35 223.95,223.35 C223.95,223.35 223.88,223.45 223.88,223.45 C223.88,223.45 223.8,223.55 223.8,223.55 C223.8,223.55 223.71,223.65 223.71,223.65 C223.71,223.65 223.63,223.74 223.63,223.74 C223.63,223.74 223.55,223.84 223.55,223.84 C223.55,223.84 223.47,223.93 223.47,223.93 C223.47,223.93 223.39,224.03 223.39,224.03 C223.39,224.03 223.3,224.12 223.3,224.12 C223.3,224.12 223.21,224.2 223.21,224.2 C223.21,224.2 223.12,224.29 223.12,224.29 C223.12,224.29 223.03,224.38 223.03,224.38 C223.03,224.38 222.94,224.46 222.94,224.46 C222.94,224.46 222.85,224.55 222.85,224.55 C222.85,224.55 222.75,224.63 222.75,224.63 C222.75,224.63 222.65,224.71 222.65,224.71 C222.65,224.71 222.55,224.79 222.55,224.79 C222.55,224.79 222.46,224.87 222.46,224.87 C222.46,224.87 222.36,224.95 222.36,224.95 C222.36,224.95 222.26,225.02 222.26,225.02 C222.26,225.02 222.15,225.09 222.15,225.09 C222.15,225.09 222.05,225.16 222.05,225.16 C222.05,225.16 221.94,225.23 221.94,225.23 C221.94,225.23 221.84,225.3 221.84,225.3 C221.84,225.3 221.74,225.37 221.74,225.37 C221.74,225.37 221.63,225.44 221.63,225.44 C221.63,225.44 221.52,225.5 221.52,225.5 C221.52,225.5 221.41,225.56 221.41,225.56 C221.41,225.56 221.3,225.62 221.3,225.62 C221.3,225.62 221.19,225.68 221.19,225.68 C221.19,225.68 221.08,225.73 221.08,225.73 C221.08,225.73 220.96,225.79 220.96,225.79 C220.96,225.79 220.85,225.84 220.85,225.84 C220.85,225.84 220.73,225.89 220.73,225.89 C220.73,225.89 220.62,225.94 220.62,225.94 C220.62,225.94 220.5,225.99 220.5,225.99 C220.5,225.99 220.38,226.03 220.38,226.03 C220.38,226.03 220.27,226.08 220.27,226.08 C220.27,226.08 220.15,226.12 220.15,226.12 C220.15,226.12 220.03,226.15 220.03,226.15 C220.03,226.15 219.91,226.19 219.91,226.19 C219.91,226.19 219.79,226.23 219.79,226.23 C219.79,226.23 219.67,226.27 219.67,226.27 C219.67,226.27 219.55,226.3 219.55,226.3 C219.55,226.3 219.42,226.33 219.42,226.33 C219.42,226.33 219.3,226.35 219.3,226.35 C219.3,226.35 219.18,226.38 219.18,226.38 C219.18,226.38 219.06,226.4 219.06,226.4 C219.06,226.4 218.93,226.43 218.93,226.43 C218.93,226.43 218.81,226.45 218.81,226.45 C218.81,226.45 218.68,226.47 218.68,226.47 C218.68,226.47 218.56,226.49 218.56,226.49 C218.56,226.49 218.44,226.5 218.44,226.5 C218.44,226.5 218.31,226.52 218.31,226.52 C218.31,226.52 218.19,226.52 218.19,226.52 C218.19,226.52 218.06,226.53 218.06,226.53 C218.06,226.53 217.93,226.53 217.93,226.53 C217.93,226.53 217.81,226.54 217.81,226.54 C217.81,226.54 217.68,226.55 217.68,226.55 C217.68,226.55 217.56,226.55 217.56,226.55 C217.56,226.55 217.43,226.55 217.43,226.55 C217.43,226.55 217.31,226.54 217.31,226.54 C217.31,226.54 217.18,226.53 217.18,226.53 C217.18,226.53 217.05,226.53 217.05,226.53 C217.05,226.53 216.93,226.52 216.93,226.52 C216.93,226.52 216.8,226.52 216.8,226.52 C216.8,226.52 216.68,226.5 216.68,226.5 C216.68,226.5 216.55,226.48 216.55,226.48 C216.55,226.48 216.43,226.46 216.43,226.46 C216.43,226.46 216.31,226.45 216.31,226.45 C216.31,226.45 216.18,226.43 216.18,226.43 C216.18,226.43 216.06,226.41 216.06,226.41 C216.06,226.41 215.93,226.38 215.93,226.38 C215.93,226.38 215.81,226.35 215.81,226.35 C215.81,226.35 215.69,226.32 215.69,226.32 C215.69,226.32 215.57,226.29 215.57,226.29 C215.57,226.29 215.45,226.26 215.45,226.26 C215.45,226.26 215.32,226.23 215.32,226.23 C215.32,226.23 215.2,226.2 215.2,226.2 C215.2,226.2 215.09,226.16 215.09,226.16 C215.09,226.16 214.97,226.12 214.97,226.12 C214.97,226.12 214.85,226.07 214.85,226.07 C214.85,226.07 214.73,226.03 214.73,226.03 C214.73,226.03 214.61,225.99 214.61,225.99 C214.61,225.99 214.5,225.94 214.5,225.94 C214.5,225.94 214.38,225.89 214.38,225.89 C214.38,225.89 214.27,225.84 214.27,225.84 C214.27,225.84 214.15,225.79 214.15,225.79 C214.15,225.79 214.04,225.73 214.04,225.73 C214.04,225.73 213.93,225.68 213.93,225.68 C213.93,225.68 213.81,225.62 213.81,225.62 C213.81,225.62 213.71,225.56 213.71,225.56 C213.71,225.56 213.6,225.5 213.6,225.5 C213.6,225.5 213.49,225.43 213.49,225.43 C213.49,225.43 213.38,225.37 213.38,225.37 C213.38,225.37 213.27,225.31 213.27,225.31 C213.27,225.31 213.17,225.24 213.17,225.24 C213.17,225.24 213.06,225.16 213.06,225.16 C213.06,225.16 212.96,225.09 212.96,225.09 C212.96,225.09 212.86,225.02 212.86,225.02 C212.86,225.02 212.76,224.95 212.76,224.95 C212.76,224.95 212.65,224.87 212.65,224.87 C212.65,224.87 212.56,224.79 212.56,224.79 C212.56,224.79 212.46,224.71 212.46,224.71 C212.46,224.71 212.37,224.63 212.37,224.63 C212.37,224.63 212.27,224.55 212.27,224.55 C212.27,224.55 212.18,224.47 212.18,224.47 C212.18,224.47 212.08,224.38 212.08,224.38 C212.08,224.38 211.99,224.3 211.99,224.3 C211.99,224.3 211.91,224.2 211.91,224.2 C211.91,224.2 211.82,224.11 211.82,224.11 C211.82,224.11 211.73,224.02 211.73,224.02 C211.73,224.02 211.64,223.93 211.64,223.93 C211.64,223.93 211.56,223.84 211.56,223.84 C211.56,223.84 211.48,223.75 211.48,223.75 C211.48,223.75 211.4,223.65 211.4,223.65 C211.4,223.65 211.32,223.55 211.32,223.55 C211.32,223.55 211.24,223.45 211.24,223.45 C211.24,223.45 211.16,223.35 211.16,223.35 C211.16,223.35 211.09,223.26 211.09,223.26 C211.09,223.26 211.02,223.15 211.02,223.15 C211.02,223.15 210.95,223.05 210.95,223.05 C210.95,223.05 210.88,222.94 210.88,222.94 C210.88,222.94 210.81,222.84 210.81,222.84 C210.81,222.84 210.74,222.73 210.74,222.73 C210.74,222.73 210.67,222.63 210.67,222.63 C210.67,222.63 210.61,222.52 210.61,222.52 C210.61,222.52 210.55,222.4 210.55,222.4 C210.55,222.4 210.49,222.29 210.49,222.29 C210.49,222.29 210.43,222.18 210.43,222.18 C210.43,222.18 210.38,222.07 210.38,222.07 C210.38,222.07 210.32,221.96 210.32,221.96 C210.32,221.96 210.27,221.84 210.27,221.84 C210.27,221.84 210.22,221.73 210.22,221.73 C210.22,221.73 210.17,221.61 210.17,221.61 C210.17,221.61 210.12,221.5 210.12,221.5 C210.12,221.5 210.08,221.38 210.08,221.38 C210.08,221.38 210.03,221.26 210.03,221.26 C210.03,221.26 209.99,221.14 209.99,221.14 C209.99,221.14 209.96,221.02 209.96,221.02 C209.96,221.02 209.92,220.9 209.92,220.9 C209.92,220.9 209.88,220.78 209.88,220.78 C209.88,220.78 209.84,220.67 209.84,220.67 C209.84,220.67 209.81,220.54 209.81,220.54 C209.81,220.54 209.78,220.42 209.78,220.42 C209.78,220.42 209.76,220.3 209.76,220.3 C209.76,220.3 209.73,220.18 209.73,220.18 C209.73,220.18 209.71,220.05 209.71,220.05 C209.71,220.05 209.68,219.93 209.68,219.93 C209.68,219.93 209.66,219.81 209.66,219.81 C209.66,219.81 209.64,219.68 209.64,219.68 C209.64,219.68 209.62,219.56 209.62,219.56 C209.62,219.56 209.61,219.43 209.61,219.43 C209.61,219.43 209.59,219.31 209.59,219.31 C209.59,219.31 209.59,219.18 209.59,219.18 C209.59,219.18 209.58,219.06 209.58,219.06 C209.58,219.06 209.58,218.93 209.58,218.93 C209.58,218.93 209.57,218.81 209.57,218.81 C209.57,218.81 209.56,218.68 209.56,218.68 C209.56,218.68 209.56,218.56 209.56,218.56 C209.56,218.56 209.56,218.43 209.56,218.43 C209.56,218.43 209.57,218.3 209.57,218.3 C209.57,218.3 209.58,218.18 209.58,218.18 C209.58,218.18 209.58,218.05 209.58,218.05 C209.58,218.05 209.59,217.93 209.59,217.93 C209.59,217.93 209.59,217.8 209.59,217.8 C209.59,217.8 209.61,217.68 209.61,217.68 C209.61,217.68 209.63,217.55 209.63,217.55 C209.63,217.55 209.65,217.43 209.65,217.43 C209.65,217.43 209.66,217.31 209.66,217.31 C209.66,217.31 209.68,217.18 209.68,217.18 C209.68,217.18 209.7,217.06 209.7,217.06 C209.7,217.06 209.73,216.93 209.73,216.93 C209.73,216.93 209.76,216.81 209.76,216.81 C209.76,216.81 209.79,216.69 209.79,216.69 C209.79,216.69 209.82,216.57 209.82,216.57 C209.82,216.57 209.85,216.45 209.85,216.45 C209.85,216.45 209.88,216.32 209.88,216.32 C209.88,216.32 209.91,216.2 209.91,216.2 C209.91,216.2 209.95,216.08 209.95,216.08 C209.95,216.08 210,215.97 210,215.97 C210,215.97 210.04,215.85 210.04,215.85 C210.04,215.85 210.08,215.73 210.08,215.73 C210.08,215.73 210.12,215.61 210.12,215.61 C210.12,215.61 210.17,215.49 210.17,215.49 C210.17,215.49 210.22,215.38 210.22,215.38 C210.22,215.38 210.27,215.27 210.27,215.27 C210.27,215.27 210.33,215.15 210.33,215.15 C210.33,215.15 210.38,215.04 210.38,215.04 C210.38,215.04 210.43,214.92 210.43,214.92 C210.43,214.92 210.49,214.81 210.49,214.81 C210.49,214.81 210.55,214.7 210.55,214.7 C210.55,214.7 210.61,214.6 210.61,214.6 C210.61,214.6 210.68,214.49 210.68,214.49 C210.68,214.49 210.74,214.38 210.74,214.38 C210.74,214.38 210.8,214.27 210.8,214.27 C210.8,214.27 210.87,214.17 210.87,214.17 C210.87,214.17 210.95,214.06 210.95,214.06 C210.95,214.06 211.02,213.96 211.02,213.96 C211.02,213.96 211.09,213.86 211.09,213.86 C211.09,213.86 211.16,213.76 211.16,213.76 C211.16,213.76 211.24,213.65 211.24,213.65 C211.24,213.65 211.32,213.56 211.32,213.56 C211.32,213.56 211.4,213.46 211.4,213.46 C211.4,213.46 211.48,213.37 211.48,213.37 C211.48,213.37 211.56,213.27 211.56,213.27 C211.56,213.27 211.64,213.18 211.64,213.18 C211.64,213.18 211.73,213.08 211.73,213.08 C211.73,213.08 211.82,212.99 211.82,212.99 C211.82,212.99 211.91,212.9 211.91,212.9 C211.91,212.9 212,212.82 212,212.82 C212,212.82 212.09,212.73 212.09,212.73 C212.09,212.73 212.18,212.64 212.18,212.64 C212.18,212.64 212.27,212.56 212.27,212.56 C212.27,212.56 212.36,212.48 212.36,212.48 C212.36,212.48 212.46,212.4 212.46,212.4 C212.46,212.4 212.56,212.32 212.56,212.32 C212.56,212.32 212.66,212.24 212.66,212.24 C212.66,212.24 212.76,212.16 212.76,212.16 C212.76,212.16 212.85,212.08 212.85,212.08 C212.85,212.08 212.96,212.02 212.96,212.02 C212.96,212.02 213.06,211.95 213.06,211.95 C213.06,211.95 213.17,211.88 213.17,211.88 C213.17,211.88 213.27,211.81 213.27,211.81 C213.27,211.81 213.38,211.74 213.38,211.74 C213.38,211.74 213.48,211.67 213.48,211.67 C213.48,211.67 213.6,211.61 213.6,211.61 C213.6,211.61 213.71,211.55 213.71,211.55 C213.71,211.55 213.82,211.49 213.82,211.49 C213.82,211.49 213.93,211.43 213.93,211.43 C213.93,211.43 214.04,211.37 214.04,211.37 C214.04,211.37 214.15,211.32 214.15,211.32 C214.15,211.32 214.27,211.27 214.27,211.27 C214.27,211.27 214.38,211.22 214.38,211.22 C214.38,211.22 214.5,211.17 214.5,211.17 C214.5,211.17 214.61,211.12 214.61,211.12 C214.61,211.12 214.73,211.07 214.73,211.07 C214.73,211.07 214.85,211.03 214.85,211.03 C214.85,211.03 214.97,210.99 214.97,210.99 C214.97,210.99 215.09,210.95 215.09,210.95 C215.09,210.95 215.21,210.92 215.21,210.92 C215.21,210.92 215.33,210.88 215.33,210.88 C215.33,210.88 215.45,210.84 215.45,210.84 C215.45,210.84 215.57,210.81 215.57,210.81 C215.57,210.81 215.69,210.78 215.69,210.78 C215.69,210.78 215.81,210.76 215.81,210.76 C215.81,210.76 215.93,210.73 215.93,210.73 C215.93,210.73 216.06,210.7 216.06,210.7 C216.06,210.7 216.18,210.68 216.18,210.68 C216.18,210.68 216.3,210.65 216.3,210.65 C216.3,210.65 216.43,210.64 216.43,210.64 C216.43,210.64 216.55,210.62 216.55,210.62 C216.55,210.62 216.68,210.61 216.68,210.61 C216.68,210.61 216.8,210.59 216.8,210.59 C216.8,210.59 216.93,210.59 216.93,210.59 C216.93,210.59 217.05,210.58 217.05,210.58 C217.05,210.58 217.18,210.58 217.18,210.58 C217.18,210.58 217.3,210.57 217.3,210.57 C217.3,210.57 217.43,210.56 217.43,210.56 C217.43,210.56 217.56,210.56 217.56,210.56 C217.56,210.56 217.68,210.56 217.68,210.56c " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.8,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="time_group"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateX" android:duration="500" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"/></set></aapt:attr></target></animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/pin_dot_shape_3_avd.xml b/packages/SystemUI/res/drawable/pin_dot_shape_3_avd.xml new file mode 100644 index 000000000000..cf0889997970 --- /dev/null +++ b/packages/SystemUI/res/drawable/pin_dot_shape_3_avd.xml @@ -0,0 +1 @@ +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"><aapt:attr name="android:drawable"><vector android:height="60dp" android:width="60dp" android:viewportHeight="60" android:viewportWidth="60"><group android:name="_R_G"><group android:name="_R_G_L_0_G" android:translateX="-187.543" android:translateY="-188.546"><path android:name="_R_G_L_0_G_D_0_P_0" android:fillColor="#ffffff" android:fillAlpha="0" android:fillType="nonZero" android:pathData=" M217.62 214.55 C217.62,214.55 217.68,214.55 217.68,214.55 C217.68,214.55 217.74,214.56 217.74,214.56 C217.74,214.56 217.81,214.56 217.81,214.56 C217.81,214.56 217.87,214.56 217.87,214.56 C217.87,214.56 217.93,214.57 217.93,214.57 C217.93,214.57 218,214.57 218,214.57 C218,214.57 218.06,214.58 218.06,214.58 C218.06,214.58 218.12,214.59 218.12,214.59 C218.12,214.59 218.18,214.6 218.18,214.6 C218.18,214.6 218.24,214.61 218.24,214.61 C218.24,214.61 218.31,214.62 218.31,214.62 C218.31,214.62 218.37,214.63 218.37,214.63 C218.37,214.63 218.43,214.65 218.43,214.65 C218.43,214.65 218.49,214.66 218.49,214.66 C218.49,214.66 218.55,214.68 218.55,214.68 C218.55,214.68 218.61,214.69 218.61,214.69 C218.61,214.69 218.67,214.71 218.67,214.71 C218.67,214.71 218.73,214.73 218.73,214.73 C218.73,214.73 218.79,214.75 218.79,214.75 C218.79,214.75 218.85,214.77 218.85,214.77 C218.85,214.77 218.91,214.79 218.91,214.79 C218.91,214.79 218.97,214.81 218.97,214.81 C218.97,214.81 219.03,214.83 219.03,214.83 C219.03,214.83 219.09,214.85 219.09,214.85 C219.09,214.85 219.15,214.88 219.15,214.88 C219.15,214.88 219.2,214.9 219.2,214.9 C219.2,214.9 219.26,214.93 219.26,214.93 C219.26,214.93 219.32,214.96 219.32,214.96 C219.32,214.96 219.37,214.98 219.37,214.98 C219.37,214.98 219.43,215.01 219.43,215.01 C219.43,215.01 219.48,215.05 219.48,215.05 C219.48,215.05 219.54,215.08 219.54,215.08 C219.54,215.08 219.59,215.11 219.59,215.11 C219.59,215.11 219.65,215.14 219.65,215.14 C219.65,215.14 219.7,215.17 219.7,215.17 C219.7,215.17 219.75,215.21 219.75,215.21 C219.75,215.21 219.81,215.24 219.81,215.24 C219.81,215.24 219.86,215.28 219.86,215.28 C219.86,215.28 219.91,215.32 219.91,215.32 C219.91,215.32 219.96,215.35 219.96,215.35 C219.96,215.35 220.01,215.39 220.01,215.39 C220.01,215.39 220.06,215.43 220.06,215.43 C220.06,215.43 220.11,215.47 220.11,215.47 C220.11,215.47 220.16,215.51 220.16,215.51 C220.16,215.51 220.2,215.55 220.2,215.55 C220.2,215.55 220.25,215.59 220.25,215.59 C220.25,215.59 220.3,215.63 220.3,215.63 C220.3,215.63 220.34,215.68 220.34,215.68 C220.34,215.68 220.39,215.72 220.39,215.72 C220.39,215.72 220.43,215.77 220.43,215.77 C220.43,215.77 220.47,215.81 220.47,215.81 C220.47,215.81 220.52,215.86 220.52,215.86 C220.52,215.86 220.56,215.9 220.56,215.9 C220.56,215.9 220.6,215.95 220.6,215.95 C220.6,215.95 220.64,216 220.64,216 C220.64,216 220.68,216.05 220.68,216.05 C220.68,216.05 220.72,216.1 220.72,216.1 C220.72,216.1 220.76,216.15 220.76,216.15 C220.76,216.15 220.8,216.2 220.8,216.2 C220.8,216.2 220.83,216.25 220.83,216.25 C220.83,216.25 220.87,216.3 220.87,216.3 C220.87,216.3 220.9,216.36 220.9,216.36 C220.9,216.36 220.94,216.41 220.94,216.41 C220.94,216.41 220.97,216.46 220.97,216.46 C220.97,216.46 221,216.51 221,216.51 C221,216.51 221.03,216.57 221.03,216.57 C221.03,216.57 221.06,216.63 221.06,216.63 C221.06,216.63 221.09,216.68 221.09,216.68 C221.09,216.68 221.12,216.74 221.12,216.74 C221.12,216.74 221.15,216.79 221.15,216.79 C221.15,216.79 221.18,216.85 221.18,216.85 C221.18,216.85 221.21,216.91 221.21,216.91 C221.21,216.91 221.23,216.96 221.23,216.96 C221.23,216.96 221.25,217.02 221.25,217.02 C221.25,217.02 221.28,217.08 221.28,217.08 C221.28,217.08 221.3,217.14 221.3,217.14 C221.3,217.14 221.33,217.2 221.33,217.2 C221.33,217.2 221.34,217.26 221.34,217.26 C221.34,217.26 221.36,217.32 221.36,217.32 C221.36,217.32 221.38,217.38 221.38,217.38 C221.38,217.38 221.4,217.44 221.4,217.44 C221.4,217.44 221.42,217.5 221.42,217.5 C221.42,217.5 221.44,217.56 221.44,217.56 C221.44,217.56 221.45,217.62 221.45,217.62 C221.45,217.62 221.46,217.68 221.46,217.68 C221.46,217.68 221.48,217.74 221.48,217.74 C221.48,217.74 221.49,217.8 221.49,217.8 C221.49,217.8 221.5,217.87 221.5,217.87 C221.5,217.87 221.51,217.93 221.51,217.93 C221.51,217.93 221.52,217.99 221.52,217.99 C221.52,217.99 221.53,218.05 221.53,218.05 C221.53,218.05 221.54,218.11 221.54,218.11 C221.54,218.11 221.54,218.18 221.54,218.18 C221.54,218.18 221.55,218.24 221.55,218.24 C221.55,218.24 221.55,218.3 221.55,218.3 C221.55,218.3 221.55,218.37 221.55,218.37 C221.55,218.37 221.56,218.43 221.56,218.43 C221.56,218.43 221.56,218.49 221.56,218.49 C221.56,218.49 221.56,218.55 221.56,218.55 C221.56,218.55 221.56,218.62 221.56,218.62 C221.56,218.62 221.56,218.68 221.56,218.68 C221.56,218.68 221.55,218.74 221.55,218.74 C221.55,218.74 221.55,218.81 221.55,218.81 C221.55,218.81 221.55,218.87 221.55,218.87 C221.55,218.87 221.54,218.93 221.54,218.93 C221.54,218.93 221.54,218.99 221.54,218.99 C221.54,218.99 221.53,219.06 221.53,219.06 C221.53,219.06 221.52,219.12 221.52,219.12 C221.52,219.12 221.51,219.18 221.51,219.18 C221.51,219.18 221.5,219.24 221.5,219.24 C221.5,219.24 221.49,219.3 221.49,219.3 C221.49,219.3 221.48,219.37 221.48,219.37 C221.48,219.37 221.46,219.43 221.46,219.43 C221.46,219.43 221.45,219.49 221.45,219.49 C221.45,219.49 221.43,219.55 221.43,219.55 C221.43,219.55 221.42,219.61 221.42,219.61 C221.42,219.61 221.4,219.67 221.4,219.67 C221.4,219.67 221.39,219.73 221.39,219.73 C221.39,219.73 221.37,219.79 221.37,219.79 C221.37,219.79 221.34,219.85 221.34,219.85 C221.34,219.85 221.32,219.91 221.32,219.91 C221.32,219.91 221.3,219.97 221.3,219.97 C221.3,219.97 221.28,220.03 221.28,220.03 C221.28,220.03 221.26,220.09 221.26,220.09 C221.26,220.09 221.23,220.14 221.23,220.14 C221.23,220.14 221.21,220.2 221.21,220.2 C221.21,220.2 221.18,220.26 221.18,220.26 C221.18,220.26 221.15,220.32 221.15,220.32 C221.15,220.32 221.13,220.37 221.13,220.37 C221.13,220.37 221.1,220.43 221.1,220.43 C221.1,220.43 221.07,220.48 221.07,220.48 C221.07,220.48 221.03,220.54 221.03,220.54 C221.03,220.54 221,220.59 221,220.59 C221,220.59 220.97,220.65 220.97,220.65 C220.97,220.65 220.94,220.7 220.94,220.7 C220.94,220.7 220.9,220.75 220.9,220.75 C220.9,220.75 220.87,220.8 220.87,220.8 C220.87,220.8 220.83,220.86 220.83,220.86 C220.83,220.86 220.8,220.91 220.8,220.91 C220.8,220.91 220.76,220.96 220.76,220.96 C220.76,220.96 220.72,221.01 220.72,221.01 C220.72,221.01 220.68,221.06 220.68,221.06 C220.68,221.06 220.64,221.11 220.64,221.11 C220.64,221.11 220.6,221.15 220.6,221.15 C220.6,221.15 220.56,221.2 220.56,221.2 C220.56,221.2 220.52,221.25 220.52,221.25 C220.52,221.25 220.48,221.3 220.48,221.3 C220.48,221.3 220.43,221.34 220.43,221.34 C220.43,221.34 220.39,221.38 220.39,221.38 C220.39,221.38 220.34,221.43 220.34,221.43 C220.34,221.43 220.3,221.47 220.3,221.47 C220.3,221.47 220.25,221.52 220.25,221.52 C220.25,221.52 220.21,221.56 220.21,221.56 C220.21,221.56 220.16,221.6 220.16,221.6 C220.16,221.6 220.11,221.64 220.11,221.64 C220.11,221.64 220.06,221.68 220.06,221.68 C220.06,221.68 220.01,221.72 220.01,221.72 C220.01,221.72 219.96,221.76 219.96,221.76 C219.96,221.76 219.91,221.8 219.91,221.8 C219.91,221.8 219.86,221.83 219.86,221.83 C219.86,221.83 219.81,221.87 219.81,221.87 C219.81,221.87 219.75,221.9 219.75,221.9 C219.75,221.9 219.7,221.93 219.7,221.93 C219.7,221.93 219.65,221.97 219.65,221.97 C219.65,221.97 219.6,222 219.6,222 C219.6,222 219.54,222.03 219.54,222.03 C219.54,222.03 219.49,222.06 219.49,222.06 C219.49,222.06 219.43,222.09 219.43,222.09 C219.43,222.09 219.37,222.12 219.37,222.12 C219.37,222.12 219.32,222.15 219.32,222.15 C219.32,222.15 219.26,222.18 219.26,222.18 C219.26,222.18 219.21,222.2 219.21,222.2 C219.21,222.2 219.15,222.23 219.15,222.23 C219.15,222.23 219.09,222.25 219.09,222.25 C219.09,222.25 219.03,222.28 219.03,222.28 C219.03,222.28 218.97,222.3 218.97,222.3 C218.97,222.3 218.91,222.32 218.91,222.32 C218.91,222.32 218.85,222.34 218.85,222.34 C218.85,222.34 218.79,222.36 218.79,222.36 C218.79,222.36 218.73,222.38 218.73,222.38 C218.73,222.38 218.67,222.4 218.67,222.4 C218.67,222.4 218.61,222.42 218.61,222.42 C218.61,222.42 218.55,222.44 218.55,222.44 C218.55,222.44 218.49,222.45 218.49,222.45 C218.49,222.45 218.43,222.46 218.43,222.46 C218.43,222.46 218.37,222.47 218.37,222.47 C218.37,222.47 218.31,222.49 218.31,222.49 C218.31,222.49 218.25,222.5 218.25,222.5 C218.25,222.5 218.18,222.51 218.18,222.51 C218.18,222.51 218.12,222.52 218.12,222.52 C218.12,222.52 218.06,222.53 218.06,222.53 C218.06,222.53 218,222.54 218,222.54 C218,222.54 217.93,222.54 217.93,222.54 C217.93,222.54 217.87,222.55 217.87,222.55 C217.87,222.55 217.81,222.55 217.81,222.55 C217.81,222.55 217.75,222.55 217.75,222.55 C217.75,222.55 217.68,222.56 217.68,222.56 C217.68,222.56 217.62,222.56 217.62,222.56 C217.62,222.56 217.56,222.56 217.56,222.56 C217.56,222.56 217.49,222.56 217.49,222.56 C217.49,222.56 217.43,222.56 217.43,222.56 C217.43,222.56 217.37,222.55 217.37,222.55 C217.37,222.55 217.3,222.55 217.3,222.55 C217.3,222.55 217.24,222.55 217.24,222.55 C217.24,222.55 217.18,222.54 217.18,222.54 C217.18,222.54 217.12,222.54 217.12,222.54 C217.12,222.54 217.05,222.53 217.05,222.53 C217.05,222.53 216.99,222.52 216.99,222.52 C216.99,222.52 216.93,222.51 216.93,222.51 C216.93,222.51 216.87,222.5 216.87,222.5 C216.87,222.5 216.81,222.49 216.81,222.49 C216.81,222.49 216.74,222.48 216.74,222.48 C216.74,222.48 216.68,222.46 216.68,222.46 C216.68,222.46 216.62,222.45 216.62,222.45 C216.62,222.45 216.56,222.43 216.56,222.43 C216.56,222.43 216.5,222.42 216.5,222.42 C216.5,222.42 216.44,222.4 216.44,222.4 C216.44,222.4 216.38,222.38 216.38,222.38 C216.38,222.38 216.32,222.36 216.32,222.36 C216.32,222.36 216.26,222.34 216.26,222.34 C216.26,222.34 216.2,222.32 216.2,222.32 C216.2,222.32 216.14,222.3 216.14,222.3 C216.14,222.3 216.08,222.28 216.08,222.28 C216.08,222.28 216.02,222.26 216.02,222.26 C216.02,222.26 215.97,222.23 215.97,222.23 C215.97,222.23 215.91,222.2 215.91,222.2 C215.91,222.2 215.85,222.18 215.85,222.18 C215.85,222.18 215.79,222.15 215.79,222.15 C215.79,222.15 215.74,222.12 215.74,222.12 C215.74,222.12 215.68,222.1 215.68,222.1 C215.68,222.1 215.63,222.06 215.63,222.06 C215.63,222.06 215.57,222.03 215.57,222.03 C215.57,222.03 215.52,222 215.52,222 C215.52,222 215.46,221.97 215.46,221.97 C215.46,221.97 215.41,221.94 215.41,221.94 C215.41,221.94 215.36,221.9 215.36,221.9 C215.36,221.9 215.31,221.87 215.31,221.87 C215.31,221.87 215.25,221.83 215.25,221.83 C215.25,221.83 215.2,221.79 215.2,221.79 C215.2,221.79 215.15,221.76 215.15,221.76 C215.15,221.76 215.1,221.72 215.1,221.72 C215.1,221.72 215.05,221.68 215.05,221.68 C215.05,221.68 215,221.64 215,221.64 C215,221.64 214.96,221.6 214.96,221.6 C214.96,221.6 214.91,221.56 214.91,221.56 C214.91,221.56 214.86,221.52 214.86,221.52 C214.86,221.52 214.81,221.48 214.81,221.48 C214.81,221.48 214.77,221.43 214.77,221.43 C214.77,221.43 214.73,221.39 214.73,221.39 C214.73,221.39 214.68,221.34 214.68,221.34 C214.68,221.34 214.64,221.3 214.64,221.3 C214.64,221.3 214.59,221.25 214.59,221.25 C214.59,221.25 214.55,221.2 214.55,221.2 C214.55,221.2 214.51,221.15 214.51,221.15 C214.51,221.15 214.47,221.11 214.47,221.11 C214.47,221.11 214.43,221.06 214.43,221.06 C214.43,221.06 214.39,221.01 214.39,221.01 C214.39,221.01 214.35,220.96 214.35,220.96 C214.35,220.96 214.31,220.91 214.31,220.91 C214.31,220.91 214.28,220.86 214.28,220.86 C214.28,220.86 214.25,220.81 214.25,220.81 C214.25,220.81 214.21,220.75 214.21,220.75 C214.21,220.75 214.18,220.7 214.18,220.7 C214.18,220.7 214.14,220.65 214.14,220.65 C214.14,220.65 214.11,220.59 214.11,220.59 C214.11,220.59 214.08,220.54 214.08,220.54 C214.08,220.54 214.05,220.48 214.05,220.48 C214.05,220.48 214.02,220.43 214.02,220.43 C214.02,220.43 213.99,220.37 213.99,220.37 C213.99,220.37 213.96,220.32 213.96,220.32 C213.96,220.32 213.93,220.26 213.93,220.26 C213.93,220.26 213.91,220.2 213.91,220.2 C213.91,220.2 213.88,220.14 213.88,220.14 C213.88,220.14 213.86,220.09 213.86,220.09 C213.86,220.09 213.83,220.03 213.83,220.03 C213.83,220.03 213.81,219.97 213.81,219.97 C213.81,219.97 213.79,219.91 213.79,219.91 C213.79,219.91 213.77,219.85 213.77,219.85 C213.77,219.85 213.75,219.79 213.75,219.79 C213.75,219.79 213.73,219.73 213.73,219.73 C213.73,219.73 213.71,219.67 213.71,219.67 C213.71,219.67 213.69,219.61 213.69,219.61 C213.69,219.61 213.68,219.55 213.68,219.55 C213.68,219.55 213.66,219.49 213.66,219.49 C213.66,219.49 213.65,219.43 213.65,219.43 C213.65,219.43 213.64,219.37 213.64,219.37 C213.64,219.37 213.62,219.31 213.62,219.31 C213.62,219.31 213.61,219.24 213.61,219.24 C213.61,219.24 213.6,219.18 213.6,219.18 C213.6,219.18 213.59,219.12 213.59,219.12 C213.59,219.12 213.58,219.06 213.58,219.06 C213.58,219.06 213.57,218.99 213.57,218.99 C213.57,218.99 213.57,218.93 213.57,218.93 C213.57,218.93 213.56,218.87 213.56,218.87 C213.56,218.87 213.56,218.81 213.56,218.81 C213.56,218.81 213.56,218.74 213.56,218.74 C213.56,218.74 213.56,218.68 213.56,218.68 C213.56,218.68 213.55,218.62 213.55,218.62 C213.55,218.62 213.55,218.55 213.55,218.55 C213.55,218.55 213.55,218.49 213.55,218.49 C213.55,218.49 213.56,218.43 213.56,218.43 C213.56,218.43 213.56,218.37 213.56,218.37 C213.56,218.37 213.56,218.3 213.56,218.3 C213.56,218.3 213.56,218.24 213.56,218.24 C213.56,218.24 213.57,218.18 213.57,218.18 C213.57,218.18 213.57,218.12 213.57,218.12 C213.57,218.12 213.58,218.05 213.58,218.05 C213.58,218.05 213.59,217.99 213.59,217.99 C213.59,217.99 213.6,217.93 213.6,217.93 C213.6,217.93 213.61,217.87 213.61,217.87 C213.61,217.87 213.62,217.8 213.62,217.8 C213.62,217.8 213.63,217.74 213.63,217.74 C213.63,217.74 213.65,217.68 213.65,217.68 C213.65,217.68 213.66,217.62 213.66,217.62 C213.66,217.62 213.68,217.56 213.68,217.56 C213.68,217.56 213.69,217.5 213.69,217.5 C213.69,217.5 213.71,217.44 213.71,217.44 C213.71,217.44 213.73,217.38 213.73,217.38 C213.73,217.38 213.75,217.32 213.75,217.32 C213.75,217.32 213.77,217.26 213.77,217.26 C213.77,217.26 213.79,217.2 213.79,217.2 C213.79,217.2 213.81,217.14 213.81,217.14 C213.81,217.14 213.83,217.08 213.83,217.08 C213.83,217.08 213.85,217.02 213.85,217.02 C213.85,217.02 213.88,216.96 213.88,216.96 C213.88,216.96 213.91,216.91 213.91,216.91 C213.91,216.91 213.93,216.85 213.93,216.85 C213.93,216.85 213.96,216.79 213.96,216.79 C213.96,216.79 213.99,216.74 213.99,216.74 C213.99,216.74 214.02,216.68 214.02,216.68 C214.02,216.68 214.05,216.63 214.05,216.63 C214.05,216.63 214.08,216.57 214.08,216.57 C214.08,216.57 214.11,216.52 214.11,216.52 C214.11,216.52 214.14,216.46 214.14,216.46 C214.14,216.46 214.17,216.41 214.17,216.41 C214.17,216.41 214.21,216.36 214.21,216.36 C214.21,216.36 214.24,216.3 214.24,216.3 C214.24,216.3 214.28,216.25 214.28,216.25 C214.28,216.25 214.32,216.2 214.32,216.2 C214.32,216.2 214.35,216.15 214.35,216.15 C214.35,216.15 214.39,216.1 214.39,216.1 C214.39,216.1 214.43,216.05 214.43,216.05 C214.43,216.05 214.47,216 214.47,216 C214.47,216 214.51,215.96 214.51,215.96 C214.51,215.96 214.55,215.91 214.55,215.91 C214.55,215.91 214.59,215.86 214.59,215.86 C214.59,215.86 214.64,215.81 214.64,215.81 C214.64,215.81 214.68,215.77 214.68,215.77 C214.68,215.77 214.73,215.72 214.73,215.72 C214.73,215.72 214.77,215.68 214.77,215.68 C214.77,215.68 214.82,215.64 214.82,215.64 C214.82,215.64 214.86,215.59 214.86,215.59 C214.86,215.59 214.91,215.55 214.91,215.55 C214.91,215.55 214.96,215.51 214.96,215.51 C214.96,215.51 215,215.47 215,215.47 C215,215.47 215.05,215.43 215.05,215.43 C215.05,215.43 215.1,215.39 215.1,215.39 C215.1,215.39 215.15,215.35 215.15,215.35 C215.15,215.35 215.2,215.31 215.2,215.31 C215.2,215.31 215.25,215.28 215.25,215.28 C215.25,215.28 215.31,215.24 215.31,215.24 C215.31,215.24 215.36,215.21 215.36,215.21 C215.36,215.21 215.41,215.17 215.41,215.17 C215.41,215.17 215.46,215.14 215.46,215.14 C215.46,215.14 215.52,215.11 215.52,215.11 C215.52,215.11 215.57,215.08 215.57,215.08 C215.57,215.08 215.63,215.05 215.63,215.05 C215.63,215.05 215.68,215.02 215.68,215.02 C215.68,215.02 215.74,214.99 215.74,214.99 C215.74,214.99 215.79,214.96 215.79,214.96 C215.79,214.96 215.85,214.93 215.85,214.93 C215.85,214.93 215.91,214.9 215.91,214.9 C215.91,214.9 215.97,214.88 215.97,214.88 C215.97,214.88 216.02,214.86 216.02,214.86 C216.02,214.86 216.08,214.83 216.08,214.83 C216.08,214.83 216.14,214.81 216.14,214.81 C216.14,214.81 216.2,214.78 216.2,214.78 C216.2,214.78 216.26,214.77 216.26,214.77 C216.26,214.77 216.32,214.75 216.32,214.75 C216.32,214.75 216.38,214.73 216.38,214.73 C216.38,214.73 216.44,214.71 216.44,214.71 C216.44,214.71 216.5,214.69 216.5,214.69 C216.5,214.69 216.56,214.67 216.56,214.67 C216.56,214.67 216.62,214.66 216.62,214.66 C216.62,214.66 216.68,214.65 216.68,214.65 C216.68,214.65 216.74,214.63 216.74,214.63 C216.74,214.63 216.81,214.62 216.81,214.62 C216.81,214.62 216.87,214.61 216.87,214.61 C216.87,214.61 216.93,214.6 216.93,214.6 C216.93,214.6 216.99,214.59 216.99,214.59 C216.99,214.59 217.05,214.58 217.05,214.58 C217.05,214.58 217.12,214.57 217.12,214.57 C217.12,214.57 217.18,214.57 217.18,214.57 C217.18,214.57 217.24,214.56 217.24,214.56 C217.24,214.56 217.3,214.56 217.3,214.56 C217.3,214.56 217.37,214.56 217.37,214.56 C217.37,214.56 217.43,214.55 217.43,214.55 C217.43,214.55 217.49,214.55 217.49,214.55 C217.49,214.55 217.56,214.55 217.56,214.55 C217.56,214.55 217.62,214.55 217.62,214.55c "/></group></group><group android:name="time_group"/></vector></aapt:attr><target android:name="_R_G_L_0_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="fillAlpha" android:duration="33" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="pathData" android:duration="67" android:startOffset="0" android:valueFrom="M217.62 214.55 C217.62,214.55 217.68,214.55 217.68,214.55 C217.68,214.55 217.74,214.56 217.74,214.56 C217.74,214.56 217.81,214.56 217.81,214.56 C217.81,214.56 217.87,214.56 217.87,214.56 C217.87,214.56 217.93,214.57 217.93,214.57 C217.93,214.57 218,214.57 218,214.57 C218,214.57 218.06,214.58 218.06,214.58 C218.06,214.58 218.12,214.59 218.12,214.59 C218.12,214.59 218.18,214.6 218.18,214.6 C218.18,214.6 218.24,214.61 218.24,214.61 C218.24,214.61 218.31,214.62 218.31,214.62 C218.31,214.62 218.37,214.63 218.37,214.63 C218.37,214.63 218.43,214.65 218.43,214.65 C218.43,214.65 218.49,214.66 218.49,214.66 C218.49,214.66 218.55,214.68 218.55,214.68 C218.55,214.68 218.61,214.69 218.61,214.69 C218.61,214.69 218.67,214.71 218.67,214.71 C218.67,214.71 218.73,214.73 218.73,214.73 C218.73,214.73 218.79,214.75 218.79,214.75 C218.79,214.75 218.85,214.77 218.85,214.77 C218.85,214.77 218.91,214.79 218.91,214.79 C218.91,214.79 218.97,214.81 218.97,214.81 C218.97,214.81 219.03,214.83 219.03,214.83 C219.03,214.83 219.09,214.85 219.09,214.85 C219.09,214.85 219.15,214.88 219.15,214.88 C219.15,214.88 219.2,214.9 219.2,214.9 C219.2,214.9 219.26,214.93 219.26,214.93 C219.26,214.93 219.32,214.96 219.32,214.96 C219.32,214.96 219.37,214.98 219.37,214.98 C219.37,214.98 219.43,215.01 219.43,215.01 C219.43,215.01 219.48,215.05 219.48,215.05 C219.48,215.05 219.54,215.08 219.54,215.08 C219.54,215.08 219.59,215.11 219.59,215.11 C219.59,215.11 219.65,215.14 219.65,215.14 C219.65,215.14 219.7,215.17 219.7,215.17 C219.7,215.17 219.75,215.21 219.75,215.21 C219.75,215.21 219.81,215.24 219.81,215.24 C219.81,215.24 219.86,215.28 219.86,215.28 C219.86,215.28 219.91,215.32 219.91,215.32 C219.91,215.32 219.96,215.35 219.96,215.35 C219.96,215.35 220.01,215.39 220.01,215.39 C220.01,215.39 220.06,215.43 220.06,215.43 C220.06,215.43 220.11,215.47 220.11,215.47 C220.11,215.47 220.16,215.51 220.16,215.51 C220.16,215.51 220.2,215.55 220.2,215.55 C220.2,215.55 220.25,215.59 220.25,215.59 C220.25,215.59 220.3,215.63 220.3,215.63 C220.3,215.63 220.34,215.68 220.34,215.68 C220.34,215.68 220.39,215.72 220.39,215.72 C220.39,215.72 220.43,215.77 220.43,215.77 C220.43,215.77 220.47,215.81 220.47,215.81 C220.47,215.81 220.52,215.86 220.52,215.86 C220.52,215.86 220.56,215.9 220.56,215.9 C220.56,215.9 220.6,215.95 220.6,215.95 C220.6,215.95 220.64,216 220.64,216 C220.64,216 220.68,216.05 220.68,216.05 C220.68,216.05 220.72,216.1 220.72,216.1 C220.72,216.1 220.76,216.15 220.76,216.15 C220.76,216.15 220.8,216.2 220.8,216.2 C220.8,216.2 220.83,216.25 220.83,216.25 C220.83,216.25 220.87,216.3 220.87,216.3 C220.87,216.3 220.9,216.36 220.9,216.36 C220.9,216.36 220.94,216.41 220.94,216.41 C220.94,216.41 220.97,216.46 220.97,216.46 C220.97,216.46 221,216.51 221,216.51 C221,216.51 221.03,216.57 221.03,216.57 C221.03,216.57 221.06,216.63 221.06,216.63 C221.06,216.63 221.09,216.68 221.09,216.68 C221.09,216.68 221.12,216.74 221.12,216.74 C221.12,216.74 221.15,216.79 221.15,216.79 C221.15,216.79 221.18,216.85 221.18,216.85 C221.18,216.85 221.21,216.91 221.21,216.91 C221.21,216.91 221.23,216.96 221.23,216.96 C221.23,216.96 221.25,217.02 221.25,217.02 C221.25,217.02 221.28,217.08 221.28,217.08 C221.28,217.08 221.3,217.14 221.3,217.14 C221.3,217.14 221.33,217.2 221.33,217.2 C221.33,217.2 221.34,217.26 221.34,217.26 C221.34,217.26 221.36,217.32 221.36,217.32 C221.36,217.32 221.38,217.38 221.38,217.38 C221.38,217.38 221.4,217.44 221.4,217.44 C221.4,217.44 221.42,217.5 221.42,217.5 C221.42,217.5 221.44,217.56 221.44,217.56 C221.44,217.56 221.45,217.62 221.45,217.62 C221.45,217.62 221.46,217.68 221.46,217.68 C221.46,217.68 221.48,217.74 221.48,217.74 C221.48,217.74 221.49,217.8 221.49,217.8 C221.49,217.8 221.5,217.87 221.5,217.87 C221.5,217.87 221.51,217.93 221.51,217.93 C221.51,217.93 221.52,217.99 221.52,217.99 C221.52,217.99 221.53,218.05 221.53,218.05 C221.53,218.05 221.54,218.11 221.54,218.11 C221.54,218.11 221.54,218.18 221.54,218.18 C221.54,218.18 221.55,218.24 221.55,218.24 C221.55,218.24 221.55,218.3 221.55,218.3 C221.55,218.3 221.55,218.37 221.55,218.37 C221.55,218.37 221.56,218.43 221.56,218.43 C221.56,218.43 221.56,218.49 221.56,218.49 C221.56,218.49 221.56,218.55 221.56,218.55 C221.56,218.55 221.56,218.62 221.56,218.62 C221.56,218.62 221.56,218.68 221.56,218.68 C221.56,218.68 221.55,218.74 221.55,218.74 C221.55,218.74 221.55,218.81 221.55,218.81 C221.55,218.81 221.55,218.87 221.55,218.87 C221.55,218.87 221.54,218.93 221.54,218.93 C221.54,218.93 221.54,218.99 221.54,218.99 C221.54,218.99 221.53,219.06 221.53,219.06 C221.53,219.06 221.52,219.12 221.52,219.12 C221.52,219.12 221.51,219.18 221.51,219.18 C221.51,219.18 221.5,219.24 221.5,219.24 C221.5,219.24 221.49,219.3 221.49,219.3 C221.49,219.3 221.48,219.37 221.48,219.37 C221.48,219.37 221.46,219.43 221.46,219.43 C221.46,219.43 221.45,219.49 221.45,219.49 C221.45,219.49 221.43,219.55 221.43,219.55 C221.43,219.55 221.42,219.61 221.42,219.61 C221.42,219.61 221.4,219.67 221.4,219.67 C221.4,219.67 221.39,219.73 221.39,219.73 C221.39,219.73 221.37,219.79 221.37,219.79 C221.37,219.79 221.34,219.85 221.34,219.85 C221.34,219.85 221.32,219.91 221.32,219.91 C221.32,219.91 221.3,219.97 221.3,219.97 C221.3,219.97 221.28,220.03 221.28,220.03 C221.28,220.03 221.26,220.09 221.26,220.09 C221.26,220.09 221.23,220.14 221.23,220.14 C221.23,220.14 221.21,220.2 221.21,220.2 C221.21,220.2 221.18,220.26 221.18,220.26 C221.18,220.26 221.15,220.32 221.15,220.32 C221.15,220.32 221.13,220.37 221.13,220.37 C221.13,220.37 221.1,220.43 221.1,220.43 C221.1,220.43 221.07,220.48 221.07,220.48 C221.07,220.48 221.03,220.54 221.03,220.54 C221.03,220.54 221,220.59 221,220.59 C221,220.59 220.97,220.65 220.97,220.65 C220.97,220.65 220.94,220.7 220.94,220.7 C220.94,220.7 220.9,220.75 220.9,220.75 C220.9,220.75 220.87,220.8 220.87,220.8 C220.87,220.8 220.83,220.86 220.83,220.86 C220.83,220.86 220.8,220.91 220.8,220.91 C220.8,220.91 220.76,220.96 220.76,220.96 C220.76,220.96 220.72,221.01 220.72,221.01 C220.72,221.01 220.68,221.06 220.68,221.06 C220.68,221.06 220.64,221.11 220.64,221.11 C220.64,221.11 220.6,221.15 220.6,221.15 C220.6,221.15 220.56,221.2 220.56,221.2 C220.56,221.2 220.52,221.25 220.52,221.25 C220.52,221.25 220.48,221.3 220.48,221.3 C220.48,221.3 220.43,221.34 220.43,221.34 C220.43,221.34 220.39,221.38 220.39,221.38 C220.39,221.38 220.34,221.43 220.34,221.43 C220.34,221.43 220.3,221.47 220.3,221.47 C220.3,221.47 220.25,221.52 220.25,221.52 C220.25,221.52 220.21,221.56 220.21,221.56 C220.21,221.56 220.16,221.6 220.16,221.6 C220.16,221.6 220.11,221.64 220.11,221.64 C220.11,221.64 220.06,221.68 220.06,221.68 C220.06,221.68 220.01,221.72 220.01,221.72 C220.01,221.72 219.96,221.76 219.96,221.76 C219.96,221.76 219.91,221.8 219.91,221.8 C219.91,221.8 219.86,221.83 219.86,221.83 C219.86,221.83 219.81,221.87 219.81,221.87 C219.81,221.87 219.75,221.9 219.75,221.9 C219.75,221.9 219.7,221.93 219.7,221.93 C219.7,221.93 219.65,221.97 219.65,221.97 C219.65,221.97 219.6,222 219.6,222 C219.6,222 219.54,222.03 219.54,222.03 C219.54,222.03 219.49,222.06 219.49,222.06 C219.49,222.06 219.43,222.09 219.43,222.09 C219.43,222.09 219.37,222.12 219.37,222.12 C219.37,222.12 219.32,222.15 219.32,222.15 C219.32,222.15 219.26,222.18 219.26,222.18 C219.26,222.18 219.21,222.2 219.21,222.2 C219.21,222.2 219.15,222.23 219.15,222.23 C219.15,222.23 219.09,222.25 219.09,222.25 C219.09,222.25 219.03,222.28 219.03,222.28 C219.03,222.28 218.97,222.3 218.97,222.3 C218.97,222.3 218.91,222.32 218.91,222.32 C218.91,222.32 218.85,222.34 218.85,222.34 C218.85,222.34 218.79,222.36 218.79,222.36 C218.79,222.36 218.73,222.38 218.73,222.38 C218.73,222.38 218.67,222.4 218.67,222.4 C218.67,222.4 218.61,222.42 218.61,222.42 C218.61,222.42 218.55,222.44 218.55,222.44 C218.55,222.44 218.49,222.45 218.49,222.45 C218.49,222.45 218.43,222.46 218.43,222.46 C218.43,222.46 218.37,222.47 218.37,222.47 C218.37,222.47 218.31,222.49 218.31,222.49 C218.31,222.49 218.25,222.5 218.25,222.5 C218.25,222.5 218.18,222.51 218.18,222.51 C218.18,222.51 218.12,222.52 218.12,222.52 C218.12,222.52 218.06,222.53 218.06,222.53 C218.06,222.53 218,222.54 218,222.54 C218,222.54 217.93,222.54 217.93,222.54 C217.93,222.54 217.87,222.55 217.87,222.55 C217.87,222.55 217.81,222.55 217.81,222.55 C217.81,222.55 217.75,222.55 217.75,222.55 C217.75,222.55 217.68,222.56 217.68,222.56 C217.68,222.56 217.62,222.56 217.62,222.56 C217.62,222.56 217.56,222.56 217.56,222.56 C217.56,222.56 217.49,222.56 217.49,222.56 C217.49,222.56 217.43,222.56 217.43,222.56 C217.43,222.56 217.37,222.55 217.37,222.55 C217.37,222.55 217.3,222.55 217.3,222.55 C217.3,222.55 217.24,222.55 217.24,222.55 C217.24,222.55 217.18,222.54 217.18,222.54 C217.18,222.54 217.12,222.54 217.12,222.54 C217.12,222.54 217.05,222.53 217.05,222.53 C217.05,222.53 216.99,222.52 216.99,222.52 C216.99,222.52 216.93,222.51 216.93,222.51 C216.93,222.51 216.87,222.5 216.87,222.5 C216.87,222.5 216.81,222.49 216.81,222.49 C216.81,222.49 216.74,222.48 216.74,222.48 C216.74,222.48 216.68,222.46 216.68,222.46 C216.68,222.46 216.62,222.45 216.62,222.45 C216.62,222.45 216.56,222.43 216.56,222.43 C216.56,222.43 216.5,222.42 216.5,222.42 C216.5,222.42 216.44,222.4 216.44,222.4 C216.44,222.4 216.38,222.38 216.38,222.38 C216.38,222.38 216.32,222.36 216.32,222.36 C216.32,222.36 216.26,222.34 216.26,222.34 C216.26,222.34 216.2,222.32 216.2,222.32 C216.2,222.32 216.14,222.3 216.14,222.3 C216.14,222.3 216.08,222.28 216.08,222.28 C216.08,222.28 216.02,222.26 216.02,222.26 C216.02,222.26 215.97,222.23 215.97,222.23 C215.97,222.23 215.91,222.2 215.91,222.2 C215.91,222.2 215.85,222.18 215.85,222.18 C215.85,222.18 215.79,222.15 215.79,222.15 C215.79,222.15 215.74,222.12 215.74,222.12 C215.74,222.12 215.68,222.1 215.68,222.1 C215.68,222.1 215.63,222.06 215.63,222.06 C215.63,222.06 215.57,222.03 215.57,222.03 C215.57,222.03 215.52,222 215.52,222 C215.52,222 215.46,221.97 215.46,221.97 C215.46,221.97 215.41,221.94 215.41,221.94 C215.41,221.94 215.36,221.9 215.36,221.9 C215.36,221.9 215.31,221.87 215.31,221.87 C215.31,221.87 215.25,221.83 215.25,221.83 C215.25,221.83 215.2,221.79 215.2,221.79 C215.2,221.79 215.15,221.76 215.15,221.76 C215.15,221.76 215.1,221.72 215.1,221.72 C215.1,221.72 215.05,221.68 215.05,221.68 C215.05,221.68 215,221.64 215,221.64 C215,221.64 214.96,221.6 214.96,221.6 C214.96,221.6 214.91,221.56 214.91,221.56 C214.91,221.56 214.86,221.52 214.86,221.52 C214.86,221.52 214.81,221.48 214.81,221.48 C214.81,221.48 214.77,221.43 214.77,221.43 C214.77,221.43 214.73,221.39 214.73,221.39 C214.73,221.39 214.68,221.34 214.68,221.34 C214.68,221.34 214.64,221.3 214.64,221.3 C214.64,221.3 214.59,221.25 214.59,221.25 C214.59,221.25 214.55,221.2 214.55,221.2 C214.55,221.2 214.51,221.15 214.51,221.15 C214.51,221.15 214.47,221.11 214.47,221.11 C214.47,221.11 214.43,221.06 214.43,221.06 C214.43,221.06 214.39,221.01 214.39,221.01 C214.39,221.01 214.35,220.96 214.35,220.96 C214.35,220.96 214.31,220.91 214.31,220.91 C214.31,220.91 214.28,220.86 214.28,220.86 C214.28,220.86 214.25,220.81 214.25,220.81 C214.25,220.81 214.21,220.75 214.21,220.75 C214.21,220.75 214.18,220.7 214.18,220.7 C214.18,220.7 214.14,220.65 214.14,220.65 C214.14,220.65 214.11,220.59 214.11,220.59 C214.11,220.59 214.08,220.54 214.08,220.54 C214.08,220.54 214.05,220.48 214.05,220.48 C214.05,220.48 214.02,220.43 214.02,220.43 C214.02,220.43 213.99,220.37 213.99,220.37 C213.99,220.37 213.96,220.32 213.96,220.32 C213.96,220.32 213.93,220.26 213.93,220.26 C213.93,220.26 213.91,220.2 213.91,220.2 C213.91,220.2 213.88,220.14 213.88,220.14 C213.88,220.14 213.86,220.09 213.86,220.09 C213.86,220.09 213.83,220.03 213.83,220.03 C213.83,220.03 213.81,219.97 213.81,219.97 C213.81,219.97 213.79,219.91 213.79,219.91 C213.79,219.91 213.77,219.85 213.77,219.85 C213.77,219.85 213.75,219.79 213.75,219.79 C213.75,219.79 213.73,219.73 213.73,219.73 C213.73,219.73 213.71,219.67 213.71,219.67 C213.71,219.67 213.69,219.61 213.69,219.61 C213.69,219.61 213.68,219.55 213.68,219.55 C213.68,219.55 213.66,219.49 213.66,219.49 C213.66,219.49 213.65,219.43 213.65,219.43 C213.65,219.43 213.64,219.37 213.64,219.37 C213.64,219.37 213.62,219.31 213.62,219.31 C213.62,219.31 213.61,219.24 213.61,219.24 C213.61,219.24 213.6,219.18 213.6,219.18 C213.6,219.18 213.59,219.12 213.59,219.12 C213.59,219.12 213.58,219.06 213.58,219.06 C213.58,219.06 213.57,218.99 213.57,218.99 C213.57,218.99 213.57,218.93 213.57,218.93 C213.57,218.93 213.56,218.87 213.56,218.87 C213.56,218.87 213.56,218.81 213.56,218.81 C213.56,218.81 213.56,218.74 213.56,218.74 C213.56,218.74 213.56,218.68 213.56,218.68 C213.56,218.68 213.55,218.62 213.55,218.62 C213.55,218.62 213.55,218.55 213.55,218.55 C213.55,218.55 213.55,218.49 213.55,218.49 C213.55,218.49 213.56,218.43 213.56,218.43 C213.56,218.43 213.56,218.37 213.56,218.37 C213.56,218.37 213.56,218.3 213.56,218.3 C213.56,218.3 213.56,218.24 213.56,218.24 C213.56,218.24 213.57,218.18 213.57,218.18 C213.57,218.18 213.57,218.12 213.57,218.12 C213.57,218.12 213.58,218.05 213.58,218.05 C213.58,218.05 213.59,217.99 213.59,217.99 C213.59,217.99 213.6,217.93 213.6,217.93 C213.6,217.93 213.61,217.87 213.61,217.87 C213.61,217.87 213.62,217.8 213.62,217.8 C213.62,217.8 213.63,217.74 213.63,217.74 C213.63,217.74 213.65,217.68 213.65,217.68 C213.65,217.68 213.66,217.62 213.66,217.62 C213.66,217.62 213.68,217.56 213.68,217.56 C213.68,217.56 213.69,217.5 213.69,217.5 C213.69,217.5 213.71,217.44 213.71,217.44 C213.71,217.44 213.73,217.38 213.73,217.38 C213.73,217.38 213.75,217.32 213.75,217.32 C213.75,217.32 213.77,217.26 213.77,217.26 C213.77,217.26 213.79,217.2 213.79,217.2 C213.79,217.2 213.81,217.14 213.81,217.14 C213.81,217.14 213.83,217.08 213.83,217.08 C213.83,217.08 213.85,217.02 213.85,217.02 C213.85,217.02 213.88,216.96 213.88,216.96 C213.88,216.96 213.91,216.91 213.91,216.91 C213.91,216.91 213.93,216.85 213.93,216.85 C213.93,216.85 213.96,216.79 213.96,216.79 C213.96,216.79 213.99,216.74 213.99,216.74 C213.99,216.74 214.02,216.68 214.02,216.68 C214.02,216.68 214.05,216.63 214.05,216.63 C214.05,216.63 214.08,216.57 214.08,216.57 C214.08,216.57 214.11,216.52 214.11,216.52 C214.11,216.52 214.14,216.46 214.14,216.46 C214.14,216.46 214.17,216.41 214.17,216.41 C214.17,216.41 214.21,216.36 214.21,216.36 C214.21,216.36 214.24,216.3 214.24,216.3 C214.24,216.3 214.28,216.25 214.28,216.25 C214.28,216.25 214.32,216.2 214.32,216.2 C214.32,216.2 214.35,216.15 214.35,216.15 C214.35,216.15 214.39,216.1 214.39,216.1 C214.39,216.1 214.43,216.05 214.43,216.05 C214.43,216.05 214.47,216 214.47,216 C214.47,216 214.51,215.96 214.51,215.96 C214.51,215.96 214.55,215.91 214.55,215.91 C214.55,215.91 214.59,215.86 214.59,215.86 C214.59,215.86 214.64,215.81 214.64,215.81 C214.64,215.81 214.68,215.77 214.68,215.77 C214.68,215.77 214.73,215.72 214.73,215.72 C214.73,215.72 214.77,215.68 214.77,215.68 C214.77,215.68 214.82,215.64 214.82,215.64 C214.82,215.64 214.86,215.59 214.86,215.59 C214.86,215.59 214.91,215.55 214.91,215.55 C214.91,215.55 214.96,215.51 214.96,215.51 C214.96,215.51 215,215.47 215,215.47 C215,215.47 215.05,215.43 215.05,215.43 C215.05,215.43 215.1,215.39 215.1,215.39 C215.1,215.39 215.15,215.35 215.15,215.35 C215.15,215.35 215.2,215.31 215.2,215.31 C215.2,215.31 215.25,215.28 215.25,215.28 C215.25,215.28 215.31,215.24 215.31,215.24 C215.31,215.24 215.36,215.21 215.36,215.21 C215.36,215.21 215.41,215.17 215.41,215.17 C215.41,215.17 215.46,215.14 215.46,215.14 C215.46,215.14 215.52,215.11 215.52,215.11 C215.52,215.11 215.57,215.08 215.57,215.08 C215.57,215.08 215.63,215.05 215.63,215.05 C215.63,215.05 215.68,215.02 215.68,215.02 C215.68,215.02 215.74,214.99 215.74,214.99 C215.74,214.99 215.79,214.96 215.79,214.96 C215.79,214.96 215.85,214.93 215.85,214.93 C215.85,214.93 215.91,214.9 215.91,214.9 C215.91,214.9 215.97,214.88 215.97,214.88 C215.97,214.88 216.02,214.86 216.02,214.86 C216.02,214.86 216.08,214.83 216.08,214.83 C216.08,214.83 216.14,214.81 216.14,214.81 C216.14,214.81 216.2,214.78 216.2,214.78 C216.2,214.78 216.26,214.77 216.26,214.77 C216.26,214.77 216.32,214.75 216.32,214.75 C216.32,214.75 216.38,214.73 216.38,214.73 C216.38,214.73 216.44,214.71 216.44,214.71 C216.44,214.71 216.5,214.69 216.5,214.69 C216.5,214.69 216.56,214.67 216.56,214.67 C216.56,214.67 216.62,214.66 216.62,214.66 C216.62,214.66 216.68,214.65 216.68,214.65 C216.68,214.65 216.74,214.63 216.74,214.63 C216.74,214.63 216.81,214.62 216.81,214.62 C216.81,214.62 216.87,214.61 216.87,214.61 C216.87,214.61 216.93,214.6 216.93,214.6 C216.93,214.6 216.99,214.59 216.99,214.59 C216.99,214.59 217.05,214.58 217.05,214.58 C217.05,214.58 217.12,214.57 217.12,214.57 C217.12,214.57 217.18,214.57 217.18,214.57 C217.18,214.57 217.24,214.56 217.24,214.56 C217.24,214.56 217.3,214.56 217.3,214.56 C217.3,214.56 217.37,214.56 217.37,214.56 C217.37,214.56 217.43,214.55 217.43,214.55 C217.43,214.55 217.49,214.55 217.49,214.55 C217.49,214.55 217.56,214.55 217.56,214.55 C217.56,214.55 217.62,214.55 217.62,214.55c " android:valueTo="M217.57 201.76 C217.57,201.76 217.82,201.81 217.82,201.81 C217.82,201.81 218.08,201.86 218.08,201.86 C218.08,201.86 218.34,201.92 218.34,201.92 C218.34,201.92 218.6,201.97 218.6,201.97 C218.6,201.97 218.85,202.04 218.85,202.04 C218.85,202.04 219.11,202.12 219.11,202.12 C219.11,202.12 219.36,202.19 219.36,202.19 C219.36,202.19 219.61,202.27 219.61,202.27 C219.61,202.27 219.86,202.34 219.86,202.34 C219.86,202.34 220.11,202.44 220.11,202.44 C220.11,202.44 220.35,202.54 220.35,202.54 C220.35,202.54 220.6,202.64 220.6,202.64 C220.6,202.64 220.84,202.73 220.84,202.73 C220.84,202.73 221.09,202.83 221.09,202.83 C221.09,202.83 221.32,202.94 221.32,202.94 C221.32,202.94 221.56,203.07 221.56,203.07 C221.56,203.07 221.79,203.19 221.79,203.19 C221.79,203.19 222.03,203.31 222.03,203.31 C222.03,203.31 222.26,203.43 222.26,203.43 C222.26,203.43 222.49,203.56 222.49,203.56 C222.49,203.56 222.71,203.7 222.71,203.7 C222.71,203.7 222.93,203.85 222.93,203.85 C222.93,203.85 223.15,203.99 223.15,203.99 C223.15,203.99 223.37,204.13 223.37,204.13 C223.37,204.13 223.59,204.28 223.59,204.28 C223.59,204.28 223.8,204.44 223.8,204.44 C223.8,204.44 224.01,204.6 224.01,204.6 C224.01,204.6 224.22,204.76 224.22,204.76 C224.22,204.76 224.42,204.93 224.42,204.93 C224.42,204.93 224.62,205.1 224.62,205.1 C224.62,205.1 224.81,205.28 224.81,205.28 C224.81,205.28 225.01,205.46 225.01,205.46 C225.01,205.46 225.2,205.64 225.2,205.64 C225.2,205.64 225.4,205.81 225.4,205.81 C225.4,205.81 225.59,206 225.59,206 C225.59,206 225.77,206.19 225.77,206.19 C225.77,206.19 225.96,206.37 225.96,206.37 C225.96,206.37 226.15,206.56 226.15,206.56 C226.15,206.56 226.33,206.74 226.33,206.74 C226.33,206.74 226.52,206.93 226.52,206.93 C226.52,206.93 226.7,207.12 226.7,207.12 C226.7,207.12 226.89,207.3 226.89,207.3 C226.89,207.3 227.08,207.49 227.08,207.49 C227.08,207.49 227.26,207.68 227.26,207.68 C227.26,207.68 227.45,207.86 227.45,207.86 C227.45,207.86 227.64,208.05 227.64,208.05 C227.64,208.05 227.82,208.24 227.82,208.24 C227.82,208.24 228.01,208.42 228.01,208.42 C228.01,208.42 228.2,208.61 228.2,208.61 C228.2,208.61 228.38,208.79 228.38,208.79 C228.38,208.79 228.57,208.98 228.57,208.98 C228.57,208.98 228.75,209.17 228.75,209.17 C228.75,209.17 228.94,209.35 228.94,209.35 C228.94,209.35 229.13,209.54 229.13,209.54 C229.13,209.54 229.31,209.73 229.31,209.73 C229.31,209.73 229.5,209.91 229.5,209.91 C229.5,209.91 229.69,210.1 229.69,210.1 C229.69,210.1 229.87,210.29 229.87,210.29 C229.87,210.29 230.06,210.47 230.06,210.47 C230.06,210.47 230.25,210.66 230.25,210.66 C230.25,210.66 230.42,210.85 230.42,210.85 C230.42,210.85 230.6,211.05 230.6,211.05 C230.6,211.05 230.78,211.24 230.78,211.24 C230.78,211.24 230.95,211.44 230.95,211.44 C230.95,211.44 231.13,211.63 231.13,211.63 C231.13,211.63 231.3,211.84 231.3,211.84 C231.3,211.84 231.45,212.05 231.45,212.05 C231.45,212.05 231.61,212.26 231.61,212.26 C231.61,212.26 231.77,212.47 231.77,212.47 C231.77,212.47 231.93,212.68 231.93,212.68 C231.93,212.68 232.08,212.9 232.08,212.9 C232.08,212.9 232.22,213.12 232.22,213.12 C232.22,213.12 232.35,213.35 232.35,213.35 C232.35,213.35 232.49,213.57 232.49,213.57 C232.49,213.57 232.63,213.8 232.63,213.8 C232.63,213.8 232.76,214.02 232.76,214.02 C232.76,214.02 232.88,214.26 232.88,214.26 C232.88,214.26 232.99,214.5 232.99,214.5 C232.99,214.5 233.11,214.74 233.11,214.74 C233.11,214.74 233.22,214.97 233.22,214.97 C233.22,214.97 233.33,215.21 233.33,215.21 C233.33,215.21 233.43,215.46 233.43,215.46 C233.43,215.46 233.52,215.7 233.52,215.7 C233.52,215.7 233.62,215.95 233.62,215.95 C233.62,215.95 233.71,216.2 233.71,216.2 C233.71,216.2 233.8,216.45 233.8,216.45 C233.8,216.45 233.88,216.7 233.88,216.7 C233.88,216.7 233.94,216.95 233.94,216.95 C233.94,216.95 234.01,217.21 234.01,217.21 C234.01,217.21 234.08,217.46 234.08,217.46 C234.08,217.46 234.15,217.71 234.15,217.71 C234.15,217.71 234.21,217.97 234.21,217.97 C234.21,217.97 234.25,218.23 234.25,218.23 C234.25,218.23 234.3,218.49 234.3,218.49 C234.3,218.49 234.34,218.75 234.34,218.75 C234.34,218.75 234.38,219.01 234.38,219.01 C234.38,219.01 234.42,219.27 234.42,219.27 C234.42,219.27 234.44,219.53 234.44,219.53 C234.44,219.53 234.46,219.8 234.46,219.8 C234.46,219.8 234.48,220.06 234.48,220.06 C234.48,220.06 234.5,220.32 234.5,220.32 C234.5,220.32 234.52,220.58 234.52,220.58 C234.52,220.58 234.51,220.85 234.51,220.85 C234.51,220.85 234.51,221.11 234.51,221.11 C234.51,221.11 234.5,221.38 234.5,221.38 C234.5,221.38 234.5,221.64 234.5,221.64 C234.5,221.64 234.49,221.9 234.49,221.9 C234.49,221.9 234.47,222.17 234.47,222.17 C234.47,222.17 234.44,222.43 234.44,222.43 C234.44,222.43 234.41,222.69 234.41,222.69 C234.41,222.69 234.38,222.95 234.38,222.95 C234.38,222.95 234.35,223.21 234.35,223.21 C234.35,223.21 234.3,223.47 234.3,223.47 C234.3,223.47 234.25,223.73 234.25,223.73 C234.25,223.73 234.2,223.99 234.2,223.99 C234.2,223.99 234.15,224.25 234.15,224.25 C234.15,224.25 234.09,224.51 234.09,224.51 C234.09,224.51 234.02,224.76 234.02,224.76 C234.02,224.76 233.95,225.01 233.95,225.01 C233.95,225.01 233.87,225.26 233.87,225.26 C233.87,225.26 233.79,225.52 233.79,225.52 C233.79,225.52 233.72,225.77 233.72,225.77 C233.72,225.77 233.63,226.01 233.63,226.01 C233.63,226.01 233.53,226.26 233.53,226.26 C233.53,226.26 233.43,226.5 233.43,226.5 C233.43,226.5 233.33,226.75 233.33,226.75 C233.33,226.75 233.23,226.99 233.23,226.99 C233.23,226.99 233.12,227.23 233.12,227.23 C233.12,227.23 233,227.46 233,227.46 C233,227.46 232.88,227.7 232.88,227.7 C232.88,227.7 232.75,227.93 232.75,227.93 C232.75,227.93 232.63,228.17 232.63,228.17 C232.63,228.17 232.5,228.4 232.5,228.4 C232.5,228.4 232.36,228.62 232.36,228.62 C232.36,228.62 232.22,228.84 232.22,228.84 C232.22,228.84 232.07,229.06 232.07,229.06 C232.07,229.06 231.93,229.28 231.93,229.28 C231.93,229.28 231.79,229.5 231.79,229.5 C231.79,229.5 231.63,229.71 231.63,229.71 C231.63,229.71 231.46,229.92 231.46,229.92 C231.46,229.92 231.3,230.13 231.3,230.13 C231.3,230.13 231.14,230.33 231.14,230.33 C231.14,230.33 230.96,230.52 230.96,230.52 C230.96,230.52 230.78,230.72 230.78,230.72 C230.78,230.72 230.6,230.92 230.6,230.92 C230.6,230.92 230.43,231.11 230.43,231.11 C230.43,231.11 230.25,231.31 230.25,231.31 C230.25,231.31 230.05,231.49 230.05,231.49 C230.05,231.49 229.86,231.66 229.86,231.66 C229.86,231.66 229.66,231.84 229.66,231.84 C229.66,231.84 229.47,232.02 229.47,232.02 C229.47,232.02 229.27,232.19 229.27,232.19 C229.27,232.19 229.07,232.36 229.07,232.36 C229.07,232.36 228.86,232.52 228.86,232.52 C228.86,232.52 228.64,232.68 228.64,232.68 C228.64,232.68 228.43,232.83 228.43,232.83 C228.43,232.83 228.22,232.99 228.22,232.99 C228.22,232.99 228.01,233.14 228.01,233.14 C228.01,233.14 227.78,233.28 227.78,233.28 C227.78,233.28 227.56,233.42 227.56,233.42 C227.56,233.42 227.33,233.55 227.33,233.55 C227.33,233.55 227.11,233.69 227.11,233.69 C227.11,233.69 226.88,233.83 226.88,233.83 C226.88,233.83 226.64,233.94 226.64,233.94 C226.64,233.94 226.41,234.06 226.41,234.06 C226.41,234.06 226.17,234.17 226.17,234.17 C226.17,234.17 225.93,234.28 225.93,234.28 C225.93,234.28 225.69,234.4 225.69,234.4 C225.69,234.4 225.45,234.5 225.45,234.5 C225.45,234.5 225.2,234.59 225.2,234.59 C225.2,234.59 224.95,234.68 224.95,234.68 C224.95,234.68 224.71,234.77 224.71,234.77 C224.71,234.77 224.46,234.86 224.46,234.86 C224.46,234.86 224.21,234.94 224.21,234.94 C224.21,234.94 223.95,235.01 223.95,235.01 C223.95,235.01 223.7,235.08 223.7,235.08 C223.7,235.08 223.44,235.14 223.44,235.14 C223.44,235.14 223.19,235.21 223.19,235.21 C223.19,235.21 222.93,235.27 222.93,235.27 C222.93,235.27 222.67,235.31 222.67,235.31 C222.67,235.31 222.41,235.36 222.41,235.36 C222.41,235.36 222.15,235.4 222.15,235.4 C222.15,235.4 221.89,235.45 221.89,235.45 C221.89,235.45 221.63,235.48 221.63,235.48 C221.63,235.48 221.37,235.5 221.37,235.5 C221.37,235.5 221.11,235.52 221.11,235.52 C221.11,235.52 220.84,235.54 220.84,235.54 C220.84,235.54 220.58,235.56 220.58,235.56 C220.58,235.56 220.32,235.58 220.32,235.58 C220.32,235.58 220.06,235.57 220.06,235.57 C220.06,235.57 219.79,235.57 219.79,235.57 C219.79,235.57 219.53,235.57 219.53,235.57 C219.53,235.57 219.26,235.56 219.26,235.56 C219.26,235.56 219,235.56 219,235.56 C219,235.56 218.74,235.53 218.74,235.53 C218.74,235.53 218.48,235.5 218.48,235.5 C218.48,235.5 218.22,235.47 218.22,235.47 C218.22,235.47 217.95,235.44 217.95,235.44 C217.95,235.44 217.69,235.41 217.69,235.41 C217.69,235.41 217.43,235.36 217.43,235.36 C217.43,235.36 217.17,235.31 217.17,235.31 C217.17,235.31 216.92,235.26 216.92,235.26 C216.92,235.26 216.66,235.21 216.66,235.21 C216.66,235.21 216.4,235.15 216.4,235.15 C216.4,235.15 216.15,235.08 216.15,235.08 C216.15,235.08 215.89,235.01 215.89,235.01 C215.89,235.01 215.64,234.93 215.64,234.93 C215.64,234.93 215.39,234.85 215.39,234.85 C215.39,234.85 215.14,234.78 215.14,234.78 C215.14,234.78 214.89,234.69 214.89,234.69 C214.89,234.69 214.65,234.59 214.65,234.59 C214.65,234.59 214.4,234.49 214.4,234.49 C214.4,234.49 214.16,234.39 214.16,234.39 C214.16,234.39 213.91,234.29 213.91,234.29 C213.91,234.29 213.67,234.18 213.67,234.18 C213.67,234.18 213.44,234.06 213.44,234.06 C213.44,234.06 213.21,233.94 213.21,233.94 C213.21,233.94 212.97,233.81 212.97,233.81 C212.97,233.81 212.74,233.69 212.74,233.69 C212.74,233.69 212.51,233.56 212.51,233.56 C212.51,233.56 212.29,233.42 212.29,233.42 C212.29,233.42 212.07,233.28 212.07,233.28 C212.07,233.28 211.85,233.13 211.85,233.13 C211.85,233.13 211.63,232.99 211.63,232.99 C211.63,232.99 211.4,232.85 211.4,232.85 C211.4,232.85 211.2,232.69 211.2,232.69 C211.2,232.69 210.99,232.52 210.99,232.52 C210.99,232.52 210.78,232.36 210.78,232.36 C210.78,232.36 210.58,232.2 210.58,232.2 C210.58,232.2 210.38,232.02 210.38,232.02 C210.38,232.02 210.18,231.84 210.18,231.84 C210.18,231.84 209.99,231.66 209.99,231.66 C209.99,231.66 209.79,231.49 209.79,231.49 C209.79,231.49 209.6,231.31 209.6,231.31 C209.6,231.31 209.41,231.12 209.41,231.12 C209.41,231.12 209.23,230.94 209.23,230.94 C209.23,230.94 209.04,230.75 209.04,230.75 C209.04,230.75 208.85,230.56 208.85,230.56 C208.85,230.56 208.67,230.38 208.67,230.38 C208.67,230.38 208.48,230.19 208.48,230.19 C208.48,230.19 208.29,230.01 208.29,230.01 C208.29,230.01 208.11,229.82 208.11,229.82 C208.11,229.82 207.92,229.63 207.92,229.63 C207.92,229.63 207.74,229.45 207.74,229.45 C207.74,229.45 207.55,229.26 207.55,229.26 C207.55,229.26 207.36,229.07 207.36,229.07 C207.36,229.07 207.18,228.89 207.18,228.89 C207.18,228.89 206.99,228.7 206.99,228.7 C206.99,228.7 206.8,228.51 206.8,228.51 C206.8,228.51 206.62,228.33 206.62,228.33 C206.62,228.33 206.43,228.14 206.43,228.14 C206.43,228.14 206.24,227.96 206.24,227.96 C206.24,227.96 206.06,227.77 206.06,227.77 C206.06,227.77 205.87,227.58 205.87,227.58 C205.87,227.58 205.69,227.4 205.69,227.4 C205.69,227.4 205.5,227.21 205.5,227.21 C205.5,227.21 205.31,227.02 205.31,227.02 C205.31,227.02 205.13,226.84 205.13,226.84 C205.13,226.84 204.94,226.65 204.94,226.65 C204.94,226.65 204.75,226.46 204.75,226.46 C204.75,226.46 204.58,226.27 204.58,226.27 C204.58,226.27 204.4,226.07 204.4,226.07 C204.4,226.07 204.22,225.88 204.22,225.88 C204.22,225.88 204.05,225.68 204.05,225.68 C204.05,225.68 203.87,225.49 203.87,225.49 C203.87,225.49 203.7,225.28 203.7,225.28 C203.7,225.28 203.54,225.07 203.54,225.07 C203.54,225.07 203.39,224.86 203.39,224.86 C203.39,224.86 203.23,224.65 203.23,224.65 C203.23,224.65 203.07,224.44 203.07,224.44 C203.07,224.44 202.92,224.22 202.92,224.22 C202.92,224.22 202.78,224 202.78,224 C202.78,224 202.65,223.77 202.65,223.77 C202.65,223.77 202.51,223.55 202.51,223.55 C202.51,223.55 202.37,223.32 202.37,223.32 C202.37,223.32 202.24,223.1 202.24,223.1 C202.24,223.1 202.12,222.86 202.12,222.86 C202.12,222.86 202.01,222.62 202.01,222.62 C202.01,222.62 201.89,222.39 201.89,222.39 C201.89,222.39 201.78,222.15 201.78,222.15 C201.78,222.15 201.67,221.91 201.67,221.91 C201.67,221.91 201.57,221.67 201.57,221.67 C201.57,221.67 201.48,221.42 201.48,221.42 C201.48,221.42 201.38,221.17 201.38,221.17 C201.38,221.17 201.29,220.92 201.29,220.92 C201.29,220.92 201.2,220.68 201.2,220.68 C201.2,220.68 201.12,220.43 201.12,220.43 C201.12,220.43 201.06,220.17 201.06,220.17 C201.06,220.17 200.99,219.92 200.99,219.92 C200.99,219.92 200.92,219.66 200.92,219.66 C200.92,219.66 200.85,219.41 200.85,219.41 C200.85,219.41 200.79,219.15 200.79,219.15 C200.79,219.15 200.75,218.89 200.75,218.89 C200.75,218.89 200.71,218.63 200.71,218.63 C200.71,218.63 200.66,218.37 200.66,218.37 C200.66,218.37 200.62,218.11 200.62,218.11 C200.62,218.11 200.58,217.85 200.58,217.85 C200.58,217.85 200.56,217.59 200.56,217.59 C200.56,217.59 200.54,217.32 200.54,217.32 C200.54,217.32 200.52,217.06 200.52,217.06 C200.52,217.06 200.5,216.8 200.5,216.8 C200.5,216.8 200.48,216.54 200.48,216.54 C200.48,216.54 200.49,216.27 200.49,216.27 C200.49,216.27 200.49,216.01 200.49,216.01 C200.49,216.01 200.5,215.75 200.5,215.75 C200.5,215.75 200.5,215.48 200.5,215.48 C200.5,215.48 200.51,215.22 200.51,215.22 C200.51,215.22 200.53,214.96 200.53,214.96 C200.53,214.96 200.56,214.69 200.56,214.69 C200.56,214.69 200.59,214.43 200.59,214.43 C200.59,214.43 200.62,214.17 200.62,214.17 C200.62,214.17 200.65,213.91 200.65,213.91 C200.65,213.91 200.7,213.65 200.7,213.65 C200.7,213.65 200.75,213.39 200.75,213.39 C200.75,213.39 200.8,213.13 200.8,213.13 C200.8,213.13 200.86,212.88 200.86,212.88 C200.86,212.88 200.91,212.62 200.91,212.62 C200.91,212.62 200.98,212.36 200.98,212.36 C200.98,212.36 201.06,212.11 201.06,212.11 C201.06,212.11 201.13,211.86 201.13,211.86 C201.13,211.86 201.21,211.61 201.21,211.61 C201.21,211.61 201.28,211.35 201.28,211.35 C201.28,211.35 201.38,211.11 201.38,211.11 C201.38,211.11 201.47,210.86 201.47,210.86 C201.47,210.86 201.57,210.62 201.57,210.62 C201.57,210.62 201.67,210.37 201.67,210.37 C201.67,210.37 201.77,210.13 201.77,210.13 C201.77,210.13 201.88,209.89 201.88,209.89 C201.88,209.89 202,209.66 202,209.66 C202,209.66 202.13,209.42 202.13,209.42 C202.13,209.42 202.25,209.19 202.25,209.19 C202.25,209.19 202.37,208.96 202.37,208.96 C202.37,208.96 202.5,208.73 202.5,208.73 C202.5,208.73 202.64,208.51 202.64,208.51 C202.64,208.51 202.79,208.28 202.79,208.28 C202.79,208.28 202.93,208.06 202.93,208.06 C202.93,208.06 203.07,207.84 203.07,207.84 C203.07,207.84 203.22,207.62 203.22,207.62 C203.22,207.62 203.38,207.41 203.38,207.41 C203.38,207.41 203.54,207.2 203.54,207.2 C203.54,207.2 203.7,207 203.7,207 C203.7,207 203.87,206.79 203.87,206.79 C203.87,206.79 204.04,206.6 204.04,206.6 C204.04,206.6 204.22,206.4 204.22,206.4 C204.22,206.4 204.4,206.21 204.4,206.21 C204.4,206.21 204.57,206.01 204.57,206.01 C204.57,206.01 204.75,205.82 204.75,205.82 C204.75,205.82 204.95,205.64 204.95,205.64 C204.95,205.64 205.14,205.46 205.14,205.46 C205.14,205.46 205.34,205.29 205.34,205.29 C205.34,205.29 205.53,205.11 205.53,205.11 C205.53,205.11 205.73,204.93 205.73,204.93 C205.73,204.93 205.93,204.76 205.93,204.76 C205.93,204.76 206.14,204.61 206.14,204.61 C206.14,204.61 206.35,204.45 206.35,204.45 C206.35,204.45 206.57,204.29 206.57,204.29 C206.57,204.29 206.78,204.13 206.78,204.13 C206.78,204.13 206.99,203.98 206.99,203.98 C206.99,203.98 207.22,203.85 207.22,203.85 C207.22,203.85 207.44,203.71 207.44,203.71 C207.44,203.71 207.67,203.57 207.67,203.57 C207.67,203.57 207.89,203.44 207.89,203.44 C207.89,203.44 208.12,203.3 208.12,203.3 C208.12,203.3 208.36,203.18 208.36,203.18 C208.36,203.18 208.59,203.07 208.59,203.07 C208.59,203.07 208.83,202.96 208.83,202.96 C208.83,202.96 209.07,202.84 209.07,202.84 C209.07,202.84 209.31,202.73 209.31,202.73 C209.31,202.73 209.55,202.63 209.55,202.63 C209.55,202.63 209.8,202.54 209.8,202.54 C209.8,202.54 210.04,202.45 210.04,202.45 C210.04,202.45 210.29,202.36 210.29,202.36 C210.29,202.36 210.54,202.26 210.54,202.26 C210.54,202.26 210.79,202.19 210.79,202.19 C210.79,202.19 211.05,202.12 211.05,202.12 C211.05,202.12 211.3,202.05 211.3,202.05 C211.3,202.05 211.55,201.98 211.55,201.98 C211.55,201.98 211.81,201.91 211.81,201.91 C211.81,201.91 212.07,201.86 212.07,201.86 C212.07,201.86 212.33,201.81 212.33,201.81 C212.33,201.81 212.59,201.77 212.59,201.77 C212.59,201.77 212.85,201.72 212.85,201.72 C212.85,201.72 213.11,201.68 213.11,201.68 C213.11,201.68 213.37,201.64 213.37,201.64 C213.37,201.64 213.63,201.62 213.63,201.62 C213.63,201.62 213.89,201.6 213.89,201.6 C213.89,201.6 214.15,201.58 214.15,201.58 C214.15,201.58 214.42,201.56 214.42,201.56 C214.42,201.56 214.68,201.55 214.68,201.55 C214.68,201.55 214.94,201.55 214.94,201.55 C214.94,201.55 215.21,201.55 215.21,201.55 C215.21,201.55 215.47,201.56 215.47,201.56 C215.47,201.56 215.73,201.56 215.73,201.56 C215.73,201.56 216,201.57 216,201.57 C216,201.57 216.26,201.6 216.26,201.6 C216.26,201.6 216.52,201.62 216.52,201.62 C216.52,201.62 216.78,201.65 216.78,201.65 C216.78,201.65 217.05,201.68 217.05,201.68 C217.05,201.68 217.31,201.71 217.31,201.71 C217.31,201.71 217.57,201.76 217.57,201.76c " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="pathData" android:duration="283" android:startOffset="67" android:valueFrom="M217.57 201.76 C217.57,201.76 217.82,201.81 217.82,201.81 C217.82,201.81 218.08,201.86 218.08,201.86 C218.08,201.86 218.34,201.92 218.34,201.92 C218.34,201.92 218.6,201.97 218.6,201.97 C218.6,201.97 218.85,202.04 218.85,202.04 C218.85,202.04 219.11,202.12 219.11,202.12 C219.11,202.12 219.36,202.19 219.36,202.19 C219.36,202.19 219.61,202.27 219.61,202.27 C219.61,202.27 219.86,202.34 219.86,202.34 C219.86,202.34 220.11,202.44 220.11,202.44 C220.11,202.44 220.35,202.54 220.35,202.54 C220.35,202.54 220.6,202.64 220.6,202.64 C220.6,202.64 220.84,202.73 220.84,202.73 C220.84,202.73 221.09,202.83 221.09,202.83 C221.09,202.83 221.32,202.94 221.32,202.94 C221.32,202.94 221.56,203.07 221.56,203.07 C221.56,203.07 221.79,203.19 221.79,203.19 C221.79,203.19 222.03,203.31 222.03,203.31 C222.03,203.31 222.26,203.43 222.26,203.43 C222.26,203.43 222.49,203.56 222.49,203.56 C222.49,203.56 222.71,203.7 222.71,203.7 C222.71,203.7 222.93,203.85 222.93,203.85 C222.93,203.85 223.15,203.99 223.15,203.99 C223.15,203.99 223.37,204.13 223.37,204.13 C223.37,204.13 223.59,204.28 223.59,204.28 C223.59,204.28 223.8,204.44 223.8,204.44 C223.8,204.44 224.01,204.6 224.01,204.6 C224.01,204.6 224.22,204.76 224.22,204.76 C224.22,204.76 224.42,204.93 224.42,204.93 C224.42,204.93 224.62,205.1 224.62,205.1 C224.62,205.1 224.81,205.28 224.81,205.28 C224.81,205.28 225.01,205.46 225.01,205.46 C225.01,205.46 225.2,205.64 225.2,205.64 C225.2,205.64 225.4,205.81 225.4,205.81 C225.4,205.81 225.59,206 225.59,206 C225.59,206 225.77,206.19 225.77,206.19 C225.77,206.19 225.96,206.37 225.96,206.37 C225.96,206.37 226.15,206.56 226.15,206.56 C226.15,206.56 226.33,206.74 226.33,206.74 C226.33,206.74 226.52,206.93 226.52,206.93 C226.52,206.93 226.7,207.12 226.7,207.12 C226.7,207.12 226.89,207.3 226.89,207.3 C226.89,207.3 227.08,207.49 227.08,207.49 C227.08,207.49 227.26,207.68 227.26,207.68 C227.26,207.68 227.45,207.86 227.45,207.86 C227.45,207.86 227.64,208.05 227.64,208.05 C227.64,208.05 227.82,208.24 227.82,208.24 C227.82,208.24 228.01,208.42 228.01,208.42 C228.01,208.42 228.2,208.61 228.2,208.61 C228.2,208.61 228.38,208.79 228.38,208.79 C228.38,208.79 228.57,208.98 228.57,208.98 C228.57,208.98 228.75,209.17 228.75,209.17 C228.75,209.17 228.94,209.35 228.94,209.35 C228.94,209.35 229.13,209.54 229.13,209.54 C229.13,209.54 229.31,209.73 229.31,209.73 C229.31,209.73 229.5,209.91 229.5,209.91 C229.5,209.91 229.69,210.1 229.69,210.1 C229.69,210.1 229.87,210.29 229.87,210.29 C229.87,210.29 230.06,210.47 230.06,210.47 C230.06,210.47 230.25,210.66 230.25,210.66 C230.25,210.66 230.42,210.85 230.42,210.85 C230.42,210.85 230.6,211.05 230.6,211.05 C230.6,211.05 230.78,211.24 230.78,211.24 C230.78,211.24 230.95,211.44 230.95,211.44 C230.95,211.44 231.13,211.63 231.13,211.63 C231.13,211.63 231.3,211.84 231.3,211.84 C231.3,211.84 231.45,212.05 231.45,212.05 C231.45,212.05 231.61,212.26 231.61,212.26 C231.61,212.26 231.77,212.47 231.77,212.47 C231.77,212.47 231.93,212.68 231.93,212.68 C231.93,212.68 232.08,212.9 232.08,212.9 C232.08,212.9 232.22,213.12 232.22,213.12 C232.22,213.12 232.35,213.35 232.35,213.35 C232.35,213.35 232.49,213.57 232.49,213.57 C232.49,213.57 232.63,213.8 232.63,213.8 C232.63,213.8 232.76,214.02 232.76,214.02 C232.76,214.02 232.88,214.26 232.88,214.26 C232.88,214.26 232.99,214.5 232.99,214.5 C232.99,214.5 233.11,214.74 233.11,214.74 C233.11,214.74 233.22,214.97 233.22,214.97 C233.22,214.97 233.33,215.21 233.33,215.21 C233.33,215.21 233.43,215.46 233.43,215.46 C233.43,215.46 233.52,215.7 233.52,215.7 C233.52,215.7 233.62,215.95 233.62,215.95 C233.62,215.95 233.71,216.2 233.71,216.2 C233.71,216.2 233.8,216.45 233.8,216.45 C233.8,216.45 233.88,216.7 233.88,216.7 C233.88,216.7 233.94,216.95 233.94,216.95 C233.94,216.95 234.01,217.21 234.01,217.21 C234.01,217.21 234.08,217.46 234.08,217.46 C234.08,217.46 234.15,217.71 234.15,217.71 C234.15,217.71 234.21,217.97 234.21,217.97 C234.21,217.97 234.25,218.23 234.25,218.23 C234.25,218.23 234.3,218.49 234.3,218.49 C234.3,218.49 234.34,218.75 234.34,218.75 C234.34,218.75 234.38,219.01 234.38,219.01 C234.38,219.01 234.42,219.27 234.42,219.27 C234.42,219.27 234.44,219.53 234.44,219.53 C234.44,219.53 234.46,219.8 234.46,219.8 C234.46,219.8 234.48,220.06 234.48,220.06 C234.48,220.06 234.5,220.32 234.5,220.32 C234.5,220.32 234.52,220.58 234.52,220.58 C234.52,220.58 234.51,220.85 234.51,220.85 C234.51,220.85 234.51,221.11 234.51,221.11 C234.51,221.11 234.5,221.38 234.5,221.38 C234.5,221.38 234.5,221.64 234.5,221.64 C234.5,221.64 234.49,221.9 234.49,221.9 C234.49,221.9 234.47,222.17 234.47,222.17 C234.47,222.17 234.44,222.43 234.44,222.43 C234.44,222.43 234.41,222.69 234.41,222.69 C234.41,222.69 234.38,222.95 234.38,222.95 C234.38,222.95 234.35,223.21 234.35,223.21 C234.35,223.21 234.3,223.47 234.3,223.47 C234.3,223.47 234.25,223.73 234.25,223.73 C234.25,223.73 234.2,223.99 234.2,223.99 C234.2,223.99 234.15,224.25 234.15,224.25 C234.15,224.25 234.09,224.51 234.09,224.51 C234.09,224.51 234.02,224.76 234.02,224.76 C234.02,224.76 233.95,225.01 233.95,225.01 C233.95,225.01 233.87,225.26 233.87,225.26 C233.87,225.26 233.79,225.52 233.79,225.52 C233.79,225.52 233.72,225.77 233.72,225.77 C233.72,225.77 233.63,226.01 233.63,226.01 C233.63,226.01 233.53,226.26 233.53,226.26 C233.53,226.26 233.43,226.5 233.43,226.5 C233.43,226.5 233.33,226.75 233.33,226.75 C233.33,226.75 233.23,226.99 233.23,226.99 C233.23,226.99 233.12,227.23 233.12,227.23 C233.12,227.23 233,227.46 233,227.46 C233,227.46 232.88,227.7 232.88,227.7 C232.88,227.7 232.75,227.93 232.75,227.93 C232.75,227.93 232.63,228.17 232.63,228.17 C232.63,228.17 232.5,228.4 232.5,228.4 C232.5,228.4 232.36,228.62 232.36,228.62 C232.36,228.62 232.22,228.84 232.22,228.84 C232.22,228.84 232.07,229.06 232.07,229.06 C232.07,229.06 231.93,229.28 231.93,229.28 C231.93,229.28 231.79,229.5 231.79,229.5 C231.79,229.5 231.63,229.71 231.63,229.71 C231.63,229.71 231.46,229.92 231.46,229.92 C231.46,229.92 231.3,230.13 231.3,230.13 C231.3,230.13 231.14,230.33 231.14,230.33 C231.14,230.33 230.96,230.52 230.96,230.52 C230.96,230.52 230.78,230.72 230.78,230.72 C230.78,230.72 230.6,230.92 230.6,230.92 C230.6,230.92 230.43,231.11 230.43,231.11 C230.43,231.11 230.25,231.31 230.25,231.31 C230.25,231.31 230.05,231.49 230.05,231.49 C230.05,231.49 229.86,231.66 229.86,231.66 C229.86,231.66 229.66,231.84 229.66,231.84 C229.66,231.84 229.47,232.02 229.47,232.02 C229.47,232.02 229.27,232.19 229.27,232.19 C229.27,232.19 229.07,232.36 229.07,232.36 C229.07,232.36 228.86,232.52 228.86,232.52 C228.86,232.52 228.64,232.68 228.64,232.68 C228.64,232.68 228.43,232.83 228.43,232.83 C228.43,232.83 228.22,232.99 228.22,232.99 C228.22,232.99 228.01,233.14 228.01,233.14 C228.01,233.14 227.78,233.28 227.78,233.28 C227.78,233.28 227.56,233.42 227.56,233.42 C227.56,233.42 227.33,233.55 227.33,233.55 C227.33,233.55 227.11,233.69 227.11,233.69 C227.11,233.69 226.88,233.83 226.88,233.83 C226.88,233.83 226.64,233.94 226.64,233.94 C226.64,233.94 226.41,234.06 226.41,234.06 C226.41,234.06 226.17,234.17 226.17,234.17 C226.17,234.17 225.93,234.28 225.93,234.28 C225.93,234.28 225.69,234.4 225.69,234.4 C225.69,234.4 225.45,234.5 225.45,234.5 C225.45,234.5 225.2,234.59 225.2,234.59 C225.2,234.59 224.95,234.68 224.95,234.68 C224.95,234.68 224.71,234.77 224.71,234.77 C224.71,234.77 224.46,234.86 224.46,234.86 C224.46,234.86 224.21,234.94 224.21,234.94 C224.21,234.94 223.95,235.01 223.95,235.01 C223.95,235.01 223.7,235.08 223.7,235.08 C223.7,235.08 223.44,235.14 223.44,235.14 C223.44,235.14 223.19,235.21 223.19,235.21 C223.19,235.21 222.93,235.27 222.93,235.27 C222.93,235.27 222.67,235.31 222.67,235.31 C222.67,235.31 222.41,235.36 222.41,235.36 C222.41,235.36 222.15,235.4 222.15,235.4 C222.15,235.4 221.89,235.45 221.89,235.45 C221.89,235.45 221.63,235.48 221.63,235.48 C221.63,235.48 221.37,235.5 221.37,235.5 C221.37,235.5 221.11,235.52 221.11,235.52 C221.11,235.52 220.84,235.54 220.84,235.54 C220.84,235.54 220.58,235.56 220.58,235.56 C220.58,235.56 220.32,235.58 220.32,235.58 C220.32,235.58 220.06,235.57 220.06,235.57 C220.06,235.57 219.79,235.57 219.79,235.57 C219.79,235.57 219.53,235.57 219.53,235.57 C219.53,235.57 219.26,235.56 219.26,235.56 C219.26,235.56 219,235.56 219,235.56 C219,235.56 218.74,235.53 218.74,235.53 C218.74,235.53 218.48,235.5 218.48,235.5 C218.48,235.5 218.22,235.47 218.22,235.47 C218.22,235.47 217.95,235.44 217.95,235.44 C217.95,235.44 217.69,235.41 217.69,235.41 C217.69,235.41 217.43,235.36 217.43,235.36 C217.43,235.36 217.17,235.31 217.17,235.31 C217.17,235.31 216.92,235.26 216.92,235.26 C216.92,235.26 216.66,235.21 216.66,235.21 C216.66,235.21 216.4,235.15 216.4,235.15 C216.4,235.15 216.15,235.08 216.15,235.08 C216.15,235.08 215.89,235.01 215.89,235.01 C215.89,235.01 215.64,234.93 215.64,234.93 C215.64,234.93 215.39,234.85 215.39,234.85 C215.39,234.85 215.14,234.78 215.14,234.78 C215.14,234.78 214.89,234.69 214.89,234.69 C214.89,234.69 214.65,234.59 214.65,234.59 C214.65,234.59 214.4,234.49 214.4,234.49 C214.4,234.49 214.16,234.39 214.16,234.39 C214.16,234.39 213.91,234.29 213.91,234.29 C213.91,234.29 213.67,234.18 213.67,234.18 C213.67,234.18 213.44,234.06 213.44,234.06 C213.44,234.06 213.21,233.94 213.21,233.94 C213.21,233.94 212.97,233.81 212.97,233.81 C212.97,233.81 212.74,233.69 212.74,233.69 C212.74,233.69 212.51,233.56 212.51,233.56 C212.51,233.56 212.29,233.42 212.29,233.42 C212.29,233.42 212.07,233.28 212.07,233.28 C212.07,233.28 211.85,233.13 211.85,233.13 C211.85,233.13 211.63,232.99 211.63,232.99 C211.63,232.99 211.4,232.85 211.4,232.85 C211.4,232.85 211.2,232.69 211.2,232.69 C211.2,232.69 210.99,232.52 210.99,232.52 C210.99,232.52 210.78,232.36 210.78,232.36 C210.78,232.36 210.58,232.2 210.58,232.2 C210.58,232.2 210.38,232.02 210.38,232.02 C210.38,232.02 210.18,231.84 210.18,231.84 C210.18,231.84 209.99,231.66 209.99,231.66 C209.99,231.66 209.79,231.49 209.79,231.49 C209.79,231.49 209.6,231.31 209.6,231.31 C209.6,231.31 209.41,231.12 209.41,231.12 C209.41,231.12 209.23,230.94 209.23,230.94 C209.23,230.94 209.04,230.75 209.04,230.75 C209.04,230.75 208.85,230.56 208.85,230.56 C208.85,230.56 208.67,230.38 208.67,230.38 C208.67,230.38 208.48,230.19 208.48,230.19 C208.48,230.19 208.29,230.01 208.29,230.01 C208.29,230.01 208.11,229.82 208.11,229.82 C208.11,229.82 207.92,229.63 207.92,229.63 C207.92,229.63 207.74,229.45 207.74,229.45 C207.74,229.45 207.55,229.26 207.55,229.26 C207.55,229.26 207.36,229.07 207.36,229.07 C207.36,229.07 207.18,228.89 207.18,228.89 C207.18,228.89 206.99,228.7 206.99,228.7 C206.99,228.7 206.8,228.51 206.8,228.51 C206.8,228.51 206.62,228.33 206.62,228.33 C206.62,228.33 206.43,228.14 206.43,228.14 C206.43,228.14 206.24,227.96 206.24,227.96 C206.24,227.96 206.06,227.77 206.06,227.77 C206.06,227.77 205.87,227.58 205.87,227.58 C205.87,227.58 205.69,227.4 205.69,227.4 C205.69,227.4 205.5,227.21 205.5,227.21 C205.5,227.21 205.31,227.02 205.31,227.02 C205.31,227.02 205.13,226.84 205.13,226.84 C205.13,226.84 204.94,226.65 204.94,226.65 C204.94,226.65 204.75,226.46 204.75,226.46 C204.75,226.46 204.58,226.27 204.58,226.27 C204.58,226.27 204.4,226.07 204.4,226.07 C204.4,226.07 204.22,225.88 204.22,225.88 C204.22,225.88 204.05,225.68 204.05,225.68 C204.05,225.68 203.87,225.49 203.87,225.49 C203.87,225.49 203.7,225.28 203.7,225.28 C203.7,225.28 203.54,225.07 203.54,225.07 C203.54,225.07 203.39,224.86 203.39,224.86 C203.39,224.86 203.23,224.65 203.23,224.65 C203.23,224.65 203.07,224.44 203.07,224.44 C203.07,224.44 202.92,224.22 202.92,224.22 C202.92,224.22 202.78,224 202.78,224 C202.78,224 202.65,223.77 202.65,223.77 C202.65,223.77 202.51,223.55 202.51,223.55 C202.51,223.55 202.37,223.32 202.37,223.32 C202.37,223.32 202.24,223.1 202.24,223.1 C202.24,223.1 202.12,222.86 202.12,222.86 C202.12,222.86 202.01,222.62 202.01,222.62 C202.01,222.62 201.89,222.39 201.89,222.39 C201.89,222.39 201.78,222.15 201.78,222.15 C201.78,222.15 201.67,221.91 201.67,221.91 C201.67,221.91 201.57,221.67 201.57,221.67 C201.57,221.67 201.48,221.42 201.48,221.42 C201.48,221.42 201.38,221.17 201.38,221.17 C201.38,221.17 201.29,220.92 201.29,220.92 C201.29,220.92 201.2,220.68 201.2,220.68 C201.2,220.68 201.12,220.43 201.12,220.43 C201.12,220.43 201.06,220.17 201.06,220.17 C201.06,220.17 200.99,219.92 200.99,219.92 C200.99,219.92 200.92,219.66 200.92,219.66 C200.92,219.66 200.85,219.41 200.85,219.41 C200.85,219.41 200.79,219.15 200.79,219.15 C200.79,219.15 200.75,218.89 200.75,218.89 C200.75,218.89 200.71,218.63 200.71,218.63 C200.71,218.63 200.66,218.37 200.66,218.37 C200.66,218.37 200.62,218.11 200.62,218.11 C200.62,218.11 200.58,217.85 200.58,217.85 C200.58,217.85 200.56,217.59 200.56,217.59 C200.56,217.59 200.54,217.32 200.54,217.32 C200.54,217.32 200.52,217.06 200.52,217.06 C200.52,217.06 200.5,216.8 200.5,216.8 C200.5,216.8 200.48,216.54 200.48,216.54 C200.48,216.54 200.49,216.27 200.49,216.27 C200.49,216.27 200.49,216.01 200.49,216.01 C200.49,216.01 200.5,215.75 200.5,215.75 C200.5,215.75 200.5,215.48 200.5,215.48 C200.5,215.48 200.51,215.22 200.51,215.22 C200.51,215.22 200.53,214.96 200.53,214.96 C200.53,214.96 200.56,214.69 200.56,214.69 C200.56,214.69 200.59,214.43 200.59,214.43 C200.59,214.43 200.62,214.17 200.62,214.17 C200.62,214.17 200.65,213.91 200.65,213.91 C200.65,213.91 200.7,213.65 200.7,213.65 C200.7,213.65 200.75,213.39 200.75,213.39 C200.75,213.39 200.8,213.13 200.8,213.13 C200.8,213.13 200.86,212.88 200.86,212.88 C200.86,212.88 200.91,212.62 200.91,212.62 C200.91,212.62 200.98,212.36 200.98,212.36 C200.98,212.36 201.06,212.11 201.06,212.11 C201.06,212.11 201.13,211.86 201.13,211.86 C201.13,211.86 201.21,211.61 201.21,211.61 C201.21,211.61 201.28,211.35 201.28,211.35 C201.28,211.35 201.38,211.11 201.38,211.11 C201.38,211.11 201.47,210.86 201.47,210.86 C201.47,210.86 201.57,210.62 201.57,210.62 C201.57,210.62 201.67,210.37 201.67,210.37 C201.67,210.37 201.77,210.13 201.77,210.13 C201.77,210.13 201.88,209.89 201.88,209.89 C201.88,209.89 202,209.66 202,209.66 C202,209.66 202.13,209.42 202.13,209.42 C202.13,209.42 202.25,209.19 202.25,209.19 C202.25,209.19 202.37,208.96 202.37,208.96 C202.37,208.96 202.5,208.73 202.5,208.73 C202.5,208.73 202.64,208.51 202.64,208.51 C202.64,208.51 202.79,208.28 202.79,208.28 C202.79,208.28 202.93,208.06 202.93,208.06 C202.93,208.06 203.07,207.84 203.07,207.84 C203.07,207.84 203.22,207.62 203.22,207.62 C203.22,207.62 203.38,207.41 203.38,207.41 C203.38,207.41 203.54,207.2 203.54,207.2 C203.54,207.2 203.7,207 203.7,207 C203.7,207 203.87,206.79 203.87,206.79 C203.87,206.79 204.04,206.6 204.04,206.6 C204.04,206.6 204.22,206.4 204.22,206.4 C204.22,206.4 204.4,206.21 204.4,206.21 C204.4,206.21 204.57,206.01 204.57,206.01 C204.57,206.01 204.75,205.82 204.75,205.82 C204.75,205.82 204.95,205.64 204.95,205.64 C204.95,205.64 205.14,205.46 205.14,205.46 C205.14,205.46 205.34,205.29 205.34,205.29 C205.34,205.29 205.53,205.11 205.53,205.11 C205.53,205.11 205.73,204.93 205.73,204.93 C205.73,204.93 205.93,204.76 205.93,204.76 C205.93,204.76 206.14,204.61 206.14,204.61 C206.14,204.61 206.35,204.45 206.35,204.45 C206.35,204.45 206.57,204.29 206.57,204.29 C206.57,204.29 206.78,204.13 206.78,204.13 C206.78,204.13 206.99,203.98 206.99,203.98 C206.99,203.98 207.22,203.85 207.22,203.85 C207.22,203.85 207.44,203.71 207.44,203.71 C207.44,203.71 207.67,203.57 207.67,203.57 C207.67,203.57 207.89,203.44 207.89,203.44 C207.89,203.44 208.12,203.3 208.12,203.3 C208.12,203.3 208.36,203.18 208.36,203.18 C208.36,203.18 208.59,203.07 208.59,203.07 C208.59,203.07 208.83,202.96 208.83,202.96 C208.83,202.96 209.07,202.84 209.07,202.84 C209.07,202.84 209.31,202.73 209.31,202.73 C209.31,202.73 209.55,202.63 209.55,202.63 C209.55,202.63 209.8,202.54 209.8,202.54 C209.8,202.54 210.04,202.45 210.04,202.45 C210.04,202.45 210.29,202.36 210.29,202.36 C210.29,202.36 210.54,202.26 210.54,202.26 C210.54,202.26 210.79,202.19 210.79,202.19 C210.79,202.19 211.05,202.12 211.05,202.12 C211.05,202.12 211.3,202.05 211.3,202.05 C211.3,202.05 211.55,201.98 211.55,201.98 C211.55,201.98 211.81,201.91 211.81,201.91 C211.81,201.91 212.07,201.86 212.07,201.86 C212.07,201.86 212.33,201.81 212.33,201.81 C212.33,201.81 212.59,201.77 212.59,201.77 C212.59,201.77 212.85,201.72 212.85,201.72 C212.85,201.72 213.11,201.68 213.11,201.68 C213.11,201.68 213.37,201.64 213.37,201.64 C213.37,201.64 213.63,201.62 213.63,201.62 C213.63,201.62 213.89,201.6 213.89,201.6 C213.89,201.6 214.15,201.58 214.15,201.58 C214.15,201.58 214.42,201.56 214.42,201.56 C214.42,201.56 214.68,201.55 214.68,201.55 C214.68,201.55 214.94,201.55 214.94,201.55 C214.94,201.55 215.21,201.55 215.21,201.55 C215.21,201.55 215.47,201.56 215.47,201.56 C215.47,201.56 215.73,201.56 215.73,201.56 C215.73,201.56 216,201.57 216,201.57 C216,201.57 216.26,201.6 216.26,201.6 C216.26,201.6 216.52,201.62 216.52,201.62 C216.52,201.62 216.78,201.65 216.78,201.65 C216.78,201.65 217.05,201.68 217.05,201.68 C217.05,201.68 217.31,201.71 217.31,201.71 C217.31,201.71 217.57,201.76 217.57,201.76c " android:valueTo="M217.68 210.56 C217.68,210.56 217.81,210.57 217.81,210.57 C217.81,210.57 217.93,210.57 217.93,210.57 C217.93,210.57 218.06,210.58 218.06,210.58 C218.06,210.58 218.18,210.59 218.18,210.59 C218.18,210.59 218.31,210.59 218.31,210.59 C218.31,210.59 218.43,210.61 218.43,210.61 C218.43,210.61 218.56,210.63 218.56,210.63 C218.56,210.63 218.68,210.64 218.68,210.64 C218.68,210.64 218.81,210.66 218.81,210.66 C218.81,210.66 218.93,210.68 218.93,210.68 C218.93,210.68 219.05,210.7 219.05,210.7 C219.05,210.7 219.18,210.72 219.18,210.72 C219.18,210.72 219.3,210.75 219.3,210.75 C219.3,210.75 219.42,210.78 219.42,210.78 C219.42,210.78 219.54,210.81 219.54,210.81 C219.54,210.81 219.66,210.84 219.66,210.84 C219.66,210.84 219.79,210.87 219.79,210.87 C219.79,210.87 219.91,210.91 219.91,210.91 C219.91,210.91 220.03,210.95 220.03,210.95 C220.03,210.95 220.14,210.99 220.14,210.99 C220.14,210.99 220.26,211.04 220.26,211.04 C220.26,211.04 220.38,211.08 220.38,211.08 C220.38,211.08 220.5,211.12 220.5,211.12 C220.5,211.12 220.62,211.17 220.62,211.17 C220.62,211.17 220.73,211.22 220.73,211.22 C220.73,211.22 220.84,211.27 220.84,211.27 C220.84,211.27 220.96,211.32 220.96,211.32 C220.96,211.32 221.07,211.38 221.07,211.38 C221.07,211.38 221.19,211.43 221.19,211.43 C221.19,211.43 221.3,211.49 221.3,211.49 C221.3,211.49 221.41,211.55 221.41,211.55 C221.41,211.55 221.51,211.61 221.51,211.61 C221.51,211.61 221.62,211.68 221.62,211.68 C221.62,211.68 221.73,211.74 221.73,211.74 C221.73,211.74 221.84,211.8 221.84,211.8 C221.84,211.8 221.94,211.87 221.94,211.87 C221.94,211.87 222.05,211.94 222.05,211.94 C222.05,211.94 222.15,212.02 222.15,212.02 C222.15,212.02 222.25,212.09 222.25,212.09 C222.25,212.09 222.35,212.16 222.35,212.16 C222.35,212.16 222.46,212.23 222.46,212.23 C222.46,212.23 222.55,212.31 222.55,212.31 C222.55,212.31 222.65,212.4 222.65,212.4 C222.65,212.4 222.74,212.48 222.74,212.48 C222.74,212.48 222.84,212.56 222.84,212.56 C222.84,212.56 222.93,212.64 222.93,212.64 C222.93,212.64 223.03,212.72 223.03,212.72 C223.03,212.72 223.12,212.81 223.12,212.81 C223.12,212.81 223.21,212.9 223.21,212.9 C223.21,212.9 223.29,212.99 223.29,212.99 C223.29,212.99 223.38,213.08 223.38,213.08 C223.38,213.08 223.47,213.17 223.47,213.17 C223.47,213.17 223.55,213.26 223.55,213.26 C223.55,213.26 223.63,213.36 223.63,213.36 C223.63,213.36 223.71,213.46 223.71,213.46 C223.71,213.46 223.79,213.56 223.79,213.56 C223.79,213.56 223.87,213.66 223.87,213.66 C223.87,213.66 223.95,213.75 223.95,213.75 C223.95,213.75 224.03,213.85 224.03,213.85 C224.03,213.85 224.09,213.96 224.09,213.96 C224.09,213.96 224.16,214.06 224.16,214.06 C224.16,214.06 224.23,214.17 224.23,214.17 C224.23,214.17 224.3,214.27 224.3,214.27 C224.3,214.27 224.37,214.38 224.37,214.38 C224.37,214.38 224.44,214.48 224.44,214.48 C224.44,214.48 224.5,214.59 224.5,214.59 C224.5,214.59 224.56,214.7 224.56,214.7 C224.56,214.7 224.62,214.81 224.62,214.81 C224.62,214.81 224.68,214.93 224.68,214.93 C224.68,214.93 224.74,215.04 224.74,215.04 C224.74,215.04 224.79,215.15 224.79,215.15 C224.79,215.15 224.84,215.26 224.84,215.26 C224.84,215.26 224.89,215.38 224.89,215.38 C224.89,215.38 224.94,215.5 224.94,215.5 C224.94,215.5 224.99,215.61 224.99,215.61 C224.99,215.61 225.04,215.73 225.04,215.73 C225.04,215.73 225.08,215.84 225.08,215.84 C225.08,215.84 225.12,215.96 225.12,215.96 C225.12,215.96 225.16,216.08 225.16,216.08 C225.16,216.08 225.19,216.2 225.19,216.2 C225.19,216.2 225.23,216.32 225.23,216.32 C225.23,216.32 225.27,216.44 225.27,216.44 C225.27,216.44 225.3,216.56 225.3,216.56 C225.3,216.56 225.33,216.69 225.33,216.69 C225.33,216.69 225.35,216.81 225.35,216.81 C225.35,216.81 225.38,216.93 225.38,216.93 C225.38,216.93 225.41,217.06 225.41,217.06 C225.41,217.06 225.43,217.18 225.43,217.18 C225.43,217.18 225.46,217.3 225.46,217.3 C225.46,217.3 225.47,217.43 225.47,217.43 C225.47,217.43 225.49,217.55 225.49,217.55 C225.49,217.55 225.5,217.68 225.5,217.68 C225.5,217.68 225.52,217.8 225.52,217.8 C225.52,217.8 225.52,217.93 225.52,217.93 C225.52,217.93 225.53,218.05 225.53,218.05 C225.53,218.05 225.54,218.18 225.54,218.18 C225.54,218.18 225.54,218.3 225.54,218.3 C225.54,218.3 225.55,218.43 225.55,218.43 C225.55,218.43 225.55,218.55 225.55,218.55 C225.55,218.55 225.55,218.68 225.55,218.68 C225.55,218.68 225.54,218.8 225.54,218.8 C225.54,218.8 225.54,218.93 225.54,218.93 C225.54,218.93 225.53,219.05 225.53,219.05 C225.53,219.05 225.52,219.18 225.52,219.18 C225.52,219.18 225.52,219.31 225.52,219.31 C225.52,219.31 225.5,219.43 225.5,219.43 C225.5,219.43 225.48,219.55 225.48,219.55 C225.48,219.55 225.47,219.68 225.47,219.68 C225.47,219.68 225.45,219.8 225.45,219.8 C225.45,219.8 225.43,219.93 225.43,219.93 C225.43,219.93 225.41,220.05 225.41,220.05 C225.41,220.05 225.39,220.17 225.39,220.17 C225.39,220.17 225.36,220.3 225.36,220.3 C225.36,220.3 225.33,220.42 225.33,220.42 C225.33,220.42 225.3,220.54 225.3,220.54 C225.3,220.54 225.27,220.66 225.27,220.66 C225.27,220.66 225.24,220.78 225.24,220.78 C225.24,220.78 225.2,220.9 225.2,220.9 C225.2,220.9 225.16,221.02 225.16,221.02 C225.16,221.02 225.12,221.14 225.12,221.14 C225.12,221.14 225.08,221.26 225.08,221.26 C225.08,221.26 225.03,221.38 225.03,221.38 C225.03,221.38 224.99,221.5 224.99,221.5 C224.99,221.5 224.95,221.61 224.95,221.61 C224.95,221.61 224.89,221.73 224.89,221.73 C224.89,221.73 224.84,221.84 224.84,221.84 C224.84,221.84 224.79,221.96 224.79,221.96 C224.79,221.96 224.73,222.07 224.73,222.07 C224.73,222.07 224.68,222.18 224.68,222.18 C224.68,222.18 224.62,222.29 224.62,222.29 C224.62,222.29 224.56,222.4 224.56,222.4 C224.56,222.4 224.5,222.51 224.5,222.51 C224.5,222.51 224.44,222.62 224.44,222.62 C224.44,222.62 224.37,222.73 224.37,222.73 C224.37,222.73 224.31,222.84 224.31,222.84 C224.31,222.84 224.24,222.94 224.24,222.94 C224.24,222.94 224.17,223.05 224.17,223.05 C224.17,223.05 224.09,223.15 224.09,223.15 C224.09,223.15 224.02,223.25 224.02,223.25 C224.02,223.25 223.95,223.35 223.95,223.35 C223.95,223.35 223.88,223.45 223.88,223.45 C223.88,223.45 223.8,223.55 223.8,223.55 C223.8,223.55 223.71,223.65 223.71,223.65 C223.71,223.65 223.63,223.74 223.63,223.74 C223.63,223.74 223.55,223.84 223.55,223.84 C223.55,223.84 223.47,223.93 223.47,223.93 C223.47,223.93 223.39,224.03 223.39,224.03 C223.39,224.03 223.3,224.12 223.3,224.12 C223.3,224.12 223.21,224.2 223.21,224.2 C223.21,224.2 223.12,224.29 223.12,224.29 C223.12,224.29 223.03,224.38 223.03,224.38 C223.03,224.38 222.94,224.46 222.94,224.46 C222.94,224.46 222.85,224.55 222.85,224.55 C222.85,224.55 222.75,224.63 222.75,224.63 C222.75,224.63 222.65,224.71 222.65,224.71 C222.65,224.71 222.55,224.79 222.55,224.79 C222.55,224.79 222.46,224.87 222.46,224.87 C222.46,224.87 222.36,224.95 222.36,224.95 C222.36,224.95 222.26,225.02 222.26,225.02 C222.26,225.02 222.15,225.09 222.15,225.09 C222.15,225.09 222.05,225.16 222.05,225.16 C222.05,225.16 221.94,225.23 221.94,225.23 C221.94,225.23 221.84,225.3 221.84,225.3 C221.84,225.3 221.74,225.37 221.74,225.37 C221.74,225.37 221.63,225.44 221.63,225.44 C221.63,225.44 221.52,225.5 221.52,225.5 C221.52,225.5 221.41,225.56 221.41,225.56 C221.41,225.56 221.3,225.62 221.3,225.62 C221.3,225.62 221.19,225.68 221.19,225.68 C221.19,225.68 221.08,225.73 221.08,225.73 C221.08,225.73 220.96,225.79 220.96,225.79 C220.96,225.79 220.85,225.84 220.85,225.84 C220.85,225.84 220.73,225.89 220.73,225.89 C220.73,225.89 220.62,225.94 220.62,225.94 C220.62,225.94 220.5,225.99 220.5,225.99 C220.5,225.99 220.38,226.03 220.38,226.03 C220.38,226.03 220.27,226.08 220.27,226.08 C220.27,226.08 220.15,226.12 220.15,226.12 C220.15,226.12 220.03,226.15 220.03,226.15 C220.03,226.15 219.91,226.19 219.91,226.19 C219.91,226.19 219.79,226.23 219.79,226.23 C219.79,226.23 219.67,226.27 219.67,226.27 C219.67,226.27 219.55,226.3 219.55,226.3 C219.55,226.3 219.42,226.33 219.42,226.33 C219.42,226.33 219.3,226.35 219.3,226.35 C219.3,226.35 219.18,226.38 219.18,226.38 C219.18,226.38 219.06,226.4 219.06,226.4 C219.06,226.4 218.93,226.43 218.93,226.43 C218.93,226.43 218.81,226.45 218.81,226.45 C218.81,226.45 218.68,226.47 218.68,226.47 C218.68,226.47 218.56,226.49 218.56,226.49 C218.56,226.49 218.44,226.5 218.44,226.5 C218.44,226.5 218.31,226.52 218.31,226.52 C218.31,226.52 218.19,226.52 218.19,226.52 C218.19,226.52 218.06,226.53 218.06,226.53 C218.06,226.53 217.93,226.53 217.93,226.53 C217.93,226.53 217.81,226.54 217.81,226.54 C217.81,226.54 217.68,226.55 217.68,226.55 C217.68,226.55 217.56,226.55 217.56,226.55 C217.56,226.55 217.43,226.55 217.43,226.55 C217.43,226.55 217.31,226.54 217.31,226.54 C217.31,226.54 217.18,226.53 217.18,226.53 C217.18,226.53 217.05,226.53 217.05,226.53 C217.05,226.53 216.93,226.52 216.93,226.52 C216.93,226.52 216.8,226.52 216.8,226.52 C216.8,226.52 216.68,226.5 216.68,226.5 C216.68,226.5 216.55,226.48 216.55,226.48 C216.55,226.48 216.43,226.46 216.43,226.46 C216.43,226.46 216.31,226.45 216.31,226.45 C216.31,226.45 216.18,226.43 216.18,226.43 C216.18,226.43 216.06,226.41 216.06,226.41 C216.06,226.41 215.93,226.38 215.93,226.38 C215.93,226.38 215.81,226.35 215.81,226.35 C215.81,226.35 215.69,226.32 215.69,226.32 C215.69,226.32 215.57,226.29 215.57,226.29 C215.57,226.29 215.45,226.26 215.45,226.26 C215.45,226.26 215.32,226.23 215.32,226.23 C215.32,226.23 215.2,226.2 215.2,226.2 C215.2,226.2 215.09,226.16 215.09,226.16 C215.09,226.16 214.97,226.12 214.97,226.12 C214.97,226.12 214.85,226.07 214.85,226.07 C214.85,226.07 214.73,226.03 214.73,226.03 C214.73,226.03 214.61,225.99 214.61,225.99 C214.61,225.99 214.5,225.94 214.5,225.94 C214.5,225.94 214.38,225.89 214.38,225.89 C214.38,225.89 214.27,225.84 214.27,225.84 C214.27,225.84 214.15,225.79 214.15,225.79 C214.15,225.79 214.04,225.73 214.04,225.73 C214.04,225.73 213.93,225.68 213.93,225.68 C213.93,225.68 213.81,225.62 213.81,225.62 C213.81,225.62 213.71,225.56 213.71,225.56 C213.71,225.56 213.6,225.5 213.6,225.5 C213.6,225.5 213.49,225.43 213.49,225.43 C213.49,225.43 213.38,225.37 213.38,225.37 C213.38,225.37 213.27,225.31 213.27,225.31 C213.27,225.31 213.17,225.24 213.17,225.24 C213.17,225.24 213.06,225.16 213.06,225.16 C213.06,225.16 212.96,225.09 212.96,225.09 C212.96,225.09 212.86,225.02 212.86,225.02 C212.86,225.02 212.76,224.95 212.76,224.95 C212.76,224.95 212.65,224.87 212.65,224.87 C212.65,224.87 212.56,224.79 212.56,224.79 C212.56,224.79 212.46,224.71 212.46,224.71 C212.46,224.71 212.37,224.63 212.37,224.63 C212.37,224.63 212.27,224.55 212.27,224.55 C212.27,224.55 212.18,224.47 212.18,224.47 C212.18,224.47 212.08,224.38 212.08,224.38 C212.08,224.38 211.99,224.3 211.99,224.3 C211.99,224.3 211.91,224.2 211.91,224.2 C211.91,224.2 211.82,224.11 211.82,224.11 C211.82,224.11 211.73,224.02 211.73,224.02 C211.73,224.02 211.64,223.93 211.64,223.93 C211.64,223.93 211.56,223.84 211.56,223.84 C211.56,223.84 211.48,223.75 211.48,223.75 C211.48,223.75 211.4,223.65 211.4,223.65 C211.4,223.65 211.32,223.55 211.32,223.55 C211.32,223.55 211.24,223.45 211.24,223.45 C211.24,223.45 211.16,223.35 211.16,223.35 C211.16,223.35 211.09,223.26 211.09,223.26 C211.09,223.26 211.02,223.15 211.02,223.15 C211.02,223.15 210.95,223.05 210.95,223.05 C210.95,223.05 210.88,222.94 210.88,222.94 C210.88,222.94 210.81,222.84 210.81,222.84 C210.81,222.84 210.74,222.73 210.74,222.73 C210.74,222.73 210.67,222.63 210.67,222.63 C210.67,222.63 210.61,222.52 210.61,222.52 C210.61,222.52 210.55,222.4 210.55,222.4 C210.55,222.4 210.49,222.29 210.49,222.29 C210.49,222.29 210.43,222.18 210.43,222.18 C210.43,222.18 210.38,222.07 210.38,222.07 C210.38,222.07 210.32,221.96 210.32,221.96 C210.32,221.96 210.27,221.84 210.27,221.84 C210.27,221.84 210.22,221.73 210.22,221.73 C210.22,221.73 210.17,221.61 210.17,221.61 C210.17,221.61 210.12,221.5 210.12,221.5 C210.12,221.5 210.08,221.38 210.08,221.38 C210.08,221.38 210.03,221.26 210.03,221.26 C210.03,221.26 209.99,221.14 209.99,221.14 C209.99,221.14 209.96,221.02 209.96,221.02 C209.96,221.02 209.92,220.9 209.92,220.9 C209.92,220.9 209.88,220.78 209.88,220.78 C209.88,220.78 209.84,220.67 209.84,220.67 C209.84,220.67 209.81,220.54 209.81,220.54 C209.81,220.54 209.78,220.42 209.78,220.42 C209.78,220.42 209.76,220.3 209.76,220.3 C209.76,220.3 209.73,220.18 209.73,220.18 C209.73,220.18 209.71,220.05 209.71,220.05 C209.71,220.05 209.68,219.93 209.68,219.93 C209.68,219.93 209.66,219.81 209.66,219.81 C209.66,219.81 209.64,219.68 209.64,219.68 C209.64,219.68 209.62,219.56 209.62,219.56 C209.62,219.56 209.61,219.43 209.61,219.43 C209.61,219.43 209.59,219.31 209.59,219.31 C209.59,219.31 209.59,219.18 209.59,219.18 C209.59,219.18 209.58,219.06 209.58,219.06 C209.58,219.06 209.58,218.93 209.58,218.93 C209.58,218.93 209.57,218.81 209.57,218.81 C209.57,218.81 209.56,218.68 209.56,218.68 C209.56,218.68 209.56,218.56 209.56,218.56 C209.56,218.56 209.56,218.43 209.56,218.43 C209.56,218.43 209.57,218.3 209.57,218.3 C209.57,218.3 209.58,218.18 209.58,218.18 C209.58,218.18 209.58,218.05 209.58,218.05 C209.58,218.05 209.59,217.93 209.59,217.93 C209.59,217.93 209.59,217.8 209.59,217.8 C209.59,217.8 209.61,217.68 209.61,217.68 C209.61,217.68 209.63,217.55 209.63,217.55 C209.63,217.55 209.65,217.43 209.65,217.43 C209.65,217.43 209.66,217.31 209.66,217.31 C209.66,217.31 209.68,217.18 209.68,217.18 C209.68,217.18 209.7,217.06 209.7,217.06 C209.7,217.06 209.73,216.93 209.73,216.93 C209.73,216.93 209.76,216.81 209.76,216.81 C209.76,216.81 209.79,216.69 209.79,216.69 C209.79,216.69 209.82,216.57 209.82,216.57 C209.82,216.57 209.85,216.45 209.85,216.45 C209.85,216.45 209.88,216.32 209.88,216.32 C209.88,216.32 209.91,216.2 209.91,216.2 C209.91,216.2 209.95,216.08 209.95,216.08 C209.95,216.08 210,215.97 210,215.97 C210,215.97 210.04,215.85 210.04,215.85 C210.04,215.85 210.08,215.73 210.08,215.73 C210.08,215.73 210.12,215.61 210.12,215.61 C210.12,215.61 210.17,215.49 210.17,215.49 C210.17,215.49 210.22,215.38 210.22,215.38 C210.22,215.38 210.27,215.27 210.27,215.27 C210.27,215.27 210.33,215.15 210.33,215.15 C210.33,215.15 210.38,215.04 210.38,215.04 C210.38,215.04 210.43,214.92 210.43,214.92 C210.43,214.92 210.49,214.81 210.49,214.81 C210.49,214.81 210.55,214.7 210.55,214.7 C210.55,214.7 210.61,214.6 210.61,214.6 C210.61,214.6 210.68,214.49 210.68,214.49 C210.68,214.49 210.74,214.38 210.74,214.38 C210.74,214.38 210.8,214.27 210.8,214.27 C210.8,214.27 210.87,214.17 210.87,214.17 C210.87,214.17 210.95,214.06 210.95,214.06 C210.95,214.06 211.02,213.96 211.02,213.96 C211.02,213.96 211.09,213.86 211.09,213.86 C211.09,213.86 211.16,213.76 211.16,213.76 C211.16,213.76 211.24,213.65 211.24,213.65 C211.24,213.65 211.32,213.56 211.32,213.56 C211.32,213.56 211.4,213.46 211.4,213.46 C211.4,213.46 211.48,213.37 211.48,213.37 C211.48,213.37 211.56,213.27 211.56,213.27 C211.56,213.27 211.64,213.18 211.64,213.18 C211.64,213.18 211.73,213.08 211.73,213.08 C211.73,213.08 211.82,212.99 211.82,212.99 C211.82,212.99 211.91,212.9 211.91,212.9 C211.91,212.9 212,212.82 212,212.82 C212,212.82 212.09,212.73 212.09,212.73 C212.09,212.73 212.18,212.64 212.18,212.64 C212.18,212.64 212.27,212.56 212.27,212.56 C212.27,212.56 212.36,212.48 212.36,212.48 C212.36,212.48 212.46,212.4 212.46,212.4 C212.46,212.4 212.56,212.32 212.56,212.32 C212.56,212.32 212.66,212.24 212.66,212.24 C212.66,212.24 212.76,212.16 212.76,212.16 C212.76,212.16 212.85,212.08 212.85,212.08 C212.85,212.08 212.96,212.02 212.96,212.02 C212.96,212.02 213.06,211.95 213.06,211.95 C213.06,211.95 213.17,211.88 213.17,211.88 C213.17,211.88 213.27,211.81 213.27,211.81 C213.27,211.81 213.38,211.74 213.38,211.74 C213.38,211.74 213.48,211.67 213.48,211.67 C213.48,211.67 213.6,211.61 213.6,211.61 C213.6,211.61 213.71,211.55 213.71,211.55 C213.71,211.55 213.82,211.49 213.82,211.49 C213.82,211.49 213.93,211.43 213.93,211.43 C213.93,211.43 214.04,211.37 214.04,211.37 C214.04,211.37 214.15,211.32 214.15,211.32 C214.15,211.32 214.27,211.27 214.27,211.27 C214.27,211.27 214.38,211.22 214.38,211.22 C214.38,211.22 214.5,211.17 214.5,211.17 C214.5,211.17 214.61,211.12 214.61,211.12 C214.61,211.12 214.73,211.07 214.73,211.07 C214.73,211.07 214.85,211.03 214.85,211.03 C214.85,211.03 214.97,210.99 214.97,210.99 C214.97,210.99 215.09,210.95 215.09,210.95 C215.09,210.95 215.21,210.92 215.21,210.92 C215.21,210.92 215.33,210.88 215.33,210.88 C215.33,210.88 215.45,210.84 215.45,210.84 C215.45,210.84 215.57,210.81 215.57,210.81 C215.57,210.81 215.69,210.78 215.69,210.78 C215.69,210.78 215.81,210.76 215.81,210.76 C215.81,210.76 215.93,210.73 215.93,210.73 C215.93,210.73 216.06,210.7 216.06,210.7 C216.06,210.7 216.18,210.68 216.18,210.68 C216.18,210.68 216.3,210.65 216.3,210.65 C216.3,210.65 216.43,210.64 216.43,210.64 C216.43,210.64 216.55,210.62 216.55,210.62 C216.55,210.62 216.68,210.61 216.68,210.61 C216.68,210.61 216.8,210.59 216.8,210.59 C216.8,210.59 216.93,210.59 216.93,210.59 C216.93,210.59 217.05,210.58 217.05,210.58 C217.05,210.58 217.18,210.58 217.18,210.58 C217.18,210.58 217.3,210.57 217.3,210.57 C217.3,210.57 217.43,210.56 217.43,210.56 C217.43,210.56 217.56,210.56 217.56,210.56 C217.56,210.56 217.68,210.56 217.68,210.56c " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.8,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="time_group"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateX" android:duration="500" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"/></set></aapt:attr></target></animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/pin_dot_shape_4_avd.xml b/packages/SystemUI/res/drawable/pin_dot_shape_4_avd.xml new file mode 100644 index 000000000000..76ee65b0060c --- /dev/null +++ b/packages/SystemUI/res/drawable/pin_dot_shape_4_avd.xml @@ -0,0 +1 @@ +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"><aapt:attr name="android:drawable"><vector android:height="60dp" android:width="60dp" android:viewportHeight="60" android:viewportWidth="60"><group android:name="_R_G"><group android:name="_R_G_L_0_G" android:translateX="-187.543" android:translateY="-188.546"><path android:name="_R_G_L_0_G_D_0_P_0" android:fillColor="#ffffff" android:fillAlpha="0" android:fillType="nonZero" android:pathData=" M217.62 214.55 C217.62,214.55 217.68,214.55 217.68,214.55 C217.68,214.55 217.74,214.56 217.74,214.56 C217.74,214.56 217.81,214.56 217.81,214.56 C217.81,214.56 217.87,214.56 217.87,214.56 C217.87,214.56 217.93,214.57 217.93,214.57 C217.93,214.57 218,214.57 218,214.57 C218,214.57 218.06,214.58 218.06,214.58 C218.06,214.58 218.12,214.59 218.12,214.59 C218.12,214.59 218.18,214.6 218.18,214.6 C218.18,214.6 218.24,214.61 218.24,214.61 C218.24,214.61 218.31,214.62 218.31,214.62 C218.31,214.62 218.37,214.63 218.37,214.63 C218.37,214.63 218.43,214.65 218.43,214.65 C218.43,214.65 218.49,214.66 218.49,214.66 C218.49,214.66 218.55,214.68 218.55,214.68 C218.55,214.68 218.61,214.69 218.61,214.69 C218.61,214.69 218.67,214.71 218.67,214.71 C218.67,214.71 218.73,214.73 218.73,214.73 C218.73,214.73 218.79,214.75 218.79,214.75 C218.79,214.75 218.85,214.77 218.85,214.77 C218.85,214.77 218.91,214.79 218.91,214.79 C218.91,214.79 218.97,214.81 218.97,214.81 C218.97,214.81 219.03,214.83 219.03,214.83 C219.03,214.83 219.09,214.85 219.09,214.85 C219.09,214.85 219.15,214.88 219.15,214.88 C219.15,214.88 219.2,214.9 219.2,214.9 C219.2,214.9 219.26,214.93 219.26,214.93 C219.26,214.93 219.32,214.96 219.32,214.96 C219.32,214.96 219.37,214.98 219.37,214.98 C219.37,214.98 219.43,215.01 219.43,215.01 C219.43,215.01 219.48,215.05 219.48,215.05 C219.48,215.05 219.54,215.08 219.54,215.08 C219.54,215.08 219.59,215.11 219.59,215.11 C219.59,215.11 219.65,215.14 219.65,215.14 C219.65,215.14 219.7,215.17 219.7,215.17 C219.7,215.17 219.75,215.21 219.75,215.21 C219.75,215.21 219.81,215.24 219.81,215.24 C219.81,215.24 219.86,215.28 219.86,215.28 C219.86,215.28 219.91,215.32 219.91,215.32 C219.91,215.32 219.96,215.35 219.96,215.35 C219.96,215.35 220.01,215.39 220.01,215.39 C220.01,215.39 220.06,215.43 220.06,215.43 C220.06,215.43 220.11,215.47 220.11,215.47 C220.11,215.47 220.16,215.51 220.16,215.51 C220.16,215.51 220.2,215.55 220.2,215.55 C220.2,215.55 220.25,215.59 220.25,215.59 C220.25,215.59 220.3,215.63 220.3,215.63 C220.3,215.63 220.34,215.68 220.34,215.68 C220.34,215.68 220.39,215.72 220.39,215.72 C220.39,215.72 220.43,215.77 220.43,215.77 C220.43,215.77 220.47,215.81 220.47,215.81 C220.47,215.81 220.52,215.86 220.52,215.86 C220.52,215.86 220.56,215.9 220.56,215.9 C220.56,215.9 220.6,215.95 220.6,215.95 C220.6,215.95 220.64,216 220.64,216 C220.64,216 220.68,216.05 220.68,216.05 C220.68,216.05 220.72,216.1 220.72,216.1 C220.72,216.1 220.76,216.15 220.76,216.15 C220.76,216.15 220.8,216.2 220.8,216.2 C220.8,216.2 220.83,216.25 220.83,216.25 C220.83,216.25 220.87,216.3 220.87,216.3 C220.87,216.3 220.9,216.36 220.9,216.36 C220.9,216.36 220.94,216.41 220.94,216.41 C220.94,216.41 220.97,216.46 220.97,216.46 C220.97,216.46 221,216.51 221,216.51 C221,216.51 221.03,216.57 221.03,216.57 C221.03,216.57 221.06,216.63 221.06,216.63 C221.06,216.63 221.09,216.68 221.09,216.68 C221.09,216.68 221.12,216.74 221.12,216.74 C221.12,216.74 221.15,216.79 221.15,216.79 C221.15,216.79 221.18,216.85 221.18,216.85 C221.18,216.85 221.21,216.91 221.21,216.91 C221.21,216.91 221.23,216.96 221.23,216.96 C221.23,216.96 221.25,217.02 221.25,217.02 C221.25,217.02 221.28,217.08 221.28,217.08 C221.28,217.08 221.3,217.14 221.3,217.14 C221.3,217.14 221.33,217.2 221.33,217.2 C221.33,217.2 221.34,217.26 221.34,217.26 C221.34,217.26 221.36,217.32 221.36,217.32 C221.36,217.32 221.38,217.38 221.38,217.38 C221.38,217.38 221.4,217.44 221.4,217.44 C221.4,217.44 221.42,217.5 221.42,217.5 C221.42,217.5 221.44,217.56 221.44,217.56 C221.44,217.56 221.45,217.62 221.45,217.62 C221.45,217.62 221.46,217.68 221.46,217.68 C221.46,217.68 221.48,217.74 221.48,217.74 C221.48,217.74 221.49,217.8 221.49,217.8 C221.49,217.8 221.5,217.87 221.5,217.87 C221.5,217.87 221.51,217.93 221.51,217.93 C221.51,217.93 221.52,217.99 221.52,217.99 C221.52,217.99 221.53,218.05 221.53,218.05 C221.53,218.05 221.54,218.11 221.54,218.11 C221.54,218.11 221.54,218.18 221.54,218.18 C221.54,218.18 221.55,218.24 221.55,218.24 C221.55,218.24 221.55,218.3 221.55,218.3 C221.55,218.3 221.55,218.37 221.55,218.37 C221.55,218.37 221.56,218.43 221.56,218.43 C221.56,218.43 221.56,218.49 221.56,218.49 C221.56,218.49 221.56,218.55 221.56,218.55 C221.56,218.55 221.56,218.62 221.56,218.62 C221.56,218.62 221.56,218.68 221.56,218.68 C221.56,218.68 221.55,218.74 221.55,218.74 C221.55,218.74 221.55,218.81 221.55,218.81 C221.55,218.81 221.55,218.87 221.55,218.87 C221.55,218.87 221.54,218.93 221.54,218.93 C221.54,218.93 221.54,218.99 221.54,218.99 C221.54,218.99 221.53,219.06 221.53,219.06 C221.53,219.06 221.52,219.12 221.52,219.12 C221.52,219.12 221.51,219.18 221.51,219.18 C221.51,219.18 221.5,219.24 221.5,219.24 C221.5,219.24 221.49,219.3 221.49,219.3 C221.49,219.3 221.48,219.37 221.48,219.37 C221.48,219.37 221.46,219.43 221.46,219.43 C221.46,219.43 221.45,219.49 221.45,219.49 C221.45,219.49 221.43,219.55 221.43,219.55 C221.43,219.55 221.42,219.61 221.42,219.61 C221.42,219.61 221.4,219.67 221.4,219.67 C221.4,219.67 221.39,219.73 221.39,219.73 C221.39,219.73 221.37,219.79 221.37,219.79 C221.37,219.79 221.34,219.85 221.34,219.85 C221.34,219.85 221.32,219.91 221.32,219.91 C221.32,219.91 221.3,219.97 221.3,219.97 C221.3,219.97 221.28,220.03 221.28,220.03 C221.28,220.03 221.26,220.09 221.26,220.09 C221.26,220.09 221.23,220.14 221.23,220.14 C221.23,220.14 221.21,220.2 221.21,220.2 C221.21,220.2 221.18,220.26 221.18,220.26 C221.18,220.26 221.15,220.32 221.15,220.32 C221.15,220.32 221.13,220.37 221.13,220.37 C221.13,220.37 221.1,220.43 221.1,220.43 C221.1,220.43 221.07,220.48 221.07,220.48 C221.07,220.48 221.03,220.54 221.03,220.54 C221.03,220.54 221,220.59 221,220.59 C221,220.59 220.97,220.65 220.97,220.65 C220.97,220.65 220.94,220.7 220.94,220.7 C220.94,220.7 220.9,220.75 220.9,220.75 C220.9,220.75 220.87,220.8 220.87,220.8 C220.87,220.8 220.83,220.86 220.83,220.86 C220.83,220.86 220.8,220.91 220.8,220.91 C220.8,220.91 220.76,220.96 220.76,220.96 C220.76,220.96 220.72,221.01 220.72,221.01 C220.72,221.01 220.68,221.06 220.68,221.06 C220.68,221.06 220.64,221.11 220.64,221.11 C220.64,221.11 220.6,221.15 220.6,221.15 C220.6,221.15 220.56,221.2 220.56,221.2 C220.56,221.2 220.52,221.25 220.52,221.25 C220.52,221.25 220.48,221.3 220.48,221.3 C220.48,221.3 220.43,221.34 220.43,221.34 C220.43,221.34 220.39,221.38 220.39,221.38 C220.39,221.38 220.34,221.43 220.34,221.43 C220.34,221.43 220.3,221.47 220.3,221.47 C220.3,221.47 220.25,221.52 220.25,221.52 C220.25,221.52 220.21,221.56 220.21,221.56 C220.21,221.56 220.16,221.6 220.16,221.6 C220.16,221.6 220.11,221.64 220.11,221.64 C220.11,221.64 220.06,221.68 220.06,221.68 C220.06,221.68 220.01,221.72 220.01,221.72 C220.01,221.72 219.96,221.76 219.96,221.76 C219.96,221.76 219.91,221.8 219.91,221.8 C219.91,221.8 219.86,221.83 219.86,221.83 C219.86,221.83 219.81,221.87 219.81,221.87 C219.81,221.87 219.75,221.9 219.75,221.9 C219.75,221.9 219.7,221.93 219.7,221.93 C219.7,221.93 219.65,221.97 219.65,221.97 C219.65,221.97 219.6,222 219.6,222 C219.6,222 219.54,222.03 219.54,222.03 C219.54,222.03 219.49,222.06 219.49,222.06 C219.49,222.06 219.43,222.09 219.43,222.09 C219.43,222.09 219.37,222.12 219.37,222.12 C219.37,222.12 219.32,222.15 219.32,222.15 C219.32,222.15 219.26,222.18 219.26,222.18 C219.26,222.18 219.21,222.2 219.21,222.2 C219.21,222.2 219.15,222.23 219.15,222.23 C219.15,222.23 219.09,222.25 219.09,222.25 C219.09,222.25 219.03,222.28 219.03,222.28 C219.03,222.28 218.97,222.3 218.97,222.3 C218.97,222.3 218.91,222.32 218.91,222.32 C218.91,222.32 218.85,222.34 218.85,222.34 C218.85,222.34 218.79,222.36 218.79,222.36 C218.79,222.36 218.73,222.38 218.73,222.38 C218.73,222.38 218.67,222.4 218.67,222.4 C218.67,222.4 218.61,222.42 218.61,222.42 C218.61,222.42 218.55,222.44 218.55,222.44 C218.55,222.44 218.49,222.45 218.49,222.45 C218.49,222.45 218.43,222.46 218.43,222.46 C218.43,222.46 218.37,222.47 218.37,222.47 C218.37,222.47 218.31,222.49 218.31,222.49 C218.31,222.49 218.25,222.5 218.25,222.5 C218.25,222.5 218.18,222.51 218.18,222.51 C218.18,222.51 218.12,222.52 218.12,222.52 C218.12,222.52 218.06,222.53 218.06,222.53 C218.06,222.53 218,222.54 218,222.54 C218,222.54 217.93,222.54 217.93,222.54 C217.93,222.54 217.87,222.55 217.87,222.55 C217.87,222.55 217.81,222.55 217.81,222.55 C217.81,222.55 217.75,222.55 217.75,222.55 C217.75,222.55 217.68,222.56 217.68,222.56 C217.68,222.56 217.62,222.56 217.62,222.56 C217.62,222.56 217.56,222.56 217.56,222.56 C217.56,222.56 217.49,222.56 217.49,222.56 C217.49,222.56 217.43,222.56 217.43,222.56 C217.43,222.56 217.37,222.55 217.37,222.55 C217.37,222.55 217.3,222.55 217.3,222.55 C217.3,222.55 217.24,222.55 217.24,222.55 C217.24,222.55 217.18,222.54 217.18,222.54 C217.18,222.54 217.12,222.54 217.12,222.54 C217.12,222.54 217.05,222.53 217.05,222.53 C217.05,222.53 216.99,222.52 216.99,222.52 C216.99,222.52 216.93,222.51 216.93,222.51 C216.93,222.51 216.87,222.5 216.87,222.5 C216.87,222.5 216.81,222.49 216.81,222.49 C216.81,222.49 216.74,222.48 216.74,222.48 C216.74,222.48 216.68,222.46 216.68,222.46 C216.68,222.46 216.62,222.45 216.62,222.45 C216.62,222.45 216.56,222.43 216.56,222.43 C216.56,222.43 216.5,222.42 216.5,222.42 C216.5,222.42 216.44,222.4 216.44,222.4 C216.44,222.4 216.38,222.38 216.38,222.38 C216.38,222.38 216.32,222.36 216.32,222.36 C216.32,222.36 216.26,222.34 216.26,222.34 C216.26,222.34 216.2,222.32 216.2,222.32 C216.2,222.32 216.14,222.3 216.14,222.3 C216.14,222.3 216.08,222.28 216.08,222.28 C216.08,222.28 216.02,222.26 216.02,222.26 C216.02,222.26 215.97,222.23 215.97,222.23 C215.97,222.23 215.91,222.2 215.91,222.2 C215.91,222.2 215.85,222.18 215.85,222.18 C215.85,222.18 215.79,222.15 215.79,222.15 C215.79,222.15 215.74,222.12 215.74,222.12 C215.74,222.12 215.68,222.1 215.68,222.1 C215.68,222.1 215.63,222.06 215.63,222.06 C215.63,222.06 215.57,222.03 215.57,222.03 C215.57,222.03 215.52,222 215.52,222 C215.52,222 215.46,221.97 215.46,221.97 C215.46,221.97 215.41,221.94 215.41,221.94 C215.41,221.94 215.36,221.9 215.36,221.9 C215.36,221.9 215.31,221.87 215.31,221.87 C215.31,221.87 215.25,221.83 215.25,221.83 C215.25,221.83 215.2,221.79 215.2,221.79 C215.2,221.79 215.15,221.76 215.15,221.76 C215.15,221.76 215.1,221.72 215.1,221.72 C215.1,221.72 215.05,221.68 215.05,221.68 C215.05,221.68 215,221.64 215,221.64 C215,221.64 214.96,221.6 214.96,221.6 C214.96,221.6 214.91,221.56 214.91,221.56 C214.91,221.56 214.86,221.52 214.86,221.52 C214.86,221.52 214.81,221.48 214.81,221.48 C214.81,221.48 214.77,221.43 214.77,221.43 C214.77,221.43 214.73,221.39 214.73,221.39 C214.73,221.39 214.68,221.34 214.68,221.34 C214.68,221.34 214.64,221.3 214.64,221.3 C214.64,221.3 214.59,221.25 214.59,221.25 C214.59,221.25 214.55,221.2 214.55,221.2 C214.55,221.2 214.51,221.15 214.51,221.15 C214.51,221.15 214.47,221.11 214.47,221.11 C214.47,221.11 214.43,221.06 214.43,221.06 C214.43,221.06 214.39,221.01 214.39,221.01 C214.39,221.01 214.35,220.96 214.35,220.96 C214.35,220.96 214.31,220.91 214.31,220.91 C214.31,220.91 214.28,220.86 214.28,220.86 C214.28,220.86 214.25,220.81 214.25,220.81 C214.25,220.81 214.21,220.75 214.21,220.75 C214.21,220.75 214.18,220.7 214.18,220.7 C214.18,220.7 214.14,220.65 214.14,220.65 C214.14,220.65 214.11,220.59 214.11,220.59 C214.11,220.59 214.08,220.54 214.08,220.54 C214.08,220.54 214.05,220.48 214.05,220.48 C214.05,220.48 214.02,220.43 214.02,220.43 C214.02,220.43 213.99,220.37 213.99,220.37 C213.99,220.37 213.96,220.32 213.96,220.32 C213.96,220.32 213.93,220.26 213.93,220.26 C213.93,220.26 213.91,220.2 213.91,220.2 C213.91,220.2 213.88,220.14 213.88,220.14 C213.88,220.14 213.86,220.09 213.86,220.09 C213.86,220.09 213.83,220.03 213.83,220.03 C213.83,220.03 213.81,219.97 213.81,219.97 C213.81,219.97 213.79,219.91 213.79,219.91 C213.79,219.91 213.77,219.85 213.77,219.85 C213.77,219.85 213.75,219.79 213.75,219.79 C213.75,219.79 213.73,219.73 213.73,219.73 C213.73,219.73 213.71,219.67 213.71,219.67 C213.71,219.67 213.69,219.61 213.69,219.61 C213.69,219.61 213.68,219.55 213.68,219.55 C213.68,219.55 213.66,219.49 213.66,219.49 C213.66,219.49 213.65,219.43 213.65,219.43 C213.65,219.43 213.64,219.37 213.64,219.37 C213.64,219.37 213.62,219.31 213.62,219.31 C213.62,219.31 213.61,219.24 213.61,219.24 C213.61,219.24 213.6,219.18 213.6,219.18 C213.6,219.18 213.59,219.12 213.59,219.12 C213.59,219.12 213.58,219.06 213.58,219.06 C213.58,219.06 213.57,218.99 213.57,218.99 C213.57,218.99 213.57,218.93 213.57,218.93 C213.57,218.93 213.56,218.87 213.56,218.87 C213.56,218.87 213.56,218.81 213.56,218.81 C213.56,218.81 213.56,218.74 213.56,218.74 C213.56,218.74 213.56,218.68 213.56,218.68 C213.56,218.68 213.55,218.62 213.55,218.62 C213.55,218.62 213.55,218.55 213.55,218.55 C213.55,218.55 213.55,218.49 213.55,218.49 C213.55,218.49 213.56,218.43 213.56,218.43 C213.56,218.43 213.56,218.37 213.56,218.37 C213.56,218.37 213.56,218.3 213.56,218.3 C213.56,218.3 213.56,218.24 213.56,218.24 C213.56,218.24 213.57,218.18 213.57,218.18 C213.57,218.18 213.57,218.12 213.57,218.12 C213.57,218.12 213.58,218.05 213.58,218.05 C213.58,218.05 213.59,217.99 213.59,217.99 C213.59,217.99 213.6,217.93 213.6,217.93 C213.6,217.93 213.61,217.87 213.61,217.87 C213.61,217.87 213.62,217.8 213.62,217.8 C213.62,217.8 213.63,217.74 213.63,217.74 C213.63,217.74 213.65,217.68 213.65,217.68 C213.65,217.68 213.66,217.62 213.66,217.62 C213.66,217.62 213.68,217.56 213.68,217.56 C213.68,217.56 213.69,217.5 213.69,217.5 C213.69,217.5 213.71,217.44 213.71,217.44 C213.71,217.44 213.73,217.38 213.73,217.38 C213.73,217.38 213.75,217.32 213.75,217.32 C213.75,217.32 213.77,217.26 213.77,217.26 C213.77,217.26 213.79,217.2 213.79,217.2 C213.79,217.2 213.81,217.14 213.81,217.14 C213.81,217.14 213.83,217.08 213.83,217.08 C213.83,217.08 213.85,217.02 213.85,217.02 C213.85,217.02 213.88,216.96 213.88,216.96 C213.88,216.96 213.91,216.91 213.91,216.91 C213.91,216.91 213.93,216.85 213.93,216.85 C213.93,216.85 213.96,216.79 213.96,216.79 C213.96,216.79 213.99,216.74 213.99,216.74 C213.99,216.74 214.02,216.68 214.02,216.68 C214.02,216.68 214.05,216.63 214.05,216.63 C214.05,216.63 214.08,216.57 214.08,216.57 C214.08,216.57 214.11,216.52 214.11,216.52 C214.11,216.52 214.14,216.46 214.14,216.46 C214.14,216.46 214.17,216.41 214.17,216.41 C214.17,216.41 214.21,216.36 214.21,216.36 C214.21,216.36 214.24,216.3 214.24,216.3 C214.24,216.3 214.28,216.25 214.28,216.25 C214.28,216.25 214.32,216.2 214.32,216.2 C214.32,216.2 214.35,216.15 214.35,216.15 C214.35,216.15 214.39,216.1 214.39,216.1 C214.39,216.1 214.43,216.05 214.43,216.05 C214.43,216.05 214.47,216 214.47,216 C214.47,216 214.51,215.96 214.51,215.96 C214.51,215.96 214.55,215.91 214.55,215.91 C214.55,215.91 214.59,215.86 214.59,215.86 C214.59,215.86 214.64,215.81 214.64,215.81 C214.64,215.81 214.68,215.77 214.68,215.77 C214.68,215.77 214.73,215.72 214.73,215.72 C214.73,215.72 214.77,215.68 214.77,215.68 C214.77,215.68 214.82,215.64 214.82,215.64 C214.82,215.64 214.86,215.59 214.86,215.59 C214.86,215.59 214.91,215.55 214.91,215.55 C214.91,215.55 214.96,215.51 214.96,215.51 C214.96,215.51 215,215.47 215,215.47 C215,215.47 215.05,215.43 215.05,215.43 C215.05,215.43 215.1,215.39 215.1,215.39 C215.1,215.39 215.15,215.35 215.15,215.35 C215.15,215.35 215.2,215.31 215.2,215.31 C215.2,215.31 215.25,215.28 215.25,215.28 C215.25,215.28 215.31,215.24 215.31,215.24 C215.31,215.24 215.36,215.21 215.36,215.21 C215.36,215.21 215.41,215.17 215.41,215.17 C215.41,215.17 215.46,215.14 215.46,215.14 C215.46,215.14 215.52,215.11 215.52,215.11 C215.52,215.11 215.57,215.08 215.57,215.08 C215.57,215.08 215.63,215.05 215.63,215.05 C215.63,215.05 215.68,215.02 215.68,215.02 C215.68,215.02 215.74,214.99 215.74,214.99 C215.74,214.99 215.79,214.96 215.79,214.96 C215.79,214.96 215.85,214.93 215.85,214.93 C215.85,214.93 215.91,214.9 215.91,214.9 C215.91,214.9 215.97,214.88 215.97,214.88 C215.97,214.88 216.02,214.86 216.02,214.86 C216.02,214.86 216.08,214.83 216.08,214.83 C216.08,214.83 216.14,214.81 216.14,214.81 C216.14,214.81 216.2,214.78 216.2,214.78 C216.2,214.78 216.26,214.77 216.26,214.77 C216.26,214.77 216.32,214.75 216.32,214.75 C216.32,214.75 216.38,214.73 216.38,214.73 C216.38,214.73 216.44,214.71 216.44,214.71 C216.44,214.71 216.5,214.69 216.5,214.69 C216.5,214.69 216.56,214.67 216.56,214.67 C216.56,214.67 216.62,214.66 216.62,214.66 C216.62,214.66 216.68,214.65 216.68,214.65 C216.68,214.65 216.74,214.63 216.74,214.63 C216.74,214.63 216.81,214.62 216.81,214.62 C216.81,214.62 216.87,214.61 216.87,214.61 C216.87,214.61 216.93,214.6 216.93,214.6 C216.93,214.6 216.99,214.59 216.99,214.59 C216.99,214.59 217.05,214.58 217.05,214.58 C217.05,214.58 217.12,214.57 217.12,214.57 C217.12,214.57 217.18,214.57 217.18,214.57 C217.18,214.57 217.24,214.56 217.24,214.56 C217.24,214.56 217.3,214.56 217.3,214.56 C217.3,214.56 217.37,214.56 217.37,214.56 C217.37,214.56 217.43,214.55 217.43,214.55 C217.43,214.55 217.49,214.55 217.49,214.55 C217.49,214.55 217.56,214.55 217.56,214.55 C217.56,214.55 217.62,214.55 217.62,214.55c "/></group></group><group android:name="time_group"/></vector></aapt:attr><target android:name="_R_G_L_0_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="fillAlpha" android:duration="33" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="pathData" android:duration="67" android:startOffset="0" android:valueFrom="M217.62 214.55 C217.62,214.55 217.68,214.55 217.68,214.55 C217.68,214.55 217.74,214.56 217.74,214.56 C217.74,214.56 217.81,214.56 217.81,214.56 C217.81,214.56 217.87,214.56 217.87,214.56 C217.87,214.56 217.93,214.57 217.93,214.57 C217.93,214.57 218,214.57 218,214.57 C218,214.57 218.06,214.58 218.06,214.58 C218.06,214.58 218.12,214.59 218.12,214.59 C218.12,214.59 218.18,214.6 218.18,214.6 C218.18,214.6 218.24,214.61 218.24,214.61 C218.24,214.61 218.31,214.62 218.31,214.62 C218.31,214.62 218.37,214.63 218.37,214.63 C218.37,214.63 218.43,214.65 218.43,214.65 C218.43,214.65 218.49,214.66 218.49,214.66 C218.49,214.66 218.55,214.68 218.55,214.68 C218.55,214.68 218.61,214.69 218.61,214.69 C218.61,214.69 218.67,214.71 218.67,214.71 C218.67,214.71 218.73,214.73 218.73,214.73 C218.73,214.73 218.79,214.75 218.79,214.75 C218.79,214.75 218.85,214.77 218.85,214.77 C218.85,214.77 218.91,214.79 218.91,214.79 C218.91,214.79 218.97,214.81 218.97,214.81 C218.97,214.81 219.03,214.83 219.03,214.83 C219.03,214.83 219.09,214.85 219.09,214.85 C219.09,214.85 219.15,214.88 219.15,214.88 C219.15,214.88 219.2,214.9 219.2,214.9 C219.2,214.9 219.26,214.93 219.26,214.93 C219.26,214.93 219.32,214.96 219.32,214.96 C219.32,214.96 219.37,214.98 219.37,214.98 C219.37,214.98 219.43,215.01 219.43,215.01 C219.43,215.01 219.48,215.05 219.48,215.05 C219.48,215.05 219.54,215.08 219.54,215.08 C219.54,215.08 219.59,215.11 219.59,215.11 C219.59,215.11 219.65,215.14 219.65,215.14 C219.65,215.14 219.7,215.17 219.7,215.17 C219.7,215.17 219.75,215.21 219.75,215.21 C219.75,215.21 219.81,215.24 219.81,215.24 C219.81,215.24 219.86,215.28 219.86,215.28 C219.86,215.28 219.91,215.32 219.91,215.32 C219.91,215.32 219.96,215.35 219.96,215.35 C219.96,215.35 220.01,215.39 220.01,215.39 C220.01,215.39 220.06,215.43 220.06,215.43 C220.06,215.43 220.11,215.47 220.11,215.47 C220.11,215.47 220.16,215.51 220.16,215.51 C220.16,215.51 220.2,215.55 220.2,215.55 C220.2,215.55 220.25,215.59 220.25,215.59 C220.25,215.59 220.3,215.63 220.3,215.63 C220.3,215.63 220.34,215.68 220.34,215.68 C220.34,215.68 220.39,215.72 220.39,215.72 C220.39,215.72 220.43,215.77 220.43,215.77 C220.43,215.77 220.47,215.81 220.47,215.81 C220.47,215.81 220.52,215.86 220.52,215.86 C220.52,215.86 220.56,215.9 220.56,215.9 C220.56,215.9 220.6,215.95 220.6,215.95 C220.6,215.95 220.64,216 220.64,216 C220.64,216 220.68,216.05 220.68,216.05 C220.68,216.05 220.72,216.1 220.72,216.1 C220.72,216.1 220.76,216.15 220.76,216.15 C220.76,216.15 220.8,216.2 220.8,216.2 C220.8,216.2 220.83,216.25 220.83,216.25 C220.83,216.25 220.87,216.3 220.87,216.3 C220.87,216.3 220.9,216.36 220.9,216.36 C220.9,216.36 220.94,216.41 220.94,216.41 C220.94,216.41 220.97,216.46 220.97,216.46 C220.97,216.46 221,216.51 221,216.51 C221,216.51 221.03,216.57 221.03,216.57 C221.03,216.57 221.06,216.63 221.06,216.63 C221.06,216.63 221.09,216.68 221.09,216.68 C221.09,216.68 221.12,216.74 221.12,216.74 C221.12,216.74 221.15,216.79 221.15,216.79 C221.15,216.79 221.18,216.85 221.18,216.85 C221.18,216.85 221.21,216.91 221.21,216.91 C221.21,216.91 221.23,216.96 221.23,216.96 C221.23,216.96 221.25,217.02 221.25,217.02 C221.25,217.02 221.28,217.08 221.28,217.08 C221.28,217.08 221.3,217.14 221.3,217.14 C221.3,217.14 221.33,217.2 221.33,217.2 C221.33,217.2 221.34,217.26 221.34,217.26 C221.34,217.26 221.36,217.32 221.36,217.32 C221.36,217.32 221.38,217.38 221.38,217.38 C221.38,217.38 221.4,217.44 221.4,217.44 C221.4,217.44 221.42,217.5 221.42,217.5 C221.42,217.5 221.44,217.56 221.44,217.56 C221.44,217.56 221.45,217.62 221.45,217.62 C221.45,217.62 221.46,217.68 221.46,217.68 C221.46,217.68 221.48,217.74 221.48,217.74 C221.48,217.74 221.49,217.8 221.49,217.8 C221.49,217.8 221.5,217.87 221.5,217.87 C221.5,217.87 221.51,217.93 221.51,217.93 C221.51,217.93 221.52,217.99 221.52,217.99 C221.52,217.99 221.53,218.05 221.53,218.05 C221.53,218.05 221.54,218.11 221.54,218.11 C221.54,218.11 221.54,218.18 221.54,218.18 C221.54,218.18 221.55,218.24 221.55,218.24 C221.55,218.24 221.55,218.3 221.55,218.3 C221.55,218.3 221.55,218.37 221.55,218.37 C221.55,218.37 221.56,218.43 221.56,218.43 C221.56,218.43 221.56,218.49 221.56,218.49 C221.56,218.49 221.56,218.55 221.56,218.55 C221.56,218.55 221.56,218.62 221.56,218.62 C221.56,218.62 221.56,218.68 221.56,218.68 C221.56,218.68 221.55,218.74 221.55,218.74 C221.55,218.74 221.55,218.81 221.55,218.81 C221.55,218.81 221.55,218.87 221.55,218.87 C221.55,218.87 221.54,218.93 221.54,218.93 C221.54,218.93 221.54,218.99 221.54,218.99 C221.54,218.99 221.53,219.06 221.53,219.06 C221.53,219.06 221.52,219.12 221.52,219.12 C221.52,219.12 221.51,219.18 221.51,219.18 C221.51,219.18 221.5,219.24 221.5,219.24 C221.5,219.24 221.49,219.3 221.49,219.3 C221.49,219.3 221.48,219.37 221.48,219.37 C221.48,219.37 221.46,219.43 221.46,219.43 C221.46,219.43 221.45,219.49 221.45,219.49 C221.45,219.49 221.43,219.55 221.43,219.55 C221.43,219.55 221.42,219.61 221.42,219.61 C221.42,219.61 221.4,219.67 221.4,219.67 C221.4,219.67 221.39,219.73 221.39,219.73 C221.39,219.73 221.37,219.79 221.37,219.79 C221.37,219.79 221.34,219.85 221.34,219.85 C221.34,219.85 221.32,219.91 221.32,219.91 C221.32,219.91 221.3,219.97 221.3,219.97 C221.3,219.97 221.28,220.03 221.28,220.03 C221.28,220.03 221.26,220.09 221.26,220.09 C221.26,220.09 221.23,220.14 221.23,220.14 C221.23,220.14 221.21,220.2 221.21,220.2 C221.21,220.2 221.18,220.26 221.18,220.26 C221.18,220.26 221.15,220.32 221.15,220.32 C221.15,220.32 221.13,220.37 221.13,220.37 C221.13,220.37 221.1,220.43 221.1,220.43 C221.1,220.43 221.07,220.48 221.07,220.48 C221.07,220.48 221.03,220.54 221.03,220.54 C221.03,220.54 221,220.59 221,220.59 C221,220.59 220.97,220.65 220.97,220.65 C220.97,220.65 220.94,220.7 220.94,220.7 C220.94,220.7 220.9,220.75 220.9,220.75 C220.9,220.75 220.87,220.8 220.87,220.8 C220.87,220.8 220.83,220.86 220.83,220.86 C220.83,220.86 220.8,220.91 220.8,220.91 C220.8,220.91 220.76,220.96 220.76,220.96 C220.76,220.96 220.72,221.01 220.72,221.01 C220.72,221.01 220.68,221.06 220.68,221.06 C220.68,221.06 220.64,221.11 220.64,221.11 C220.64,221.11 220.6,221.15 220.6,221.15 C220.6,221.15 220.56,221.2 220.56,221.2 C220.56,221.2 220.52,221.25 220.52,221.25 C220.52,221.25 220.48,221.3 220.48,221.3 C220.48,221.3 220.43,221.34 220.43,221.34 C220.43,221.34 220.39,221.38 220.39,221.38 C220.39,221.38 220.34,221.43 220.34,221.43 C220.34,221.43 220.3,221.47 220.3,221.47 C220.3,221.47 220.25,221.52 220.25,221.52 C220.25,221.52 220.21,221.56 220.21,221.56 C220.21,221.56 220.16,221.6 220.16,221.6 C220.16,221.6 220.11,221.64 220.11,221.64 C220.11,221.64 220.06,221.68 220.06,221.68 C220.06,221.68 220.01,221.72 220.01,221.72 C220.01,221.72 219.96,221.76 219.96,221.76 C219.96,221.76 219.91,221.8 219.91,221.8 C219.91,221.8 219.86,221.83 219.86,221.83 C219.86,221.83 219.81,221.87 219.81,221.87 C219.81,221.87 219.75,221.9 219.75,221.9 C219.75,221.9 219.7,221.93 219.7,221.93 C219.7,221.93 219.65,221.97 219.65,221.97 C219.65,221.97 219.6,222 219.6,222 C219.6,222 219.54,222.03 219.54,222.03 C219.54,222.03 219.49,222.06 219.49,222.06 C219.49,222.06 219.43,222.09 219.43,222.09 C219.43,222.09 219.37,222.12 219.37,222.12 C219.37,222.12 219.32,222.15 219.32,222.15 C219.32,222.15 219.26,222.18 219.26,222.18 C219.26,222.18 219.21,222.2 219.21,222.2 C219.21,222.2 219.15,222.23 219.15,222.23 C219.15,222.23 219.09,222.25 219.09,222.25 C219.09,222.25 219.03,222.28 219.03,222.28 C219.03,222.28 218.97,222.3 218.97,222.3 C218.97,222.3 218.91,222.32 218.91,222.32 C218.91,222.32 218.85,222.34 218.85,222.34 C218.85,222.34 218.79,222.36 218.79,222.36 C218.79,222.36 218.73,222.38 218.73,222.38 C218.73,222.38 218.67,222.4 218.67,222.4 C218.67,222.4 218.61,222.42 218.61,222.42 C218.61,222.42 218.55,222.44 218.55,222.44 C218.55,222.44 218.49,222.45 218.49,222.45 C218.49,222.45 218.43,222.46 218.43,222.46 C218.43,222.46 218.37,222.47 218.37,222.47 C218.37,222.47 218.31,222.49 218.31,222.49 C218.31,222.49 218.25,222.5 218.25,222.5 C218.25,222.5 218.18,222.51 218.18,222.51 C218.18,222.51 218.12,222.52 218.12,222.52 C218.12,222.52 218.06,222.53 218.06,222.53 C218.06,222.53 218,222.54 218,222.54 C218,222.54 217.93,222.54 217.93,222.54 C217.93,222.54 217.87,222.55 217.87,222.55 C217.87,222.55 217.81,222.55 217.81,222.55 C217.81,222.55 217.75,222.55 217.75,222.55 C217.75,222.55 217.68,222.56 217.68,222.56 C217.68,222.56 217.62,222.56 217.62,222.56 C217.62,222.56 217.56,222.56 217.56,222.56 C217.56,222.56 217.49,222.56 217.49,222.56 C217.49,222.56 217.43,222.56 217.43,222.56 C217.43,222.56 217.37,222.55 217.37,222.55 C217.37,222.55 217.3,222.55 217.3,222.55 C217.3,222.55 217.24,222.55 217.24,222.55 C217.24,222.55 217.18,222.54 217.18,222.54 C217.18,222.54 217.12,222.54 217.12,222.54 C217.12,222.54 217.05,222.53 217.05,222.53 C217.05,222.53 216.99,222.52 216.99,222.52 C216.99,222.52 216.93,222.51 216.93,222.51 C216.93,222.51 216.87,222.5 216.87,222.5 C216.87,222.5 216.81,222.49 216.81,222.49 C216.81,222.49 216.74,222.48 216.74,222.48 C216.74,222.48 216.68,222.46 216.68,222.46 C216.68,222.46 216.62,222.45 216.62,222.45 C216.62,222.45 216.56,222.43 216.56,222.43 C216.56,222.43 216.5,222.42 216.5,222.42 C216.5,222.42 216.44,222.4 216.44,222.4 C216.44,222.4 216.38,222.38 216.38,222.38 C216.38,222.38 216.32,222.36 216.32,222.36 C216.32,222.36 216.26,222.34 216.26,222.34 C216.26,222.34 216.2,222.32 216.2,222.32 C216.2,222.32 216.14,222.3 216.14,222.3 C216.14,222.3 216.08,222.28 216.08,222.28 C216.08,222.28 216.02,222.26 216.02,222.26 C216.02,222.26 215.97,222.23 215.97,222.23 C215.97,222.23 215.91,222.2 215.91,222.2 C215.91,222.2 215.85,222.18 215.85,222.18 C215.85,222.18 215.79,222.15 215.79,222.15 C215.79,222.15 215.74,222.12 215.74,222.12 C215.74,222.12 215.68,222.1 215.68,222.1 C215.68,222.1 215.63,222.06 215.63,222.06 C215.63,222.06 215.57,222.03 215.57,222.03 C215.57,222.03 215.52,222 215.52,222 C215.52,222 215.46,221.97 215.46,221.97 C215.46,221.97 215.41,221.94 215.41,221.94 C215.41,221.94 215.36,221.9 215.36,221.9 C215.36,221.9 215.31,221.87 215.31,221.87 C215.31,221.87 215.25,221.83 215.25,221.83 C215.25,221.83 215.2,221.79 215.2,221.79 C215.2,221.79 215.15,221.76 215.15,221.76 C215.15,221.76 215.1,221.72 215.1,221.72 C215.1,221.72 215.05,221.68 215.05,221.68 C215.05,221.68 215,221.64 215,221.64 C215,221.64 214.96,221.6 214.96,221.6 C214.96,221.6 214.91,221.56 214.91,221.56 C214.91,221.56 214.86,221.52 214.86,221.52 C214.86,221.52 214.81,221.48 214.81,221.48 C214.81,221.48 214.77,221.43 214.77,221.43 C214.77,221.43 214.73,221.39 214.73,221.39 C214.73,221.39 214.68,221.34 214.68,221.34 C214.68,221.34 214.64,221.3 214.64,221.3 C214.64,221.3 214.59,221.25 214.59,221.25 C214.59,221.25 214.55,221.2 214.55,221.2 C214.55,221.2 214.51,221.15 214.51,221.15 C214.51,221.15 214.47,221.11 214.47,221.11 C214.47,221.11 214.43,221.06 214.43,221.06 C214.43,221.06 214.39,221.01 214.39,221.01 C214.39,221.01 214.35,220.96 214.35,220.96 C214.35,220.96 214.31,220.91 214.31,220.91 C214.31,220.91 214.28,220.86 214.28,220.86 C214.28,220.86 214.25,220.81 214.25,220.81 C214.25,220.81 214.21,220.75 214.21,220.75 C214.21,220.75 214.18,220.7 214.18,220.7 C214.18,220.7 214.14,220.65 214.14,220.65 C214.14,220.65 214.11,220.59 214.11,220.59 C214.11,220.59 214.08,220.54 214.08,220.54 C214.08,220.54 214.05,220.48 214.05,220.48 C214.05,220.48 214.02,220.43 214.02,220.43 C214.02,220.43 213.99,220.37 213.99,220.37 C213.99,220.37 213.96,220.32 213.96,220.32 C213.96,220.32 213.93,220.26 213.93,220.26 C213.93,220.26 213.91,220.2 213.91,220.2 C213.91,220.2 213.88,220.14 213.88,220.14 C213.88,220.14 213.86,220.09 213.86,220.09 C213.86,220.09 213.83,220.03 213.83,220.03 C213.83,220.03 213.81,219.97 213.81,219.97 C213.81,219.97 213.79,219.91 213.79,219.91 C213.79,219.91 213.77,219.85 213.77,219.85 C213.77,219.85 213.75,219.79 213.75,219.79 C213.75,219.79 213.73,219.73 213.73,219.73 C213.73,219.73 213.71,219.67 213.71,219.67 C213.71,219.67 213.69,219.61 213.69,219.61 C213.69,219.61 213.68,219.55 213.68,219.55 C213.68,219.55 213.66,219.49 213.66,219.49 C213.66,219.49 213.65,219.43 213.65,219.43 C213.65,219.43 213.64,219.37 213.64,219.37 C213.64,219.37 213.62,219.31 213.62,219.31 C213.62,219.31 213.61,219.24 213.61,219.24 C213.61,219.24 213.6,219.18 213.6,219.18 C213.6,219.18 213.59,219.12 213.59,219.12 C213.59,219.12 213.58,219.06 213.58,219.06 C213.58,219.06 213.57,218.99 213.57,218.99 C213.57,218.99 213.57,218.93 213.57,218.93 C213.57,218.93 213.56,218.87 213.56,218.87 C213.56,218.87 213.56,218.81 213.56,218.81 C213.56,218.81 213.56,218.74 213.56,218.74 C213.56,218.74 213.56,218.68 213.56,218.68 C213.56,218.68 213.55,218.62 213.55,218.62 C213.55,218.62 213.55,218.55 213.55,218.55 C213.55,218.55 213.55,218.49 213.55,218.49 C213.55,218.49 213.56,218.43 213.56,218.43 C213.56,218.43 213.56,218.37 213.56,218.37 C213.56,218.37 213.56,218.3 213.56,218.3 C213.56,218.3 213.56,218.24 213.56,218.24 C213.56,218.24 213.57,218.18 213.57,218.18 C213.57,218.18 213.57,218.12 213.57,218.12 C213.57,218.12 213.58,218.05 213.58,218.05 C213.58,218.05 213.59,217.99 213.59,217.99 C213.59,217.99 213.6,217.93 213.6,217.93 C213.6,217.93 213.61,217.87 213.61,217.87 C213.61,217.87 213.62,217.8 213.62,217.8 C213.62,217.8 213.63,217.74 213.63,217.74 C213.63,217.74 213.65,217.68 213.65,217.68 C213.65,217.68 213.66,217.62 213.66,217.62 C213.66,217.62 213.68,217.56 213.68,217.56 C213.68,217.56 213.69,217.5 213.69,217.5 C213.69,217.5 213.71,217.44 213.71,217.44 C213.71,217.44 213.73,217.38 213.73,217.38 C213.73,217.38 213.75,217.32 213.75,217.32 C213.75,217.32 213.77,217.26 213.77,217.26 C213.77,217.26 213.79,217.2 213.79,217.2 C213.79,217.2 213.81,217.14 213.81,217.14 C213.81,217.14 213.83,217.08 213.83,217.08 C213.83,217.08 213.85,217.02 213.85,217.02 C213.85,217.02 213.88,216.96 213.88,216.96 C213.88,216.96 213.91,216.91 213.91,216.91 C213.91,216.91 213.93,216.85 213.93,216.85 C213.93,216.85 213.96,216.79 213.96,216.79 C213.96,216.79 213.99,216.74 213.99,216.74 C213.99,216.74 214.02,216.68 214.02,216.68 C214.02,216.68 214.05,216.63 214.05,216.63 C214.05,216.63 214.08,216.57 214.08,216.57 C214.08,216.57 214.11,216.52 214.11,216.52 C214.11,216.52 214.14,216.46 214.14,216.46 C214.14,216.46 214.17,216.41 214.17,216.41 C214.17,216.41 214.21,216.36 214.21,216.36 C214.21,216.36 214.24,216.3 214.24,216.3 C214.24,216.3 214.28,216.25 214.28,216.25 C214.28,216.25 214.32,216.2 214.32,216.2 C214.32,216.2 214.35,216.15 214.35,216.15 C214.35,216.15 214.39,216.1 214.39,216.1 C214.39,216.1 214.43,216.05 214.43,216.05 C214.43,216.05 214.47,216 214.47,216 C214.47,216 214.51,215.96 214.51,215.96 C214.51,215.96 214.55,215.91 214.55,215.91 C214.55,215.91 214.59,215.86 214.59,215.86 C214.59,215.86 214.64,215.81 214.64,215.81 C214.64,215.81 214.68,215.77 214.68,215.77 C214.68,215.77 214.73,215.72 214.73,215.72 C214.73,215.72 214.77,215.68 214.77,215.68 C214.77,215.68 214.82,215.64 214.82,215.64 C214.82,215.64 214.86,215.59 214.86,215.59 C214.86,215.59 214.91,215.55 214.91,215.55 C214.91,215.55 214.96,215.51 214.96,215.51 C214.96,215.51 215,215.47 215,215.47 C215,215.47 215.05,215.43 215.05,215.43 C215.05,215.43 215.1,215.39 215.1,215.39 C215.1,215.39 215.15,215.35 215.15,215.35 C215.15,215.35 215.2,215.31 215.2,215.31 C215.2,215.31 215.25,215.28 215.25,215.28 C215.25,215.28 215.31,215.24 215.31,215.24 C215.31,215.24 215.36,215.21 215.36,215.21 C215.36,215.21 215.41,215.17 215.41,215.17 C215.41,215.17 215.46,215.14 215.46,215.14 C215.46,215.14 215.52,215.11 215.52,215.11 C215.52,215.11 215.57,215.08 215.57,215.08 C215.57,215.08 215.63,215.05 215.63,215.05 C215.63,215.05 215.68,215.02 215.68,215.02 C215.68,215.02 215.74,214.99 215.74,214.99 C215.74,214.99 215.79,214.96 215.79,214.96 C215.79,214.96 215.85,214.93 215.85,214.93 C215.85,214.93 215.91,214.9 215.91,214.9 C215.91,214.9 215.97,214.88 215.97,214.88 C215.97,214.88 216.02,214.86 216.02,214.86 C216.02,214.86 216.08,214.83 216.08,214.83 C216.08,214.83 216.14,214.81 216.14,214.81 C216.14,214.81 216.2,214.78 216.2,214.78 C216.2,214.78 216.26,214.77 216.26,214.77 C216.26,214.77 216.32,214.75 216.32,214.75 C216.32,214.75 216.38,214.73 216.38,214.73 C216.38,214.73 216.44,214.71 216.44,214.71 C216.44,214.71 216.5,214.69 216.5,214.69 C216.5,214.69 216.56,214.67 216.56,214.67 C216.56,214.67 216.62,214.66 216.62,214.66 C216.62,214.66 216.68,214.65 216.68,214.65 C216.68,214.65 216.74,214.63 216.74,214.63 C216.74,214.63 216.81,214.62 216.81,214.62 C216.81,214.62 216.87,214.61 216.87,214.61 C216.87,214.61 216.93,214.6 216.93,214.6 C216.93,214.6 216.99,214.59 216.99,214.59 C216.99,214.59 217.05,214.58 217.05,214.58 C217.05,214.58 217.12,214.57 217.12,214.57 C217.12,214.57 217.18,214.57 217.18,214.57 C217.18,214.57 217.24,214.56 217.24,214.56 C217.24,214.56 217.3,214.56 217.3,214.56 C217.3,214.56 217.37,214.56 217.37,214.56 C217.37,214.56 217.43,214.55 217.43,214.55 C217.43,214.55 217.49,214.55 217.49,214.55 C217.49,214.55 217.56,214.55 217.56,214.55 C217.56,214.55 217.62,214.55 217.62,214.55c " android:valueTo="M217.78 201.58 C217.78,201.58 218.07,201.62 218.07,201.62 C218.07,201.62 218.35,201.69 218.35,201.69 C218.35,201.69 218.63,201.78 218.63,201.78 C218.63,201.78 218.89,201.9 218.89,201.9 C218.89,201.9 219.14,202.04 219.14,202.04 C219.14,202.04 219.38,202.21 219.38,202.21 C219.38,202.21 219.59,202.41 219.59,202.41 C219.59,202.41 219.78,202.62 219.78,202.62 C219.78,202.62 219.95,202.86 219.95,202.86 C219.95,202.86 220.11,203.1 220.11,203.1 C220.11,203.1 220.26,203.35 220.26,203.35 C220.26,203.35 220.41,203.6 220.41,203.6 C220.41,203.6 220.55,203.85 220.55,203.85 C220.55,203.85 220.7,204.1 220.7,204.1 C220.7,204.1 220.85,204.35 220.85,204.35 C220.85,204.35 221,204.59 221,204.59 C221,204.59 221.15,204.84 221.15,204.84 C221.15,204.84 221.3,205.09 221.3,205.09 C221.3,205.09 221.46,205.33 221.46,205.33 C221.46,205.33 221.65,205.55 221.65,205.55 C221.65,205.55 221.86,205.75 221.86,205.75 C221.86,205.75 222.09,205.93 222.09,205.93 C222.09,205.93 222.33,206.09 222.33,206.09 C222.33,206.09 222.59,206.22 222.59,206.22 C222.59,206.22 222.86,206.32 222.86,206.32 C222.86,206.32 223.14,206.4 223.14,206.4 C223.14,206.4 223.42,206.45 223.42,206.45 C223.42,206.45 223.71,206.46 223.71,206.46 C223.71,206.46 224,206.45 224,206.45 C224,206.45 224.29,206.41 224.29,206.41 C224.29,206.41 224.57,206.35 224.57,206.35 C224.57,206.35 224.85,206.28 224.85,206.28 C224.85,206.28 225.13,206.21 225.13,206.21 C225.13,206.21 225.41,206.14 225.41,206.14 C225.41,206.14 225.7,206.07 225.7,206.07 C225.7,206.07 225.98,206 225.98,206 C225.98,206 226.26,205.93 226.26,205.93 C226.26,205.93 226.54,205.86 226.54,205.86 C226.54,205.86 226.82,205.78 226.82,205.78 C226.82,205.78 227.1,205.73 227.1,205.73 C227.1,205.73 227.39,205.71 227.39,205.71 C227.39,205.71 227.68,205.7 227.68,205.7 C227.68,205.7 227.97,205.73 227.97,205.73 C227.97,205.73 228.25,205.79 228.25,205.79 C228.25,205.79 228.53,205.88 228.53,205.88 C228.53,205.88 228.79,206 228.79,206 C228.79,206 229.04,206.14 229.04,206.14 C229.04,206.14 229.28,206.31 229.28,206.31 C229.28,206.31 229.5,206.49 229.5,206.49 C229.5,206.49 229.7,206.7 229.7,206.7 C229.7,206.7 229.88,206.93 229.88,206.93 C229.88,206.93 230.03,207.18 230.03,207.18 C230.03,207.18 230.16,207.44 230.16,207.44 C230.16,207.44 230.26,207.71 230.26,207.71 C230.26,207.71 230.34,207.99 230.34,207.99 C230.34,207.99 230.38,208.27 230.38,208.27 C230.38,208.27 230.39,208.56 230.39,208.56 C230.39,208.56 230.38,208.85 230.38,208.85 C230.38,208.85 230.33,209.14 230.33,209.14 C230.33,209.14 230.27,209.42 230.27,209.42 C230.27,209.42 230.2,209.7 230.2,209.7 C230.2,209.7 230.13,209.98 230.13,209.98 C230.13,209.98 230.06,210.26 230.06,210.26 C230.06,210.26 229.99,210.55 229.99,210.55 C229.99,210.55 229.92,210.83 229.92,210.83 C229.92,210.83 229.85,211.11 229.85,211.11 C229.85,211.11 229.78,211.39 229.78,211.39 C229.78,211.39 229.71,211.67 229.71,211.67 C229.71,211.67 229.66,211.95 229.66,211.95 C229.66,211.95 229.63,212.24 229.63,212.24 C229.63,212.24 229.64,212.53 229.64,212.53 C229.64,212.53 229.67,212.82 229.67,212.82 C229.67,212.82 229.73,213.1 229.73,213.1 C229.73,213.1 229.82,213.38 229.82,213.38 C229.82,213.38 229.94,213.64 229.94,213.64 C229.94,213.64 230.08,213.89 230.08,213.89 C230.08,213.89 230.25,214.13 230.25,214.13 C230.25,214.13 230.44,214.35 230.44,214.35 C230.44,214.35 230.66,214.54 230.66,214.54 C230.66,214.54 230.89,214.72 230.89,214.72 C230.89,214.72 231.13,214.87 231.13,214.87 C231.13,214.87 231.38,215.02 231.38,215.02 C231.38,215.02 231.63,215.17 231.63,215.17 C231.63,215.17 231.88,215.32 231.88,215.32 C231.88,215.32 232.13,215.47 232.13,215.47 C232.13,215.47 232.38,215.62 232.38,215.62 C232.38,215.62 232.62,215.77 232.62,215.77 C232.62,215.77 232.87,215.91 232.87,215.91 C232.87,215.91 233.12,216.06 233.12,216.06 C233.12,216.06 233.36,216.23 233.36,216.23 C233.36,216.23 233.58,216.41 233.58,216.41 C233.58,216.41 233.79,216.62 233.79,216.62 C233.79,216.62 233.97,216.84 233.97,216.84 C233.97,216.84 234.13,217.08 234.13,217.08 C234.13,217.08 234.26,217.34 234.26,217.34 C234.26,217.34 234.36,217.61 234.36,217.61 C234.36,217.61 234.44,217.89 234.44,217.89 C234.44,217.89 234.49,218.17 234.49,218.17 C234.49,218.17 234.52,218.46 234.52,218.46 C234.52,218.46 234.51,218.75 234.51,218.75 C234.51,218.75 234.47,219.04 234.47,219.04 C234.47,219.04 234.41,219.32 234.41,219.32 C234.41,219.32 234.31,219.59 234.31,219.59 C234.31,219.59 234.19,219.86 234.19,219.86 C234.19,219.86 234.05,220.11 234.05,220.11 C234.05,220.11 233.88,220.34 233.88,220.34 C233.88,220.34 233.68,220.56 233.68,220.56 C233.68,220.56 233.47,220.75 233.47,220.75 C233.47,220.75 233.23,220.92 233.23,220.92 C233.23,220.92 232.99,221.08 232.99,221.08 C232.99,221.08 232.74,221.22 232.74,221.22 C232.74,221.22 232.49,221.37 232.49,221.37 C232.49,221.37 232.25,221.52 232.25,221.52 C232.25,221.52 232,221.67 232,221.67 C232,221.67 231.75,221.82 231.75,221.82 C231.75,221.82 231.5,221.97 231.5,221.97 C231.5,221.97 231.25,222.12 231.25,222.12 C231.25,222.12 231,222.27 231,222.27 C231,222.27 230.76,222.43 230.76,222.43 C230.76,222.43 230.54,222.62 230.54,222.62 C230.54,222.62 230.34,222.83 230.34,222.83 C230.34,222.83 230.16,223.05 230.16,223.05 C230.16,223.05 230.01,223.3 230.01,223.3 C230.01,223.3 229.87,223.56 229.87,223.56 C229.87,223.56 229.77,223.83 229.77,223.83 C229.77,223.83 229.7,224.11 229.7,224.11 C229.7,224.11 229.65,224.39 229.65,224.39 C229.65,224.39 229.63,224.68 229.63,224.68 C229.63,224.68 229.64,224.97 229.64,224.97 C229.64,224.97 229.68,225.26 229.68,225.26 C229.68,225.26 229.75,225.54 229.75,225.54 C229.75,225.54 229.82,225.82 229.82,225.82 C229.82,225.82 229.89,226.1 229.89,226.1 C229.89,226.1 229.96,226.38 229.96,226.38 C229.96,226.38 230.03,226.66 230.03,226.66 C230.03,226.66 230.1,226.94 230.1,226.94 C230.1,226.94 230.17,227.22 230.17,227.22 C230.17,227.22 230.24,227.51 230.24,227.51 C230.24,227.51 230.31,227.79 230.31,227.79 C230.31,227.79 230.36,228.07 230.36,228.07 C230.36,228.07 230.39,228.36 230.39,228.36 C230.39,228.36 230.39,228.65 230.39,228.65 C230.39,228.65 230.36,228.94 230.36,228.94 C230.36,228.94 230.3,229.22 230.3,229.22 C230.3,229.22 230.21,229.5 230.21,229.5 C230.21,229.5 230.1,229.76 230.1,229.76 C230.1,229.76 229.95,230.01 229.95,230.01 C229.95,230.01 229.79,230.25 229.79,230.25 C229.79,230.25 229.6,230.47 229.6,230.47 C229.6,230.47 229.39,230.67 229.39,230.67 C229.39,230.67 229.16,230.85 229.16,230.85 C229.16,230.85 228.91,231 228.91,231 C228.91,231 228.66,231.13 228.66,231.13 C228.66,231.13 228.38,231.23 228.38,231.23 C228.38,231.23 228.11,231.3 228.11,231.3 C228.11,231.3 227.82,231.35 227.82,231.35 C227.82,231.35 227.53,231.36 227.53,231.36 C227.53,231.36 227.24,231.35 227.24,231.35 C227.24,231.35 226.96,231.3 226.96,231.3 C226.96,231.3 226.67,231.24 226.67,231.24 C226.67,231.24 226.39,231.17 226.39,231.17 C226.39,231.17 226.11,231.1 226.11,231.1 C226.11,231.1 225.83,231.03 225.83,231.03 C225.83,231.03 225.55,230.96 225.55,230.96 C225.55,230.96 225.27,230.89 225.27,230.89 C225.27,230.89 224.99,230.82 224.99,230.82 C224.99,230.82 224.71,230.75 224.71,230.75 C224.71,230.75 224.42,230.68 224.42,230.68 C224.42,230.68 224.14,230.62 224.14,230.62 C224.14,230.62 223.85,230.6 223.85,230.6 C223.85,230.6 223.56,230.6 223.56,230.6 C223.56,230.6 223.27,230.64 223.27,230.64 C223.27,230.64 222.99,230.7 222.99,230.7 C222.99,230.7 222.72,230.79 222.72,230.79 C222.72,230.79 222.45,230.91 222.45,230.91 C222.45,230.91 222.2,231.05 222.2,231.05 C222.2,231.05 221.96,231.22 221.96,231.22 C221.96,231.22 221.75,231.41 221.75,231.41 C221.75,231.41 221.55,231.62 221.55,231.62 C221.55,231.62 221.38,231.85 221.38,231.85 C221.38,231.85 221.22,232.1 221.22,232.1 C221.22,232.1 221.07,232.35 221.07,232.35 C221.07,232.35 220.92,232.6 220.92,232.6 C220.92,232.6 220.77,232.85 220.77,232.85 C220.77,232.85 220.63,233.09 220.63,233.09 C220.63,233.09 220.48,233.34 220.48,233.34 C220.48,233.34 220.33,233.59 220.33,233.59 C220.33,233.59 220.18,233.84 220.18,233.84 C220.18,233.84 220.03,234.09 220.03,234.09 C220.03,234.09 219.87,234.33 219.87,234.33 C219.87,234.33 219.68,234.55 219.68,234.55 C219.68,234.55 219.48,234.75 219.48,234.75 C219.48,234.75 219.25,234.94 219.25,234.94 C219.25,234.94 219.01,235.1 219.01,235.1 C219.01,235.1 218.75,235.23 218.75,235.23 C218.75,235.23 218.48,235.33 218.48,235.33 C218.48,235.33 218.21,235.41 218.21,235.41 C218.21,235.41 217.92,235.46 217.92,235.46 C217.92,235.46 217.63,235.48 217.63,235.48 C217.63,235.48 217.34,235.48 217.34,235.48 C217.34,235.48 217.06,235.44 217.06,235.44 C217.06,235.44 216.77,235.37 216.77,235.37 C216.77,235.37 216.5,235.28 216.5,235.28 C216.5,235.28 216.24,235.16 216.24,235.16 C216.24,235.16 215.99,235.02 215.99,235.02 C215.99,235.02 215.75,234.85 215.75,234.85 C215.75,234.85 215.54,234.65 215.54,234.65 C215.54,234.65 215.34,234.44 215.34,234.44 C215.34,234.44 215.17,234.2 215.17,234.2 C215.17,234.2 215.02,233.96 215.02,233.96 C215.02,233.96 214.87,233.71 214.87,233.71 C214.87,233.71 214.72,233.46 214.72,233.46 C214.72,233.46 214.57,233.21 214.57,233.21 C214.57,233.21 214.42,232.96 214.42,232.96 C214.42,232.96 214.27,232.72 214.27,232.72 C214.27,232.72 214.12,232.47 214.12,232.47 C214.12,232.47 213.98,232.22 213.98,232.22 C213.98,232.22 213.83,231.97 213.83,231.97 C213.83,231.97 213.66,231.73 213.66,231.73 C213.66,231.73 213.48,231.51 213.48,231.51 C213.48,231.51 213.27,231.31 213.27,231.31 C213.27,231.31 213.04,231.13 213.04,231.13 C213.04,231.13 212.8,230.97 212.8,230.97 C212.8,230.97 212.54,230.84 212.54,230.84 C212.54,230.84 212.27,230.74 212.27,230.74 C212.27,230.74 211.99,230.66 211.99,230.66 C211.99,230.66 211.7,230.62 211.7,230.62 C211.7,230.62 211.41,230.6 211.41,230.6 C211.41,230.6 211.12,230.61 211.12,230.61 C211.12,230.61 210.84,230.65 210.84,230.65 C210.84,230.65 210.56,230.71 210.56,230.71 C210.56,230.71 210.27,230.78 210.27,230.78 C210.27,230.78 209.99,230.85 209.99,230.85 C209.99,230.85 209.71,230.92 209.71,230.92 C209.71,230.92 209.43,230.99 209.43,230.99 C209.43,230.99 209.15,231.06 209.15,231.06 C209.15,231.06 208.87,231.14 208.87,231.14 C208.87,231.14 208.59,231.21 208.59,231.21 C208.59,231.21 208.31,231.28 208.31,231.28 C208.31,231.28 208.02,231.33 208.02,231.33 C208.02,231.33 207.73,231.36 207.73,231.36 C207.73,231.36 207.45,231.36 207.45,231.36 C207.45,231.36 207.16,231.33 207.16,231.33 C207.16,231.33 206.87,231.27 206.87,231.27 C206.87,231.27 206.6,231.18 206.6,231.18 C206.6,231.18 206.33,231.06 206.33,231.06 C206.33,231.06 206.08,230.92 206.08,230.92 C206.08,230.92 205.85,230.76 205.85,230.76 C205.85,230.76 205.62,230.57 205.62,230.57 C205.62,230.57 205.42,230.36 205.42,230.36 C205.42,230.36 205.25,230.13 205.25,230.13 C205.25,230.13 205.1,229.88 205.1,229.88 C205.1,229.88 204.97,229.62 204.97,229.62 C204.97,229.62 204.87,229.35 204.87,229.35 C204.87,229.35 204.79,229.07 204.79,229.07 C204.79,229.07 204.74,228.79 204.74,228.79 C204.74,228.79 204.73,228.5 204.73,228.5 C204.73,228.5 204.74,228.21 204.74,228.21 C204.74,228.21 204.79,227.92 204.79,227.92 C204.79,227.92 204.85,227.64 204.85,227.64 C204.85,227.64 204.92,227.36 204.92,227.36 C204.92,227.36 204.99,227.08 204.99,227.08 C204.99,227.08 205.06,226.8 205.06,226.8 C205.06,226.8 205.13,226.52 205.13,226.52 C205.13,226.52 205.21,226.24 205.21,226.24 C205.21,226.24 205.28,225.96 205.28,225.96 C205.28,225.96 205.35,225.68 205.35,225.68 C205.35,225.68 205.42,225.39 205.42,225.39 C205.42,225.39 205.47,225.11 205.47,225.11 C205.47,225.11 205.49,224.82 205.49,224.82 C205.49,224.82 205.49,224.53 205.49,224.53 C205.49,224.53 205.46,224.24 205.46,224.24 C205.46,224.24 205.39,223.96 205.39,223.96 C205.39,223.96 205.3,223.69 205.3,223.69 C205.3,223.69 205.19,223.42 205.19,223.42 C205.19,223.42 205.04,223.17 205.04,223.17 C205.04,223.17 204.87,222.93 204.87,222.93 C204.87,222.93 204.68,222.71 204.68,222.71 C204.68,222.71 204.47,222.52 204.47,222.52 C204.47,222.52 204.24,222.34 204.24,222.34 C204.24,222.34 203.99,222.19 203.99,222.19 C203.99,222.19 203.75,222.04 203.75,222.04 C203.75,222.04 203.5,221.89 203.5,221.89 C203.5,221.89 203.25,221.74 203.25,221.74 C203.25,221.74 203,221.59 203,221.59 C203,221.59 202.75,221.45 202.75,221.45 C202.75,221.45 202.5,221.3 202.5,221.3 C202.5,221.3 202.25,221.15 202.25,221.15 C202.25,221.15 202.01,221 202.01,221 C202.01,221 201.77,220.83 201.77,220.83 C201.77,220.83 201.54,220.65 201.54,220.65 C201.54,220.65 201.34,220.45 201.34,220.45 C201.34,220.45 201.16,220.22 201.16,220.22 C201.16,220.22 201,219.98 201,219.98 C201,219.98 200.87,219.72 200.87,219.72 C200.87,219.72 200.76,219.45 200.76,219.45 C200.76,219.45 200.68,219.18 200.68,219.18 C200.68,219.18 200.63,218.89 200.63,218.89 C200.63,218.89 200.61,218.6 200.61,218.6 C200.61,218.6 200.61,218.31 200.61,218.31 C200.61,218.31 200.65,218.02 200.65,218.02 C200.65,218.02 200.72,217.74 200.72,217.74 C200.72,217.74 200.81,217.47 200.81,217.47 C200.81,217.47 200.93,217.21 200.93,217.21 C200.93,217.21 201.07,216.96 201.07,216.96 C201.07,216.96 201.24,216.72 201.24,216.72 C201.24,216.72 201.44,216.51 201.44,216.51 C201.44,216.51 201.65,216.31 201.65,216.31 C201.65,216.31 201.89,216.14 201.89,216.14 C201.89,216.14 202.13,215.99 202.13,215.99 C202.13,215.99 202.38,215.84 202.38,215.84 C202.38,215.84 202.63,215.69 202.63,215.69 C202.63,215.69 202.88,215.54 202.88,215.54 C202.88,215.54 203.13,215.39 203.13,215.39 C203.13,215.39 203.37,215.24 203.37,215.24 C203.37,215.24 203.62,215.09 203.62,215.09 C203.62,215.09 203.87,214.94 203.87,214.94 C203.87,214.94 204.12,214.79 204.12,214.79 C204.12,214.79 204.36,214.63 204.36,214.63 C204.36,214.63 204.58,214.45 204.58,214.45 C204.58,214.45 204.78,214.24 204.78,214.24 C204.78,214.24 204.96,214.01 204.96,214.01 C204.96,214.01 205.12,213.77 205.12,213.77 C205.12,213.77 205.25,213.51 205.25,213.51 C205.25,213.51 205.35,213.24 205.35,213.24 C205.35,213.24 205.43,212.96 205.43,212.96 C205.43,212.96 205.48,212.67 205.48,212.67 C205.48,212.67 205.5,212.38 205.5,212.38 C205.5,212.38 205.49,212.09 205.49,212.09 C205.49,212.09 205.44,211.81 205.44,211.81 C205.44,211.81 205.38,211.52 205.38,211.52 C205.38,211.52 205.31,211.24 205.31,211.24 C205.31,211.24 205.24,210.96 205.24,210.96 C205.24,210.96 205.17,210.68 205.17,210.68 C205.17,210.68 205.1,210.4 205.1,210.4 C205.1,210.4 205.03,210.12 205.03,210.12 C205.03,210.12 204.96,209.84 204.96,209.84 C204.96,209.84 204.89,209.56 204.89,209.56 C204.89,209.56 204.82,209.28 204.82,209.28 C204.82,209.28 204.76,208.99 204.76,208.99 C204.76,208.99 204.74,208.7 204.74,208.7 C204.74,208.7 204.74,208.42 204.74,208.42 C204.74,208.42 204.76,208.13 204.76,208.13 C204.76,208.13 204.82,207.84 204.82,207.84 C204.82,207.84 204.91,207.57 204.91,207.57 C204.91,207.57 205.03,207.3 205.03,207.3 C205.03,207.3 205.17,207.05 205.17,207.05 C205.17,207.05 205.34,206.81 205.34,206.81 C205.34,206.81 205.52,206.59 205.52,206.59 C205.52,206.59 205.73,206.39 205.73,206.39 C205.73,206.39 205.96,206.22 205.96,206.22 C205.96,206.22 206.21,206.06 206.21,206.06 C206.21,206.06 206.47,205.94 206.47,205.94 C206.47,205.94 206.74,205.83 206.74,205.83 C206.74,205.83 207.02,205.76 207.02,205.76 C207.02,205.76 207.3,205.71 207.3,205.71 C207.3,205.71 207.59,205.7 207.59,205.7 C207.59,205.7 207.88,205.71 207.88,205.71 C207.88,205.71 208.17,205.76 208.17,205.76 C208.17,205.76 208.45,205.82 208.45,205.82 C208.45,205.82 208.73,205.89 208.73,205.89 C208.73,205.89 209.01,205.96 209.01,205.96 C209.01,205.96 209.29,206.03 209.29,206.03 C209.29,206.03 209.57,206.1 209.57,206.1 C209.57,206.1 209.85,206.17 209.85,206.17 C209.85,206.17 210.14,206.24 210.14,206.24 C210.14,206.24 210.42,206.31 210.42,206.31 C210.42,206.31 210.7,206.38 210.7,206.38 C210.7,206.38 210.98,206.44 210.98,206.44 C210.98,206.44 211.27,206.46 211.27,206.46 C211.27,206.46 211.56,206.46 211.56,206.46 C211.56,206.46 211.85,206.43 211.85,206.43 C211.85,206.43 212.13,206.36 212.13,206.36 C212.13,206.36 212.41,206.27 212.41,206.27 C212.41,206.27 212.67,206.15 212.67,206.15 C212.67,206.15 212.92,206.01 212.92,206.01 C212.92,206.01 213.16,205.84 213.16,205.84 C213.16,205.84 213.38,205.65 213.38,205.65 C213.38,205.65 213.57,205.44 213.57,205.44 C213.57,205.44 213.75,205.21 213.75,205.21 C213.75,205.21 213.9,204.96 213.9,204.96 C213.9,204.96 214.05,204.71 214.05,204.71 C214.05,204.71 214.2,204.47 214.2,204.47 C214.2,204.47 214.35,204.22 214.35,204.22 C214.35,204.22 214.5,203.97 214.5,203.97 C214.5,203.97 214.65,203.72 214.65,203.72 C214.65,203.72 214.8,203.47 214.8,203.47 C214.8,203.47 214.94,203.22 214.94,203.22 C214.94,203.22 215.1,202.97 215.1,202.97 C215.1,202.97 215.26,202.73 215.26,202.73 C215.26,202.73 215.44,202.51 215.44,202.51 C215.44,202.51 215.65,202.31 215.65,202.31 C215.65,202.31 215.87,202.12 215.87,202.12 C215.87,202.12 216.11,201.96 216.11,201.96 C216.11,201.96 216.37,201.83 216.37,201.83 C216.37,201.83 216.64,201.73 216.64,201.73 C216.64,201.73 216.92,201.65 216.92,201.65 C216.92,201.65 217.21,201.6 217.21,201.6 C217.21,201.6 217.49,201.58 217.49,201.58 C217.49,201.58 217.78,201.58 217.78,201.58c " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="pathData" android:duration="283" android:startOffset="67" android:valueFrom="M217.78 201.58 C217.78,201.58 218.07,201.62 218.07,201.62 C218.07,201.62 218.35,201.69 218.35,201.69 C218.35,201.69 218.63,201.78 218.63,201.78 C218.63,201.78 218.89,201.9 218.89,201.9 C218.89,201.9 219.14,202.04 219.14,202.04 C219.14,202.04 219.38,202.21 219.38,202.21 C219.38,202.21 219.59,202.41 219.59,202.41 C219.59,202.41 219.78,202.62 219.78,202.62 C219.78,202.62 219.95,202.86 219.95,202.86 C219.95,202.86 220.11,203.1 220.11,203.1 C220.11,203.1 220.26,203.35 220.26,203.35 C220.26,203.35 220.41,203.6 220.41,203.6 C220.41,203.6 220.55,203.85 220.55,203.85 C220.55,203.85 220.7,204.1 220.7,204.1 C220.7,204.1 220.85,204.35 220.85,204.35 C220.85,204.35 221,204.59 221,204.59 C221,204.59 221.15,204.84 221.15,204.84 C221.15,204.84 221.3,205.09 221.3,205.09 C221.3,205.09 221.46,205.33 221.46,205.33 C221.46,205.33 221.65,205.55 221.65,205.55 C221.65,205.55 221.86,205.75 221.86,205.75 C221.86,205.75 222.09,205.93 222.09,205.93 C222.09,205.93 222.33,206.09 222.33,206.09 C222.33,206.09 222.59,206.22 222.59,206.22 C222.59,206.22 222.86,206.32 222.86,206.32 C222.86,206.32 223.14,206.4 223.14,206.4 C223.14,206.4 223.42,206.45 223.42,206.45 C223.42,206.45 223.71,206.46 223.71,206.46 C223.71,206.46 224,206.45 224,206.45 C224,206.45 224.29,206.41 224.29,206.41 C224.29,206.41 224.57,206.35 224.57,206.35 C224.57,206.35 224.85,206.28 224.85,206.28 C224.85,206.28 225.13,206.21 225.13,206.21 C225.13,206.21 225.41,206.14 225.41,206.14 C225.41,206.14 225.7,206.07 225.7,206.07 C225.7,206.07 225.98,206 225.98,206 C225.98,206 226.26,205.93 226.26,205.93 C226.26,205.93 226.54,205.86 226.54,205.86 C226.54,205.86 226.82,205.78 226.82,205.78 C226.82,205.78 227.1,205.73 227.1,205.73 C227.1,205.73 227.39,205.71 227.39,205.71 C227.39,205.71 227.68,205.7 227.68,205.7 C227.68,205.7 227.97,205.73 227.97,205.73 C227.97,205.73 228.25,205.79 228.25,205.79 C228.25,205.79 228.53,205.88 228.53,205.88 C228.53,205.88 228.79,206 228.79,206 C228.79,206 229.04,206.14 229.04,206.14 C229.04,206.14 229.28,206.31 229.28,206.31 C229.28,206.31 229.5,206.49 229.5,206.49 C229.5,206.49 229.7,206.7 229.7,206.7 C229.7,206.7 229.88,206.93 229.88,206.93 C229.88,206.93 230.03,207.18 230.03,207.18 C230.03,207.18 230.16,207.44 230.16,207.44 C230.16,207.44 230.26,207.71 230.26,207.71 C230.26,207.71 230.34,207.99 230.34,207.99 C230.34,207.99 230.38,208.27 230.38,208.27 C230.38,208.27 230.39,208.56 230.39,208.56 C230.39,208.56 230.38,208.85 230.38,208.85 C230.38,208.85 230.33,209.14 230.33,209.14 C230.33,209.14 230.27,209.42 230.27,209.42 C230.27,209.42 230.2,209.7 230.2,209.7 C230.2,209.7 230.13,209.98 230.13,209.98 C230.13,209.98 230.06,210.26 230.06,210.26 C230.06,210.26 229.99,210.55 229.99,210.55 C229.99,210.55 229.92,210.83 229.92,210.83 C229.92,210.83 229.85,211.11 229.85,211.11 C229.85,211.11 229.78,211.39 229.78,211.39 C229.78,211.39 229.71,211.67 229.71,211.67 C229.71,211.67 229.66,211.95 229.66,211.95 C229.66,211.95 229.63,212.24 229.63,212.24 C229.63,212.24 229.64,212.53 229.64,212.53 C229.64,212.53 229.67,212.82 229.67,212.82 C229.67,212.82 229.73,213.1 229.73,213.1 C229.73,213.1 229.82,213.38 229.82,213.38 C229.82,213.38 229.94,213.64 229.94,213.64 C229.94,213.64 230.08,213.89 230.08,213.89 C230.08,213.89 230.25,214.13 230.25,214.13 C230.25,214.13 230.44,214.35 230.44,214.35 C230.44,214.35 230.66,214.54 230.66,214.54 C230.66,214.54 230.89,214.72 230.89,214.72 C230.89,214.72 231.13,214.87 231.13,214.87 C231.13,214.87 231.38,215.02 231.38,215.02 C231.38,215.02 231.63,215.17 231.63,215.17 C231.63,215.17 231.88,215.32 231.88,215.32 C231.88,215.32 232.13,215.47 232.13,215.47 C232.13,215.47 232.38,215.62 232.38,215.62 C232.38,215.62 232.62,215.77 232.62,215.77 C232.62,215.77 232.87,215.91 232.87,215.91 C232.87,215.91 233.12,216.06 233.12,216.06 C233.12,216.06 233.36,216.23 233.36,216.23 C233.36,216.23 233.58,216.41 233.58,216.41 C233.58,216.41 233.79,216.62 233.79,216.62 C233.79,216.62 233.97,216.84 233.97,216.84 C233.97,216.84 234.13,217.08 234.13,217.08 C234.13,217.08 234.26,217.34 234.26,217.34 C234.26,217.34 234.36,217.61 234.36,217.61 C234.36,217.61 234.44,217.89 234.44,217.89 C234.44,217.89 234.49,218.17 234.49,218.17 C234.49,218.17 234.52,218.46 234.52,218.46 C234.52,218.46 234.51,218.75 234.51,218.75 C234.51,218.75 234.47,219.04 234.47,219.04 C234.47,219.04 234.41,219.32 234.41,219.32 C234.41,219.32 234.31,219.59 234.31,219.59 C234.31,219.59 234.19,219.86 234.19,219.86 C234.19,219.86 234.05,220.11 234.05,220.11 C234.05,220.11 233.88,220.34 233.88,220.34 C233.88,220.34 233.68,220.56 233.68,220.56 C233.68,220.56 233.47,220.75 233.47,220.75 C233.47,220.75 233.23,220.92 233.23,220.92 C233.23,220.92 232.99,221.08 232.99,221.08 C232.99,221.08 232.74,221.22 232.74,221.22 C232.74,221.22 232.49,221.37 232.49,221.37 C232.49,221.37 232.25,221.52 232.25,221.52 C232.25,221.52 232,221.67 232,221.67 C232,221.67 231.75,221.82 231.75,221.82 C231.75,221.82 231.5,221.97 231.5,221.97 C231.5,221.97 231.25,222.12 231.25,222.12 C231.25,222.12 231,222.27 231,222.27 C231,222.27 230.76,222.43 230.76,222.43 C230.76,222.43 230.54,222.62 230.54,222.62 C230.54,222.62 230.34,222.83 230.34,222.83 C230.34,222.83 230.16,223.05 230.16,223.05 C230.16,223.05 230.01,223.3 230.01,223.3 C230.01,223.3 229.87,223.56 229.87,223.56 C229.87,223.56 229.77,223.83 229.77,223.83 C229.77,223.83 229.7,224.11 229.7,224.11 C229.7,224.11 229.65,224.39 229.65,224.39 C229.65,224.39 229.63,224.68 229.63,224.68 C229.63,224.68 229.64,224.97 229.64,224.97 C229.64,224.97 229.68,225.26 229.68,225.26 C229.68,225.26 229.75,225.54 229.75,225.54 C229.75,225.54 229.82,225.82 229.82,225.82 C229.82,225.82 229.89,226.1 229.89,226.1 C229.89,226.1 229.96,226.38 229.96,226.38 C229.96,226.38 230.03,226.66 230.03,226.66 C230.03,226.66 230.1,226.94 230.1,226.94 C230.1,226.94 230.17,227.22 230.17,227.22 C230.17,227.22 230.24,227.51 230.24,227.51 C230.24,227.51 230.31,227.79 230.31,227.79 C230.31,227.79 230.36,228.07 230.36,228.07 C230.36,228.07 230.39,228.36 230.39,228.36 C230.39,228.36 230.39,228.65 230.39,228.65 C230.39,228.65 230.36,228.94 230.36,228.94 C230.36,228.94 230.3,229.22 230.3,229.22 C230.3,229.22 230.21,229.5 230.21,229.5 C230.21,229.5 230.1,229.76 230.1,229.76 C230.1,229.76 229.95,230.01 229.95,230.01 C229.95,230.01 229.79,230.25 229.79,230.25 C229.79,230.25 229.6,230.47 229.6,230.47 C229.6,230.47 229.39,230.67 229.39,230.67 C229.39,230.67 229.16,230.85 229.16,230.85 C229.16,230.85 228.91,231 228.91,231 C228.91,231 228.66,231.13 228.66,231.13 C228.66,231.13 228.38,231.23 228.38,231.23 C228.38,231.23 228.11,231.3 228.11,231.3 C228.11,231.3 227.82,231.35 227.82,231.35 C227.82,231.35 227.53,231.36 227.53,231.36 C227.53,231.36 227.24,231.35 227.24,231.35 C227.24,231.35 226.96,231.3 226.96,231.3 C226.96,231.3 226.67,231.24 226.67,231.24 C226.67,231.24 226.39,231.17 226.39,231.17 C226.39,231.17 226.11,231.1 226.11,231.1 C226.11,231.1 225.83,231.03 225.83,231.03 C225.83,231.03 225.55,230.96 225.55,230.96 C225.55,230.96 225.27,230.89 225.27,230.89 C225.27,230.89 224.99,230.82 224.99,230.82 C224.99,230.82 224.71,230.75 224.71,230.75 C224.71,230.75 224.42,230.68 224.42,230.68 C224.42,230.68 224.14,230.62 224.14,230.62 C224.14,230.62 223.85,230.6 223.85,230.6 C223.85,230.6 223.56,230.6 223.56,230.6 C223.56,230.6 223.27,230.64 223.27,230.64 C223.27,230.64 222.99,230.7 222.99,230.7 C222.99,230.7 222.72,230.79 222.72,230.79 C222.72,230.79 222.45,230.91 222.45,230.91 C222.45,230.91 222.2,231.05 222.2,231.05 C222.2,231.05 221.96,231.22 221.96,231.22 C221.96,231.22 221.75,231.41 221.75,231.41 C221.75,231.41 221.55,231.62 221.55,231.62 C221.55,231.62 221.38,231.85 221.38,231.85 C221.38,231.85 221.22,232.1 221.22,232.1 C221.22,232.1 221.07,232.35 221.07,232.35 C221.07,232.35 220.92,232.6 220.92,232.6 C220.92,232.6 220.77,232.85 220.77,232.85 C220.77,232.85 220.63,233.09 220.63,233.09 C220.63,233.09 220.48,233.34 220.48,233.34 C220.48,233.34 220.33,233.59 220.33,233.59 C220.33,233.59 220.18,233.84 220.18,233.84 C220.18,233.84 220.03,234.09 220.03,234.09 C220.03,234.09 219.87,234.33 219.87,234.33 C219.87,234.33 219.68,234.55 219.68,234.55 C219.68,234.55 219.48,234.75 219.48,234.75 C219.48,234.75 219.25,234.94 219.25,234.94 C219.25,234.94 219.01,235.1 219.01,235.1 C219.01,235.1 218.75,235.23 218.75,235.23 C218.75,235.23 218.48,235.33 218.48,235.33 C218.48,235.33 218.21,235.41 218.21,235.41 C218.21,235.41 217.92,235.46 217.92,235.46 C217.92,235.46 217.63,235.48 217.63,235.48 C217.63,235.48 217.34,235.48 217.34,235.48 C217.34,235.48 217.06,235.44 217.06,235.44 C217.06,235.44 216.77,235.37 216.77,235.37 C216.77,235.37 216.5,235.28 216.5,235.28 C216.5,235.28 216.24,235.16 216.24,235.16 C216.24,235.16 215.99,235.02 215.99,235.02 C215.99,235.02 215.75,234.85 215.75,234.85 C215.75,234.85 215.54,234.65 215.54,234.65 C215.54,234.65 215.34,234.44 215.34,234.44 C215.34,234.44 215.17,234.2 215.17,234.2 C215.17,234.2 215.02,233.96 215.02,233.96 C215.02,233.96 214.87,233.71 214.87,233.71 C214.87,233.71 214.72,233.46 214.72,233.46 C214.72,233.46 214.57,233.21 214.57,233.21 C214.57,233.21 214.42,232.96 214.42,232.96 C214.42,232.96 214.27,232.72 214.27,232.72 C214.27,232.72 214.12,232.47 214.12,232.47 C214.12,232.47 213.98,232.22 213.98,232.22 C213.98,232.22 213.83,231.97 213.83,231.97 C213.83,231.97 213.66,231.73 213.66,231.73 C213.66,231.73 213.48,231.51 213.48,231.51 C213.48,231.51 213.27,231.31 213.27,231.31 C213.27,231.31 213.04,231.13 213.04,231.13 C213.04,231.13 212.8,230.97 212.8,230.97 C212.8,230.97 212.54,230.84 212.54,230.84 C212.54,230.84 212.27,230.74 212.27,230.74 C212.27,230.74 211.99,230.66 211.99,230.66 C211.99,230.66 211.7,230.62 211.7,230.62 C211.7,230.62 211.41,230.6 211.41,230.6 C211.41,230.6 211.12,230.61 211.12,230.61 C211.12,230.61 210.84,230.65 210.84,230.65 C210.84,230.65 210.56,230.71 210.56,230.71 C210.56,230.71 210.27,230.78 210.27,230.78 C210.27,230.78 209.99,230.85 209.99,230.85 C209.99,230.85 209.71,230.92 209.71,230.92 C209.71,230.92 209.43,230.99 209.43,230.99 C209.43,230.99 209.15,231.06 209.15,231.06 C209.15,231.06 208.87,231.14 208.87,231.14 C208.87,231.14 208.59,231.21 208.59,231.21 C208.59,231.21 208.31,231.28 208.31,231.28 C208.31,231.28 208.02,231.33 208.02,231.33 C208.02,231.33 207.73,231.36 207.73,231.36 C207.73,231.36 207.45,231.36 207.45,231.36 C207.45,231.36 207.16,231.33 207.16,231.33 C207.16,231.33 206.87,231.27 206.87,231.27 C206.87,231.27 206.6,231.18 206.6,231.18 C206.6,231.18 206.33,231.06 206.33,231.06 C206.33,231.06 206.08,230.92 206.08,230.92 C206.08,230.92 205.85,230.76 205.85,230.76 C205.85,230.76 205.62,230.57 205.62,230.57 C205.62,230.57 205.42,230.36 205.42,230.36 C205.42,230.36 205.25,230.13 205.25,230.13 C205.25,230.13 205.1,229.88 205.1,229.88 C205.1,229.88 204.97,229.62 204.97,229.62 C204.97,229.62 204.87,229.35 204.87,229.35 C204.87,229.35 204.79,229.07 204.79,229.07 C204.79,229.07 204.74,228.79 204.74,228.79 C204.74,228.79 204.73,228.5 204.73,228.5 C204.73,228.5 204.74,228.21 204.74,228.21 C204.74,228.21 204.79,227.92 204.79,227.92 C204.79,227.92 204.85,227.64 204.85,227.64 C204.85,227.64 204.92,227.36 204.92,227.36 C204.92,227.36 204.99,227.08 204.99,227.08 C204.99,227.08 205.06,226.8 205.06,226.8 C205.06,226.8 205.13,226.52 205.13,226.52 C205.13,226.52 205.21,226.24 205.21,226.24 C205.21,226.24 205.28,225.96 205.28,225.96 C205.28,225.96 205.35,225.68 205.35,225.68 C205.35,225.68 205.42,225.39 205.42,225.39 C205.42,225.39 205.47,225.11 205.47,225.11 C205.47,225.11 205.49,224.82 205.49,224.82 C205.49,224.82 205.49,224.53 205.49,224.53 C205.49,224.53 205.46,224.24 205.46,224.24 C205.46,224.24 205.39,223.96 205.39,223.96 C205.39,223.96 205.3,223.69 205.3,223.69 C205.3,223.69 205.19,223.42 205.19,223.42 C205.19,223.42 205.04,223.17 205.04,223.17 C205.04,223.17 204.87,222.93 204.87,222.93 C204.87,222.93 204.68,222.71 204.68,222.71 C204.68,222.71 204.47,222.52 204.47,222.52 C204.47,222.52 204.24,222.34 204.24,222.34 C204.24,222.34 203.99,222.19 203.99,222.19 C203.99,222.19 203.75,222.04 203.75,222.04 C203.75,222.04 203.5,221.89 203.5,221.89 C203.5,221.89 203.25,221.74 203.25,221.74 C203.25,221.74 203,221.59 203,221.59 C203,221.59 202.75,221.45 202.75,221.45 C202.75,221.45 202.5,221.3 202.5,221.3 C202.5,221.3 202.25,221.15 202.25,221.15 C202.25,221.15 202.01,221 202.01,221 C202.01,221 201.77,220.83 201.77,220.83 C201.77,220.83 201.54,220.65 201.54,220.65 C201.54,220.65 201.34,220.45 201.34,220.45 C201.34,220.45 201.16,220.22 201.16,220.22 C201.16,220.22 201,219.98 201,219.98 C201,219.98 200.87,219.72 200.87,219.72 C200.87,219.72 200.76,219.45 200.76,219.45 C200.76,219.45 200.68,219.18 200.68,219.18 C200.68,219.18 200.63,218.89 200.63,218.89 C200.63,218.89 200.61,218.6 200.61,218.6 C200.61,218.6 200.61,218.31 200.61,218.31 C200.61,218.31 200.65,218.02 200.65,218.02 C200.65,218.02 200.72,217.74 200.72,217.74 C200.72,217.74 200.81,217.47 200.81,217.47 C200.81,217.47 200.93,217.21 200.93,217.21 C200.93,217.21 201.07,216.96 201.07,216.96 C201.07,216.96 201.24,216.72 201.24,216.72 C201.24,216.72 201.44,216.51 201.44,216.51 C201.44,216.51 201.65,216.31 201.65,216.31 C201.65,216.31 201.89,216.14 201.89,216.14 C201.89,216.14 202.13,215.99 202.13,215.99 C202.13,215.99 202.38,215.84 202.38,215.84 C202.38,215.84 202.63,215.69 202.63,215.69 C202.63,215.69 202.88,215.54 202.88,215.54 C202.88,215.54 203.13,215.39 203.13,215.39 C203.13,215.39 203.37,215.24 203.37,215.24 C203.37,215.24 203.62,215.09 203.62,215.09 C203.62,215.09 203.87,214.94 203.87,214.94 C203.87,214.94 204.12,214.79 204.12,214.79 C204.12,214.79 204.36,214.63 204.36,214.63 C204.36,214.63 204.58,214.45 204.58,214.45 C204.58,214.45 204.78,214.24 204.78,214.24 C204.78,214.24 204.96,214.01 204.96,214.01 C204.96,214.01 205.12,213.77 205.12,213.77 C205.12,213.77 205.25,213.51 205.25,213.51 C205.25,213.51 205.35,213.24 205.35,213.24 C205.35,213.24 205.43,212.96 205.43,212.96 C205.43,212.96 205.48,212.67 205.48,212.67 C205.48,212.67 205.5,212.38 205.5,212.38 C205.5,212.38 205.49,212.09 205.49,212.09 C205.49,212.09 205.44,211.81 205.44,211.81 C205.44,211.81 205.38,211.52 205.38,211.52 C205.38,211.52 205.31,211.24 205.31,211.24 C205.31,211.24 205.24,210.96 205.24,210.96 C205.24,210.96 205.17,210.68 205.17,210.68 C205.17,210.68 205.1,210.4 205.1,210.4 C205.1,210.4 205.03,210.12 205.03,210.12 C205.03,210.12 204.96,209.84 204.96,209.84 C204.96,209.84 204.89,209.56 204.89,209.56 C204.89,209.56 204.82,209.28 204.82,209.28 C204.82,209.28 204.76,208.99 204.76,208.99 C204.76,208.99 204.74,208.7 204.74,208.7 C204.74,208.7 204.74,208.42 204.74,208.42 C204.74,208.42 204.76,208.13 204.76,208.13 C204.76,208.13 204.82,207.84 204.82,207.84 C204.82,207.84 204.91,207.57 204.91,207.57 C204.91,207.57 205.03,207.3 205.03,207.3 C205.03,207.3 205.17,207.05 205.17,207.05 C205.17,207.05 205.34,206.81 205.34,206.81 C205.34,206.81 205.52,206.59 205.52,206.59 C205.52,206.59 205.73,206.39 205.73,206.39 C205.73,206.39 205.96,206.22 205.96,206.22 C205.96,206.22 206.21,206.06 206.21,206.06 C206.21,206.06 206.47,205.94 206.47,205.94 C206.47,205.94 206.74,205.83 206.74,205.83 C206.74,205.83 207.02,205.76 207.02,205.76 C207.02,205.76 207.3,205.71 207.3,205.71 C207.3,205.71 207.59,205.7 207.59,205.7 C207.59,205.7 207.88,205.71 207.88,205.71 C207.88,205.71 208.17,205.76 208.17,205.76 C208.17,205.76 208.45,205.82 208.45,205.82 C208.45,205.82 208.73,205.89 208.73,205.89 C208.73,205.89 209.01,205.96 209.01,205.96 C209.01,205.96 209.29,206.03 209.29,206.03 C209.29,206.03 209.57,206.1 209.57,206.1 C209.57,206.1 209.85,206.17 209.85,206.17 C209.85,206.17 210.14,206.24 210.14,206.24 C210.14,206.24 210.42,206.31 210.42,206.31 C210.42,206.31 210.7,206.38 210.7,206.38 C210.7,206.38 210.98,206.44 210.98,206.44 C210.98,206.44 211.27,206.46 211.27,206.46 C211.27,206.46 211.56,206.46 211.56,206.46 C211.56,206.46 211.85,206.43 211.85,206.43 C211.85,206.43 212.13,206.36 212.13,206.36 C212.13,206.36 212.41,206.27 212.41,206.27 C212.41,206.27 212.67,206.15 212.67,206.15 C212.67,206.15 212.92,206.01 212.92,206.01 C212.92,206.01 213.16,205.84 213.16,205.84 C213.16,205.84 213.38,205.65 213.38,205.65 C213.38,205.65 213.57,205.44 213.57,205.44 C213.57,205.44 213.75,205.21 213.75,205.21 C213.75,205.21 213.9,204.96 213.9,204.96 C213.9,204.96 214.05,204.71 214.05,204.71 C214.05,204.71 214.2,204.47 214.2,204.47 C214.2,204.47 214.35,204.22 214.35,204.22 C214.35,204.22 214.5,203.97 214.5,203.97 C214.5,203.97 214.65,203.72 214.65,203.72 C214.65,203.72 214.8,203.47 214.8,203.47 C214.8,203.47 214.94,203.22 214.94,203.22 C214.94,203.22 215.1,202.97 215.1,202.97 C215.1,202.97 215.26,202.73 215.26,202.73 C215.26,202.73 215.44,202.51 215.44,202.51 C215.44,202.51 215.65,202.31 215.65,202.31 C215.65,202.31 215.87,202.12 215.87,202.12 C215.87,202.12 216.11,201.96 216.11,201.96 C216.11,201.96 216.37,201.83 216.37,201.83 C216.37,201.83 216.64,201.73 216.64,201.73 C216.64,201.73 216.92,201.65 216.92,201.65 C216.92,201.65 217.21,201.6 217.21,201.6 C217.21,201.6 217.49,201.58 217.49,201.58 C217.49,201.58 217.78,201.58 217.78,201.58c " android:valueTo="M217.68 210.56 C217.68,210.56 217.81,210.57 217.81,210.57 C217.81,210.57 217.93,210.57 217.93,210.57 C217.93,210.57 218.06,210.58 218.06,210.58 C218.06,210.58 218.18,210.59 218.18,210.59 C218.18,210.59 218.31,210.59 218.31,210.59 C218.31,210.59 218.43,210.61 218.43,210.61 C218.43,210.61 218.56,210.63 218.56,210.63 C218.56,210.63 218.68,210.64 218.68,210.64 C218.68,210.64 218.81,210.66 218.81,210.66 C218.81,210.66 218.93,210.68 218.93,210.68 C218.93,210.68 219.05,210.7 219.05,210.7 C219.05,210.7 219.18,210.72 219.18,210.72 C219.18,210.72 219.3,210.75 219.3,210.75 C219.3,210.75 219.42,210.78 219.42,210.78 C219.42,210.78 219.54,210.81 219.54,210.81 C219.54,210.81 219.66,210.84 219.66,210.84 C219.66,210.84 219.79,210.87 219.79,210.87 C219.79,210.87 219.91,210.91 219.91,210.91 C219.91,210.91 220.03,210.95 220.03,210.95 C220.03,210.95 220.14,210.99 220.14,210.99 C220.14,210.99 220.26,211.04 220.26,211.04 C220.26,211.04 220.38,211.08 220.38,211.08 C220.38,211.08 220.5,211.12 220.5,211.12 C220.5,211.12 220.62,211.17 220.62,211.17 C220.62,211.17 220.73,211.22 220.73,211.22 C220.73,211.22 220.84,211.27 220.84,211.27 C220.84,211.27 220.96,211.32 220.96,211.32 C220.96,211.32 221.07,211.38 221.07,211.38 C221.07,211.38 221.19,211.43 221.19,211.43 C221.19,211.43 221.3,211.49 221.3,211.49 C221.3,211.49 221.41,211.55 221.41,211.55 C221.41,211.55 221.51,211.61 221.51,211.61 C221.51,211.61 221.62,211.68 221.62,211.68 C221.62,211.68 221.73,211.74 221.73,211.74 C221.73,211.74 221.84,211.8 221.84,211.8 C221.84,211.8 221.94,211.87 221.94,211.87 C221.94,211.87 222.05,211.94 222.05,211.94 C222.05,211.94 222.15,212.02 222.15,212.02 C222.15,212.02 222.25,212.09 222.25,212.09 C222.25,212.09 222.35,212.16 222.35,212.16 C222.35,212.16 222.46,212.23 222.46,212.23 C222.46,212.23 222.55,212.31 222.55,212.31 C222.55,212.31 222.65,212.4 222.65,212.4 C222.65,212.4 222.74,212.48 222.74,212.48 C222.74,212.48 222.84,212.56 222.84,212.56 C222.84,212.56 222.93,212.64 222.93,212.64 C222.93,212.64 223.03,212.72 223.03,212.72 C223.03,212.72 223.12,212.81 223.12,212.81 C223.12,212.81 223.21,212.9 223.21,212.9 C223.21,212.9 223.29,212.99 223.29,212.99 C223.29,212.99 223.38,213.08 223.38,213.08 C223.38,213.08 223.47,213.17 223.47,213.17 C223.47,213.17 223.55,213.26 223.55,213.26 C223.55,213.26 223.63,213.36 223.63,213.36 C223.63,213.36 223.71,213.46 223.71,213.46 C223.71,213.46 223.79,213.56 223.79,213.56 C223.79,213.56 223.87,213.66 223.87,213.66 C223.87,213.66 223.95,213.75 223.95,213.75 C223.95,213.75 224.03,213.85 224.03,213.85 C224.03,213.85 224.09,213.96 224.09,213.96 C224.09,213.96 224.16,214.06 224.16,214.06 C224.16,214.06 224.23,214.17 224.23,214.17 C224.23,214.17 224.3,214.27 224.3,214.27 C224.3,214.27 224.37,214.38 224.37,214.38 C224.37,214.38 224.44,214.48 224.44,214.48 C224.44,214.48 224.5,214.59 224.5,214.59 C224.5,214.59 224.56,214.7 224.56,214.7 C224.56,214.7 224.62,214.81 224.62,214.81 C224.62,214.81 224.68,214.93 224.68,214.93 C224.68,214.93 224.74,215.04 224.74,215.04 C224.74,215.04 224.79,215.15 224.79,215.15 C224.79,215.15 224.84,215.26 224.84,215.26 C224.84,215.26 224.89,215.38 224.89,215.38 C224.89,215.38 224.94,215.5 224.94,215.5 C224.94,215.5 224.99,215.61 224.99,215.61 C224.99,215.61 225.04,215.73 225.04,215.73 C225.04,215.73 225.08,215.84 225.08,215.84 C225.08,215.84 225.12,215.96 225.12,215.96 C225.12,215.96 225.16,216.08 225.16,216.08 C225.16,216.08 225.19,216.2 225.19,216.2 C225.19,216.2 225.23,216.32 225.23,216.32 C225.23,216.32 225.27,216.44 225.27,216.44 C225.27,216.44 225.3,216.56 225.3,216.56 C225.3,216.56 225.33,216.69 225.33,216.69 C225.33,216.69 225.35,216.81 225.35,216.81 C225.35,216.81 225.38,216.93 225.38,216.93 C225.38,216.93 225.41,217.06 225.41,217.06 C225.41,217.06 225.43,217.18 225.43,217.18 C225.43,217.18 225.46,217.3 225.46,217.3 C225.46,217.3 225.47,217.43 225.47,217.43 C225.47,217.43 225.49,217.55 225.49,217.55 C225.49,217.55 225.5,217.68 225.5,217.68 C225.5,217.68 225.52,217.8 225.52,217.8 C225.52,217.8 225.52,217.93 225.52,217.93 C225.52,217.93 225.53,218.05 225.53,218.05 C225.53,218.05 225.54,218.18 225.54,218.18 C225.54,218.18 225.54,218.3 225.54,218.3 C225.54,218.3 225.55,218.43 225.55,218.43 C225.55,218.43 225.55,218.55 225.55,218.55 C225.55,218.55 225.55,218.68 225.55,218.68 C225.55,218.68 225.54,218.8 225.54,218.8 C225.54,218.8 225.54,218.93 225.54,218.93 C225.54,218.93 225.53,219.05 225.53,219.05 C225.53,219.05 225.52,219.18 225.52,219.18 C225.52,219.18 225.52,219.31 225.52,219.31 C225.52,219.31 225.5,219.43 225.5,219.43 C225.5,219.43 225.48,219.55 225.48,219.55 C225.48,219.55 225.47,219.68 225.47,219.68 C225.47,219.68 225.45,219.8 225.45,219.8 C225.45,219.8 225.43,219.93 225.43,219.93 C225.43,219.93 225.41,220.05 225.41,220.05 C225.41,220.05 225.39,220.17 225.39,220.17 C225.39,220.17 225.36,220.3 225.36,220.3 C225.36,220.3 225.33,220.42 225.33,220.42 C225.33,220.42 225.3,220.54 225.3,220.54 C225.3,220.54 225.27,220.66 225.27,220.66 C225.27,220.66 225.24,220.78 225.24,220.78 C225.24,220.78 225.2,220.9 225.2,220.9 C225.2,220.9 225.16,221.02 225.16,221.02 C225.16,221.02 225.12,221.14 225.12,221.14 C225.12,221.14 225.08,221.26 225.08,221.26 C225.08,221.26 225.03,221.38 225.03,221.38 C225.03,221.38 224.99,221.5 224.99,221.5 C224.99,221.5 224.95,221.61 224.95,221.61 C224.95,221.61 224.89,221.73 224.89,221.73 C224.89,221.73 224.84,221.84 224.84,221.84 C224.84,221.84 224.79,221.96 224.79,221.96 C224.79,221.96 224.73,222.07 224.73,222.07 C224.73,222.07 224.68,222.18 224.68,222.18 C224.68,222.18 224.62,222.29 224.62,222.29 C224.62,222.29 224.56,222.4 224.56,222.4 C224.56,222.4 224.5,222.51 224.5,222.51 C224.5,222.51 224.44,222.62 224.44,222.62 C224.44,222.62 224.37,222.73 224.37,222.73 C224.37,222.73 224.31,222.84 224.31,222.84 C224.31,222.84 224.24,222.94 224.24,222.94 C224.24,222.94 224.17,223.05 224.17,223.05 C224.17,223.05 224.09,223.15 224.09,223.15 C224.09,223.15 224.02,223.25 224.02,223.25 C224.02,223.25 223.95,223.35 223.95,223.35 C223.95,223.35 223.88,223.45 223.88,223.45 C223.88,223.45 223.8,223.55 223.8,223.55 C223.8,223.55 223.71,223.65 223.71,223.65 C223.71,223.65 223.63,223.74 223.63,223.74 C223.63,223.74 223.55,223.84 223.55,223.84 C223.55,223.84 223.47,223.93 223.47,223.93 C223.47,223.93 223.39,224.03 223.39,224.03 C223.39,224.03 223.3,224.12 223.3,224.12 C223.3,224.12 223.21,224.2 223.21,224.2 C223.21,224.2 223.12,224.29 223.12,224.29 C223.12,224.29 223.03,224.38 223.03,224.38 C223.03,224.38 222.94,224.46 222.94,224.46 C222.94,224.46 222.85,224.55 222.85,224.55 C222.85,224.55 222.75,224.63 222.75,224.63 C222.75,224.63 222.65,224.71 222.65,224.71 C222.65,224.71 222.55,224.79 222.55,224.79 C222.55,224.79 222.46,224.87 222.46,224.87 C222.46,224.87 222.36,224.95 222.36,224.95 C222.36,224.95 222.26,225.02 222.26,225.02 C222.26,225.02 222.15,225.09 222.15,225.09 C222.15,225.09 222.05,225.16 222.05,225.16 C222.05,225.16 221.94,225.23 221.94,225.23 C221.94,225.23 221.84,225.3 221.84,225.3 C221.84,225.3 221.74,225.37 221.74,225.37 C221.74,225.37 221.63,225.44 221.63,225.44 C221.63,225.44 221.52,225.5 221.52,225.5 C221.52,225.5 221.41,225.56 221.41,225.56 C221.41,225.56 221.3,225.62 221.3,225.62 C221.3,225.62 221.19,225.68 221.19,225.68 C221.19,225.68 221.08,225.73 221.08,225.73 C221.08,225.73 220.96,225.79 220.96,225.79 C220.96,225.79 220.85,225.84 220.85,225.84 C220.85,225.84 220.73,225.89 220.73,225.89 C220.73,225.89 220.62,225.94 220.62,225.94 C220.62,225.94 220.5,225.99 220.5,225.99 C220.5,225.99 220.38,226.03 220.38,226.03 C220.38,226.03 220.27,226.08 220.27,226.08 C220.27,226.08 220.15,226.12 220.15,226.12 C220.15,226.12 220.03,226.15 220.03,226.15 C220.03,226.15 219.91,226.19 219.91,226.19 C219.91,226.19 219.79,226.23 219.79,226.23 C219.79,226.23 219.67,226.27 219.67,226.27 C219.67,226.27 219.55,226.3 219.55,226.3 C219.55,226.3 219.42,226.33 219.42,226.33 C219.42,226.33 219.3,226.35 219.3,226.35 C219.3,226.35 219.18,226.38 219.18,226.38 C219.18,226.38 219.06,226.4 219.06,226.4 C219.06,226.4 218.93,226.43 218.93,226.43 C218.93,226.43 218.81,226.45 218.81,226.45 C218.81,226.45 218.68,226.47 218.68,226.47 C218.68,226.47 218.56,226.49 218.56,226.49 C218.56,226.49 218.44,226.5 218.44,226.5 C218.44,226.5 218.31,226.52 218.31,226.52 C218.31,226.52 218.19,226.52 218.19,226.52 C218.19,226.52 218.06,226.53 218.06,226.53 C218.06,226.53 217.93,226.53 217.93,226.53 C217.93,226.53 217.81,226.54 217.81,226.54 C217.81,226.54 217.68,226.55 217.68,226.55 C217.68,226.55 217.56,226.55 217.56,226.55 C217.56,226.55 217.43,226.55 217.43,226.55 C217.43,226.55 217.31,226.54 217.31,226.54 C217.31,226.54 217.18,226.53 217.18,226.53 C217.18,226.53 217.05,226.53 217.05,226.53 C217.05,226.53 216.93,226.52 216.93,226.52 C216.93,226.52 216.8,226.52 216.8,226.52 C216.8,226.52 216.68,226.5 216.68,226.5 C216.68,226.5 216.55,226.48 216.55,226.48 C216.55,226.48 216.43,226.46 216.43,226.46 C216.43,226.46 216.31,226.45 216.31,226.45 C216.31,226.45 216.18,226.43 216.18,226.43 C216.18,226.43 216.06,226.41 216.06,226.41 C216.06,226.41 215.93,226.38 215.93,226.38 C215.93,226.38 215.81,226.35 215.81,226.35 C215.81,226.35 215.69,226.32 215.69,226.32 C215.69,226.32 215.57,226.29 215.57,226.29 C215.57,226.29 215.45,226.26 215.45,226.26 C215.45,226.26 215.32,226.23 215.32,226.23 C215.32,226.23 215.2,226.2 215.2,226.2 C215.2,226.2 215.09,226.16 215.09,226.16 C215.09,226.16 214.97,226.12 214.97,226.12 C214.97,226.12 214.85,226.07 214.85,226.07 C214.85,226.07 214.73,226.03 214.73,226.03 C214.73,226.03 214.61,225.99 214.61,225.99 C214.61,225.99 214.5,225.94 214.5,225.94 C214.5,225.94 214.38,225.89 214.38,225.89 C214.38,225.89 214.27,225.84 214.27,225.84 C214.27,225.84 214.15,225.79 214.15,225.79 C214.15,225.79 214.04,225.73 214.04,225.73 C214.04,225.73 213.93,225.68 213.93,225.68 C213.93,225.68 213.81,225.62 213.81,225.62 C213.81,225.62 213.71,225.56 213.71,225.56 C213.71,225.56 213.6,225.5 213.6,225.5 C213.6,225.5 213.49,225.43 213.49,225.43 C213.49,225.43 213.38,225.37 213.38,225.37 C213.38,225.37 213.27,225.31 213.27,225.31 C213.27,225.31 213.17,225.24 213.17,225.24 C213.17,225.24 213.06,225.16 213.06,225.16 C213.06,225.16 212.96,225.09 212.96,225.09 C212.96,225.09 212.86,225.02 212.86,225.02 C212.86,225.02 212.76,224.95 212.76,224.95 C212.76,224.95 212.65,224.87 212.65,224.87 C212.65,224.87 212.56,224.79 212.56,224.79 C212.56,224.79 212.46,224.71 212.46,224.71 C212.46,224.71 212.37,224.63 212.37,224.63 C212.37,224.63 212.27,224.55 212.27,224.55 C212.27,224.55 212.18,224.47 212.18,224.47 C212.18,224.47 212.08,224.38 212.08,224.38 C212.08,224.38 211.99,224.3 211.99,224.3 C211.99,224.3 211.91,224.2 211.91,224.2 C211.91,224.2 211.82,224.11 211.82,224.11 C211.82,224.11 211.73,224.02 211.73,224.02 C211.73,224.02 211.64,223.93 211.64,223.93 C211.64,223.93 211.56,223.84 211.56,223.84 C211.56,223.84 211.48,223.75 211.48,223.75 C211.48,223.75 211.4,223.65 211.4,223.65 C211.4,223.65 211.32,223.55 211.32,223.55 C211.32,223.55 211.24,223.45 211.24,223.45 C211.24,223.45 211.16,223.35 211.16,223.35 C211.16,223.35 211.09,223.26 211.09,223.26 C211.09,223.26 211.02,223.15 211.02,223.15 C211.02,223.15 210.95,223.05 210.95,223.05 C210.95,223.05 210.88,222.94 210.88,222.94 C210.88,222.94 210.81,222.84 210.81,222.84 C210.81,222.84 210.74,222.73 210.74,222.73 C210.74,222.73 210.67,222.63 210.67,222.63 C210.67,222.63 210.61,222.52 210.61,222.52 C210.61,222.52 210.55,222.4 210.55,222.4 C210.55,222.4 210.49,222.29 210.49,222.29 C210.49,222.29 210.43,222.18 210.43,222.18 C210.43,222.18 210.38,222.07 210.38,222.07 C210.38,222.07 210.32,221.96 210.32,221.96 C210.32,221.96 210.27,221.84 210.27,221.84 C210.27,221.84 210.22,221.73 210.22,221.73 C210.22,221.73 210.17,221.61 210.17,221.61 C210.17,221.61 210.12,221.5 210.12,221.5 C210.12,221.5 210.08,221.38 210.08,221.38 C210.08,221.38 210.03,221.26 210.03,221.26 C210.03,221.26 209.99,221.14 209.99,221.14 C209.99,221.14 209.96,221.02 209.96,221.02 C209.96,221.02 209.92,220.9 209.92,220.9 C209.92,220.9 209.88,220.78 209.88,220.78 C209.88,220.78 209.84,220.67 209.84,220.67 C209.84,220.67 209.81,220.54 209.81,220.54 C209.81,220.54 209.78,220.42 209.78,220.42 C209.78,220.42 209.76,220.3 209.76,220.3 C209.76,220.3 209.73,220.18 209.73,220.18 C209.73,220.18 209.71,220.05 209.71,220.05 C209.71,220.05 209.68,219.93 209.68,219.93 C209.68,219.93 209.66,219.81 209.66,219.81 C209.66,219.81 209.64,219.68 209.64,219.68 C209.64,219.68 209.62,219.56 209.62,219.56 C209.62,219.56 209.61,219.43 209.61,219.43 C209.61,219.43 209.59,219.31 209.59,219.31 C209.59,219.31 209.59,219.18 209.59,219.18 C209.59,219.18 209.58,219.06 209.58,219.06 C209.58,219.06 209.58,218.93 209.58,218.93 C209.58,218.93 209.57,218.81 209.57,218.81 C209.57,218.81 209.56,218.68 209.56,218.68 C209.56,218.68 209.56,218.56 209.56,218.56 C209.56,218.56 209.56,218.43 209.56,218.43 C209.56,218.43 209.57,218.3 209.57,218.3 C209.57,218.3 209.58,218.18 209.58,218.18 C209.58,218.18 209.58,218.05 209.58,218.05 C209.58,218.05 209.59,217.93 209.59,217.93 C209.59,217.93 209.59,217.8 209.59,217.8 C209.59,217.8 209.61,217.68 209.61,217.68 C209.61,217.68 209.63,217.55 209.63,217.55 C209.63,217.55 209.65,217.43 209.65,217.43 C209.65,217.43 209.66,217.31 209.66,217.31 C209.66,217.31 209.68,217.18 209.68,217.18 C209.68,217.18 209.7,217.06 209.7,217.06 C209.7,217.06 209.73,216.93 209.73,216.93 C209.73,216.93 209.76,216.81 209.76,216.81 C209.76,216.81 209.79,216.69 209.79,216.69 C209.79,216.69 209.82,216.57 209.82,216.57 C209.82,216.57 209.85,216.45 209.85,216.45 C209.85,216.45 209.88,216.32 209.88,216.32 C209.88,216.32 209.91,216.2 209.91,216.2 C209.91,216.2 209.95,216.08 209.95,216.08 C209.95,216.08 210,215.97 210,215.97 C210,215.97 210.04,215.85 210.04,215.85 C210.04,215.85 210.08,215.73 210.08,215.73 C210.08,215.73 210.12,215.61 210.12,215.61 C210.12,215.61 210.17,215.49 210.17,215.49 C210.17,215.49 210.22,215.38 210.22,215.38 C210.22,215.38 210.27,215.27 210.27,215.27 C210.27,215.27 210.33,215.15 210.33,215.15 C210.33,215.15 210.38,215.04 210.38,215.04 C210.38,215.04 210.43,214.92 210.43,214.92 C210.43,214.92 210.49,214.81 210.49,214.81 C210.49,214.81 210.55,214.7 210.55,214.7 C210.55,214.7 210.61,214.6 210.61,214.6 C210.61,214.6 210.68,214.49 210.68,214.49 C210.68,214.49 210.74,214.38 210.74,214.38 C210.74,214.38 210.8,214.27 210.8,214.27 C210.8,214.27 210.87,214.17 210.87,214.17 C210.87,214.17 210.95,214.06 210.95,214.06 C210.95,214.06 211.02,213.96 211.02,213.96 C211.02,213.96 211.09,213.86 211.09,213.86 C211.09,213.86 211.16,213.76 211.16,213.76 C211.16,213.76 211.24,213.65 211.24,213.65 C211.24,213.65 211.32,213.56 211.32,213.56 C211.32,213.56 211.4,213.46 211.4,213.46 C211.4,213.46 211.48,213.37 211.48,213.37 C211.48,213.37 211.56,213.27 211.56,213.27 C211.56,213.27 211.64,213.18 211.64,213.18 C211.64,213.18 211.73,213.08 211.73,213.08 C211.73,213.08 211.82,212.99 211.82,212.99 C211.82,212.99 211.91,212.9 211.91,212.9 C211.91,212.9 212,212.82 212,212.82 C212,212.82 212.09,212.73 212.09,212.73 C212.09,212.73 212.18,212.64 212.18,212.64 C212.18,212.64 212.27,212.56 212.27,212.56 C212.27,212.56 212.36,212.48 212.36,212.48 C212.36,212.48 212.46,212.4 212.46,212.4 C212.46,212.4 212.56,212.32 212.56,212.32 C212.56,212.32 212.66,212.24 212.66,212.24 C212.66,212.24 212.76,212.16 212.76,212.16 C212.76,212.16 212.85,212.08 212.85,212.08 C212.85,212.08 212.96,212.02 212.96,212.02 C212.96,212.02 213.06,211.95 213.06,211.95 C213.06,211.95 213.17,211.88 213.17,211.88 C213.17,211.88 213.27,211.81 213.27,211.81 C213.27,211.81 213.38,211.74 213.38,211.74 C213.38,211.74 213.48,211.67 213.48,211.67 C213.48,211.67 213.6,211.61 213.6,211.61 C213.6,211.61 213.71,211.55 213.71,211.55 C213.71,211.55 213.82,211.49 213.82,211.49 C213.82,211.49 213.93,211.43 213.93,211.43 C213.93,211.43 214.04,211.37 214.04,211.37 C214.04,211.37 214.15,211.32 214.15,211.32 C214.15,211.32 214.27,211.27 214.27,211.27 C214.27,211.27 214.38,211.22 214.38,211.22 C214.38,211.22 214.5,211.17 214.5,211.17 C214.5,211.17 214.61,211.12 214.61,211.12 C214.61,211.12 214.73,211.07 214.73,211.07 C214.73,211.07 214.85,211.03 214.85,211.03 C214.85,211.03 214.97,210.99 214.97,210.99 C214.97,210.99 215.09,210.95 215.09,210.95 C215.09,210.95 215.21,210.92 215.21,210.92 C215.21,210.92 215.33,210.88 215.33,210.88 C215.33,210.88 215.45,210.84 215.45,210.84 C215.45,210.84 215.57,210.81 215.57,210.81 C215.57,210.81 215.69,210.78 215.69,210.78 C215.69,210.78 215.81,210.76 215.81,210.76 C215.81,210.76 215.93,210.73 215.93,210.73 C215.93,210.73 216.06,210.7 216.06,210.7 C216.06,210.7 216.18,210.68 216.18,210.68 C216.18,210.68 216.3,210.65 216.3,210.65 C216.3,210.65 216.43,210.64 216.43,210.64 C216.43,210.64 216.55,210.62 216.55,210.62 C216.55,210.62 216.68,210.61 216.68,210.61 C216.68,210.61 216.8,210.59 216.8,210.59 C216.8,210.59 216.93,210.59 216.93,210.59 C216.93,210.59 217.05,210.58 217.05,210.58 C217.05,210.58 217.18,210.58 217.18,210.58 C217.18,210.58 217.3,210.57 217.3,210.57 C217.3,210.57 217.43,210.56 217.43,210.56 C217.43,210.56 217.56,210.56 217.56,210.56 C217.56,210.56 217.68,210.56 217.68,210.56c " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.8,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="time_group"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateX" android:duration="500" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"/></set></aapt:attr></target></animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/pin_dot_shape_5_avd.xml b/packages/SystemUI/res/drawable/pin_dot_shape_5_avd.xml new file mode 100644 index 000000000000..de2a7db4ab0a --- /dev/null +++ b/packages/SystemUI/res/drawable/pin_dot_shape_5_avd.xml @@ -0,0 +1 @@ +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"><aapt:attr name="android:drawable"><vector android:height="60dp" android:width="60dp" android:viewportHeight="60" android:viewportWidth="60"><group android:name="_R_G"><group android:name="_R_G_L_0_G" android:translateX="-187.543" android:translateY="-188.546"><path android:name="_R_G_L_0_G_D_0_P_0" android:fillColor="#ffffff" android:fillAlpha="0" android:fillType="nonZero" android:pathData=" M217.62 214.55 C217.62,214.55 217.68,214.55 217.68,214.55 C217.68,214.55 217.74,214.56 217.74,214.56 C217.74,214.56 217.81,214.56 217.81,214.56 C217.81,214.56 217.87,214.56 217.87,214.56 C217.87,214.56 217.93,214.57 217.93,214.57 C217.93,214.57 218,214.57 218,214.57 C218,214.57 218.06,214.58 218.06,214.58 C218.06,214.58 218.12,214.59 218.12,214.59 C218.12,214.59 218.18,214.6 218.18,214.6 C218.18,214.6 218.24,214.61 218.24,214.61 C218.24,214.61 218.31,214.62 218.31,214.62 C218.31,214.62 218.37,214.63 218.37,214.63 C218.37,214.63 218.43,214.65 218.43,214.65 C218.43,214.65 218.49,214.66 218.49,214.66 C218.49,214.66 218.55,214.68 218.55,214.68 C218.55,214.68 218.61,214.69 218.61,214.69 C218.61,214.69 218.67,214.71 218.67,214.71 C218.67,214.71 218.73,214.73 218.73,214.73 C218.73,214.73 218.79,214.75 218.79,214.75 C218.79,214.75 218.85,214.77 218.85,214.77 C218.85,214.77 218.91,214.79 218.91,214.79 C218.91,214.79 218.97,214.81 218.97,214.81 C218.97,214.81 219.03,214.83 219.03,214.83 C219.03,214.83 219.09,214.85 219.09,214.85 C219.09,214.85 219.15,214.88 219.15,214.88 C219.15,214.88 219.2,214.9 219.2,214.9 C219.2,214.9 219.26,214.93 219.26,214.93 C219.26,214.93 219.32,214.96 219.32,214.96 C219.32,214.96 219.37,214.98 219.37,214.98 C219.37,214.98 219.43,215.01 219.43,215.01 C219.43,215.01 219.48,215.05 219.48,215.05 C219.48,215.05 219.54,215.08 219.54,215.08 C219.54,215.08 219.59,215.11 219.59,215.11 C219.59,215.11 219.65,215.14 219.65,215.14 C219.65,215.14 219.7,215.17 219.7,215.17 C219.7,215.17 219.75,215.21 219.75,215.21 C219.75,215.21 219.81,215.24 219.81,215.24 C219.81,215.24 219.86,215.28 219.86,215.28 C219.86,215.28 219.91,215.32 219.91,215.32 C219.91,215.32 219.96,215.35 219.96,215.35 C219.96,215.35 220.01,215.39 220.01,215.39 C220.01,215.39 220.06,215.43 220.06,215.43 C220.06,215.43 220.11,215.47 220.11,215.47 C220.11,215.47 220.16,215.51 220.16,215.51 C220.16,215.51 220.2,215.55 220.2,215.55 C220.2,215.55 220.25,215.59 220.25,215.59 C220.25,215.59 220.3,215.63 220.3,215.63 C220.3,215.63 220.34,215.68 220.34,215.68 C220.34,215.68 220.39,215.72 220.39,215.72 C220.39,215.72 220.43,215.77 220.43,215.77 C220.43,215.77 220.47,215.81 220.47,215.81 C220.47,215.81 220.52,215.86 220.52,215.86 C220.52,215.86 220.56,215.9 220.56,215.9 C220.56,215.9 220.6,215.95 220.6,215.95 C220.6,215.95 220.64,216 220.64,216 C220.64,216 220.68,216.05 220.68,216.05 C220.68,216.05 220.72,216.1 220.72,216.1 C220.72,216.1 220.76,216.15 220.76,216.15 C220.76,216.15 220.8,216.2 220.8,216.2 C220.8,216.2 220.83,216.25 220.83,216.25 C220.83,216.25 220.87,216.3 220.87,216.3 C220.87,216.3 220.9,216.36 220.9,216.36 C220.9,216.36 220.94,216.41 220.94,216.41 C220.94,216.41 220.97,216.46 220.97,216.46 C220.97,216.46 221,216.51 221,216.51 C221,216.51 221.03,216.57 221.03,216.57 C221.03,216.57 221.06,216.63 221.06,216.63 C221.06,216.63 221.09,216.68 221.09,216.68 C221.09,216.68 221.12,216.74 221.12,216.74 C221.12,216.74 221.15,216.79 221.15,216.79 C221.15,216.79 221.18,216.85 221.18,216.85 C221.18,216.85 221.21,216.91 221.21,216.91 C221.21,216.91 221.23,216.96 221.23,216.96 C221.23,216.96 221.25,217.02 221.25,217.02 C221.25,217.02 221.28,217.08 221.28,217.08 C221.28,217.08 221.3,217.14 221.3,217.14 C221.3,217.14 221.33,217.2 221.33,217.2 C221.33,217.2 221.34,217.26 221.34,217.26 C221.34,217.26 221.36,217.32 221.36,217.32 C221.36,217.32 221.38,217.38 221.38,217.38 C221.38,217.38 221.4,217.44 221.4,217.44 C221.4,217.44 221.42,217.5 221.42,217.5 C221.42,217.5 221.44,217.56 221.44,217.56 C221.44,217.56 221.45,217.62 221.45,217.62 C221.45,217.62 221.46,217.68 221.46,217.68 C221.46,217.68 221.48,217.74 221.48,217.74 C221.48,217.74 221.49,217.8 221.49,217.8 C221.49,217.8 221.5,217.87 221.5,217.87 C221.5,217.87 221.51,217.93 221.51,217.93 C221.51,217.93 221.52,217.99 221.52,217.99 C221.52,217.99 221.53,218.05 221.53,218.05 C221.53,218.05 221.54,218.11 221.54,218.11 C221.54,218.11 221.54,218.18 221.54,218.18 C221.54,218.18 221.55,218.24 221.55,218.24 C221.55,218.24 221.55,218.3 221.55,218.3 C221.55,218.3 221.55,218.37 221.55,218.37 C221.55,218.37 221.56,218.43 221.56,218.43 C221.56,218.43 221.56,218.49 221.56,218.49 C221.56,218.49 221.56,218.55 221.56,218.55 C221.56,218.55 221.56,218.62 221.56,218.62 C221.56,218.62 221.56,218.68 221.56,218.68 C221.56,218.68 221.55,218.74 221.55,218.74 C221.55,218.74 221.55,218.81 221.55,218.81 C221.55,218.81 221.55,218.87 221.55,218.87 C221.55,218.87 221.54,218.93 221.54,218.93 C221.54,218.93 221.54,218.99 221.54,218.99 C221.54,218.99 221.53,219.06 221.53,219.06 C221.53,219.06 221.52,219.12 221.52,219.12 C221.52,219.12 221.51,219.18 221.51,219.18 C221.51,219.18 221.5,219.24 221.5,219.24 C221.5,219.24 221.49,219.3 221.49,219.3 C221.49,219.3 221.48,219.37 221.48,219.37 C221.48,219.37 221.46,219.43 221.46,219.43 C221.46,219.43 221.45,219.49 221.45,219.49 C221.45,219.49 221.43,219.55 221.43,219.55 C221.43,219.55 221.42,219.61 221.42,219.61 C221.42,219.61 221.4,219.67 221.4,219.67 C221.4,219.67 221.39,219.73 221.39,219.73 C221.39,219.73 221.37,219.79 221.37,219.79 C221.37,219.79 221.34,219.85 221.34,219.85 C221.34,219.85 221.32,219.91 221.32,219.91 C221.32,219.91 221.3,219.97 221.3,219.97 C221.3,219.97 221.28,220.03 221.28,220.03 C221.28,220.03 221.26,220.09 221.26,220.09 C221.26,220.09 221.23,220.14 221.23,220.14 C221.23,220.14 221.21,220.2 221.21,220.2 C221.21,220.2 221.18,220.26 221.18,220.26 C221.18,220.26 221.15,220.32 221.15,220.32 C221.15,220.32 221.13,220.37 221.13,220.37 C221.13,220.37 221.1,220.43 221.1,220.43 C221.1,220.43 221.07,220.48 221.07,220.48 C221.07,220.48 221.03,220.54 221.03,220.54 C221.03,220.54 221,220.59 221,220.59 C221,220.59 220.97,220.65 220.97,220.65 C220.97,220.65 220.94,220.7 220.94,220.7 C220.94,220.7 220.9,220.75 220.9,220.75 C220.9,220.75 220.87,220.8 220.87,220.8 C220.87,220.8 220.83,220.86 220.83,220.86 C220.83,220.86 220.8,220.91 220.8,220.91 C220.8,220.91 220.76,220.96 220.76,220.96 C220.76,220.96 220.72,221.01 220.72,221.01 C220.72,221.01 220.68,221.06 220.68,221.06 C220.68,221.06 220.64,221.11 220.64,221.11 C220.64,221.11 220.6,221.15 220.6,221.15 C220.6,221.15 220.56,221.2 220.56,221.2 C220.56,221.2 220.52,221.25 220.52,221.25 C220.52,221.25 220.48,221.3 220.48,221.3 C220.48,221.3 220.43,221.34 220.43,221.34 C220.43,221.34 220.39,221.38 220.39,221.38 C220.39,221.38 220.34,221.43 220.34,221.43 C220.34,221.43 220.3,221.47 220.3,221.47 C220.3,221.47 220.25,221.52 220.25,221.52 C220.25,221.52 220.21,221.56 220.21,221.56 C220.21,221.56 220.16,221.6 220.16,221.6 C220.16,221.6 220.11,221.64 220.11,221.64 C220.11,221.64 220.06,221.68 220.06,221.68 C220.06,221.68 220.01,221.72 220.01,221.72 C220.01,221.72 219.96,221.76 219.96,221.76 C219.96,221.76 219.91,221.8 219.91,221.8 C219.91,221.8 219.86,221.83 219.86,221.83 C219.86,221.83 219.81,221.87 219.81,221.87 C219.81,221.87 219.75,221.9 219.75,221.9 C219.75,221.9 219.7,221.93 219.7,221.93 C219.7,221.93 219.65,221.97 219.65,221.97 C219.65,221.97 219.6,222 219.6,222 C219.6,222 219.54,222.03 219.54,222.03 C219.54,222.03 219.49,222.06 219.49,222.06 C219.49,222.06 219.43,222.09 219.43,222.09 C219.43,222.09 219.37,222.12 219.37,222.12 C219.37,222.12 219.32,222.15 219.32,222.15 C219.32,222.15 219.26,222.18 219.26,222.18 C219.26,222.18 219.21,222.2 219.21,222.2 C219.21,222.2 219.15,222.23 219.15,222.23 C219.15,222.23 219.09,222.25 219.09,222.25 C219.09,222.25 219.03,222.28 219.03,222.28 C219.03,222.28 218.97,222.3 218.97,222.3 C218.97,222.3 218.91,222.32 218.91,222.32 C218.91,222.32 218.85,222.34 218.85,222.34 C218.85,222.34 218.79,222.36 218.79,222.36 C218.79,222.36 218.73,222.38 218.73,222.38 C218.73,222.38 218.67,222.4 218.67,222.4 C218.67,222.4 218.61,222.42 218.61,222.42 C218.61,222.42 218.55,222.44 218.55,222.44 C218.55,222.44 218.49,222.45 218.49,222.45 C218.49,222.45 218.43,222.46 218.43,222.46 C218.43,222.46 218.37,222.47 218.37,222.47 C218.37,222.47 218.31,222.49 218.31,222.49 C218.31,222.49 218.25,222.5 218.25,222.5 C218.25,222.5 218.18,222.51 218.18,222.51 C218.18,222.51 218.12,222.52 218.12,222.52 C218.12,222.52 218.06,222.53 218.06,222.53 C218.06,222.53 218,222.54 218,222.54 C218,222.54 217.93,222.54 217.93,222.54 C217.93,222.54 217.87,222.55 217.87,222.55 C217.87,222.55 217.81,222.55 217.81,222.55 C217.81,222.55 217.75,222.55 217.75,222.55 C217.75,222.55 217.68,222.56 217.68,222.56 C217.68,222.56 217.62,222.56 217.62,222.56 C217.62,222.56 217.56,222.56 217.56,222.56 C217.56,222.56 217.49,222.56 217.49,222.56 C217.49,222.56 217.43,222.56 217.43,222.56 C217.43,222.56 217.37,222.55 217.37,222.55 C217.37,222.55 217.3,222.55 217.3,222.55 C217.3,222.55 217.24,222.55 217.24,222.55 C217.24,222.55 217.18,222.54 217.18,222.54 C217.18,222.54 217.12,222.54 217.12,222.54 C217.12,222.54 217.05,222.53 217.05,222.53 C217.05,222.53 216.99,222.52 216.99,222.52 C216.99,222.52 216.93,222.51 216.93,222.51 C216.93,222.51 216.87,222.5 216.87,222.5 C216.87,222.5 216.81,222.49 216.81,222.49 C216.81,222.49 216.74,222.48 216.74,222.48 C216.74,222.48 216.68,222.46 216.68,222.46 C216.68,222.46 216.62,222.45 216.62,222.45 C216.62,222.45 216.56,222.43 216.56,222.43 C216.56,222.43 216.5,222.42 216.5,222.42 C216.5,222.42 216.44,222.4 216.44,222.4 C216.44,222.4 216.38,222.38 216.38,222.38 C216.38,222.38 216.32,222.36 216.32,222.36 C216.32,222.36 216.26,222.34 216.26,222.34 C216.26,222.34 216.2,222.32 216.2,222.32 C216.2,222.32 216.14,222.3 216.14,222.3 C216.14,222.3 216.08,222.28 216.08,222.28 C216.08,222.28 216.02,222.26 216.02,222.26 C216.02,222.26 215.97,222.23 215.97,222.23 C215.97,222.23 215.91,222.2 215.91,222.2 C215.91,222.2 215.85,222.18 215.85,222.18 C215.85,222.18 215.79,222.15 215.79,222.15 C215.79,222.15 215.74,222.12 215.74,222.12 C215.74,222.12 215.68,222.1 215.68,222.1 C215.68,222.1 215.63,222.06 215.63,222.06 C215.63,222.06 215.57,222.03 215.57,222.03 C215.57,222.03 215.52,222 215.52,222 C215.52,222 215.46,221.97 215.46,221.97 C215.46,221.97 215.41,221.94 215.41,221.94 C215.41,221.94 215.36,221.9 215.36,221.9 C215.36,221.9 215.31,221.87 215.31,221.87 C215.31,221.87 215.25,221.83 215.25,221.83 C215.25,221.83 215.2,221.79 215.2,221.79 C215.2,221.79 215.15,221.76 215.15,221.76 C215.15,221.76 215.1,221.72 215.1,221.72 C215.1,221.72 215.05,221.68 215.05,221.68 C215.05,221.68 215,221.64 215,221.64 C215,221.64 214.96,221.6 214.96,221.6 C214.96,221.6 214.91,221.56 214.91,221.56 C214.91,221.56 214.86,221.52 214.86,221.52 C214.86,221.52 214.81,221.48 214.81,221.48 C214.81,221.48 214.77,221.43 214.77,221.43 C214.77,221.43 214.73,221.39 214.73,221.39 C214.73,221.39 214.68,221.34 214.68,221.34 C214.68,221.34 214.64,221.3 214.64,221.3 C214.64,221.3 214.59,221.25 214.59,221.25 C214.59,221.25 214.55,221.2 214.55,221.2 C214.55,221.2 214.51,221.15 214.51,221.15 C214.51,221.15 214.47,221.11 214.47,221.11 C214.47,221.11 214.43,221.06 214.43,221.06 C214.43,221.06 214.39,221.01 214.39,221.01 C214.39,221.01 214.35,220.96 214.35,220.96 C214.35,220.96 214.31,220.91 214.31,220.91 C214.31,220.91 214.28,220.86 214.28,220.86 C214.28,220.86 214.25,220.81 214.25,220.81 C214.25,220.81 214.21,220.75 214.21,220.75 C214.21,220.75 214.18,220.7 214.18,220.7 C214.18,220.7 214.14,220.65 214.14,220.65 C214.14,220.65 214.11,220.59 214.11,220.59 C214.11,220.59 214.08,220.54 214.08,220.54 C214.08,220.54 214.05,220.48 214.05,220.48 C214.05,220.48 214.02,220.43 214.02,220.43 C214.02,220.43 213.99,220.37 213.99,220.37 C213.99,220.37 213.96,220.32 213.96,220.32 C213.96,220.32 213.93,220.26 213.93,220.26 C213.93,220.26 213.91,220.2 213.91,220.2 C213.91,220.2 213.88,220.14 213.88,220.14 C213.88,220.14 213.86,220.09 213.86,220.09 C213.86,220.09 213.83,220.03 213.83,220.03 C213.83,220.03 213.81,219.97 213.81,219.97 C213.81,219.97 213.79,219.91 213.79,219.91 C213.79,219.91 213.77,219.85 213.77,219.85 C213.77,219.85 213.75,219.79 213.75,219.79 C213.75,219.79 213.73,219.73 213.73,219.73 C213.73,219.73 213.71,219.67 213.71,219.67 C213.71,219.67 213.69,219.61 213.69,219.61 C213.69,219.61 213.68,219.55 213.68,219.55 C213.68,219.55 213.66,219.49 213.66,219.49 C213.66,219.49 213.65,219.43 213.65,219.43 C213.65,219.43 213.64,219.37 213.64,219.37 C213.64,219.37 213.62,219.31 213.62,219.31 C213.62,219.31 213.61,219.24 213.61,219.24 C213.61,219.24 213.6,219.18 213.6,219.18 C213.6,219.18 213.59,219.12 213.59,219.12 C213.59,219.12 213.58,219.06 213.58,219.06 C213.58,219.06 213.57,218.99 213.57,218.99 C213.57,218.99 213.57,218.93 213.57,218.93 C213.57,218.93 213.56,218.87 213.56,218.87 C213.56,218.87 213.56,218.81 213.56,218.81 C213.56,218.81 213.56,218.74 213.56,218.74 C213.56,218.74 213.56,218.68 213.56,218.68 C213.56,218.68 213.55,218.62 213.55,218.62 C213.55,218.62 213.55,218.55 213.55,218.55 C213.55,218.55 213.55,218.49 213.55,218.49 C213.55,218.49 213.56,218.43 213.56,218.43 C213.56,218.43 213.56,218.37 213.56,218.37 C213.56,218.37 213.56,218.3 213.56,218.3 C213.56,218.3 213.56,218.24 213.56,218.24 C213.56,218.24 213.57,218.18 213.57,218.18 C213.57,218.18 213.57,218.12 213.57,218.12 C213.57,218.12 213.58,218.05 213.58,218.05 C213.58,218.05 213.59,217.99 213.59,217.99 C213.59,217.99 213.6,217.93 213.6,217.93 C213.6,217.93 213.61,217.87 213.61,217.87 C213.61,217.87 213.62,217.8 213.62,217.8 C213.62,217.8 213.63,217.74 213.63,217.74 C213.63,217.74 213.65,217.68 213.65,217.68 C213.65,217.68 213.66,217.62 213.66,217.62 C213.66,217.62 213.68,217.56 213.68,217.56 C213.68,217.56 213.69,217.5 213.69,217.5 C213.69,217.5 213.71,217.44 213.71,217.44 C213.71,217.44 213.73,217.38 213.73,217.38 C213.73,217.38 213.75,217.32 213.75,217.32 C213.75,217.32 213.77,217.26 213.77,217.26 C213.77,217.26 213.79,217.2 213.79,217.2 C213.79,217.2 213.81,217.14 213.81,217.14 C213.81,217.14 213.83,217.08 213.83,217.08 C213.83,217.08 213.85,217.02 213.85,217.02 C213.85,217.02 213.88,216.96 213.88,216.96 C213.88,216.96 213.91,216.91 213.91,216.91 C213.91,216.91 213.93,216.85 213.93,216.85 C213.93,216.85 213.96,216.79 213.96,216.79 C213.96,216.79 213.99,216.74 213.99,216.74 C213.99,216.74 214.02,216.68 214.02,216.68 C214.02,216.68 214.05,216.63 214.05,216.63 C214.05,216.63 214.08,216.57 214.08,216.57 C214.08,216.57 214.11,216.52 214.11,216.52 C214.11,216.52 214.14,216.46 214.14,216.46 C214.14,216.46 214.17,216.41 214.17,216.41 C214.17,216.41 214.21,216.36 214.21,216.36 C214.21,216.36 214.24,216.3 214.24,216.3 C214.24,216.3 214.28,216.25 214.28,216.25 C214.28,216.25 214.32,216.2 214.32,216.2 C214.32,216.2 214.35,216.15 214.35,216.15 C214.35,216.15 214.39,216.1 214.39,216.1 C214.39,216.1 214.43,216.05 214.43,216.05 C214.43,216.05 214.47,216 214.47,216 C214.47,216 214.51,215.96 214.51,215.96 C214.51,215.96 214.55,215.91 214.55,215.91 C214.55,215.91 214.59,215.86 214.59,215.86 C214.59,215.86 214.64,215.81 214.64,215.81 C214.64,215.81 214.68,215.77 214.68,215.77 C214.68,215.77 214.73,215.72 214.73,215.72 C214.73,215.72 214.77,215.68 214.77,215.68 C214.77,215.68 214.82,215.64 214.82,215.64 C214.82,215.64 214.86,215.59 214.86,215.59 C214.86,215.59 214.91,215.55 214.91,215.55 C214.91,215.55 214.96,215.51 214.96,215.51 C214.96,215.51 215,215.47 215,215.47 C215,215.47 215.05,215.43 215.05,215.43 C215.05,215.43 215.1,215.39 215.1,215.39 C215.1,215.39 215.15,215.35 215.15,215.35 C215.15,215.35 215.2,215.31 215.2,215.31 C215.2,215.31 215.25,215.28 215.25,215.28 C215.25,215.28 215.31,215.24 215.31,215.24 C215.31,215.24 215.36,215.21 215.36,215.21 C215.36,215.21 215.41,215.17 215.41,215.17 C215.41,215.17 215.46,215.14 215.46,215.14 C215.46,215.14 215.52,215.11 215.52,215.11 C215.52,215.11 215.57,215.08 215.57,215.08 C215.57,215.08 215.63,215.05 215.63,215.05 C215.63,215.05 215.68,215.02 215.68,215.02 C215.68,215.02 215.74,214.99 215.74,214.99 C215.74,214.99 215.79,214.96 215.79,214.96 C215.79,214.96 215.85,214.93 215.85,214.93 C215.85,214.93 215.91,214.9 215.91,214.9 C215.91,214.9 215.97,214.88 215.97,214.88 C215.97,214.88 216.02,214.86 216.02,214.86 C216.02,214.86 216.08,214.83 216.08,214.83 C216.08,214.83 216.14,214.81 216.14,214.81 C216.14,214.81 216.2,214.78 216.2,214.78 C216.2,214.78 216.26,214.77 216.26,214.77 C216.26,214.77 216.32,214.75 216.32,214.75 C216.32,214.75 216.38,214.73 216.38,214.73 C216.38,214.73 216.44,214.71 216.44,214.71 C216.44,214.71 216.5,214.69 216.5,214.69 C216.5,214.69 216.56,214.67 216.56,214.67 C216.56,214.67 216.62,214.66 216.62,214.66 C216.62,214.66 216.68,214.65 216.68,214.65 C216.68,214.65 216.74,214.63 216.74,214.63 C216.74,214.63 216.81,214.62 216.81,214.62 C216.81,214.62 216.87,214.61 216.87,214.61 C216.87,214.61 216.93,214.6 216.93,214.6 C216.93,214.6 216.99,214.59 216.99,214.59 C216.99,214.59 217.05,214.58 217.05,214.58 C217.05,214.58 217.12,214.57 217.12,214.57 C217.12,214.57 217.18,214.57 217.18,214.57 C217.18,214.57 217.24,214.56 217.24,214.56 C217.24,214.56 217.3,214.56 217.3,214.56 C217.3,214.56 217.37,214.56 217.37,214.56 C217.37,214.56 217.43,214.55 217.43,214.55 C217.43,214.55 217.49,214.55 217.49,214.55 C217.49,214.55 217.56,214.55 217.56,214.55 C217.56,214.55 217.62,214.55 217.62,214.55c "/></group></group><group android:name="time_group"/></vector></aapt:attr><target android:name="_R_G_L_0_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="fillAlpha" android:duration="33" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="pathData" android:duration="67" android:startOffset="0" android:valueFrom="M217.62 214.55 C217.62,214.55 217.68,214.55 217.68,214.55 C217.68,214.55 217.74,214.56 217.74,214.56 C217.74,214.56 217.81,214.56 217.81,214.56 C217.81,214.56 217.87,214.56 217.87,214.56 C217.87,214.56 217.93,214.57 217.93,214.57 C217.93,214.57 218,214.57 218,214.57 C218,214.57 218.06,214.58 218.06,214.58 C218.06,214.58 218.12,214.59 218.12,214.59 C218.12,214.59 218.18,214.6 218.18,214.6 C218.18,214.6 218.24,214.61 218.24,214.61 C218.24,214.61 218.31,214.62 218.31,214.62 C218.31,214.62 218.37,214.63 218.37,214.63 C218.37,214.63 218.43,214.65 218.43,214.65 C218.43,214.65 218.49,214.66 218.49,214.66 C218.49,214.66 218.55,214.68 218.55,214.68 C218.55,214.68 218.61,214.69 218.61,214.69 C218.61,214.69 218.67,214.71 218.67,214.71 C218.67,214.71 218.73,214.73 218.73,214.73 C218.73,214.73 218.79,214.75 218.79,214.75 C218.79,214.75 218.85,214.77 218.85,214.77 C218.85,214.77 218.91,214.79 218.91,214.79 C218.91,214.79 218.97,214.81 218.97,214.81 C218.97,214.81 219.03,214.83 219.03,214.83 C219.03,214.83 219.09,214.85 219.09,214.85 C219.09,214.85 219.15,214.88 219.15,214.88 C219.15,214.88 219.2,214.9 219.2,214.9 C219.2,214.9 219.26,214.93 219.26,214.93 C219.26,214.93 219.32,214.96 219.32,214.96 C219.32,214.96 219.37,214.98 219.37,214.98 C219.37,214.98 219.43,215.01 219.43,215.01 C219.43,215.01 219.48,215.05 219.48,215.05 C219.48,215.05 219.54,215.08 219.54,215.08 C219.54,215.08 219.59,215.11 219.59,215.11 C219.59,215.11 219.65,215.14 219.65,215.14 C219.65,215.14 219.7,215.17 219.7,215.17 C219.7,215.17 219.75,215.21 219.75,215.21 C219.75,215.21 219.81,215.24 219.81,215.24 C219.81,215.24 219.86,215.28 219.86,215.28 C219.86,215.28 219.91,215.32 219.91,215.32 C219.91,215.32 219.96,215.35 219.96,215.35 C219.96,215.35 220.01,215.39 220.01,215.39 C220.01,215.39 220.06,215.43 220.06,215.43 C220.06,215.43 220.11,215.47 220.11,215.47 C220.11,215.47 220.16,215.51 220.16,215.51 C220.16,215.51 220.2,215.55 220.2,215.55 C220.2,215.55 220.25,215.59 220.25,215.59 C220.25,215.59 220.3,215.63 220.3,215.63 C220.3,215.63 220.34,215.68 220.34,215.68 C220.34,215.68 220.39,215.72 220.39,215.72 C220.39,215.72 220.43,215.77 220.43,215.77 C220.43,215.77 220.47,215.81 220.47,215.81 C220.47,215.81 220.52,215.86 220.52,215.86 C220.52,215.86 220.56,215.9 220.56,215.9 C220.56,215.9 220.6,215.95 220.6,215.95 C220.6,215.95 220.64,216 220.64,216 C220.64,216 220.68,216.05 220.68,216.05 C220.68,216.05 220.72,216.1 220.72,216.1 C220.72,216.1 220.76,216.15 220.76,216.15 C220.76,216.15 220.8,216.2 220.8,216.2 C220.8,216.2 220.83,216.25 220.83,216.25 C220.83,216.25 220.87,216.3 220.87,216.3 C220.87,216.3 220.9,216.36 220.9,216.36 C220.9,216.36 220.94,216.41 220.94,216.41 C220.94,216.41 220.97,216.46 220.97,216.46 C220.97,216.46 221,216.51 221,216.51 C221,216.51 221.03,216.57 221.03,216.57 C221.03,216.57 221.06,216.63 221.06,216.63 C221.06,216.63 221.09,216.68 221.09,216.68 C221.09,216.68 221.12,216.74 221.12,216.74 C221.12,216.74 221.15,216.79 221.15,216.79 C221.15,216.79 221.18,216.85 221.18,216.85 C221.18,216.85 221.21,216.91 221.21,216.91 C221.21,216.91 221.23,216.96 221.23,216.96 C221.23,216.96 221.25,217.02 221.25,217.02 C221.25,217.02 221.28,217.08 221.28,217.08 C221.28,217.08 221.3,217.14 221.3,217.14 C221.3,217.14 221.33,217.2 221.33,217.2 C221.33,217.2 221.34,217.26 221.34,217.26 C221.34,217.26 221.36,217.32 221.36,217.32 C221.36,217.32 221.38,217.38 221.38,217.38 C221.38,217.38 221.4,217.44 221.4,217.44 C221.4,217.44 221.42,217.5 221.42,217.5 C221.42,217.5 221.44,217.56 221.44,217.56 C221.44,217.56 221.45,217.62 221.45,217.62 C221.45,217.62 221.46,217.68 221.46,217.68 C221.46,217.68 221.48,217.74 221.48,217.74 C221.48,217.74 221.49,217.8 221.49,217.8 C221.49,217.8 221.5,217.87 221.5,217.87 C221.5,217.87 221.51,217.93 221.51,217.93 C221.51,217.93 221.52,217.99 221.52,217.99 C221.52,217.99 221.53,218.05 221.53,218.05 C221.53,218.05 221.54,218.11 221.54,218.11 C221.54,218.11 221.54,218.18 221.54,218.18 C221.54,218.18 221.55,218.24 221.55,218.24 C221.55,218.24 221.55,218.3 221.55,218.3 C221.55,218.3 221.55,218.37 221.55,218.37 C221.55,218.37 221.56,218.43 221.56,218.43 C221.56,218.43 221.56,218.49 221.56,218.49 C221.56,218.49 221.56,218.55 221.56,218.55 C221.56,218.55 221.56,218.62 221.56,218.62 C221.56,218.62 221.56,218.68 221.56,218.68 C221.56,218.68 221.55,218.74 221.55,218.74 C221.55,218.74 221.55,218.81 221.55,218.81 C221.55,218.81 221.55,218.87 221.55,218.87 C221.55,218.87 221.54,218.93 221.54,218.93 C221.54,218.93 221.54,218.99 221.54,218.99 C221.54,218.99 221.53,219.06 221.53,219.06 C221.53,219.06 221.52,219.12 221.52,219.12 C221.52,219.12 221.51,219.18 221.51,219.18 C221.51,219.18 221.5,219.24 221.5,219.24 C221.5,219.24 221.49,219.3 221.49,219.3 C221.49,219.3 221.48,219.37 221.48,219.37 C221.48,219.37 221.46,219.43 221.46,219.43 C221.46,219.43 221.45,219.49 221.45,219.49 C221.45,219.49 221.43,219.55 221.43,219.55 C221.43,219.55 221.42,219.61 221.42,219.61 C221.42,219.61 221.4,219.67 221.4,219.67 C221.4,219.67 221.39,219.73 221.39,219.73 C221.39,219.73 221.37,219.79 221.37,219.79 C221.37,219.79 221.34,219.85 221.34,219.85 C221.34,219.85 221.32,219.91 221.32,219.91 C221.32,219.91 221.3,219.97 221.3,219.97 C221.3,219.97 221.28,220.03 221.28,220.03 C221.28,220.03 221.26,220.09 221.26,220.09 C221.26,220.09 221.23,220.14 221.23,220.14 C221.23,220.14 221.21,220.2 221.21,220.2 C221.21,220.2 221.18,220.26 221.18,220.26 C221.18,220.26 221.15,220.32 221.15,220.32 C221.15,220.32 221.13,220.37 221.13,220.37 C221.13,220.37 221.1,220.43 221.1,220.43 C221.1,220.43 221.07,220.48 221.07,220.48 C221.07,220.48 221.03,220.54 221.03,220.54 C221.03,220.54 221,220.59 221,220.59 C221,220.59 220.97,220.65 220.97,220.65 C220.97,220.65 220.94,220.7 220.94,220.7 C220.94,220.7 220.9,220.75 220.9,220.75 C220.9,220.75 220.87,220.8 220.87,220.8 C220.87,220.8 220.83,220.86 220.83,220.86 C220.83,220.86 220.8,220.91 220.8,220.91 C220.8,220.91 220.76,220.96 220.76,220.96 C220.76,220.96 220.72,221.01 220.72,221.01 C220.72,221.01 220.68,221.06 220.68,221.06 C220.68,221.06 220.64,221.11 220.64,221.11 C220.64,221.11 220.6,221.15 220.6,221.15 C220.6,221.15 220.56,221.2 220.56,221.2 C220.56,221.2 220.52,221.25 220.52,221.25 C220.52,221.25 220.48,221.3 220.48,221.3 C220.48,221.3 220.43,221.34 220.43,221.34 C220.43,221.34 220.39,221.38 220.39,221.38 C220.39,221.38 220.34,221.43 220.34,221.43 C220.34,221.43 220.3,221.47 220.3,221.47 C220.3,221.47 220.25,221.52 220.25,221.52 C220.25,221.52 220.21,221.56 220.21,221.56 C220.21,221.56 220.16,221.6 220.16,221.6 C220.16,221.6 220.11,221.64 220.11,221.64 C220.11,221.64 220.06,221.68 220.06,221.68 C220.06,221.68 220.01,221.72 220.01,221.72 C220.01,221.72 219.96,221.76 219.96,221.76 C219.96,221.76 219.91,221.8 219.91,221.8 C219.91,221.8 219.86,221.83 219.86,221.83 C219.86,221.83 219.81,221.87 219.81,221.87 C219.81,221.87 219.75,221.9 219.75,221.9 C219.75,221.9 219.7,221.93 219.7,221.93 C219.7,221.93 219.65,221.97 219.65,221.97 C219.65,221.97 219.6,222 219.6,222 C219.6,222 219.54,222.03 219.54,222.03 C219.54,222.03 219.49,222.06 219.49,222.06 C219.49,222.06 219.43,222.09 219.43,222.09 C219.43,222.09 219.37,222.12 219.37,222.12 C219.37,222.12 219.32,222.15 219.32,222.15 C219.32,222.15 219.26,222.18 219.26,222.18 C219.26,222.18 219.21,222.2 219.21,222.2 C219.21,222.2 219.15,222.23 219.15,222.23 C219.15,222.23 219.09,222.25 219.09,222.25 C219.09,222.25 219.03,222.28 219.03,222.28 C219.03,222.28 218.97,222.3 218.97,222.3 C218.97,222.3 218.91,222.32 218.91,222.32 C218.91,222.32 218.85,222.34 218.85,222.34 C218.85,222.34 218.79,222.36 218.79,222.36 C218.79,222.36 218.73,222.38 218.73,222.38 C218.73,222.38 218.67,222.4 218.67,222.4 C218.67,222.4 218.61,222.42 218.61,222.42 C218.61,222.42 218.55,222.44 218.55,222.44 C218.55,222.44 218.49,222.45 218.49,222.45 C218.49,222.45 218.43,222.46 218.43,222.46 C218.43,222.46 218.37,222.47 218.37,222.47 C218.37,222.47 218.31,222.49 218.31,222.49 C218.31,222.49 218.25,222.5 218.25,222.5 C218.25,222.5 218.18,222.51 218.18,222.51 C218.18,222.51 218.12,222.52 218.12,222.52 C218.12,222.52 218.06,222.53 218.06,222.53 C218.06,222.53 218,222.54 218,222.54 C218,222.54 217.93,222.54 217.93,222.54 C217.93,222.54 217.87,222.55 217.87,222.55 C217.87,222.55 217.81,222.55 217.81,222.55 C217.81,222.55 217.75,222.55 217.75,222.55 C217.75,222.55 217.68,222.56 217.68,222.56 C217.68,222.56 217.62,222.56 217.62,222.56 C217.62,222.56 217.56,222.56 217.56,222.56 C217.56,222.56 217.49,222.56 217.49,222.56 C217.49,222.56 217.43,222.56 217.43,222.56 C217.43,222.56 217.37,222.55 217.37,222.55 C217.37,222.55 217.3,222.55 217.3,222.55 C217.3,222.55 217.24,222.55 217.24,222.55 C217.24,222.55 217.18,222.54 217.18,222.54 C217.18,222.54 217.12,222.54 217.12,222.54 C217.12,222.54 217.05,222.53 217.05,222.53 C217.05,222.53 216.99,222.52 216.99,222.52 C216.99,222.52 216.93,222.51 216.93,222.51 C216.93,222.51 216.87,222.5 216.87,222.5 C216.87,222.5 216.81,222.49 216.81,222.49 C216.81,222.49 216.74,222.48 216.74,222.48 C216.74,222.48 216.68,222.46 216.68,222.46 C216.68,222.46 216.62,222.45 216.62,222.45 C216.62,222.45 216.56,222.43 216.56,222.43 C216.56,222.43 216.5,222.42 216.5,222.42 C216.5,222.42 216.44,222.4 216.44,222.4 C216.44,222.4 216.38,222.38 216.38,222.38 C216.38,222.38 216.32,222.36 216.32,222.36 C216.32,222.36 216.26,222.34 216.26,222.34 C216.26,222.34 216.2,222.32 216.2,222.32 C216.2,222.32 216.14,222.3 216.14,222.3 C216.14,222.3 216.08,222.28 216.08,222.28 C216.08,222.28 216.02,222.26 216.02,222.26 C216.02,222.26 215.97,222.23 215.97,222.23 C215.97,222.23 215.91,222.2 215.91,222.2 C215.91,222.2 215.85,222.18 215.85,222.18 C215.85,222.18 215.79,222.15 215.79,222.15 C215.79,222.15 215.74,222.12 215.74,222.12 C215.74,222.12 215.68,222.1 215.68,222.1 C215.68,222.1 215.63,222.06 215.63,222.06 C215.63,222.06 215.57,222.03 215.57,222.03 C215.57,222.03 215.52,222 215.52,222 C215.52,222 215.46,221.97 215.46,221.97 C215.46,221.97 215.41,221.94 215.41,221.94 C215.41,221.94 215.36,221.9 215.36,221.9 C215.36,221.9 215.31,221.87 215.31,221.87 C215.31,221.87 215.25,221.83 215.25,221.83 C215.25,221.83 215.2,221.79 215.2,221.79 C215.2,221.79 215.15,221.76 215.15,221.76 C215.15,221.76 215.1,221.72 215.1,221.72 C215.1,221.72 215.05,221.68 215.05,221.68 C215.05,221.68 215,221.64 215,221.64 C215,221.64 214.96,221.6 214.96,221.6 C214.96,221.6 214.91,221.56 214.91,221.56 C214.91,221.56 214.86,221.52 214.86,221.52 C214.86,221.52 214.81,221.48 214.81,221.48 C214.81,221.48 214.77,221.43 214.77,221.43 C214.77,221.43 214.73,221.39 214.73,221.39 C214.73,221.39 214.68,221.34 214.68,221.34 C214.68,221.34 214.64,221.3 214.64,221.3 C214.64,221.3 214.59,221.25 214.59,221.25 C214.59,221.25 214.55,221.2 214.55,221.2 C214.55,221.2 214.51,221.15 214.51,221.15 C214.51,221.15 214.47,221.11 214.47,221.11 C214.47,221.11 214.43,221.06 214.43,221.06 C214.43,221.06 214.39,221.01 214.39,221.01 C214.39,221.01 214.35,220.96 214.35,220.96 C214.35,220.96 214.31,220.91 214.31,220.91 C214.31,220.91 214.28,220.86 214.28,220.86 C214.28,220.86 214.25,220.81 214.25,220.81 C214.25,220.81 214.21,220.75 214.21,220.75 C214.21,220.75 214.18,220.7 214.18,220.7 C214.18,220.7 214.14,220.65 214.14,220.65 C214.14,220.65 214.11,220.59 214.11,220.59 C214.11,220.59 214.08,220.54 214.08,220.54 C214.08,220.54 214.05,220.48 214.05,220.48 C214.05,220.48 214.02,220.43 214.02,220.43 C214.02,220.43 213.99,220.37 213.99,220.37 C213.99,220.37 213.96,220.32 213.96,220.32 C213.96,220.32 213.93,220.26 213.93,220.26 C213.93,220.26 213.91,220.2 213.91,220.2 C213.91,220.2 213.88,220.14 213.88,220.14 C213.88,220.14 213.86,220.09 213.86,220.09 C213.86,220.09 213.83,220.03 213.83,220.03 C213.83,220.03 213.81,219.97 213.81,219.97 C213.81,219.97 213.79,219.91 213.79,219.91 C213.79,219.91 213.77,219.85 213.77,219.85 C213.77,219.85 213.75,219.79 213.75,219.79 C213.75,219.79 213.73,219.73 213.73,219.73 C213.73,219.73 213.71,219.67 213.71,219.67 C213.71,219.67 213.69,219.61 213.69,219.61 C213.69,219.61 213.68,219.55 213.68,219.55 C213.68,219.55 213.66,219.49 213.66,219.49 C213.66,219.49 213.65,219.43 213.65,219.43 C213.65,219.43 213.64,219.37 213.64,219.37 C213.64,219.37 213.62,219.31 213.62,219.31 C213.62,219.31 213.61,219.24 213.61,219.24 C213.61,219.24 213.6,219.18 213.6,219.18 C213.6,219.18 213.59,219.12 213.59,219.12 C213.59,219.12 213.58,219.06 213.58,219.06 C213.58,219.06 213.57,218.99 213.57,218.99 C213.57,218.99 213.57,218.93 213.57,218.93 C213.57,218.93 213.56,218.87 213.56,218.87 C213.56,218.87 213.56,218.81 213.56,218.81 C213.56,218.81 213.56,218.74 213.56,218.74 C213.56,218.74 213.56,218.68 213.56,218.68 C213.56,218.68 213.55,218.62 213.55,218.62 C213.55,218.62 213.55,218.55 213.55,218.55 C213.55,218.55 213.55,218.49 213.55,218.49 C213.55,218.49 213.56,218.43 213.56,218.43 C213.56,218.43 213.56,218.37 213.56,218.37 C213.56,218.37 213.56,218.3 213.56,218.3 C213.56,218.3 213.56,218.24 213.56,218.24 C213.56,218.24 213.57,218.18 213.57,218.18 C213.57,218.18 213.57,218.12 213.57,218.12 C213.57,218.12 213.58,218.05 213.58,218.05 C213.58,218.05 213.59,217.99 213.59,217.99 C213.59,217.99 213.6,217.93 213.6,217.93 C213.6,217.93 213.61,217.87 213.61,217.87 C213.61,217.87 213.62,217.8 213.62,217.8 C213.62,217.8 213.63,217.74 213.63,217.74 C213.63,217.74 213.65,217.68 213.65,217.68 C213.65,217.68 213.66,217.62 213.66,217.62 C213.66,217.62 213.68,217.56 213.68,217.56 C213.68,217.56 213.69,217.5 213.69,217.5 C213.69,217.5 213.71,217.44 213.71,217.44 C213.71,217.44 213.73,217.38 213.73,217.38 C213.73,217.38 213.75,217.32 213.75,217.32 C213.75,217.32 213.77,217.26 213.77,217.26 C213.77,217.26 213.79,217.2 213.79,217.2 C213.79,217.2 213.81,217.14 213.81,217.14 C213.81,217.14 213.83,217.08 213.83,217.08 C213.83,217.08 213.85,217.02 213.85,217.02 C213.85,217.02 213.88,216.96 213.88,216.96 C213.88,216.96 213.91,216.91 213.91,216.91 C213.91,216.91 213.93,216.85 213.93,216.85 C213.93,216.85 213.96,216.79 213.96,216.79 C213.96,216.79 213.99,216.74 213.99,216.74 C213.99,216.74 214.02,216.68 214.02,216.68 C214.02,216.68 214.05,216.63 214.05,216.63 C214.05,216.63 214.08,216.57 214.08,216.57 C214.08,216.57 214.11,216.52 214.11,216.52 C214.11,216.52 214.14,216.46 214.14,216.46 C214.14,216.46 214.17,216.41 214.17,216.41 C214.17,216.41 214.21,216.36 214.21,216.36 C214.21,216.36 214.24,216.3 214.24,216.3 C214.24,216.3 214.28,216.25 214.28,216.25 C214.28,216.25 214.32,216.2 214.32,216.2 C214.32,216.2 214.35,216.15 214.35,216.15 C214.35,216.15 214.39,216.1 214.39,216.1 C214.39,216.1 214.43,216.05 214.43,216.05 C214.43,216.05 214.47,216 214.47,216 C214.47,216 214.51,215.96 214.51,215.96 C214.51,215.96 214.55,215.91 214.55,215.91 C214.55,215.91 214.59,215.86 214.59,215.86 C214.59,215.86 214.64,215.81 214.64,215.81 C214.64,215.81 214.68,215.77 214.68,215.77 C214.68,215.77 214.73,215.72 214.73,215.72 C214.73,215.72 214.77,215.68 214.77,215.68 C214.77,215.68 214.82,215.64 214.82,215.64 C214.82,215.64 214.86,215.59 214.86,215.59 C214.86,215.59 214.91,215.55 214.91,215.55 C214.91,215.55 214.96,215.51 214.96,215.51 C214.96,215.51 215,215.47 215,215.47 C215,215.47 215.05,215.43 215.05,215.43 C215.05,215.43 215.1,215.39 215.1,215.39 C215.1,215.39 215.15,215.35 215.15,215.35 C215.15,215.35 215.2,215.31 215.2,215.31 C215.2,215.31 215.25,215.28 215.25,215.28 C215.25,215.28 215.31,215.24 215.31,215.24 C215.31,215.24 215.36,215.21 215.36,215.21 C215.36,215.21 215.41,215.17 215.41,215.17 C215.41,215.17 215.46,215.14 215.46,215.14 C215.46,215.14 215.52,215.11 215.52,215.11 C215.52,215.11 215.57,215.08 215.57,215.08 C215.57,215.08 215.63,215.05 215.63,215.05 C215.63,215.05 215.68,215.02 215.68,215.02 C215.68,215.02 215.74,214.99 215.74,214.99 C215.74,214.99 215.79,214.96 215.79,214.96 C215.79,214.96 215.85,214.93 215.85,214.93 C215.85,214.93 215.91,214.9 215.91,214.9 C215.91,214.9 215.97,214.88 215.97,214.88 C215.97,214.88 216.02,214.86 216.02,214.86 C216.02,214.86 216.08,214.83 216.08,214.83 C216.08,214.83 216.14,214.81 216.14,214.81 C216.14,214.81 216.2,214.78 216.2,214.78 C216.2,214.78 216.26,214.77 216.26,214.77 C216.26,214.77 216.32,214.75 216.32,214.75 C216.32,214.75 216.38,214.73 216.38,214.73 C216.38,214.73 216.44,214.71 216.44,214.71 C216.44,214.71 216.5,214.69 216.5,214.69 C216.5,214.69 216.56,214.67 216.56,214.67 C216.56,214.67 216.62,214.66 216.62,214.66 C216.62,214.66 216.68,214.65 216.68,214.65 C216.68,214.65 216.74,214.63 216.74,214.63 C216.74,214.63 216.81,214.62 216.81,214.62 C216.81,214.62 216.87,214.61 216.87,214.61 C216.87,214.61 216.93,214.6 216.93,214.6 C216.93,214.6 216.99,214.59 216.99,214.59 C216.99,214.59 217.05,214.58 217.05,214.58 C217.05,214.58 217.12,214.57 217.12,214.57 C217.12,214.57 217.18,214.57 217.18,214.57 C217.18,214.57 217.24,214.56 217.24,214.56 C217.24,214.56 217.3,214.56 217.3,214.56 C217.3,214.56 217.37,214.56 217.37,214.56 C217.37,214.56 217.43,214.55 217.43,214.55 C217.43,214.55 217.49,214.55 217.49,214.55 C217.49,214.55 217.56,214.55 217.56,214.55 C217.56,214.55 217.62,214.55 217.62,214.55c " android:valueTo="M217.59 202.73 C217.59,202.73 217.85,202.75 217.85,202.75 C217.85,202.75 218.11,202.76 218.11,202.76 C218.11,202.76 218.37,202.79 218.37,202.79 C218.37,202.79 218.63,202.83 218.63,202.83 C218.63,202.83 218.88,202.88 218.88,202.88 C218.88,202.88 219.14,202.93 219.14,202.93 C219.14,202.93 219.39,203.01 219.39,203.01 C219.39,203.01 219.64,203.09 219.64,203.09 C219.64,203.09 219.88,203.18 219.88,203.18 C219.88,203.18 220.12,203.28 220.12,203.28 C220.12,203.28 220.36,203.39 220.36,203.39 C220.36,203.39 220.59,203.51 220.59,203.51 C220.59,203.51 220.82,203.64 220.82,203.64 C220.82,203.64 221.04,203.78 221.04,203.78 C221.04,203.78 221.26,203.92 221.26,203.92 C221.26,203.92 221.46,204.09 221.46,204.09 C221.46,204.09 221.66,204.25 221.66,204.25 C221.66,204.25 221.87,204.42 221.87,204.42 C221.87,204.42 222.05,204.61 222.05,204.61 C222.05,204.61 222.23,204.79 222.23,204.79 C222.23,204.79 222.4,204.99 222.4,204.99 C222.4,204.99 222.57,205.19 222.57,205.19 C222.57,205.19 222.72,205.41 222.72,205.41 C222.72,205.41 222.86,205.62 222.86,205.62 C222.86,205.62 223.01,205.84 223.01,205.84 C223.01,205.84 223.14,206.06 223.14,206.06 C223.14,206.06 223.27,206.29 223.27,206.29 C223.27,206.29 223.4,206.52 223.4,206.52 C223.4,206.52 223.53,206.75 223.53,206.75 C223.53,206.75 223.66,206.97 223.66,206.97 C223.66,206.97 223.79,207.2 223.79,207.2 C223.79,207.2 223.92,207.43 223.92,207.43 C223.92,207.43 224.05,207.65 224.05,207.65 C224.05,207.65 224.18,207.88 224.18,207.88 C224.18,207.88 224.31,208.11 224.31,208.11 C224.31,208.11 224.44,208.34 224.44,208.34 C224.44,208.34 224.56,208.56 224.56,208.56 C224.56,208.56 224.69,208.79 224.69,208.79 C224.69,208.79 224.82,209.02 224.82,209.02 C224.82,209.02 224.95,209.25 224.95,209.25 C224.95,209.25 225.08,209.47 225.08,209.47 C225.08,209.47 225.21,209.7 225.21,209.7 C225.21,209.7 225.34,209.93 225.34,209.93 C225.34,209.93 225.47,210.15 225.47,210.15 C225.47,210.15 225.6,210.38 225.6,210.38 C225.6,210.38 225.73,210.61 225.73,210.61 C225.73,210.61 225.86,210.84 225.86,210.84 C225.86,210.84 225.99,211.06 225.99,211.06 C225.99,211.06 226.11,211.29 226.11,211.29 C226.11,211.29 226.24,211.52 226.24,211.52 C226.24,211.52 226.37,211.75 226.37,211.75 C226.37,211.75 226.5,211.97 226.5,211.97 C226.5,211.97 226.63,212.2 226.63,212.2 C226.63,212.2 226.76,212.43 226.76,212.43 C226.76,212.43 226.89,212.65 226.89,212.65 C226.89,212.65 227.02,212.88 227.02,212.88 C227.02,212.88 227.15,213.11 227.15,213.11 C227.15,213.11 227.28,213.34 227.28,213.34 C227.28,213.34 227.41,213.56 227.41,213.56 C227.41,213.56 227.54,213.79 227.54,213.79 C227.54,213.79 227.66,214.02 227.66,214.02 C227.66,214.02 227.79,214.25 227.79,214.25 C227.79,214.25 227.92,214.47 227.92,214.47 C227.92,214.47 228.05,214.7 228.05,214.7 C228.05,214.7 228.18,214.93 228.18,214.93 C228.18,214.93 228.31,215.15 228.31,215.15 C228.31,215.15 228.44,215.38 228.44,215.38 C228.44,215.38 228.57,215.61 228.57,215.61 C228.57,215.61 228.7,215.83 228.7,215.83 C228.7,215.83 228.83,216.06 228.83,216.06 C228.83,216.06 228.96,216.29 228.96,216.29 C228.96,216.29 229.09,216.52 229.09,216.52 C229.09,216.52 229.21,216.74 229.21,216.74 C229.21,216.74 229.34,216.97 229.34,216.97 C229.34,216.97 229.47,217.2 229.47,217.2 C229.47,217.2 229.6,217.43 229.6,217.43 C229.6,217.43 229.73,217.65 229.73,217.65 C229.73,217.65 229.86,217.88 229.86,217.88 C229.86,217.88 229.99,218.11 229.99,218.11 C229.99,218.11 230.12,218.33 230.12,218.33 C230.12,218.33 230.25,218.56 230.25,218.56 C230.25,218.56 230.38,218.79 230.38,218.79 C230.38,218.79 230.51,219.02 230.51,219.02 C230.51,219.02 230.64,219.24 230.64,219.24 C230.64,219.24 230.76,219.47 230.76,219.47 C230.76,219.47 230.89,219.7 230.89,219.7 C230.89,219.7 231.02,219.93 231.02,219.93 C231.02,219.93 231.15,220.15 231.15,220.15 C231.15,220.15 231.28,220.38 231.28,220.38 C231.28,220.38 231.41,220.61 231.41,220.61 C231.41,220.61 231.54,220.83 231.54,220.83 C231.54,220.83 231.67,221.06 231.67,221.06 C231.67,221.06 231.8,221.29 231.8,221.29 C231.8,221.29 231.93,221.52 231.93,221.52 C231.93,221.52 232.06,221.74 232.06,221.74 C232.06,221.74 232.19,221.97 232.19,221.97 C232.19,221.97 232.31,222.2 232.31,222.2 C232.31,222.2 232.44,222.43 232.44,222.43 C232.44,222.43 232.57,222.65 232.57,222.65 C232.57,222.65 232.7,222.88 232.7,222.88 C232.7,222.88 232.83,223.11 232.83,223.11 C232.83,223.11 232.96,223.33 232.96,223.33 C232.96,223.33 233.09,223.56 233.09,223.56 C233.09,223.56 233.22,223.79 233.22,223.79 C233.22,223.79 233.35,224.02 233.35,224.02 C233.35,224.02 233.48,224.24 233.48,224.24 C233.48,224.24 233.61,224.47 233.61,224.47 C233.61,224.47 233.73,224.7 233.73,224.7 C233.73,224.7 233.84,224.94 233.84,224.94 C233.84,224.94 233.96,225.17 233.96,225.17 C233.96,225.17 234.07,225.41 234.07,225.41 C234.07,225.41 234.16,225.65 234.16,225.65 C234.16,225.65 234.24,225.9 234.24,225.9 C234.24,225.9 234.32,226.15 234.32,226.15 C234.32,226.15 234.38,226.4 234.38,226.4 C234.38,226.4 234.43,226.66 234.43,226.66 C234.43,226.66 234.48,226.92 234.48,226.92 C234.48,226.92 234.51,227.18 234.51,227.18 C234.51,227.18 234.53,227.44 234.53,227.44 C234.53,227.44 234.54,227.7 234.54,227.7 C234.54,227.7 234.54,227.96 234.54,227.96 C234.54,227.96 234.53,228.22 234.53,228.22 C234.53,228.22 234.51,228.48 234.51,228.48 C234.51,228.48 234.48,228.74 234.48,228.74 C234.48,228.74 234.43,229 234.43,229 C234.43,229 234.39,229.25 234.39,229.25 C234.39,229.25 234.32,229.51 234.32,229.51 C234.32,229.51 234.25,229.76 234.25,229.76 C234.25,229.76 234.17,230.01 234.17,230.01 C234.17,230.01 234.08,230.25 234.08,230.25 C234.08,230.25 233.97,230.49 233.97,230.49 C233.97,230.49 233.86,230.73 233.86,230.73 C233.86,230.73 233.75,230.96 233.75,230.96 C233.75,230.96 233.61,231.18 233.61,231.18 C233.61,231.18 233.48,231.41 233.48,231.41 C233.48,231.41 233.33,231.63 233.33,231.63 C233.33,231.63 233.17,231.83 233.17,231.83 C233.17,231.83 233.01,232.04 233.01,232.04 C233.01,232.04 232.84,232.24 232.84,232.24 C232.84,232.24 232.66,232.42 232.66,232.42 C232.66,232.42 232.47,232.61 232.47,232.61 C232.47,232.61 232.28,232.78 232.28,232.78 C232.28,232.78 232.08,232.95 232.08,232.95 C232.08,232.95 231.87,233.11 231.87,233.11 C231.87,233.11 231.66,233.26 231.66,233.26 C231.66,233.26 231.43,233.39 231.43,233.39 C231.43,233.39 231.21,233.53 231.21,233.53 C231.21,233.53 230.98,233.65 230.98,233.65 C230.98,233.65 230.74,233.76 230.74,233.76 C230.74,233.76 230.5,233.87 230.5,233.87 C230.5,233.87 230.26,233.96 230.26,233.96 C230.26,233.96 230.01,234.04 230.01,234.04 C230.01,234.04 229.76,234.12 229.76,234.12 C229.76,234.12 229.51,234.17 229.51,234.17 C229.51,234.17 229.25,234.23 229.25,234.23 C229.25,234.23 228.99,234.26 228.99,234.26 C228.99,234.26 228.73,234.3 228.73,234.3 C228.73,234.3 228.47,234.31 228.47,234.31 C228.47,234.31 228.21,234.32 228.21,234.32 C228.21,234.32 227.95,234.32 227.95,234.32 C227.95,234.32 227.69,234.32 227.69,234.32 C227.69,234.32 227.43,234.32 227.43,234.32 C227.43,234.32 227.16,234.32 227.16,234.32 C227.16,234.32 226.9,234.32 226.9,234.32 C226.9,234.32 226.64,234.32 226.64,234.32 C226.64,234.32 226.38,234.32 226.38,234.32 C226.38,234.32 226.12,234.32 226.12,234.32 C226.12,234.32 225.86,234.32 225.86,234.32 C225.86,234.32 225.6,234.32 225.6,234.32 C225.6,234.32 225.33,234.32 225.33,234.32 C225.33,234.32 225.07,234.32 225.07,234.32 C225.07,234.32 224.81,234.32 224.81,234.32 C224.81,234.32 224.55,234.32 224.55,234.32 C224.55,234.32 224.29,234.32 224.29,234.32 C224.29,234.32 224.03,234.32 224.03,234.32 C224.03,234.32 223.77,234.32 223.77,234.32 C223.77,234.32 223.5,234.32 223.5,234.32 C223.5,234.32 223.24,234.32 223.24,234.32 C223.24,234.32 222.98,234.32 222.98,234.32 C222.98,234.32 222.72,234.32 222.72,234.32 C222.72,234.32 222.46,234.32 222.46,234.32 C222.46,234.32 222.2,234.32 222.2,234.32 C222.2,234.32 221.94,234.32 221.94,234.32 C221.94,234.32 221.68,234.32 221.68,234.32 C221.68,234.32 221.41,234.32 221.41,234.32 C221.41,234.32 221.15,234.32 221.15,234.32 C221.15,234.32 220.89,234.32 220.89,234.32 C220.89,234.32 220.63,234.32 220.63,234.32 C220.63,234.32 220.37,234.32 220.37,234.32 C220.37,234.32 220.11,234.32 220.11,234.32 C220.11,234.32 219.85,234.32 219.85,234.32 C219.85,234.32 219.58,234.32 219.58,234.32 C219.58,234.32 219.32,234.32 219.32,234.32 C219.32,234.32 219.06,234.32 219.06,234.32 C219.06,234.32 218.8,234.32 218.8,234.32 C218.8,234.32 218.54,234.32 218.54,234.32 C218.54,234.32 218.28,234.32 218.28,234.32 C218.28,234.32 218.02,234.32 218.02,234.32 C218.02,234.32 217.75,234.32 217.75,234.32 C217.75,234.32 217.49,234.32 217.49,234.32 C217.49,234.32 217.23,234.32 217.23,234.32 C217.23,234.32 216.97,234.32 216.97,234.32 C216.97,234.32 216.71,234.32 216.71,234.32 C216.71,234.32 216.45,234.32 216.45,234.32 C216.45,234.32 216.19,234.32 216.19,234.32 C216.19,234.32 215.92,234.32 215.92,234.32 C215.92,234.32 215.66,234.32 215.66,234.32 C215.66,234.32 215.4,234.32 215.4,234.32 C215.4,234.32 215.14,234.32 215.14,234.32 C215.14,234.32 214.88,234.32 214.88,234.32 C214.88,234.32 214.62,234.32 214.62,234.32 C214.62,234.32 214.36,234.32 214.36,234.32 C214.36,234.32 214.1,234.32 214.1,234.32 C214.1,234.32 213.83,234.32 213.83,234.32 C213.83,234.32 213.57,234.32 213.57,234.32 C213.57,234.32 213.31,234.32 213.31,234.32 C213.31,234.32 213.05,234.32 213.05,234.32 C213.05,234.32 212.79,234.32 212.79,234.32 C212.79,234.32 212.53,234.32 212.53,234.32 C212.53,234.32 212.27,234.32 212.27,234.32 C212.27,234.32 212,234.32 212,234.32 C212,234.32 211.74,234.32 211.74,234.32 C211.74,234.32 211.48,234.32 211.48,234.32 C211.48,234.32 211.22,234.32 211.22,234.32 C211.22,234.32 210.96,234.32 210.96,234.32 C210.96,234.32 210.7,234.32 210.7,234.32 C210.7,234.32 210.44,234.32 210.44,234.32 C210.44,234.32 210.17,234.32 210.17,234.32 C210.17,234.32 209.91,234.32 209.91,234.32 C209.91,234.32 209.65,234.32 209.65,234.32 C209.65,234.32 209.39,234.32 209.39,234.32 C209.39,234.32 209.13,234.32 209.13,234.32 C209.13,234.32 208.87,234.32 208.87,234.32 C208.87,234.32 208.61,234.32 208.61,234.32 C208.61,234.32 208.34,234.32 208.34,234.32 C208.34,234.32 208.08,234.32 208.08,234.32 C208.08,234.32 207.82,234.32 207.82,234.32 C207.82,234.32 207.56,234.32 207.56,234.32 C207.56,234.32 207.3,234.32 207.3,234.32 C207.3,234.32 207.04,234.32 207.04,234.32 C207.04,234.32 206.78,234.32 206.78,234.32 C206.78,234.32 206.52,234.3 206.52,234.3 C206.52,234.3 206.26,234.28 206.26,234.28 C206.26,234.28 206,234.25 206,234.25 C206,234.25 205.74,234.21 205.74,234.21 C205.74,234.21 205.48,234.15 205.48,234.15 C205.48,234.15 205.23,234.09 205.23,234.09 C205.23,234.09 204.98,234.01 204.98,234.01 C204.98,234.01 204.73,233.93 204.73,233.93 C204.73,233.93 204.49,233.83 204.49,233.83 C204.49,233.83 204.25,233.72 204.25,233.72 C204.25,233.72 204.01,233.62 204.01,233.62 C204.01,233.62 203.79,233.48 203.79,233.48 C203.79,233.48 203.57,233.35 203.57,233.35 C203.57,233.35 203.34,233.21 203.34,233.21 C203.34,233.21 203.14,233.05 203.14,233.05 C203.14,233.05 202.93,232.89 202.93,232.89 C202.93,232.89 202.73,232.73 202.73,232.73 C202.73,232.73 202.54,232.54 202.54,232.54 C202.54,232.54 202.36,232.36 202.36,232.36 C202.36,232.36 202.17,232.17 202.17,232.17 C202.17,232.17 202.01,231.97 202.01,231.97 C202.01,231.97 201.85,231.76 201.85,231.76 C201.85,231.76 201.69,231.55 201.69,231.55 C201.69,231.55 201.55,231.33 201.55,231.33 C201.55,231.33 201.42,231.11 201.42,231.11 C201.42,231.11 201.29,230.88 201.29,230.88 C201.29,230.88 201.18,230.64 201.18,230.64 C201.18,230.64 201.07,230.4 201.07,230.4 C201.07,230.4 200.96,230.17 200.96,230.17 C200.96,230.17 200.88,229.92 200.88,229.92 C200.88,229.92 200.8,229.67 200.8,229.67 C200.8,229.67 200.73,229.42 200.73,229.42 C200.73,229.42 200.68,229.16 200.68,229.16 C200.68,229.16 200.63,228.91 200.63,228.91 C200.63,228.91 200.58,228.65 200.58,228.65 C200.58,228.65 200.56,228.39 200.56,228.39 C200.56,228.39 200.55,228.13 200.55,228.13 C200.55,228.13 200.53,227.87 200.53,227.87 C200.53,227.87 200.54,227.61 200.54,227.61 C200.54,227.61 200.56,227.35 200.56,227.35 C200.56,227.35 200.58,227.08 200.58,227.08 C200.58,227.08 200.62,226.83 200.62,226.83 C200.62,226.83 200.67,226.57 200.67,226.57 C200.67,226.57 200.72,226.31 200.72,226.31 C200.72,226.31 200.79,226.06 200.79,226.06 C200.79,226.06 200.87,225.81 200.87,225.81 C200.87,225.81 200.95,225.57 200.95,225.57 C200.95,225.57 201.05,225.32 201.05,225.32 C201.05,225.32 201.16,225.09 201.16,225.09 C201.16,225.09 201.27,224.85 201.27,224.85 C201.27,224.85 201.39,224.62 201.39,224.62 C201.39,224.62 201.52,224.39 201.52,224.39 C201.52,224.39 201.65,224.16 201.65,224.16 C201.65,224.16 201.78,223.94 201.78,223.94 C201.78,223.94 201.91,223.71 201.91,223.71 C201.91,223.71 202.03,223.48 202.03,223.48 C202.03,223.48 202.16,223.25 202.16,223.25 C202.16,223.25 202.29,223.03 202.29,223.03 C202.29,223.03 202.42,222.8 202.42,222.8 C202.42,222.8 202.55,222.57 202.55,222.57 C202.55,222.57 202.68,222.35 202.68,222.35 C202.68,222.35 202.81,222.12 202.81,222.12 C202.81,222.12 202.94,221.89 202.94,221.89 C202.94,221.89 203.07,221.66 203.07,221.66 C203.07,221.66 203.2,221.44 203.2,221.44 C203.2,221.44 203.33,221.21 203.33,221.21 C203.33,221.21 203.46,220.98 203.46,220.98 C203.46,220.98 203.58,220.76 203.58,220.76 C203.58,220.76 203.71,220.53 203.71,220.53 C203.71,220.53 203.84,220.3 203.84,220.3 C203.84,220.3 203.97,220.07 203.97,220.07 C203.97,220.07 204.1,219.85 204.1,219.85 C204.1,219.85 204.23,219.62 204.23,219.62 C204.23,219.62 204.36,219.39 204.36,219.39 C204.36,219.39 204.49,219.16 204.49,219.16 C204.49,219.16 204.62,218.94 204.62,218.94 C204.62,218.94 204.75,218.71 204.75,218.71 C204.75,218.71 204.88,218.48 204.88,218.48 C204.88,218.48 205.01,218.26 205.01,218.26 C205.01,218.26 205.13,218.03 205.13,218.03 C205.13,218.03 205.26,217.8 205.26,217.8 C205.26,217.8 205.39,217.57 205.39,217.57 C205.39,217.57 205.52,217.35 205.52,217.35 C205.52,217.35 205.65,217.12 205.65,217.12 C205.65,217.12 205.78,216.89 205.78,216.89 C205.78,216.89 205.91,216.66 205.91,216.66 C205.91,216.66 206.04,216.44 206.04,216.44 C206.04,216.44 206.17,216.21 206.17,216.21 C206.17,216.21 206.3,215.98 206.3,215.98 C206.3,215.98 206.43,215.76 206.43,215.76 C206.43,215.76 206.56,215.53 206.56,215.53 C206.56,215.53 206.68,215.3 206.68,215.3 C206.68,215.3 206.81,215.07 206.81,215.07 C206.81,215.07 206.94,214.85 206.94,214.85 C206.94,214.85 207.07,214.62 207.07,214.62 C207.07,214.62 207.2,214.39 207.2,214.39 C207.2,214.39 207.33,214.17 207.33,214.17 C207.33,214.17 207.46,213.94 207.46,213.94 C207.46,213.94 207.59,213.71 207.59,213.71 C207.59,213.71 207.72,213.48 207.72,213.48 C207.72,213.48 207.85,213.26 207.85,213.26 C207.85,213.26 207.98,213.03 207.98,213.03 C207.98,213.03 208.11,212.8 208.11,212.8 C208.11,212.8 208.23,212.57 208.23,212.57 C208.23,212.57 208.36,212.35 208.36,212.35 C208.36,212.35 208.49,212.12 208.49,212.12 C208.49,212.12 208.62,211.89 208.62,211.89 C208.62,211.89 208.75,211.67 208.75,211.67 C208.75,211.67 208.88,211.44 208.88,211.44 C208.88,211.44 209.01,211.21 209.01,211.21 C209.01,211.21 209.14,210.98 209.14,210.98 C209.14,210.98 209.27,210.76 209.27,210.76 C209.27,210.76 209.4,210.53 209.4,210.53 C209.4,210.53 209.53,210.3 209.53,210.3 C209.53,210.3 209.66,210.08 209.66,210.08 C209.66,210.08 209.78,209.85 209.78,209.85 C209.78,209.85 209.91,209.62 209.91,209.62 C209.91,209.62 210.04,209.39 210.04,209.39 C210.04,209.39 210.17,209.17 210.17,209.17 C210.17,209.17 210.3,208.94 210.3,208.94 C210.3,208.94 210.43,208.71 210.43,208.71 C210.43,208.71 210.56,208.48 210.56,208.48 C210.56,208.48 210.69,208.26 210.69,208.26 C210.69,208.26 210.82,208.03 210.82,208.03 C210.82,208.03 210.95,207.8 210.95,207.8 C210.95,207.8 211.08,207.58 211.08,207.58 C211.08,207.58 211.21,207.35 211.21,207.35 C211.21,207.35 211.33,207.12 211.33,207.12 C211.33,207.12 211.46,206.89 211.46,206.89 C211.46,206.89 211.59,206.67 211.59,206.67 C211.59,206.67 211.72,206.44 211.72,206.44 C211.72,206.44 211.85,206.21 211.85,206.21 C211.85,206.21 211.98,205.98 211.98,205.98 C211.98,205.98 212.13,205.76 212.13,205.76 C212.13,205.76 212.27,205.54 212.27,205.54 C212.27,205.54 212.41,205.33 212.41,205.33 C212.41,205.33 212.57,205.12 212.57,205.12 C212.57,205.12 212.74,204.92 212.74,204.92 C212.74,204.92 212.91,204.72 212.91,204.72 C212.91,204.72 213.1,204.54 213.1,204.54 C213.1,204.54 213.29,204.36 213.29,204.36 C213.29,204.36 213.49,204.19 213.49,204.19 C213.49,204.19 213.69,204.03 213.69,204.03 C213.69,204.03 213.9,203.87 213.9,203.87 C213.9,203.87 214.12,203.73 214.12,203.73 C214.12,203.73 214.34,203.59 214.34,203.59 C214.34,203.59 214.57,203.46 214.57,203.46 C214.57,203.46 214.81,203.35 214.81,203.35 C214.81,203.35 215.04,203.24 215.04,203.24 C215.04,203.24 215.28,203.14 215.28,203.14 C215.28,203.14 215.53,203.06 215.53,203.06 C215.53,203.06 215.78,202.98 215.78,202.98 C215.78,202.98 216.03,202.91 216.03,202.91 C216.03,202.91 216.29,202.86 216.29,202.86 C216.29,202.86 216.55,202.82 216.55,202.82 C216.55,202.82 216.8,202.77 216.8,202.77 C216.8,202.77 217.07,202.76 217.07,202.76 C217.07,202.76 217.33,202.74 217.33,202.74 C217.33,202.74 217.59,202.73 217.59,202.73c " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="pathData" android:duration="283" android:startOffset="67" android:valueFrom="M217.59 202.73 C217.59,202.73 217.85,202.75 217.85,202.75 C217.85,202.75 218.11,202.76 218.11,202.76 C218.11,202.76 218.37,202.79 218.37,202.79 C218.37,202.79 218.63,202.83 218.63,202.83 C218.63,202.83 218.88,202.88 218.88,202.88 C218.88,202.88 219.14,202.93 219.14,202.93 C219.14,202.93 219.39,203.01 219.39,203.01 C219.39,203.01 219.64,203.09 219.64,203.09 C219.64,203.09 219.88,203.18 219.88,203.18 C219.88,203.18 220.12,203.28 220.12,203.28 C220.12,203.28 220.36,203.39 220.36,203.39 C220.36,203.39 220.59,203.51 220.59,203.51 C220.59,203.51 220.82,203.64 220.82,203.64 C220.82,203.64 221.04,203.78 221.04,203.78 C221.04,203.78 221.26,203.92 221.26,203.92 C221.26,203.92 221.46,204.09 221.46,204.09 C221.46,204.09 221.66,204.25 221.66,204.25 C221.66,204.25 221.87,204.42 221.87,204.42 C221.87,204.42 222.05,204.61 222.05,204.61 C222.05,204.61 222.23,204.79 222.23,204.79 C222.23,204.79 222.4,204.99 222.4,204.99 C222.4,204.99 222.57,205.19 222.57,205.19 C222.57,205.19 222.72,205.41 222.72,205.41 C222.72,205.41 222.86,205.62 222.86,205.62 C222.86,205.62 223.01,205.84 223.01,205.84 C223.01,205.84 223.14,206.06 223.14,206.06 C223.14,206.06 223.27,206.29 223.27,206.29 C223.27,206.29 223.4,206.52 223.4,206.52 C223.4,206.52 223.53,206.75 223.53,206.75 C223.53,206.75 223.66,206.97 223.66,206.97 C223.66,206.97 223.79,207.2 223.79,207.2 C223.79,207.2 223.92,207.43 223.92,207.43 C223.92,207.43 224.05,207.65 224.05,207.65 C224.05,207.65 224.18,207.88 224.18,207.88 C224.18,207.88 224.31,208.11 224.31,208.11 C224.31,208.11 224.44,208.34 224.44,208.34 C224.44,208.34 224.56,208.56 224.56,208.56 C224.56,208.56 224.69,208.79 224.69,208.79 C224.69,208.79 224.82,209.02 224.82,209.02 C224.82,209.02 224.95,209.25 224.95,209.25 C224.95,209.25 225.08,209.47 225.08,209.47 C225.08,209.47 225.21,209.7 225.21,209.7 C225.21,209.7 225.34,209.93 225.34,209.93 C225.34,209.93 225.47,210.15 225.47,210.15 C225.47,210.15 225.6,210.38 225.6,210.38 C225.6,210.38 225.73,210.61 225.73,210.61 C225.73,210.61 225.86,210.84 225.86,210.84 C225.86,210.84 225.99,211.06 225.99,211.06 C225.99,211.06 226.11,211.29 226.11,211.29 C226.11,211.29 226.24,211.52 226.24,211.52 C226.24,211.52 226.37,211.75 226.37,211.75 C226.37,211.75 226.5,211.97 226.5,211.97 C226.5,211.97 226.63,212.2 226.63,212.2 C226.63,212.2 226.76,212.43 226.76,212.43 C226.76,212.43 226.89,212.65 226.89,212.65 C226.89,212.65 227.02,212.88 227.02,212.88 C227.02,212.88 227.15,213.11 227.15,213.11 C227.15,213.11 227.28,213.34 227.28,213.34 C227.28,213.34 227.41,213.56 227.41,213.56 C227.41,213.56 227.54,213.79 227.54,213.79 C227.54,213.79 227.66,214.02 227.66,214.02 C227.66,214.02 227.79,214.25 227.79,214.25 C227.79,214.25 227.92,214.47 227.92,214.47 C227.92,214.47 228.05,214.7 228.05,214.7 C228.05,214.7 228.18,214.93 228.18,214.93 C228.18,214.93 228.31,215.15 228.31,215.15 C228.31,215.15 228.44,215.38 228.44,215.38 C228.44,215.38 228.57,215.61 228.57,215.61 C228.57,215.61 228.7,215.83 228.7,215.83 C228.7,215.83 228.83,216.06 228.83,216.06 C228.83,216.06 228.96,216.29 228.96,216.29 C228.96,216.29 229.09,216.52 229.09,216.52 C229.09,216.52 229.21,216.74 229.21,216.74 C229.21,216.74 229.34,216.97 229.34,216.97 C229.34,216.97 229.47,217.2 229.47,217.2 C229.47,217.2 229.6,217.43 229.6,217.43 C229.6,217.43 229.73,217.65 229.73,217.65 C229.73,217.65 229.86,217.88 229.86,217.88 C229.86,217.88 229.99,218.11 229.99,218.11 C229.99,218.11 230.12,218.33 230.12,218.33 C230.12,218.33 230.25,218.56 230.25,218.56 C230.25,218.56 230.38,218.79 230.38,218.79 C230.38,218.79 230.51,219.02 230.51,219.02 C230.51,219.02 230.64,219.24 230.64,219.24 C230.64,219.24 230.76,219.47 230.76,219.47 C230.76,219.47 230.89,219.7 230.89,219.7 C230.89,219.7 231.02,219.93 231.02,219.93 C231.02,219.93 231.15,220.15 231.15,220.15 C231.15,220.15 231.28,220.38 231.28,220.38 C231.28,220.38 231.41,220.61 231.41,220.61 C231.41,220.61 231.54,220.83 231.54,220.83 C231.54,220.83 231.67,221.06 231.67,221.06 C231.67,221.06 231.8,221.29 231.8,221.29 C231.8,221.29 231.93,221.52 231.93,221.52 C231.93,221.52 232.06,221.74 232.06,221.74 C232.06,221.74 232.19,221.97 232.19,221.97 C232.19,221.97 232.31,222.2 232.31,222.2 C232.31,222.2 232.44,222.43 232.44,222.43 C232.44,222.43 232.57,222.65 232.57,222.65 C232.57,222.65 232.7,222.88 232.7,222.88 C232.7,222.88 232.83,223.11 232.83,223.11 C232.83,223.11 232.96,223.33 232.96,223.33 C232.96,223.33 233.09,223.56 233.09,223.56 C233.09,223.56 233.22,223.79 233.22,223.79 C233.22,223.79 233.35,224.02 233.35,224.02 C233.35,224.02 233.48,224.24 233.48,224.24 C233.48,224.24 233.61,224.47 233.61,224.47 C233.61,224.47 233.73,224.7 233.73,224.7 C233.73,224.7 233.84,224.94 233.84,224.94 C233.84,224.94 233.96,225.17 233.96,225.17 C233.96,225.17 234.07,225.41 234.07,225.41 C234.07,225.41 234.16,225.65 234.16,225.65 C234.16,225.65 234.24,225.9 234.24,225.9 C234.24,225.9 234.32,226.15 234.32,226.15 C234.32,226.15 234.38,226.4 234.38,226.4 C234.38,226.4 234.43,226.66 234.43,226.66 C234.43,226.66 234.48,226.92 234.48,226.92 C234.48,226.92 234.51,227.18 234.51,227.18 C234.51,227.18 234.53,227.44 234.53,227.44 C234.53,227.44 234.54,227.7 234.54,227.7 C234.54,227.7 234.54,227.96 234.54,227.96 C234.54,227.96 234.53,228.22 234.53,228.22 C234.53,228.22 234.51,228.48 234.51,228.48 C234.51,228.48 234.48,228.74 234.48,228.74 C234.48,228.74 234.43,229 234.43,229 C234.43,229 234.39,229.25 234.39,229.25 C234.39,229.25 234.32,229.51 234.32,229.51 C234.32,229.51 234.25,229.76 234.25,229.76 C234.25,229.76 234.17,230.01 234.17,230.01 C234.17,230.01 234.08,230.25 234.08,230.25 C234.08,230.25 233.97,230.49 233.97,230.49 C233.97,230.49 233.86,230.73 233.86,230.73 C233.86,230.73 233.75,230.96 233.75,230.96 C233.75,230.96 233.61,231.18 233.61,231.18 C233.61,231.18 233.48,231.41 233.48,231.41 C233.48,231.41 233.33,231.63 233.33,231.63 C233.33,231.63 233.17,231.83 233.17,231.83 C233.17,231.83 233.01,232.04 233.01,232.04 C233.01,232.04 232.84,232.24 232.84,232.24 C232.84,232.24 232.66,232.42 232.66,232.42 C232.66,232.42 232.47,232.61 232.47,232.61 C232.47,232.61 232.28,232.78 232.28,232.78 C232.28,232.78 232.08,232.95 232.08,232.95 C232.08,232.95 231.87,233.11 231.87,233.11 C231.87,233.11 231.66,233.26 231.66,233.26 C231.66,233.26 231.43,233.39 231.43,233.39 C231.43,233.39 231.21,233.53 231.21,233.53 C231.21,233.53 230.98,233.65 230.98,233.65 C230.98,233.65 230.74,233.76 230.74,233.76 C230.74,233.76 230.5,233.87 230.5,233.87 C230.5,233.87 230.26,233.96 230.26,233.96 C230.26,233.96 230.01,234.04 230.01,234.04 C230.01,234.04 229.76,234.12 229.76,234.12 C229.76,234.12 229.51,234.17 229.51,234.17 C229.51,234.17 229.25,234.23 229.25,234.23 C229.25,234.23 228.99,234.26 228.99,234.26 C228.99,234.26 228.73,234.3 228.73,234.3 C228.73,234.3 228.47,234.31 228.47,234.31 C228.47,234.31 228.21,234.32 228.21,234.32 C228.21,234.32 227.95,234.32 227.95,234.32 C227.95,234.32 227.69,234.32 227.69,234.32 C227.69,234.32 227.43,234.32 227.43,234.32 C227.43,234.32 227.16,234.32 227.16,234.32 C227.16,234.32 226.9,234.32 226.9,234.32 C226.9,234.32 226.64,234.32 226.64,234.32 C226.64,234.32 226.38,234.32 226.38,234.32 C226.38,234.32 226.12,234.32 226.12,234.32 C226.12,234.32 225.86,234.32 225.86,234.32 C225.86,234.32 225.6,234.32 225.6,234.32 C225.6,234.32 225.33,234.32 225.33,234.32 C225.33,234.32 225.07,234.32 225.07,234.32 C225.07,234.32 224.81,234.32 224.81,234.32 C224.81,234.32 224.55,234.32 224.55,234.32 C224.55,234.32 224.29,234.32 224.29,234.32 C224.29,234.32 224.03,234.32 224.03,234.32 C224.03,234.32 223.77,234.32 223.77,234.32 C223.77,234.32 223.5,234.32 223.5,234.32 C223.5,234.32 223.24,234.32 223.24,234.32 C223.24,234.32 222.98,234.32 222.98,234.32 C222.98,234.32 222.72,234.32 222.72,234.32 C222.72,234.32 222.46,234.32 222.46,234.32 C222.46,234.32 222.2,234.32 222.2,234.32 C222.2,234.32 221.94,234.32 221.94,234.32 C221.94,234.32 221.68,234.32 221.68,234.32 C221.68,234.32 221.41,234.32 221.41,234.32 C221.41,234.32 221.15,234.32 221.15,234.32 C221.15,234.32 220.89,234.32 220.89,234.32 C220.89,234.32 220.63,234.32 220.63,234.32 C220.63,234.32 220.37,234.32 220.37,234.32 C220.37,234.32 220.11,234.32 220.11,234.32 C220.11,234.32 219.85,234.32 219.85,234.32 C219.85,234.32 219.58,234.32 219.58,234.32 C219.58,234.32 219.32,234.32 219.32,234.32 C219.32,234.32 219.06,234.32 219.06,234.32 C219.06,234.32 218.8,234.32 218.8,234.32 C218.8,234.32 218.54,234.32 218.54,234.32 C218.54,234.32 218.28,234.32 218.28,234.32 C218.28,234.32 218.02,234.32 218.02,234.32 C218.02,234.32 217.75,234.32 217.75,234.32 C217.75,234.32 217.49,234.32 217.49,234.32 C217.49,234.32 217.23,234.32 217.23,234.32 C217.23,234.32 216.97,234.32 216.97,234.32 C216.97,234.32 216.71,234.32 216.71,234.32 C216.71,234.32 216.45,234.32 216.45,234.32 C216.45,234.32 216.19,234.32 216.19,234.32 C216.19,234.32 215.92,234.32 215.92,234.32 C215.92,234.32 215.66,234.32 215.66,234.32 C215.66,234.32 215.4,234.32 215.4,234.32 C215.4,234.32 215.14,234.32 215.14,234.32 C215.14,234.32 214.88,234.32 214.88,234.32 C214.88,234.32 214.62,234.32 214.62,234.32 C214.62,234.32 214.36,234.32 214.36,234.32 C214.36,234.32 214.1,234.32 214.1,234.32 C214.1,234.32 213.83,234.32 213.83,234.32 C213.83,234.32 213.57,234.32 213.57,234.32 C213.57,234.32 213.31,234.32 213.31,234.32 C213.31,234.32 213.05,234.32 213.05,234.32 C213.05,234.32 212.79,234.32 212.79,234.32 C212.79,234.32 212.53,234.32 212.53,234.32 C212.53,234.32 212.27,234.32 212.27,234.32 C212.27,234.32 212,234.32 212,234.32 C212,234.32 211.74,234.32 211.74,234.32 C211.74,234.32 211.48,234.32 211.48,234.32 C211.48,234.32 211.22,234.32 211.22,234.32 C211.22,234.32 210.96,234.32 210.96,234.32 C210.96,234.32 210.7,234.32 210.7,234.32 C210.7,234.32 210.44,234.32 210.44,234.32 C210.44,234.32 210.17,234.32 210.17,234.32 C210.17,234.32 209.91,234.32 209.91,234.32 C209.91,234.32 209.65,234.32 209.65,234.32 C209.65,234.32 209.39,234.32 209.39,234.32 C209.39,234.32 209.13,234.32 209.13,234.32 C209.13,234.32 208.87,234.32 208.87,234.32 C208.87,234.32 208.61,234.32 208.61,234.32 C208.61,234.32 208.34,234.32 208.34,234.32 C208.34,234.32 208.08,234.32 208.08,234.32 C208.08,234.32 207.82,234.32 207.82,234.32 C207.82,234.32 207.56,234.32 207.56,234.32 C207.56,234.32 207.3,234.32 207.3,234.32 C207.3,234.32 207.04,234.32 207.04,234.32 C207.04,234.32 206.78,234.32 206.78,234.32 C206.78,234.32 206.52,234.3 206.52,234.3 C206.52,234.3 206.26,234.28 206.26,234.28 C206.26,234.28 206,234.25 206,234.25 C206,234.25 205.74,234.21 205.74,234.21 C205.74,234.21 205.48,234.15 205.48,234.15 C205.48,234.15 205.23,234.09 205.23,234.09 C205.23,234.09 204.98,234.01 204.98,234.01 C204.98,234.01 204.73,233.93 204.73,233.93 C204.73,233.93 204.49,233.83 204.49,233.83 C204.49,233.83 204.25,233.72 204.25,233.72 C204.25,233.72 204.01,233.62 204.01,233.62 C204.01,233.62 203.79,233.48 203.79,233.48 C203.79,233.48 203.57,233.35 203.57,233.35 C203.57,233.35 203.34,233.21 203.34,233.21 C203.34,233.21 203.14,233.05 203.14,233.05 C203.14,233.05 202.93,232.89 202.93,232.89 C202.93,232.89 202.73,232.73 202.73,232.73 C202.73,232.73 202.54,232.54 202.54,232.54 C202.54,232.54 202.36,232.36 202.36,232.36 C202.36,232.36 202.17,232.17 202.17,232.17 C202.17,232.17 202.01,231.97 202.01,231.97 C202.01,231.97 201.85,231.76 201.85,231.76 C201.85,231.76 201.69,231.55 201.69,231.55 C201.69,231.55 201.55,231.33 201.55,231.33 C201.55,231.33 201.42,231.11 201.42,231.11 C201.42,231.11 201.29,230.88 201.29,230.88 C201.29,230.88 201.18,230.64 201.18,230.64 C201.18,230.64 201.07,230.4 201.07,230.4 C201.07,230.4 200.96,230.17 200.96,230.17 C200.96,230.17 200.88,229.92 200.88,229.92 C200.88,229.92 200.8,229.67 200.8,229.67 C200.8,229.67 200.73,229.42 200.73,229.42 C200.73,229.42 200.68,229.16 200.68,229.16 C200.68,229.16 200.63,228.91 200.63,228.91 C200.63,228.91 200.58,228.65 200.58,228.65 C200.58,228.65 200.56,228.39 200.56,228.39 C200.56,228.39 200.55,228.13 200.55,228.13 C200.55,228.13 200.53,227.87 200.53,227.87 C200.53,227.87 200.54,227.61 200.54,227.61 C200.54,227.61 200.56,227.35 200.56,227.35 C200.56,227.35 200.58,227.08 200.58,227.08 C200.58,227.08 200.62,226.83 200.62,226.83 C200.62,226.83 200.67,226.57 200.67,226.57 C200.67,226.57 200.72,226.31 200.72,226.31 C200.72,226.31 200.79,226.06 200.79,226.06 C200.79,226.06 200.87,225.81 200.87,225.81 C200.87,225.81 200.95,225.57 200.95,225.57 C200.95,225.57 201.05,225.32 201.05,225.32 C201.05,225.32 201.16,225.09 201.16,225.09 C201.16,225.09 201.27,224.85 201.27,224.85 C201.27,224.85 201.39,224.62 201.39,224.62 C201.39,224.62 201.52,224.39 201.52,224.39 C201.52,224.39 201.65,224.16 201.65,224.16 C201.65,224.16 201.78,223.94 201.78,223.94 C201.78,223.94 201.91,223.71 201.91,223.71 C201.91,223.71 202.03,223.48 202.03,223.48 C202.03,223.48 202.16,223.25 202.16,223.25 C202.16,223.25 202.29,223.03 202.29,223.03 C202.29,223.03 202.42,222.8 202.42,222.8 C202.42,222.8 202.55,222.57 202.55,222.57 C202.55,222.57 202.68,222.35 202.68,222.35 C202.68,222.35 202.81,222.12 202.81,222.12 C202.81,222.12 202.94,221.89 202.94,221.89 C202.94,221.89 203.07,221.66 203.07,221.66 C203.07,221.66 203.2,221.44 203.2,221.44 C203.2,221.44 203.33,221.21 203.33,221.21 C203.33,221.21 203.46,220.98 203.46,220.98 C203.46,220.98 203.58,220.76 203.58,220.76 C203.58,220.76 203.71,220.53 203.71,220.53 C203.71,220.53 203.84,220.3 203.84,220.3 C203.84,220.3 203.97,220.07 203.97,220.07 C203.97,220.07 204.1,219.85 204.1,219.85 C204.1,219.85 204.23,219.62 204.23,219.62 C204.23,219.62 204.36,219.39 204.36,219.39 C204.36,219.39 204.49,219.16 204.49,219.16 C204.49,219.16 204.62,218.94 204.62,218.94 C204.62,218.94 204.75,218.71 204.75,218.71 C204.75,218.71 204.88,218.48 204.88,218.48 C204.88,218.48 205.01,218.26 205.01,218.26 C205.01,218.26 205.13,218.03 205.13,218.03 C205.13,218.03 205.26,217.8 205.26,217.8 C205.26,217.8 205.39,217.57 205.39,217.57 C205.39,217.57 205.52,217.35 205.52,217.35 C205.52,217.35 205.65,217.12 205.65,217.12 C205.65,217.12 205.78,216.89 205.78,216.89 C205.78,216.89 205.91,216.66 205.91,216.66 C205.91,216.66 206.04,216.44 206.04,216.44 C206.04,216.44 206.17,216.21 206.17,216.21 C206.17,216.21 206.3,215.98 206.3,215.98 C206.3,215.98 206.43,215.76 206.43,215.76 C206.43,215.76 206.56,215.53 206.56,215.53 C206.56,215.53 206.68,215.3 206.68,215.3 C206.68,215.3 206.81,215.07 206.81,215.07 C206.81,215.07 206.94,214.85 206.94,214.85 C206.94,214.85 207.07,214.62 207.07,214.62 C207.07,214.62 207.2,214.39 207.2,214.39 C207.2,214.39 207.33,214.17 207.33,214.17 C207.33,214.17 207.46,213.94 207.46,213.94 C207.46,213.94 207.59,213.71 207.59,213.71 C207.59,213.71 207.72,213.48 207.72,213.48 C207.72,213.48 207.85,213.26 207.85,213.26 C207.85,213.26 207.98,213.03 207.98,213.03 C207.98,213.03 208.11,212.8 208.11,212.8 C208.11,212.8 208.23,212.57 208.23,212.57 C208.23,212.57 208.36,212.35 208.36,212.35 C208.36,212.35 208.49,212.12 208.49,212.12 C208.49,212.12 208.62,211.89 208.62,211.89 C208.62,211.89 208.75,211.67 208.75,211.67 C208.75,211.67 208.88,211.44 208.88,211.44 C208.88,211.44 209.01,211.21 209.01,211.21 C209.01,211.21 209.14,210.98 209.14,210.98 C209.14,210.98 209.27,210.76 209.27,210.76 C209.27,210.76 209.4,210.53 209.4,210.53 C209.4,210.53 209.53,210.3 209.53,210.3 C209.53,210.3 209.66,210.08 209.66,210.08 C209.66,210.08 209.78,209.85 209.78,209.85 C209.78,209.85 209.91,209.62 209.91,209.62 C209.91,209.62 210.04,209.39 210.04,209.39 C210.04,209.39 210.17,209.17 210.17,209.17 C210.17,209.17 210.3,208.94 210.3,208.94 C210.3,208.94 210.43,208.71 210.43,208.71 C210.43,208.71 210.56,208.48 210.56,208.48 C210.56,208.48 210.69,208.26 210.69,208.26 C210.69,208.26 210.82,208.03 210.82,208.03 C210.82,208.03 210.95,207.8 210.95,207.8 C210.95,207.8 211.08,207.58 211.08,207.58 C211.08,207.58 211.21,207.35 211.21,207.35 C211.21,207.35 211.33,207.12 211.33,207.12 C211.33,207.12 211.46,206.89 211.46,206.89 C211.46,206.89 211.59,206.67 211.59,206.67 C211.59,206.67 211.72,206.44 211.72,206.44 C211.72,206.44 211.85,206.21 211.85,206.21 C211.85,206.21 211.98,205.98 211.98,205.98 C211.98,205.98 212.13,205.76 212.13,205.76 C212.13,205.76 212.27,205.54 212.27,205.54 C212.27,205.54 212.41,205.33 212.41,205.33 C212.41,205.33 212.57,205.12 212.57,205.12 C212.57,205.12 212.74,204.92 212.74,204.92 C212.74,204.92 212.91,204.72 212.91,204.72 C212.91,204.72 213.1,204.54 213.1,204.54 C213.1,204.54 213.29,204.36 213.29,204.36 C213.29,204.36 213.49,204.19 213.49,204.19 C213.49,204.19 213.69,204.03 213.69,204.03 C213.69,204.03 213.9,203.87 213.9,203.87 C213.9,203.87 214.12,203.73 214.12,203.73 C214.12,203.73 214.34,203.59 214.34,203.59 C214.34,203.59 214.57,203.46 214.57,203.46 C214.57,203.46 214.81,203.35 214.81,203.35 C214.81,203.35 215.04,203.24 215.04,203.24 C215.04,203.24 215.28,203.14 215.28,203.14 C215.28,203.14 215.53,203.06 215.53,203.06 C215.53,203.06 215.78,202.98 215.78,202.98 C215.78,202.98 216.03,202.91 216.03,202.91 C216.03,202.91 216.29,202.86 216.29,202.86 C216.29,202.86 216.55,202.82 216.55,202.82 C216.55,202.82 216.8,202.77 216.8,202.77 C216.8,202.77 217.07,202.76 217.07,202.76 C217.07,202.76 217.33,202.74 217.33,202.74 C217.33,202.74 217.59,202.73 217.59,202.73c " android:valueTo="M217.68 210.56 C217.68,210.56 217.81,210.57 217.81,210.57 C217.81,210.57 217.93,210.57 217.93,210.57 C217.93,210.57 218.06,210.58 218.06,210.58 C218.06,210.58 218.18,210.59 218.18,210.59 C218.18,210.59 218.31,210.59 218.31,210.59 C218.31,210.59 218.43,210.61 218.43,210.61 C218.43,210.61 218.56,210.63 218.56,210.63 C218.56,210.63 218.68,210.64 218.68,210.64 C218.68,210.64 218.81,210.66 218.81,210.66 C218.81,210.66 218.93,210.68 218.93,210.68 C218.93,210.68 219.05,210.7 219.05,210.7 C219.05,210.7 219.18,210.72 219.18,210.72 C219.18,210.72 219.3,210.75 219.3,210.75 C219.3,210.75 219.42,210.78 219.42,210.78 C219.42,210.78 219.54,210.81 219.54,210.81 C219.54,210.81 219.66,210.84 219.66,210.84 C219.66,210.84 219.79,210.87 219.79,210.87 C219.79,210.87 219.91,210.91 219.91,210.91 C219.91,210.91 220.03,210.95 220.03,210.95 C220.03,210.95 220.14,210.99 220.14,210.99 C220.14,210.99 220.26,211.04 220.26,211.04 C220.26,211.04 220.38,211.08 220.38,211.08 C220.38,211.08 220.5,211.12 220.5,211.12 C220.5,211.12 220.62,211.17 220.62,211.17 C220.62,211.17 220.73,211.22 220.73,211.22 C220.73,211.22 220.84,211.27 220.84,211.27 C220.84,211.27 220.96,211.32 220.96,211.32 C220.96,211.32 221.07,211.38 221.07,211.38 C221.07,211.38 221.19,211.43 221.19,211.43 C221.19,211.43 221.3,211.49 221.3,211.49 C221.3,211.49 221.41,211.55 221.41,211.55 C221.41,211.55 221.51,211.61 221.51,211.61 C221.51,211.61 221.62,211.68 221.62,211.68 C221.62,211.68 221.73,211.74 221.73,211.74 C221.73,211.74 221.84,211.8 221.84,211.8 C221.84,211.8 221.94,211.87 221.94,211.87 C221.94,211.87 222.05,211.94 222.05,211.94 C222.05,211.94 222.15,212.02 222.15,212.02 C222.15,212.02 222.25,212.09 222.25,212.09 C222.25,212.09 222.35,212.16 222.35,212.16 C222.35,212.16 222.46,212.23 222.46,212.23 C222.46,212.23 222.55,212.31 222.55,212.31 C222.55,212.31 222.65,212.4 222.65,212.4 C222.65,212.4 222.74,212.48 222.74,212.48 C222.74,212.48 222.84,212.56 222.84,212.56 C222.84,212.56 222.93,212.64 222.93,212.64 C222.93,212.64 223.03,212.72 223.03,212.72 C223.03,212.72 223.12,212.81 223.12,212.81 C223.12,212.81 223.21,212.9 223.21,212.9 C223.21,212.9 223.29,212.99 223.29,212.99 C223.29,212.99 223.38,213.08 223.38,213.08 C223.38,213.08 223.47,213.17 223.47,213.17 C223.47,213.17 223.55,213.26 223.55,213.26 C223.55,213.26 223.63,213.36 223.63,213.36 C223.63,213.36 223.71,213.46 223.71,213.46 C223.71,213.46 223.79,213.56 223.79,213.56 C223.79,213.56 223.87,213.66 223.87,213.66 C223.87,213.66 223.95,213.75 223.95,213.75 C223.95,213.75 224.03,213.85 224.03,213.85 C224.03,213.85 224.09,213.96 224.09,213.96 C224.09,213.96 224.16,214.06 224.16,214.06 C224.16,214.06 224.23,214.17 224.23,214.17 C224.23,214.17 224.3,214.27 224.3,214.27 C224.3,214.27 224.37,214.38 224.37,214.38 C224.37,214.38 224.44,214.48 224.44,214.48 C224.44,214.48 224.5,214.59 224.5,214.59 C224.5,214.59 224.56,214.7 224.56,214.7 C224.56,214.7 224.62,214.81 224.62,214.81 C224.62,214.81 224.68,214.93 224.68,214.93 C224.68,214.93 224.74,215.04 224.74,215.04 C224.74,215.04 224.79,215.15 224.79,215.15 C224.79,215.15 224.84,215.26 224.84,215.26 C224.84,215.26 224.89,215.38 224.89,215.38 C224.89,215.38 224.94,215.5 224.94,215.5 C224.94,215.5 224.99,215.61 224.99,215.61 C224.99,215.61 225.04,215.73 225.04,215.73 C225.04,215.73 225.08,215.84 225.08,215.84 C225.08,215.84 225.12,215.96 225.12,215.96 C225.12,215.96 225.16,216.08 225.16,216.08 C225.16,216.08 225.19,216.2 225.19,216.2 C225.19,216.2 225.23,216.32 225.23,216.32 C225.23,216.32 225.27,216.44 225.27,216.44 C225.27,216.44 225.3,216.56 225.3,216.56 C225.3,216.56 225.33,216.69 225.33,216.69 C225.33,216.69 225.35,216.81 225.35,216.81 C225.35,216.81 225.38,216.93 225.38,216.93 C225.38,216.93 225.41,217.06 225.41,217.06 C225.41,217.06 225.43,217.18 225.43,217.18 C225.43,217.18 225.46,217.3 225.46,217.3 C225.46,217.3 225.47,217.43 225.47,217.43 C225.47,217.43 225.49,217.55 225.49,217.55 C225.49,217.55 225.5,217.68 225.5,217.68 C225.5,217.68 225.52,217.8 225.52,217.8 C225.52,217.8 225.52,217.93 225.52,217.93 C225.52,217.93 225.53,218.05 225.53,218.05 C225.53,218.05 225.54,218.18 225.54,218.18 C225.54,218.18 225.54,218.3 225.54,218.3 C225.54,218.3 225.55,218.43 225.55,218.43 C225.55,218.43 225.55,218.55 225.55,218.55 C225.55,218.55 225.55,218.68 225.55,218.68 C225.55,218.68 225.54,218.8 225.54,218.8 C225.54,218.8 225.54,218.93 225.54,218.93 C225.54,218.93 225.53,219.05 225.53,219.05 C225.53,219.05 225.52,219.18 225.52,219.18 C225.52,219.18 225.52,219.31 225.52,219.31 C225.52,219.31 225.5,219.43 225.5,219.43 C225.5,219.43 225.48,219.55 225.48,219.55 C225.48,219.55 225.47,219.68 225.47,219.68 C225.47,219.68 225.45,219.8 225.45,219.8 C225.45,219.8 225.43,219.93 225.43,219.93 C225.43,219.93 225.41,220.05 225.41,220.05 C225.41,220.05 225.39,220.17 225.39,220.17 C225.39,220.17 225.36,220.3 225.36,220.3 C225.36,220.3 225.33,220.42 225.33,220.42 C225.33,220.42 225.3,220.54 225.3,220.54 C225.3,220.54 225.27,220.66 225.27,220.66 C225.27,220.66 225.24,220.78 225.24,220.78 C225.24,220.78 225.2,220.9 225.2,220.9 C225.2,220.9 225.16,221.02 225.16,221.02 C225.16,221.02 225.12,221.14 225.12,221.14 C225.12,221.14 225.08,221.26 225.08,221.26 C225.08,221.26 225.03,221.38 225.03,221.38 C225.03,221.38 224.99,221.5 224.99,221.5 C224.99,221.5 224.95,221.61 224.95,221.61 C224.95,221.61 224.89,221.73 224.89,221.73 C224.89,221.73 224.84,221.84 224.84,221.84 C224.84,221.84 224.79,221.96 224.79,221.96 C224.79,221.96 224.73,222.07 224.73,222.07 C224.73,222.07 224.68,222.18 224.68,222.18 C224.68,222.18 224.62,222.29 224.62,222.29 C224.62,222.29 224.56,222.4 224.56,222.4 C224.56,222.4 224.5,222.51 224.5,222.51 C224.5,222.51 224.44,222.62 224.44,222.62 C224.44,222.62 224.37,222.73 224.37,222.73 C224.37,222.73 224.31,222.84 224.31,222.84 C224.31,222.84 224.24,222.94 224.24,222.94 C224.24,222.94 224.17,223.05 224.17,223.05 C224.17,223.05 224.09,223.15 224.09,223.15 C224.09,223.15 224.02,223.25 224.02,223.25 C224.02,223.25 223.95,223.35 223.95,223.35 C223.95,223.35 223.88,223.45 223.88,223.45 C223.88,223.45 223.8,223.55 223.8,223.55 C223.8,223.55 223.71,223.65 223.71,223.65 C223.71,223.65 223.63,223.74 223.63,223.74 C223.63,223.74 223.55,223.84 223.55,223.84 C223.55,223.84 223.47,223.93 223.47,223.93 C223.47,223.93 223.39,224.03 223.39,224.03 C223.39,224.03 223.3,224.12 223.3,224.12 C223.3,224.12 223.21,224.2 223.21,224.2 C223.21,224.2 223.12,224.29 223.12,224.29 C223.12,224.29 223.03,224.38 223.03,224.38 C223.03,224.38 222.94,224.46 222.94,224.46 C222.94,224.46 222.85,224.55 222.85,224.55 C222.85,224.55 222.75,224.63 222.75,224.63 C222.75,224.63 222.65,224.71 222.65,224.71 C222.65,224.71 222.55,224.79 222.55,224.79 C222.55,224.79 222.46,224.87 222.46,224.87 C222.46,224.87 222.36,224.95 222.36,224.95 C222.36,224.95 222.26,225.02 222.26,225.02 C222.26,225.02 222.15,225.09 222.15,225.09 C222.15,225.09 222.05,225.16 222.05,225.16 C222.05,225.16 221.94,225.23 221.94,225.23 C221.94,225.23 221.84,225.3 221.84,225.3 C221.84,225.3 221.74,225.37 221.74,225.37 C221.74,225.37 221.63,225.44 221.63,225.44 C221.63,225.44 221.52,225.5 221.52,225.5 C221.52,225.5 221.41,225.56 221.41,225.56 C221.41,225.56 221.3,225.62 221.3,225.62 C221.3,225.62 221.19,225.68 221.19,225.68 C221.19,225.68 221.08,225.73 221.08,225.73 C221.08,225.73 220.96,225.79 220.96,225.79 C220.96,225.79 220.85,225.84 220.85,225.84 C220.85,225.84 220.73,225.89 220.73,225.89 C220.73,225.89 220.62,225.94 220.62,225.94 C220.62,225.94 220.5,225.99 220.5,225.99 C220.5,225.99 220.38,226.03 220.38,226.03 C220.38,226.03 220.27,226.08 220.27,226.08 C220.27,226.08 220.15,226.12 220.15,226.12 C220.15,226.12 220.03,226.15 220.03,226.15 C220.03,226.15 219.91,226.19 219.91,226.19 C219.91,226.19 219.79,226.23 219.79,226.23 C219.79,226.23 219.67,226.27 219.67,226.27 C219.67,226.27 219.55,226.3 219.55,226.3 C219.55,226.3 219.42,226.33 219.42,226.33 C219.42,226.33 219.3,226.35 219.3,226.35 C219.3,226.35 219.18,226.38 219.18,226.38 C219.18,226.38 219.06,226.4 219.06,226.4 C219.06,226.4 218.93,226.43 218.93,226.43 C218.93,226.43 218.81,226.45 218.81,226.45 C218.81,226.45 218.68,226.47 218.68,226.47 C218.68,226.47 218.56,226.49 218.56,226.49 C218.56,226.49 218.44,226.5 218.44,226.5 C218.44,226.5 218.31,226.52 218.31,226.52 C218.31,226.52 218.19,226.52 218.19,226.52 C218.19,226.52 218.06,226.53 218.06,226.53 C218.06,226.53 217.93,226.53 217.93,226.53 C217.93,226.53 217.81,226.54 217.81,226.54 C217.81,226.54 217.68,226.55 217.68,226.55 C217.68,226.55 217.56,226.55 217.56,226.55 C217.56,226.55 217.43,226.55 217.43,226.55 C217.43,226.55 217.31,226.54 217.31,226.54 C217.31,226.54 217.18,226.53 217.18,226.53 C217.18,226.53 217.05,226.53 217.05,226.53 C217.05,226.53 216.93,226.52 216.93,226.52 C216.93,226.52 216.8,226.52 216.8,226.52 C216.8,226.52 216.68,226.5 216.68,226.5 C216.68,226.5 216.55,226.48 216.55,226.48 C216.55,226.48 216.43,226.46 216.43,226.46 C216.43,226.46 216.31,226.45 216.31,226.45 C216.31,226.45 216.18,226.43 216.18,226.43 C216.18,226.43 216.06,226.41 216.06,226.41 C216.06,226.41 215.93,226.38 215.93,226.38 C215.93,226.38 215.81,226.35 215.81,226.35 C215.81,226.35 215.69,226.32 215.69,226.32 C215.69,226.32 215.57,226.29 215.57,226.29 C215.57,226.29 215.45,226.26 215.45,226.26 C215.45,226.26 215.32,226.23 215.32,226.23 C215.32,226.23 215.2,226.2 215.2,226.2 C215.2,226.2 215.09,226.16 215.09,226.16 C215.09,226.16 214.97,226.12 214.97,226.12 C214.97,226.12 214.85,226.07 214.85,226.07 C214.85,226.07 214.73,226.03 214.73,226.03 C214.73,226.03 214.61,225.99 214.61,225.99 C214.61,225.99 214.5,225.94 214.5,225.94 C214.5,225.94 214.38,225.89 214.38,225.89 C214.38,225.89 214.27,225.84 214.27,225.84 C214.27,225.84 214.15,225.79 214.15,225.79 C214.15,225.79 214.04,225.73 214.04,225.73 C214.04,225.73 213.93,225.68 213.93,225.68 C213.93,225.68 213.81,225.62 213.81,225.62 C213.81,225.62 213.71,225.56 213.71,225.56 C213.71,225.56 213.6,225.5 213.6,225.5 C213.6,225.5 213.49,225.43 213.49,225.43 C213.49,225.43 213.38,225.37 213.38,225.37 C213.38,225.37 213.27,225.31 213.27,225.31 C213.27,225.31 213.17,225.24 213.17,225.24 C213.17,225.24 213.06,225.16 213.06,225.16 C213.06,225.16 212.96,225.09 212.96,225.09 C212.96,225.09 212.86,225.02 212.86,225.02 C212.86,225.02 212.76,224.95 212.76,224.95 C212.76,224.95 212.65,224.87 212.65,224.87 C212.65,224.87 212.56,224.79 212.56,224.79 C212.56,224.79 212.46,224.71 212.46,224.71 C212.46,224.71 212.37,224.63 212.37,224.63 C212.37,224.63 212.27,224.55 212.27,224.55 C212.27,224.55 212.18,224.47 212.18,224.47 C212.18,224.47 212.08,224.38 212.08,224.38 C212.08,224.38 211.99,224.3 211.99,224.3 C211.99,224.3 211.91,224.2 211.91,224.2 C211.91,224.2 211.82,224.11 211.82,224.11 C211.82,224.11 211.73,224.02 211.73,224.02 C211.73,224.02 211.64,223.93 211.64,223.93 C211.64,223.93 211.56,223.84 211.56,223.84 C211.56,223.84 211.48,223.75 211.48,223.75 C211.48,223.75 211.4,223.65 211.4,223.65 C211.4,223.65 211.32,223.55 211.32,223.55 C211.32,223.55 211.24,223.45 211.24,223.45 C211.24,223.45 211.16,223.35 211.16,223.35 C211.16,223.35 211.09,223.26 211.09,223.26 C211.09,223.26 211.02,223.15 211.02,223.15 C211.02,223.15 210.95,223.05 210.95,223.05 C210.95,223.05 210.88,222.94 210.88,222.94 C210.88,222.94 210.81,222.84 210.81,222.84 C210.81,222.84 210.74,222.73 210.74,222.73 C210.74,222.73 210.67,222.63 210.67,222.63 C210.67,222.63 210.61,222.52 210.61,222.52 C210.61,222.52 210.55,222.4 210.55,222.4 C210.55,222.4 210.49,222.29 210.49,222.29 C210.49,222.29 210.43,222.18 210.43,222.18 C210.43,222.18 210.38,222.07 210.38,222.07 C210.38,222.07 210.32,221.96 210.32,221.96 C210.32,221.96 210.27,221.84 210.27,221.84 C210.27,221.84 210.22,221.73 210.22,221.73 C210.22,221.73 210.17,221.61 210.17,221.61 C210.17,221.61 210.12,221.5 210.12,221.5 C210.12,221.5 210.08,221.38 210.08,221.38 C210.08,221.38 210.03,221.26 210.03,221.26 C210.03,221.26 209.99,221.14 209.99,221.14 C209.99,221.14 209.96,221.02 209.96,221.02 C209.96,221.02 209.92,220.9 209.92,220.9 C209.92,220.9 209.88,220.78 209.88,220.78 C209.88,220.78 209.84,220.67 209.84,220.67 C209.84,220.67 209.81,220.54 209.81,220.54 C209.81,220.54 209.78,220.42 209.78,220.42 C209.78,220.42 209.76,220.3 209.76,220.3 C209.76,220.3 209.73,220.18 209.73,220.18 C209.73,220.18 209.71,220.05 209.71,220.05 C209.71,220.05 209.68,219.93 209.68,219.93 C209.68,219.93 209.66,219.81 209.66,219.81 C209.66,219.81 209.64,219.68 209.64,219.68 C209.64,219.68 209.62,219.56 209.62,219.56 C209.62,219.56 209.61,219.43 209.61,219.43 C209.61,219.43 209.59,219.31 209.59,219.31 C209.59,219.31 209.59,219.18 209.59,219.18 C209.59,219.18 209.58,219.06 209.58,219.06 C209.58,219.06 209.58,218.93 209.58,218.93 C209.58,218.93 209.57,218.81 209.57,218.81 C209.57,218.81 209.56,218.68 209.56,218.68 C209.56,218.68 209.56,218.56 209.56,218.56 C209.56,218.56 209.56,218.43 209.56,218.43 C209.56,218.43 209.57,218.3 209.57,218.3 C209.57,218.3 209.58,218.18 209.58,218.18 C209.58,218.18 209.58,218.05 209.58,218.05 C209.58,218.05 209.59,217.93 209.59,217.93 C209.59,217.93 209.59,217.8 209.59,217.8 C209.59,217.8 209.61,217.68 209.61,217.68 C209.61,217.68 209.63,217.55 209.63,217.55 C209.63,217.55 209.65,217.43 209.65,217.43 C209.65,217.43 209.66,217.31 209.66,217.31 C209.66,217.31 209.68,217.18 209.68,217.18 C209.68,217.18 209.7,217.06 209.7,217.06 C209.7,217.06 209.73,216.93 209.73,216.93 C209.73,216.93 209.76,216.81 209.76,216.81 C209.76,216.81 209.79,216.69 209.79,216.69 C209.79,216.69 209.82,216.57 209.82,216.57 C209.82,216.57 209.85,216.45 209.85,216.45 C209.85,216.45 209.88,216.32 209.88,216.32 C209.88,216.32 209.91,216.2 209.91,216.2 C209.91,216.2 209.95,216.08 209.95,216.08 C209.95,216.08 210,215.97 210,215.97 C210,215.97 210.04,215.85 210.04,215.85 C210.04,215.85 210.08,215.73 210.08,215.73 C210.08,215.73 210.12,215.61 210.12,215.61 C210.12,215.61 210.17,215.49 210.17,215.49 C210.17,215.49 210.22,215.38 210.22,215.38 C210.22,215.38 210.27,215.27 210.27,215.27 C210.27,215.27 210.33,215.15 210.33,215.15 C210.33,215.15 210.38,215.04 210.38,215.04 C210.38,215.04 210.43,214.92 210.43,214.92 C210.43,214.92 210.49,214.81 210.49,214.81 C210.49,214.81 210.55,214.7 210.55,214.7 C210.55,214.7 210.61,214.6 210.61,214.6 C210.61,214.6 210.68,214.49 210.68,214.49 C210.68,214.49 210.74,214.38 210.74,214.38 C210.74,214.38 210.8,214.27 210.8,214.27 C210.8,214.27 210.87,214.17 210.87,214.17 C210.87,214.17 210.95,214.06 210.95,214.06 C210.95,214.06 211.02,213.96 211.02,213.96 C211.02,213.96 211.09,213.86 211.09,213.86 C211.09,213.86 211.16,213.76 211.16,213.76 C211.16,213.76 211.24,213.65 211.24,213.65 C211.24,213.65 211.32,213.56 211.32,213.56 C211.32,213.56 211.4,213.46 211.4,213.46 C211.4,213.46 211.48,213.37 211.48,213.37 C211.48,213.37 211.56,213.27 211.56,213.27 C211.56,213.27 211.64,213.18 211.64,213.18 C211.64,213.18 211.73,213.08 211.73,213.08 C211.73,213.08 211.82,212.99 211.82,212.99 C211.82,212.99 211.91,212.9 211.91,212.9 C211.91,212.9 212,212.82 212,212.82 C212,212.82 212.09,212.73 212.09,212.73 C212.09,212.73 212.18,212.64 212.18,212.64 C212.18,212.64 212.27,212.56 212.27,212.56 C212.27,212.56 212.36,212.48 212.36,212.48 C212.36,212.48 212.46,212.4 212.46,212.4 C212.46,212.4 212.56,212.32 212.56,212.32 C212.56,212.32 212.66,212.24 212.66,212.24 C212.66,212.24 212.76,212.16 212.76,212.16 C212.76,212.16 212.85,212.08 212.85,212.08 C212.85,212.08 212.96,212.02 212.96,212.02 C212.96,212.02 213.06,211.95 213.06,211.95 C213.06,211.95 213.17,211.88 213.17,211.88 C213.17,211.88 213.27,211.81 213.27,211.81 C213.27,211.81 213.38,211.74 213.38,211.74 C213.38,211.74 213.48,211.67 213.48,211.67 C213.48,211.67 213.6,211.61 213.6,211.61 C213.6,211.61 213.71,211.55 213.71,211.55 C213.71,211.55 213.82,211.49 213.82,211.49 C213.82,211.49 213.93,211.43 213.93,211.43 C213.93,211.43 214.04,211.37 214.04,211.37 C214.04,211.37 214.15,211.32 214.15,211.32 C214.15,211.32 214.27,211.27 214.27,211.27 C214.27,211.27 214.38,211.22 214.38,211.22 C214.38,211.22 214.5,211.17 214.5,211.17 C214.5,211.17 214.61,211.12 214.61,211.12 C214.61,211.12 214.73,211.07 214.73,211.07 C214.73,211.07 214.85,211.03 214.85,211.03 C214.85,211.03 214.97,210.99 214.97,210.99 C214.97,210.99 215.09,210.95 215.09,210.95 C215.09,210.95 215.21,210.92 215.21,210.92 C215.21,210.92 215.33,210.88 215.33,210.88 C215.33,210.88 215.45,210.84 215.45,210.84 C215.45,210.84 215.57,210.81 215.57,210.81 C215.57,210.81 215.69,210.78 215.69,210.78 C215.69,210.78 215.81,210.76 215.81,210.76 C215.81,210.76 215.93,210.73 215.93,210.73 C215.93,210.73 216.06,210.7 216.06,210.7 C216.06,210.7 216.18,210.68 216.18,210.68 C216.18,210.68 216.3,210.65 216.3,210.65 C216.3,210.65 216.43,210.64 216.43,210.64 C216.43,210.64 216.55,210.62 216.55,210.62 C216.55,210.62 216.68,210.61 216.68,210.61 C216.68,210.61 216.8,210.59 216.8,210.59 C216.8,210.59 216.93,210.59 216.93,210.59 C216.93,210.59 217.05,210.58 217.05,210.58 C217.05,210.58 217.18,210.58 217.18,210.58 C217.18,210.58 217.3,210.57 217.3,210.57 C217.3,210.57 217.43,210.56 217.43,210.56 C217.43,210.56 217.56,210.56 217.56,210.56 C217.56,210.56 217.68,210.56 217.68,210.56c " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.8,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="time_group"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateX" android:duration="500" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"/></set></aapt:attr></target></animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/pin_dot_shape_6_avd.xml b/packages/SystemUI/res/drawable/pin_dot_shape_6_avd.xml new file mode 100644 index 000000000000..e7ce4267fc32 --- /dev/null +++ b/packages/SystemUI/res/drawable/pin_dot_shape_6_avd.xml @@ -0,0 +1 @@ +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt"><aapt:attr name="android:drawable"><vector android:height="60dp" android:width="60dp" android:viewportHeight="60" android:viewportWidth="60"><group android:name="_R_G"><group android:name="_R_G_L_0_G" android:translateX="-187.543" android:translateY="-188.546"><path android:name="_R_G_L_0_G_D_0_P_0" android:fillColor="#ffffff" android:fillAlpha="0" android:fillType="nonZero" android:pathData=" M217.62 214.55 C217.62,214.55 217.68,214.55 217.68,214.55 C217.68,214.55 217.74,214.56 217.74,214.56 C217.74,214.56 217.81,214.56 217.81,214.56 C217.81,214.56 217.87,214.56 217.87,214.56 C217.87,214.56 217.93,214.57 217.93,214.57 C217.93,214.57 218,214.57 218,214.57 C218,214.57 218.06,214.58 218.06,214.58 C218.06,214.58 218.12,214.59 218.12,214.59 C218.12,214.59 218.18,214.6 218.18,214.6 C218.18,214.6 218.24,214.61 218.24,214.61 C218.24,214.61 218.31,214.62 218.31,214.62 C218.31,214.62 218.37,214.63 218.37,214.63 C218.37,214.63 218.43,214.65 218.43,214.65 C218.43,214.65 218.49,214.66 218.49,214.66 C218.49,214.66 218.55,214.68 218.55,214.68 C218.55,214.68 218.61,214.69 218.61,214.69 C218.61,214.69 218.67,214.71 218.67,214.71 C218.67,214.71 218.73,214.73 218.73,214.73 C218.73,214.73 218.79,214.75 218.79,214.75 C218.79,214.75 218.85,214.77 218.85,214.77 C218.85,214.77 218.91,214.79 218.91,214.79 C218.91,214.79 218.97,214.81 218.97,214.81 C218.97,214.81 219.03,214.83 219.03,214.83 C219.03,214.83 219.09,214.85 219.09,214.85 C219.09,214.85 219.15,214.88 219.15,214.88 C219.15,214.88 219.2,214.9 219.2,214.9 C219.2,214.9 219.26,214.93 219.26,214.93 C219.26,214.93 219.32,214.96 219.32,214.96 C219.32,214.96 219.37,214.98 219.37,214.98 C219.37,214.98 219.43,215.01 219.43,215.01 C219.43,215.01 219.48,215.05 219.48,215.05 C219.48,215.05 219.54,215.08 219.54,215.08 C219.54,215.08 219.59,215.11 219.59,215.11 C219.59,215.11 219.65,215.14 219.65,215.14 C219.65,215.14 219.7,215.17 219.7,215.17 C219.7,215.17 219.75,215.21 219.75,215.21 C219.75,215.21 219.81,215.24 219.81,215.24 C219.81,215.24 219.86,215.28 219.86,215.28 C219.86,215.28 219.91,215.32 219.91,215.32 C219.91,215.32 219.96,215.35 219.96,215.35 C219.96,215.35 220.01,215.39 220.01,215.39 C220.01,215.39 220.06,215.43 220.06,215.43 C220.06,215.43 220.11,215.47 220.11,215.47 C220.11,215.47 220.16,215.51 220.16,215.51 C220.16,215.51 220.2,215.55 220.2,215.55 C220.2,215.55 220.25,215.59 220.25,215.59 C220.25,215.59 220.3,215.63 220.3,215.63 C220.3,215.63 220.34,215.68 220.34,215.68 C220.34,215.68 220.39,215.72 220.39,215.72 C220.39,215.72 220.43,215.77 220.43,215.77 C220.43,215.77 220.47,215.81 220.47,215.81 C220.47,215.81 220.52,215.86 220.52,215.86 C220.52,215.86 220.56,215.9 220.56,215.9 C220.56,215.9 220.6,215.95 220.6,215.95 C220.6,215.95 220.64,216 220.64,216 C220.64,216 220.68,216.05 220.68,216.05 C220.68,216.05 220.72,216.1 220.72,216.1 C220.72,216.1 220.76,216.15 220.76,216.15 C220.76,216.15 220.8,216.2 220.8,216.2 C220.8,216.2 220.83,216.25 220.83,216.25 C220.83,216.25 220.87,216.3 220.87,216.3 C220.87,216.3 220.9,216.36 220.9,216.36 C220.9,216.36 220.94,216.41 220.94,216.41 C220.94,216.41 220.97,216.46 220.97,216.46 C220.97,216.46 221,216.51 221,216.51 C221,216.51 221.03,216.57 221.03,216.57 C221.03,216.57 221.06,216.63 221.06,216.63 C221.06,216.63 221.09,216.68 221.09,216.68 C221.09,216.68 221.12,216.74 221.12,216.74 C221.12,216.74 221.15,216.79 221.15,216.79 C221.15,216.79 221.18,216.85 221.18,216.85 C221.18,216.85 221.21,216.91 221.21,216.91 C221.21,216.91 221.23,216.96 221.23,216.96 C221.23,216.96 221.25,217.02 221.25,217.02 C221.25,217.02 221.28,217.08 221.28,217.08 C221.28,217.08 221.3,217.14 221.3,217.14 C221.3,217.14 221.33,217.2 221.33,217.2 C221.33,217.2 221.34,217.26 221.34,217.26 C221.34,217.26 221.36,217.32 221.36,217.32 C221.36,217.32 221.38,217.38 221.38,217.38 C221.38,217.38 221.4,217.44 221.4,217.44 C221.4,217.44 221.42,217.5 221.42,217.5 C221.42,217.5 221.44,217.56 221.44,217.56 C221.44,217.56 221.45,217.62 221.45,217.62 C221.45,217.62 221.46,217.68 221.46,217.68 C221.46,217.68 221.48,217.74 221.48,217.74 C221.48,217.74 221.49,217.8 221.49,217.8 C221.49,217.8 221.5,217.87 221.5,217.87 C221.5,217.87 221.51,217.93 221.51,217.93 C221.51,217.93 221.52,217.99 221.52,217.99 C221.52,217.99 221.53,218.05 221.53,218.05 C221.53,218.05 221.54,218.11 221.54,218.11 C221.54,218.11 221.54,218.18 221.54,218.18 C221.54,218.18 221.55,218.24 221.55,218.24 C221.55,218.24 221.55,218.3 221.55,218.3 C221.55,218.3 221.55,218.37 221.55,218.37 C221.55,218.37 221.56,218.43 221.56,218.43 C221.56,218.43 221.56,218.49 221.56,218.49 C221.56,218.49 221.56,218.55 221.56,218.55 C221.56,218.55 221.56,218.62 221.56,218.62 C221.56,218.62 221.56,218.68 221.56,218.68 C221.56,218.68 221.55,218.74 221.55,218.74 C221.55,218.74 221.55,218.81 221.55,218.81 C221.55,218.81 221.55,218.87 221.55,218.87 C221.55,218.87 221.54,218.93 221.54,218.93 C221.54,218.93 221.54,218.99 221.54,218.99 C221.54,218.99 221.53,219.06 221.53,219.06 C221.53,219.06 221.52,219.12 221.52,219.12 C221.52,219.12 221.51,219.18 221.51,219.18 C221.51,219.18 221.5,219.24 221.5,219.24 C221.5,219.24 221.49,219.3 221.49,219.3 C221.49,219.3 221.48,219.37 221.48,219.37 C221.48,219.37 221.46,219.43 221.46,219.43 C221.46,219.43 221.45,219.49 221.45,219.49 C221.45,219.49 221.43,219.55 221.43,219.55 C221.43,219.55 221.42,219.61 221.42,219.61 C221.42,219.61 221.4,219.67 221.4,219.67 C221.4,219.67 221.39,219.73 221.39,219.73 C221.39,219.73 221.37,219.79 221.37,219.79 C221.37,219.79 221.34,219.85 221.34,219.85 C221.34,219.85 221.32,219.91 221.32,219.91 C221.32,219.91 221.3,219.97 221.3,219.97 C221.3,219.97 221.28,220.03 221.28,220.03 C221.28,220.03 221.26,220.09 221.26,220.09 C221.26,220.09 221.23,220.14 221.23,220.14 C221.23,220.14 221.21,220.2 221.21,220.2 C221.21,220.2 221.18,220.26 221.18,220.26 C221.18,220.26 221.15,220.32 221.15,220.32 C221.15,220.32 221.13,220.37 221.13,220.37 C221.13,220.37 221.1,220.43 221.1,220.43 C221.1,220.43 221.07,220.48 221.07,220.48 C221.07,220.48 221.03,220.54 221.03,220.54 C221.03,220.54 221,220.59 221,220.59 C221,220.59 220.97,220.65 220.97,220.65 C220.97,220.65 220.94,220.7 220.94,220.7 C220.94,220.7 220.9,220.75 220.9,220.75 C220.9,220.75 220.87,220.8 220.87,220.8 C220.87,220.8 220.83,220.86 220.83,220.86 C220.83,220.86 220.8,220.91 220.8,220.91 C220.8,220.91 220.76,220.96 220.76,220.96 C220.76,220.96 220.72,221.01 220.72,221.01 C220.72,221.01 220.68,221.06 220.68,221.06 C220.68,221.06 220.64,221.11 220.64,221.11 C220.64,221.11 220.6,221.15 220.6,221.15 C220.6,221.15 220.56,221.2 220.56,221.2 C220.56,221.2 220.52,221.25 220.52,221.25 C220.52,221.25 220.48,221.3 220.48,221.3 C220.48,221.3 220.43,221.34 220.43,221.34 C220.43,221.34 220.39,221.38 220.39,221.38 C220.39,221.38 220.34,221.43 220.34,221.43 C220.34,221.43 220.3,221.47 220.3,221.47 C220.3,221.47 220.25,221.52 220.25,221.52 C220.25,221.52 220.21,221.56 220.21,221.56 C220.21,221.56 220.16,221.6 220.16,221.6 C220.16,221.6 220.11,221.64 220.11,221.64 C220.11,221.64 220.06,221.68 220.06,221.68 C220.06,221.68 220.01,221.72 220.01,221.72 C220.01,221.72 219.96,221.76 219.96,221.76 C219.96,221.76 219.91,221.8 219.91,221.8 C219.91,221.8 219.86,221.83 219.86,221.83 C219.86,221.83 219.81,221.87 219.81,221.87 C219.81,221.87 219.75,221.9 219.75,221.9 C219.75,221.9 219.7,221.93 219.7,221.93 C219.7,221.93 219.65,221.97 219.65,221.97 C219.65,221.97 219.6,222 219.6,222 C219.6,222 219.54,222.03 219.54,222.03 C219.54,222.03 219.49,222.06 219.49,222.06 C219.49,222.06 219.43,222.09 219.43,222.09 C219.43,222.09 219.37,222.12 219.37,222.12 C219.37,222.12 219.32,222.15 219.32,222.15 C219.32,222.15 219.26,222.18 219.26,222.18 C219.26,222.18 219.21,222.2 219.21,222.2 C219.21,222.2 219.15,222.23 219.15,222.23 C219.15,222.23 219.09,222.25 219.09,222.25 C219.09,222.25 219.03,222.28 219.03,222.28 C219.03,222.28 218.97,222.3 218.97,222.3 C218.97,222.3 218.91,222.32 218.91,222.32 C218.91,222.32 218.85,222.34 218.85,222.34 C218.85,222.34 218.79,222.36 218.79,222.36 C218.79,222.36 218.73,222.38 218.73,222.38 C218.73,222.38 218.67,222.4 218.67,222.4 C218.67,222.4 218.61,222.42 218.61,222.42 C218.61,222.42 218.55,222.44 218.55,222.44 C218.55,222.44 218.49,222.45 218.49,222.45 C218.49,222.45 218.43,222.46 218.43,222.46 C218.43,222.46 218.37,222.47 218.37,222.47 C218.37,222.47 218.31,222.49 218.31,222.49 C218.31,222.49 218.25,222.5 218.25,222.5 C218.25,222.5 218.18,222.51 218.18,222.51 C218.18,222.51 218.12,222.52 218.12,222.52 C218.12,222.52 218.06,222.53 218.06,222.53 C218.06,222.53 218,222.54 218,222.54 C218,222.54 217.93,222.54 217.93,222.54 C217.93,222.54 217.87,222.55 217.87,222.55 C217.87,222.55 217.81,222.55 217.81,222.55 C217.81,222.55 217.75,222.55 217.75,222.55 C217.75,222.55 217.68,222.56 217.68,222.56 C217.68,222.56 217.62,222.56 217.62,222.56 C217.62,222.56 217.56,222.56 217.56,222.56 C217.56,222.56 217.49,222.56 217.49,222.56 C217.49,222.56 217.43,222.56 217.43,222.56 C217.43,222.56 217.37,222.55 217.37,222.55 C217.37,222.55 217.3,222.55 217.3,222.55 C217.3,222.55 217.24,222.55 217.24,222.55 C217.24,222.55 217.18,222.54 217.18,222.54 C217.18,222.54 217.12,222.54 217.12,222.54 C217.12,222.54 217.05,222.53 217.05,222.53 C217.05,222.53 216.99,222.52 216.99,222.52 C216.99,222.52 216.93,222.51 216.93,222.51 C216.93,222.51 216.87,222.5 216.87,222.5 C216.87,222.5 216.81,222.49 216.81,222.49 C216.81,222.49 216.74,222.48 216.74,222.48 C216.74,222.48 216.68,222.46 216.68,222.46 C216.68,222.46 216.62,222.45 216.62,222.45 C216.62,222.45 216.56,222.43 216.56,222.43 C216.56,222.43 216.5,222.42 216.5,222.42 C216.5,222.42 216.44,222.4 216.44,222.4 C216.44,222.4 216.38,222.38 216.38,222.38 C216.38,222.38 216.32,222.36 216.32,222.36 C216.32,222.36 216.26,222.34 216.26,222.34 C216.26,222.34 216.2,222.32 216.2,222.32 C216.2,222.32 216.14,222.3 216.14,222.3 C216.14,222.3 216.08,222.28 216.08,222.28 C216.08,222.28 216.02,222.26 216.02,222.26 C216.02,222.26 215.97,222.23 215.97,222.23 C215.97,222.23 215.91,222.2 215.91,222.2 C215.91,222.2 215.85,222.18 215.85,222.18 C215.85,222.18 215.79,222.15 215.79,222.15 C215.79,222.15 215.74,222.12 215.74,222.12 C215.74,222.12 215.68,222.1 215.68,222.1 C215.68,222.1 215.63,222.06 215.63,222.06 C215.63,222.06 215.57,222.03 215.57,222.03 C215.57,222.03 215.52,222 215.52,222 C215.52,222 215.46,221.97 215.46,221.97 C215.46,221.97 215.41,221.94 215.41,221.94 C215.41,221.94 215.36,221.9 215.36,221.9 C215.36,221.9 215.31,221.87 215.31,221.87 C215.31,221.87 215.25,221.83 215.25,221.83 C215.25,221.83 215.2,221.79 215.2,221.79 C215.2,221.79 215.15,221.76 215.15,221.76 C215.15,221.76 215.1,221.72 215.1,221.72 C215.1,221.72 215.05,221.68 215.05,221.68 C215.05,221.68 215,221.64 215,221.64 C215,221.64 214.96,221.6 214.96,221.6 C214.96,221.6 214.91,221.56 214.91,221.56 C214.91,221.56 214.86,221.52 214.86,221.52 C214.86,221.52 214.81,221.48 214.81,221.48 C214.81,221.48 214.77,221.43 214.77,221.43 C214.77,221.43 214.73,221.39 214.73,221.39 C214.73,221.39 214.68,221.34 214.68,221.34 C214.68,221.34 214.64,221.3 214.64,221.3 C214.64,221.3 214.59,221.25 214.59,221.25 C214.59,221.25 214.55,221.2 214.55,221.2 C214.55,221.2 214.51,221.15 214.51,221.15 C214.51,221.15 214.47,221.11 214.47,221.11 C214.47,221.11 214.43,221.06 214.43,221.06 C214.43,221.06 214.39,221.01 214.39,221.01 C214.39,221.01 214.35,220.96 214.35,220.96 C214.35,220.96 214.31,220.91 214.31,220.91 C214.31,220.91 214.28,220.86 214.28,220.86 C214.28,220.86 214.25,220.81 214.25,220.81 C214.25,220.81 214.21,220.75 214.21,220.75 C214.21,220.75 214.18,220.7 214.18,220.7 C214.18,220.7 214.14,220.65 214.14,220.65 C214.14,220.65 214.11,220.59 214.11,220.59 C214.11,220.59 214.08,220.54 214.08,220.54 C214.08,220.54 214.05,220.48 214.05,220.48 C214.05,220.48 214.02,220.43 214.02,220.43 C214.02,220.43 213.99,220.37 213.99,220.37 C213.99,220.37 213.96,220.32 213.96,220.32 C213.96,220.32 213.93,220.26 213.93,220.26 C213.93,220.26 213.91,220.2 213.91,220.2 C213.91,220.2 213.88,220.14 213.88,220.14 C213.88,220.14 213.86,220.09 213.86,220.09 C213.86,220.09 213.83,220.03 213.83,220.03 C213.83,220.03 213.81,219.97 213.81,219.97 C213.81,219.97 213.79,219.91 213.79,219.91 C213.79,219.91 213.77,219.85 213.77,219.85 C213.77,219.85 213.75,219.79 213.75,219.79 C213.75,219.79 213.73,219.73 213.73,219.73 C213.73,219.73 213.71,219.67 213.71,219.67 C213.71,219.67 213.69,219.61 213.69,219.61 C213.69,219.61 213.68,219.55 213.68,219.55 C213.68,219.55 213.66,219.49 213.66,219.49 C213.66,219.49 213.65,219.43 213.65,219.43 C213.65,219.43 213.64,219.37 213.64,219.37 C213.64,219.37 213.62,219.31 213.62,219.31 C213.62,219.31 213.61,219.24 213.61,219.24 C213.61,219.24 213.6,219.18 213.6,219.18 C213.6,219.18 213.59,219.12 213.59,219.12 C213.59,219.12 213.58,219.06 213.58,219.06 C213.58,219.06 213.57,218.99 213.57,218.99 C213.57,218.99 213.57,218.93 213.57,218.93 C213.57,218.93 213.56,218.87 213.56,218.87 C213.56,218.87 213.56,218.81 213.56,218.81 C213.56,218.81 213.56,218.74 213.56,218.74 C213.56,218.74 213.56,218.68 213.56,218.68 C213.56,218.68 213.55,218.62 213.55,218.62 C213.55,218.62 213.55,218.55 213.55,218.55 C213.55,218.55 213.55,218.49 213.55,218.49 C213.55,218.49 213.56,218.43 213.56,218.43 C213.56,218.43 213.56,218.37 213.56,218.37 C213.56,218.37 213.56,218.3 213.56,218.3 C213.56,218.3 213.56,218.24 213.56,218.24 C213.56,218.24 213.57,218.18 213.57,218.18 C213.57,218.18 213.57,218.12 213.57,218.12 C213.57,218.12 213.58,218.05 213.58,218.05 C213.58,218.05 213.59,217.99 213.59,217.99 C213.59,217.99 213.6,217.93 213.6,217.93 C213.6,217.93 213.61,217.87 213.61,217.87 C213.61,217.87 213.62,217.8 213.62,217.8 C213.62,217.8 213.63,217.74 213.63,217.74 C213.63,217.74 213.65,217.68 213.65,217.68 C213.65,217.68 213.66,217.62 213.66,217.62 C213.66,217.62 213.68,217.56 213.68,217.56 C213.68,217.56 213.69,217.5 213.69,217.5 C213.69,217.5 213.71,217.44 213.71,217.44 C213.71,217.44 213.73,217.38 213.73,217.38 C213.73,217.38 213.75,217.32 213.75,217.32 C213.75,217.32 213.77,217.26 213.77,217.26 C213.77,217.26 213.79,217.2 213.79,217.2 C213.79,217.2 213.81,217.14 213.81,217.14 C213.81,217.14 213.83,217.08 213.83,217.08 C213.83,217.08 213.85,217.02 213.85,217.02 C213.85,217.02 213.88,216.96 213.88,216.96 C213.88,216.96 213.91,216.91 213.91,216.91 C213.91,216.91 213.93,216.85 213.93,216.85 C213.93,216.85 213.96,216.79 213.96,216.79 C213.96,216.79 213.99,216.74 213.99,216.74 C213.99,216.74 214.02,216.68 214.02,216.68 C214.02,216.68 214.05,216.63 214.05,216.63 C214.05,216.63 214.08,216.57 214.08,216.57 C214.08,216.57 214.11,216.52 214.11,216.52 C214.11,216.52 214.14,216.46 214.14,216.46 C214.14,216.46 214.17,216.41 214.17,216.41 C214.17,216.41 214.21,216.36 214.21,216.36 C214.21,216.36 214.24,216.3 214.24,216.3 C214.24,216.3 214.28,216.25 214.28,216.25 C214.28,216.25 214.32,216.2 214.32,216.2 C214.32,216.2 214.35,216.15 214.35,216.15 C214.35,216.15 214.39,216.1 214.39,216.1 C214.39,216.1 214.43,216.05 214.43,216.05 C214.43,216.05 214.47,216 214.47,216 C214.47,216 214.51,215.96 214.51,215.96 C214.51,215.96 214.55,215.91 214.55,215.91 C214.55,215.91 214.59,215.86 214.59,215.86 C214.59,215.86 214.64,215.81 214.64,215.81 C214.64,215.81 214.68,215.77 214.68,215.77 C214.68,215.77 214.73,215.72 214.73,215.72 C214.73,215.72 214.77,215.68 214.77,215.68 C214.77,215.68 214.82,215.64 214.82,215.64 C214.82,215.64 214.86,215.59 214.86,215.59 C214.86,215.59 214.91,215.55 214.91,215.55 C214.91,215.55 214.96,215.51 214.96,215.51 C214.96,215.51 215,215.47 215,215.47 C215,215.47 215.05,215.43 215.05,215.43 C215.05,215.43 215.1,215.39 215.1,215.39 C215.1,215.39 215.15,215.35 215.15,215.35 C215.15,215.35 215.2,215.31 215.2,215.31 C215.2,215.31 215.25,215.28 215.25,215.28 C215.25,215.28 215.31,215.24 215.31,215.24 C215.31,215.24 215.36,215.21 215.36,215.21 C215.36,215.21 215.41,215.17 215.41,215.17 C215.41,215.17 215.46,215.14 215.46,215.14 C215.46,215.14 215.52,215.11 215.52,215.11 C215.52,215.11 215.57,215.08 215.57,215.08 C215.57,215.08 215.63,215.05 215.63,215.05 C215.63,215.05 215.68,215.02 215.68,215.02 C215.68,215.02 215.74,214.99 215.74,214.99 C215.74,214.99 215.79,214.96 215.79,214.96 C215.79,214.96 215.85,214.93 215.85,214.93 C215.85,214.93 215.91,214.9 215.91,214.9 C215.91,214.9 215.97,214.88 215.97,214.88 C215.97,214.88 216.02,214.86 216.02,214.86 C216.02,214.86 216.08,214.83 216.08,214.83 C216.08,214.83 216.14,214.81 216.14,214.81 C216.14,214.81 216.2,214.78 216.2,214.78 C216.2,214.78 216.26,214.77 216.26,214.77 C216.26,214.77 216.32,214.75 216.32,214.75 C216.32,214.75 216.38,214.73 216.38,214.73 C216.38,214.73 216.44,214.71 216.44,214.71 C216.44,214.71 216.5,214.69 216.5,214.69 C216.5,214.69 216.56,214.67 216.56,214.67 C216.56,214.67 216.62,214.66 216.62,214.66 C216.62,214.66 216.68,214.65 216.68,214.65 C216.68,214.65 216.74,214.63 216.74,214.63 C216.74,214.63 216.81,214.62 216.81,214.62 C216.81,214.62 216.87,214.61 216.87,214.61 C216.87,214.61 216.93,214.6 216.93,214.6 C216.93,214.6 216.99,214.59 216.99,214.59 C216.99,214.59 217.05,214.58 217.05,214.58 C217.05,214.58 217.12,214.57 217.12,214.57 C217.12,214.57 217.18,214.57 217.18,214.57 C217.18,214.57 217.24,214.56 217.24,214.56 C217.24,214.56 217.3,214.56 217.3,214.56 C217.3,214.56 217.37,214.56 217.37,214.56 C217.37,214.56 217.43,214.55 217.43,214.55 C217.43,214.55 217.49,214.55 217.49,214.55 C217.49,214.55 217.56,214.55 217.56,214.55 C217.56,214.55 217.62,214.55 217.62,214.55c "/></group></group><group android:name="time_group"/></vector></aapt:attr><target android:name="_R_G_L_0_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="fillAlpha" android:duration="33" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="_R_G_L_0_G_D_0_P_0"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="pathData" android:duration="67" android:startOffset="0" android:valueFrom="M217.62 214.55 C217.62,214.55 217.68,214.55 217.68,214.55 C217.68,214.55 217.74,214.56 217.74,214.56 C217.74,214.56 217.81,214.56 217.81,214.56 C217.81,214.56 217.87,214.56 217.87,214.56 C217.87,214.56 217.93,214.57 217.93,214.57 C217.93,214.57 218,214.57 218,214.57 C218,214.57 218.06,214.58 218.06,214.58 C218.06,214.58 218.12,214.59 218.12,214.59 C218.12,214.59 218.18,214.6 218.18,214.6 C218.18,214.6 218.24,214.61 218.24,214.61 C218.24,214.61 218.31,214.62 218.31,214.62 C218.31,214.62 218.37,214.63 218.37,214.63 C218.37,214.63 218.43,214.65 218.43,214.65 C218.43,214.65 218.49,214.66 218.49,214.66 C218.49,214.66 218.55,214.68 218.55,214.68 C218.55,214.68 218.61,214.69 218.61,214.69 C218.61,214.69 218.67,214.71 218.67,214.71 C218.67,214.71 218.73,214.73 218.73,214.73 C218.73,214.73 218.79,214.75 218.79,214.75 C218.79,214.75 218.85,214.77 218.85,214.77 C218.85,214.77 218.91,214.79 218.91,214.79 C218.91,214.79 218.97,214.81 218.97,214.81 C218.97,214.81 219.03,214.83 219.03,214.83 C219.03,214.83 219.09,214.85 219.09,214.85 C219.09,214.85 219.15,214.88 219.15,214.88 C219.15,214.88 219.2,214.9 219.2,214.9 C219.2,214.9 219.26,214.93 219.26,214.93 C219.26,214.93 219.32,214.96 219.32,214.96 C219.32,214.96 219.37,214.98 219.37,214.98 C219.37,214.98 219.43,215.01 219.43,215.01 C219.43,215.01 219.48,215.05 219.48,215.05 C219.48,215.05 219.54,215.08 219.54,215.08 C219.54,215.08 219.59,215.11 219.59,215.11 C219.59,215.11 219.65,215.14 219.65,215.14 C219.65,215.14 219.7,215.17 219.7,215.17 C219.7,215.17 219.75,215.21 219.75,215.21 C219.75,215.21 219.81,215.24 219.81,215.24 C219.81,215.24 219.86,215.28 219.86,215.28 C219.86,215.28 219.91,215.32 219.91,215.32 C219.91,215.32 219.96,215.35 219.96,215.35 C219.96,215.35 220.01,215.39 220.01,215.39 C220.01,215.39 220.06,215.43 220.06,215.43 C220.06,215.43 220.11,215.47 220.11,215.47 C220.11,215.47 220.16,215.51 220.16,215.51 C220.16,215.51 220.2,215.55 220.2,215.55 C220.2,215.55 220.25,215.59 220.25,215.59 C220.25,215.59 220.3,215.63 220.3,215.63 C220.3,215.63 220.34,215.68 220.34,215.68 C220.34,215.68 220.39,215.72 220.39,215.72 C220.39,215.72 220.43,215.77 220.43,215.77 C220.43,215.77 220.47,215.81 220.47,215.81 C220.47,215.81 220.52,215.86 220.52,215.86 C220.52,215.86 220.56,215.9 220.56,215.9 C220.56,215.9 220.6,215.95 220.6,215.95 C220.6,215.95 220.64,216 220.64,216 C220.64,216 220.68,216.05 220.68,216.05 C220.68,216.05 220.72,216.1 220.72,216.1 C220.72,216.1 220.76,216.15 220.76,216.15 C220.76,216.15 220.8,216.2 220.8,216.2 C220.8,216.2 220.83,216.25 220.83,216.25 C220.83,216.25 220.87,216.3 220.87,216.3 C220.87,216.3 220.9,216.36 220.9,216.36 C220.9,216.36 220.94,216.41 220.94,216.41 C220.94,216.41 220.97,216.46 220.97,216.46 C220.97,216.46 221,216.51 221,216.51 C221,216.51 221.03,216.57 221.03,216.57 C221.03,216.57 221.06,216.63 221.06,216.63 C221.06,216.63 221.09,216.68 221.09,216.68 C221.09,216.68 221.12,216.74 221.12,216.74 C221.12,216.74 221.15,216.79 221.15,216.79 C221.15,216.79 221.18,216.85 221.18,216.85 C221.18,216.85 221.21,216.91 221.21,216.91 C221.21,216.91 221.23,216.96 221.23,216.96 C221.23,216.96 221.25,217.02 221.25,217.02 C221.25,217.02 221.28,217.08 221.28,217.08 C221.28,217.08 221.3,217.14 221.3,217.14 C221.3,217.14 221.33,217.2 221.33,217.2 C221.33,217.2 221.34,217.26 221.34,217.26 C221.34,217.26 221.36,217.32 221.36,217.32 C221.36,217.32 221.38,217.38 221.38,217.38 C221.38,217.38 221.4,217.44 221.4,217.44 C221.4,217.44 221.42,217.5 221.42,217.5 C221.42,217.5 221.44,217.56 221.44,217.56 C221.44,217.56 221.45,217.62 221.45,217.62 C221.45,217.62 221.46,217.68 221.46,217.68 C221.46,217.68 221.48,217.74 221.48,217.74 C221.48,217.74 221.49,217.8 221.49,217.8 C221.49,217.8 221.5,217.87 221.5,217.87 C221.5,217.87 221.51,217.93 221.51,217.93 C221.51,217.93 221.52,217.99 221.52,217.99 C221.52,217.99 221.53,218.05 221.53,218.05 C221.53,218.05 221.54,218.11 221.54,218.11 C221.54,218.11 221.54,218.18 221.54,218.18 C221.54,218.18 221.55,218.24 221.55,218.24 C221.55,218.24 221.55,218.3 221.55,218.3 C221.55,218.3 221.55,218.37 221.55,218.37 C221.55,218.37 221.56,218.43 221.56,218.43 C221.56,218.43 221.56,218.49 221.56,218.49 C221.56,218.49 221.56,218.55 221.56,218.55 C221.56,218.55 221.56,218.62 221.56,218.62 C221.56,218.62 221.56,218.68 221.56,218.68 C221.56,218.68 221.55,218.74 221.55,218.74 C221.55,218.74 221.55,218.81 221.55,218.81 C221.55,218.81 221.55,218.87 221.55,218.87 C221.55,218.87 221.54,218.93 221.54,218.93 C221.54,218.93 221.54,218.99 221.54,218.99 C221.54,218.99 221.53,219.06 221.53,219.06 C221.53,219.06 221.52,219.12 221.52,219.12 C221.52,219.12 221.51,219.18 221.51,219.18 C221.51,219.18 221.5,219.24 221.5,219.24 C221.5,219.24 221.49,219.3 221.49,219.3 C221.49,219.3 221.48,219.37 221.48,219.37 C221.48,219.37 221.46,219.43 221.46,219.43 C221.46,219.43 221.45,219.49 221.45,219.49 C221.45,219.49 221.43,219.55 221.43,219.55 C221.43,219.55 221.42,219.61 221.42,219.61 C221.42,219.61 221.4,219.67 221.4,219.67 C221.4,219.67 221.39,219.73 221.39,219.73 C221.39,219.73 221.37,219.79 221.37,219.79 C221.37,219.79 221.34,219.85 221.34,219.85 C221.34,219.85 221.32,219.91 221.32,219.91 C221.32,219.91 221.3,219.97 221.3,219.97 C221.3,219.97 221.28,220.03 221.28,220.03 C221.28,220.03 221.26,220.09 221.26,220.09 C221.26,220.09 221.23,220.14 221.23,220.14 C221.23,220.14 221.21,220.2 221.21,220.2 C221.21,220.2 221.18,220.26 221.18,220.26 C221.18,220.26 221.15,220.32 221.15,220.32 C221.15,220.32 221.13,220.37 221.13,220.37 C221.13,220.37 221.1,220.43 221.1,220.43 C221.1,220.43 221.07,220.48 221.07,220.48 C221.07,220.48 221.03,220.54 221.03,220.54 C221.03,220.54 221,220.59 221,220.59 C221,220.59 220.97,220.65 220.97,220.65 C220.97,220.65 220.94,220.7 220.94,220.7 C220.94,220.7 220.9,220.75 220.9,220.75 C220.9,220.75 220.87,220.8 220.87,220.8 C220.87,220.8 220.83,220.86 220.83,220.86 C220.83,220.86 220.8,220.91 220.8,220.91 C220.8,220.91 220.76,220.96 220.76,220.96 C220.76,220.96 220.72,221.01 220.72,221.01 C220.72,221.01 220.68,221.06 220.68,221.06 C220.68,221.06 220.64,221.11 220.64,221.11 C220.64,221.11 220.6,221.15 220.6,221.15 C220.6,221.15 220.56,221.2 220.56,221.2 C220.56,221.2 220.52,221.25 220.52,221.25 C220.52,221.25 220.48,221.3 220.48,221.3 C220.48,221.3 220.43,221.34 220.43,221.34 C220.43,221.34 220.39,221.38 220.39,221.38 C220.39,221.38 220.34,221.43 220.34,221.43 C220.34,221.43 220.3,221.47 220.3,221.47 C220.3,221.47 220.25,221.52 220.25,221.52 C220.25,221.52 220.21,221.56 220.21,221.56 C220.21,221.56 220.16,221.6 220.16,221.6 C220.16,221.6 220.11,221.64 220.11,221.64 C220.11,221.64 220.06,221.68 220.06,221.68 C220.06,221.68 220.01,221.72 220.01,221.72 C220.01,221.72 219.96,221.76 219.96,221.76 C219.96,221.76 219.91,221.8 219.91,221.8 C219.91,221.8 219.86,221.83 219.86,221.83 C219.86,221.83 219.81,221.87 219.81,221.87 C219.81,221.87 219.75,221.9 219.75,221.9 C219.75,221.9 219.7,221.93 219.7,221.93 C219.7,221.93 219.65,221.97 219.65,221.97 C219.65,221.97 219.6,222 219.6,222 C219.6,222 219.54,222.03 219.54,222.03 C219.54,222.03 219.49,222.06 219.49,222.06 C219.49,222.06 219.43,222.09 219.43,222.09 C219.43,222.09 219.37,222.12 219.37,222.12 C219.37,222.12 219.32,222.15 219.32,222.15 C219.32,222.15 219.26,222.18 219.26,222.18 C219.26,222.18 219.21,222.2 219.21,222.2 C219.21,222.2 219.15,222.23 219.15,222.23 C219.15,222.23 219.09,222.25 219.09,222.25 C219.09,222.25 219.03,222.28 219.03,222.28 C219.03,222.28 218.97,222.3 218.97,222.3 C218.97,222.3 218.91,222.32 218.91,222.32 C218.91,222.32 218.85,222.34 218.85,222.34 C218.85,222.34 218.79,222.36 218.79,222.36 C218.79,222.36 218.73,222.38 218.73,222.38 C218.73,222.38 218.67,222.4 218.67,222.4 C218.67,222.4 218.61,222.42 218.61,222.42 C218.61,222.42 218.55,222.44 218.55,222.44 C218.55,222.44 218.49,222.45 218.49,222.45 C218.49,222.45 218.43,222.46 218.43,222.46 C218.43,222.46 218.37,222.47 218.37,222.47 C218.37,222.47 218.31,222.49 218.31,222.49 C218.31,222.49 218.25,222.5 218.25,222.5 C218.25,222.5 218.18,222.51 218.18,222.51 C218.18,222.51 218.12,222.52 218.12,222.52 C218.12,222.52 218.06,222.53 218.06,222.53 C218.06,222.53 218,222.54 218,222.54 C218,222.54 217.93,222.54 217.93,222.54 C217.93,222.54 217.87,222.55 217.87,222.55 C217.87,222.55 217.81,222.55 217.81,222.55 C217.81,222.55 217.75,222.55 217.75,222.55 C217.75,222.55 217.68,222.56 217.68,222.56 C217.68,222.56 217.62,222.56 217.62,222.56 C217.62,222.56 217.56,222.56 217.56,222.56 C217.56,222.56 217.49,222.56 217.49,222.56 C217.49,222.56 217.43,222.56 217.43,222.56 C217.43,222.56 217.37,222.55 217.37,222.55 C217.37,222.55 217.3,222.55 217.3,222.55 C217.3,222.55 217.24,222.55 217.24,222.55 C217.24,222.55 217.18,222.54 217.18,222.54 C217.18,222.54 217.12,222.54 217.12,222.54 C217.12,222.54 217.05,222.53 217.05,222.53 C217.05,222.53 216.99,222.52 216.99,222.52 C216.99,222.52 216.93,222.51 216.93,222.51 C216.93,222.51 216.87,222.5 216.87,222.5 C216.87,222.5 216.81,222.49 216.81,222.49 C216.81,222.49 216.74,222.48 216.74,222.48 C216.74,222.48 216.68,222.46 216.68,222.46 C216.68,222.46 216.62,222.45 216.62,222.45 C216.62,222.45 216.56,222.43 216.56,222.43 C216.56,222.43 216.5,222.42 216.5,222.42 C216.5,222.42 216.44,222.4 216.44,222.4 C216.44,222.4 216.38,222.38 216.38,222.38 C216.38,222.38 216.32,222.36 216.32,222.36 C216.32,222.36 216.26,222.34 216.26,222.34 C216.26,222.34 216.2,222.32 216.2,222.32 C216.2,222.32 216.14,222.3 216.14,222.3 C216.14,222.3 216.08,222.28 216.08,222.28 C216.08,222.28 216.02,222.26 216.02,222.26 C216.02,222.26 215.97,222.23 215.97,222.23 C215.97,222.23 215.91,222.2 215.91,222.2 C215.91,222.2 215.85,222.18 215.85,222.18 C215.85,222.18 215.79,222.15 215.79,222.15 C215.79,222.15 215.74,222.12 215.74,222.12 C215.74,222.12 215.68,222.1 215.68,222.1 C215.68,222.1 215.63,222.06 215.63,222.06 C215.63,222.06 215.57,222.03 215.57,222.03 C215.57,222.03 215.52,222 215.52,222 C215.52,222 215.46,221.97 215.46,221.97 C215.46,221.97 215.41,221.94 215.41,221.94 C215.41,221.94 215.36,221.9 215.36,221.9 C215.36,221.9 215.31,221.87 215.31,221.87 C215.31,221.87 215.25,221.83 215.25,221.83 C215.25,221.83 215.2,221.79 215.2,221.79 C215.2,221.79 215.15,221.76 215.15,221.76 C215.15,221.76 215.1,221.72 215.1,221.72 C215.1,221.72 215.05,221.68 215.05,221.68 C215.05,221.68 215,221.64 215,221.64 C215,221.64 214.96,221.6 214.96,221.6 C214.96,221.6 214.91,221.56 214.91,221.56 C214.91,221.56 214.86,221.52 214.86,221.52 C214.86,221.52 214.81,221.48 214.81,221.48 C214.81,221.48 214.77,221.43 214.77,221.43 C214.77,221.43 214.73,221.39 214.73,221.39 C214.73,221.39 214.68,221.34 214.68,221.34 C214.68,221.34 214.64,221.3 214.64,221.3 C214.64,221.3 214.59,221.25 214.59,221.25 C214.59,221.25 214.55,221.2 214.55,221.2 C214.55,221.2 214.51,221.15 214.51,221.15 C214.51,221.15 214.47,221.11 214.47,221.11 C214.47,221.11 214.43,221.06 214.43,221.06 C214.43,221.06 214.39,221.01 214.39,221.01 C214.39,221.01 214.35,220.96 214.35,220.96 C214.35,220.96 214.31,220.91 214.31,220.91 C214.31,220.91 214.28,220.86 214.28,220.86 C214.28,220.86 214.25,220.81 214.25,220.81 C214.25,220.81 214.21,220.75 214.21,220.75 C214.21,220.75 214.18,220.7 214.18,220.7 C214.18,220.7 214.14,220.65 214.14,220.65 C214.14,220.65 214.11,220.59 214.11,220.59 C214.11,220.59 214.08,220.54 214.08,220.54 C214.08,220.54 214.05,220.48 214.05,220.48 C214.05,220.48 214.02,220.43 214.02,220.43 C214.02,220.43 213.99,220.37 213.99,220.37 C213.99,220.37 213.96,220.32 213.96,220.32 C213.96,220.32 213.93,220.26 213.93,220.26 C213.93,220.26 213.91,220.2 213.91,220.2 C213.91,220.2 213.88,220.14 213.88,220.14 C213.88,220.14 213.86,220.09 213.86,220.09 C213.86,220.09 213.83,220.03 213.83,220.03 C213.83,220.03 213.81,219.97 213.81,219.97 C213.81,219.97 213.79,219.91 213.79,219.91 C213.79,219.91 213.77,219.85 213.77,219.85 C213.77,219.85 213.75,219.79 213.75,219.79 C213.75,219.79 213.73,219.73 213.73,219.73 C213.73,219.73 213.71,219.67 213.71,219.67 C213.71,219.67 213.69,219.61 213.69,219.61 C213.69,219.61 213.68,219.55 213.68,219.55 C213.68,219.55 213.66,219.49 213.66,219.49 C213.66,219.49 213.65,219.43 213.65,219.43 C213.65,219.43 213.64,219.37 213.64,219.37 C213.64,219.37 213.62,219.31 213.62,219.31 C213.62,219.31 213.61,219.24 213.61,219.24 C213.61,219.24 213.6,219.18 213.6,219.18 C213.6,219.18 213.59,219.12 213.59,219.12 C213.59,219.12 213.58,219.06 213.58,219.06 C213.58,219.06 213.57,218.99 213.57,218.99 C213.57,218.99 213.57,218.93 213.57,218.93 C213.57,218.93 213.56,218.87 213.56,218.87 C213.56,218.87 213.56,218.81 213.56,218.81 C213.56,218.81 213.56,218.74 213.56,218.74 C213.56,218.74 213.56,218.68 213.56,218.68 C213.56,218.68 213.55,218.62 213.55,218.62 C213.55,218.62 213.55,218.55 213.55,218.55 C213.55,218.55 213.55,218.49 213.55,218.49 C213.55,218.49 213.56,218.43 213.56,218.43 C213.56,218.43 213.56,218.37 213.56,218.37 C213.56,218.37 213.56,218.3 213.56,218.3 C213.56,218.3 213.56,218.24 213.56,218.24 C213.56,218.24 213.57,218.18 213.57,218.18 C213.57,218.18 213.57,218.12 213.57,218.12 C213.57,218.12 213.58,218.05 213.58,218.05 C213.58,218.05 213.59,217.99 213.59,217.99 C213.59,217.99 213.6,217.93 213.6,217.93 C213.6,217.93 213.61,217.87 213.61,217.87 C213.61,217.87 213.62,217.8 213.62,217.8 C213.62,217.8 213.63,217.74 213.63,217.74 C213.63,217.74 213.65,217.68 213.65,217.68 C213.65,217.68 213.66,217.62 213.66,217.62 C213.66,217.62 213.68,217.56 213.68,217.56 C213.68,217.56 213.69,217.5 213.69,217.5 C213.69,217.5 213.71,217.44 213.71,217.44 C213.71,217.44 213.73,217.38 213.73,217.38 C213.73,217.38 213.75,217.32 213.75,217.32 C213.75,217.32 213.77,217.26 213.77,217.26 C213.77,217.26 213.79,217.2 213.79,217.2 C213.79,217.2 213.81,217.14 213.81,217.14 C213.81,217.14 213.83,217.08 213.83,217.08 C213.83,217.08 213.85,217.02 213.85,217.02 C213.85,217.02 213.88,216.96 213.88,216.96 C213.88,216.96 213.91,216.91 213.91,216.91 C213.91,216.91 213.93,216.85 213.93,216.85 C213.93,216.85 213.96,216.79 213.96,216.79 C213.96,216.79 213.99,216.74 213.99,216.74 C213.99,216.74 214.02,216.68 214.02,216.68 C214.02,216.68 214.05,216.63 214.05,216.63 C214.05,216.63 214.08,216.57 214.08,216.57 C214.08,216.57 214.11,216.52 214.11,216.52 C214.11,216.52 214.14,216.46 214.14,216.46 C214.14,216.46 214.17,216.41 214.17,216.41 C214.17,216.41 214.21,216.36 214.21,216.36 C214.21,216.36 214.24,216.3 214.24,216.3 C214.24,216.3 214.28,216.25 214.28,216.25 C214.28,216.25 214.32,216.2 214.32,216.2 C214.32,216.2 214.35,216.15 214.35,216.15 C214.35,216.15 214.39,216.1 214.39,216.1 C214.39,216.1 214.43,216.05 214.43,216.05 C214.43,216.05 214.47,216 214.47,216 C214.47,216 214.51,215.96 214.51,215.96 C214.51,215.96 214.55,215.91 214.55,215.91 C214.55,215.91 214.59,215.86 214.59,215.86 C214.59,215.86 214.64,215.81 214.64,215.81 C214.64,215.81 214.68,215.77 214.68,215.77 C214.68,215.77 214.73,215.72 214.73,215.72 C214.73,215.72 214.77,215.68 214.77,215.68 C214.77,215.68 214.82,215.64 214.82,215.64 C214.82,215.64 214.86,215.59 214.86,215.59 C214.86,215.59 214.91,215.55 214.91,215.55 C214.91,215.55 214.96,215.51 214.96,215.51 C214.96,215.51 215,215.47 215,215.47 C215,215.47 215.05,215.43 215.05,215.43 C215.05,215.43 215.1,215.39 215.1,215.39 C215.1,215.39 215.15,215.35 215.15,215.35 C215.15,215.35 215.2,215.31 215.2,215.31 C215.2,215.31 215.25,215.28 215.25,215.28 C215.25,215.28 215.31,215.24 215.31,215.24 C215.31,215.24 215.36,215.21 215.36,215.21 C215.36,215.21 215.41,215.17 215.41,215.17 C215.41,215.17 215.46,215.14 215.46,215.14 C215.46,215.14 215.52,215.11 215.52,215.11 C215.52,215.11 215.57,215.08 215.57,215.08 C215.57,215.08 215.63,215.05 215.63,215.05 C215.63,215.05 215.68,215.02 215.68,215.02 C215.68,215.02 215.74,214.99 215.74,214.99 C215.74,214.99 215.79,214.96 215.79,214.96 C215.79,214.96 215.85,214.93 215.85,214.93 C215.85,214.93 215.91,214.9 215.91,214.9 C215.91,214.9 215.97,214.88 215.97,214.88 C215.97,214.88 216.02,214.86 216.02,214.86 C216.02,214.86 216.08,214.83 216.08,214.83 C216.08,214.83 216.14,214.81 216.14,214.81 C216.14,214.81 216.2,214.78 216.2,214.78 C216.2,214.78 216.26,214.77 216.26,214.77 C216.26,214.77 216.32,214.75 216.32,214.75 C216.32,214.75 216.38,214.73 216.38,214.73 C216.38,214.73 216.44,214.71 216.44,214.71 C216.44,214.71 216.5,214.69 216.5,214.69 C216.5,214.69 216.56,214.67 216.56,214.67 C216.56,214.67 216.62,214.66 216.62,214.66 C216.62,214.66 216.68,214.65 216.68,214.65 C216.68,214.65 216.74,214.63 216.74,214.63 C216.74,214.63 216.81,214.62 216.81,214.62 C216.81,214.62 216.87,214.61 216.87,214.61 C216.87,214.61 216.93,214.6 216.93,214.6 C216.93,214.6 216.99,214.59 216.99,214.59 C216.99,214.59 217.05,214.58 217.05,214.58 C217.05,214.58 217.12,214.57 217.12,214.57 C217.12,214.57 217.18,214.57 217.18,214.57 C217.18,214.57 217.24,214.56 217.24,214.56 C217.24,214.56 217.3,214.56 217.3,214.56 C217.3,214.56 217.37,214.56 217.37,214.56 C217.37,214.56 217.43,214.55 217.43,214.55 C217.43,214.55 217.49,214.55 217.49,214.55 C217.49,214.55 217.56,214.55 217.56,214.55 C217.56,214.55 217.62,214.55 217.62,214.55c " android:valueTo="M217.7 202.08 C217.7,202.08 217.97,202.09 217.97,202.09 C217.97,202.09 218.23,202.13 218.23,202.13 C218.23,202.13 218.49,202.16 218.49,202.16 C218.49,202.16 218.75,202.22 218.75,202.22 C218.75,202.22 219.01,202.28 219.01,202.28 C219.01,202.28 219.26,202.36 219.26,202.36 C219.26,202.36 219.51,202.44 219.51,202.44 C219.51,202.44 219.75,202.54 219.75,202.54 C219.75,202.54 219.99,202.65 219.99,202.65 C219.99,202.65 220.23,202.77 220.23,202.77 C220.23,202.77 220.46,202.9 220.46,202.9 C220.46,202.9 220.68,203.05 220.68,203.05 C220.68,203.05 220.9,203.2 220.9,203.2 C220.9,203.2 221.11,203.35 221.11,203.35 C221.11,203.35 221.33,203.51 221.33,203.51 C221.33,203.51 221.54,203.66 221.54,203.66 C221.54,203.66 221.75,203.82 221.75,203.82 C221.75,203.82 221.97,203.97 221.97,203.97 C221.97,203.97 222.18,204.13 222.18,204.13 C222.18,204.13 222.4,204.28 222.4,204.28 C222.4,204.28 222.61,204.44 222.61,204.44 C222.61,204.44 222.83,204.59 222.83,204.59 C222.83,204.59 223.04,204.75 223.04,204.75 C223.04,204.75 223.25,204.9 223.25,204.9 C223.25,204.9 223.47,205.06 223.47,205.06 C223.47,205.06 223.68,205.21 223.68,205.21 C223.68,205.21 223.9,205.37 223.9,205.37 C223.9,205.37 224.11,205.52 224.11,205.52 C224.11,205.52 224.33,205.68 224.33,205.68 C224.33,205.68 224.54,205.83 224.54,205.83 C224.54,205.83 224.75,205.98 224.75,205.98 C224.75,205.98 224.97,206.14 224.97,206.14 C224.97,206.14 225.18,206.29 225.18,206.29 C225.18,206.29 225.4,206.45 225.4,206.45 C225.4,206.45 225.61,206.6 225.61,206.6 C225.61,206.6 225.83,206.76 225.83,206.76 C225.83,206.76 226.04,206.91 226.04,206.91 C226.04,206.91 226.25,207.07 226.25,207.07 C226.25,207.07 226.47,207.22 226.47,207.22 C226.47,207.22 226.68,207.38 226.68,207.38 C226.68,207.38 226.9,207.53 226.9,207.53 C226.9,207.53 227.11,207.69 227.11,207.69 C227.11,207.69 227.32,207.84 227.32,207.84 C227.32,207.84 227.54,208 227.54,208 C227.54,208 227.75,208.15 227.75,208.15 C227.75,208.15 227.96,208.31 227.96,208.31 C227.96,208.31 228.18,208.46 228.18,208.46 C228.18,208.46 228.39,208.62 228.39,208.62 C228.39,208.62 228.61,208.78 228.61,208.78 C228.61,208.78 228.82,208.93 228.82,208.93 C228.82,208.93 229.03,209.09 229.03,209.09 C229.03,209.09 229.25,209.24 229.25,209.24 C229.25,209.24 229.46,209.4 229.46,209.4 C229.46,209.4 229.67,209.55 229.67,209.55 C229.67,209.55 229.89,209.71 229.89,209.71 C229.89,209.71 230.1,209.86 230.1,209.86 C230.1,209.86 230.32,210.02 230.32,210.02 C230.32,210.02 230.53,210.17 230.53,210.17 C230.53,210.17 230.74,210.33 230.74,210.33 C230.74,210.33 230.96,210.49 230.96,210.49 C230.96,210.49 231.17,210.64 231.17,210.64 C231.17,210.64 231.38,210.8 231.38,210.8 C231.38,210.8 231.6,210.95 231.6,210.95 C231.6,210.95 231.81,211.11 231.81,211.11 C231.81,211.11 232.03,211.26 232.03,211.26 C232.03,211.26 232.24,211.42 232.24,211.42 C232.24,211.42 232.44,211.59 232.44,211.59 C232.44,211.59 232.65,211.75 232.65,211.75 C232.65,211.75 232.84,211.94 232.84,211.94 C232.84,211.94 233.03,212.12 233.03,212.12 C233.03,212.12 233.2,212.32 233.2,212.32 C233.2,212.32 233.37,212.53 233.37,212.53 C233.37,212.53 233.52,212.74 233.52,212.74 C233.52,212.74 233.67,212.96 233.67,212.96 C233.67,212.96 233.8,213.19 233.8,213.19 C233.8,213.19 233.93,213.42 233.93,213.42 C233.93,213.42 234.04,213.66 234.04,213.66 C234.04,213.66 234.14,213.9 234.14,213.9 C234.14,213.9 234.24,214.15 234.24,214.15 C234.24,214.15 234.31,214.4 234.31,214.4 C234.31,214.4 234.39,214.66 234.39,214.66 C234.39,214.66 234.44,214.92 234.44,214.92 C234.44,214.92 234.49,215.18 234.49,215.18 C234.49,215.18 234.51,215.44 234.51,215.44 C234.51,215.44 234.54,215.7 234.54,215.7 C234.54,215.7 234.54,215.96 234.54,215.96 C234.54,215.96 234.54,216.23 234.54,216.23 C234.54,216.23 234.52,216.49 234.52,216.49 C234.52,216.49 234.49,216.76 234.49,216.76 C234.49,216.76 234.46,217.02 234.46,217.02 C234.46,217.02 234.4,217.28 234.4,217.28 C234.4,217.28 234.34,217.53 234.34,217.53 C234.34,217.53 234.26,217.79 234.26,217.79 C234.26,217.79 234.18,218.04 234.18,218.04 C234.18,218.04 234.1,218.29 234.1,218.29 C234.1,218.29 234.02,218.54 234.02,218.54 C234.02,218.54 233.94,218.79 233.94,218.79 C233.94,218.79 233.86,219.04 233.86,219.04 C233.86,219.04 233.78,219.29 233.78,219.29 C233.78,219.29 233.69,219.55 233.69,219.55 C233.69,219.55 233.61,219.8 233.61,219.8 C233.61,219.8 233.53,220.05 233.53,220.05 C233.53,220.05 233.45,220.3 233.45,220.3 C233.45,220.3 233.37,220.55 233.37,220.55 C233.37,220.55 233.29,220.8 233.29,220.8 C233.29,220.8 233.21,221.05 233.21,221.05 C233.21,221.05 233.12,221.31 233.12,221.31 C233.12,221.31 233.04,221.56 233.04,221.56 C233.04,221.56 232.96,221.81 232.96,221.81 C232.96,221.81 232.88,222.06 232.88,222.06 C232.88,222.06 232.8,222.31 232.8,222.31 C232.8,222.31 232.72,222.56 232.72,222.56 C232.72,222.56 232.64,222.81 232.64,222.81 C232.64,222.81 232.55,223.07 232.55,223.07 C232.55,223.07 232.47,223.32 232.47,223.32 C232.47,223.32 232.39,223.57 232.39,223.57 C232.39,223.57 232.31,223.82 232.31,223.82 C232.31,223.82 232.23,224.07 232.23,224.07 C232.23,224.07 232.15,224.32 232.15,224.32 C232.15,224.32 232.06,224.57 232.06,224.57 C232.06,224.57 231.98,224.83 231.98,224.83 C231.98,224.83 231.9,225.08 231.9,225.08 C231.9,225.08 231.82,225.33 231.82,225.33 C231.82,225.33 231.74,225.58 231.74,225.58 C231.74,225.58 231.65,225.83 231.65,225.83 C231.65,225.83 231.57,226.08 231.57,226.08 C231.57,226.08 231.49,226.33 231.49,226.33 C231.49,226.33 231.41,226.58 231.41,226.58 C231.41,226.58 231.32,226.83 231.32,226.83 C231.32,226.83 231.24,227.08 231.24,227.08 C231.24,227.08 231.16,227.34 231.16,227.34 C231.16,227.34 231.08,227.59 231.08,227.59 C231.08,227.59 230.99,227.84 230.99,227.84 C230.99,227.84 230.91,228.09 230.91,228.09 C230.91,228.09 230.83,228.34 230.83,228.34 C230.83,228.34 230.75,228.59 230.75,228.59 C230.75,228.59 230.67,228.84 230.67,228.84 C230.67,228.84 230.58,229.09 230.58,229.09 C230.58,229.09 230.5,229.35 230.5,229.35 C230.5,229.35 230.42,229.6 230.42,229.6 C230.42,229.6 230.34,229.85 230.34,229.85 C230.34,229.85 230.25,230.1 230.25,230.1 C230.25,230.1 230.17,230.35 230.17,230.35 C230.17,230.35 230.09,230.6 230.09,230.6 C230.09,230.6 230.01,230.85 230.01,230.85 C230.01,230.85 229.92,231.1 229.92,231.1 C229.92,231.1 229.83,231.35 229.83,231.35 C229.83,231.35 229.73,231.6 229.73,231.6 C229.73,231.6 229.61,231.83 229.61,231.83 C229.61,231.83 229.49,232.07 229.49,232.07 C229.49,232.07 229.36,232.29 229.36,232.29 C229.36,232.29 229.21,232.52 229.21,232.52 C229.21,232.52 229.06,232.73 229.06,232.73 C229.06,232.73 228.89,232.94 228.89,232.94 C228.89,232.94 228.72,233.13 228.72,233.13 C228.72,233.13 228.54,233.32 228.54,233.32 C228.54,233.32 228.34,233.51 228.34,233.51 C228.34,233.51 228.14,233.68 228.14,233.68 C228.14,233.68 227.94,233.84 227.94,233.84 C227.94,233.84 227.72,233.99 227.72,233.99 C227.72,233.99 227.5,234.14 227.5,234.14 C227.5,234.14 227.27,234.27 227.27,234.27 C227.27,234.27 227.04,234.39 227.04,234.39 C227.04,234.39 226.79,234.5 226.79,234.5 C226.79,234.5 226.55,234.6 226.55,234.6 C226.55,234.6 226.3,234.68 226.3,234.68 C226.3,234.68 226.05,234.76 226.05,234.76 C226.05,234.76 225.79,234.82 225.79,234.82 C225.79,234.82 225.53,234.88 225.53,234.88 C225.53,234.88 225.27,234.92 225.27,234.92 C225.27,234.92 225.01,234.95 225.01,234.95 C225.01,234.95 224.74,234.96 224.74,234.96 C224.74,234.96 224.48,234.96 224.48,234.96 C224.48,234.96 224.22,234.96 224.22,234.96 C224.22,234.96 223.95,234.96 223.95,234.96 C223.95,234.96 223.69,234.96 223.69,234.96 C223.69,234.96 223.42,234.96 223.42,234.96 C223.42,234.96 223.16,234.96 223.16,234.96 C223.16,234.96 222.89,234.96 222.89,234.96 C222.89,234.96 222.63,234.96 222.63,234.96 C222.63,234.96 222.37,234.97 222.37,234.97 C222.37,234.97 222.1,234.97 222.1,234.97 C222.1,234.97 221.84,234.97 221.84,234.97 C221.84,234.97 221.57,234.97 221.57,234.97 C221.57,234.97 221.31,234.97 221.31,234.97 C221.31,234.97 221.04,234.97 221.04,234.97 C221.04,234.97 220.78,234.97 220.78,234.97 C220.78,234.97 220.52,234.97 220.52,234.97 C220.52,234.97 220.25,234.97 220.25,234.97 C220.25,234.97 219.99,234.97 219.99,234.97 C219.99,234.97 219.72,234.97 219.72,234.97 C219.72,234.97 219.46,234.97 219.46,234.97 C219.46,234.97 219.19,234.97 219.19,234.97 C219.19,234.97 218.93,234.97 218.93,234.97 C218.93,234.97 218.67,234.97 218.67,234.97 C218.67,234.97 218.4,234.97 218.4,234.97 C218.4,234.97 218.14,234.97 218.14,234.97 C218.14,234.97 217.87,234.97 217.87,234.97 C217.87,234.97 217.61,234.97 217.61,234.97 C217.61,234.97 217.34,234.97 217.34,234.97 C217.34,234.97 217.08,234.97 217.08,234.97 C217.08,234.97 216.82,234.97 216.82,234.97 C216.82,234.97 216.55,234.97 216.55,234.97 C216.55,234.97 216.29,234.97 216.29,234.97 C216.29,234.97 216.02,234.97 216.02,234.97 C216.02,234.97 215.76,234.97 215.76,234.97 C215.76,234.97 215.49,234.97 215.49,234.97 C215.49,234.97 215.23,234.97 215.23,234.97 C215.23,234.97 214.97,234.97 214.97,234.97 C214.97,234.97 214.7,234.97 214.7,234.97 C214.7,234.97 214.44,234.97 214.44,234.97 C214.44,234.97 214.17,234.97 214.17,234.97 C214.17,234.97 213.91,234.97 213.91,234.97 C213.91,234.97 213.64,234.97 213.64,234.97 C213.64,234.97 213.38,234.97 213.38,234.97 C213.38,234.97 213.12,234.97 213.12,234.97 C213.12,234.97 212.85,234.97 212.85,234.97 C212.85,234.97 212.59,234.96 212.59,234.96 C212.59,234.96 212.32,234.96 212.32,234.96 C212.32,234.96 212.06,234.96 212.06,234.96 C212.06,234.96 211.79,234.96 211.79,234.96 C211.79,234.96 211.53,234.96 211.53,234.96 C211.53,234.96 211.27,234.96 211.27,234.96 C211.27,234.96 211,234.96 211,234.96 C211,234.96 210.74,234.96 210.74,234.96 C210.74,234.96 210.47,234.96 210.47,234.96 C210.47,234.96 210.21,234.95 210.21,234.95 C210.21,234.95 209.94,234.93 209.94,234.93 C209.94,234.93 209.68,234.9 209.68,234.9 C209.68,234.9 209.42,234.86 209.42,234.86 C209.42,234.86 209.16,234.8 209.16,234.8 C209.16,234.8 208.91,234.74 208.91,234.74 C208.91,234.74 208.66,234.66 208.66,234.66 C208.66,234.66 208.41,234.56 208.41,234.56 C208.41,234.56 208.17,234.46 208.17,234.46 C208.17,234.46 207.93,234.35 207.93,234.35 C207.93,234.35 207.69,234.22 207.69,234.22 C207.69,234.22 207.47,234.08 207.47,234.08 C207.47,234.08 207.25,233.94 207.25,233.94 C207.25,233.94 207.04,233.78 207.04,233.78 C207.04,233.78 206.83,233.62 206.83,233.62 C206.83,233.62 206.63,233.44 206.63,233.44 C206.63,233.44 206.44,233.26 206.44,233.26 C206.44,233.26 206.27,233.06 206.27,233.06 C206.27,233.06 206.09,232.86 206.09,232.86 C206.09,232.86 205.93,232.65 205.93,232.65 C205.93,232.65 205.78,232.44 205.78,232.44 C205.78,232.44 205.64,232.21 205.64,232.21 C205.64,232.21 205.51,231.98 205.51,231.98 C205.51,231.98 205.39,231.75 205.39,231.75 C205.39,231.75 205.28,231.51 205.28,231.51 C205.28,231.51 205.18,231.26 205.18,231.26 C205.18,231.26 205.09,231.01 205.09,231.01 C205.09,231.01 205.01,230.76 205.01,230.76 C205.01,230.76 204.93,230.51 204.93,230.51 C204.93,230.51 204.85,230.26 204.85,230.26 C204.85,230.26 204.76,230.01 204.76,230.01 C204.76,230.01 204.68,229.76 204.68,229.76 C204.68,229.76 204.6,229.51 204.6,229.51 C204.6,229.51 204.52,229.26 204.52,229.26 C204.52,229.26 204.43,229.01 204.43,229.01 C204.43,229.01 204.35,228.75 204.35,228.75 C204.35,228.75 204.27,228.5 204.27,228.5 C204.27,228.5 204.19,228.25 204.19,228.25 C204.19,228.25 204.1,228 204.1,228 C204.1,228 204.02,227.75 204.02,227.75 C204.02,227.75 203.94,227.5 203.94,227.5 C203.94,227.5 203.86,227.25 203.86,227.25 C203.86,227.25 203.78,227 203.78,227 C203.78,227 203.69,226.74 203.69,226.74 C203.69,226.74 203.61,226.49 203.61,226.49 C203.61,226.49 203.53,226.24 203.53,226.24 C203.53,226.24 203.45,225.99 203.45,225.99 C203.45,225.99 203.36,225.74 203.36,225.74 C203.36,225.74 203.28,225.49 203.28,225.49 C203.28,225.49 203.2,225.24 203.2,225.24 C203.2,225.24 203.12,224.99 203.12,224.99 C203.12,224.99 203.03,224.74 203.03,224.74 C203.03,224.74 202.95,224.48 202.95,224.48 C202.95,224.48 202.87,224.23 202.87,224.23 C202.87,224.23 202.79,223.98 202.79,223.98 C202.79,223.98 202.71,223.73 202.71,223.73 C202.71,223.73 202.63,223.48 202.63,223.48 C202.63,223.48 202.54,223.23 202.54,223.23 C202.54,223.23 202.46,222.98 202.46,222.98 C202.46,222.98 202.38,222.72 202.38,222.72 C202.38,222.72 202.3,222.47 202.3,222.47 C202.3,222.47 202.22,222.22 202.22,222.22 C202.22,222.22 202.14,221.97 202.14,221.97 C202.14,221.97 202.06,221.72 202.06,221.72 C202.06,221.72 201.97,221.47 201.97,221.47 C201.97,221.47 201.89,221.22 201.89,221.22 C201.89,221.22 201.81,220.96 201.81,220.96 C201.81,220.96 201.73,220.71 201.73,220.71 C201.73,220.71 201.65,220.46 201.65,220.46 C201.65,220.46 201.57,220.21 201.57,220.21 C201.57,220.21 201.49,219.96 201.49,219.96 C201.49,219.96 201.4,219.71 201.4,219.71 C201.4,219.71 201.32,219.46 201.32,219.46 C201.32,219.46 201.24,219.2 201.24,219.2 C201.24,219.2 201.16,218.95 201.16,218.95 C201.16,218.95 201.08,218.7 201.08,218.7 C201.08,218.7 201,218.45 201,218.45 C201,218.45 200.92,218.2 200.92,218.2 C200.92,218.2 200.83,217.95 200.83,217.95 C200.83,217.95 200.76,217.7 200.76,217.7 C200.76,217.7 200.69,217.44 200.69,217.44 C200.69,217.44 200.62,217.18 200.62,217.18 C200.62,217.18 200.58,216.92 200.58,216.92 C200.58,216.92 200.54,216.66 200.54,216.66 C200.54,216.66 200.52,216.4 200.52,216.4 C200.52,216.4 200.5,216.14 200.5,216.14 C200.5,216.14 200.5,215.87 200.5,215.87 C200.5,215.87 200.52,215.61 200.52,215.61 C200.52,215.61 200.54,215.34 200.54,215.34 C200.54,215.34 200.58,215.08 200.58,215.08 C200.58,215.08 200.62,214.82 200.62,214.82 C200.62,214.82 200.69,214.57 200.69,214.57 C200.69,214.57 200.76,214.31 200.76,214.31 C200.76,214.31 200.84,214.06 200.84,214.06 C200.84,214.06 200.93,213.81 200.93,213.81 C200.93,213.81 201.05,213.57 201.05,213.57 C201.05,213.57 201.16,213.33 201.16,213.33 C201.16,213.33 201.29,213.11 201.29,213.11 C201.29,213.11 201.43,212.88 201.43,212.88 C201.43,212.88 201.58,212.67 201.58,212.67 C201.58,212.67 201.74,212.45 201.74,212.45 C201.74,212.45 201.91,212.25 201.91,212.25 C201.91,212.25 202.09,212.06 202.09,212.06 C202.09,212.06 202.27,211.87 202.27,211.87 C202.27,211.87 202.47,211.69 202.47,211.69 C202.47,211.69 202.67,211.52 202.67,211.52 C202.67,211.52 202.88,211.36 202.88,211.36 C202.88,211.36 203.1,211.21 203.1,211.21 C203.1,211.21 203.31,211.05 203.31,211.05 C203.31,211.05 203.52,210.9 203.52,210.9 C203.52,210.9 203.74,210.74 203.74,210.74 C203.74,210.74 203.95,210.58 203.95,210.58 C203.95,210.58 204.16,210.43 204.16,210.43 C204.16,210.43 204.38,210.27 204.38,210.27 C204.38,210.27 204.59,210.12 204.59,210.12 C204.59,210.12 204.81,209.96 204.81,209.96 C204.81,209.96 205.02,209.81 205.02,209.81 C205.02,209.81 205.23,209.65 205.23,209.65 C205.23,209.65 205.45,209.5 205.45,209.5 C205.45,209.5 205.66,209.34 205.66,209.34 C205.66,209.34 205.87,209.19 205.87,209.19 C205.87,209.19 206.09,209.03 206.09,209.03 C206.09,209.03 206.3,208.88 206.3,208.88 C206.3,208.88 206.52,208.72 206.52,208.72 C206.52,208.72 206.73,208.57 206.73,208.57 C206.73,208.57 206.94,208.41 206.94,208.41 C206.94,208.41 207.16,208.25 207.16,208.25 C207.16,208.25 207.37,208.1 207.37,208.1 C207.37,208.1 207.58,207.94 207.58,207.94 C207.58,207.94 207.8,207.79 207.8,207.79 C207.8,207.79 208.01,207.63 208.01,207.63 C208.01,207.63 208.23,207.48 208.23,207.48 C208.23,207.48 208.44,207.32 208.44,207.32 C208.44,207.32 208.65,207.17 208.65,207.17 C208.65,207.17 208.87,207.01 208.87,207.01 C208.87,207.01 209.08,206.86 209.08,206.86 C209.08,206.86 209.3,206.7 209.3,206.7 C209.3,206.7 209.51,206.55 209.51,206.55 C209.51,206.55 209.73,206.39 209.73,206.39 C209.73,206.39 209.94,206.24 209.94,206.24 C209.94,206.24 210.15,206.08 210.15,206.08 C210.15,206.08 210.37,205.93 210.37,205.93 C210.37,205.93 210.58,205.77 210.58,205.77 C210.58,205.77 210.8,205.62 210.8,205.62 C210.8,205.62 211.01,205.46 211.01,205.46 C211.01,205.46 211.23,205.31 211.23,205.31 C211.23,205.31 211.44,205.16 211.44,205.16 C211.44,205.16 211.65,205 211.65,205 C211.65,205 211.87,204.85 211.87,204.85 C211.87,204.85 212.08,204.69 212.08,204.69 C212.08,204.69 212.3,204.54 212.3,204.54 C212.3,204.54 212.51,204.38 212.51,204.38 C212.51,204.38 212.73,204.23 212.73,204.23 C212.73,204.23 212.94,204.07 212.94,204.07 C212.94,204.07 213.15,203.92 213.15,203.92 C213.15,203.92 213.37,203.76 213.37,203.76 C213.37,203.76 213.58,203.61 213.58,203.61 C213.58,203.61 213.8,203.45 213.8,203.45 C213.8,203.45 214.01,203.3 214.01,203.3 C214.01,203.3 214.23,203.14 214.23,203.14 C214.23,203.14 214.45,203 214.45,203 C214.45,203 214.67,202.86 214.67,202.86 C214.67,202.86 214.9,202.73 214.9,202.73 C214.9,202.73 215.14,202.61 215.14,202.61 C215.14,202.61 215.38,202.51 215.38,202.51 C215.38,202.51 215.63,202.41 215.63,202.41 C215.63,202.41 215.88,202.33 215.88,202.33 C215.88,202.33 216.13,202.26 216.13,202.26 C216.13,202.26 216.39,202.2 216.39,202.2 C216.39,202.2 216.65,202.15 216.65,202.15 C216.65,202.15 216.91,202.11 216.91,202.11 C216.91,202.11 217.18,202.09 217.18,202.09 C217.18,202.09 217.44,202.08 217.44,202.08 C217.44,202.08 217.7,202.08 217.7,202.08c " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.833,0.833 1.0,1.0"/></aapt:attr></objectAnimator><objectAnimator android:propertyName="pathData" android:duration="283" android:startOffset="67" android:valueFrom="M217.7 202.08 C217.7,202.08 217.97,202.09 217.97,202.09 C217.97,202.09 218.23,202.13 218.23,202.13 C218.23,202.13 218.49,202.16 218.49,202.16 C218.49,202.16 218.75,202.22 218.75,202.22 C218.75,202.22 219.01,202.28 219.01,202.28 C219.01,202.28 219.26,202.36 219.26,202.36 C219.26,202.36 219.51,202.44 219.51,202.44 C219.51,202.44 219.75,202.54 219.75,202.54 C219.75,202.54 219.99,202.65 219.99,202.65 C219.99,202.65 220.23,202.77 220.23,202.77 C220.23,202.77 220.46,202.9 220.46,202.9 C220.46,202.9 220.68,203.05 220.68,203.05 C220.68,203.05 220.9,203.2 220.9,203.2 C220.9,203.2 221.11,203.35 221.11,203.35 C221.11,203.35 221.33,203.51 221.33,203.51 C221.33,203.51 221.54,203.66 221.54,203.66 C221.54,203.66 221.75,203.82 221.75,203.82 C221.75,203.82 221.97,203.97 221.97,203.97 C221.97,203.97 222.18,204.13 222.18,204.13 C222.18,204.13 222.4,204.28 222.4,204.28 C222.4,204.28 222.61,204.44 222.61,204.44 C222.61,204.44 222.83,204.59 222.83,204.59 C222.83,204.59 223.04,204.75 223.04,204.75 C223.04,204.75 223.25,204.9 223.25,204.9 C223.25,204.9 223.47,205.06 223.47,205.06 C223.47,205.06 223.68,205.21 223.68,205.21 C223.68,205.21 223.9,205.37 223.9,205.37 C223.9,205.37 224.11,205.52 224.11,205.52 C224.11,205.52 224.33,205.68 224.33,205.68 C224.33,205.68 224.54,205.83 224.54,205.83 C224.54,205.83 224.75,205.98 224.75,205.98 C224.75,205.98 224.97,206.14 224.97,206.14 C224.97,206.14 225.18,206.29 225.18,206.29 C225.18,206.29 225.4,206.45 225.4,206.45 C225.4,206.45 225.61,206.6 225.61,206.6 C225.61,206.6 225.83,206.76 225.83,206.76 C225.83,206.76 226.04,206.91 226.04,206.91 C226.04,206.91 226.25,207.07 226.25,207.07 C226.25,207.07 226.47,207.22 226.47,207.22 C226.47,207.22 226.68,207.38 226.68,207.38 C226.68,207.38 226.9,207.53 226.9,207.53 C226.9,207.53 227.11,207.69 227.11,207.69 C227.11,207.69 227.32,207.84 227.32,207.84 C227.32,207.84 227.54,208 227.54,208 C227.54,208 227.75,208.15 227.75,208.15 C227.75,208.15 227.96,208.31 227.96,208.31 C227.96,208.31 228.18,208.46 228.18,208.46 C228.18,208.46 228.39,208.62 228.39,208.62 C228.39,208.62 228.61,208.78 228.61,208.78 C228.61,208.78 228.82,208.93 228.82,208.93 C228.82,208.93 229.03,209.09 229.03,209.09 C229.03,209.09 229.25,209.24 229.25,209.24 C229.25,209.24 229.46,209.4 229.46,209.4 C229.46,209.4 229.67,209.55 229.67,209.55 C229.67,209.55 229.89,209.71 229.89,209.71 C229.89,209.71 230.1,209.86 230.1,209.86 C230.1,209.86 230.32,210.02 230.32,210.02 C230.32,210.02 230.53,210.17 230.53,210.17 C230.53,210.17 230.74,210.33 230.74,210.33 C230.74,210.33 230.96,210.49 230.96,210.49 C230.96,210.49 231.17,210.64 231.17,210.64 C231.17,210.64 231.38,210.8 231.38,210.8 C231.38,210.8 231.6,210.95 231.6,210.95 C231.6,210.95 231.81,211.11 231.81,211.11 C231.81,211.11 232.03,211.26 232.03,211.26 C232.03,211.26 232.24,211.42 232.24,211.42 C232.24,211.42 232.44,211.59 232.44,211.59 C232.44,211.59 232.65,211.75 232.65,211.75 C232.65,211.75 232.84,211.94 232.84,211.94 C232.84,211.94 233.03,212.12 233.03,212.12 C233.03,212.12 233.2,212.32 233.2,212.32 C233.2,212.32 233.37,212.53 233.37,212.53 C233.37,212.53 233.52,212.74 233.52,212.74 C233.52,212.74 233.67,212.96 233.67,212.96 C233.67,212.96 233.8,213.19 233.8,213.19 C233.8,213.19 233.93,213.42 233.93,213.42 C233.93,213.42 234.04,213.66 234.04,213.66 C234.04,213.66 234.14,213.9 234.14,213.9 C234.14,213.9 234.24,214.15 234.24,214.15 C234.24,214.15 234.31,214.4 234.31,214.4 C234.31,214.4 234.39,214.66 234.39,214.66 C234.39,214.66 234.44,214.92 234.44,214.92 C234.44,214.92 234.49,215.18 234.49,215.18 C234.49,215.18 234.51,215.44 234.51,215.44 C234.51,215.44 234.54,215.7 234.54,215.7 C234.54,215.7 234.54,215.96 234.54,215.96 C234.54,215.96 234.54,216.23 234.54,216.23 C234.54,216.23 234.52,216.49 234.52,216.49 C234.52,216.49 234.49,216.76 234.49,216.76 C234.49,216.76 234.46,217.02 234.46,217.02 C234.46,217.02 234.4,217.28 234.4,217.28 C234.4,217.28 234.34,217.53 234.34,217.53 C234.34,217.53 234.26,217.79 234.26,217.79 C234.26,217.79 234.18,218.04 234.18,218.04 C234.18,218.04 234.1,218.29 234.1,218.29 C234.1,218.29 234.02,218.54 234.02,218.54 C234.02,218.54 233.94,218.79 233.94,218.79 C233.94,218.79 233.86,219.04 233.86,219.04 C233.86,219.04 233.78,219.29 233.78,219.29 C233.78,219.29 233.69,219.55 233.69,219.55 C233.69,219.55 233.61,219.8 233.61,219.8 C233.61,219.8 233.53,220.05 233.53,220.05 C233.53,220.05 233.45,220.3 233.45,220.3 C233.45,220.3 233.37,220.55 233.37,220.55 C233.37,220.55 233.29,220.8 233.29,220.8 C233.29,220.8 233.21,221.05 233.21,221.05 C233.21,221.05 233.12,221.31 233.12,221.31 C233.12,221.31 233.04,221.56 233.04,221.56 C233.04,221.56 232.96,221.81 232.96,221.81 C232.96,221.81 232.88,222.06 232.88,222.06 C232.88,222.06 232.8,222.31 232.8,222.31 C232.8,222.31 232.72,222.56 232.72,222.56 C232.72,222.56 232.64,222.81 232.64,222.81 C232.64,222.81 232.55,223.07 232.55,223.07 C232.55,223.07 232.47,223.32 232.47,223.32 C232.47,223.32 232.39,223.57 232.39,223.57 C232.39,223.57 232.31,223.82 232.31,223.82 C232.31,223.82 232.23,224.07 232.23,224.07 C232.23,224.07 232.15,224.32 232.15,224.32 C232.15,224.32 232.06,224.57 232.06,224.57 C232.06,224.57 231.98,224.83 231.98,224.83 C231.98,224.83 231.9,225.08 231.9,225.08 C231.9,225.08 231.82,225.33 231.82,225.33 C231.82,225.33 231.74,225.58 231.74,225.58 C231.74,225.58 231.65,225.83 231.65,225.83 C231.65,225.83 231.57,226.08 231.57,226.08 C231.57,226.08 231.49,226.33 231.49,226.33 C231.49,226.33 231.41,226.58 231.41,226.58 C231.41,226.58 231.32,226.83 231.32,226.83 C231.32,226.83 231.24,227.08 231.24,227.08 C231.24,227.08 231.16,227.34 231.16,227.34 C231.16,227.34 231.08,227.59 231.08,227.59 C231.08,227.59 230.99,227.84 230.99,227.84 C230.99,227.84 230.91,228.09 230.91,228.09 C230.91,228.09 230.83,228.34 230.83,228.34 C230.83,228.34 230.75,228.59 230.75,228.59 C230.75,228.59 230.67,228.84 230.67,228.84 C230.67,228.84 230.58,229.09 230.58,229.09 C230.58,229.09 230.5,229.35 230.5,229.35 C230.5,229.35 230.42,229.6 230.42,229.6 C230.42,229.6 230.34,229.85 230.34,229.85 C230.34,229.85 230.25,230.1 230.25,230.1 C230.25,230.1 230.17,230.35 230.17,230.35 C230.17,230.35 230.09,230.6 230.09,230.6 C230.09,230.6 230.01,230.85 230.01,230.85 C230.01,230.85 229.92,231.1 229.92,231.1 C229.92,231.1 229.83,231.35 229.83,231.35 C229.83,231.35 229.73,231.6 229.73,231.6 C229.73,231.6 229.61,231.83 229.61,231.83 C229.61,231.83 229.49,232.07 229.49,232.07 C229.49,232.07 229.36,232.29 229.36,232.29 C229.36,232.29 229.21,232.52 229.21,232.52 C229.21,232.52 229.06,232.73 229.06,232.73 C229.06,232.73 228.89,232.94 228.89,232.94 C228.89,232.94 228.72,233.13 228.72,233.13 C228.72,233.13 228.54,233.32 228.54,233.32 C228.54,233.32 228.34,233.51 228.34,233.51 C228.34,233.51 228.14,233.68 228.14,233.68 C228.14,233.68 227.94,233.84 227.94,233.84 C227.94,233.84 227.72,233.99 227.72,233.99 C227.72,233.99 227.5,234.14 227.5,234.14 C227.5,234.14 227.27,234.27 227.27,234.27 C227.27,234.27 227.04,234.39 227.04,234.39 C227.04,234.39 226.79,234.5 226.79,234.5 C226.79,234.5 226.55,234.6 226.55,234.6 C226.55,234.6 226.3,234.68 226.3,234.68 C226.3,234.68 226.05,234.76 226.05,234.76 C226.05,234.76 225.79,234.82 225.79,234.82 C225.79,234.82 225.53,234.88 225.53,234.88 C225.53,234.88 225.27,234.92 225.27,234.92 C225.27,234.92 225.01,234.95 225.01,234.95 C225.01,234.95 224.74,234.96 224.74,234.96 C224.74,234.96 224.48,234.96 224.48,234.96 C224.48,234.96 224.22,234.96 224.22,234.96 C224.22,234.96 223.95,234.96 223.95,234.96 C223.95,234.96 223.69,234.96 223.69,234.96 C223.69,234.96 223.42,234.96 223.42,234.96 C223.42,234.96 223.16,234.96 223.16,234.96 C223.16,234.96 222.89,234.96 222.89,234.96 C222.89,234.96 222.63,234.96 222.63,234.96 C222.63,234.96 222.37,234.97 222.37,234.97 C222.37,234.97 222.1,234.97 222.1,234.97 C222.1,234.97 221.84,234.97 221.84,234.97 C221.84,234.97 221.57,234.97 221.57,234.97 C221.57,234.97 221.31,234.97 221.31,234.97 C221.31,234.97 221.04,234.97 221.04,234.97 C221.04,234.97 220.78,234.97 220.78,234.97 C220.78,234.97 220.52,234.97 220.52,234.97 C220.52,234.97 220.25,234.97 220.25,234.97 C220.25,234.97 219.99,234.97 219.99,234.97 C219.99,234.97 219.72,234.97 219.72,234.97 C219.72,234.97 219.46,234.97 219.46,234.97 C219.46,234.97 219.19,234.97 219.19,234.97 C219.19,234.97 218.93,234.97 218.93,234.97 C218.93,234.97 218.67,234.97 218.67,234.97 C218.67,234.97 218.4,234.97 218.4,234.97 C218.4,234.97 218.14,234.97 218.14,234.97 C218.14,234.97 217.87,234.97 217.87,234.97 C217.87,234.97 217.61,234.97 217.61,234.97 C217.61,234.97 217.34,234.97 217.34,234.97 C217.34,234.97 217.08,234.97 217.08,234.97 C217.08,234.97 216.82,234.97 216.82,234.97 C216.82,234.97 216.55,234.97 216.55,234.97 C216.55,234.97 216.29,234.97 216.29,234.97 C216.29,234.97 216.02,234.97 216.02,234.97 C216.02,234.97 215.76,234.97 215.76,234.97 C215.76,234.97 215.49,234.97 215.49,234.97 C215.49,234.97 215.23,234.97 215.23,234.97 C215.23,234.97 214.97,234.97 214.97,234.97 C214.97,234.97 214.7,234.97 214.7,234.97 C214.7,234.97 214.44,234.97 214.44,234.97 C214.44,234.97 214.17,234.97 214.17,234.97 C214.17,234.97 213.91,234.97 213.91,234.97 C213.91,234.97 213.64,234.97 213.64,234.97 C213.64,234.97 213.38,234.97 213.38,234.97 C213.38,234.97 213.12,234.97 213.12,234.97 C213.12,234.97 212.85,234.97 212.85,234.97 C212.85,234.97 212.59,234.96 212.59,234.96 C212.59,234.96 212.32,234.96 212.32,234.96 C212.32,234.96 212.06,234.96 212.06,234.96 C212.06,234.96 211.79,234.96 211.79,234.96 C211.79,234.96 211.53,234.96 211.53,234.96 C211.53,234.96 211.27,234.96 211.27,234.96 C211.27,234.96 211,234.96 211,234.96 C211,234.96 210.74,234.96 210.74,234.96 C210.74,234.96 210.47,234.96 210.47,234.96 C210.47,234.96 210.21,234.95 210.21,234.95 C210.21,234.95 209.94,234.93 209.94,234.93 C209.94,234.93 209.68,234.9 209.68,234.9 C209.68,234.9 209.42,234.86 209.42,234.86 C209.42,234.86 209.16,234.8 209.16,234.8 C209.16,234.8 208.91,234.74 208.91,234.74 C208.91,234.74 208.66,234.66 208.66,234.66 C208.66,234.66 208.41,234.56 208.41,234.56 C208.41,234.56 208.17,234.46 208.17,234.46 C208.17,234.46 207.93,234.35 207.93,234.35 C207.93,234.35 207.69,234.22 207.69,234.22 C207.69,234.22 207.47,234.08 207.47,234.08 C207.47,234.08 207.25,233.94 207.25,233.94 C207.25,233.94 207.04,233.78 207.04,233.78 C207.04,233.78 206.83,233.62 206.83,233.62 C206.83,233.62 206.63,233.44 206.63,233.44 C206.63,233.44 206.44,233.26 206.44,233.26 C206.44,233.26 206.27,233.06 206.27,233.06 C206.27,233.06 206.09,232.86 206.09,232.86 C206.09,232.86 205.93,232.65 205.93,232.65 C205.93,232.65 205.78,232.44 205.78,232.44 C205.78,232.44 205.64,232.21 205.64,232.21 C205.64,232.21 205.51,231.98 205.51,231.98 C205.51,231.98 205.39,231.75 205.39,231.75 C205.39,231.75 205.28,231.51 205.28,231.51 C205.28,231.51 205.18,231.26 205.18,231.26 C205.18,231.26 205.09,231.01 205.09,231.01 C205.09,231.01 205.01,230.76 205.01,230.76 C205.01,230.76 204.93,230.51 204.93,230.51 C204.93,230.51 204.85,230.26 204.85,230.26 C204.85,230.26 204.76,230.01 204.76,230.01 C204.76,230.01 204.68,229.76 204.68,229.76 C204.68,229.76 204.6,229.51 204.6,229.51 C204.6,229.51 204.52,229.26 204.52,229.26 C204.52,229.26 204.43,229.01 204.43,229.01 C204.43,229.01 204.35,228.75 204.35,228.75 C204.35,228.75 204.27,228.5 204.27,228.5 C204.27,228.5 204.19,228.25 204.19,228.25 C204.19,228.25 204.1,228 204.1,228 C204.1,228 204.02,227.75 204.02,227.75 C204.02,227.75 203.94,227.5 203.94,227.5 C203.94,227.5 203.86,227.25 203.86,227.25 C203.86,227.25 203.78,227 203.78,227 C203.78,227 203.69,226.74 203.69,226.74 C203.69,226.74 203.61,226.49 203.61,226.49 C203.61,226.49 203.53,226.24 203.53,226.24 C203.53,226.24 203.45,225.99 203.45,225.99 C203.45,225.99 203.36,225.74 203.36,225.74 C203.36,225.74 203.28,225.49 203.28,225.49 C203.28,225.49 203.2,225.24 203.2,225.24 C203.2,225.24 203.12,224.99 203.12,224.99 C203.12,224.99 203.03,224.74 203.03,224.74 C203.03,224.74 202.95,224.48 202.95,224.48 C202.95,224.48 202.87,224.23 202.87,224.23 C202.87,224.23 202.79,223.98 202.79,223.98 C202.79,223.98 202.71,223.73 202.71,223.73 C202.71,223.73 202.63,223.48 202.63,223.48 C202.63,223.48 202.54,223.23 202.54,223.23 C202.54,223.23 202.46,222.98 202.46,222.98 C202.46,222.98 202.38,222.72 202.38,222.72 C202.38,222.72 202.3,222.47 202.3,222.47 C202.3,222.47 202.22,222.22 202.22,222.22 C202.22,222.22 202.14,221.97 202.14,221.97 C202.14,221.97 202.06,221.72 202.06,221.72 C202.06,221.72 201.97,221.47 201.97,221.47 C201.97,221.47 201.89,221.22 201.89,221.22 C201.89,221.22 201.81,220.96 201.81,220.96 C201.81,220.96 201.73,220.71 201.73,220.71 C201.73,220.71 201.65,220.46 201.65,220.46 C201.65,220.46 201.57,220.21 201.57,220.21 C201.57,220.21 201.49,219.96 201.49,219.96 C201.49,219.96 201.4,219.71 201.4,219.71 C201.4,219.71 201.32,219.46 201.32,219.46 C201.32,219.46 201.24,219.2 201.24,219.2 C201.24,219.2 201.16,218.95 201.16,218.95 C201.16,218.95 201.08,218.7 201.08,218.7 C201.08,218.7 201,218.45 201,218.45 C201,218.45 200.92,218.2 200.92,218.2 C200.92,218.2 200.83,217.95 200.83,217.95 C200.83,217.95 200.76,217.7 200.76,217.7 C200.76,217.7 200.69,217.44 200.69,217.44 C200.69,217.44 200.62,217.18 200.62,217.18 C200.62,217.18 200.58,216.92 200.58,216.92 C200.58,216.92 200.54,216.66 200.54,216.66 C200.54,216.66 200.52,216.4 200.52,216.4 C200.52,216.4 200.5,216.14 200.5,216.14 C200.5,216.14 200.5,215.87 200.5,215.87 C200.5,215.87 200.52,215.61 200.52,215.61 C200.52,215.61 200.54,215.34 200.54,215.34 C200.54,215.34 200.58,215.08 200.58,215.08 C200.58,215.08 200.62,214.82 200.62,214.82 C200.62,214.82 200.69,214.57 200.69,214.57 C200.69,214.57 200.76,214.31 200.76,214.31 C200.76,214.31 200.84,214.06 200.84,214.06 C200.84,214.06 200.93,213.81 200.93,213.81 C200.93,213.81 201.05,213.57 201.05,213.57 C201.05,213.57 201.16,213.33 201.16,213.33 C201.16,213.33 201.29,213.11 201.29,213.11 C201.29,213.11 201.43,212.88 201.43,212.88 C201.43,212.88 201.58,212.67 201.58,212.67 C201.58,212.67 201.74,212.45 201.74,212.45 C201.74,212.45 201.91,212.25 201.91,212.25 C201.91,212.25 202.09,212.06 202.09,212.06 C202.09,212.06 202.27,211.87 202.27,211.87 C202.27,211.87 202.47,211.69 202.47,211.69 C202.47,211.69 202.67,211.52 202.67,211.52 C202.67,211.52 202.88,211.36 202.88,211.36 C202.88,211.36 203.1,211.21 203.1,211.21 C203.1,211.21 203.31,211.05 203.31,211.05 C203.31,211.05 203.52,210.9 203.52,210.9 C203.52,210.9 203.74,210.74 203.74,210.74 C203.74,210.74 203.95,210.58 203.95,210.58 C203.95,210.58 204.16,210.43 204.16,210.43 C204.16,210.43 204.38,210.27 204.38,210.27 C204.38,210.27 204.59,210.12 204.59,210.12 C204.59,210.12 204.81,209.96 204.81,209.96 C204.81,209.96 205.02,209.81 205.02,209.81 C205.02,209.81 205.23,209.65 205.23,209.65 C205.23,209.65 205.45,209.5 205.45,209.5 C205.45,209.5 205.66,209.34 205.66,209.34 C205.66,209.34 205.87,209.19 205.87,209.19 C205.87,209.19 206.09,209.03 206.09,209.03 C206.09,209.03 206.3,208.88 206.3,208.88 C206.3,208.88 206.52,208.72 206.52,208.72 C206.52,208.72 206.73,208.57 206.73,208.57 C206.73,208.57 206.94,208.41 206.94,208.41 C206.94,208.41 207.16,208.25 207.16,208.25 C207.16,208.25 207.37,208.1 207.37,208.1 C207.37,208.1 207.58,207.94 207.58,207.94 C207.58,207.94 207.8,207.79 207.8,207.79 C207.8,207.79 208.01,207.63 208.01,207.63 C208.01,207.63 208.23,207.48 208.23,207.48 C208.23,207.48 208.44,207.32 208.44,207.32 C208.44,207.32 208.65,207.17 208.65,207.17 C208.65,207.17 208.87,207.01 208.87,207.01 C208.87,207.01 209.08,206.86 209.08,206.86 C209.08,206.86 209.3,206.7 209.3,206.7 C209.3,206.7 209.51,206.55 209.51,206.55 C209.51,206.55 209.73,206.39 209.73,206.39 C209.73,206.39 209.94,206.24 209.94,206.24 C209.94,206.24 210.15,206.08 210.15,206.08 C210.15,206.08 210.37,205.93 210.37,205.93 C210.37,205.93 210.58,205.77 210.58,205.77 C210.58,205.77 210.8,205.62 210.8,205.62 C210.8,205.62 211.01,205.46 211.01,205.46 C211.01,205.46 211.23,205.31 211.23,205.31 C211.23,205.31 211.44,205.16 211.44,205.16 C211.44,205.16 211.65,205 211.65,205 C211.65,205 211.87,204.85 211.87,204.85 C211.87,204.85 212.08,204.69 212.08,204.69 C212.08,204.69 212.3,204.54 212.3,204.54 C212.3,204.54 212.51,204.38 212.51,204.38 C212.51,204.38 212.73,204.23 212.73,204.23 C212.73,204.23 212.94,204.07 212.94,204.07 C212.94,204.07 213.15,203.92 213.15,203.92 C213.15,203.92 213.37,203.76 213.37,203.76 C213.37,203.76 213.58,203.61 213.58,203.61 C213.58,203.61 213.8,203.45 213.8,203.45 C213.8,203.45 214.01,203.3 214.01,203.3 C214.01,203.3 214.23,203.14 214.23,203.14 C214.23,203.14 214.45,203 214.45,203 C214.45,203 214.67,202.86 214.67,202.86 C214.67,202.86 214.9,202.73 214.9,202.73 C214.9,202.73 215.14,202.61 215.14,202.61 C215.14,202.61 215.38,202.51 215.38,202.51 C215.38,202.51 215.63,202.41 215.63,202.41 C215.63,202.41 215.88,202.33 215.88,202.33 C215.88,202.33 216.13,202.26 216.13,202.26 C216.13,202.26 216.39,202.2 216.39,202.2 C216.39,202.2 216.65,202.15 216.65,202.15 C216.65,202.15 216.91,202.11 216.91,202.11 C216.91,202.11 217.18,202.09 217.18,202.09 C217.18,202.09 217.44,202.08 217.44,202.08 C217.44,202.08 217.7,202.08 217.7,202.08c " android:valueTo="M217.68 210.56 C217.68,210.56 217.81,210.57 217.81,210.57 C217.81,210.57 217.93,210.57 217.93,210.57 C217.93,210.57 218.06,210.58 218.06,210.58 C218.06,210.58 218.18,210.59 218.18,210.59 C218.18,210.59 218.31,210.59 218.31,210.59 C218.31,210.59 218.43,210.61 218.43,210.61 C218.43,210.61 218.56,210.63 218.56,210.63 C218.56,210.63 218.68,210.64 218.68,210.64 C218.68,210.64 218.81,210.66 218.81,210.66 C218.81,210.66 218.93,210.68 218.93,210.68 C218.93,210.68 219.05,210.7 219.05,210.7 C219.05,210.7 219.18,210.72 219.18,210.72 C219.18,210.72 219.3,210.75 219.3,210.75 C219.3,210.75 219.42,210.78 219.42,210.78 C219.42,210.78 219.54,210.81 219.54,210.81 C219.54,210.81 219.66,210.84 219.66,210.84 C219.66,210.84 219.79,210.87 219.79,210.87 C219.79,210.87 219.91,210.91 219.91,210.91 C219.91,210.91 220.03,210.95 220.03,210.95 C220.03,210.95 220.14,210.99 220.14,210.99 C220.14,210.99 220.26,211.04 220.26,211.04 C220.26,211.04 220.38,211.08 220.38,211.08 C220.38,211.08 220.5,211.12 220.5,211.12 C220.5,211.12 220.62,211.17 220.62,211.17 C220.62,211.17 220.73,211.22 220.73,211.22 C220.73,211.22 220.84,211.27 220.84,211.27 C220.84,211.27 220.96,211.32 220.96,211.32 C220.96,211.32 221.07,211.38 221.07,211.38 C221.07,211.38 221.19,211.43 221.19,211.43 C221.19,211.43 221.3,211.49 221.3,211.49 C221.3,211.49 221.41,211.55 221.41,211.55 C221.41,211.55 221.51,211.61 221.51,211.61 C221.51,211.61 221.62,211.68 221.62,211.68 C221.62,211.68 221.73,211.74 221.73,211.74 C221.73,211.74 221.84,211.8 221.84,211.8 C221.84,211.8 221.94,211.87 221.94,211.87 C221.94,211.87 222.05,211.94 222.05,211.94 C222.05,211.94 222.15,212.02 222.15,212.02 C222.15,212.02 222.25,212.09 222.25,212.09 C222.25,212.09 222.35,212.16 222.35,212.16 C222.35,212.16 222.46,212.23 222.46,212.23 C222.46,212.23 222.55,212.31 222.55,212.31 C222.55,212.31 222.65,212.4 222.65,212.4 C222.65,212.4 222.74,212.48 222.74,212.48 C222.74,212.48 222.84,212.56 222.84,212.56 C222.84,212.56 222.93,212.64 222.93,212.64 C222.93,212.64 223.03,212.72 223.03,212.72 C223.03,212.72 223.12,212.81 223.12,212.81 C223.12,212.81 223.21,212.9 223.21,212.9 C223.21,212.9 223.29,212.99 223.29,212.99 C223.29,212.99 223.38,213.08 223.38,213.08 C223.38,213.08 223.47,213.17 223.47,213.17 C223.47,213.17 223.55,213.26 223.55,213.26 C223.55,213.26 223.63,213.36 223.63,213.36 C223.63,213.36 223.71,213.46 223.71,213.46 C223.71,213.46 223.79,213.56 223.79,213.56 C223.79,213.56 223.87,213.66 223.87,213.66 C223.87,213.66 223.95,213.75 223.95,213.75 C223.95,213.75 224.03,213.85 224.03,213.85 C224.03,213.85 224.09,213.96 224.09,213.96 C224.09,213.96 224.16,214.06 224.16,214.06 C224.16,214.06 224.23,214.17 224.23,214.17 C224.23,214.17 224.3,214.27 224.3,214.27 C224.3,214.27 224.37,214.38 224.37,214.38 C224.37,214.38 224.44,214.48 224.44,214.48 C224.44,214.48 224.5,214.59 224.5,214.59 C224.5,214.59 224.56,214.7 224.56,214.7 C224.56,214.7 224.62,214.81 224.62,214.81 C224.62,214.81 224.68,214.93 224.68,214.93 C224.68,214.93 224.74,215.04 224.74,215.04 C224.74,215.04 224.79,215.15 224.79,215.15 C224.79,215.15 224.84,215.26 224.84,215.26 C224.84,215.26 224.89,215.38 224.89,215.38 C224.89,215.38 224.94,215.5 224.94,215.5 C224.94,215.5 224.99,215.61 224.99,215.61 C224.99,215.61 225.04,215.73 225.04,215.73 C225.04,215.73 225.08,215.84 225.08,215.84 C225.08,215.84 225.12,215.96 225.12,215.96 C225.12,215.96 225.16,216.08 225.16,216.08 C225.16,216.08 225.19,216.2 225.19,216.2 C225.19,216.2 225.23,216.32 225.23,216.32 C225.23,216.32 225.27,216.44 225.27,216.44 C225.27,216.44 225.3,216.56 225.3,216.56 C225.3,216.56 225.33,216.69 225.33,216.69 C225.33,216.69 225.35,216.81 225.35,216.81 C225.35,216.81 225.38,216.93 225.38,216.93 C225.38,216.93 225.41,217.06 225.41,217.06 C225.41,217.06 225.43,217.18 225.43,217.18 C225.43,217.18 225.46,217.3 225.46,217.3 C225.46,217.3 225.47,217.43 225.47,217.43 C225.47,217.43 225.49,217.55 225.49,217.55 C225.49,217.55 225.5,217.68 225.5,217.68 C225.5,217.68 225.52,217.8 225.52,217.8 C225.52,217.8 225.52,217.93 225.52,217.93 C225.52,217.93 225.53,218.05 225.53,218.05 C225.53,218.05 225.54,218.18 225.54,218.18 C225.54,218.18 225.54,218.3 225.54,218.3 C225.54,218.3 225.55,218.43 225.55,218.43 C225.55,218.43 225.55,218.55 225.55,218.55 C225.55,218.55 225.55,218.68 225.55,218.68 C225.55,218.68 225.54,218.8 225.54,218.8 C225.54,218.8 225.54,218.93 225.54,218.93 C225.54,218.93 225.53,219.05 225.53,219.05 C225.53,219.05 225.52,219.18 225.52,219.18 C225.52,219.18 225.52,219.31 225.52,219.31 C225.52,219.31 225.5,219.43 225.5,219.43 C225.5,219.43 225.48,219.55 225.48,219.55 C225.48,219.55 225.47,219.68 225.47,219.68 C225.47,219.68 225.45,219.8 225.45,219.8 C225.45,219.8 225.43,219.93 225.43,219.93 C225.43,219.93 225.41,220.05 225.41,220.05 C225.41,220.05 225.39,220.17 225.39,220.17 C225.39,220.17 225.36,220.3 225.36,220.3 C225.36,220.3 225.33,220.42 225.33,220.42 C225.33,220.42 225.3,220.54 225.3,220.54 C225.3,220.54 225.27,220.66 225.27,220.66 C225.27,220.66 225.24,220.78 225.24,220.78 C225.24,220.78 225.2,220.9 225.2,220.9 C225.2,220.9 225.16,221.02 225.16,221.02 C225.16,221.02 225.12,221.14 225.12,221.14 C225.12,221.14 225.08,221.26 225.08,221.26 C225.08,221.26 225.03,221.38 225.03,221.38 C225.03,221.38 224.99,221.5 224.99,221.5 C224.99,221.5 224.95,221.61 224.95,221.61 C224.95,221.61 224.89,221.73 224.89,221.73 C224.89,221.73 224.84,221.84 224.84,221.84 C224.84,221.84 224.79,221.96 224.79,221.96 C224.79,221.96 224.73,222.07 224.73,222.07 C224.73,222.07 224.68,222.18 224.68,222.18 C224.68,222.18 224.62,222.29 224.62,222.29 C224.62,222.29 224.56,222.4 224.56,222.4 C224.56,222.4 224.5,222.51 224.5,222.51 C224.5,222.51 224.44,222.62 224.44,222.62 C224.44,222.62 224.37,222.73 224.37,222.73 C224.37,222.73 224.31,222.84 224.31,222.84 C224.31,222.84 224.24,222.94 224.24,222.94 C224.24,222.94 224.17,223.05 224.17,223.05 C224.17,223.05 224.09,223.15 224.09,223.15 C224.09,223.15 224.02,223.25 224.02,223.25 C224.02,223.25 223.95,223.35 223.95,223.35 C223.95,223.35 223.88,223.45 223.88,223.45 C223.88,223.45 223.8,223.55 223.8,223.55 C223.8,223.55 223.71,223.65 223.71,223.65 C223.71,223.65 223.63,223.74 223.63,223.74 C223.63,223.74 223.55,223.84 223.55,223.84 C223.55,223.84 223.47,223.93 223.47,223.93 C223.47,223.93 223.39,224.03 223.39,224.03 C223.39,224.03 223.3,224.12 223.3,224.12 C223.3,224.12 223.21,224.2 223.21,224.2 C223.21,224.2 223.12,224.29 223.12,224.29 C223.12,224.29 223.03,224.38 223.03,224.38 C223.03,224.38 222.94,224.46 222.94,224.46 C222.94,224.46 222.85,224.55 222.85,224.55 C222.85,224.55 222.75,224.63 222.75,224.63 C222.75,224.63 222.65,224.71 222.65,224.71 C222.65,224.71 222.55,224.79 222.55,224.79 C222.55,224.79 222.46,224.87 222.46,224.87 C222.46,224.87 222.36,224.95 222.36,224.95 C222.36,224.95 222.26,225.02 222.26,225.02 C222.26,225.02 222.15,225.09 222.15,225.09 C222.15,225.09 222.05,225.16 222.05,225.16 C222.05,225.16 221.94,225.23 221.94,225.23 C221.94,225.23 221.84,225.3 221.84,225.3 C221.84,225.3 221.74,225.37 221.74,225.37 C221.74,225.37 221.63,225.44 221.63,225.44 C221.63,225.44 221.52,225.5 221.52,225.5 C221.52,225.5 221.41,225.56 221.41,225.56 C221.41,225.56 221.3,225.62 221.3,225.62 C221.3,225.62 221.19,225.68 221.19,225.68 C221.19,225.68 221.08,225.73 221.08,225.73 C221.08,225.73 220.96,225.79 220.96,225.79 C220.96,225.79 220.85,225.84 220.85,225.84 C220.85,225.84 220.73,225.89 220.73,225.89 C220.73,225.89 220.62,225.94 220.62,225.94 C220.62,225.94 220.5,225.99 220.5,225.99 C220.5,225.99 220.38,226.03 220.38,226.03 C220.38,226.03 220.27,226.08 220.27,226.08 C220.27,226.08 220.15,226.12 220.15,226.12 C220.15,226.12 220.03,226.15 220.03,226.15 C220.03,226.15 219.91,226.19 219.91,226.19 C219.91,226.19 219.79,226.23 219.79,226.23 C219.79,226.23 219.67,226.27 219.67,226.27 C219.67,226.27 219.55,226.3 219.55,226.3 C219.55,226.3 219.42,226.33 219.42,226.33 C219.42,226.33 219.3,226.35 219.3,226.35 C219.3,226.35 219.18,226.38 219.18,226.38 C219.18,226.38 219.06,226.4 219.06,226.4 C219.06,226.4 218.93,226.43 218.93,226.43 C218.93,226.43 218.81,226.45 218.81,226.45 C218.81,226.45 218.68,226.47 218.68,226.47 C218.68,226.47 218.56,226.49 218.56,226.49 C218.56,226.49 218.44,226.5 218.44,226.5 C218.44,226.5 218.31,226.52 218.31,226.52 C218.31,226.52 218.19,226.52 218.19,226.52 C218.19,226.52 218.06,226.53 218.06,226.53 C218.06,226.53 217.93,226.53 217.93,226.53 C217.93,226.53 217.81,226.54 217.81,226.54 C217.81,226.54 217.68,226.55 217.68,226.55 C217.68,226.55 217.56,226.55 217.56,226.55 C217.56,226.55 217.43,226.55 217.43,226.55 C217.43,226.55 217.31,226.54 217.31,226.54 C217.31,226.54 217.18,226.53 217.18,226.53 C217.18,226.53 217.05,226.53 217.05,226.53 C217.05,226.53 216.93,226.52 216.93,226.52 C216.93,226.52 216.8,226.52 216.8,226.52 C216.8,226.52 216.68,226.5 216.68,226.5 C216.68,226.5 216.55,226.48 216.55,226.48 C216.55,226.48 216.43,226.46 216.43,226.46 C216.43,226.46 216.31,226.45 216.31,226.45 C216.31,226.45 216.18,226.43 216.18,226.43 C216.18,226.43 216.06,226.41 216.06,226.41 C216.06,226.41 215.93,226.38 215.93,226.38 C215.93,226.38 215.81,226.35 215.81,226.35 C215.81,226.35 215.69,226.32 215.69,226.32 C215.69,226.32 215.57,226.29 215.57,226.29 C215.57,226.29 215.45,226.26 215.45,226.26 C215.45,226.26 215.32,226.23 215.32,226.23 C215.32,226.23 215.2,226.2 215.2,226.2 C215.2,226.2 215.09,226.16 215.09,226.16 C215.09,226.16 214.97,226.12 214.97,226.12 C214.97,226.12 214.85,226.07 214.85,226.07 C214.85,226.07 214.73,226.03 214.73,226.03 C214.73,226.03 214.61,225.99 214.61,225.99 C214.61,225.99 214.5,225.94 214.5,225.94 C214.5,225.94 214.38,225.89 214.38,225.89 C214.38,225.89 214.27,225.84 214.27,225.84 C214.27,225.84 214.15,225.79 214.15,225.79 C214.15,225.79 214.04,225.73 214.04,225.73 C214.04,225.73 213.93,225.68 213.93,225.68 C213.93,225.68 213.81,225.62 213.81,225.62 C213.81,225.62 213.71,225.56 213.71,225.56 C213.71,225.56 213.6,225.5 213.6,225.5 C213.6,225.5 213.49,225.43 213.49,225.43 C213.49,225.43 213.38,225.37 213.38,225.37 C213.38,225.37 213.27,225.31 213.27,225.31 C213.27,225.31 213.17,225.24 213.17,225.24 C213.17,225.24 213.06,225.16 213.06,225.16 C213.06,225.16 212.96,225.09 212.96,225.09 C212.96,225.09 212.86,225.02 212.86,225.02 C212.86,225.02 212.76,224.95 212.76,224.95 C212.76,224.95 212.65,224.87 212.65,224.87 C212.65,224.87 212.56,224.79 212.56,224.79 C212.56,224.79 212.46,224.71 212.46,224.71 C212.46,224.71 212.37,224.63 212.37,224.63 C212.37,224.63 212.27,224.55 212.27,224.55 C212.27,224.55 212.18,224.47 212.18,224.47 C212.18,224.47 212.08,224.38 212.08,224.38 C212.08,224.38 211.99,224.3 211.99,224.3 C211.99,224.3 211.91,224.2 211.91,224.2 C211.91,224.2 211.82,224.11 211.82,224.11 C211.82,224.11 211.73,224.02 211.73,224.02 C211.73,224.02 211.64,223.93 211.64,223.93 C211.64,223.93 211.56,223.84 211.56,223.84 C211.56,223.84 211.48,223.75 211.48,223.75 C211.48,223.75 211.4,223.65 211.4,223.65 C211.4,223.65 211.32,223.55 211.32,223.55 C211.32,223.55 211.24,223.45 211.24,223.45 C211.24,223.45 211.16,223.35 211.16,223.35 C211.16,223.35 211.09,223.26 211.09,223.26 C211.09,223.26 211.02,223.15 211.02,223.15 C211.02,223.15 210.95,223.05 210.95,223.05 C210.95,223.05 210.88,222.94 210.88,222.94 C210.88,222.94 210.81,222.84 210.81,222.84 C210.81,222.84 210.74,222.73 210.74,222.73 C210.74,222.73 210.67,222.63 210.67,222.63 C210.67,222.63 210.61,222.52 210.61,222.52 C210.61,222.52 210.55,222.4 210.55,222.4 C210.55,222.4 210.49,222.29 210.49,222.29 C210.49,222.29 210.43,222.18 210.43,222.18 C210.43,222.18 210.38,222.07 210.38,222.07 C210.38,222.07 210.32,221.96 210.32,221.96 C210.32,221.96 210.27,221.84 210.27,221.84 C210.27,221.84 210.22,221.73 210.22,221.73 C210.22,221.73 210.17,221.61 210.17,221.61 C210.17,221.61 210.12,221.5 210.12,221.5 C210.12,221.5 210.08,221.38 210.08,221.38 C210.08,221.38 210.03,221.26 210.03,221.26 C210.03,221.26 209.99,221.14 209.99,221.14 C209.99,221.14 209.96,221.02 209.96,221.02 C209.96,221.02 209.92,220.9 209.92,220.9 C209.92,220.9 209.88,220.78 209.88,220.78 C209.88,220.78 209.84,220.67 209.84,220.67 C209.84,220.67 209.81,220.54 209.81,220.54 C209.81,220.54 209.78,220.42 209.78,220.42 C209.78,220.42 209.76,220.3 209.76,220.3 C209.76,220.3 209.73,220.18 209.73,220.18 C209.73,220.18 209.71,220.05 209.71,220.05 C209.71,220.05 209.68,219.93 209.68,219.93 C209.68,219.93 209.66,219.81 209.66,219.81 C209.66,219.81 209.64,219.68 209.64,219.68 C209.64,219.68 209.62,219.56 209.62,219.56 C209.62,219.56 209.61,219.43 209.61,219.43 C209.61,219.43 209.59,219.31 209.59,219.31 C209.59,219.31 209.59,219.18 209.59,219.18 C209.59,219.18 209.58,219.06 209.58,219.06 C209.58,219.06 209.58,218.93 209.58,218.93 C209.58,218.93 209.57,218.81 209.57,218.81 C209.57,218.81 209.56,218.68 209.56,218.68 C209.56,218.68 209.56,218.56 209.56,218.56 C209.56,218.56 209.56,218.43 209.56,218.43 C209.56,218.43 209.57,218.3 209.57,218.3 C209.57,218.3 209.58,218.18 209.58,218.18 C209.58,218.18 209.58,218.05 209.58,218.05 C209.58,218.05 209.59,217.93 209.59,217.93 C209.59,217.93 209.59,217.8 209.59,217.8 C209.59,217.8 209.61,217.68 209.61,217.68 C209.61,217.68 209.63,217.55 209.63,217.55 C209.63,217.55 209.65,217.43 209.65,217.43 C209.65,217.43 209.66,217.31 209.66,217.31 C209.66,217.31 209.68,217.18 209.68,217.18 C209.68,217.18 209.7,217.06 209.7,217.06 C209.7,217.06 209.73,216.93 209.73,216.93 C209.73,216.93 209.76,216.81 209.76,216.81 C209.76,216.81 209.79,216.69 209.79,216.69 C209.79,216.69 209.82,216.57 209.82,216.57 C209.82,216.57 209.85,216.45 209.85,216.45 C209.85,216.45 209.88,216.32 209.88,216.32 C209.88,216.32 209.91,216.2 209.91,216.2 C209.91,216.2 209.95,216.08 209.95,216.08 C209.95,216.08 210,215.97 210,215.97 C210,215.97 210.04,215.85 210.04,215.85 C210.04,215.85 210.08,215.73 210.08,215.73 C210.08,215.73 210.12,215.61 210.12,215.61 C210.12,215.61 210.17,215.49 210.17,215.49 C210.17,215.49 210.22,215.38 210.22,215.38 C210.22,215.38 210.27,215.27 210.27,215.27 C210.27,215.27 210.33,215.15 210.33,215.15 C210.33,215.15 210.38,215.04 210.38,215.04 C210.38,215.04 210.43,214.92 210.43,214.92 C210.43,214.92 210.49,214.81 210.49,214.81 C210.49,214.81 210.55,214.7 210.55,214.7 C210.55,214.7 210.61,214.6 210.61,214.6 C210.61,214.6 210.68,214.49 210.68,214.49 C210.68,214.49 210.74,214.38 210.74,214.38 C210.74,214.38 210.8,214.27 210.8,214.27 C210.8,214.27 210.87,214.17 210.87,214.17 C210.87,214.17 210.95,214.06 210.95,214.06 C210.95,214.06 211.02,213.96 211.02,213.96 C211.02,213.96 211.09,213.86 211.09,213.86 C211.09,213.86 211.16,213.76 211.16,213.76 C211.16,213.76 211.24,213.65 211.24,213.65 C211.24,213.65 211.32,213.56 211.32,213.56 C211.32,213.56 211.4,213.46 211.4,213.46 C211.4,213.46 211.48,213.37 211.48,213.37 C211.48,213.37 211.56,213.27 211.56,213.27 C211.56,213.27 211.64,213.18 211.64,213.18 C211.64,213.18 211.73,213.08 211.73,213.08 C211.73,213.08 211.82,212.99 211.82,212.99 C211.82,212.99 211.91,212.9 211.91,212.9 C211.91,212.9 212,212.82 212,212.82 C212,212.82 212.09,212.73 212.09,212.73 C212.09,212.73 212.18,212.64 212.18,212.64 C212.18,212.64 212.27,212.56 212.27,212.56 C212.27,212.56 212.36,212.48 212.36,212.48 C212.36,212.48 212.46,212.4 212.46,212.4 C212.46,212.4 212.56,212.32 212.56,212.32 C212.56,212.32 212.66,212.24 212.66,212.24 C212.66,212.24 212.76,212.16 212.76,212.16 C212.76,212.16 212.85,212.08 212.85,212.08 C212.85,212.08 212.96,212.02 212.96,212.02 C212.96,212.02 213.06,211.95 213.06,211.95 C213.06,211.95 213.17,211.88 213.17,211.88 C213.17,211.88 213.27,211.81 213.27,211.81 C213.27,211.81 213.38,211.74 213.38,211.74 C213.38,211.74 213.48,211.67 213.48,211.67 C213.48,211.67 213.6,211.61 213.6,211.61 C213.6,211.61 213.71,211.55 213.71,211.55 C213.71,211.55 213.82,211.49 213.82,211.49 C213.82,211.49 213.93,211.43 213.93,211.43 C213.93,211.43 214.04,211.37 214.04,211.37 C214.04,211.37 214.15,211.32 214.15,211.32 C214.15,211.32 214.27,211.27 214.27,211.27 C214.27,211.27 214.38,211.22 214.38,211.22 C214.38,211.22 214.5,211.17 214.5,211.17 C214.5,211.17 214.61,211.12 214.61,211.12 C214.61,211.12 214.73,211.07 214.73,211.07 C214.73,211.07 214.85,211.03 214.85,211.03 C214.85,211.03 214.97,210.99 214.97,210.99 C214.97,210.99 215.09,210.95 215.09,210.95 C215.09,210.95 215.21,210.92 215.21,210.92 C215.21,210.92 215.33,210.88 215.33,210.88 C215.33,210.88 215.45,210.84 215.45,210.84 C215.45,210.84 215.57,210.81 215.57,210.81 C215.57,210.81 215.69,210.78 215.69,210.78 C215.69,210.78 215.81,210.76 215.81,210.76 C215.81,210.76 215.93,210.73 215.93,210.73 C215.93,210.73 216.06,210.7 216.06,210.7 C216.06,210.7 216.18,210.68 216.18,210.68 C216.18,210.68 216.3,210.65 216.3,210.65 C216.3,210.65 216.43,210.64 216.43,210.64 C216.43,210.64 216.55,210.62 216.55,210.62 C216.55,210.62 216.68,210.61 216.68,210.61 C216.68,210.61 216.8,210.59 216.8,210.59 C216.8,210.59 216.93,210.59 216.93,210.59 C216.93,210.59 217.05,210.58 217.05,210.58 C217.05,210.58 217.18,210.58 217.18,210.58 C217.18,210.58 217.3,210.57 217.3,210.57 C217.3,210.57 217.43,210.56 217.43,210.56 C217.43,210.56 217.56,210.56 217.56,210.56 C217.56,210.56 217.68,210.56 217.68,210.56c " android:valueType="pathType"><aapt:attr name="android:interpolator"><pathInterpolator android:pathData="M 0.0,0.0 c0.3,0 0.8,1 1.0,1.0"/></aapt:attr></objectAnimator></set></aapt:attr></target><target android:name="time_group"><aapt:attr name="android:animation"><set android:ordering="together"><objectAnimator android:propertyName="translateX" android:duration="500" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"/></set></aapt:attr></target></animated-vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/keyguard_pin_shape_hinting_view.xml b/packages/SystemUI/res/layout/keyguard_pin_shape_hinting_view.xml new file mode 100644 index 000000000000..aab987075bbd --- /dev/null +++ b/packages/SystemUI/res/layout/keyguard_pin_shape_hinting_view.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2023 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 + --> +<com.android.keyguard.PinShapeHintingView + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:gravity="center" + android:layout_width="match_parent" + android:layout_height="match_parent"> +</com.android.keyguard.PinShapeHintingView> diff --git a/packages/SystemUI/res/layout/keyguard_pin_shape_non_hinting_view.xml b/packages/SystemUI/res/layout/keyguard_pin_shape_non_hinting_view.xml new file mode 100644 index 000000000000..cba1db0487d6 --- /dev/null +++ b/packages/SystemUI/res/layout/keyguard_pin_shape_non_hinting_view.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2023 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 + --> +<com.android.keyguard.PinShapeNonHintingView + xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:gravity="center" + android:layout_width="match_parent" + android:layout_height="match_parent"> +</com.android.keyguard.PinShapeNonHintingView>
\ No newline at end of file diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 8d951645223e..bf110194cb8c 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2480,6 +2480,10 @@ <string name="media_transfer_loading">Loading</string> <!-- Default name of the device. [CHAR LIMIT=30] --> <string name="media_ttt_default_device_type">tablet</string> + <!-- Description of media transfer icon of unknown app appears in receiver devices. [CHAR LIMIT=NONE]--> + <string name="media_transfer_receiver_content_description_unknown_app">Casting your media</string> + <!-- Description of media transfer icon appears in receiver devices. [CHAR LIMIT=NONE]--> + <string name="media_transfer_receiver_content_description_with_app_name">Casting <xliff:g id="app_label" example="Spotify">%1$s</xliff:g></string> <!-- Error message indicating that a control timed out while waiting for an update [CHAR_LIMIT=30] --> <string name="controls_error_timeout">Inactive, check app</string> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java index b143c5b90373..48844db6f65f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java @@ -30,6 +30,7 @@ import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.systemui.R; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.flags.FeatureFlags; import com.android.systemui.statusbar.policy.DevicePostureController; import com.android.systemui.util.ViewController; import com.android.systemui.util.concurrency.DelayableExecutor; @@ -184,6 +185,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> private final FalsingCollector mFalsingCollector; private final DevicePostureController mDevicePostureController; private final KeyguardViewController mKeyguardViewController; + private final FeatureFlags mFeatureFlags; @Inject public Factory(KeyguardUpdateMonitor keyguardUpdateMonitor, @@ -195,7 +197,8 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> TelephonyManager telephonyManager, FalsingCollector falsingCollector, EmergencyButtonController.Factory emergencyButtonControllerFactory, DevicePostureController devicePostureController, - KeyguardViewController keyguardViewController) { + KeyguardViewController keyguardViewController, + FeatureFlags featureFlags) { mKeyguardUpdateMonitor = keyguardUpdateMonitor; mLockPatternUtils = lockPatternUtils; mLatencyTracker = latencyTracker; @@ -209,6 +212,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> mFalsingCollector = falsingCollector; mDevicePostureController = devicePostureController; mKeyguardViewController = keyguardViewController; + mFeatureFlags = featureFlags; } /** Create a new {@link KeyguardInputViewController}. */ @@ -236,7 +240,7 @@ public abstract class KeyguardInputViewController<T extends KeyguardInputView> mKeyguardUpdateMonitor, securityMode, mLockPatternUtils, keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker, mLiftToActivateListener, emergencyButtonController, mFalsingCollector, - mDevicePostureController); + mDevicePostureController, mFeatureFlags); } else if (keyguardInputView instanceof KeyguardSimPinView) { return new KeyguardSimPinViewController((KeyguardSimPinView) keyguardInputView, mKeyguardUpdateMonitor, securityMode, mLockPatternUtils, diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java index 35b2db27d879..fd47e39534a7 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java @@ -16,6 +16,8 @@ package com.android.keyguard; +import static com.android.systemui.keyguard.shared.constants.KeyguardBouncerConstants.DEFAULT_PIN_LENGTH; + import android.view.View; import com.android.internal.util.LatencyTracker; @@ -23,6 +25,8 @@ import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.systemui.R; import com.android.systemui.classifier.FalsingCollector; +import com.android.systemui.flags.FeatureFlags; +import com.android.systemui.flags.Flags; import com.android.systemui.statusbar.policy.DevicePostureController; public class KeyguardPinViewController @@ -31,6 +35,14 @@ public class KeyguardPinViewController private final DevicePostureController mPostureController; private final DevicePostureController.Callback mPostureCallback = posture -> mView.onDevicePostureChanged(posture); + private LockPatternUtils mLockPatternUtils; + private final FeatureFlags mFeatureFlags; + private static final int DEFAULT_PIN_LENGTH = 6; + private NumPadButton mBackspaceKey; + private View mOkButton = mView.findViewById(R.id.key_enter); + + private int mUserId; + private long mPinLength; protected KeyguardPinViewController(KeyguardPINView view, KeyguardUpdateMonitor keyguardUpdateMonitor, @@ -40,12 +52,16 @@ public class KeyguardPinViewController LatencyTracker latencyTracker, LiftToActivateListener liftToActivateListener, EmergencyButtonController emergencyButtonController, FalsingCollector falsingCollector, - DevicePostureController postureController) { + DevicePostureController postureController, + FeatureFlags featureFlags) { super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback, messageAreaControllerFactory, latencyTracker, liftToActivateListener, emergencyButtonController, falsingCollector); mKeyguardUpdateMonitor = keyguardUpdateMonitor; mPostureController = postureController; + mLockPatternUtils = lockPatternUtils; + mFeatureFlags = featureFlags; + mBackspaceKey = view.findViewById(R.id.delete_button); } @Override @@ -59,10 +75,20 @@ public class KeyguardPinViewController getKeyguardSecurityCallback().onCancelClicked(); }); } - + mPasswordEntry.setUserActivityListener(this::onUserInput); mPostureController.addCallback(mPostureCallback); } + protected void onUserInput() { + super.onUserInput(); + if (isAutoConfirmation()) { + updateBackSpaceVisibility(); + if (mPasswordEntry.getText().length() == mPinLength) { + verifyPasswordAndUnlock(); + } + } + } + @Override protected void onViewDetached() { super.onViewDetached(); @@ -70,8 +96,55 @@ public class KeyguardPinViewController } @Override + public void startAppearAnimation() { + if (mFeatureFlags.isEnabled(Flags.AUTO_PIN_CONFIRMATION)) { + mUserId = KeyguardUpdateMonitor.getCurrentUser(); + mPinLength = mLockPatternUtils.getPinLength(mUserId); + mBackspaceKey.setTransparentMode(/* isTransparentMode= */ isAutoConfirmation()); + mOkButton.setVisibility(isAutoConfirmation() ? View.INVISIBLE : View.VISIBLE); + updateBackSpaceVisibility(); + mPasswordEntry.setUsePinShapes(true); + mPasswordEntry.setIsPinHinting(isAutoConfirmation() && isPinHinting()); + } + super.startAppearAnimation(); + } + + @Override public boolean startDisappearAnimation(Runnable finishRunnable) { return mView.startDisappearAnimation( mKeyguardUpdateMonitor.needsSlowUnlockTransition(), finishRunnable); } + + // + + /** + * Updates the visibility and the enabled state of the backspace. + * Visibility changes are only for auto confirmation configuration. + */ + private void updateBackSpaceVisibility() { + if (!isAutoConfirmation()) { + return; + } + + if (mPasswordEntry.getText().length() > 0) { + mBackspaceKey.setVisibility(View.VISIBLE); + } else { + mBackspaceKey.setVisibility(View.INVISIBLE); + } + } + + /** + * Responsible for identifying if PIN hinting is to be enabled or not + */ + private boolean isPinHinting() { + return mLockPatternUtils.getPinLength(mUserId) == DEFAULT_PIN_LENGTH; + } + + /** + * Responsible for identifying if auto confirm is enabled or not in Settings + */ + private boolean isAutoConfirmation() { + //Checks if user has enabled the auto confirm in Settings + return mLockPatternUtils.isAutoPinConfirmEnabled(mUserId); + } } diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java index 41111e3d3c6c..5135eed519a9 100644 --- a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java +++ b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java @@ -95,7 +95,6 @@ class NumPadAnimator { mHeight = height; mStartRadius = height / 2f; mEndRadius = height / 4f; - mBackground.setCornerRadius(mStartRadius); mExpandAnimator.setFloatValues(mStartRadius, mEndRadius); mContractAnimator.setFloatValues(mEndRadius, mStartRadius); } diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadButton.java b/packages/SystemUI/src/com/android/keyguard/NumPadButton.java index 37060987cb21..11c329e9811d 100644 --- a/packages/SystemUI/src/com/android/keyguard/NumPadButton.java +++ b/packages/SystemUI/src/com/android/keyguard/NumPadButton.java @@ -27,6 +27,8 @@ import android.view.MotionEvent; import androidx.annotation.Nullable; +import com.android.systemui.R; + /** * Similar to the {@link NumPadKey}, but displays an image. */ @@ -35,18 +37,13 @@ public class NumPadButton extends AlphaOptimizedImageButton implements NumPadAni @Nullable private NumPadAnimator mAnimator; private int mOrientation; + private int mStyleAttr; + private boolean mIsTransparentMode; public NumPadButton(Context context, AttributeSet attrs) { super(context, attrs); - - Drawable background = getBackground(); - if (background instanceof GradientDrawable) { - mAnimator = new NumPadAnimator(context, background.mutate(), - attrs.getStyleAttribute(), getDrawable()); - } else { - mAnimator = null; - } - + mStyleAttr = attrs.getStyleAttribute(); + setupAnimator(); } @Override @@ -98,7 +95,9 @@ public class NumPadButton extends AlphaOptimizedImageButton implements NumPadAni public void reloadColors() { if (mAnimator != null) mAnimator.reloadColors(getContext()); - int[] customAttrs = {android.R.attr.textColorPrimaryInverse}; + int textColorResId = mIsTransparentMode ? android.R.attr.textColorPrimary + : android.R.attr.textColorPrimaryInverse; + int[] customAttrs = {textColorResId}; TypedArray a = getContext().obtainStyledAttributes(customAttrs); int imageColor = a.getColor(0, 0); a.recycle(); @@ -111,4 +110,34 @@ public class NumPadButton extends AlphaOptimizedImageButton implements NumPadAni mAnimator.setProgress(progress); } } + + /** + * Set whether button is transparent mode. + * + * @param isTransparentMode + */ + public void setTransparentMode(boolean isTransparentMode) { + mIsTransparentMode = isTransparentMode; + if (isTransparentMode) { + setBackgroundColor(android.R.color.transparent); + } else { + setBackground(getContext().getDrawable(R.drawable.num_pad_key_background)); + } + setupAnimator(); + reloadColors(); + requestLayout(); + } + + /** + * Set up the animator for the NumPadButton. + */ + private void setupAnimator() { + Drawable background = getBackground(); + if (background instanceof GradientDrawable) { + mAnimator = new NumPadAnimator(getContext(), background.mutate(), + mStyleAttr, getDrawable()); + } else { + mAnimator = null; + } + } } diff --git a/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java b/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java index 35cae099e44e..8554e11a2f3c 100644 --- a/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java +++ b/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java @@ -35,13 +35,14 @@ import android.text.InputType; import android.text.TextUtils; import android.util.AttributeSet; import android.view.Gravity; -import android.view.View; +import android.view.LayoutInflater; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; import android.widget.EditText; +import android.widget.FrameLayout; import com.android.settingslib.Utils; import com.android.systemui.R; @@ -52,12 +53,12 @@ import java.util.ArrayList; * A View similar to a textView which contains password text and can animate when the text is * changed */ -public class PasswordTextView extends View { +public class PasswordTextView extends FrameLayout { private static final float DOT_OVERSHOOT_FACTOR = 1.5f; private static final long DOT_APPEAR_DURATION_OVERSHOOT = 320; - private static final long APPEAR_DURATION = 160; - private static final long DISAPPEAR_DURATION = 160; + public static final long APPEAR_DURATION = 160; + public static final long DISAPPEAR_DURATION = 160; private static final long RESET_DELAY_PER_ELEMENT = 40; private static final long RESET_MAX_DELAY = 200; @@ -95,11 +96,14 @@ public class PasswordTextView extends View { private PowerManager mPM; private int mCharPadding; private final Paint mDrawPaint = new Paint(); + private int mDrawColor; private Interpolator mAppearInterpolator; private Interpolator mDisappearInterpolator; private Interpolator mFastOutSlowInInterpolator; private boolean mShowPassword; private UserActivityListener mUserActivityListener; + private PinShapeInput mPinShapeInput; + private boolean mUsePinShapes = false; public interface UserActivityListener { void onUserActivity(); @@ -141,8 +145,10 @@ public class PasswordTextView extends View { mCharPadding = a.getDimensionPixelSize(R.styleable.PasswordTextView_charPadding, getContext().getResources().getDimensionPixelSize( R.dimen.password_char_padding)); - mDrawPaint.setColor(a.getColor(R.styleable.PasswordTextView_android_textColor, - Color.WHITE)); + mDrawColor = a.getColor(R.styleable.PasswordTextView_android_textColor, + Color.WHITE); + mDrawPaint.setColor(mDrawColor); + } finally { a.recycle(); } @@ -161,6 +167,7 @@ public class PasswordTextView extends View { mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(mContext, android.R.interpolator.fast_out_slow_in); mPM = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); + setWillNotDraw(false); } @Override @@ -171,6 +178,12 @@ public class PasswordTextView extends View { @Override protected void onDraw(Canvas canvas) { + // Do not use legacy draw animations for pin shapes. + if (mUsePinShapes) { + super.onDraw(canvas); + return; + } + float totalDrawingWidth = getDrawingWidth(); float currentDrawPosition; if ((mGravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.LEFT) { @@ -205,9 +218,12 @@ public class PasswordTextView extends View { * Reload colors from resources. **/ public void reloadColors() { - int textColor = Utils.getColorAttr(getContext(), android.R.attr.textColorPrimary) - .getDefaultColor(); - mDrawPaint.setColor(textColor); + mDrawColor = Utils.getColorAttr(getContext(), + android.R.attr.textColorPrimary).getDefaultColor(); + mDrawPaint.setColor(mDrawColor); + if (mPinShapeInput != null) { + mPinShapeInput.setDrawColor(mDrawColor); + } } @Override @@ -252,6 +268,9 @@ public class PasswordTextView extends View { charState = mTextChars.get(newLength - 1); charState.whichChar = c; } + if (mPinShapeInput != null) { + mPinShapeInput.append(); + } charState.startAppearAnimation(); // ensure that the previous element is being swapped @@ -265,8 +284,8 @@ public class PasswordTextView extends View { sendAccessibilityEventTypeViewTextChanged(textbefore, textbefore.length(), 0, 1); } - public void setUserActivityListener(UserActivityListener userActivitiListener) { - mUserActivityListener = userActivitiListener; + public void setUserActivityListener(UserActivityListener userActivityListener) { + mUserActivityListener = userActivityListener; } private void userActivity() { @@ -284,6 +303,9 @@ public class PasswordTextView extends View { CharState charState = mTextChars.get(length - 1); charState.startRemoveAnimation(0, 0); sendAccessibilityEventTypeViewTextChanged(textbefore, textbefore.length() - 1, 1, 0); + if (mPinShapeInput != null) { + mPinShapeInput.delete(); + } } userActivity(); } @@ -339,6 +361,11 @@ public class PasswordTextView extends View { } if (!animated) { mTextChars.clear(); + } else { + userActivity(); + } + if (mPinShapeInput != null) { + mPinShapeInput.reset(); } if (announce) { sendAccessibilityEventTypeViewTextChanged(textbefore, 0, textbefore.length(), 0); @@ -385,6 +412,35 @@ public class PasswordTextView extends View { info.setInputType(InputType.TYPE_NUMBER_VARIATION_PASSWORD); } + /** + * Sets whether to use pin shapes. + */ + public void setUsePinShapes(boolean usePinShapes) { + mUsePinShapes = usePinShapes; + } + + /** + * Determines whether AutoConfirmation feature is on. + * + * @param usePinShapes + * @param isPinHinting + */ + public void setIsPinHinting(boolean isPinHinting) { + if (mPinShapeInput != null) { + removeView(mPinShapeInput.getView()); + mPinShapeInput = null; + } + + if (isPinHinting) { + mPinShapeInput = (PinShapeInput) LayoutInflater.from(mContext).inflate( + R.layout.keyguard_pin_shape_hinting_view, null); + } else { + mPinShapeInput = (PinShapeInput) LayoutInflater.from(mContext).inflate( + R.layout.keyguard_pin_shape_non_hinting_view, null); + } + addView(mPinShapeInput.getView()); + } + private class CharState { char whichChar; ValueAnimator textAnimator; diff --git a/packages/SystemUI/src/com/android/keyguard/PinShapeAdapter.kt b/packages/SystemUI/src/com/android/keyguard/PinShapeAdapter.kt new file mode 100644 index 000000000000..4496dc311e92 --- /dev/null +++ b/packages/SystemUI/src/com/android/keyguard/PinShapeAdapter.kt @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.keyguard + +import android.content.Context +import com.android.systemui.R +import kotlin.random.Random + +class PinShapeAdapter { + var shapes: MutableList<Int> = ArrayList() + val random = Random(System.currentTimeMillis()) + + constructor(context: Context) { + val availableShapes = context.resources.obtainTypedArray(R.array.bouncer_pin_shapes) + + for (i in 0 until availableShapes.length()) { + val shape = availableShapes.getResourceId(i, 0) + shapes.add(shape) + } + + shapes.shuffle() + availableShapes.recycle() + } + + fun getShape(pos: Int): Int { + return shapes[pos.mod(shapes.size)] + } +} diff --git a/packages/SystemUI/src/com/android/keyguard/PinShapeHintingView.java b/packages/SystemUI/src/com/android/keyguard/PinShapeHintingView.java new file mode 100644 index 000000000000..cf9d0537defe --- /dev/null +++ b/packages/SystemUI/src/com/android/keyguard/PinShapeHintingView.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.keyguard; + +import android.content.Context; +import android.graphics.drawable.AnimatedVectorDrawable; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; + +import androidx.core.graphics.drawable.DrawableCompat; + +import com.android.settingslib.Utils; +import com.android.systemui.R; + +/** + * This class contains implementation for methods that will be used when user has set a + * six digit pin on their device + */ +public class PinShapeHintingView extends LinearLayout implements PinShapeInput { + + private int mPinLength; + private int mDotDiameter; + private int mDotSpacing; + private int mColor = Utils.getColorAttr(getContext(), android.R.attr.textColorPrimary) + .getDefaultColor(); + private int mPosition = 0; + private static final int DEFAULT_PIN_LENGTH = 6; + private PinShapeAdapter mPinShapeAdapter; + + public PinShapeHintingView(Context context, AttributeSet attrs) { + super(context, attrs); + mPinShapeAdapter = new PinShapeAdapter(context); + mPinLength = DEFAULT_PIN_LENGTH; + mDotDiameter = context.getResources().getDimensionPixelSize(R.dimen.default_dot_diameter); + mDotSpacing = context.getResources().getDimensionPixelSize(R.dimen.default_dot_spacing); + + for (int i = 0; i < mPinLength; i++) { + ImageView pinDot = new ImageView(context, attrs); + LayoutParams layoutParams = new LayoutParams(mDotDiameter, mDotDiameter); + pinDot.setLayoutParams(layoutParams); + pinDot.setImageResource(R.drawable.pin_dot_avd); + if (pinDot.getDrawable() != null) { + Drawable drawable = DrawableCompat.wrap(pinDot.getDrawable()); + DrawableCompat.setTint(drawable, mColor); + } + addView(pinDot); + } + } + + @Override + public void append() { + if (mPosition == DEFAULT_PIN_LENGTH) { + return; + } + setAnimatedDrawable(mPosition, mPinShapeAdapter.getShape(mPosition)); + mPosition++; + } + + @Override + public void delete() { + if (mPosition == 0) { + return; + } + mPosition--; + setAnimatedDrawable(mPosition, R.drawable.pin_dot_delete_avd); + } + + @Override + public void setDrawColor(int color) { + this.mColor = color; + } + + @Override + public void reset() { + int size = mPosition; + for (int i = 0; i < size; i++) { + delete(); + } + mPosition = 0; + } + + @Override + public View getView() { + return this; + } + + private void setAnimatedDrawable(int position, int drawableResId) { + ImageView pinDot = (ImageView) getChildAt(position); + pinDot.setImageResource(drawableResId); + if (pinDot.getDrawable() != null) { + Drawable drawable = DrawableCompat.wrap(pinDot.getDrawable()); + DrawableCompat.setTint(drawable, mColor); + } + if (pinDot.getDrawable() instanceof AnimatedVectorDrawable) { + ((AnimatedVectorDrawable) pinDot.getDrawable()).start(); + } + } +} diff --git a/packages/SystemUI/src/com/android/keyguard/PinShapeInput.java b/packages/SystemUI/src/com/android/keyguard/PinShapeInput.java new file mode 100644 index 000000000000..52ae6bac6d74 --- /dev/null +++ b/packages/SystemUI/src/com/android/keyguard/PinShapeInput.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.keyguard; + +import android.view.View; + +/** + * A common interface for classes that provide functionality for the PIN type view + */ +public interface PinShapeInput { + + /** + * This is the method that is triggered when user types in a character + */ + void append(); + + /** + * This is the method that is triggered when user deletes a character + */ + void delete(); + + /** + * This is the method that is triggered for setting the color of the view + */ + void setDrawColor(int color); + + /** + * This is the method that is triggered for resetting the view + */ + void reset(); + + /** + * This is the method that is triggered for getting the view + */ + View getView(); +} diff --git a/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java b/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java new file mode 100644 index 000000000000..6a6e81e9cb46 --- /dev/null +++ b/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.keyguard; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; +import android.content.Context; +import android.graphics.Rect; +import android.graphics.drawable.AnimatedVectorDrawable; +import android.graphics.drawable.Drawable; +import android.transition.Transition; +import android.transition.TransitionManager; +import android.transition.TransitionValues; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.widget.ImageView; +import android.widget.LinearLayout; + +import androidx.core.graphics.drawable.DrawableCompat; + +import com.android.settingslib.Utils; +import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; + +/** + * This class contains implementation for methods that will be used when user has set a + * non six digit pin on their device + */ +public class PinShapeNonHintingView extends LinearLayout implements PinShapeInput { + + private int mColor = Utils.getColorAttr(getContext(), + android.R.attr.textColorPrimary).getDefaultColor(); + private int mPosition = 0; + private final PinShapeAdapter mPinShapeAdapter; + private Animation mCurrentPlayingAnimation; + public PinShapeNonHintingView(Context context, AttributeSet attrs) { + super(context, attrs); + mPinShapeAdapter = new PinShapeAdapter(context); + } + + @Override + public void append() { + int size = getResources().getDimensionPixelSize(R.dimen.password_shape_size); + ImageView pinDot = new ImageView(getContext()); + pinDot.setLayoutParams(new LayoutParams(size, size)); + pinDot.setImageResource(mPinShapeAdapter.getShape(mPosition)); + if (pinDot.getDrawable() != null) { + Drawable wrappedDrawable = DrawableCompat.wrap(pinDot.getDrawable()); + DrawableCompat.setTint(wrappedDrawable, mColor); + } + if (pinDot.getDrawable() instanceof AnimatedVectorDrawable) { + ((AnimatedVectorDrawable) pinDot.getDrawable()).start(); + } + TransitionManager.beginDelayedTransition(this, new PinShapeViewTransition()); + addView(pinDot); + mPosition++; + } + + @Override + public void delete() { + if (mPosition == 0) { + Log.e(getClass().getName(), "Trying to delete a non-existent char"); + return; + } + mPosition--; + ImageView pinDot = (ImageView) getChildAt(mPosition); + ValueAnimator animator = ValueAnimator.ofFloat(1f, 0f); + animator.addUpdateListener(valueAnimator -> { + float value = (float) valueAnimator.getAnimatedValue(); + pinDot.setScaleX(value); + pinDot.setScaleY(value); + }); + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + TransitionManager.beginDelayedTransition( + PinShapeNonHintingView.this, + new PinShapeViewTransition()); + removeView(pinDot); + mCurrentPlayingAnimation = null; + } + }); + animator.setDuration(PasswordTextView.DISAPPEAR_DURATION); + animator.start(); + } + + @Override + public void setDrawColor(int color) { + this.mColor = color; + } + + @Override + public void reset() { + final int position = mPosition; + for (int i = 0; i < position; i++) { + delete(); + } + } + + @Override + public View getView() { + return this; + } + + class PinShapeViewTransition extends Transition { + private static final String PROP_BOUNDS = "PinShapeViewTransition:bounds"; + + @Override + public void captureEndValues(TransitionValues transitionValues) { + if (transitionValues != null) { + captureValues(transitionValues); + } + } + + @Override + public void captureStartValues(TransitionValues transitionValues) { + if (transitionValues != null) { + captureValues(transitionValues); + } + } + + private void captureValues(TransitionValues values) { + Rect boundsRect = new Rect(); + boundsRect.left = values.view.getLeft(); + boundsRect.top = values.view.getTop(); + boundsRect.right = values.view.getRight(); + boundsRect.bottom = values.view.getBottom(); + values.values.put(PROP_BOUNDS, boundsRect); + } + + @Override + public String[] getTransitionProperties() { + return new String[] { PROP_BOUNDS }; + } + + @Override + public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, + TransitionValues endValues) { + if (sceneRoot == null || startValues == null || endValues == null) { + return null; + } + + Rect startRect = (Rect) startValues.values.get(PROP_BOUNDS); + Rect endRect = (Rect) endValues.values.get(PROP_BOUNDS); + View v = startValues.view; + ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f); + animator.setDuration(PasswordTextView.APPEAR_DURATION); + animator.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN); + animator.addUpdateListener(valueAnimator -> { + float value = (float) valueAnimator.getAnimatedValue(); + int diff = startRect.left - endRect.left; + int currentTranslation = (int) ((diff) * value); + v.setLeftTopRightBottom( + startRect.left - currentTranslation, + startRect.top, + startRect.right - currentTranslation, + startRect.bottom + ); + }); + animator.start(); + return animator; + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java index b342a29640aa..15264e64a241 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationSettings.java @@ -398,13 +398,12 @@ class WindowMagnificationSettings implements MagnificationGestureDetector.OnGest mChangeModeButton = mSettingView.findViewById(R.id.magnifier_full_button); mZoomSeekbar = mSettingView.findViewById(R.id.magnifier_zoom_slider); - - mZoomSeekbar.setOnSeekBarChangeListener(new ZoomSeekbarChangeListener()); - float scale = mSecureSettings.getFloatForUser( Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, 0, UserHandle.USER_CURRENT); setSeekbarProgress(scale); + mZoomSeekbar.setOnSeekBarChangeListener(new ZoomSeekbarChangeListener()); + mAllowDiagonalScrollingSwitch = (Switch) mSettingView.findViewById(R.id.magnifier_horizontal_lock_switch); mAllowDiagonalScrollingSwitch.setChecked(mAllowDiagonalScrolling); diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java index d0c426d41006..3f41a7682357 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayer.java @@ -17,6 +17,7 @@ package com.android.systemui.accessibility.floatingmenu; import static android.view.WindowInsets.Type.ime; +import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY; import static androidx.core.view.WindowInsetsCompat.Type; @@ -32,6 +33,7 @@ import android.annotation.IntDef; import android.annotation.StringDef; import android.annotation.SuppressLint; import android.content.ComponentCallbacks; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; @@ -132,16 +134,30 @@ class MenuViewLayer extends FrameLayout implements Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, /* value= */ "", UserHandle.USER_CURRENT); + final List<ComponentName> hardwareKeyShortcutComponents = + mAccessibilityManager.getAccessibilityShortcutTargets( + ACCESSIBILITY_SHORTCUT_KEY) + .stream() + .map(ComponentName::unflattenFromString) + .toList(); + // Should disable the corresponding service when the fragment type is // INVISIBLE_TOGGLE, which will enable service when the shortcut is on. final List<AccessibilityServiceInfo> serviceInfoList = mAccessibilityManager.getEnabledAccessibilityServiceList( AccessibilityServiceInfo.FEEDBACK_ALL_MASK); serviceInfoList.forEach(info -> { - if (getAccessibilityServiceFragmentType(info) == INVISIBLE_TOGGLE) { - setAccessibilityServiceState(getContext(), - info.getComponentName(), /* enabled= */ false); + if (getAccessibilityServiceFragmentType(info) != INVISIBLE_TOGGLE) { + return; + } + + final ComponentName serviceComponentName = info.getComponentName(); + if (hardwareKeyShortcutComponents.contains(serviceComponentName)) { + return; } + + setAccessibilityServiceState(getContext(), serviceComponentName, /* enabled= */ + false); }); mFloatingMenu.hide(); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt index 53ab6d63c62d..58b230f52e93 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt @@ -88,6 +88,7 @@ class AuthRippleView(context: Context?, attrs: AttributeSet?) : View(context, at rippleShader.color = 0xffffffff.toInt() // default color rippleShader.rawProgress = 0f rippleShader.sparkleStrength = RIPPLE_SPARKLE_STRENGTH + setupRippleFadeParams() ripplePaint.shader = rippleShader dwellShader.color = 0xffffffff.toInt() // default color @@ -294,7 +295,6 @@ class AuthRippleView(context: Context?, attrs: AttributeSet?) : View(context, at ) addListener(object : AnimatorListenerAdapter() { override fun onAnimationStart(animation: Animator?) { - rippleShader.rippleFill = false drawRipple = true visibility = VISIBLE } @@ -339,6 +339,18 @@ class AuthRippleView(context: Context?, attrs: AttributeSet?) : View(context, at ) } + private fun setupRippleFadeParams() { + with(rippleShader) { + baseRingFadeParams.fadeOutStart = RippleShader.DEFAULT_BASE_RING_FADE_OUT_START + baseRingFadeParams.fadeOutEnd = RippleShader.DEFAULT_FADE_OUT_END + + centerFillFadeParams.fadeInStart = RippleShader.DEFAULT_FADE_IN_START + centerFillFadeParams.fadeInEnd = RippleShader.DEFAULT_CENTER_FILL_FADE_IN_END + centerFillFadeParams.fadeOutStart = RippleShader.DEFAULT_CENTER_FILL_FADE_OUT_START + centerFillFadeParams.fadeOutEnd = RippleShader.DEFAULT_CENTER_FILL_FADE_OUT_END + } + } + override fun onDraw(canvas: Canvas?) { // To reduce overdraw, we mask the effect to a circle whose radius is big enough to cover // the active effect area. Values here should be kept in sync with the diff --git a/packages/SystemUI/src/com/android/systemui/common/coroutine/CoroutineResult.kt b/packages/SystemUI/src/com/android/systemui/common/coroutine/CoroutineResult.kt new file mode 100644 index 000000000000..b9736671b5ab --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/common/coroutine/CoroutineResult.kt @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.android.systemui.common.coroutine + +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.TimeoutCancellationException +import kotlinx.coroutines.currentCoroutineContext +import kotlinx.coroutines.ensureActive +import kotlinx.coroutines.withTimeout + +/** + * Calls the specified function [block] and returns its encapsulated result if invocation was + * successful, catching any [Throwable] exception that was thrown from the block function execution + * and encapsulating it as a failure. + * + * Unlike [runCatching], [suspendRunCatching] does not break structured concurrency by rethrowing + * any [CancellationException]. + * + * **Heads-up:** [TimeoutCancellationException] extends [CancellationException] but catching it does + * not breaks structured concurrency and therefore, will not be rethrown. Therefore, you can use + * [suspendRunCatching] with [withTimeout], and handle any timeout gracefully. + * + * @see <a href="https://github.com/Kotlin/kotlinx.coroutines/issues/1814">link</a> + */ +suspend inline fun <T> suspendRunCatching(crossinline block: suspend () -> T): Result<T> = + try { + Result.success(block()) + } catch (e: Throwable) { + // Ensures the try-catch block will not break structured concurrency. + currentCoroutineContext().ensureActive() + Result.failure(e) + } + +/** + * Calls the specified function [block] and returns its encapsulated result if invocation was + * successful, catching any [Throwable] exception that was thrown from the block function execution + * and encapsulating it as a failure. + * + * Unlike [runCatching], [suspendRunCatching] does not break structured concurrency by rethrowing + * any [CancellationException]. + * + * **Heads-up:** [TimeoutCancellationException] extends [CancellationException] but catching it does + * not breaks structured concurrency and therefore, will not be rethrown. Therefore, you can use + * [suspendRunCatching] with [withTimeout], and handle any timeout gracefully. + * + * @see <a href="https://github.com/Kotlin/kotlinx.coroutines/issues/1814">link</a> + */ +suspend inline fun <T, R> T.suspendRunCatching(crossinline block: suspend T.() -> R): Result<R> = + // Overload with a `this` receiver, matches with `kotlin.runCatching` functions. + // Qualified name needs to be used to avoid a recursive call. + com.android.systemui.common.coroutine.suspendRunCatching { block(this) } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java index 96bfa4323f95..b054c7ee2eaf 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java @@ -32,6 +32,7 @@ import android.app.StatsManager; import android.app.UiModeManager; import android.app.WallpaperManager; import android.app.admin.DevicePolicyManager; +import android.app.ambientcontext.AmbientContextManager; import android.app.job.JobScheduler; import android.app.role.RoleManager; import android.app.smartspace.SmartspaceManager; @@ -80,6 +81,7 @@ import android.permission.PermissionManager; import android.safetycenter.SafetyCenterManager; import android.service.dreams.DreamService; import android.service.dreams.IDreamManager; +import android.service.vr.IVrManager; import android.telecom.TelecomManager; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; @@ -147,6 +149,13 @@ public class FrameworkServicesModule { return Optional.ofNullable(context.getSystemService(SystemUpdateManager.class)); } + @Provides + @Nullable + @Singleton + static AmbientContextManager provideAmbientContextManager(Context context) { + return context.getSystemService(AmbientContextManager.class); + } + /** */ @Provides public AmbientDisplayConfiguration provideAmbientDisplayConfiguration(Context context) { @@ -268,6 +277,13 @@ public class FrameworkServicesModule { @Provides @Singleton @Nullable + static IVrManager provideIVrManager() { + return IVrManager.Stub.asInterface(ServiceManager.getService(Context.VR_SERVICE)); + } + + @Provides + @Singleton + @Nullable static FaceManager provideFaceManager(Context context) { if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) { return context.getSystemService(FaceManager.class); diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index 5eb7831692ab..6ff406c33492 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -68,7 +68,7 @@ object Flags { @JvmField val DISABLE_FSI = unreleasedFlag(265804648, "disable_fsi") // TODO(b/254512538): Tracking Bug - val INSTANT_VOICE_REPLY = unreleasedFlag(111, "instant_voice_reply", teamfood = true) + val INSTANT_VOICE_REPLY = releasedFlag(111, "instant_voice_reply") // TODO(b/254512425): Tracking Bug val NOTIFICATION_MEMORY_MONITOR_ENABLED = @@ -343,8 +343,7 @@ object Flags { val MEDIA_EXPLICIT_INDICATOR = releasedFlag(911, "media_explicit_indicator") // TODO(b/265813373): Tracking Bug - val MEDIA_TAP_TO_TRANSFER_DISMISS_GESTURE = - unreleasedFlag(912, "media_ttt_dismiss_gesture", teamfood = true) + val MEDIA_TAP_TO_TRANSFER_DISMISS_GESTURE = releasedFlag(912, "media_ttt_dismiss_gesture") // TODO(b/266157412): Tracking Bug val MEDIA_RETAIN_SESSIONS = releasedFlag(913, "media_retain_sessions") @@ -525,7 +524,7 @@ object Flags { // 1500 - chooser aka sharesheet // TODO(b/254512507): Tracking Bug - val CHOOSER_UNBUNDLED = releasedFlag(1500, "chooser_unbundled") + val CHOOSER_UNBUNDLED = unreleasedFlag(1500, "chooser_unbundled", teamfood = true) // TODO(b/266983432) Tracking Bug val SHARESHEET_CUSTOM_ACTIONS = diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepository.kt index 0af596a53a4d..baadc66170cc 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepository.kt @@ -20,9 +20,12 @@ import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED import android.content.Context import android.content.IntentFilter +import android.hardware.biometrics.BiometricManager +import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback import android.os.Looper import android.os.UserHandle import com.android.internal.widget.LockPatternUtils +import com.android.systemui.Dumpable import com.android.systemui.biometrics.AuthController import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging @@ -31,7 +34,9 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.dump.DumpManager import com.android.systemui.user.data.repository.UserRepository +import java.io.PrintWriter import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope @@ -39,10 +44,12 @@ import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.transformLatest @@ -57,6 +64,15 @@ interface BiometricSettingsRepository { /** Whether any fingerprints are enrolled for the current user. */ val isFingerprintEnrolled: StateFlow<Boolean> + /** Whether face authentication is enrolled for the current user. */ + val isFaceEnrolled: Flow<Boolean> + + /** + * Whether face authentication is enabled/disabled based on system settings like device policy, + * biometrics setting. + */ + val isFaceAuthenticationEnabled: Flow<Boolean> + /** * Whether the current user is allowed to use a strong biometric for device entry based on * Android Security policies. If false, the user may be able to use primary authentication for @@ -80,16 +96,34 @@ constructor( devicePolicyManager: DevicePolicyManager, @Application scope: CoroutineScope, @Background backgroundDispatcher: CoroutineDispatcher, + biometricManager: BiometricManager?, @Main looper: Looper, -) : BiometricSettingsRepository { + dumpManager: DumpManager, +) : BiometricSettingsRepository, Dumpable { + + init { + dumpManager.registerDumpable(this) + } + + override fun dump(pw: PrintWriter, args: Array<String?>) { + pw.println("isFingerprintEnrolled=${isFingerprintEnrolled.value}") + pw.println("isStrongBiometricAllowed=${isStrongBiometricAllowed.value}") + pw.println("isFingerprintEnabledByDevicePolicy=${isFingerprintEnabledByDevicePolicy.value}") + } /** UserId of the current selected user. */ private val selectedUserId: Flow<Int> = userRepository.selectedUserInfo.map { it.id }.distinctUntilChanged() + private val devicePolicyChangedForAllUsers = + broadcastDispatcher.broadcastFlow( + filter = IntentFilter(ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED), + user = UserHandle.ALL + ) + override val isFingerprintEnrolled: StateFlow<Boolean> = selectedUserId - .flatMapLatest { + .flatMapLatest { currentUserId -> conflatedCallbackFlow { val callback = object : AuthController.Callback { @@ -98,7 +132,7 @@ constructor( userId: Int, hasEnrollments: Boolean ) { - if (sensorBiometricType.isFingerprint) { + if (sensorBiometricType.isFingerprint && userId == currentUserId) { trySendWithFailureLogging( hasEnrollments, TAG, @@ -118,6 +152,77 @@ constructor( authController.isFingerprintEnrolled(userRepository.getSelectedUserInfo().id) ) + override val isFaceEnrolled: Flow<Boolean> = + selectedUserId.flatMapLatest { selectedUserId: Int -> + conflatedCallbackFlow { + val callback = + object : AuthController.Callback { + override fun onEnrollmentsChanged( + sensorBiometricType: BiometricType, + userId: Int, + hasEnrollments: Boolean + ) { + // TODO(b/242022358), use authController.isFaceAuthEnrolled after + // ag/20176811 is available. + if ( + sensorBiometricType == BiometricType.FACE && + userId == selectedUserId + ) { + trySendWithFailureLogging( + hasEnrollments, + TAG, + "Face enrollment changed" + ) + } + } + } + authController.addCallback(callback) + trySendWithFailureLogging( + authController.isFaceAuthEnrolled(selectedUserId), + TAG, + "Initial value of face auth enrollment" + ) + awaitClose { authController.removeCallback(callback) } + } + } + + override val isFaceAuthenticationEnabled: Flow<Boolean> + get() = + combine(isFaceEnabledByBiometricsManager, isFaceEnabledByDevicePolicy) { + biometricsManagerSetting, + devicePolicySetting -> + biometricsManagerSetting && devicePolicySetting + } + + private val isFaceEnabledByDevicePolicy: Flow<Boolean> = + combine(selectedUserId, devicePolicyChangedForAllUsers) { userId, _ -> + devicePolicyManager.isFaceDisabled(userId) + } + .onStart { + emit(devicePolicyManager.isFaceDisabled(userRepository.getSelectedUserInfo().id)) + } + .flowOn(backgroundDispatcher) + .distinctUntilChanged() + + private val isFaceEnabledByBiometricsManager = + conflatedCallbackFlow { + val callback = + object : IBiometricEnabledOnKeyguardCallback.Stub() { + override fun onChanged(enabled: Boolean, userId: Int) { + trySendWithFailureLogging( + enabled, + TAG, + "biometricsEnabled state changed" + ) + } + } + biometricManager?.registerEnabledOnKeyguardCallback(callback) + awaitClose {} + } + // This is because the callback is binder-based and we want to avoid multiple callbacks + // being registered. + .stateIn(scope, SharingStarted.Eagerly, false) + override val isStrongBiometricAllowed: StateFlow<Boolean> = selectedUserId .flatMapLatest { currUserId -> @@ -155,17 +260,8 @@ constructor( override val isFingerprintEnabledByDevicePolicy: StateFlow<Boolean> = selectedUserId .flatMapLatest { userId -> - broadcastDispatcher - .broadcastFlow( - filter = IntentFilter(ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED), - user = UserHandle.ALL - ) - .transformLatest { - emit( - (devicePolicyManager.getKeyguardDisabledFeatures(null, userId) and - DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT) == 0 - ) - } + devicePolicyChangedForAllUsers + .transformLatest { emit(devicePolicyManager.isFingerprintDisabled(userId)) } .flowOn(backgroundDispatcher) .distinctUntilChanged() } @@ -173,13 +269,21 @@ constructor( scope, started = SharingStarted.Eagerly, initialValue = - devicePolicyManager.getKeyguardDisabledFeatures( - null, + devicePolicyManager.isFingerprintDisabled( userRepository.getSelectedUserInfo().id - ) and DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT == 0 + ) ) companion object { private const val TAG = "BiometricsRepositoryImpl" } } + +private fun DevicePolicyManager.isFaceDisabled(userId: Int): Boolean = + isNotActive(userId, DevicePolicyManager.KEYGUARD_DISABLE_FACE) + +private fun DevicePolicyManager.isFingerprintDisabled(userId: Int): Boolean = + isNotActive(userId, DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT) + +private fun DevicePolicyManager.isNotActive(userId: Int, policy: Int): Boolean = + (getKeyguardDisabledFeatures(null, userId) and policy) == 0 diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepository.kt index b3a9cf58310a..7c466845a923 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepository.kt @@ -19,10 +19,13 @@ package com.android.systemui.keyguard.data.repository import android.hardware.biometrics.BiometricSourceType import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitorCallback +import com.android.systemui.Dumpable import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dump.DumpManager +import java.io.PrintWriter import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.awaitClose @@ -49,7 +52,16 @@ class DeviceEntryFingerprintAuthRepositoryImpl constructor( val keyguardUpdateMonitor: KeyguardUpdateMonitor, @Application scope: CoroutineScope, -) : DeviceEntryFingerprintAuthRepository { + dumpManager: DumpManager, +) : DeviceEntryFingerprintAuthRepository, Dumpable { + + init { + dumpManager.registerDumpable(this) + } + + override fun dump(pw: PrintWriter, args: Array<String?>) { + pw.println("isLockedOut=${isLockedOut.value}") + } override val isLockedOut: StateFlow<Boolean> = conflatedCallbackFlow { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt index 7bc6c345e8c7..091acadea632 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardBouncerRepository.kt @@ -162,7 +162,7 @@ constructor( private val _isAlternateBouncerVisible = MutableStateFlow(false) override val isAlternateBouncerVisible = _isAlternateBouncerVisible.asStateFlow() override var lastAlternateBouncerVisibleTime: Long = NOT_VISIBLE - private val _isAlternateBouncerUIAvailable = MutableStateFlow<Boolean>(false) + private val _isAlternateBouncerUIAvailable = MutableStateFlow(false) override val isAlternateBouncerUIAvailable: StateFlow<Boolean> = _isAlternateBouncerUIAvailable.asStateFlow() @@ -290,6 +290,9 @@ constructor( resourceUpdateRequests .logDiffsForTable(buffer, "", "ResourceUpdateRequests", false) .launchIn(applicationScope) + isAlternateBouncerUIAvailable + .logDiffsForTable(buffer, "", "IsAlternateBouncerUIAvailable", false) + .launchIn(applicationScope) } companion object { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/constants/KeyguardBouncerConstants.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/constants/KeyguardBouncerConstants.kt index 8222dd54f46d..3b3ec39d0209 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/constants/KeyguardBouncerConstants.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/shared/constants/KeyguardBouncerConstants.kt @@ -26,4 +26,10 @@ object KeyguardBouncerConstants { const val EXPANSION_HIDDEN = 1f const val EXPANSION_VISIBLE = 0f const val ALPHA_EXPANSION_THRESHOLD = 0.95f + + /** + * This value is used for denoting the PIN length at which we want to layout the view in which + * PIN hinting is enabled + */ + const val DEFAULT_PIN_LENGTH = 6 } diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt index a3ae943c9704..720c44a0904b 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt @@ -44,25 +44,37 @@ class MediaTttUtils { * @param appPackageName the package name of the app playing the media. * @param onPackageNotFoundException a function run if a * [PackageManager.NameNotFoundException] occurs. + * @param isReceiver indicates whether the icon is displayed in a receiver view. */ fun getIconInfoFromPackageName( context: Context, appPackageName: String?, + isReceiver: Boolean, onPackageNotFoundException: () -> Unit, ): IconInfo { if (appPackageName != null) { val packageManager = context.packageManager try { + val appName = + packageManager + .getApplicationInfo( + appPackageName, + PackageManager.ApplicationInfoFlags.of(0), + ) + .loadLabel(packageManager) + .toString() val contentDescription = - ContentDescription.Loaded( - packageManager - .getApplicationInfo( - appPackageName, - PackageManager.ApplicationInfoFlags.of(0) + if (isReceiver) { + ContentDescription.Loaded( + context.getString( + R.string + .media_transfer_receiver_content_description_with_app_name, + appName ) - .loadLabel(packageManager) - .toString() - ) + ) + } else { + ContentDescription.Loaded(appName) + } return IconInfo( contentDescription, MediaTttIcon.Loaded(packageManager.getApplicationIcon(appPackageName)), @@ -74,7 +86,15 @@ class MediaTttUtils { } } return IconInfo( - ContentDescription.Resource(R.string.media_output_dialog_unknown_launch_app_name), + if (isReceiver) { + ContentDescription.Resource( + R.string.media_transfer_receiver_content_description_unknown_app + ) + } else { + ContentDescription.Resource( + R.string.media_output_dialog_unknown_launch_app_name + ) + }, MediaTttIcon.Resource(R.drawable.ic_cast), tintAttr = android.R.attr.textColorPrimary, isAppIcon = false diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt index 34bf74faa11a..8000cd84b151 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt @@ -173,7 +173,11 @@ open class MediaTttChipControllerReceiver @Inject constructor( override fun updateView(newInfo: ChipReceiverInfo, currentView: ViewGroup) { val packageName = newInfo.routeInfo.clientPackageName - var iconInfo = MediaTttUtils.getIconInfoFromPackageName(context, packageName) { + var iconInfo = MediaTttUtils.getIconInfoFromPackageName( + context, + packageName, + isReceiver = true, + ) { logger.logPackageNotFound(packageName) } diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt index 89ca5d33645c..6bb6906a0dfc 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt @@ -161,7 +161,7 @@ constructor( routeInfo.name.toString() } val icon = - MediaTttUtils.getIconInfoFromPackageName(context, packageName) { + MediaTttUtils.getIconInfoFromPackageName(context, packageName, isReceiver = false) { logger.logPackageNotFound(packageName) } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 35423f4c4140..d5d73258bb08 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -30,7 +30,6 @@ import static android.view.InsetsState.ITYPE_BOTTOM_TAPPABLE_ELEMENT; import static android.view.InsetsState.ITYPE_LEFT_GESTURES; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_RIGHT_GESTURES; -import static android.view.InsetsState.containsType; import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; @@ -85,7 +84,6 @@ import android.view.DisplayCutout; import android.view.Gravity; import android.view.HapticFeedbackConstants; import android.view.InsetsFrameProvider; -import android.view.InsetsState.InternalInsetsType; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.Surface; @@ -97,6 +95,7 @@ import android.view.ViewRootImpl.SurfaceChangedCallback; import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.InternalInsetsInfo; import android.view.ViewTreeObserver.OnComputeInternalInsetsListener; +import android.view.WindowInsets; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowInsetsController.Appearance; import android.view.WindowInsetsController.Behavior; @@ -1150,12 +1149,11 @@ public class NavigationBar extends ViewController<NavigationBarView> implements } @Override - public void showTransient(int displayId, @InternalInsetsType int[] types, - boolean isGestureOnSystemBar) { + public void showTransient(int displayId, @InsetsType int types, boolean isGestureOnSystemBar) { if (displayId != mDisplayId) { return; } - if (!containsType(types, ITYPE_NAVIGATION_BAR)) { + if ((types & WindowInsets.Type.navigationBars()) == 0) { return; } if (!mTransientShown) { @@ -1166,11 +1164,11 @@ public class NavigationBar extends ViewController<NavigationBarView> implements } @Override - public void abortTransient(int displayId, @InternalInsetsType int[] types) { + public void abortTransient(int displayId, @InsetsType int types) { if (displayId != mDisplayId) { return; } - if (!containsType(types, ITYPE_NAVIGATION_BAR)) { + if ((types & WindowInsets.Type.navigationBars()) == 0) { return; } clearTransient(); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java index f3712e66e330..c3d736917b5d 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java @@ -20,8 +20,6 @@ import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED; import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT; import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SWITCHER_SHOWN; import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; -import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR; -import static android.view.InsetsState.containsType; import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; @@ -41,7 +39,6 @@ import static com.android.systemui.statusbar.phone.BarTransitions.TransitionMode import android.app.StatusBarManager; import android.app.StatusBarManager.WindowVisibleState; -import android.content.ComponentName; import android.content.Context; import android.content.res.Configuration; import android.graphics.Rect; @@ -52,6 +49,7 @@ import android.os.RemoteException; import android.util.Log; import android.view.Display; import android.view.View; +import android.view.WindowInsets; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowInsetsController.Appearance; import android.view.WindowInsetsController.Behavior; @@ -68,7 +66,6 @@ import com.android.systemui.model.SysUiState; import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.shared.recents.utilities.Utilities; -import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListeners; @@ -401,11 +398,11 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, } @Override - public void showTransient(int displayId, int[] types, boolean isGestureOnSystemBar) { + public void showTransient(int displayId, @InsetsType int types, boolean isGestureOnSystemBar) { if (displayId != mDisplayId) { return; } - if (!containsType(types, ITYPE_EXTRA_NAVIGATION_BAR)) { + if ((types & WindowInsets.Type.navigationBars()) == 0) { return; } if (!mTaskbarTransientShowing) { @@ -415,11 +412,11 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, } @Override - public void abortTransient(int displayId, int[] types) { + public void abortTransient(int displayId, @InsetsType int types) { if (displayId != mDisplayId) { return; } - if (!containsType(types, ITYPE_EXTRA_NAVIGATION_BAR)) { + if ((types & WindowInsets.Type.navigationBars()) == 0) { return; } clearTransient(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 3aaad87b8eab..2cf1f53b4499 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -53,7 +53,6 @@ import android.os.Process; import android.os.RemoteException; import android.util.Pair; import android.util.SparseArray; -import android.view.InsetsState.InternalInsetsType; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowInsetsController.Appearance; import android.view.WindowInsetsController.Behavior; @@ -371,22 +370,22 @@ public class CommandQueue extends IStatusBar.Stub implements String packageName, LetterboxDetails[] letterboxDetails) { } /** - * @see IStatusBar#showTransient(int, int[], boolean). + * @see IStatusBar#showTransient(int, int, boolean). */ - default void showTransient(int displayId, @InternalInsetsType int[] types) { } + default void showTransient(int displayId, @InsetsType int types) { } /** - * @see IStatusBar#showTransient(int, int[], boolean). + * @see IStatusBar#showTransient(int, int, boolean). */ - default void showTransient(int displayId, @InternalInsetsType int[] types, + default void showTransient(int displayId, @InsetsType int types, boolean isGestureOnSystemBar) { showTransient(displayId, types); } /** - * @see IStatusBar#abortTransient(int, int[]). + * @see IStatusBar#abortTransient(int, int). */ - default void abortTransient(int displayId, @InternalInsetsType int[] types) { } + default void abortTransient(int displayId, @InsetsType int types) { } /** * Called to notify System UI that a warning about the device going to sleep @@ -1131,17 +1130,23 @@ public class CommandQueue extends IStatusBar.Stub implements } @Override - public void showTransient(int displayId, int[] types, boolean isGestureOnSystemBar) { + public void showTransient(int displayId, int types, boolean isGestureOnSystemBar) { synchronized (mLock) { - mHandler.obtainMessage(MSG_SHOW_TRANSIENT, displayId, isGestureOnSystemBar ? 1 : 0, - types).sendToTarget(); + SomeArgs args = SomeArgs.obtain(); + args.argi1 = displayId; + args.argi2 = types; + args.argi3 = isGestureOnSystemBar ? 1 : 0; + mHandler.obtainMessage(MSG_SHOW_TRANSIENT, args).sendToTarget(); } } @Override - public void abortTransient(int displayId, int[] types) { + public void abortTransient(int displayId, int types) { synchronized (mLock) { - mHandler.obtainMessage(MSG_ABORT_TRANSIENT, displayId, 0, types).sendToTarget(); + SomeArgs args = SomeArgs.obtain(); + args.argi1 = displayId; + args.argi2 = types; + mHandler.obtainMessage(MSG_ABORT_TRANSIENT, args).sendToTarget(); } } @@ -1644,17 +1649,21 @@ public class CommandQueue extends IStatusBar.Stub implements args.recycle(); break; case MSG_SHOW_TRANSIENT: { - final int displayId = msg.arg1; - final int[] types = (int[]) msg.obj; - final boolean isGestureOnSystemBar = msg.arg2 != 0; + args = (SomeArgs) msg.obj; + final int displayId = args.argi1; + final int types = args.argi2; + final boolean isGestureOnSystemBar = args.argi3 != 0; + args.recycle(); for (int i = 0; i < mCallbacks.size(); i++) { mCallbacks.get(i).showTransient(displayId, types, isGestureOnSystemBar); } break; } case MSG_ABORT_TRANSIENT: { - final int displayId = msg.arg1; - final int[] types = (int[]) msg.obj; + args = (SomeArgs) msg.obj; + final int displayId = args.argi1; + final int types = args.argi2; + args.recycle(); for (int i = 0; i < mCallbacks.size(); i++) { mCallbacks.get(i).abortTransient(displayId, types); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index a6b71dc3e54d..9275e2b603c3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -591,7 +591,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } mShowingPublicInitialized = false; updateNotificationColor(); - updateLongClickable(); if (mMenuRow != null) { mMenuRow.onNotificationUpdated(mEntry.getSbn()); mMenuRow.setAppName(mAppName); @@ -1197,26 +1196,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView return getShowingLayout().getVisibleWrapper(); } - private boolean isNotificationRowLongClickable() { - if (mLongPressListener == null) { - return false; - } - - if (!areGutsExposed()) { // guts is not opened - return true; - } - - // if it is leave behind, it shouldn't be long clickable. - return !isGutsLeaveBehind(); - } - - private void updateLongClickable() { - setLongClickable(isNotificationRowLongClickable()); - } - public void setLongPressListener(LongPressListener longPressListener) { mLongPressListener = longPressListener; - updateLongClickable(); } public void setDragController(ExpandableNotificationRowDragController dragController) { @@ -2063,13 +2044,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView void onGutsOpened() { resetTranslation(); updateContentAccessibilityImportanceForGuts(false /* isEnabled */); - updateLongClickable(); } void onGutsClosed() { updateContentAccessibilityImportanceForGuts(true /* isEnabled */); mIsSnoozed = false; - updateLongClickable(); } /** @@ -2968,10 +2947,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView return (mGuts != null && mGuts.isExposed()); } - private boolean isGutsLeaveBehind() { - return (mGuts != null && mGuts.isLeavebehind()); - } - @Override public boolean isContentExpandable() { if (mIsSummaryWithChildren && !shouldShowPublic()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java index efcbb3cd9655..37ff11db81e3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java @@ -586,9 +586,7 @@ public class NotificationGutsManager implements NotifGutsViewManager { } final ExpandableNotificationRow row = (ExpandableNotificationRow) view; - if (view.isLongClickable()) { - view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); - } + view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); if (row.areGutsExposed()) { closeAndSaveGuts(false /* removeLeavebehind */, false /* force */, true /* removeControls */, -1 /* x */, -1 /* y */, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java index 856d7dedb4eb..fecaa3a0caf5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java @@ -16,9 +16,6 @@ package com.android.systemui.statusbar.phone; -import static android.view.InsetsState.ITYPE_STATUS_BAR; -import static android.view.InsetsState.containsType; - import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_AWAKE; import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_WAKING; @@ -36,8 +33,8 @@ import android.os.VibrationEffect; import android.os.Vibrator; import android.util.Log; import android.util.Slog; -import android.view.InsetsState.InternalInsetsType; import android.view.KeyEvent; +import android.view.WindowInsets; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowInsetsController.Appearance; import android.view.WindowInsetsController.Behavior; @@ -168,11 +165,11 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba } @Override - public void abortTransient(int displayId, @InternalInsetsType int[] types) { + public void abortTransient(int displayId, @InsetsType int types) { if (displayId != mDisplayId) { return; } - if (!containsType(types, ITYPE_STATUS_BAR)) { + if ((types & WindowInsets.Type.statusBars()) == 0) { return; } mCentralSurfaces.clearTransient(); @@ -489,12 +486,11 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba } @Override - public void showTransient(int displayId, @InternalInsetsType int[] types, - boolean isGestureOnSystemBar) { + public void showTransient(int displayId, @InsetsType int types, boolean isGestureOnSystemBar) { if (displayId != mDisplayId) { return; } - if (!containsType(types, ITYPE_STATUS_BAR)) { + if ((types & WindowInsets.Type.statusBars()) == 0) { return; } mCentralSurfaces.showTransientUnchecked(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index e595ddf46a89..1966a6657acb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -21,8 +21,6 @@ import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN; import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; import static android.app.StatusBarManager.WindowVisibleState; import static android.app.StatusBarManager.windowStateToString; -import static android.view.InsetsState.ITYPE_STATUS_BAR; -import static android.view.InsetsState.containsType; import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS; import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_STATUS_BARS; import static android.view.WindowInsetsController.APPEARANCE_SEMI_TRANSPARENT_STATUS_BARS; @@ -100,6 +98,7 @@ import android.view.ThreadedRenderer; import android.view.View; import android.view.ViewGroup; import android.view.ViewRootImpl; +import android.view.WindowInsets; import android.view.WindowInsetsController.Appearance; import android.view.WindowManager; import android.view.WindowManagerGlobal; @@ -943,7 +942,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { // Set up the initial notification state. This needs to happen before CommandQueue.disable() setUpPresenter(); - if (containsType(result.mTransientBarTypes, ITYPE_STATUS_BAR)) { + if ((result.mTransientBarTypes & WindowInsets.Type.statusBars()) != 0) { showTransientUnchecked(); } mCommandQueueCallbacks.onSystemBarAttributesChanged(mDisplayId, result.mAppearance, diff --git a/packages/SystemUI/src/com/android/systemui/util/BackupManagerProxy.kt b/packages/SystemUI/src/com/android/systemui/util/BackupManagerProxy.kt new file mode 100644 index 000000000000..f5424348c740 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/util/BackupManagerProxy.kt @@ -0,0 +1,17 @@ +package com.android.systemui.util + +import android.app.backup.BackupManager +import com.android.systemui.dagger.SysUISingleton +import javax.inject.Inject + +/** Wrapper around [BackupManager] useful for testing. */ +@SysUISingleton +class BackupManagerProxy @Inject constructor() { + + /** Wrapped version of [BackupManager.dataChanged] */ + fun dataChanged(packageName: String) = BackupManager.dataChanged(packageName) + + /** Wrapped version of [BackupManager.dataChangedForUser] */ + fun dataChangedForUser(userId: Int, packageName: String) = + BackupManager.dataChangedForUser(userId, packageName) +} diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt index cdb7bbb9f823..a1af8e8fac9c 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPinViewControllerTest.kt @@ -27,11 +27,14 @@ import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingCollector import com.android.systemui.classifier.FalsingCollectorFake +import com.android.systemui.flags.FeatureFlags +import com.android.systemui.flags.Flags import com.android.systemui.statusbar.policy.DevicePostureController import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.anyBoolean +import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyString import org.mockito.Mock import org.mockito.Mockito @@ -71,6 +74,11 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { private val falsingCollector: FalsingCollector = FalsingCollectorFake() @Mock lateinit var postureController: DevicePostureController + @Mock lateinit var featureFlags: FeatureFlags + @Mock lateinit var passwordTextView: PasswordTextView + @Mock lateinit var deleteButton: NumPadButton + @Mock lateinit var enterButton: View + lateinit var pinViewController: KeyguardPinViewController @Before @@ -82,7 +90,13 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { keyguardMessageAreaControllerFactory.create(any(KeyguardMessageArea::class.java)) ) .thenReturn(keyguardMessageAreaController) + `when`(keyguardPinView.passwordTextViewId).thenReturn(R.id.pinEntry) + `when`(keyguardPinView.findViewById<PasswordTextView>(R.id.pinEntry)) + .thenReturn(passwordTextView) `when`(keyguardPinView.resources).thenReturn(context.resources) + `when`(keyguardPinView.findViewById<NumPadButton>(R.id.delete_button)) + .thenReturn(deleteButton) + `when`(keyguardPinView.findViewById<View>(R.id.key_enter)).thenReturn(enterButton) pinViewController = KeyguardPinViewController( keyguardPinView, @@ -95,7 +109,8 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { liftToActivateListener, mEmergencyButtonController, falsingCollector, - postureController + postureController, + featureFlags ) } @@ -112,4 +127,18 @@ class KeyguardPinViewControllerTest : SysuiTestCase() { pinViewController.startAppearAnimation() verify(keyguardMessageAreaController, Mockito.never()).setMessage(anyString(), anyBoolean()) } + + @Test + fun startAppearAnimation_withAutoPinConfirmation() { + `when`(featureFlags.isEnabled(Flags.AUTO_PIN_CONFIRMATION)).thenReturn(true) + `when`(lockPatternUtils.getPinLength(anyInt())).thenReturn(6) + `when`(lockPatternUtils.isAutoPinConfirmEnabled(anyInt())).thenReturn(true) + `when`(passwordTextView.text).thenReturn("") + + pinViewController.startAppearAnimation() + verify(deleteButton).visibility = View.INVISIBLE + verify(enterButton).visibility = View.INVISIBLE + verify(passwordTextView).setUsePinShapes(true) + verify(passwordTextView).setIsPinHinting(true) + } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/PinShapeHintingViewTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/PinShapeHintingViewTest.kt new file mode 100644 index 000000000000..42e12df431c5 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/keyguard/PinShapeHintingViewTest.kt @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.keyguard + +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.view.LayoutInflater +import androidx.test.filters.SmallTest +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.google.common.truth.Truth +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidTestingRunner::class) +@TestableLooper.RunWithLooper +class PinShapeHintingViewTest : SysuiTestCase() { + lateinit var underTest: PinShapeHintingView + + @Before + fun setup() { + underTest = + LayoutInflater.from(context).inflate(R.layout.keyguard_pin_shape_hinting_view, null) + as PinShapeHintingView + } + + @Test + fun testAppend() { + // Add more when animation part is complete + underTest.append() + Truth.assertThat(underTest.childCount).isEqualTo(6) + } + + @Test + fun testDelete() { + underTest.delete() + Truth.assertThat(underTest.childCount).isEqualTo(6) + } + + @Test + fun testReset() { + for (i in 0 until 3) { + underTest.append() + } + underTest.reset() + Truth.assertThat(underTest.childCount).isEqualTo(6) + } +} diff --git a/packages/SystemUI/tests/src/com/android/keyguard/PinShapeNonHintingViewTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/PinShapeNonHintingViewTest.kt new file mode 100644 index 000000000000..c04fd39168de --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/keyguard/PinShapeNonHintingViewTest.kt @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.keyguard + +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.view.LayoutInflater +import androidx.test.filters.SmallTest +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.google.common.truth.Truth +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidTestingRunner::class) +@TestableLooper.RunWithLooper +class PinShapeNonHintingViewTest : SysuiTestCase() { + lateinit var underTest: PinShapeNonHintingView + + @Before + fun setup() { + underTest = + LayoutInflater.from(context).inflate(R.layout.keyguard_pin_shape_non_hinting_view, null) + as PinShapeNonHintingView + } + + @Test + fun testAppend() { + // Add more when animation part is complete + underTest.append() + Truth.assertThat(underTest.childCount).isEqualTo(1) + } + + @Test + fun testDelete() { + for (i in 0 until 3) { + underTest.append() + } + underTest.delete() + + underTest.postDelayed( + { Truth.assertThat(underTest.childCount).isEqualTo(2) }, + PasswordTextView.DISAPPEAR_DURATION + 100L + ) + } + + @Test + fun testReset() { + for (i in 0 until 3) { + underTest.append() + } + underTest.reset() + underTest.postDelayed( + { Truth.assertThat(underTest.childCount).isEqualTo(0) }, + PasswordTextView.DISAPPEAR_DURATION + 100L + ) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/ChooserSelectorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/ChooserSelectorTest.kt index babbe451dd6a..32edf8f23aed 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/ChooserSelectorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/ChooserSelectorTest.kt @@ -11,7 +11,6 @@ import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flag import com.android.systemui.flags.FlagListenable import com.android.systemui.flags.Flags -import com.android.systemui.flags.ReleasedFlag import com.android.systemui.flags.UnreleasedFlag import com.android.systemui.settings.UserTracker import com.android.systemui.util.mockito.any @@ -103,7 +102,7 @@ class ChooserSelectorTest : SysuiTestCase() { @Test fun initialize_enablesUnbundledChooser_whenFlagEnabled() { // Arrange - setFlagMock(true) + whenever(mockFeatureFlags.isEnabled(any<UnreleasedFlag>())).thenReturn(true) // Act chooserSelector.start() @@ -119,7 +118,7 @@ class ChooserSelectorTest : SysuiTestCase() { @Test fun initialize_disablesUnbundledChooser_whenFlagDisabled() { // Arrange - setFlagMock(false) + whenever(mockFeatureFlags.isEnabled(any<UnreleasedFlag>())).thenReturn(false) // Act chooserSelector.start() @@ -135,7 +134,7 @@ class ChooserSelectorTest : SysuiTestCase() { @Test fun enablesUnbundledChooser_whenFlagBecomesEnabled() { // Arrange - setFlagMock(false) + whenever(mockFeatureFlags.isEnabled(any<UnreleasedFlag>())).thenReturn(false) chooserSelector.start() verify(mockFeatureFlags).addListener( eq<Flag<*>>(Flags.CHOOSER_UNBUNDLED), @@ -148,7 +147,7 @@ class ChooserSelectorTest : SysuiTestCase() { ) // Act - setFlagMock(true) + whenever(mockFeatureFlags.isEnabled(any<UnreleasedFlag>())).thenReturn(true) flagListener.value.onFlagChanged(TestFlagEvent(Flags.CHOOSER_UNBUNDLED.name)) // Assert @@ -162,7 +161,7 @@ class ChooserSelectorTest : SysuiTestCase() { @Test fun disablesUnbundledChooser_whenFlagBecomesDisabled() { // Arrange - setFlagMock(true) + whenever(mockFeatureFlags.isEnabled(any<UnreleasedFlag>())).thenReturn(true) chooserSelector.start() verify(mockFeatureFlags).addListener( eq<Flag<*>>(Flags.CHOOSER_UNBUNDLED), @@ -175,7 +174,7 @@ class ChooserSelectorTest : SysuiTestCase() { ) // Act - setFlagMock(false) + whenever(mockFeatureFlags.isEnabled(any<UnreleasedFlag>())).thenReturn(false) flagListener.value.onFlagChanged(TestFlagEvent(Flags.CHOOSER_UNBUNDLED.name)) // Assert @@ -189,7 +188,7 @@ class ChooserSelectorTest : SysuiTestCase() { @Test fun doesNothing_whenAnotherFlagChanges() { // Arrange - setFlagMock(false) + whenever(mockFeatureFlags.isEnabled(any<UnreleasedFlag>())).thenReturn(false) chooserSelector.start() verify(mockFeatureFlags).addListener( eq<Flag<*>>(Flags.CHOOSER_UNBUNDLED), @@ -198,17 +197,13 @@ class ChooserSelectorTest : SysuiTestCase() { clearInvocations(mockPackageManager) // Act + whenever(mockFeatureFlags.isEnabled(any<UnreleasedFlag>())).thenReturn(false) flagListener.value.onFlagChanged(TestFlagEvent("other flag")) // Assert verifyZeroInteractions(mockPackageManager) } - private fun setFlagMock(enabled: Boolean) { - whenever(mockFeatureFlags.isEnabled(any<UnreleasedFlag>())).thenReturn(enabled) - whenever(mockFeatureFlags.isEnabled(any<ReleasedFlag>())).thenReturn(enabled) - } - private class TestFlagEvent(override val flagName: String) : FlagListenable.FlagEvent { override fun requestNoRestart() {} } diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java index 728ea1e71801..5bb5e01675be 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewLayerTest.java @@ -165,14 +165,14 @@ public class MenuViewLayerTest extends SysuiTestCase { } @Test - public void tiggerDismissMenuAction_hideFloatingMenu() { + public void triggerDismissMenuAction_hideFloatingMenu() { mMenuViewLayer.mDismissMenuAction.run(); verify(mFloatingMenu).hide(); } @Test - public void tiggerDismissMenuAction_matchA11yButtonTargetsResult() { + public void triggerDismissMenuAction_matchA11yButtonTargetsResult() { mMenuViewLayer.mDismissMenuAction.run(); verify(mSecureSettings).putStringForUser( Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, /* value= */ "", @@ -180,24 +180,8 @@ public class MenuViewLayerTest extends SysuiTestCase { } @Test - public void tiggerDismissMenuAction_matchEnabledA11yServicesResult() { - Settings.Secure.putString(mContext.getContentResolver(), - Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, - TEST_SELECT_TO_SPEAK_COMPONENT_NAME.flattenToString()); - final ResolveInfo resolveInfo = new ResolveInfo(); - final ServiceInfo serviceInfo = new ServiceInfo(); - final ApplicationInfo applicationInfo = new ApplicationInfo(); - resolveInfo.serviceInfo = serviceInfo; - serviceInfo.applicationInfo = applicationInfo; - applicationInfo.targetSdkVersion = Build.VERSION_CODES.R; - final AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo(); - accessibilityServiceInfo.setResolveInfo(resolveInfo); - accessibilityServiceInfo.flags = AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON; - final List<AccessibilityServiceInfo> serviceInfoList = new ArrayList<>(); - accessibilityServiceInfo.setComponentName(TEST_SELECT_TO_SPEAK_COMPONENT_NAME); - serviceInfoList.add(accessibilityServiceInfo); - when(mStubAccessibilityManager.getEnabledAccessibilityServiceList( - AccessibilityServiceInfo.FEEDBACK_ALL_MASK)).thenReturn(serviceInfoList); + public void triggerDismissMenuAction_matchEnabledA11yServicesResult() { + setupEnabledAccessibilityServiceList(); mMenuViewLayer.mDismissMenuAction.run(); final String value = Settings.Secure.getString(mContext.getContentResolver(), @@ -207,6 +191,21 @@ public class MenuViewLayerTest extends SysuiTestCase { } @Test + public void triggerDismissMenuAction_hasHardwareKeyShortcut_keepEnabledStatus() { + setupEnabledAccessibilityServiceList(); + final List<String> stubShortcutTargets = new ArrayList<>(); + stubShortcutTargets.add(TEST_SELECT_TO_SPEAK_COMPONENT_NAME.flattenToString()); + when(mStubAccessibilityManager.getAccessibilityShortcutTargets( + AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY)).thenReturn(stubShortcutTargets); + + mMenuViewLayer.mDismissMenuAction.run(); + final String value = Settings.Secure.getString(mContext.getContentResolver(), + Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES); + + assertThat(value).isEqualTo(TEST_SELECT_TO_SPEAK_COMPONENT_NAME.flattenToString()); + } + + @Test public void showingImeInsetsChange_notOverlapOnIme_menuKeepOriginalPosition() { final float menuTop = STATUS_BAR_HEIGHT + 100; mMenuAnimationController.moveAndPersistPosition(new PointF(0, menuTop)); @@ -241,6 +240,27 @@ public class MenuViewLayerTest extends SysuiTestCase { assertThat(mMenuView.getTranslationY()).isEqualTo(menuTop); } + private void setupEnabledAccessibilityServiceList() { + Settings.Secure.putString(mContext.getContentResolver(), + Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, + TEST_SELECT_TO_SPEAK_COMPONENT_NAME.flattenToString()); + + final ResolveInfo resolveInfo = new ResolveInfo(); + final ServiceInfo serviceInfo = new ServiceInfo(); + final ApplicationInfo applicationInfo = new ApplicationInfo(); + resolveInfo.serviceInfo = serviceInfo; + serviceInfo.applicationInfo = applicationInfo; + applicationInfo.targetSdkVersion = Build.VERSION_CODES.R; + final AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo(); + accessibilityServiceInfo.setResolveInfo(resolveInfo); + accessibilityServiceInfo.flags = AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON; + final List<AccessibilityServiceInfo> serviceInfoList = new ArrayList<>(); + accessibilityServiceInfo.setComponentName(TEST_SELECT_TO_SPEAK_COMPONENT_NAME); + serviceInfoList.add(accessibilityServiceInfo); + when(mStubAccessibilityManager.getEnabledAccessibilityServiceList( + AccessibilityServiceInfo.FEEDBACK_ALL_MASK)).thenReturn(serviceInfoList); + } + private void dispatchShowingImeInsets() { final WindowInsets fakeShowingImeInsets = fakeImeInsets(/* isImeVisible= */ true); doReturn(fakeShowingImeInsets).when(mWindowMetrics).getWindowInsets(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/common/coroutine/CoroutineResultTest.kt b/packages/SystemUI/tests/src/com/android/systemui/common/coroutine/CoroutineResultTest.kt new file mode 100644 index 000000000000..d552c9d922ff --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/common/coroutine/CoroutineResultTest.kt @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.android.systemui.common.coroutine + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.cancel +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.junit.runner.RunWith + +/** atest SystemUITests:CoroutineResultTest */ +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidTestingRunner::class) +class CoroutineResultTest : SysuiTestCase() { + + @Test + fun suspendRunCatching_shouldReturnSuccess() = runTest { + val actual = suspendRunCatching { "Placeholder" } + assertThat(actual.isSuccess).isTrue() + assertThat(actual.getOrNull()).isEqualTo("Placeholder") + } + + @Test + fun suspendRunCatching_whenExceptionThrow_shouldResumeWithException() = runTest { + val actual = suspendRunCatching { throw Exception() } + assertThat(actual.isFailure).isTrue() + assertThat(actual.exceptionOrNull()).isInstanceOf(Exception::class.java) + } + + @Test(expected = CancellationException::class) + fun suspendRunCatching_whenCancelled_shouldResumeWithException() = runTest { + suspendRunCatching { cancel() } + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt index ddd10493571c..21ad5e2cd311 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt @@ -18,8 +18,12 @@ package com.android.systemui.keyguard.data.repository import android.app.admin.DevicePolicyManager +import android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_FACE +import android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT import android.content.Intent import android.content.pm.UserInfo +import android.hardware.biometrics.BiometricManager +import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback import android.testing.AndroidTestingRunner import android.testing.TestableLooper import androidx.test.filters.SmallTest @@ -29,8 +33,14 @@ import com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUT import com.android.systemui.SysuiTestCase import com.android.systemui.biometrics.AuthController import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.dump.DumpManager +import com.android.systemui.keyguard.data.repository.BiometricType.FACE +import com.android.systemui.keyguard.data.repository.BiometricType.REAR_FINGERPRINT +import com.android.systemui.keyguard.data.repository.BiometricType.SIDE_FINGERPRINT +import com.android.systemui.keyguard.data.repository.BiometricType.UNDER_DISPLAY_FINGERPRINT import com.android.systemui.user.data.repository.FakeUserRepository import com.android.systemui.util.mockito.argumentCaptor +import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.StandardTestDispatcher @@ -41,9 +51,14 @@ import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatchers.any import org.mockito.ArgumentMatchers.anyInt +import org.mockito.ArgumentMatchers.isNull +import org.mockito.Captor import org.mockito.Mock +import org.mockito.Mockito.clearInvocations +import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations @@ -56,6 +71,12 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { @Mock private lateinit var authController: AuthController @Mock private lateinit var lockPatternUtils: LockPatternUtils @Mock private lateinit var devicePolicyManager: DevicePolicyManager + @Mock private lateinit var dumpManager: DumpManager + @Mock private lateinit var biometricManager: BiometricManager + @Captor private lateinit var authControllerCallback: ArgumentCaptor<AuthController.Callback> + @Captor + private lateinit var biometricManagerCallback: + ArgumentCaptor<IBiometricEnabledOnKeyguardCallback.Stub> private lateinit var userRepository: FakeUserRepository private lateinit var testDispatcher: TestDispatcher @@ -72,7 +93,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { } private suspend fun createBiometricSettingsRepository() { - userRepository.setUserInfos(listOf(PRIMARY_USER)) + userRepository.setUserInfos(listOf(PRIMARY_USER, ANOTHER_USER)) userRepository.setSelectedUserInfo(PRIMARY_USER) underTest = BiometricSettingsRepositoryImpl( @@ -85,33 +106,30 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { scope = testScope.backgroundScope, backgroundDispatcher = testDispatcher, looper = testableLooper!!.looper, + dumpManager = dumpManager, + biometricManager = biometricManager, ) + testScope.runCurrent() } @Test fun fingerprintEnrollmentChange() = testScope.runTest { createBiometricSettingsRepository() - val fingerprintEnabledByDevicePolicy = collectLastValue(underTest.isFingerprintEnrolled) + val fingerprintEnrolled = collectLastValue(underTest.isFingerprintEnrolled) runCurrent() - val captor = argumentCaptor<AuthController.Callback>() - verify(authController).addCallback(captor.capture()) + verify(authController).addCallback(authControllerCallback.capture()) whenever(authController.isFingerprintEnrolled(anyInt())).thenReturn(true) - captor.value.onEnrollmentsChanged( - BiometricType.UNDER_DISPLAY_FINGERPRINT, - PRIMARY_USER_ID, - true - ) - assertThat(fingerprintEnabledByDevicePolicy()).isTrue() + enrollmentChange(UNDER_DISPLAY_FINGERPRINT, PRIMARY_USER_ID, true) + assertThat(fingerprintEnrolled()).isTrue() whenever(authController.isFingerprintEnrolled(anyInt())).thenReturn(false) - captor.value.onEnrollmentsChanged( - BiometricType.UNDER_DISPLAY_FINGERPRINT, - PRIMARY_USER_ID, - false - ) - assertThat(fingerprintEnabledByDevicePolicy()).isFalse() + enrollmentChange(UNDER_DISPLAY_FINGERPRINT, ANOTHER_USER_ID, false) + assertThat(fingerprintEnrolled()).isTrue() + + enrollmentChange(UNDER_DISPLAY_FINGERPRINT, PRIMARY_USER_ID, false) + assertThat(fingerprintEnrolled()).isFalse() } @Test @@ -124,15 +142,14 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { val captor = argumentCaptor<LockPatternUtils.StrongAuthTracker>() verify(lockPatternUtils).registerStrongAuthTracker(captor.capture()) - captor.value - .getStub() - .onStrongAuthRequiredChanged(STRONG_AUTH_NOT_REQUIRED, PRIMARY_USER_ID) + captor.value.stub.onStrongAuthRequiredChanged(STRONG_AUTH_NOT_REQUIRED, PRIMARY_USER_ID) testableLooper?.processAllMessages() // StrongAuthTracker uses the TestableLooper assertThat(strongBiometricAllowed()).isTrue() - captor.value - .getStub() - .onStrongAuthRequiredChanged(STRONG_AUTH_REQUIRED_AFTER_BOOT, PRIMARY_USER_ID) + captor.value.stub.onStrongAuthRequiredChanged( + STRONG_AUTH_REQUIRED_AFTER_BOOT, + PRIMARY_USER_ID + ) testableLooper?.processAllMessages() // StrongAuthTracker uses the TestableLooper assertThat(strongBiometricAllowed()).isFalse() } @@ -146,7 +163,7 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { runCurrent() whenever(devicePolicyManager.getKeyguardDisabledFeatures(any(), anyInt())) - .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT) + .thenReturn(KEYGUARD_DISABLE_FINGERPRINT) broadcastDPMStateChange() assertThat(fingerprintEnabledByDevicePolicy()).isFalse() @@ -155,6 +172,137 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { assertThat(fingerprintEnabledByDevicePolicy()).isTrue() } + @Test + fun faceEnrollmentChangeIsPropagatedForTheCurrentUser() = + testScope.runTest { + createBiometricSettingsRepository() + runCurrent() + clearInvocations(authController) + + whenever(authController.isFaceAuthEnrolled(PRIMARY_USER_ID)).thenReturn(false) + val faceEnrolled = collectLastValue(underTest.isFaceEnrolled) + + assertThat(faceEnrolled()).isFalse() + verify(authController).addCallback(authControllerCallback.capture()) + enrollmentChange(REAR_FINGERPRINT, PRIMARY_USER_ID, true) + + assertThat(faceEnrolled()).isFalse() + + enrollmentChange(SIDE_FINGERPRINT, PRIMARY_USER_ID, true) + + assertThat(faceEnrolled()).isFalse() + + enrollmentChange(UNDER_DISPLAY_FINGERPRINT, PRIMARY_USER_ID, true) + + assertThat(faceEnrolled()).isFalse() + + enrollmentChange(FACE, ANOTHER_USER_ID, true) + + assertThat(faceEnrolled()).isFalse() + + enrollmentChange(FACE, PRIMARY_USER_ID, true) + + assertThat(faceEnrolled()).isTrue() + } + + @Test + fun faceEnrollmentStatusOfNewUserUponUserSwitch() = + testScope.runTest { + createBiometricSettingsRepository() + runCurrent() + clearInvocations(authController) + + whenever(authController.isFaceAuthEnrolled(PRIMARY_USER_ID)).thenReturn(false) + whenever(authController.isFaceAuthEnrolled(ANOTHER_USER_ID)).thenReturn(true) + val faceEnrolled = collectLastValue(underTest.isFaceEnrolled) + + assertThat(faceEnrolled()).isFalse() + } + + @Test + fun faceEnrollmentChangesArePropagatedAfterUserSwitch() = + testScope.runTest { + createBiometricSettingsRepository() + + userRepository.setSelectedUserInfo(ANOTHER_USER) + runCurrent() + clearInvocations(authController) + + val faceEnrolled = collectLastValue(underTest.isFaceEnrolled) + runCurrent() + + verify(authController).addCallback(authControllerCallback.capture()) + + enrollmentChange(FACE, ANOTHER_USER_ID, true) + + assertThat(faceEnrolled()).isTrue() + } + + @Test + fun devicePolicyControlsFaceAuthenticationEnabledState() = + testScope.runTest { + createBiometricSettingsRepository() + verify(biometricManager) + .registerEnabledOnKeyguardCallback(biometricManagerCallback.capture()) + + whenever(devicePolicyManager.getKeyguardDisabledFeatures(isNull(), eq(PRIMARY_USER_ID))) + .thenReturn(KEYGUARD_DISABLE_FINGERPRINT or KEYGUARD_DISABLE_FACE) + + val isFaceAuthEnabled = collectLastValue(underTest.isFaceAuthenticationEnabled) + runCurrent() + + broadcastDPMStateChange() + + assertThat(isFaceAuthEnabled()).isFalse() + + biometricManagerCallback.value.onChanged(true, PRIMARY_USER_ID) + runCurrent() + assertThat(isFaceAuthEnabled()).isFalse() + + whenever(devicePolicyManager.getKeyguardDisabledFeatures(isNull(), eq(PRIMARY_USER_ID))) + .thenReturn(KEYGUARD_DISABLE_FINGERPRINT) + broadcastDPMStateChange() + + assertThat(isFaceAuthEnabled()).isTrue() + } + + @Test + fun biometricManagerControlsFaceAuthenticationEnabledStatus() = + testScope.runTest { + createBiometricSettingsRepository() + verify(biometricManager) + .registerEnabledOnKeyguardCallback(biometricManagerCallback.capture()) + + whenever(devicePolicyManager.getKeyguardDisabledFeatures(isNull(), eq(PRIMARY_USER_ID))) + .thenReturn(0) + broadcastDPMStateChange() + + biometricManagerCallback.value.onChanged(true, PRIMARY_USER_ID) + val isFaceAuthEnabled = collectLastValue(underTest.isFaceAuthenticationEnabled) + + assertThat(isFaceAuthEnabled()).isTrue() + + biometricManagerCallback.value.onChanged(false, PRIMARY_USER_ID) + + assertThat(isFaceAuthEnabled()).isFalse() + } + + @Test + fun biometricManagerCallbackIsRegisteredOnlyOnce() = + testScope.runTest { + createBiometricSettingsRepository() + + collectLastValue(underTest.isFaceAuthenticationEnabled)() + collectLastValue(underTest.isFaceAuthenticationEnabled)() + collectLastValue(underTest.isFaceAuthenticationEnabled)() + + verify(biometricManager, times(1)).registerEnabledOnKeyguardCallback(any()) + } + + private fun enrollmentChange(biometricType: BiometricType, userId: Int, enabled: Boolean) { + authControllerCallback.value.onEnrollmentsChanged(biometricType, userId, enabled) + } + private fun broadcastDPMStateChange() { fakeBroadcastDispatcher.registeredReceivers.forEach { receiver -> receiver.onReceive( @@ -172,5 +320,13 @@ class BiometricSettingsRepositoryTest : SysuiTestCase() { /* name= */ "primary user", /* flags= */ UserInfo.FLAG_PRIMARY ) + + private const val ANOTHER_USER_ID = 1 + private val ANOTHER_USER = + UserInfo( + /* id= */ ANOTHER_USER_ID, + /* name= */ "another user", + /* flags= */ UserInfo.FLAG_PRIMARY + ) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt index 9203f05602b6..0519a44d55ba 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFingerprintAuthRepositoryTest.kt @@ -22,6 +22,7 @@ import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.dump.DumpManager import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -44,6 +45,7 @@ import org.mockito.MockitoAnnotations @RunWith(JUnit4::class) class DeviceEntryFingerprintAuthRepositoryTest : SysuiTestCase() { @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor + @Mock private lateinit var dumpManager: DumpManager @Captor private lateinit var callbackCaptor: ArgumentCaptor<KeyguardUpdateMonitorCallback> private lateinit var testScope: TestScope @@ -59,6 +61,7 @@ class DeviceEntryFingerprintAuthRepositoryTest : SysuiTestCase() { DeviceEntryFingerprintAuthRepositoryImpl( keyguardUpdateMonitor, testScope.backgroundScope, + dumpManager, ) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttUtilsTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttUtilsTest.kt index 8055b987973b..4fc9ca71aeaa 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttUtilsTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttUtilsTest.kt @@ -65,7 +65,13 @@ class MediaTttUtilsTest : SysuiTestCase() { @Test fun getIconInfoFromPackageName_nullPackageName_returnsDefault() { - val iconInfo = MediaTttUtils.getIconInfoFromPackageName(context, appPackageName = null) {} + val iconInfo = + MediaTttUtils.getIconInfoFromPackageName( + context, + appPackageName = null, + isReceiver = false, + ) { + } assertThat(iconInfo.isAppIcon).isFalse() assertThat(iconInfo.contentDescription.loadContentDescription(context)) @@ -74,10 +80,32 @@ class MediaTttUtilsTest : SysuiTestCase() { } @Test + fun getIconInfoFromPackageName_nullPackageName_isReceiver_returnsDefault() { + val iconInfo = + MediaTttUtils.getIconInfoFromPackageName( + context, + appPackageName = null, + isReceiver = true, + ) { + } + + assertThat(iconInfo.isAppIcon).isFalse() + assertThat(iconInfo.contentDescription.loadContentDescription(context)) + .isEqualTo( + context.getString(R.string.media_transfer_receiver_content_description_unknown_app) + ) + assertThat(iconInfo.icon).isEqualTo(MediaTttIcon.Resource(R.drawable.ic_cast)) + } + + @Test fun getIconInfoFromPackageName_nullPackageName_exceptionFnNotTriggered() { var exceptionTriggered = false - MediaTttUtils.getIconInfoFromPackageName(context, appPackageName = null) { + MediaTttUtils.getIconInfoFromPackageName( + context, + appPackageName = null, + isReceiver = false, + ) { exceptionTriggered = true } @@ -86,7 +114,13 @@ class MediaTttUtilsTest : SysuiTestCase() { @Test fun getIconInfoFromPackageName_invalidPackageName_returnsDefault() { - val iconInfo = MediaTttUtils.getIconInfoFromPackageName(context, "fakePackageName") {} + val iconInfo = + MediaTttUtils.getIconInfoFromPackageName( + context, + appPackageName = "fakePackageName", + isReceiver = false, + ) { + } assertThat(iconInfo.isAppIcon).isFalse() assertThat(iconInfo.contentDescription.loadContentDescription(context)) @@ -95,19 +129,58 @@ class MediaTttUtilsTest : SysuiTestCase() { } @Test + fun getIconInfoFromPackageName_invalidPackageName_isReceiver_returnsDefault() { + val iconInfo = + MediaTttUtils.getIconInfoFromPackageName( + context, + appPackageName = "fakePackageName", + isReceiver = true, + ) { + } + + assertThat(iconInfo.isAppIcon).isFalse() + assertThat(iconInfo.contentDescription.loadContentDescription(context)) + .isEqualTo( + context.getString(R.string.media_transfer_receiver_content_description_unknown_app) + ) + assertThat(iconInfo.icon).isEqualTo(MediaTttIcon.Resource(R.drawable.ic_cast)) + } + + @Test fun getIconInfoFromPackageName_invalidPackageName_exceptionFnTriggered() { var exceptionTriggered = false - MediaTttUtils.getIconInfoFromPackageName(context, appPackageName = "fakePackageName") { - exceptionTriggered = true - } + MediaTttUtils.getIconInfoFromPackageName( + context, + appPackageName = "fakePackageName", + isReceiver = false + ) { exceptionTriggered = true } + + assertThat(exceptionTriggered).isTrue() + } + + @Test + fun getIconInfoFromPackageName_invalidPackageName_isReceiver_exceptionFnTriggered() { + var exceptionTriggered = false + + MediaTttUtils.getIconInfoFromPackageName( + context, + appPackageName = "fakePackageName", + isReceiver = true + ) { exceptionTriggered = true } assertThat(exceptionTriggered).isTrue() } @Test fun getIconInfoFromPackageName_validPackageName_returnsAppInfo() { - val iconInfo = MediaTttUtils.getIconInfoFromPackageName(context, PACKAGE_NAME) {} + val iconInfo = + MediaTttUtils.getIconInfoFromPackageName( + context, + PACKAGE_NAME, + isReceiver = false, + ) { + } assertThat(iconInfo.isAppIcon).isTrue() assertThat(iconInfo.icon).isEqualTo(MediaTttIcon.Loaded(appIconFromPackageName)) @@ -115,10 +188,42 @@ class MediaTttUtilsTest : SysuiTestCase() { } @Test + fun getIconInfoFromPackageName_validPackageName_isReceiver_returnsAppInfo() { + val iconInfo = + MediaTttUtils.getIconInfoFromPackageName( + context, + PACKAGE_NAME, + isReceiver = true, + ) { + } + + assertThat(iconInfo.isAppIcon).isTrue() + assertThat(iconInfo.icon).isEqualTo(MediaTttIcon.Loaded(appIconFromPackageName)) + assertThat(iconInfo.contentDescription.loadContentDescription(context)) + .isEqualTo( + context.getString( + R.string.media_transfer_receiver_content_description_with_app_name, + APP_NAME + ) + ) + } + + @Test fun getIconInfoFromPackageName_validPackageName_exceptionFnNotTriggered() { var exceptionTriggered = false - MediaTttUtils.getIconInfoFromPackageName(context, PACKAGE_NAME) { + MediaTttUtils.getIconInfoFromPackageName(context, PACKAGE_NAME, isReceiver = false) { + exceptionTriggered = true + } + + assertThat(exceptionTriggered).isFalse() + } + + @Test + fun getIconInfoFromPackageName_validPackageName_isReceiver_exceptionFnNotTriggered() { + var exceptionTriggered = false + + MediaTttUtils.getIconInfoFromPackageName(context, PACKAGE_NAME, isReceiver = true) { exceptionTriggered = true } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt index dba2da7d74b2..19dd2f035c62 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt @@ -354,7 +354,11 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() { val view = getChipView() assertThat(view.getAppIconView().drawable).isEqualTo(fakeAppIconDrawable) - assertThat(view.getAppIconView().contentDescription).isEqualTo(APP_NAME) + assertThat(view.getAppIconView().contentDescription) + .isEqualTo(context.getString( + R.string.media_transfer_receiver_content_description_with_app_name, + APP_NAME, + )) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt index f42bfb8e0dfe..bc31a0ec81a6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt @@ -98,15 +98,6 @@ class BackPanelControllerTest : SysuiTestCase() { } @Test - fun handlesDragSlopCrossed() { - startTouch() - continueTouch(START_X + touchSlop + 1) - - assertThat(mBackPanelController.currentState) - .isEqualTo(BackPanelController.GestureState.ENTRY) - } - - @Test fun handlesBackCommitted() { startTouch() // Move once to cross the touch slop diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java index b1ca1c02f6da..f581154f66c0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java @@ -18,8 +18,6 @@ import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE; import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEFAULT; import static android.inputmethodservice.InputMethodService.IME_INVISIBLE; import static android.view.Display.DEFAULT_DISPLAY; -import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; -import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.WindowInsetsController.BEHAVIOR_DEFAULT; import static org.mockito.ArgumentMatchers.anyInt; @@ -158,7 +156,7 @@ public class CommandQueueTest extends SysuiTestCase { @Test public void testShowTransient() { - int[] types = new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}; + int types = WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars(); mCommandQueue.showTransient(DEFAULT_DISPLAY, types, true /* isGestureOnSystemBar */); waitForIdleSync(); verify(mCallbacks).showTransient(eq(DEFAULT_DISPLAY), eq(types), eq(true)); @@ -166,7 +164,7 @@ public class CommandQueueTest extends SysuiTestCase { @Test public void testShowTransientForSecondaryDisplay() { - int[] types = new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}; + int types = WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars(); mCommandQueue.showTransient(SECONDARY_DISPLAY, types, true /* isGestureOnSystemBar */); waitForIdleSync(); verify(mCallbacks).showTransient(eq(SECONDARY_DISPLAY), eq(types), eq(true)); @@ -174,7 +172,7 @@ public class CommandQueueTest extends SysuiTestCase { @Test public void testAbortTransient() { - int[] types = new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}; + int types = WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars(); mCommandQueue.abortTransient(DEFAULT_DISPLAY, types); waitForIdleSync(); verify(mCallbacks).abortTransient(eq(DEFAULT_DISPLAY), eq(types)); @@ -182,7 +180,7 @@ public class CommandQueueTest extends SysuiTestCase { @Test public void testAbortTransientForSecondaryDisplay() { - int[] types = new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}; + int types = WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars(); mCommandQueue.abortTransient(SECONDARY_DISPLAY, types); waitForIdleSync(); verify(mCallbacks).abortTransient(eq(SECONDARY_DISPLAY), eq(types)); diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeBiometricSettingsRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeBiometricSettingsRepository.kt index 044679d6e9a8..01dac362432d 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeBiometricSettingsRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeBiometricSettingsRepository.kt @@ -17,6 +17,7 @@ package com.android.systemui.keyguard.data.repository +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -26,6 +27,14 @@ class FakeBiometricSettingsRepository : BiometricSettingsRepository { private val _isFingerprintEnrolled = MutableStateFlow<Boolean>(false) override val isFingerprintEnrolled: StateFlow<Boolean> = _isFingerprintEnrolled.asStateFlow() + private val _isFaceEnrolled = MutableStateFlow(false) + override val isFaceEnrolled: Flow<Boolean> + get() = _isFaceEnrolled + + private val _isFaceAuthEnabled = MutableStateFlow(false) + override val isFaceAuthenticationEnabled: Flow<Boolean> + get() = _isFaceAuthEnabled + private val _isStrongBiometricAllowed = MutableStateFlow(false) override val isStrongBiometricAllowed = _isStrongBiometricAllowed.asStateFlow() @@ -44,4 +53,12 @@ class FakeBiometricSettingsRepository : BiometricSettingsRepository { fun setFingerprintEnabledByDevicePolicy(isFingerprintEnabledByDevicePolicy: Boolean) { _isFingerprintEnabledByDevicePolicy.value = isFingerprintEnabledByDevicePolicy } + + fun setFaceEnrolled(isFaceEnrolled: Boolean) { + _isFaceEnrolled.value = isFaceEnrolled + } + + fun setIsFaceAuthEnabled(enabled: Boolean) { + _isFaceAuthEnabled.value = enabled + } } diff --git a/proto/src/system_messages.proto b/proto/src/system_messages.proto index 12e722601e25..12a82300dba2 100644 --- a/proto/src/system_messages.proto +++ b/proto/src/system_messages.proto @@ -306,6 +306,10 @@ message SystemMessage { // Package: android NOTE_BT_APM_NOTIFICATION = 74; + // Inform that USB is configured as a Universal Video Class gadget + // Package: android + NOTE_USB_UVC = 75; + // ADD_NEW_IDS_ABOVE_THIS_LINE // Legacy IDs with arbitrary values appear below // Legacy IDs existed as stable non-conflicting constants prior to the O release diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index c1c486e39769..776405d23035 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -32,6 +32,7 @@ import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_MENU import static android.view.accessibility.AccessibilityManager.ACCESSIBILITY_SHORTCUT_KEY; import static android.view.accessibility.AccessibilityManager.CONTRAST_DEFAULT_VALUE; import static android.view.accessibility.AccessibilityManager.CONTRAST_NOT_SET; +import static android.view.accessibility.AccessibilityManager.FlashNotificationReason; import static android.view.accessibility.AccessibilityManager.ShortcutType; import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME; @@ -314,6 +315,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub boolean mInputSessionRequested; private SparseArray<SurfaceControl> mA11yOverlayLayers = new SparseArray<>(); + private final FlashNotificationsController mFlashNotificationsController; + private AccessibilityUserState getCurrentUserStateLocked() { return getUserStateLocked(mCurrentUserId); } @@ -441,6 +444,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mInputFilter = inputFilter; mHasInputFilter = true; } + mFlashNotificationsController = new FlashNotificationsController(mContext); init(); } @@ -471,6 +475,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mMagnificationProcessor = new MagnificationProcessor(mMagnificationController); mCaptioningManagerImpl = new CaptioningManagerImpl(mContext); mProxyManager = new ProxyManager(mLock, mA11yWindowManager); + mFlashNotificationsController = new FlashNotificationsController(mContext); init(); } @@ -3893,6 +3898,40 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } @Override + public boolean startFlashNotificationSequence(String opPkg, + @FlashNotificationReason int reason, IBinder token) { + final long identity = Binder.clearCallingIdentity(); + try { + return mFlashNotificationsController.startFlashNotificationSequence(opPkg, + reason, token); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @Override + public boolean stopFlashNotificationSequence(String opPkg) { + final long identity = Binder.clearCallingIdentity(); + try { + return mFlashNotificationsController.stopFlashNotificationSequence(opPkg); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @Override + public boolean startFlashNotificationEvent(String opPkg, + @FlashNotificationReason int reason, String reasonPkg) { + final long identity = Binder.clearCallingIdentity(); + try { + return mFlashNotificationsController.startFlashNotificationEvent(opPkg, + reason, reasonPkg); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @Override public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, pw)) return; synchronized (mLock) { diff --git a/services/accessibility/java/com/android/server/accessibility/FlashNotificationsController.java b/services/accessibility/java/com/android/server/accessibility/FlashNotificationsController.java new file mode 100644 index 000000000000..b1fa5b10a6ff --- /dev/null +++ b/services/accessibility/java/com/android/server/accessibility/FlashNotificationsController.java @@ -0,0 +1,936 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.accessibility; + +import static android.view.accessibility.AccessibilityManager.FLASH_REASON_ALARM; +import static android.view.accessibility.AccessibilityManager.FLASH_REASON_PREVIEW; + +import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; + +import android.animation.ObjectAnimator; +import android.annotation.ColorInt; +import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.app.ActivityManager; +import android.content.BroadcastReceiver; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.database.ContentObserver; +import android.graphics.Color; +import android.graphics.PixelFormat; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraManager; +import android.hardware.display.DisplayManager; +import android.media.AudioAttributes; +import android.media.AudioManager; +import android.media.AudioPlaybackConfiguration; +import android.net.Uri; +import android.os.Binder; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IBinder; +import android.os.PowerManager; +import android.os.Process; +import android.os.RemoteException; +import android.os.SystemClock; +import android.os.UserHandle; +import android.provider.Settings; +import android.util.Log; +import android.view.Display; +import android.view.View; +import android.view.WindowManager; +import android.view.accessibility.AccessibilityManager.FlashNotificationReason; +import android.view.animation.AccelerateInterpolator; +import android.widget.FrameLayout; + +import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; + +class FlashNotificationsController { + private static final String LOG_TAG = "FlashNotifController"; + private static final boolean DEBUG = true; + + private static final String WAKE_LOCK_TAG = "a11y:FlashNotificationsController"; + + /** The tag for flash notification which is triggered by short/long preview. */ + private static final String TAG_PREVIEW = "preview"; + /** The tag for flash notification which is triggered by alarm. */ + private static final String TAG_ALARM = "alarm"; + + /** The default flashing type: triggered by an event. It'll flash 2 times in a short period. */ + private static final int TYPE_DEFAULT = 1; + /** + * The sequence flashing type: usually triggered by call/alarm. It'll flash infinitely until the + * call/alarm ends. + */ + private static final int TYPE_SEQUENCE = 2; + /** + * The long preview flashing type: it's only for screen flash preview. It'll flash only 1 time + * with a long period to show the screen flash effect more clearly. + */ + private static final int TYPE_LONG_PREVIEW = 3; + + /** @hide */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(prefix = { "TYPE_" }, value = { + TYPE_DEFAULT, + TYPE_SEQUENCE, + TYPE_LONG_PREVIEW + }) + @interface FlashNotificationType {} + + private static final int TYPE_DEFAULT_ON_MS = 350; + private static final int TYPE_DEFAULT_OFF_MS = 250; + private static final int TYPE_SEQUENCE_ON_MS = 700; + private static final int TYPE_SEQUENCE_OFF_MS = 700; + private static final int TYPE_LONG_PREVIEW_ON_MS = 5000; + private static final int TYPE_LONG_PREVIEW_OFF_MS = 1000; + private static final int TYPE_DEFAULT_SCREEN_DELAY_MS = 300; + + private static final int SCREEN_FADE_DURATION_MS = 200; + private static final int SCREEN_FADE_OUT_TIMEOUT_MS = 10; + + @ColorInt + private static final int SCREEN_DEFAULT_COLOR = 0x00FFFF00; + @ColorInt + private static final int SCREEN_DEFAULT_ALPHA = 0x66000000; + @ColorInt + private static final int SCREEN_DEFAULT_COLOR_WITH_ALPHA = + SCREEN_DEFAULT_COLOR | SCREEN_DEFAULT_ALPHA; + + // TODO(b/266775677): Make protected-broadcast intent + @VisibleForTesting + static final String ACTION_FLASH_NOTIFICATION_START_PREVIEW = + "com.android.internal.intent.action.FLASH_NOTIFICATION_START_PREVIEW"; + // TODO(b/266775677): Make protected-broadcast intent + @VisibleForTesting + static final String ACTION_FLASH_NOTIFICATION_STOP_PREVIEW = + "com.android.internal.intent.action.FLASH_NOTIFICATION_STOP_PREVIEW"; + @VisibleForTesting + static final String EXTRA_FLASH_NOTIFICATION_PREVIEW_COLOR = + "com.android.internal.intent.extra.FLASH_NOTIFICATION_PREVIEW_COLOR"; + @VisibleForTesting + static final String EXTRA_FLASH_NOTIFICATION_PREVIEW_TYPE = + "com.android.internal.intent.extra.FLASH_NOTIFICATION_PREVIEW_TYPE"; + + @VisibleForTesting + static final int PREVIEW_TYPE_SHORT = 0; + @VisibleForTesting + static final int PREVIEW_TYPE_LONG = 1; + + // TODO(b/266775683): Move to settings provider + @VisibleForTesting + static final String SETTING_KEY_CAMERA_FLASH_NOTIFICATION = "camera_flash_notification"; + // TODO(b/266775683): Move to settings provider + @VisibleForTesting + static final String SETTING_KEY_SCREEN_FLASH_NOTIFICATION = "screen_flash_notification"; + // TODO(b/266775683): Move to settings provider + @VisibleForTesting + static final String SETTING_KEY_SCREEN_FLASH_NOTIFICATION_COLOR = + "screen_flash_notification_color_global"; + + /** + * Timeout of the wake lock (5 minutes). It should normally never triggered, the wakelock + * should be released after the flashing notification is completed. + */ + private static final long WAKE_LOCK_TIMEOUT_MS = 5 * 60 * 1000; + + private final Context mContext; + private final DisplayManager mDisplayManager; + private final PowerManager.WakeLock mWakeLock; + @GuardedBy("mFlashNotifications") + private final LinkedList<FlashNotification> mFlashNotifications = new LinkedList<>(); + private final Handler mMainHandler; + private final Handler mCallbackHandler; + private boolean mIsTorchTouched = false; + private boolean mIsTorchOn = false; + private boolean mIsCameraFlashNotificationEnabled = false; + private boolean mIsScreenFlashNotificationEnabled = false; + private boolean mIsAlarming = false; + private int mDisplayState = Display.STATE_OFF; + private boolean mIsCameraOpened = false; + private CameraManager mCameraManager; + private String mCameraId = null; + + private final CameraManager.TorchCallback mTorchCallback = new CameraManager.TorchCallback() { + @Override + public void onTorchModeChanged(String cameraId, boolean enabled) { + if (mCameraId != null && mCameraId.equals(cameraId)) { + mIsTorchOn = enabled; + if (DEBUG) Log.d(LOG_TAG, "onTorchModeChanged, set mIsTorchOn=" + enabled); + } + } + }; + @VisibleForTesting + final CameraManager.AvailabilityCallback mTorchAvailabilityCallback = + new CameraManager.AvailabilityCallback() { + @Override + public void onCameraOpened(@NonNull String cameraId, @NonNull String packageId) { + if (mCameraId != null && mCameraId.equals(cameraId)) { + mIsCameraOpened = true; + } + } + + @Override + public void onCameraClosed(@NonNull String cameraId) { + if (mCameraId != null && mCameraId.equals(cameraId)) { + mIsCameraOpened = false; + } + } + }; + private View mScreenFlashNotificationOverlayView; + private FlashNotification mCurrentFlashNotification; + + private final AudioManager.AudioPlaybackCallback mAudioPlaybackCallback = + new AudioManager.AudioPlaybackCallback() { + @Override + public void onPlaybackConfigChanged(List<AudioPlaybackConfiguration> configs) { + boolean isAlarmActive = false; + if (configs != null) { + isAlarmActive = configs.stream() + .anyMatch(config -> config.isActive() + && config.getAudioAttributes().getUsage() + == AudioAttributes.USAGE_ALARM); + } + + if (mIsAlarming != isAlarmActive) { + if (DEBUG) Log.d(LOG_TAG, "alarm state changed: " + isAlarmActive); + if (isAlarmActive) { + startFlashNotificationSequenceForAlarm(); + } else { + stopFlashNotificationSequenceForAlarm(); + } + mIsAlarming = isAlarmActive; + } + } + }; + private volatile FlashNotificationThread mThread; + private final Handler mFlashNotificationHandler; + @VisibleForTesting + final FlashBroadcastReceiver mFlashBroadcastReceiver; + + + FlashNotificationsController(Context context) { + this(context, getStartedHandler("FlashNotificationThread"), getStartedHandler(LOG_TAG)); + } + + @VisibleForTesting + FlashNotificationsController(Context context, Handler flashNotificationHandler, + Handler callbackHandler) { + mContext = context; + mMainHandler = new Handler(mContext.getMainLooper()); + mFlashNotificationHandler = flashNotificationHandler; + mCallbackHandler = callbackHandler; + + new FlashContentObserver(mMainHandler).register(mContext.getContentResolver()); + + final IntentFilter broadcastFilter = new IntentFilter(); + broadcastFilter.addAction(Intent.ACTION_BOOT_COMPLETED); + broadcastFilter.addAction(ACTION_FLASH_NOTIFICATION_START_PREVIEW); + broadcastFilter.addAction(ACTION_FLASH_NOTIFICATION_STOP_PREVIEW); + mFlashBroadcastReceiver = new FlashBroadcastReceiver(); + mContext.registerReceiver(mFlashBroadcastReceiver, broadcastFilter); + + final PowerManager powerManager = mContext.getSystemService(PowerManager.class); + mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKE_LOCK_TAG); + + mDisplayManager = mContext.getSystemService(DisplayManager.class); + final DisplayManager.DisplayListener displayListener = + new DisplayManager.DisplayListener() { + @Override + public void onDisplayAdded(int displayId) { + } + + @Override + public void onDisplayRemoved(int displayId) { + } + + @Override + public void onDisplayChanged(int displayId) { + if (mDisplayManager != null) { + Display display = mDisplayManager.getDisplay(displayId); + if (display != null) { + mDisplayState = display.getState(); + } + } + } + }; + + if (mDisplayManager != null) { + mDisplayManager.registerDisplayListener(displayListener, null); + } + } + + private static Handler getStartedHandler(String tag) { + HandlerThread handlerThread = new HandlerThread(tag); + handlerThread.start(); + return handlerThread.getThreadHandler(); + } + + + boolean startFlashNotificationSequence(String opPkg, + @FlashNotificationReason int reason, IBinder token) { + final FlashNotification flashNotification = new FlashNotification(opPkg, TYPE_SEQUENCE, + getScreenFlashColorPreference(reason), + token, () -> stopFlashNotification(opPkg)); + + if (!flashNotification.tryLinkToDeath()) return false; + + requestStartFlashNotification(flashNotification); + return true; + } + + boolean stopFlashNotificationSequence(String opPkg) { + stopFlashNotification(opPkg); + return true; + } + + boolean startFlashNotificationEvent(String opPkg, int reason, String reasonPkg) { + requestStartFlashNotification(new FlashNotification(opPkg, TYPE_DEFAULT, + getScreenFlashColorPreference(reason, reasonPkg))); + return true; + } + + private void startFlashNotificationShortPreview() { + requestStartFlashNotification(new FlashNotification(TAG_PREVIEW, TYPE_DEFAULT, + getScreenFlashColorPreference(FLASH_REASON_PREVIEW))); + } + + private void startFlashNotificationLongPreview(@ColorInt int color) { + requestStartFlashNotification(new FlashNotification(TAG_PREVIEW, TYPE_LONG_PREVIEW, + color)); + } + + private void stopFlashNotificationLongPreview() { + stopFlashNotification(TAG_PREVIEW); + } + + private void startFlashNotificationSequenceForAlarm() { + requestStartFlashNotification(new FlashNotification(TAG_ALARM, TYPE_SEQUENCE, + getScreenFlashColorPreference(FLASH_REASON_ALARM))); + } + + private void stopFlashNotificationSequenceForAlarm() { + stopFlashNotification(TAG_ALARM); + } + + private void requestStartFlashNotification(FlashNotification flashNotification) { + if (DEBUG) Log.d(LOG_TAG, "requestStartFlashNotification"); + + mIsCameraFlashNotificationEnabled = Settings.System.getIntForUser( + mContext.getContentResolver(), SETTING_KEY_CAMERA_FLASH_NOTIFICATION, 0, + UserHandle.USER_CURRENT) != 0; + mIsScreenFlashNotificationEnabled = Settings.System.getIntForUser( + mContext.getContentResolver(), SETTING_KEY_SCREEN_FLASH_NOTIFICATION, 0, + UserHandle.USER_CURRENT) != 0; + + // To prevent unexpectedly screen flash when screen is off, delays the TYPE_DEFAULT screen + // flash since mDisplayState is not refreshed to STATE_OFF immediately after screen is + // turned off. No need to delay TYPE_SEQUENCE screen flash as calls and alarms will always + // wake up the screen. + // TODO(b/267121704) refactor the logic to remove delay workaround + if (flashNotification.mType == TYPE_DEFAULT && mIsScreenFlashNotificationEnabled) { + mMainHandler.sendMessageDelayed( + obtainMessage(FlashNotificationsController::startFlashNotification, this, + flashNotification), TYPE_DEFAULT_SCREEN_DELAY_MS); + if (DEBUG) Log.i(LOG_TAG, "give some delay for flash notification"); + } else { + startFlashNotification(flashNotification); + } + } + + private void stopFlashNotification(String tag) { + if (DEBUG) Log.i(LOG_TAG, "stopFlashNotification: tag=" + tag); + synchronized (mFlashNotifications) { + final FlashNotification notification = removeFlashNotificationLocked(tag); + if (mCurrentFlashNotification != null && notification == mCurrentFlashNotification) { + stopFlashNotificationLocked(); + startNextFlashNotificationLocked(); + } + } + } + + private void prepareForCameraFlashNotification() { + mCameraManager = mContext.getSystemService(CameraManager.class); + + if (mCameraManager != null) { + try { + mCameraId = getCameraId(); + } catch (CameraAccessException e) { + Log.e(LOG_TAG, "CameraAccessException", e); + } + mCameraManager.registerTorchCallback(mTorchCallback, null); + } + } + + private String getCameraId() throws CameraAccessException { + String[] ids = mCameraManager.getCameraIdList(); + + for (String id : ids) { + CameraCharacteristics c = mCameraManager.getCameraCharacteristics(id); + Boolean flashAvailable = c.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); + Integer lensFacing = c.get(CameraCharacteristics.LENS_FACING); + if (flashAvailable != null && lensFacing != null + && flashAvailable && lensFacing == CameraCharacteristics.LENS_FACING_BACK) { + if (DEBUG) Log.d(LOG_TAG, "Found valid camera, cameraId=" + id); + return id; + } + } + return null; + } + + private void showScreenNotificationOverlayView(@ColorInt int color) { + mMainHandler.sendMessage(obtainMessage( + FlashNotificationsController::showScreenNotificationOverlayViewMainThread, + this, color)); + } + + private void hideScreenNotificationOverlayView() { + mMainHandler.sendMessage(obtainMessage( + FlashNotificationsController::fadeOutScreenNotificationOverlayViewMainThread, + this)); + mMainHandler.sendMessageDelayed(obtainMessage( + FlashNotificationsController::hideScreenNotificationOverlayViewMainThread, + this), SCREEN_FADE_DURATION_MS + SCREEN_FADE_OUT_TIMEOUT_MS); + } + + private void showScreenNotificationOverlayViewMainThread(@ColorInt int color) { + if (DEBUG) Log.d(LOG_TAG, "showScreenNotificationOverlayViewMainThread"); + WindowManager.LayoutParams params = new WindowManager.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE + | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, + PixelFormat.TRANSLUCENT); + params.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS; + params.layoutInDisplayCutoutMode = + WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; + params.inputFeatures |= WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL; + + // Main display + if (mScreenFlashNotificationOverlayView == null) { + mScreenFlashNotificationOverlayView = getScreenNotificationOverlayView(color); + mContext.getSystemService(WindowManager.class).addView( + mScreenFlashNotificationOverlayView, params); + fadeScreenNotificationOverlayViewMainThread(mScreenFlashNotificationOverlayView, true); + } + } + + private void fadeOutScreenNotificationOverlayViewMainThread() { + if (DEBUG) Log.d(LOG_TAG, "fadeOutScreenNotificationOverlayViewMainThread"); + if (mScreenFlashNotificationOverlayView != null) { + fadeScreenNotificationOverlayViewMainThread(mScreenFlashNotificationOverlayView, false); + } + } + + private void fadeScreenNotificationOverlayViewMainThread(View view, boolean in) { + ObjectAnimator fade = ObjectAnimator.ofFloat(view, "alpha", in ? 0.0f : 1.0f, + in ? 1.0f : 0.0f); + fade.setInterpolator(new AccelerateInterpolator()); + fade.setAutoCancel(true); + fade.setDuration(SCREEN_FADE_DURATION_MS); + fade.start(); + } + + private void hideScreenNotificationOverlayViewMainThread() { + if (DEBUG) Log.d(LOG_TAG, "hideScreenNotificationOverlayViewMainThread"); + if (mScreenFlashNotificationOverlayView != null) { + mScreenFlashNotificationOverlayView.setVisibility(View.GONE); + mContext.getSystemService(WindowManager.class).removeView( + mScreenFlashNotificationOverlayView); + mScreenFlashNotificationOverlayView = null; + } + } + + private View getScreenNotificationOverlayView(@ColorInt int color) { + View screenNotificationOverlayView = new FrameLayout(mContext); + screenNotificationOverlayView.setBackgroundColor(color); + screenNotificationOverlayView.setAlpha(0.0f); + return screenNotificationOverlayView; + } + + @ColorInt + private int getScreenFlashColorPreference(@FlashNotificationReason int reason, + String reasonPkg) { + // TODO(b/267121466) implement getting color per reason, reasonPkg basis + return getScreenFlashColorPreference(); + } + + @ColorInt + private int getScreenFlashColorPreference(@FlashNotificationReason int reason) { + // TODO(b/267121466) implement getting color per reason basis + return getScreenFlashColorPreference(); + } + + @ColorInt + private int getScreenFlashColorPreference() { + return Settings.System.getIntForUser(mContext.getContentResolver(), + SETTING_KEY_SCREEN_FLASH_NOTIFICATION_COLOR, SCREEN_DEFAULT_COLOR_WITH_ALPHA, + UserHandle.USER_CURRENT); + } + + private void startFlashNotification(@NonNull FlashNotification flashNotification) { + final int type = flashNotification.mType; + final String tag = flashNotification.mTag; + if (DEBUG) Log.i(LOG_TAG, "startFlashNotification: type=" + type + ", tag=" + tag); + + if (!(mIsCameraFlashNotificationEnabled + || mIsScreenFlashNotificationEnabled + || flashNotification.mForceStartScreenFlash)) { + if (DEBUG) Log.d(LOG_TAG, "Flash notification is disabled"); + return; + } + + if (mIsCameraOpened) { + if (DEBUG) Log.d(LOG_TAG, "Since camera for torch is opened, block notification."); + return; + } + + if (mIsCameraFlashNotificationEnabled && mCameraId == null) { + prepareForCameraFlashNotification(); + } + + final long identity = Binder.clearCallingIdentity(); + try { + synchronized (mFlashNotifications) { + if (type == TYPE_DEFAULT || type == TYPE_LONG_PREVIEW) { + if (mCurrentFlashNotification != null) { + if (DEBUG) { + Log.i(LOG_TAG, + "Default type of flash notification can not work because " + + "previous flash notification is working"); + } + } else { + startFlashNotificationLocked(flashNotification); + } + } else if (type == TYPE_SEQUENCE) { + if (mCurrentFlashNotification != null) { + removeFlashNotificationLocked(tag); + stopFlashNotificationLocked(); + } + mFlashNotifications.addFirst(flashNotification); + startNextFlashNotificationLocked(); + } else { + Log.e(LOG_TAG, "Unavailable flash notification type"); + } + } + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @GuardedBy("mFlashNotifications") + private FlashNotification removeFlashNotificationLocked(String tag) { + ListIterator<FlashNotification> iterator = mFlashNotifications.listIterator(0); + while (iterator.hasNext()) { + FlashNotification notification = iterator.next(); + if (notification != null && notification.mTag.equals(tag)) { + iterator.remove(); + notification.tryUnlinkToDeath(); + if (DEBUG) { + Log.i(LOG_TAG, + "removeFlashNotificationLocked: tag=" + notification.mTag); + } + return notification; + } + } + if (mCurrentFlashNotification != null && mCurrentFlashNotification.mTag.equals(tag)) { + mCurrentFlashNotification.tryUnlinkToDeath(); + return mCurrentFlashNotification; + } + return null; + } + + @GuardedBy("mFlashNotifications") + private void stopFlashNotificationLocked() { + if (mThread != null) { + if (DEBUG) { + Log.i(LOG_TAG, + "stopFlashNotificationLocked: tag=" + mThread.mFlashNotification.mTag); + } + mThread.cancel(); + mThread = null; + } + doCameraFlashNotificationOff(); + doScreenFlashNotificationOff(); + } + + @GuardedBy("mFlashNotifications") + private void startNextFlashNotificationLocked() { + if (DEBUG) Log.i(LOG_TAG, "startNextFlashNotificationLocked"); + if (mFlashNotifications.size() <= 0) { + mCurrentFlashNotification = null; + return; + } + startFlashNotificationLocked(mFlashNotifications.getFirst()); + } + + @GuardedBy("mFlashNotifications") + private void startFlashNotificationLocked(@NonNull final FlashNotification notification) { + if (DEBUG) { + Log.i(LOG_TAG, "startFlashNotificationLocked: type=" + notification.mType + ", tag=" + + notification.mTag); + } + mCurrentFlashNotification = notification; + mThread = new FlashNotificationThread(notification); + mFlashNotificationHandler.post(mThread); + } + + private boolean isDozeMode() { + return mDisplayState == Display.STATE_DOZE || mDisplayState == Display.STATE_DOZE_SUSPEND; + } + + private void doCameraFlashNotificationOn() { + if (mIsCameraFlashNotificationEnabled && !mIsTorchOn) { + doCameraFlashNotification(true); + } + if (DEBUG) { + Log.i(LOG_TAG, "doCameraFlashNotificationOn: " + + "isCameraFlashNotificationEnabled=" + mIsCameraFlashNotificationEnabled + + ", isTorchOn=" + mIsTorchOn + + ", isTorchTouched=" + mIsTorchTouched); + } + } + + private void doCameraFlashNotificationOff() { + if (mIsTorchTouched) { + doCameraFlashNotification(false); + } + if (DEBUG) { + Log.i(LOG_TAG, "doCameraFlashNotificationOff: " + + "isCameraFlashNotificationEnabled=" + mIsCameraFlashNotificationEnabled + + ", isTorchOn=" + mIsTorchOn + + ", isTorchTouched=" + mIsTorchTouched); + } + } + + private void doScreenFlashNotificationOn(@ColorInt int color, boolean forceStartScreenFlash) { + final boolean isDoze = isDozeMode(); + if ((mIsScreenFlashNotificationEnabled || forceStartScreenFlash) && !isDoze) { + showScreenNotificationOverlayView(color); + } + if (DEBUG) { + Log.i(LOG_TAG, "doScreenFlashNotificationOn: " + + "isScreenFlashNotificationEnabled=" + mIsScreenFlashNotificationEnabled + + ", isDozeMode=" + isDoze + + ", color=" + Integer.toHexString(color)); + } + } + + private void doScreenFlashNotificationOff() { + hideScreenNotificationOverlayView(); + if (DEBUG) { + Log.i(LOG_TAG, "doScreenFlashNotificationOff: " + + "isScreenFlashNotificationEnabled=" + mIsScreenFlashNotificationEnabled); + } + } + + private void doCameraFlashNotification(boolean on) { + if (DEBUG) Log.d(LOG_TAG, "doCameraFlashNotification: " + on + " mCameraId : " + mCameraId); + if (mCameraManager != null && mCameraId != null) { + try { + mCameraManager.setTorchMode(mCameraId, on); + mIsTorchTouched = on; + } catch (CameraAccessException e) { + Log.e(LOG_TAG, "Failed to setTorchMode: " + e); + } + } else { + Log.e(LOG_TAG, "Can not use camera flash notification, please check CameraManager!"); + } + } + + private static class FlashNotification { + // Tag could be the requesting package name or constants like TAG_PREVIEW and TAG_ALARM. + private final String mTag; + @FlashNotificationType + private final int mType; + private final int mOnDuration; + private final int mOffDuration; + @ColorInt + private final int mColor; + private int mRepeat; + @Nullable + private final IBinder mToken; + @Nullable + private final IBinder.DeathRecipient mDeathRecipient; + private final boolean mForceStartScreenFlash; + + private FlashNotification(String tag, @FlashNotificationType int type, + @ColorInt int color) { + this(tag, type, color, null, null); + } + + private FlashNotification(String tag, @FlashNotificationType int type, @ColorInt int color, + IBinder token, IBinder.DeathRecipient deathRecipient) { + mType = type; + mTag = tag; + mColor = color; + mToken = token; + mDeathRecipient = deathRecipient; + + switch (type) { + case TYPE_SEQUENCE: + mOnDuration = TYPE_SEQUENCE_ON_MS; + mOffDuration = TYPE_SEQUENCE_OFF_MS; + mRepeat = 0; // indefinite + mForceStartScreenFlash = false; + break; + case TYPE_LONG_PREVIEW: + mOnDuration = TYPE_LONG_PREVIEW_ON_MS; + mOffDuration = TYPE_LONG_PREVIEW_OFF_MS; + mRepeat = 1; + mForceStartScreenFlash = true; + break; + case TYPE_DEFAULT: + default: + mOnDuration = TYPE_DEFAULT_ON_MS; + mOffDuration = TYPE_DEFAULT_OFF_MS; + mRepeat = 2; + mForceStartScreenFlash = false; + break; + } + } + + boolean tryLinkToDeath() { + if (mToken == null || mDeathRecipient == null) return false; + + try { + mToken.linkToDeath(mDeathRecipient, 0); + return true; + } catch (RemoteException e) { + Log.e(LOG_TAG, "RemoteException", e); + return false; + } + } + + boolean tryUnlinkToDeath() { + if (mToken == null || mDeathRecipient == null) return false; + try { + mToken.unlinkToDeath(mDeathRecipient, 0); + return true; + } catch (Exception ignored) { + return false; + } + } + } + + private class FlashNotificationThread extends Thread { + private final FlashNotification mFlashNotification; + private boolean mForceStop; + @ColorInt + private int mColor = Color.TRANSPARENT; + private boolean mShouldDoScreenFlash = false; + private boolean mShouldDoCameraFlash = false; + + private FlashNotificationThread(@NonNull FlashNotification flashNotification) { + mFlashNotification = flashNotification; + mForceStop = false; + } + + @Override + public void run() { + if (DEBUG) Log.d(LOG_TAG, "run started: " + mFlashNotification.mTag); + Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_DISPLAY); + mColor = mFlashNotification.mColor; + mShouldDoScreenFlash = (Color.alpha(mColor) != Color.TRANSPARENT) + || mFlashNotification.mForceStartScreenFlash; + mShouldDoCameraFlash = mFlashNotification.mType != TYPE_LONG_PREVIEW; + synchronized (this) { + mWakeLock.acquire(WAKE_LOCK_TIMEOUT_MS); + try { + startFlashNotification(); + } finally { + doScreenFlashNotificationOff(); + doCameraFlashNotificationOff(); + try { + mWakeLock.release(); + } catch (RuntimeException e) { + Log.e(LOG_TAG, "Error while releasing FlashNotificationsController" + + " wakelock (already released by the system?)"); + } + } + } + synchronized (mFlashNotifications) { + if (mThread == this) { + mThread = null; + } + // Unlink to death recipient for not interrupted flash notification. For flash + // notification interrupted and stopped by stopFlashNotification(), unlink to + // death is already handled in stopFlashNotification(). + if (!mForceStop) { + mFlashNotification.tryUnlinkToDeath(); + mCurrentFlashNotification = null; + } + } + if (DEBUG) Log.d(LOG_TAG, "run finished: " + mFlashNotification.mTag); + } + + private void startFlashNotification() { + synchronized (this) { + while (!mForceStop) { + if (mFlashNotification.mType != TYPE_SEQUENCE + && mFlashNotification.mRepeat >= 0) { + if (mFlashNotification.mRepeat-- == 0) { + break; + } + } + if (mShouldDoScreenFlash) { + doScreenFlashNotificationOn(mColor, + mFlashNotification.mForceStartScreenFlash); + } + if (mShouldDoCameraFlash) { + doCameraFlashNotificationOn(); + } + delay(mFlashNotification.mOnDuration); + doScreenFlashNotificationOff(); + doCameraFlashNotificationOff(); + if (mForceStop) { + break; + } + delay(mFlashNotification.mOffDuration); + } + } + } + + void cancel() { + if (DEBUG) Log.d(LOG_TAG, "run canceled: " + mFlashNotification.mTag); + synchronized (this) { + mThread.mForceStop = true; + mThread.notify(); + } + } + + private void delay(long duration) { + if (duration > 0) { + long bedtime = duration + SystemClock.uptimeMillis(); + do { + try { + this.wait(duration); + } catch (InterruptedException ignored) { + } + if (mForceStop) { + break; + } + duration = bedtime - SystemClock.uptimeMillis(); + } while (duration > 0); + } + } + } + + @VisibleForTesting + class FlashBroadcastReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + // Some system services not properly initiated before boot complete. Should do the + // initialization after receiving ACTION_BOOT_COMPLETED. + if (Intent.ACTION_BOOT_COMPLETED.equals(action)) { + if (UserHandle.myUserId() != ActivityManager.getCurrentUser()) { + return; + } + + mIsCameraFlashNotificationEnabled = Settings.System.getIntForUser( + mContext.getContentResolver(), SETTING_KEY_CAMERA_FLASH_NOTIFICATION, 0, + UserHandle.USER_CURRENT) != 0; + if (mIsCameraFlashNotificationEnabled) { + prepareForCameraFlashNotification(); + } else { + if (mCameraManager != null) { + mCameraManager.unregisterTorchCallback(mTorchCallback); + } + } + + final AudioManager audioManager = mContext.getSystemService(AudioManager.class); + if (audioManager != null) { + audioManager.registerAudioPlaybackCallback(mAudioPlaybackCallback, + mCallbackHandler); + } + + mCameraManager = mContext.getSystemService(CameraManager.class); + mCameraManager.registerAvailabilityCallback(mTorchAvailabilityCallback, + mCallbackHandler); + + } else if (ACTION_FLASH_NOTIFICATION_START_PREVIEW.equals(intent.getAction())) { + if (DEBUG) Log.i(LOG_TAG, "ACTION_FLASH_NOTIFICATION_START_PREVIEW"); + final int color = intent.getIntExtra(EXTRA_FLASH_NOTIFICATION_PREVIEW_COLOR, + Color.TRANSPARENT); + final int type = intent.getIntExtra(EXTRA_FLASH_NOTIFICATION_PREVIEW_TYPE, + PREVIEW_TYPE_SHORT); + if (type == PREVIEW_TYPE_LONG) { + startFlashNotificationLongPreview(color); + } else if (type == PREVIEW_TYPE_SHORT) { + startFlashNotificationShortPreview(); + } + } else if (ACTION_FLASH_NOTIFICATION_STOP_PREVIEW.equals(intent.getAction())) { + if (DEBUG) Log.i(LOG_TAG, "ACTION_FLASH_NOTIFICATION_STOP_PREVIEW"); + stopFlashNotificationLongPreview(); + } + } + } + + private final class FlashContentObserver extends ContentObserver { + private final Uri mCameraFlashNotificationUri = Settings.System.getUriFor( + SETTING_KEY_CAMERA_FLASH_NOTIFICATION); + private final Uri mScreenFlashNotificationUri = Settings.System.getUriFor( + SETTING_KEY_SCREEN_FLASH_NOTIFICATION); + + FlashContentObserver(Handler handler) { + super(handler); + } + + void register(ContentResolver contentResolver) { + contentResolver.registerContentObserver(mCameraFlashNotificationUri, false, this, + UserHandle.USER_ALL); + contentResolver.registerContentObserver(mScreenFlashNotificationUri, false, this, + UserHandle.USER_ALL); + } + + @Override + public void onChange(boolean selfChange, Uri uri) { + if (mCameraFlashNotificationUri.equals(uri)) { + mIsCameraFlashNotificationEnabled = Settings.System.getIntForUser( + mContext.getContentResolver(), SETTING_KEY_CAMERA_FLASH_NOTIFICATION, 0, + UserHandle.USER_CURRENT) != 0; + if (mIsCameraFlashNotificationEnabled) { + prepareForCameraFlashNotification(); + } else { + mIsTorchOn = false; + if (mCameraManager != null) { + mCameraManager.unregisterTorchCallback(mTorchCallback); + } + } + } else if (mScreenFlashNotificationUri.equals(uri)) { + mIsScreenFlashNotificationEnabled = Settings.System.getIntForUser( + mContext.getContentResolver(), SETTING_KEY_SCREEN_FLASH_NOTIFICATION, 0, + UserHandle.USER_CURRENT) != 0; + } + } + } +} diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 939047fdb622..2b529bfe5e32 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -24,6 +24,7 @@ import static android.service.autofill.FillEventHistory.Event.UI_TYPE_MENU; import static android.service.autofill.FillEventHistory.Event.UI_TYPE_UNKNOWN; import static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST; import static android.service.autofill.FillRequest.FLAG_PASSWORD_INPUT_TYPE; +import static android.service.autofill.FillRequest.FLAG_PCC_DETECTION; import static android.service.autofill.FillRequest.FLAG_RESET_FILL_DIALOG_STATE; import static android.service.autofill.FillRequest.FLAG_SUPPORTS_FILL_DIALOG; import static android.service.autofill.FillRequest.FLAG_VIEW_NOT_FOCUSED; @@ -384,6 +385,11 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState */ private final AssistDataReceiverImpl mAssistReceiver = new AssistDataReceiverImpl(); + /** + * Receiver of assist data for pcc purpose + */ + private final PccAssistDataReceiverImpl mPccAssistReceiver = new PccAssistDataReceiverImpl(); + @Nullable private ClientSuggestionsSession mClientSuggestionsSession; @@ -698,6 +704,89 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } + /** + * Assist Data Receiver for PCC + */ + private final class PccAssistDataReceiverImpl extends IAssistDataReceiver.Stub { + // TODO: Uncomment lines below after field classification service definition merged + // @GuardedBy("mLock") + // private FieldClassificationRequest mPendingFieldClassifitacionRequest; + // @GuardedBy("mLock") + // private FieldClassificationRequest mLastFieldClassifitacionRequest; + + @GuardedBy("mLock") + void maybeRequestFieldClassificationFromServiceLocked() { + // TODO: Uncomment lines below after field classification service definition merged + // if (mPendingFieldClassifitacionRequest == null) { + // return; + // } + // mLastFieldClassifitacionRequest = mPendingFieldClassifitacionRequest; + // + // mRemoteFieldClassificationService.onFieldClassificationRequest( + // mPendingFieldClassifitacionRequest); + // + // mPendingFieldClassifitacionRequest = null; + } + + @Override + public void onHandleAssistData(Bundle resultData) throws RemoteException { + // TODO: add a check if pcc field classification service is present + final AssistStructure structure = resultData.getParcelable(ASSIST_KEY_STRUCTURE, + android.app.assist.AssistStructure.class); + if (structure == null) { + Slog.e(TAG, "No assist structure for pcc detection - " + + "app might have crashed providing it"); + return; + } + + final Bundle receiverExtras = resultData.getBundle(ASSIST_KEY_RECEIVER_EXTRAS); + if (receiverExtras == null) { + Slog.e(TAG, "No receiver extras for pcc detection - " + + "app might have crashed providing it"); + return; + } + + final int requestId = receiverExtras.getInt(EXTRA_REQUEST_ID); + + if (sVerbose) { + Slog.v(TAG, "New structure for requestId " + requestId + ": " + structure); + } + + synchronized (mLock) { + // TODO(b/35708678): Must fetch the data so it's available later on handleSave(), + // even if the activity is gone by then, but structure .ensureData() gives a + // ONE_WAY warning because system_service could block on app calls. We need to + // change AssistStructure so it provides a "one-way" writeToParcel() method that + // sends all the data + try { + structure.ensureDataForAutofill(); + } catch (RuntimeException e) { + wtf(e, "Exception lazy loading assist structure for %s: %s", + structure.getActivityComponent(), e); + return; + } + + final ArrayList<AutofillId> ids = Helper.getAutofillIds(structure, + /* autofillableOnly= */false); + for (int i = 0; i < ids.size(); i++) { + ids.get(i).setSessionId(Session.this.id); + } + + // TODO: Uncomment lines below after field classification service definition merged + // FieldClassificationRequest request = new FieldClassificationRequest(structure); + // + // mPendingFieldClassifitacionRequest = request; + // + // maybeRequestFieldClassificationFromServiceLocked(); + } + } + + @Override + public void onHandleAssistScreenshot(Bitmap screenshot) { + // Do nothing + } + } + /** Creates {@link PendingIntent} for autofill service to send a delayed fill. */ private PendingIntent createPendingIntent(int requestId) { Slog.d(TAG, "createPendingIntent for request " + requestId); @@ -1062,6 +1151,32 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } @GuardedBy("mLock") + private void requestAssistStructureForPccLocked(int flags) { + // Get request id + int requestId; + // TODO(b/158623971): Update this to prevent possible overflow + do { + requestId = sIdCounter.getAndIncrement(); + } while (requestId == INVALID_REQUEST_ID); + + // Call requestAutofilLData + try { + final Bundle receiverExtras = new Bundle(); + receiverExtras.putInt(EXTRA_REQUEST_ID, requestId); + final long identity = Binder.clearCallingIdentity(); + try { + if (!ActivityTaskManager.getService().requestAutofillData(mPccAssistReceiver, + receiverExtras, mActivityToken, flags)) { + Slog.w(TAG, "failed to request autofill data for pcc: " + mActivityToken); + } + } finally { + Binder.restoreCallingIdentity(identity); + } + } catch (RemoteException e) { + } + } + + @GuardedBy("mLock") private void requestAssistStructureLocked(int requestId, int flags) { try { final Bundle receiverExtras = new Bundle(); @@ -3095,6 +3210,12 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState mSessionFlags.mFillDialogDisabled = false; } + /* request assist structure for pcc */ + if ((flags & FLAG_PCC_DETECTION) != 0) { + requestAssistStructureForPccLocked(flags); + return; + } + switch(action) { case ACTION_START_SESSION: // View is triggering autofill. diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java index 7a93719b5045..54c47b2faec0 100644 --- a/services/core/java/com/android/server/BatteryService.java +++ b/services/core/java/com/android/server/BatteryService.java @@ -162,6 +162,7 @@ public final class BatteryService extends SystemService { private int mLowBatteryWarningLevel; private int mLastLowBatteryWarningLevel; private int mLowBatteryCloseWarningLevel; + private int mBatteryNearlyFullLevel; private int mShutdownBatteryTemperature; private int mPlugType; @@ -1212,6 +1213,8 @@ public final class BatteryService extends SystemService { com.android.internal.R.integer.config_notificationsBatteryLedOn); mBatteryLedOff = context.getResources().getInteger( com.android.internal.R.integer.config_notificationsBatteryLedOff); + mBatteryNearlyFullLevel = context.getResources().getInteger( + com.android.internal.R.integer.config_notificationsBatteryNearlyFullLevel); } /** @@ -1234,7 +1237,8 @@ public final class BatteryService extends SystemService { } } else if (status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL) { - if (status == BatteryManager.BATTERY_STATUS_FULL || level >= 90) { + if (status == BatteryManager.BATTERY_STATUS_FULL + || level >= mBatteryNearlyFullLevel) { // Solid green when full or charging and nearly full mBatteryLight.setColor(mBatteryFullARGB); } else { diff --git a/services/core/java/com/android/server/TEST_MAPPING b/services/core/java/com/android/server/TEST_MAPPING index cc8aec7f3261..c5b0f0509c2b 100644 --- a/services/core/java/com/android/server/TEST_MAPPING +++ b/services/core/java/com/android/server/TEST_MAPPING @@ -39,6 +39,26 @@ } ], "file_patterns": ["BinaryTransparencyService\\.java"] + }, + { + "name": "BinaryTransparencyHostTest", + "file_patterns": [ + "BinaryTransparencyService\\.java" + ] + }, + { + "name": "CtsMediaProjectionTestCases", + "options": [ + { + "exclude-annotation": "android.platform.test.annotations.FlakyTest" + }, + { + "exclude-annotation": "androidx.test.filters.FlakyTest" + }, + { + "exclude-annotation": "org.junit.Ignore" + } + ] } ], "presubmit-large": [ @@ -69,11 +89,5 @@ ], "file_patterns": ["ClipboardService\\.java"] } - ], - "postsubmit": [ - { - "name": "BinaryTransparencyHostTest", - "file_patterns": ["BinaryTransparencyService\\.java"] - } ] } diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java index cdc5d8131099..e1d1f6ce1866 100644 --- a/services/core/java/com/android/server/am/ActivityManagerConstants.java +++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java @@ -955,6 +955,20 @@ final class ActivityManagerConstants extends ContentObserver { DEFAULT_SHORT_FGS_PROC_STATE_EXTRA_WAIT_DURATION; /** + * If enabled, when starting an application, the system will wait for a + * {@link ActivityManagerService#finishAttachApplication} from the app before scheduling + * Broadcasts or Services to it. + */ + private static final String KEY_ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION = + "enable_wait_for_finish_attach_application"; + + private static final boolean DEFAULT_ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION = true; + + /** @see #KEY_ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION */ + public volatile boolean mEnableWaitForFinishAttachApplication = + DEFAULT_ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION; + + /** * If a "short service" doesn't finish within this after the timeout ( * {@link #KEY_SHORT_FGS_TIMEOUT_DURATION}), then we'll declare an ANR. * i.e. if the timeout is 60 seconds, and this ANR extra duration is 5 seconds, then @@ -1125,6 +1139,10 @@ final class ActivityManagerConstants extends ContentObserver { break; case KEY_TOP_TO_FGS_GRACE_DURATION: updateTopToFgsGraceDuration(); + break; + case KEY_ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION: + updateEnableWaitForFinishAttachApplication(); + break; default: break; } @@ -1840,6 +1858,13 @@ final class ActivityManagerConstants extends ContentObserver { DEFAULT_SHORT_FGS_ANR_EXTRA_WAIT_DURATION); } + private void updateEnableWaitForFinishAttachApplication() { + mEnableWaitForFinishAttachApplication = DeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + KEY_ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION, + DEFAULT_ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION); + } + @NeverCompile // Avoid size overhead of debugging code. void dump(PrintWriter pw) { pw.println("ACTIVITY MANAGER SETTINGS (dumpsys activity settings) " @@ -2027,5 +2052,7 @@ final class ActivityManagerConstants extends ContentObserver { pw.print(" CUR_TRIM_EMPTY_PROCESSES="); pw.println(CUR_TRIM_EMPTY_PROCESSES); pw.print(" CUR_TRIM_CACHED_PROCESSES="); pw.println(CUR_TRIM_CACHED_PROCESSES); pw.print(" OOMADJ_UPDATE_QUICK="); pw.println(OOMADJ_UPDATE_QUICK); + pw.print(" ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION="); + pw.println(mEnableWaitForFinishAttachApplication); } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index aad49c970b9d..8bb1dfd8af00 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -87,6 +87,7 @@ import static android.os.Process.ZYGOTE_PROCESS; import static android.os.Process.getTotalMemory; import static android.os.Process.isThreadInProcess; import static android.os.Process.killProcess; +import static android.os.Process.killProcessGroup; import static android.os.Process.killProcessQuiet; import static android.os.Process.myPid; import static android.os.Process.myUid; @@ -969,13 +970,6 @@ public class ActivityManagerService extends IActivityManager.Stub } return false; } - - boolean doRemoveIfNoThreadInternal(int pid, ProcessRecord app) { - if (app == null || app.getThread() != null) { - return false; - } - return doRemoveInternal(pid, app); - } } private final PendingStartActivityUids mPendingStartActivityUids; @@ -1007,7 +1001,7 @@ public class ActivityManagerService extends IActivityManager.Stub * method. */ @GuardedBy("this") - void removePidLocked(int pid, ProcessRecord app) { + boolean removePidLocked(int pid, ProcessRecord app) { final boolean removed; synchronized (mPidsSelfLocked) { removed = mPidsSelfLocked.doRemoveInternal(pid, app); @@ -1018,26 +1012,6 @@ public class ActivityManagerService extends IActivityManager.Stub } mAtmInternal.onProcessUnMapped(pid); } - } - - /** - * Removes the process record from the map if it doesn't have a thread. - * <p>NOTE: Callers should avoid acquiring the mPidsSelfLocked lock before calling this - * method. - */ - @GuardedBy("this") - private boolean removePidIfNoThreadLocked(ProcessRecord app) { - final boolean removed; - final int pid = app.getPid(); - synchronized (mPidsSelfLocked) { - removed = mPidsSelfLocked.doRemoveIfNoThreadInternal(pid, app); - } - if (removed) { - synchronized (sActiveProcessInfoSelfLocked) { - sActiveProcessInfoSelfLocked.remove(pid); - } - mAtmInternal.onProcessUnMapped(pid); - } return removed; } @@ -2339,7 +2313,7 @@ public class ActivityManagerService extends IActivityManager.Stub mAppErrors = null; mPackageWatchdog = null; mAppOpsService = mInjector.getAppOpsService(null /* file */, null /* handler */); - mBatteryStatsService = null; + mBatteryStatsService = mInjector.getBatteryStatsService(); mHandler = new MainHandler(handlerThread.getLooper()); mHandlerThread = handlerThread; mConstants = new ActivityManagerConstants(mContext, this, mHandler); @@ -2354,7 +2328,7 @@ public class ActivityManagerService extends IActivityManager.Stub mIntentFirewall = null; mProcessStats = new ProcessStatsService(this, mContext.getCacheDir()); mCpHelper = new ContentProviderHelper(this, false); - mServices = null; + mServices = mInjector.getActiveServices(this); mSystemThread = null; mUiHandler = injector.getUiHandler(null /* service */); mUidObserverController = new UidObserverController(mUiHandler); @@ -3301,8 +3275,7 @@ public class ActivityManagerService extends IActivityManager.Stub ProcessRecord record = mProcessList.getLRURecordForAppLOSP(threadBinder); if (record != null) return record; - // Validation: if it isn't in the LRU list, it shouldn't exist, but let's - // double-check that. + // Validation: if it isn't in the LRU list, it shouldn't exist, but let's double-check that. final ArrayMap<String, SparseArray<ProcessRecord>> pmap = mProcessList.getProcessNamesLOSP().getMap(); for (int i = pmap.size()-1; i >= 0; i--) { @@ -3311,8 +3284,10 @@ public class ActivityManagerService extends IActivityManager.Stub final ProcessRecord proc = procs.valueAt(j); final IApplicationThread procThread = proc.getThread(); if (procThread != null && procThread.asBinder() == threadBinder) { - Slog.wtf(TAG, "getRecordForApp: exists in name list but not in LRU list: " - + proc); + if (!proc.isPendingFinishAttach()) { + Slog.wtf(TAG, "getRecordForApp: exists in name list but not in LRU list: " + + proc); + } return proc; } } @@ -4744,7 +4719,7 @@ public class ActivityManagerService extends IActivityManager.Stub @GuardedBy("this") void handleProcessStartOrKillTimeoutLocked(ProcessRecord app, boolean isKillTimeout) { final int pid = app.getPid(); - boolean gone = isKillTimeout || removePidIfNoThreadLocked(app); + boolean gone = isKillTimeout || removePidLocked(pid, app); if (gone) { if (isKillTimeout) { @@ -4825,7 +4800,7 @@ public class ActivityManagerService extends IActivityManager.Stub } @GuardedBy("this") - private boolean attachApplicationLocked(@NonNull IApplicationThread thread, + private void attachApplicationLocked(@NonNull IApplicationThread thread, int pid, int callingUid, long startSeq) { // Find the application record that is being attached... either via @@ -4890,7 +4865,7 @@ public class ActivityManagerService extends IActivityManager.Stub // Ignore exceptions. } } - return false; + return; } // If this application record is still attached to a previous @@ -4915,7 +4890,7 @@ public class ActivityManagerService extends IActivityManager.Stub mProcessList.startProcessLocked(app, new HostingRecord(HostingRecord.HOSTING_TYPE_LINK_FAIL, processName), ZYGOTE_POLICY_FLAG_EMPTY); - return false; + return; } EventLogTags.writeAmProcBound(app.userId, pid, app.processName); @@ -4938,8 +4913,6 @@ public class ActivityManagerService extends IActivityManager.Stub app.setUnlocked(StorageManager.isUserKeyUnlocked(app.userId)); } - mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); - boolean normalMode = mProcessesReady || isAllowedWhileBooting(app.info); List<ProviderInfo> providers = normalMode ? mCpHelper.generateApplicationProvidersLocked(app) @@ -5090,6 +5063,8 @@ public class ActivityManagerService extends IActivityManager.Stub profilerInfo = null; } + app.setBindApplicationTime(bindApplicationTimeMillis); + // Make app active after binding application or client may be running requests (e.g // starting activities) before it is ready. synchronized (mProcLock) { @@ -5103,6 +5078,19 @@ public class ActivityManagerService extends IActivityManager.Stub app.mProfile.setLastRequestedGc(now); app.mProfile.setLastLowMemory(now); } + + // Remove this record from the list of starting applications. + mPersistentStartingProcesses.remove(app); + if (DEBUG_PROCESSES && mProcessesOnHold.contains(app)) { + Slog.v(TAG_PROCESSES, "Attach application locked removing on hold: " + app); + } + mProcessesOnHold.remove(app); + + if (!mConstants.mEnableWaitForFinishAttachApplication) { + finishAttachApplicationInner(startSeq, callingUid, pid); + } else { + app.setPendingFinishAttach(true); + } } catch (Exception e) { // We need kill the process group here. (b/148588589) Slog.wtf(TAG, "Exception thrown during bind of " + app, e); @@ -5111,111 +5099,168 @@ public class ActivityManagerService extends IActivityManager.Stub app.killLocked("error during bind", ApplicationExitInfo.REASON_INITIALIZATION_FAILURE, true); handleAppDiedLocked(app, pid, false, true, false /* fromBinderDied */); - return false; + return; } + } - // Remove this record from the list of starting applications. - mPersistentStartingProcesses.remove(app); - if (DEBUG_PROCESSES && mProcessesOnHold.contains(app)) Slog.v(TAG_PROCESSES, - "Attach application locked removing on hold: " + app); - mProcessesOnHold.remove(app); + @Override + public final void attachApplication(IApplicationThread thread, long startSeq) { + if (thread == null) { + throw new SecurityException("Invalid application interface"); + } + synchronized (this) { + int callingPid = Binder.getCallingPid(); + final int callingUid = Binder.getCallingUid(); + final long origId = Binder.clearCallingIdentity(); + attachApplicationLocked(thread, callingPid, callingUid, startSeq); + Binder.restoreCallingIdentity(origId); + } + } - boolean badApp = false; - boolean didSomething = false; + private void finishAttachApplicationInner(long startSeq, int uid, int pid) { + final long startTime = SystemClock.uptimeMillis(); + // Find the application record that is being attached... either via + // the pid if we are running in multiple processes, or just pull the + // next app record if we are emulating process with anonymous threads. + final ProcessRecord app; + synchronized (mPidsSelfLocked) { + app = mPidsSelfLocked.get(pid); + } - // See if the top visible activity is waiting to run in this process... - if (normalMode) { - try { - didSomething = mAtmInternal.attachApplication(app.getWindowProcessController()); - } catch (Exception e) { - Slog.wtf(TAG, "Exception thrown launching activities in " + app, e); - badApp = true; + if (app != null && app.getStartUid() == uid && app.getStartSeq() == startSeq) { + mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); + } else { + Slog.wtf(TAG, "Mismatched or missing ProcessRecord: " + app + ". Pid: " + pid + + ". Uid: " + uid); + killProcess(pid); + killProcessGroup(uid, pid); + mProcessList.noteAppKill(pid, uid, + ApplicationExitInfo.REASON_INITIALIZATION_FAILURE, + ApplicationExitInfo.SUBREASON_UNKNOWN, + "wrong startSeq"); + synchronized (this) { + app.killLocked("unexpected process record", + ApplicationExitInfo.REASON_OTHER, true); } + return; } - // Find any services that should be running in this process... - if (!badApp) { - try { - didSomething |= mServices.attachApplicationLocked(app, processName); - checkTime(startTime, "attachApplicationLocked: after mServices.attachApplicationLocked"); - } catch (Exception e) { - Slog.wtf(TAG, "Exception thrown starting services in " + app, e); - badApp = true; + synchronized (this) { + // Mark the finish attach application phase as completed + app.setPendingFinishAttach(false); + + final boolean normalMode = mProcessesReady || isAllowedWhileBooting(app.info); + final String processName = app.processName; + boolean badApp = false; + boolean didSomething = false; + + // See if the top visible activity is waiting to run in this process... + if (normalMode) { + try { + didSomething = mAtmInternal.attachApplication(app.getWindowProcessController()); + } catch (Exception e) { + Slog.wtf(TAG, "Exception thrown launching activities in " + app, e); + badApp = true; + } } - } - // Check if a next-broadcast receiver is in this process... - if (!badApp) { - try { - for (BroadcastQueue queue : mBroadcastQueues) { - didSomething |= queue.onApplicationAttachedLocked(app); + // Find any services that should be running in this process... + if (!badApp) { + try { + didSomething |= mServices.attachApplicationLocked(app, processName); + checkTime(startTime, "finishAttachApplicationInner: " + + "after mServices.attachApplicationLocked"); + } catch (Exception e) { + Slog.wtf(TAG, "Exception thrown starting services in " + app, e); + badApp = true; } - checkTime(startTime, "attachApplicationLocked: after dispatching broadcasts"); - } catch (Exception e) { - // If the app died trying to launch the receiver we declare it 'bad' - Slog.wtf(TAG, "Exception thrown dispatching broadcasts in " + app, e); - badApp = true; } - } - // Check whether the next backup agent is in this process... - if (!badApp && backupTarget != null && backupTarget.app == app) { - if (DEBUG_BACKUP) Slog.v(TAG_BACKUP, - "New app is backup target, launching agent for " + app); - notifyPackageUse(backupTarget.appInfo.packageName, - PackageManager.NOTIFY_PACKAGE_USE_BACKUP); - try { - thread.scheduleCreateBackupAgent(backupTarget.appInfo, - backupTarget.backupMode, backupTarget.userId, - backupTarget.backupDestination); - } catch (Exception e) { - Slog.wtf(TAG, "Exception thrown creating backup agent in " + app, e); - badApp = true; + // Check if a next-broadcast receiver is in this process... + if (!badApp) { + try { + for (BroadcastQueue queue : mBroadcastQueues) { + didSomething |= queue.onApplicationAttachedLocked(app); + } + checkTime(startTime, "finishAttachApplicationInner: " + + "after dispatching broadcasts"); + } catch (Exception e) { + // If the app died trying to launch the receiver we declare it 'bad' + Slog.wtf(TAG, "Exception thrown dispatching broadcasts in " + app, e); + badApp = true; + } } - } - if (badApp) { - app.killLocked("error during init", ApplicationExitInfo.REASON_INITIALIZATION_FAILURE, - true); - handleAppDiedLocked(app, pid, false, true, false /* fromBinderDied */); - return false; - } + // Check whether the next backup agent is in this process... + final BackupRecord backupTarget = mBackupTargets.get(app.userId); + if (!badApp && backupTarget != null && backupTarget.app == app) { + if (DEBUG_BACKUP) { + Slog.v(TAG_BACKUP, + "New app is backup target, launching agent for " + app); + } - if (!didSomething) { - updateOomAdjLocked(app, OomAdjuster.OOM_ADJ_REASON_PROCESS_BEGIN); - checkTime(startTime, "attachApplicationLocked: after updateOomAdjLocked"); - } + notifyPackageUse(backupTarget.appInfo.packageName, + PackageManager.NOTIFY_PACKAGE_USE_BACKUP); + try { + app.getThread().scheduleCreateBackupAgent(backupTarget.appInfo, + backupTarget.backupMode, backupTarget.userId, + backupTarget.backupDestination); + } catch (Exception e) { + Slog.wtf(TAG, "Exception thrown creating backup agent in " + app, e); + badApp = true; + } + } + if (badApp) { + app.killLocked("error during init", + ApplicationExitInfo.REASON_INITIALIZATION_FAILURE, true); + handleAppDiedLocked(app, pid, false, true, false /* fromBinderDied */); + return; + } - final HostingRecord hostingRecord = app.getHostingRecord(); - String shortAction = getShortAction(hostingRecord.getAction()); - FrameworkStatsLog.write( - FrameworkStatsLog.PROCESS_START_TIME, - app.info.uid, - pid, - app.info.packageName, - FrameworkStatsLog.PROCESS_START_TIME__TYPE__COLD, - app.getStartElapsedTime(), - (int) (bindApplicationTimeMillis - app.getStartUptime()), - (int) (SystemClock.uptimeMillis() - app.getStartUptime()), - hostingRecord.getType(), - hostingRecord.getName(), - shortAction, - HostingRecord.getHostingTypeIdStatsd(hostingRecord.getType()), - HostingRecord.getTriggerTypeForStatsd(hostingRecord.getTriggerType())); - return true; + if (!didSomething) { + updateOomAdjLocked(app, OomAdjuster.OOM_ADJ_REASON_PROCESS_BEGIN); + checkTime(startTime, "finishAttachApplicationInner: after updateOomAdjLocked"); + } + + final HostingRecord hostingRecord = app.getHostingRecord(); + final String shortAction = getShortAction(hostingRecord.getAction()); + FrameworkStatsLog.write( + FrameworkStatsLog.PROCESS_START_TIME, + app.info.uid, + pid, + app.info.packageName, + FrameworkStatsLog.PROCESS_START_TIME__TYPE__COLD, + app.getStartElapsedTime(), + (int) (app.getBindApplicationTime() - app.getStartUptime()), + (int) (SystemClock.uptimeMillis() - app.getStartUptime()), + hostingRecord.getType(), + hostingRecord.getName(), + shortAction, + HostingRecord.getHostingTypeIdStatsd(hostingRecord.getType()), + HostingRecord.getTriggerTypeForStatsd(hostingRecord.getTriggerType())); + } } @Override - public final void attachApplication(IApplicationThread thread, long startSeq) { - if (thread == null) { - throw new SecurityException("Invalid application interface"); + public final void finishAttachApplication(long startSeq) { + final int pid = Binder.getCallingPid(); + final int uid = Binder.getCallingUid(); + + if (!mConstants.mEnableWaitForFinishAttachApplication) { + Slog.i(TAG, "Flag disabled. Ignoring finishAttachApplication from uid: " + + uid + ". pid: " + pid); + return; } - synchronized (this) { - int callingPid = Binder.getCallingPid(); - final int callingUid = Binder.getCallingUid(); - final long origId = Binder.clearCallingIdentity(); - attachApplicationLocked(thread, callingPid, callingUid, startSeq); + + if (pid == MY_PID && uid == SYSTEM_UID) { + return; + } + + final long origId = Binder.clearCallingIdentity(); + try { + finishAttachApplicationInner(startSeq, uid, pid); + } finally { Binder.restoreCallingIdentity(origId); } } @@ -19047,6 +19092,21 @@ public class ActivityManagerService extends IActivityManager.Stub return new ProcessList(); } + /** + * Returns the {@link BatteryStatsService} instance + */ + public BatteryStatsService getBatteryStatsService() { + return new BatteryStatsService(mContext, SystemServiceManager.ensureSystemDir(), + BackgroundThread.get().getHandler()); + } + + /** + * Returns the {@link ActiveServices} instance + */ + public ActiveServices getActiveServices(ActivityManagerService service) { + return new ActiveServices(service); + } + private boolean ensureHasNetworkManagementInternal() { if (mNmi == null) { mNmi = LocalServices.getService(NetworkManagementInternal.class); diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 8591973f8be1..f11a3be5c20e 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -1243,7 +1243,7 @@ public class OomAdjuster { for (int i = numLru - 1; i >= 0; i--) { ProcessRecord app = lruList.get(i); final ProcessStateRecord state = app.mState; - if (!app.isKilledByAm() && app.getThread() != null) { + if (!app.isKilledByAm() && app.getThread() != null && !app.isPendingFinishAttach()) { // We don't need to apply the update for the process which didn't get computed if (state.getCompletedAdjSeq() == mAdjSeq) { applyOomAdjLSP(app, true, now, nowElapsed, oomAdjReason); diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 2b2de81e36c6..ee315bdb963b 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -2514,7 +2514,7 @@ public final class ProcessList { } @GuardedBy("mService") - private String isProcStartValidLocked(ProcessRecord app, long expectedStartSeq) { + String isProcStartValidLocked(ProcessRecord app, long expectedStartSeq) { StringBuilder sb = null; if (app.isKilledByAm()) { if (sb == null) sb = new StringBuilder(); diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index e6cb596ef882..a7072024f65e 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -175,6 +175,12 @@ class ProcessRecord implements WindowProcessListener { private boolean mPendingStart; /** + * Process finish attach application is pending. + */ + @GuardedBy("mService") + private boolean mPendingFinishAttach; + + /** * Seq no. Indicating the latest process start associated with this process record. */ @GuardedBy("mService") @@ -201,6 +207,11 @@ class ProcessRecord implements WindowProcessListener { private volatile long mStartElapsedTime; /** + * When the process was sent the bindApplication request + */ + private volatile long mBindApplicationTime; + + /** * This will be same as {@link #uid} usually except for some apps used during factory testing. */ private volatile int mStartUid; @@ -698,6 +709,16 @@ class ProcessRecord implements WindowProcessListener { } @GuardedBy("mService") + void setPendingFinishAttach(boolean pendingFinishAttach) { + mPendingFinishAttach = pendingFinishAttach; + } + + @GuardedBy("mService") + boolean isPendingFinishAttach() { + return mPendingFinishAttach; + } + + @GuardedBy("mService") long getStartSeq() { return mStartSeq; } @@ -740,6 +761,14 @@ class ProcessRecord implements WindowProcessListener { return mStartElapsedTime; } + long getBindApplicationTime() { + return mBindApplicationTime; + } + + void setBindApplicationTime(long bindApplicationTime) { + mBindApplicationTime = bindApplicationTime; + } + int getStartUid() { return mStartUid; } diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index af6470f114db..77f16f964545 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -154,6 +154,7 @@ import com.android.internal.util.XmlUtils; import com.android.internal.util.function.pooled.PooledLambda; import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; +import com.android.server.LocalManagerRegistry; import com.android.server.LocalServices; import com.android.server.LockGuard; import com.android.server.SystemServerInitThreadPool; @@ -967,7 +968,7 @@ public class AppOpsService extends IAppOpsService.Stub implements PersistenceSch public void publish() { ServiceManager.addService(Context.APP_OPS_SERVICE, asBinder()); LocalServices.addService(AppOpsManagerInternal.class, mAppOpsManagerInternal); - LocalServices.addService(AppOpsManagerLocal.class, new AppOpsManagerLocalImpl()); + LocalManagerRegistry.addManager(AppOpsManagerLocal.class, new AppOpsManagerLocalImpl()); } /** Handler for work when packages are removed or updated */ diff --git a/services/core/java/com/android/server/biometrics/sensors/SensorOverlays.java b/services/core/java/com/android/server/biometrics/sensors/SensorOverlays.java index 969a174f49c7..0b5c1c171354 100644 --- a/services/core/java/com/android/server/biometrics/sensors/SensorOverlays.java +++ b/services/core/java/com/android/server/biometrics/sensors/SensorOverlays.java @@ -150,6 +150,13 @@ public final class SensorOverlays { } /** + * Returns if the sensor is side fps. + */ + public boolean isSfps() { + return mSidefpsController.isPresent(); + } + + /** * Consumer for a biometric overlay controller. * * This behaves like a normal {@link Consumer} except that it will trap and log diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java index a90679e755cf..932c0b4948a0 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java @@ -236,8 +236,14 @@ class FingerprintAuthenticationClient extends AuthenticationClient<AidlSession> @Override public void onError(int errorCode, int vendorCode) { - super.onError(errorCode, vendorCode); - + if (errorCode == BiometricFingerprintConstants.FINGERPRINT_ERROR_VENDOR + && vendorCode == BiometricFingerprintConstants.BIOMETRIC_ERROR_POWER_PRESSED + && mSensorOverlays.isSfps()) { + super.onError(BiometricFingerprintConstants.BIOMETRIC_ERROR_POWER_PRESSED, + 0 /* vendorCode */); + } else { + super.onError(errorCode, vendorCode); + } if (errorCode == BiometricFingerprintConstants.FINGERPRINT_ERROR_BAD_CALIBRATION) { BiometricNotificationUtils.showBadCalibrationNotification(getContext()); } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java index 513b3e3e6e86..cf54662dfa7d 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java @@ -146,7 +146,14 @@ class FingerprintEnrollClient extends EnrollClient<AidlSession> implements Udfps } }); mCallback.onBiometricAction(BiometricStateListener.ACTION_SENSOR_TOUCH); - super.onAcquired(acquiredInfo, vendorCode); + if (acquiredInfo == BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_VENDOR + && vendorCode == BiometricFingerprintConstants.BIOMETRIC_ERROR_POWER_PRESSED + && mSensorOverlays.isSfps()) { + super.onAcquired(BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_POWER_PRESSED, + 0 /* vendorCode */); + } else { + super.onAcquired(acquiredInfo, vendorCode); + } } @Override @@ -274,8 +281,5 @@ class FingerprintEnrollClient extends EnrollClient<AidlSession> implements Udfps } @Override - public void onPowerPressed() { - onAcquired(BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_POWER_PRESSED, - 0 /* vendorCode */); - } + public void onPowerPressed() { } } diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java index 60903864a881..1086c5565227 100644 --- a/services/core/java/com/android/server/display/LogicalDisplay.java +++ b/services/core/java/com/android/server/display/LogicalDisplay.java @@ -161,7 +161,11 @@ final class LogicalDisplay { // Indicates the position of the display, POSITION_UNKNOWN could mean it hasn't been specified, // or this is a virtual display etc. - private int mPosition = Layout.Display.POSITION_UNKNOWN; + private int mDevicePosition = Layout.Display.POSITION_UNKNOWN; + + // Indicates that something other than the primary display device info has changed and needs to + // be handled in the next update. + private boolean mDirty = false; /** * The ID of the brightness throttling data that should be used. This can change e.g. in @@ -181,11 +185,14 @@ final class LogicalDisplay { mBrightnessThrottlingDataId = DisplayDeviceConfig.DEFAULT_BRIGHTNESS_THROTTLING_DATA_ID; } - public void setPositionLocked(int position) { - mPosition = position; + public void setDevicePositionLocked(int position) { + if (mDevicePosition != position) { + mDevicePosition = position; + mDirty = true; + } } - public int getPositionLocked() { - return mPosition; + public int getDevicePositionLocked() { + return mDevicePosition; } /** @@ -343,9 +350,11 @@ final class LogicalDisplay { // logical display that they are sharing. (eg. Adjust size for pixel-perfect // mirroring over HDMI.) DisplayDeviceInfo deviceInfo = mPrimaryDisplayDevice.getDisplayDeviceInfoLocked(); - if (!Objects.equals(mPrimaryDisplayDeviceInfo, deviceInfo)) { + if (!Objects.equals(mPrimaryDisplayDeviceInfo, deviceInfo) || mDirty) { mBaseDisplayInfo.layerStack = mLayerStack; mBaseDisplayInfo.flags = 0; + // Displays default to moving content to the primary display when removed + mBaseDisplayInfo.removeMode = Display.REMOVE_MODE_MOVE_CONTENT_TO_PRIMARY; if ((deviceInfo.flags & DisplayDeviceInfo.FLAG_SUPPORTS_PROTECTED_BUFFERS) != 0) { mBaseDisplayInfo.flags |= Display.FLAG_SUPPORTS_PROTECTED_BUFFERS; } @@ -443,12 +452,20 @@ final class LogicalDisplay { mBaseDisplayInfo.installOrientation = deviceInfo.installOrientation; mBaseDisplayInfo.displayShape = deviceInfo.displayShape; - if (mPosition == Layout.Display.POSITION_REAR) { + if (mDevicePosition == Layout.Display.POSITION_REAR) { + // A rear display is meant to host a specific experience that is essentially + // a presentation to another user or users other than the main user since they + // can't actually see that display. Given that, it's a suitable display for + // presentations but the content should be destroyed rather than moved to a non-rear + // display when the rear display is removed. mBaseDisplayInfo.flags |= Display.FLAG_REAR; + mBaseDisplayInfo.flags |= Display.FLAG_PRESENTATION; + mBaseDisplayInfo.removeMode = Display.REMOVE_MODE_DESTROY_CONTENT; } mPrimaryDisplayDeviceInfo = deviceInfo; mInfo.set(null); + mDirty = false; } } @@ -857,7 +874,7 @@ final class LogicalDisplay { pw.println("mIsEnabled=" + mIsEnabled); pw.println("mIsInTransition=" + mIsInTransition); pw.println("mLayerStack=" + mLayerStack); - pw.println("mPosition=" + mPosition); + pw.println("mPosition=" + mDevicePosition); pw.println("mHasContent=" + mHasContent); pw.println("mDesiredDisplayModeSpecs={" + mDesiredDisplayModeSpecs + "}"); pw.println("mRequestedColorMode=" + mRequestedColorMode); diff --git a/services/core/java/com/android/server/display/LogicalDisplayMapper.java b/services/core/java/com/android/server/display/LogicalDisplayMapper.java index 56c9056b1f0a..c69586279a49 100644 --- a/services/core/java/com/android/server/display/LogicalDisplayMapper.java +++ b/services/core/java/com/android/server/display/LogicalDisplayMapper.java @@ -992,7 +992,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { newDisplay.swapDisplaysLocked(oldDisplay); } - newDisplay.setPositionLocked(displayLayout.getPosition()); + newDisplay.setDevicePositionLocked(displayLayout.getPosition()); newDisplay.setLeadDisplayLocked(displayLayout.getLeadDisplayId()); setLayoutLimitedRefreshRate(newDisplay, device, displayLayout); setEnabledLocked(newDisplay, displayLayout.isEnabled()); diff --git a/services/core/java/com/android/server/display/TEST_MAPPING b/services/core/java/com/android/server/display/TEST_MAPPING index 57c2e01297e6..c4a566fd7b62 100644 --- a/services/core/java/com/android/server/display/TEST_MAPPING +++ b/services/core/java/com/android/server/display/TEST_MAPPING @@ -16,6 +16,20 @@ {"exclude-annotation": "androidx.test.filters.FlakyTest"}, {"exclude-annotation": "org.junit.Ignore"} ] + }, + { + "name": "CtsMediaProjectionTestCases", + "options": [ + { + "exclude-annotation": "android.platform.test.annotations.FlakyTest" + }, + { + "exclude-annotation": "androidx.test.filters.FlakyTest" + }, + { + "exclude-annotation": "org.junit.Ignore" + } + ] } ] }
\ No newline at end of file diff --git a/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java b/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java index 13fcff3805d3..e3d92a7b4831 100644 --- a/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java +++ b/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java @@ -92,9 +92,9 @@ public final class DisplayBrightnessController { // TODO: b/186428377 update brightness setting when display changes mBrightnessSetting = brightnessSetting; mPendingScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT; + mScreenBrightnessDefault = BrightnessUtils.clampAbsoluteBrightness(defaultScreenBrightness); mCurrentScreenBrightness = getScreenBrightnessSetting(); mOnBrightnessChangeRunnable = onBrightnessChangeRunnable; - mScreenBrightnessDefault = BrightnessUtils.clampAbsoluteBrightness(defaultScreenBrightness); mDisplayBrightnessStrategySelector = injector.getDisplayBrightnessStrategySelector(context, displayId); } diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index 6303bdc63c36..9eedc4e0f9ee 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -1261,7 +1261,8 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { void launchRoutingControl(boolean routingForBootup) { assertRunOnServiceThread(); // Seq #24 - if (getActivePortId() != Constants.INVALID_PORT_ID) { + if (getActivePortId() != Constants.INVALID_PORT_ID + && getActivePortId() != Constants.CEC_SWITCH_HOME) { if (!routingForBootup && !isProhibitMode()) { int newPath = mService.portIdToPath(getActivePortId()); setActivePath(newPath); diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 14b9121a9b1c..740d2a3c2b6e 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -2481,6 +2481,7 @@ public class HdmiControlService extends SystemService { Slog.w(TAG, "Local tv device not available to change arc mode."); return; } + tv.startArcAction(enabled); } }); } diff --git a/services/core/java/com/android/server/input/InputSettingsObserver.java b/services/core/java/com/android/server/input/InputSettingsObserver.java index 8ee3a721fc63..a113d011b457 100644 --- a/services/core/java/com/android/server/input/InputSettingsObserver.java +++ b/services/core/java/com/android/server/input/InputSettingsObserver.java @@ -103,9 +103,9 @@ class InputSettingsObserver extends ContentObserver { mObservers.get(uri).accept("setting changed"); } - private boolean getBoolean(String settingName) { + private boolean getBoolean(String settingName, boolean defaultValue) { final int setting = Settings.System.getIntForUser(mContext.getContentResolver(), - settingName, 0, UserHandle.USER_CURRENT); + settingName, defaultValue ? 1 : 0, UserHandle.USER_CURRENT); return setting != 0; } @@ -127,20 +127,21 @@ class InputSettingsObserver extends ContentObserver { private void updateTouchpadNaturalScrollingEnabled() { mNative.setTouchpadNaturalScrollingEnabled( - getBoolean(Settings.System.TOUCHPAD_NATURAL_SCROLLING)); + getBoolean(Settings.System.TOUCHPAD_NATURAL_SCROLLING, true)); } private void updateTouchpadTapToClickEnabled() { - mNative.setTouchpadTapToClickEnabled(getBoolean(Settings.System.TOUCHPAD_TAP_TO_CLICK)); + mNative.setTouchpadTapToClickEnabled( + getBoolean(Settings.System.TOUCHPAD_TAP_TO_CLICK, true)); } private void updateTouchpadRightClickZoneEnabled() { mNative.setTouchpadRightClickZoneEnabled( - getBoolean(Settings.System.TOUCHPAD_RIGHT_CLICK_ZONE)); + getBoolean(Settings.System.TOUCHPAD_RIGHT_CLICK_ZONE, false)); } private void updateShowTouches() { - mNative.setShowTouches(getBoolean(Settings.System.SHOW_TOUCHES)); + mNative.setShowTouches(getBoolean(Settings.System.SHOW_TOUCHES, false)); } private void updateAccessibilityLargePointer() { diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java index 50febba6f917..925ab658bf3d 100644 --- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java +++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java @@ -2105,6 +2105,11 @@ public class LocationProviderManager extends @Override protected boolean registerWithService(ProviderRequest request, Collection<Registration> registrations) { + if (!request.isActive()) { + // the default request is already an empty request, no need to register this + return true; + } + return reregisterWithService(ProviderRequest.EMPTY_REQUEST, request, registrations); } @@ -2179,6 +2184,9 @@ public class LocationProviderManager extends } EVENT_LOG.logProviderUpdateRequest(mName, request); + if (D) { + Log.d(TAG, mName + " provider request changed to " + request); + } mProvider.getController().setRequest(request); FgThread.getHandler().post(() -> { diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index 0c99e865a040..1457bffc13f1 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -18,7 +18,6 @@ package com.android.server.locksettings; import static android.Manifest.permission.ACCESS_KEYGUARD_SECURE_STORAGE; import static android.Manifest.permission.MANAGE_BIOMETRIC; -import static android.Manifest.permission.READ_CONTACTS; import static android.Manifest.permission.SET_AND_VERIFY_LOCKSCREEN_CREDENTIALS; import static android.Manifest.permission.SET_INITIAL_LOCK; import static android.app.admin.DevicePolicyManager.DEPRECATE_USERMANAGERINTERNAL_DEVICEPOLICY_DEFAULT; @@ -30,7 +29,6 @@ import static android.content.Context.KEYGUARD_SERVICE; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.UserHandle.USER_ALL; import static android.os.UserHandle.USER_SYSTEM; -import static android.provider.DeviceConfig.NAMESPACE_AUTO_PIN_CONFIRMATION; import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_NONE; import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PASSWORD; @@ -100,7 +98,6 @@ import android.os.storage.IStorageManager; import android.os.storage.StorageManager; import android.provider.DeviceConfig; import android.provider.Settings; -import android.provider.Settings.Secure; import android.security.AndroidKeyStoreMaintenance; import android.security.Authorization; import android.security.KeyStore; @@ -853,7 +850,6 @@ public class LockSettingsService extends ILockSettings.Stub { .hasSystemFeature(PackageManager.FEATURE_SECURE_LOCK_SCREEN); migrateOldData(); getGateKeeperService(); - mSpManager.initWeaverService(); getAuthSecretHal(); mDeviceProvisionedObserver.onSystemReady(); @@ -1087,27 +1083,21 @@ public class LockSettingsService extends ILockSettings.Stub { mContext.enforceCallingOrSelfPermission(PERMISSION, "LockSettingsHave"); } - private final void checkReadPermission(String requestedKey, int userId) { - final int callingUid = Binder.getCallingUid(); + private static final String[] UNPROTECTED_SETTINGS = { + // These three LOCK_PATTERN_* settings have traditionally been readable via the public API + // android.provider.Settings.{System,Secure}.getString() without any permission. + Settings.Secure.LOCK_PATTERN_ENABLED, + Settings.Secure.LOCK_PATTERN_VISIBLE, + Settings.Secure.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED, + }; - for (int i = 0; i < READ_CONTACTS_PROTECTED_SETTINGS.length; i++) { - String key = READ_CONTACTS_PROTECTED_SETTINGS[i]; - if (key.equals(requestedKey) && mContext.checkCallingOrSelfPermission(READ_CONTACTS) - != PackageManager.PERMISSION_GRANTED) { - throw new SecurityException("uid=" + callingUid - + " needs permission " + READ_CONTACTS + " to read " - + requestedKey + " for user " + userId); - } + private final void checkDatabaseReadPermission(String requestedKey, int userId) { + if (ArrayUtils.contains(UNPROTECTED_SETTINGS, requestedKey)) { + return; } - - for (int i = 0; i < READ_PASSWORD_PROTECTED_SETTINGS.length; i++) { - String key = READ_PASSWORD_PROTECTED_SETTINGS[i]; - if (key.equals(requestedKey) && mContext.checkCallingOrSelfPermission(PERMISSION) - != PackageManager.PERMISSION_GRANTED) { - throw new SecurityException("uid=" + callingUid - + " needs permission " + PERMISSION + " to read " - + requestedKey + " for user " + userId); - } + if (!hasPermission(PERMISSION)) { + throw new SecurityException("uid=" + getCallingUid() + " needs permission " + + PERMISSION + " to read " + requestedKey + " for user " + userId); } } @@ -1136,7 +1126,7 @@ public class LockSettingsService extends ILockSettings.Stub { @Override public boolean getSeparateProfileChallengeEnabled(int userId) { - checkReadPermission(SEPARATE_PROFILE_CHALLENGE_KEY, userId); + checkDatabaseReadPermission(SEPARATE_PROFILE_CHALLENGE_KEY, userId); return getSeparateProfileChallengeEnabledInternal(userId); } @@ -1217,7 +1207,7 @@ public class LockSettingsService extends ILockSettings.Stub { @Override public boolean getBoolean(String key, boolean defaultValue, int userId) { - checkReadPermission(key, userId); + checkDatabaseReadPermission(key, userId); if (Settings.Secure.LOCK_PATTERN_ENABLED.equals(key)) { return getCredentialTypeInternal(userId) == CREDENTIAL_TYPE_PATTERN; } @@ -1226,13 +1216,13 @@ public class LockSettingsService extends ILockSettings.Stub { @Override public long getLong(String key, long defaultValue, int userId) { - checkReadPermission(key, userId); + checkDatabaseReadPermission(key, userId); return mStorage.getLong(key, defaultValue, userId); } @Override public String getString(String key, String defaultValue, int userId) { - checkReadPermission(key, userId); + checkDatabaseReadPermission(key, userId); return mStorage.getString(key, defaultValue, userId); } @@ -1729,8 +1719,7 @@ public class LockSettingsService extends ILockSettings.Stub { if (newCredential.isPattern()) { setBoolean(LockPatternUtils.PATTERN_EVER_CHOSEN_KEY, true, userHandle); } - if (DeviceConfig.getBoolean(NAMESPACE_AUTO_PIN_CONFIRMATION, - "enable_auto_pin_confirmation", /* defaultValue= */ false)) { + if (LockPatternUtils.isAutoPinConfirmFeatureAvailable()) { if (newCredential.isPin()) { setLong(LockPatternUtils.PIN_LENGTH, newCredential.size(), userHandle); } @@ -2568,20 +2557,6 @@ public class LockSettingsService extends ILockSettings.Stub { return mRecoverableKeyStoreManager.validateRemoteLockscreen(encryptedCredential, this); } - // Reading these settings needs the contacts permission - private static final String[] READ_CONTACTS_PROTECTED_SETTINGS = new String[] { - Secure.LOCK_SCREEN_OWNER_INFO_ENABLED, - Secure.LOCK_SCREEN_OWNER_INFO - }; - - // Reading these settings needs the same permission as checking the password - private static final String[] READ_PASSWORD_PROTECTED_SETTINGS = new String[] { - LockPatternUtils.LOCK_PASSWORD_SALT_KEY, - LockPatternUtils.PASSWORD_HISTORY_KEY, - LockPatternUtils.PASSWORD_TYPE_KEY, - SEPARATE_PROFILE_CHALLENGE_KEY - }; - private class GateKeeperDiedRecipient implements IBinder.DeathRecipient { @Override public void binderDied() { diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java index c21c945c3ced..dee26e382cec 100644 --- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java +++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java @@ -510,40 +510,35 @@ class SyntheticPasswordManager { return null; } - public synchronized void initWeaverService() { + private synchronized boolean isWeaverAvailable() { if (mWeaver != null) { - return; + return true; } + // Re-initialize weaver in case there was a transient error preventing access to it. IWeaver weaver = getWeaverService(); if (weaver == null) { - return; + return false; } - // Get the config - WeaverConfig weaverConfig = null; + final WeaverConfig weaverConfig; try { weaverConfig = weaver.getConfig(); } catch (RemoteException | ServiceSpecificException e) { Slog.e(TAG, "Failed to get weaver config", e); + return false; } if (weaverConfig == null || weaverConfig.slots <= 0) { - Slog.e(TAG, "Failed to initialize weaver config"); - return; + Slog.e(TAG, "Invalid weaver config"); + return false; } mWeaver = weaver; mWeaverConfig = weaverConfig; mPasswordSlotManager.refreshActiveSlots(getUsedWeaverSlots()); Slog.i(TAG, "Weaver service initialized"); - } - private synchronized boolean isWeaverAvailable() { - if (mWeaver == null) { - //Re-initializing weaver in case there was a transient error preventing access to it. - initWeaverService(); - } - return mWeaver != null && mWeaverConfig.slots > 0; + return true; } /** diff --git a/services/core/java/com/android/server/media/projection/TEST_MAPPING b/services/core/java/com/android/server/media/projection/TEST_MAPPING index a792498b8521..4324930ab2b0 100644 --- a/services/core/java/com/android/server/media/projection/TEST_MAPPING +++ b/services/core/java/com/android/server/media/projection/TEST_MAPPING @@ -13,6 +13,20 @@ "exclude-annotation": "org.junit.Ignore" } ] + }, + { + "name": "CtsMediaProjectionTestCases", + "options": [ + { + "exclude-annotation": "android.platform.test.annotations.FlakyTest" + }, + { + "exclude-annotation": "androidx.test.filters.FlakyTest" + }, + { + "exclude-annotation": "org.junit.Ignore" + } + ] } ] } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index ce921d695c49..cc0ecb841ff0 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -8037,6 +8037,13 @@ public class NotificationManagerService extends SystemService { } } } + + // Try to start flash notification event whenever an audible and non-suppressed + // notification is received + mAccessibilityManager.startFlashNotificationEvent(getContext(), + AccessibilityManager.FLASH_REASON_NOTIFICATION, + record.getSbn().getPackageName()); + } else if ((record.getFlags() & Notification.FLAG_INSISTENT) != 0) { hasValidSound = false; } diff --git a/services/core/java/com/android/server/notification/NotificationRecordLogger.java b/services/core/java/com/android/server/notification/NotificationRecordLogger.java index 4031c833f3c1..25d619dea296 100644 --- a/services/core/java/com/android/server/notification/NotificationRecordLogger.java +++ b/services/core/java/com/android/server/notification/NotificationRecordLogger.java @@ -473,4 +473,15 @@ public interface NotificationRecordLogger { } return (r.getSbn().getNotification().flags & Notification.FLAG_FOREGROUND_SERVICE) != 0; } + + /** + * @param r NotificationRecord + * @return Whether the notification is a non-dismissible notification. + */ + static boolean isNonDismissible(@NonNull NotificationRecord r) { + if (r.getSbn() == null || r.getSbn().getNotification() == null) { + return false; + } + return (r.getNotification().flags & Notification.FLAG_NO_DISMISS) != 0; + } } diff --git a/services/core/java/com/android/server/notification/NotificationRecordLoggerImpl.java b/services/core/java/com/android/server/notification/NotificationRecordLoggerImpl.java index 17c6c461d80c..9a1f19d0c514 100644 --- a/services/core/java/com/android/server/notification/NotificationRecordLoggerImpl.java +++ b/services/core/java/com/android/server/notification/NotificationRecordLoggerImpl.java @@ -86,7 +86,9 @@ public class NotificationRecordLoggerImpl implements NotificationRecordLogger { /* bool is_foreground_service = 23 */ NotificationRecordLogger.isForegroundService(p.r), /* optional int64 timeout_millis = 24 */ - p.r.getSbn().getNotification().getTimeoutAfter() + p.r.getSbn().getNotification().getTimeoutAfter(), + /* bool is_nondismissible = 25 */ + NotificationRecordLogger.isNonDismissible(p.r) ); } diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index c5bcddc06298..6b9be2545c73 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -1116,12 +1116,16 @@ public class LauncherAppsService extends SystemService { // Flag for bubble ActivityOptions options = ActivityOptions.fromBundle(startActivityOptions); - if (options != null && options.isApplyActivityFlagsForBubbles()) { - // Flag for bubble to make behaviour match documentLaunchMode=always. - intents[0].addFlags(FLAG_ACTIVITY_NEW_DOCUMENT); - intents[0].addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); + if (options != null) { + if (options.isApplyActivityFlagsForBubbles()) { + // Flag for bubble to make behaviour match documentLaunchMode=always. + intents[0].addFlags(FLAG_ACTIVITY_NEW_DOCUMENT); + intents[0].addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); + } + if (options.isApplyMultipleTaskFlagForShortcut()) { + intents[0].addFlags(FLAG_ACTIVITY_MULTIPLE_TASK); + } } - intents[0].addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intents[0].setSourceBounds(sourceBounds); diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 8beb0b65da4e..002585f2e7d6 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -3069,7 +3069,7 @@ class PackageManagerShellCommand extends ShellCommand { getOutPrintWriter().printf("Success: user %d is already being removed\n", userId); return 0; case UserManager.REMOVE_RESULT_ERROR_MAIN_USER_PERMANENT_ADMIN: - getOutPrintWriter().printf("Error: user %d is a permanent admin main user\n", + getErrPrintWriter().printf("Error: user %d is a permanent admin main user\n", userId); return 1; default: diff --git a/services/core/java/com/android/server/pm/PackageMetrics.java b/services/core/java/com/android/server/pm/PackageMetrics.java index d4c1256bd8f9..c4ad20e9676c 100644 --- a/services/core/java/com/android/server/pm/PackageMetrics.java +++ b/services/core/java/com/android/server/pm/PackageMetrics.java @@ -41,7 +41,7 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Stream; /** - * Metrics class for reporting stats to logging infrastructures like Westworld + * Metrics class for reporting stats to logging infrastructures like statsd */ final class PackageMetrics { public static final int STEP_PREPARE = 1; diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java index 59256d34a018..a3be8d35d4b9 100644 --- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java +++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java @@ -212,7 +212,7 @@ public class PackageInfoUtils { } } } - if ((flags & PackageManager.GET_ATTRIBUTIONS) != 0) { + if ((flags & PackageManager.GET_ATTRIBUTIONS_LONG) != 0) { int size = ArrayUtils.size(pkg.getAttributions()); if (size > 0) { info.attributions = new Attribution[size]; diff --git a/services/core/java/com/android/server/power/stats/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/power/stats/BatteryExternalStatsWorker.java index 2fbf3fbc6881..751f53526ab0 100644 --- a/services/core/java/com/android/server/power/stats/BatteryExternalStatsWorker.java +++ b/services/core/java/com/android/server/power/stats/BatteryExternalStatsWorker.java @@ -79,7 +79,12 @@ public class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStat private static final long MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS = 750; // Delay for clearing out battery stats for UIDs corresponding to a removed user - public static final int UID_REMOVAL_AFTER_USER_REMOVAL_DELAY_MILLIS = 10_000; + public static final int UID_QUICK_REMOVAL_AFTER_USER_REMOVAL_DELAY_MILLIS = 2_000; + + // Delay for the _final_ clean-up of battery stats after a user removal - just in case + // some UIDs took longer than UID_QUICK_REMOVAL_AFTER_USER_REMOVAL_DELAY_MILLIS to + // stop running. + public static final int UID_FINAL_REMOVAL_AFTER_USER_REMOVAL_DELAY_MILLIS = 10_000; private final ScheduledExecutorService mExecutorService = Executors.newSingleThreadScheduledExecutor( @@ -336,11 +341,20 @@ public class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStat @Override public Future<?> scheduleCleanupDueToRemovedUser(int userId) { synchronized (BatteryExternalStatsWorker.this) { + // Initial quick clean-up after a user removal + mExecutorService.schedule(() -> { + synchronized (mStats) { + mStats.clearRemovedUserUidsLocked(userId); + } + }, UID_QUICK_REMOVAL_AFTER_USER_REMOVAL_DELAY_MILLIS, TimeUnit.MILLISECONDS); + + // Final clean-up after a user removal, to take care of UIDs that were running longer + // than expected return mExecutorService.schedule(() -> { synchronized (mStats) { mStats.clearRemovedUserUidsLocked(userId); } - }, UID_REMOVAL_AFTER_USER_REMOVAL_DELAY_MILLIS, TimeUnit.MILLISECONDS); + }, UID_FINAL_REMOVAL_AFTER_USER_REMOVAL_DELAY_MILLIS, TimeUnit.MILLISECONDS); } } diff --git a/services/core/java/com/android/server/security/rkp/RemoteProvisioningRegistration.java b/services/core/java/com/android/server/security/rkp/RemoteProvisioningRegistration.java index 0e92709e25f6..2d3ede02a6a4 100644 --- a/services/core/java/com/android/server/security/rkp/RemoteProvisioningRegistration.java +++ b/services/core/java/com/android/server/security/rkp/RemoteProvisioningRegistration.java @@ -24,6 +24,7 @@ import android.security.rkp.IRegistration; import android.security.rkp.IStoreUpgradedKeyCallback; import android.security.rkp.service.RegistrationProxy; import android.security.rkp.service.RemotelyProvisionedKey; +import android.security.rkp.service.RkpProxyException; import android.util.Log; import java.util.Set; @@ -68,13 +69,35 @@ final class RemoteProvisioningRegistration extends IRegistration.Stub { if (e instanceof OperationCanceledException) { Log.i(TAG, "Operation cancelled for client " + mCallback.hashCode()); wrapCallback(mCallback::onCancel); + } else if (e instanceof RkpProxyException) { + Log.e(TAG, "RKP error fetching key for client " + mCallback.hashCode(), e); + RkpProxyException rkpException = (RkpProxyException) e; + wrapCallback(() -> mCallback.onError(toGetKeyError(rkpException), + e.getMessage())); } else { Log.e(TAG, "Error fetching key for client " + mCallback.hashCode(), e); - wrapCallback(() -> mCallback.onError(e.getMessage())); + wrapCallback(() -> mCallback.onError(IGetKeyCallback.ErrorCode.ERROR_UNKNOWN, + e.getMessage())); } } } + private byte toGetKeyError(RkpProxyException exception) { + switch (exception.getError()) { + case RkpProxyException.ERROR_UNKNOWN: + return IGetKeyCallback.ErrorCode.ERROR_UNKNOWN; + case RkpProxyException.ERROR_REQUIRES_SECURITY_PATCH: + return IGetKeyCallback.ErrorCode.ERROR_REQUIRES_SECURITY_PATCH; + case RkpProxyException.ERROR_PENDING_INTERNET_CONNECTIVITY: + return IGetKeyCallback.ErrorCode.ERROR_PENDING_INTERNET_CONNECTIVITY; + case RkpProxyException.ERROR_PERMANENT: + return IGetKeyCallback.ErrorCode.ERROR_PERMANENT; + default: + Log.e(TAG, "Unexpected error code in RkpProxyException", exception); + return IGetKeyCallback.ErrorCode.ERROR_UNKNOWN; + } + } + RemoteProvisioningRegistration(RegistrationProxy registration, Executor executor) { mRegistration = registration; mExecutor = executor; @@ -97,7 +120,8 @@ final class RemoteProvisioningRegistration extends IRegistration.Stub { } catch (Exception e) { Log.e(TAG, "getKeyAsync threw an exception for client " + callback.hashCode(), e); mGetKeyOperations.remove(callback); - wrapCallback(() -> callback.onError(e.getMessage())); + wrapCallback(() -> callback.onError(IGetKeyCallback.ErrorCode.ERROR_UNKNOWN, + e.getMessage())); } } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index 5521384bb169..ec052ecd20f2 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -21,7 +21,6 @@ import android.app.ITransientNotificationCallback; import android.hardware.fingerprint.IUdfpsRefreshRateRequestCallback; import android.os.Bundle; import android.os.IBinder; -import android.view.InsetsState.InternalInsetsType; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowInsetsController.Appearance; import android.view.WindowInsetsController.Behavior; @@ -162,11 +161,10 @@ public interface StatusBarManagerInternal { LetterboxDetails[] letterboxDetails); /** @see com.android.internal.statusbar.IStatusBar#showTransient */ - void showTransient(int displayId, @InternalInsetsType int[] types, - boolean isGestureOnSystemBar); + void showTransient(int displayId, @InsetsType int types, boolean isGestureOnSystemBar); /** @see com.android.internal.statusbar.IStatusBar#abortTransient */ - void abortTransient(int displayId, @InternalInsetsType int[] types); + void abortTransient(int displayId, @InsetsType int types); /** * @see com.android.internal.statusbar.IStatusBar#showToast(String, IBinder, CharSequence, diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 83f4805aca58..4489ba94235c 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -79,12 +79,10 @@ import android.service.notification.NotificationStats; import android.service.quicksettings.TileService; import android.text.TextUtils; import android.util.ArrayMap; -import android.util.ArraySet; import android.util.IndentingPrintWriter; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; -import android.view.InsetsState.InternalInsetsType; import android.view.WindowInsets; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowInsetsController.Appearance; @@ -645,7 +643,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } @Override - public void showTransient(int displayId, @InternalInsetsType int[] types, + public void showTransient(int displayId, @InsetsType int types, boolean isGestureOnSystemBar) { getUiState(displayId).showTransient(types); if (mBar != null) { @@ -656,7 +654,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } @Override - public void abortTransient(int displayId, @InternalInsetsType int[] types) { + public void abortTransient(int displayId, @InsetsType int types) { getUiState(displayId).clearTransient(types); if (mBar != null) { try { @@ -1258,7 +1256,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D private static class UiState { private @Appearance int mAppearance = 0; private AppearanceRegion[] mAppearanceRegions = new AppearanceRegion[0]; - private final ArraySet<Integer> mTransientBarTypes = new ArraySet<>(); + private @InsetsType int mTransientBarTypes; private boolean mNavbarColorManagedByIme = false; private @Behavior int mBehavior; private @InsetsType int mRequestedVisibleTypes = WindowInsets.Type.defaultVisible(); @@ -1285,16 +1283,12 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D mLetterboxDetails = letterboxDetails; } - private void showTransient(@InternalInsetsType int[] types) { - for (int type : types) { - mTransientBarTypes.add(type); - } + private void showTransient(@InsetsType int types) { + mTransientBarTypes |= types; } - private void clearTransient(@InternalInsetsType int[] types) { - for (int type : types) { - mTransientBarTypes.remove(type); - } + private void clearTransient(@InsetsType int types) { + mTransientBarTypes &= ~types; } private int getDisabled1() { @@ -1410,16 +1404,12 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D // TODO(b/118592525): Currently, status bar only works on the default display. // Make it aware of multi-display if needed. final UiState state = mDisplayUiState.get(DEFAULT_DISPLAY); - final int[] transientBarTypes = new int[state.mTransientBarTypes.size()]; - for (int i = 0; i < transientBarTypes.length; i++) { - transientBarTypes[i] = state.mTransientBarTypes.valueAt(i); - } return new RegisterStatusBarResult(icons, gatherDisableActionsLocked(mCurrentUserId, 1), state.mAppearance, state.mAppearanceRegions, state.mImeWindowVis, state.mImeBackDisposition, state.mShowImeSwitcher, gatherDisableActionsLocked(mCurrentUserId, 2), state.mImeToken, state.mNavbarColorManagedByIme, state.mBehavior, state.mRequestedVisibleTypes, - state.mPackageName, transientBarTypes, state.mLetterboxDetails); + state.mPackageName, state.mTransientBarTypes, state.mLetterboxDetails); } } diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java index 65127e4a3b31..8ce8c46d1939 100644 --- a/services/core/java/com/android/server/wm/AccessibilityController.java +++ b/services/core/java/com/android/server/wm/AccessibilityController.java @@ -342,6 +342,18 @@ final class AccessibilityController { // Not relevant for the window observer. } + void onWMTransition(int displayId, @WindowManager.TransitionType int type) { + if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) { + mAccessibilityTracing.logTrace(TAG + ".onAppWindowTransition", + FLAGS_MAGNIFICATION_CALLBACK, "displayId=" + displayId + "; type=" + type); + } + final DisplayMagnifier displayMagnifier = mDisplayMagnifiers.get(displayId); + if (displayMagnifier != null) { + displayMagnifier.onWMTransition(displayId, type); + } + // Not relevant for the window observer. + } + void onWindowTransition(WindowState windowState, int transition) { if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK | FLAGS_WINDOWS_FOR_ACCESSIBILITY_CALLBACK)) { @@ -708,6 +720,28 @@ final class AccessibilityController { } } + void onWMTransition(int displayId, @WindowManager.TransitionType int type) { + if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) { + mAccessibilityTracing.logTrace(LOG_TAG + ".onWMTransition", + FLAGS_MAGNIFICATION_CALLBACK, "displayId=" + displayId + "; type=" + type); + } + if (DEBUG_WINDOW_TRANSITIONS) { + Slog.i(LOG_TAG, "Window transition: " + WindowManager.transitTypeToString(type) + + " displayId: " + displayId); + } + final boolean magnifying = mMagnifedViewport.isMagnifying(); + if (magnifying) { + // All opening/closing situations. + switch (type) { + case WindowManager.TRANSIT_OPEN: + case WindowManager.TRANSIT_TO_FRONT: + case WindowManager.TRANSIT_CLOSE: + case WindowManager.TRANSIT_TO_BACK: + mHandler.sendEmptyMessage(MyHandler.MESSAGE_NOTIFY_USER_CONTEXT_CHANGED); + } + } + } + void onWindowTransition(WindowState windowState, int transition) { if (mAccessibilityTracing.isTracingEnabled(FLAGS_MAGNIFICATION_CALLBACK)) { mAccessibilityTracing.logTrace(LOG_TAG + ".onWindowTransition", diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 50eb356a0b37..c37a3d7f43ee 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1033,10 +1033,33 @@ class ActivityStarter { return err; } - boolean abort = !mSupervisor.checkStartAnyActivityPermission(intent, aInfo, resultWho, - requestCode, callingPid, callingUid, callingPackage, callingFeatureId, - request.ignoreTargetSecurity, inTask != null, callerApp, resultRecord, - resultRootTask); + boolean abort; + try { + abort = !mSupervisor.checkStartAnyActivityPermission(intent, aInfo, resultWho, + requestCode, callingPid, callingUid, callingPackage, callingFeatureId, + request.ignoreTargetSecurity, inTask != null, callerApp, resultRecord, + resultRootTask); + } catch (SecurityException e) { + // Return activity not found for the explicit intent if the caller can't see the target + // to prevent the disclosure of package existence. + final Intent originalIntent = request.ephemeralIntent; + if (originalIntent != null && (originalIntent.getComponent() != null + || originalIntent.getPackage() != null)) { + final String targetPackageName = originalIntent.getComponent() != null + ? originalIntent.getComponent().getPackageName() + : originalIntent.getPackage(); + if (mService.getPackageManagerInternalLocked() + .filterAppAccess(targetPackageName, callingUid, userId)) { + if (resultRecord != null) { + resultRecord.sendResult(INVALID_UID, resultWho, requestCode, + RESULT_CANCELED, null /* data */, null /* dataGrants */); + } + SafeActivityOptions.abort(options); + return ActivityManager.START_CLASS_NOT_FOUND; + } + } + throw e; + } abort |= !mService.mIntentFirewall.checkStartActivity(intent, callingUid, callingPid, resolvedType, aInfo.applicationInfo); abort |= !mService.getPermissionPolicyInternal().checkStartActivity(intent, callingUid, diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 80f660e1eed9..e8a0386a5c62 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -1027,7 +1027,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { synchronized (mGlobalLock) { mWindowManager = wm; mRootWindowContainer = wm.mRoot; - mWindowOrganizerController.setWindowManager(wm); + mWindowOrganizerController.mTransitionController.setWindowManager(wm); mTempConfig.setToDefaults(); mTempConfig.setLocales(LocaleList.getDefault()); mConfigurationSeq = mTempConfig.seq = 1; diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java index cc71155dc88d..bc5f67bb50d0 100644 --- a/services/core/java/com/android/server/wm/BackNavigationController.java +++ b/services/core/java/com/android/server/wm/BackNavigationController.java @@ -19,7 +19,6 @@ package com.android.server.wm; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.view.RemoteAnimationTarget.MODE_CLOSING; import static android.view.RemoteAnimationTarget.MODE_OPENING; -import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_TO_BACK; @@ -28,12 +27,12 @@ import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_BACK_PREVIEW; import static com.android.server.wm.BackNavigationProto.ANIMATION_IN_PROGRESS; import static com.android.server.wm.BackNavigationProto.LAST_BACK_TYPE; import static com.android.server.wm.BackNavigationProto.SHOW_WALLPAPER; +import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_PREDICT_BACK; import android.annotation.NonNull; import android.annotation.Nullable; import android.graphics.Point; import android.graphics.Rect; -import android.hardware.HardwareBuffer; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteCallback; @@ -45,6 +44,7 @@ import android.util.proto.ProtoOutputStream; import android.view.IWindowFocusObserver; import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; +import android.view.WindowInsets; import android.window.BackAnimationAdapter; import android.window.BackNavigationInfo; import android.window.IBackAnimationFinishedCallback; @@ -54,8 +54,11 @@ import android.window.TaskSnapshot; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.common.ProtoLog; import com.android.server.LocalServices; +import com.android.server.wm.utils.InsetUtils; +import java.io.PrintWriter; import java.util.ArrayList; +import java.util.function.Consumer; /** * Controller to handle actions related to the back gesture on the server side. @@ -69,7 +72,7 @@ class BackNavigationController { private boolean mShowWallpaper; private Runnable mPendingAnimation; - private final AnimationTargets mAnimationTargets = new AnimationTargets(); + private AnimationHandler mAnimationHandler; private final ArrayList<WindowContainer> mTmpOpenApps = new ArrayList<>(); private final ArrayList<WindowContainer> mTmpCloseApps = new ArrayList<>(); @@ -233,7 +236,6 @@ class BackNavigationController { return infoBuilder.build(); } - mBackAnimationInProgress = true; // We don't have an application callback, let's find the destination of the back gesture // The search logic should align with ActivityClientController#finishActivity prevActivity = currentTask.topRunningActivity(currentActivity.token, INVALID_TASK_ID); @@ -314,8 +316,17 @@ class BackNavigationController { } if (prepareAnimation) { - prepareAnimationIfNeeded(currentTask, prevTask, prevActivity, - removedWindowContainer, backType, adapter); + mPendingAnimation = mAnimationHandler.scheduleAnimation(backType, adapter, + currentTask, prevTask, currentActivity, prevActivity); + prepareAnimation = mPendingAnimation != null; + mBackAnimationInProgress = prepareAnimation; + if (prepareAnimation) { + mWindowManagerService.mWindowPlacerLocked.requestTraversal(); + if (mShowWallpaper) { + currentTask.getDisplayContent().mWallpaperController + .adjustWallpaperWindows(); + } + } } infoBuilder.setPrepareRemoteAnimation(prepareAnimation); } // Release wm Lock @@ -333,7 +344,7 @@ class BackNavigationController { } boolean isWaitBackTransition() { - return mAnimationTargets.mComposed && mAnimationTargets.mWaitTransition; + return mAnimationHandler.mComposed && mAnimationHandler.mWaitTransition; } boolean isKeyguardOccluded(WindowState focusWindow) { @@ -359,18 +370,19 @@ class BackNavigationController { boolean result = false; // Note: TmpOpenApps is empty. Unlike shell transition, the open apps will be removed from // mOpeningApps if there is no visibility change. - if (mAnimationTargets.containsBackAnimationTargets(mTmpOpenApps, mTmpCloseApps)) { + if (mAnimationHandler.containsBackAnimationTargets(mTmpOpenApps, mTmpCloseApps)) { // remove close target from close list, open target from open list; // but the open target can be in close list. for (int i = openApps.size() - 1; i >= 0; --i) { final ActivityRecord ar = openApps.valueAt(i); - if (mAnimationTargets.isTarget(ar, true /* open */)) { + if (mAnimationHandler.isTarget(ar, true /* open */)) { openApps.removeAt(i); + mAnimationHandler.mOpenTransitionTargetMatch = true; } } for (int i = closeApps.size() - 1; i >= 0; --i) { final ActivityRecord ar = closeApps.valueAt(i); - if (mAnimationTargets.isTarget(ar, false /* open */)) { + if (mAnimationHandler.isTarget(ar, false /* open */)) { closeApps.removeAt(i); } } @@ -391,7 +403,7 @@ class BackNavigationController { * animations, and shouldn't join next transition. */ boolean containsBackAnimationTargets(Transition transition) { - if (!mAnimationTargets.mComposed + if (!mAnimationHandler.mComposed || (transition.mType != TRANSIT_CLOSE && transition.mType != TRANSIT_TO_BACK)) { return false; } @@ -408,18 +420,22 @@ class BackNavigationController { mTmpCloseApps.add(wc); } } - final boolean result = mAnimationTargets.containsBackAnimationTargets( + final boolean result = mAnimationHandler.containsBackAnimationTargets( mTmpOpenApps, mTmpCloseApps); + if (result) { + mAnimationHandler.mOpenTransitionTargetMatch = + mAnimationHandler.containTarget(mTmpOpenApps, true); + } mTmpOpenApps.clear(); mTmpCloseApps.clear(); return result; } boolean isMonitorTransitionTarget(WindowContainer wc) { - if (!mAnimationTargets.mComposed || !mAnimationTargets.mWaitTransition) { + if (!mAnimationHandler.mComposed || !mAnimationHandler.mWaitTransition) { return false; } - return mAnimationTargets.isTarget(wc, wc.isVisibleRequested() /* open */); + return mAnimationHandler.isTarget(wc, wc.isVisibleRequested() /* open */); } /** @@ -428,60 +444,106 @@ class BackNavigationController { * cleanup together. */ void clearBackAnimations(SurfaceControl.Transaction cleanupTransaction) { - mAnimationTargets.clearBackAnimateTarget(cleanupTransaction); + mAnimationHandler.clearBackAnimateTarget(cleanupTransaction); } /** - * TODO: Animation composer - * prepareAnimationIfNeeded will become too complicated in order to support - * ActivityRecord/WindowState, using a factory class to create the RemoteAnimationTargets for - * different scenario. + * Create and handling animations status for an open/close animation targets. */ - private static class AnimationTargets { - ActivityRecord mCloseTarget; // Must be activity - WindowContainer mOpenTarget; // Can be activity or task if activity was removed + private static class AnimationHandler { + private final WindowManagerService mWindowManagerService; + private BackWindowAnimationAdaptor mCloseAdaptor; + private BackWindowAnimationAdaptor mOpenAdaptor; private boolean mComposed; private boolean mWaitTransition; private int mSwitchType = UNKNOWN; private SurfaceControl.Transaction mFinishedTransaction; - + // This will be set before transition happen, to know whether the real opening target + // exactly match animating target. When target match, reparent the starting surface to + // the opening target like starting window do. + private boolean mOpenTransitionTargetMatch; + // The starting surface task Id. Used to clear the starting surface if the animation has + // request one during animating. + private int mRequestedStartingSurfaceTaskId; + private SurfaceControl mStartingSurface; + + AnimationHandler(WindowManagerService wms) { + mWindowManagerService = wms; + } private static final int UNKNOWN = 0; private static final int TASK_SWITCH = 1; private static final int ACTIVITY_SWITCH = 2; - void reset(@NonNull WindowContainer close, @NonNull WindowContainer open) { - clearBackAnimateTarget(null); - if (close == null || open == null) { - Slog.e(TAG, "reset animation with null target close: " - + close + " open: " + open); - return; - } + private void initiate(WindowContainer close, WindowContainer open) { + WindowContainer closeTarget; if (close.asActivityRecord() != null && open.asActivityRecord() != null && (close.asActivityRecord().getTask() == open.asActivityRecord().getTask())) { mSwitchType = ACTIVITY_SWITCH; - mCloseTarget = close.asActivityRecord(); + closeTarget = close.asActivityRecord(); } else if (close.asTask() != null && open.asTask() != null && close.asTask() != open.asTask()) { mSwitchType = TASK_SWITCH; - mCloseTarget = close.asTask().getTopNonFinishingActivity(); + closeTarget = close.asTask().getTopNonFinishingActivity(); } else { mSwitchType = UNKNOWN; return; } - mOpenTarget = open; - mComposed = false; - mWaitTransition = false; + mCloseAdaptor = createAdaptor(closeTarget, false /* isOpen */); + mOpenAdaptor = createAdaptor(open, true /* isOpen */); + + if (mCloseAdaptor.mAnimationTarget == null || mOpenAdaptor.mAnimationTarget == null) { + Slog.w(TAG, "composeNewAnimations fail, skip"); + clearBackAnimateTarget(null /* cleanupTransaction */); + } } - void composeNewAnimations(@NonNull WindowContainer close, @NonNull WindowContainer open) { - reset(close, open); - if (mSwitchType == UNKNOWN || mComposed || mCloseTarget == mOpenTarget - || mCloseTarget == null || mOpenTarget == null) { - return; + boolean composeAnimations(@NonNull WindowContainer close, @NonNull WindowContainer open) { + clearBackAnimateTarget(null /* cleanupTransaction */); + if (close == null || open == null) { + Slog.e(TAG, "reset animation with null target close: " + + close + " open: " + open); + return false; + } + initiate(close, open); + if (mSwitchType == UNKNOWN) { + return false; } mComposed = true; mWaitTransition = false; + return true; + } + + RemoteAnimationTarget[] getAnimationTargets() { + return mComposed ? new RemoteAnimationTarget[] { + mCloseAdaptor.mAnimationTarget, mOpenAdaptor.mAnimationTarget} : null; + } + + boolean isSupportWindowlessSurface() { + return mWindowManagerService.mAtmService.mTaskOrganizerController + .isSupportWindowlessStartingSurface(); + } + + void createStartingSurface(TaskSnapshot snapshot) { + if (!mComposed) { + return; + } + + final ActivityRecord topActivity = getTopOpenActivity(); + if (topActivity == null) { + Slog.e(TAG, "createStartingSurface fail, no open activity: " + this); + return; + } + // TODO (b/257857570) draw snapshot by starting surface. + } + + private ActivityRecord getTopOpenActivity() { + if (mSwitchType == ACTIVITY_SWITCH) { + return mOpenAdaptor.mTarget.asActivityRecord(); + } else if (mSwitchType == TASK_SWITCH) { + return mOpenAdaptor.mTarget.asTask().getTopNonFinishingActivity(); + } + return null; } boolean containTarget(ArrayList<WindowContainer> wcs, boolean open) { @@ -495,13 +557,13 @@ class BackNavigationController { boolean isTarget(WindowContainer wc, boolean open) { if (open) { - return wc == mOpenTarget || mOpenTarget.hasChild(wc); + return wc == mOpenAdaptor.mTarget || mOpenAdaptor.mTarget.hasChild(wc); } if (mSwitchType == TASK_SWITCH) { - return wc == mCloseTarget - || (wc.asTask() != null && wc.hasChild(mCloseTarget)); + return wc == mCloseAdaptor.mTarget + || (wc.asTask() != null && wc.hasChild(mCloseAdaptor.mTarget)); } else if (mSwitchType == ACTIVITY_SWITCH) { - return wc == mCloseTarget; + return wc == mCloseAdaptor.mTarget; } return false; } @@ -519,19 +581,53 @@ class BackNavigationController { return; } final SurfaceControl.Transaction pt = t != null ? t - : mOpenTarget.getPendingTransaction(); + : mOpenAdaptor.mTarget.getPendingTransaction(); if (mFinishedTransaction != null) { pt.merge(mFinishedTransaction); mFinishedTransaction = null; } + cleanUpWindowlessSurface(); + + if (mCloseAdaptor != null) { + mCloseAdaptor.mTarget.cancelAnimation(); + mCloseAdaptor = null; + } + if (mOpenAdaptor != null) { + mOpenAdaptor.mTarget.cancelAnimation(); + mOpenAdaptor = null; + } + } + + private void cleanUpWindowlessSurface() { + final ActivityRecord ar = getTopOpenActivity(); + if (ar == null) { + Slog.w(TAG, "finishPresentAnimations without top activity: " + this); + } + final SurfaceControl.Transaction pendingT = ar != null ? ar.getPendingTransaction() + : mOpenAdaptor.mTarget.getPendingTransaction(); + // ensure open target is visible before cancel animation. + mOpenTransitionTargetMatch &= ar != null; + if (mOpenTransitionTargetMatch) { + pendingT.show(ar.getSurfaceControl()); + } + if (mRequestedStartingSurfaceTaskId != 0) { + // If open target match, reparent to open activity + if (mStartingSurface != null && mOpenTransitionTargetMatch) { + pendingT.reparent(mStartingSurface, ar.getSurfaceControl()); + } + // remove starting surface. + mStartingSurface = null; + // TODO (b/257857570) draw snapshot by starting surface. + mRequestedStartingSurfaceTaskId = 0; + } } void clearBackAnimateTarget(SurfaceControl.Transaction cleanupTransaction) { finishPresentAnimations(cleanupTransaction); - mCloseTarget = null; - mOpenTarget = null; mComposed = false; mWaitTransition = false; + mOpenTransitionTargetMatch = false; + mRequestedStartingSurfaceTaskId = 0; mSwitchType = UNKNOWN; if (mFinishedTransaction != null) { Slog.w(TAG, "Clear back animation, found un-processed finished transaction"); @@ -555,211 +651,284 @@ class BackNavigationController { @Override public String toString() { - final StringBuilder sb = new StringBuilder(128); - sb.append("AnimationTargets{"); - sb.append(" mOpenTarget= "); - sb.append(mOpenTarget); - sb.append(" mCloseTarget= "); - sb.append(mCloseTarget); - sb.append(" mSwitchType= "); - sb.append(mSwitchType); - sb.append(" mComposed= "); - sb.append(mComposed); - sb.append(" mWaitTransition= "); - sb.append(mWaitTransition); - sb.append('}'); - return sb.toString(); + return "AnimationTargets{" + + " openTarget= " + + mOpenAdaptor.mTarget + + " closeTarget= " + + mCloseAdaptor.mTarget + + " mSwitchType= " + + mSwitchType + + " mComposed= " + + mComposed + + " mWaitTransition= " + + mWaitTransition + + '}'; + } + + private static BackWindowAnimationAdaptor createAdaptor( + WindowContainer target, boolean isOpen) { + final BackWindowAnimationAdaptor adaptor = + new BackWindowAnimationAdaptor(target, isOpen); + target.startAnimation(target.getPendingTransaction(), adaptor, false /* hidden */, + ANIMATION_TYPE_PREDICT_BACK); + return adaptor; + } + + private static class BackWindowAnimationAdaptor implements AnimationAdapter { + SurfaceControl mCapturedLeash; + private final Rect mBounds = new Rect(); + private final WindowContainer mTarget; + private final boolean mIsOpen; + private RemoteAnimationTarget mAnimationTarget; + + BackWindowAnimationAdaptor(WindowContainer closeTarget, boolean isOpen) { + mBounds.set(closeTarget.getBounds()); + mTarget = closeTarget; + mIsOpen = isOpen; + } + @Override + public boolean getShowWallpaper() { + return false; + } + + @Override + public void startAnimation(SurfaceControl animationLeash, SurfaceControl.Transaction t, + int type, SurfaceAnimator.OnAnimationFinishedCallback finishCallback) { + mCapturedLeash = animationLeash; + createRemoteAnimationTarget(mIsOpen); + } + + @Override + public void onAnimationCancelled(SurfaceControl animationLeash) { + if (mCapturedLeash == animationLeash) { + mCapturedLeash = null; + } + } + + @Override + public long getDurationHint() { + return 0; + } + + @Override + public long getStatusBarTransitionsStartTime() { + return 0; + } + + @Override + public void dump(PrintWriter pw, String prefix) { + pw.print(prefix + "BackWindowAnimationAdaptor mCapturedLeash="); + pw.print(mCapturedLeash); + pw.println(); + } + + @Override + public void dumpDebug(ProtoOutputStream proto) { + + } + + RemoteAnimationTarget createRemoteAnimationTarget(boolean isOpen) { + if (mAnimationTarget != null) { + return mAnimationTarget; + } + Task t = mTarget.asTask(); + final ActivityRecord r = t != null ? t.getTopNonFinishingActivity() + : mTarget.asActivityRecord(); + if (t == null && r != null) { + t = r.getTask(); + } + if (t == null || r == null) { + Slog.e(TAG, "createRemoteAnimationTarget fail " + mTarget); + return null; + } + final WindowState mainWindow = r.findMainWindow(); + Rect insets; + if (mainWindow != null) { + insets = mainWindow.getInsetsStateWithVisibilityOverride().calculateInsets( + mBounds, WindowInsets.Type.systemBars(), + false /* ignoreVisibility */).toRect(); + InsetUtils.addInsets(insets, mainWindow.mActivityRecord.getLetterboxInsets()); + } else { + insets = new Rect(); + } + final int mode = isOpen ? MODE_OPENING : MODE_CLOSING; + mAnimationTarget = new RemoteAnimationTarget(t.mTaskId, mode, mCapturedLeash, + !r.fillsParent(), new Rect(), + insets, r.getPrefixOrderIndex(), new Point(mBounds.left, mBounds.top), + mBounds, mBounds, t.getWindowConfiguration(), + true /* isNotInRecents */, null, null, t.getTaskInfo(), + r.checkEnterPictureInPictureAppOpsState()); + return mAnimationTarget; + } } - } - private void prepareAnimationIfNeeded(Task currentTask, - Task prevTask, ActivityRecord prevActivity, WindowContainer<?> removedWindowContainer, - int backType, BackAnimationAdapter adapter) { - final ArrayList<SurfaceControl> leashes = new ArrayList<>(); - final SurfaceControl.Transaction startedTransaction = currentTask.getPendingTransaction(); - final SurfaceControl.Transaction finishedTransaction = new SurfaceControl.Transaction(); - // Prepare a leash to animate for the departing window - final SurfaceControl animLeash = currentTask.makeAnimationLeash() - .setName("BackPreview Leash for " + currentTask) - .setHidden(false) - .build(); - removedWindowContainer.reparentSurfaceControl(startedTransaction, animLeash); - - final RemoteAnimationTarget topAppTarget = createRemoteAnimationTargetLocked( - currentTask, animLeash, MODE_CLOSING); - - // reset leash after animation finished. - leashes.add(animLeash); - removedWindowContainer.reparentSurfaceControl(finishedTransaction, - removedWindowContainer.getParentSurfaceControl()); - - // Prepare a leash to animate for the entering window. - RemoteAnimationTarget behindAppTarget = null; - if (needsScreenshot(backType)) { - HardwareBuffer screenshotBuffer = null; - Task backTargetTask = prevTask; - switch(backType) { - case BackNavigationInfo.TYPE_CROSS_TASK: - int prevTaskId = prevTask != null ? prevTask.mTaskId : 0; - int prevUserId = prevTask != null ? prevTask.mUserId : 0; - screenshotBuffer = getTaskSnapshot(prevTaskId, prevUserId); - break; + Runnable scheduleAnimation(int backType, BackAnimationAdapter adapter, + Task currentTask, Task previousTask, ActivityRecord currentActivity, + ActivityRecord previousActivity) { + switch (backType) { + case BackNavigationInfo.TYPE_RETURN_TO_HOME: + return new ScheduleAnimationBuilder(backType, adapter) + .setIsLaunchBehind(true) + .setComposeTarget(currentTask, previousTask) + .build(); case BackNavigationInfo.TYPE_CROSS_ACTIVITY: - if (prevActivity != null && prevActivity.mActivityComponent != null) { - screenshotBuffer = getActivitySnapshot(currentTask, prevActivity); + return new ScheduleAnimationBuilder(backType, adapter) + .setComposeTarget(currentActivity, previousActivity) + .setOpeningSnapshot(getActivitySnapshot(previousActivity)).build(); + case BackNavigationInfo.TYPE_CROSS_TASK: + return new ScheduleAnimationBuilder(backType, adapter) + .setComposeTarget(currentTask, previousTask) + .setOpeningSnapshot(getTaskSnapshot(previousTask)).build(); + } + return null; + } + + private class ScheduleAnimationBuilder { + final int mType; + final BackAnimationAdapter mBackAnimationAdapter; + WindowContainer mCloseTarget; + WindowContainer mOpenTarget; + TaskSnapshot mOpenSnapshot; + boolean mIsLaunchBehind; + + ScheduleAnimationBuilder(int type, BackAnimationAdapter backAnimationAdapter) { + mType = type; + mBackAnimationAdapter = backAnimationAdapter; + } + + ScheduleAnimationBuilder setComposeTarget(WindowContainer close, WindowContainer open) { + mCloseTarget = close; + mOpenTarget = open; + return this; + } + + ScheduleAnimationBuilder setOpeningSnapshot(TaskSnapshot snapshot) { + mOpenSnapshot = snapshot; + return this; + } + + ScheduleAnimationBuilder setIsLaunchBehind(boolean launchBehind) { + mIsLaunchBehind = launchBehind; + return this; + } + + Runnable build() { + if (mOpenTarget == null || mCloseTarget == null) { + return null; + } + final boolean shouldLaunchBehind = mIsLaunchBehind || !isSupportWindowlessSurface(); + final ActivityRecord launchBehindActivity = !shouldLaunchBehind ? null + : mOpenTarget.asTask() != null + ? mOpenTarget.asTask().getTopNonFinishingActivity() + : mOpenTarget.asActivityRecord() != null + ? mOpenTarget.asActivityRecord() : null; + if (shouldLaunchBehind && launchBehindActivity == null) { + Slog.e(TAG, "No opening activity"); + return null; + } + + if (!composeAnimations(mCloseTarget, mOpenTarget)) { + return null; + } + if (launchBehindActivity != null) { + setLaunchBehind(launchBehindActivity); + } else { + createStartingSurface(mOpenSnapshot); + } + + final IBackAnimationFinishedCallback callback = makeAnimationFinishedCallback( + launchBehindActivity != null ? triggerBack -> { + if (!triggerBack) { + restoreLaunchBehind(launchBehindActivity); + } + } : null, + mCloseTarget); + final RemoteAnimationTarget[] targets = getAnimationTargets(); + + return () -> { + try { + mBackAnimationAdapter.getRunner().onAnimationStart(mType, + targets, null, null, callback); + } catch (RemoteException e) { + e.printStackTrace(); } - backTargetTask = currentTask; - break; - } - - // Find a screenshot of the previous activity if we actually have an animation - SurfaceControl animationLeashParent = removedWindowContainer.getAnimationLeashParent(); - if (screenshotBuffer != null) { - final SurfaceControl screenshotSurface = new SurfaceControl.Builder() - .setName("BackPreview Screenshot for " + prevActivity) - .setHidden(false) - .setParent(animationLeashParent) - .setBLASTLayer() - .build(); - startedTransaction.setBuffer(screenshotSurface, screenshotBuffer); - - // The Animation leash needs to be above the screenshot surface, but the animation - // leash needs to be added before to be in the synchronized block. - startedTransaction.setLayer(topAppTarget.leash, 1); - - behindAppTarget = - createRemoteAnimationTargetLocked( - backTargetTask, screenshotSurface, MODE_OPENING); - - // reset leash after animation finished. - leashes.add(screenshotSurface); - } - } else if (prevTask != null && prevActivity != null) { - // Make previous task show from behind by marking its top activity as visible - // and launch-behind to bump its visibility for the duration of the back gesture. - setLaunchBehind(prevActivity); - - final SurfaceControl leash = prevActivity.makeAnimationLeash() - .setName("BackPreview Leash for " + prevActivity) - .setHidden(false) - .build(); - prevActivity.reparentSurfaceControl(startedTransaction, leash); - behindAppTarget = createRemoteAnimationTargetLocked( - prevTask, leash, MODE_OPENING); - - // reset leash after animation finished. - leashes.add(leash); - prevActivity.reparentSurfaceControl(finishedTransaction, - prevActivity.getParentSurfaceControl()); - } - - if (mShowWallpaper) { - currentTask.getDisplayContent().mWallpaperController.adjustWallpaperWindows(); - // TODO(b/241808055): If the current animation need to show wallpaper and animate the - // wallpaper, start the wallpaper animation to collect wallpaper target and deliver it - // to the back animation controller. - } - - final RemoteAnimationTarget[] targets = (behindAppTarget == null) - ? new RemoteAnimationTarget[] {topAppTarget} - : new RemoteAnimationTarget[] {topAppTarget, behindAppTarget}; - - final ActivityRecord finalPrevActivity = prevActivity; - final IBackAnimationFinishedCallback callback = - new IBackAnimationFinishedCallback.Stub() { + }; + } + + private IBackAnimationFinishedCallback makeAnimationFinishedCallback( + Consumer<Boolean> b, WindowContainer closeTarget) { + return new IBackAnimationFinishedCallback.Stub() { @Override public void onAnimationFinished(boolean triggerBack) { - for (SurfaceControl sc: leashes) { - finishedTransaction.remove(sc); - } + final SurfaceControl.Transaction finishedTransaction = + new SurfaceControl.Transaction(); synchronized (mWindowManagerService.mGlobalLock) { + if (b != null) { + b.accept(triggerBack); + } if (triggerBack) { final SurfaceControl surfaceControl = - removedWindowContainer.getSurfaceControl(); + closeTarget.getSurfaceControl(); if (surfaceControl != null && surfaceControl.isValid()) { - // The animation is finish and start waiting for transition, - // hide the task surface before it re-parented to avoid flicker. + // Hide the close target surface when transition start. finishedTransaction.hide(surfaceControl); } - } else if (!needsScreenshot(backType)) { - restoreLaunchBehind(finalPrevActivity); } - if (!mAnimationTargets.setFinishTransaction(finishedTransaction)) { + if (!setFinishTransaction(finishedTransaction)) { finishedTransaction.apply(); } if (!triggerBack) { - mAnimationTargets.clearBackAnimateTarget(null); + clearBackAnimateTarget( + null /* cleanupTransaction */); } else { - mAnimationTargets.mWaitTransition = true; + mWaitTransition = true; } } // TODO Add timeout monitor if transition didn't happen } }; - if (backType == BackNavigationInfo.TYPE_CROSS_ACTIVITY) { - mAnimationTargets.composeNewAnimations(removedWindowContainer, prevActivity); - } else if (backType == BackNavigationInfo.TYPE_RETURN_TO_HOME - || backType == BackNavigationInfo.TYPE_CROSS_TASK) { - mAnimationTargets.composeNewAnimations(removedWindowContainer, prevTask); - } - scheduleAnimationLocked(backType, targets, adapter, callback); - } + } - @NonNull - private static RemoteAnimationTarget createRemoteAnimationTargetLocked( - Task task, SurfaceControl animLeash, int mode) { - ActivityRecord topApp = task.getTopRealVisibleActivity(); - if (topApp == null) { - topApp = task.getTopNonFinishingActivity(); - } - - final WindowState mainWindow = topApp != null - ? topApp.findMainWindow() - : null; - int windowType = INVALID_WINDOW_TYPE; - if (mainWindow != null) { - windowType = mainWindow.getWindowType(); - } - - Rect bounds = new Rect(task.getBounds()); - Rect localBounds = new Rect(bounds); - Point tmpPos = new Point(); - task.getRelativePosition(tmpPos); - localBounds.offsetTo(tmpPos.x, tmpPos.y); - - return new RemoteAnimationTarget( - task.mTaskId, - mode, - animLeash, - false /* isTransluscent */, - new Rect() /* clipRect */, - new Rect() /* contentInsets */, - task.getPrefixOrderIndex(), - tmpPos /* position */, - localBounds /* localBounds */, - bounds /* screenSpaceBounds */, - task.getWindowConfiguration(), - true /* isNotInRecent */, - null, - null, - task.getTaskInfo(), - false, - windowType); - } + private void setLaunchBehind(ActivityRecord activity) { + if (activity == null) { + return; + } + if (!activity.isVisibleRequested()) { + activity.setVisibility(true); + } + activity.mLaunchTaskBehind = true; + + // Handle fixed rotation launching app. + final DisplayContent dc = activity.mDisplayContent; + dc.rotateInDifferentOrientationIfNeeded(activity); + if (activity.hasFixedRotationTransform()) { + // Set the record so we can recognize it to continue to update display + // orientation if the previous activity becomes the top later. + dc.setFixedRotationLaunchingApp(activity, + activity.getWindowConfiguration().getRotation()); + } - @VisibleForTesting - void scheduleAnimationLocked(@BackNavigationInfo.BackTargetType int type, - RemoteAnimationTarget[] targets, BackAnimationAdapter backAnimationAdapter, - IBackAnimationFinishedCallback callback) { - mPendingAnimation = () -> { - try { - backAnimationAdapter.getRunner().onAnimationStart(type, - targets, null, null, callback); - } catch (RemoteException e) { - e.printStackTrace(); - } - }; - mWindowManagerService.mWindowPlacerLocked.requestTraversal(); + ProtoLog.d(WM_DEBUG_BACK_PREVIEW, + "Setting Activity.mLauncherTaskBehind to true. Activity=%s", activity); + activity.mTaskSupervisor.mStoppingActivities.remove(activity); + activity.getDisplayContent().ensureActivitiesVisible(null /* starting */, + 0 /* configChanges */, false /* preserveWindows */, true); + } + private void restoreLaunchBehind(ActivityRecord activity) { + if (activity == null) { + return; + } + + activity.mDisplayContent.continueUpdateOrientationForDiffOrienLaunchingApp(); + + // Restore the launch-behind state. + activity.mTaskSupervisor.scheduleLaunchTaskBehindComplete(activity.token); + activity.mLaunchTaskBehind = false; + ProtoLog.d(WM_DEBUG_BACK_PREVIEW, + "Setting Activity.mLauncherTaskBehind to false. Activity=%s", + activity); + } + } } void checkAnimationReady(WallpaperController wallpaperController) { @@ -796,80 +965,36 @@ class BackNavigationController { mShowWallpaper = false; } - private HardwareBuffer getActivitySnapshot(@NonNull Task task, ActivityRecord r) { - return task.getSnapshotForActivityRecord(r); - } - - private HardwareBuffer getTaskSnapshot(int taskId, int userId) { - if (mWindowManagerService.mTaskSnapshotController == null) { + private static TaskSnapshot getActivitySnapshot(@NonNull ActivityRecord r) { + if (!isScreenshotEnabled()) { return null; } - TaskSnapshot snapshot = mWindowManagerService.mTaskSnapshotController.getSnapshot(taskId, - userId, true /* restoreFromDisk */, false /* isLowResolution */); - return snapshot != null ? snapshot.getHardwareBuffer() : null; + // Check if we have a screenshot of the previous activity, indexed by its + // component name. + // TODO return TaskSnapshot when feature complete. +// final HardwareBuffer hw = r.getTask().getSnapshotForActivityRecord(r); + return null; } - private boolean needsScreenshot(int backType) { + private static TaskSnapshot getTaskSnapshot(Task task) { if (!isScreenshotEnabled()) { - return false; - } - switch (backType) { - case BackNavigationInfo.TYPE_RETURN_TO_HOME: - case BackNavigationInfo.TYPE_DIALOG_CLOSE: - return false; + return null; } - return true; + // Don't read from disk!! + return task.mRootWindowContainer.mWindowManager.mTaskSnapshotController.getSnapshot( + task.mTaskId, task.mUserId, false /* restoreFromDisk */, + false /* isLowResolution */); } void setWindowManager(WindowManagerService wm) { mWindowManagerService = wm; - } - - private void setLaunchBehind(ActivityRecord activity) { - if (activity == null) { - return; - } - if (!activity.isVisibleRequested()) { - activity.setVisibility(true); - } - activity.mLaunchTaskBehind = true; - - // Handle fixed rotation launching app. - final DisplayContent dc = activity.mDisplayContent; - dc.rotateInDifferentOrientationIfNeeded(activity); - if (activity.hasFixedRotationTransform()) { - // Set the record so we can recognize it to continue to update display orientation - // if the previous activity becomes the top later. - dc.setFixedRotationLaunchingApp(activity, - activity.getWindowConfiguration().getRotation()); - } - - ProtoLog.d(WM_DEBUG_BACK_PREVIEW, - "Setting Activity.mLauncherTaskBehind to true. Activity=%s", activity); - activity.mTaskSupervisor.mStoppingActivities.remove(activity); - activity.getDisplayContent().ensureActivitiesVisible(null /* starting */, - 0 /* configChanges */, false /* preserveWindows */, true); - } - - private void restoreLaunchBehind(ActivityRecord activity) { - if (activity == null) { - return; - } - - activity.mDisplayContent.continueUpdateOrientationForDiffOrienLaunchingApp(); - - // Restore the launch-behind state. - activity.mTaskSupervisor.scheduleLaunchTaskBehindComplete(activity.token); - activity.mLaunchTaskBehind = false; - ProtoLog.d(WM_DEBUG_BACK_PREVIEW, - "Setting Activity.mLauncherTaskBehind to false. Activity=%s", - activity); + mAnimationHandler = new AnimationHandler(wm); } boolean isWallpaperVisible(WindowState w) { - return mAnimationTargets.mComposed && mShowWallpaper + return mAnimationHandler.mComposed && mShowWallpaper && w.mAttrs.type == TYPE_BASE_APPLICATION && w.mActivityRecord != null - && mAnimationTargets.isTarget(w.mActivityRecord, true /* open */); + && mAnimationHandler.isTarget(w.mActivityRecord, true /* open */); } // Called from WindowManagerService to write to a protocol buffer output stream. diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index d93a62d67f1f..946ab6397f64 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -47,8 +47,6 @@ import static android.view.Display.REMOVE_MODE_DESTROY_CONTENT; import static android.view.Display.STATE_UNKNOWN; import static android.view.Display.isSuspendedState; import static android.view.InsetsSource.ID_IME; -import static android.view.InsetsState.ITYPE_LEFT_GESTURES; -import static android.view.InsetsState.ITYPE_RIGHT_GESTURES; import static android.view.Surface.ROTATION_0; import static android.view.Surface.ROTATION_270; import static android.view.Surface.ROTATION_90; @@ -57,6 +55,7 @@ import static android.view.WindowInsets.Type.displayCutout; import static android.view.WindowInsets.Type.ime; import static android.view.WindowInsets.Type.navigationBars; import static android.view.WindowInsets.Type.systemBars; +import static android.view.WindowInsets.Type.systemGestures; import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; import static android.view.WindowManager.DISPLAY_IME_POLICY_FALLBACK_DISPLAY; import static android.view.WindowManager.DISPLAY_IME_POLICY_LOCAL; @@ -174,6 +173,7 @@ import android.content.res.CompatibilityInfo; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.ColorSpace; +import android.graphics.Insets; import android.graphics.Matrix; import android.graphics.Point; import android.graphics.Rect; @@ -221,7 +221,6 @@ import android.view.InputChannel; import android.view.InputDevice; import android.view.InsetsSource; import android.view.InsetsState; -import android.view.InsetsState.InternalInsetsType; import android.view.MagnificationSpec; import android.view.PrivacyIndicatorBounds; import android.view.RemoteAnimationDefinition; @@ -248,7 +247,6 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.ToBooleanFunction; -import com.android.internal.util.function.TriConsumer; import com.android.internal.util.function.pooled.PooledLambda; import com.android.internal.util.function.pooled.PooledPredicate; import com.android.server.inputmethod.InputMethodManagerInternal; @@ -466,6 +464,8 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp private boolean mSystemGestureExclusionWasRestricted = false; private final Region mSystemGestureExclusionUnrestricted = new Region(); private int mSystemGestureExclusionLimit; + private final Rect mSystemGestureFrameLeft = new Rect(); + private final Rect mSystemGestureFrameRight = new Rect(); private Set<Rect> mRestrictedKeepClearAreas = new ArraySet<>(); private Set<Rect> mUnrestrictedKeepClearAreas = new ArraySet<>(); @@ -1519,31 +1519,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return mDisplayRotation; } - void setInsetProvider(@InternalInsetsType int type, WindowContainer win, - @Nullable TriConsumer<DisplayFrames, WindowContainer, Rect> frameProvider) { - setInsetProvider(type, win, frameProvider, null /* overrideFrameProviders */); - } - - /** - * Marks a window as providing insets for the rest of the windows in the system. - * - * @param type The type of inset this window provides. - * @param win The window. - * @param frameProvider Function to compute the frame, or {@code null} if the just the frame of - * the window should be taken. Only for non-WindowState providers, nav bar - * and status bar. - * @param overrideFrameProviders Functions to compute the frame when dispatching insets to the - * given window types, or {@code null} if the normal frame should - * be taken. - */ - void setInsetProvider(@InternalInsetsType int type, WindowContainer win, - @Nullable TriConsumer<DisplayFrames, WindowContainer, Rect> frameProvider, - @Nullable SparseArray<TriConsumer<DisplayFrames, WindowContainer, Rect>> - overrideFrameProviders) { - mInsetsStateController.getSourceProvider(type).setWindowContainer(win, frameProvider, - overrideFrameProviders); - } - InsetsStateController getInsetsStateController() { return mInsetsStateController; } @@ -4048,7 +4023,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp final int imePid = mInputMethodWindow.mSession.mPid; mAtmService.onImeWindowSetOnDisplayArea(imePid, mImeWindowsContainer); } - mInsetsStateController.getSourceProvider(ID_IME).setWindowContainer(win, + mInsetsStateController.getImeSourceProvider().setWindowContainer(win, mDisplayPolicy.getImeSourceFrameProvider(), null); computeImeTarget(true /* updateImeTarget */); updateImeControlTarget(); @@ -4944,7 +4919,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mInsetsStateController.getImeSourceProvider().checkShowImePostLayout(); mLastHasContent = mTmpApplySurfaceChangesTransactionState.displayHasContent; - if (!mWmService.mDisplayFrozen && !mDisplayRotation.isRotatingSeamlessly()) { + if (!inTransition() && !mDisplayRotation.isRotatingSeamlessly()) { mWmService.mDisplayManagerInternal.setDisplayProperties(mDisplayId, mLastHasContent, mTmpApplySurfaceChangesTransactionState.preferredRefreshRate, @@ -5719,10 +5694,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp final Region unhandled = Region.obtain(); unhandled.set(0, 0, mDisplayFrames.mWidth, mDisplayFrames.mHeight); - final Rect leftEdge = mInsetsStateController.getSourceProvider(ITYPE_LEFT_GESTURES) - .getSource().getFrame(); - final Rect rightEdge = mInsetsStateController.getSourceProvider(ITYPE_RIGHT_GESTURES) - .getSource().getFrame(); + final InsetsState state = mInsetsStateController.getRawInsetsState(); + final Rect df = state.getDisplayFrame(); + final Insets gestureInsets = state.calculateInsets(df, systemGestures(), + false /* ignoreVisibility */); + mSystemGestureFrameLeft.set(df.left, df.top, gestureInsets.left, df.bottom); + mSystemGestureFrameRight.set(gestureInsets.right, df.top, df.right, df.bottom); final Region touchableRegion = Region.obtain(); final Region local = Region.obtain(); @@ -5766,25 +5743,25 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (needsGestureExclusionRestrictions(w, false /* ignoreRequest */)) { // Processes the region along the left edge. - remainingLeftRight[0] = addToGlobalAndConsumeLimit(local, outExclusion, leftEdge, - remainingLeftRight[0], w, EXCLUSION_LEFT); + remainingLeftRight[0] = addToGlobalAndConsumeLimit(local, outExclusion, + mSystemGestureFrameLeft, remainingLeftRight[0], w, EXCLUSION_LEFT); // Processes the region along the right edge. - remainingLeftRight[1] = addToGlobalAndConsumeLimit(local, outExclusion, rightEdge, - remainingLeftRight[1], w, EXCLUSION_RIGHT); + remainingLeftRight[1] = addToGlobalAndConsumeLimit(local, outExclusion, + mSystemGestureFrameRight, remainingLeftRight[1], w, EXCLUSION_RIGHT); // Adds the middle (unrestricted area) final Region middle = Region.obtain(local); - middle.op(leftEdge, Op.DIFFERENCE); - middle.op(rightEdge, Op.DIFFERENCE); + middle.op(mSystemGestureFrameLeft, Op.DIFFERENCE); + middle.op(mSystemGestureFrameRight, Op.DIFFERENCE); outExclusion.op(middle, Op.UNION); middle.recycle(); } else { boolean loggable = needsGestureExclusionRestrictions(w, true /* ignoreRequest */); if (loggable) { - addToGlobalAndConsumeLimit(local, outExclusion, leftEdge, + addToGlobalAndConsumeLimit(local, outExclusion, mSystemGestureFrameLeft, Integer.MAX_VALUE, w, EXCLUSION_LEFT); - addToGlobalAndConsumeLimit(local, outExclusion, rightEdge, + addToGlobalAndConsumeLimit(local, outExclusion, mSystemGestureFrameRight, Integer.MAX_VALUE, w, EXCLUSION_RIGHT); } outExclusion.op(local, Op.UNION); diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index e87680ac5a16..3c4d70650605 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -171,9 +171,8 @@ public class DisplayPolicy { /** Use the transit animation in style resource (see {@link #selectAnimation}). */ static final int ANIMATION_STYLEABLE = 0; - private static final int[] SHOW_TYPES_FOR_SWIPE = {ITYPE_NAVIGATION_BAR, ITYPE_STATUS_BAR, - ITYPE_CLIMATE_BAR, ITYPE_EXTRA_NAVIGATION_BAR}; - private static final int[] SHOW_TYPES_FOR_PANIC = {ITYPE_NAVIGATION_BAR}; + private static final int SHOW_TYPES_FOR_SWIPE = Type.statusBars() | Type.navigationBars(); + private static final int SHOW_TYPES_FOR_PANIC = Type.navigationBars(); private final WindowManagerService mService; private final Context mContext; @@ -251,7 +250,7 @@ public class DisplayPolicy { private boolean mIsFreeformWindowOverlappingWithNavBar; - private boolean mLastImmersiveMode; + private boolean mIsImmersiveMode; // The windows we were told about in focusChanged. private WindowState mFocusedWindow; @@ -1077,8 +1076,16 @@ public class DisplayPolicy { } else { overrideProviders = null; } - mDisplayContent.setInsetProvider(provider.type, win, frameProvider, - overrideProviders); + // TODO (b/234093736): Let InsetsFrameProvider have the following fields: + // - IBinder owner. + // - int index. + // - @InsetsType int type. + // So we can create the id by using InsetsSource#createId. + // And we won't need toPublicType anymore. + final int id = provider.type; + final @InsetsType int type = InsetsState.toPublicType(id); + mDisplayContent.getInsetsStateController().getOrCreateSourceProvider(id, type) + .setWindowContainer(win, frameProvider, overrideProviders); mInsetsSourceWindowsExceptIme.add(win); } } @@ -1171,10 +1178,17 @@ public class DisplayPolicy { mLastFocusedWindow = null; } - final SparseArray<InsetsSource> sources = win.getProvidedInsetsSources(); - for (int index = sources.size() - 1; index >= 0; index--) { - final @InternalInsetsType int type = sources.keyAt(index); - mDisplayContent.setInsetProvider(type, null /* win */, null /* frameProvider */); + if (win.hasInsetsSourceProvider()) { + final SparseArray<InsetsSourceProvider> providers = win.getInsetsSourceProviders(); + final InsetsStateController controller = mDisplayContent.getInsetsStateController(); + for (int index = providers.size() - 1; index >= 0; index--) { + final InsetsSourceProvider provider = providers.valueAt(index); + provider.setWindowContainer( + null /* windowContainer */, + null /* frameProvider */, + null /* overrideFrameProviders */); + controller.removeSourceProvider(provider.getSource().getId()); + } } mInsetsSourceWindowsExceptIme.remove(win); } @@ -1243,7 +1257,6 @@ public class DisplayPolicy { * some temporal states, but doesn't change the window frames used to show on screen. */ void simulateLayoutDisplay(DisplayFrames displayFrames) { - final InsetsStateController controller = mDisplayContent.getInsetsStateController(); sTmpClientFrames.attachedFrame = null; for (int i = mInsetsSourceWindowsExceptIme.size() - 1; i >= 0; i--) { final WindowState win = mInsetsSourceWindowsExceptIme.valueAt(i); @@ -1252,11 +1265,10 @@ public class DisplayPolicy { displayFrames.mUnrestricted, win.getWindowingMode(), UNSPECIFIED_LENGTH, UNSPECIFIED_LENGTH, win.getRequestedVisibleTypes(), win.mGlobalScale, sTmpClientFrames); - final SparseArray<InsetsSource> sources = win.getProvidedInsetsSources(); + final SparseArray<InsetsSourceProvider> providers = win.getInsetsSourceProviders(); final InsetsState state = displayFrames.mInsetsState; - for (int index = sources.size() - 1; index >= 0; index--) { - final int type = sources.keyAt(index); - state.addSource(controller.getSourceProvider(type).createSimulatedSource( + for (int index = providers.size() - 1; index >= 0; index--) { + state.addSource(providers.valueAt(index).createSimulatedSource( displayFrames, sTmpClientFrames.frame)); } } @@ -1359,30 +1371,33 @@ public class DisplayPolicy { mIsFreeformWindowOverlappingWithNavBar = true; } - final SparseArray<InsetsSource> sources = win.getProvidedInsetsSources(); - final Rect bounds = win.getBounds(); - for (int index = sources.size() - 1; index >= 0; index--) { - final InsetsSource source = sources.valueAt(index); - if ((source.getType() - & (Type.systemGestures() | Type.mandatorySystemGestures())) == 0) { - continue; - } - if (mLeftGestureHost != null && mTopGestureHost != null - && mRightGestureHost != null && mBottomGestureHost != null) { - continue; - } - final Insets insets = source.calculateInsets(bounds, false /* ignoreVisibility */); - if (mLeftGestureHost == null && insets.left > 0) { - mLeftGestureHost = win; - } - if (mTopGestureHost == null && insets.top > 0) { - mTopGestureHost = win; - } - if (mRightGestureHost == null && insets.right > 0) { - mRightGestureHost = win; - } - if (mBottomGestureHost == null && insets.bottom > 0) { - mBottomGestureHost = win; + if (win.hasInsetsSourceProvider()) { + final SparseArray<InsetsSourceProvider> providers = win.getInsetsSourceProviders(); + final Rect bounds = win.getBounds(); + for (int index = providers.size() - 1; index >= 0; index--) { + final InsetsSourceProvider provider = providers.valueAt(index); + final InsetsSource source = provider.getSource(); + if ((source.getType() + & (Type.systemGestures() | Type.mandatorySystemGestures())) == 0) { + continue; + } + if (mLeftGestureHost != null && mTopGestureHost != null + && mRightGestureHost != null && mBottomGestureHost != null) { + continue; + } + final Insets insets = source.calculateInsets(bounds, false /* ignoreVisibility */); + if (mLeftGestureHost == null && insets.left > 0) { + mLeftGestureHost = win; + } + if (mTopGestureHost == null && insets.top > 0) { + mTopGestureHost = win; + } + if (mRightGestureHost == null && insets.right > 0) { + mRightGestureHost = win; + } + if (mBottomGestureHost == null && insets.bottom > 0) { + mBottomGestureHost = win; + } } } @@ -2171,14 +2186,27 @@ public class DisplayPolicy { appearance = configureNavBarOpacity(appearance, multiWindowTaskVisible, freeformRootTaskVisible); + // Show immersive mode confirmation if needed. + final boolean wasImmersiveMode = mIsImmersiveMode; + final boolean isImmersiveMode = isImmersiveMode(win); + if (wasImmersiveMode != isImmersiveMode) { + mIsImmersiveMode = isImmersiveMode; + // The immersive confirmation window should be attached to the immersive window root. + final RootDisplayArea root = win.getRootDisplayArea(); + final int rootDisplayAreaId = root == null ? FEATURE_UNDEFINED : root.mFeatureId; + mImmersiveModeConfirmation.immersiveModeChangedLw(rootDisplayAreaId, isImmersiveMode, + mService.mPolicy.isUserSetupComplete(), + isNavBarEmpty(disableFlags)); + } + + // Show transient bars for panic if needed. final boolean requestHideNavBar = !win.isRequestedVisible(Type.navigationBars()); final long now = SystemClock.uptimeMillis(); final boolean pendingPanic = mPendingPanicGestureUptime != 0 && now - mPendingPanicGestureUptime <= PANIC_GESTURE_EXPIRATION; final DisplayPolicy defaultDisplayPolicy = mService.getDefaultDisplayContentLocked().getDisplayPolicy(); - if (pendingPanic && requestHideNavBar && win != mNotificationShade - && getInsetsPolicy().isHidden(ITYPE_NAVIGATION_BAR) + if (pendingPanic && requestHideNavBar && isImmersiveMode // TODO (b/111955725): Show keyguard presentation on all external displays && defaultDisplayPolicy.isKeyguardDrawComplete()) { // The user performed the panic gesture recently, we're about to hide the bars, @@ -2190,19 +2218,6 @@ public class DisplayPolicy { } } - // update navigation bar - boolean oldImmersiveMode = mLastImmersiveMode; - boolean newImmersiveMode = isImmersiveMode(win); - if (oldImmersiveMode != newImmersiveMode) { - mLastImmersiveMode = newImmersiveMode; - // The immersive confirmation window should be attached to the immersive window root. - final RootDisplayArea root = win.getRootDisplayArea(); - final int rootDisplayAreaId = root == null ? FEATURE_UNDEFINED : root.mFeatureId; - mImmersiveModeConfirmation.immersiveModeChangedLw(rootDisplayAreaId, newImmersiveMode, - mService.mPolicy.isUserSetupComplete(), - isNavBarEmpty(disableFlags)); - } - return appearance; } @@ -2324,18 +2339,10 @@ public class DisplayPolicy { if (win == null) { return false; } - return getNavigationBar() != null - && canHideNavigationBar() - && getInsetsPolicy().isHidden(ITYPE_NAVIGATION_BAR) - && win != getNotificationShade() - && !win.isActivityTypeDream(); - } - - /** - * @return whether the navigation bar can be hidden, e.g. the device has a navigation bar - */ - private boolean canHideNavigationBar() { - return hasNavigationBar(); + if (win == getNotificationShade() || win.isActivityTypeDream()) { + return false; + } + return getInsetsPolicy().hasHiddenSources(Type.navigationBars()); } private static boolean isNavBarEmpty(int systemUiFlags) { diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java index bd821134f9b7..5c5eadc05c14 100644 --- a/services/core/java/com/android/server/wm/InsetsPolicy.java +++ b/services/core/java/com/android/server/wm/InsetsPolicy.java @@ -26,8 +26,6 @@ import static android.view.InsetsController.ANIMATION_TYPE_SHOW; import static android.view.InsetsController.LAYOUT_INSETS_DURING_ANIMATION_HIDDEN; import static android.view.InsetsController.LAYOUT_INSETS_DURING_ANIMATION_SHOWN; import static android.view.InsetsSource.ID_IME; -import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; -import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.SyncRtSurfaceTransactionApplier.applyParams; import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR; @@ -41,8 +39,6 @@ import android.app.StatusBarManager; import android.app.WindowConfiguration; import android.content.ComponentName; import android.content.res.Resources; -import android.util.ArrayMap; -import android.util.IntArray; import android.util.SparseArray; import android.view.InsetsAnimationControlCallbacks; import android.view.InsetsAnimationControlImpl; @@ -52,7 +48,6 @@ import android.view.InsetsFrameProvider; import android.view.InsetsSource; import android.view.InsetsSourceControl; import android.view.InsetsState; -import android.view.InsetsState.InternalInsetsType; import android.view.InternalInsetsAnimationController; import android.view.SurfaceControl; import android.view.SyncRtSurfaceTransactionApplier; @@ -81,7 +76,6 @@ class InsetsPolicy { private final InsetsStateController mStateController; private final DisplayContent mDisplayContent; private final DisplayPolicy mPolicy; - private final IntArray mShowingTransientTypes = new IntArray(); /** For resetting visibilities of insets sources. */ private final InsetsControlTarget mDummyControlTarget = new InsetsControlTarget() { @@ -95,7 +89,7 @@ class InsetsPolicy { return; } for (InsetsSourceControl control : controls) { - if (mShowingTransientTypes.indexOf(control.getId()) != -1) { + if (isTransient(control.getType())) { // The visibilities of transient bars will be handled with animations. continue; } @@ -117,13 +111,16 @@ class InsetsPolicy { }; private WindowState mFocusedWin; - private BarWindow mStatusBar = new BarWindow(StatusBarManager.WINDOW_STATUS_BAR); - private BarWindow mNavBar = new BarWindow(StatusBarManager.WINDOW_NAVIGATION_BAR); + private final BarWindow mStatusBar = new BarWindow(StatusBarManager.WINDOW_STATUS_BAR); + private final BarWindow mNavBar = new BarWindow(StatusBarManager.WINDOW_NAVIGATION_BAR); + private @InsetsType int mShowingTransientTypes; private boolean mAnimatingShown; + /** * Let remote insets controller control system bars regardless of other settings. */ private boolean mRemoteInsetsControllerControlsSystemBars; + private final boolean mHideNavBarForKeyboard; private final float[] mTmpFloat9 = new float[9]; @@ -178,37 +175,46 @@ class InsetsPolicy { mNavBar.updateVisibility(navControlTarget, Type.navigationBars()); } - boolean isHidden(@InternalInsetsType int type) { - final WindowContainerInsetsSourceProvider provider = mStateController - .peekSourceProvider(type); - return provider != null && provider.hasWindowContainer() - && !provider.getSource().isVisible(); + boolean hasHiddenSources(@InsetsType int types) { + final InsetsState state = mStateController.getRawInsetsState(); + for (int i = state.sourceSize() - 1; i >= 0; i--) { + final InsetsSource source = state.sourceAt(i); + if ((source.getType() & types) == 0) { + continue; + } + if (!source.getFrame().isEmpty() && !source.isVisible()) { + return true; + } + } + return false; } - void showTransient(@InternalInsetsType int[] types, boolean isGestureOnSystemBar) { - boolean changed = false; - for (int i = types.length - 1; i >= 0; i--) { - final @InternalInsetsType int type = types[i]; - if (!isHidden(type)) { + void showTransient(@InsetsType int types, boolean isGestureOnSystemBar) { + @InsetsType int showingTransientTypes = mShowingTransientTypes; + final InsetsState rawState = mStateController.getRawInsetsState(); + for (int i = rawState.sourceSize() - 1; i >= 0; i--) { + final InsetsSource source = rawState.sourceAt(i); + if (source.isVisible()) { continue; } - if (mShowingTransientTypes.indexOf(type) != -1) { + final @InsetsType int type = source.getType(); + if ((source.getType() & types) == 0) { continue; } - mShowingTransientTypes.add(type); - changed = true; + showingTransientTypes |= type; } - if (changed) { + if (mShowingTransientTypes != showingTransientTypes) { + mShowingTransientTypes = showingTransientTypes; StatusBarManagerInternal statusBarManagerInternal = mPolicy.getStatusBarManagerInternal(); if (statusBarManagerInternal != null) { statusBarManagerInternal.showTransient(mDisplayContent.getDisplayId(), - mShowingTransientTypes.toArray(), isGestureOnSystemBar); + showingTransientTypes, isGestureOnSystemBar); } updateBarControlTarget(mFocusedWin); dispatchTransientSystemBarsVisibilityChanged( mFocusedWin, - isTransient(ITYPE_STATUS_BAR) || isTransient(ITYPE_NAVIGATION_BAR), + (showingTransientTypes & (Type.statusBars() | Type.navigationBars())) != 0, isGestureOnSystemBar); // The leashes can be created while updating bar control target. The surface transaction @@ -224,7 +230,7 @@ class InsetsPolicy { } void hideTransient() { - if (mShowingTransientTypes.size() == 0) { + if (mShowingTransientTypes == 0) { return; } @@ -235,20 +241,25 @@ class InsetsPolicy { startAnimation(false /* show */, () -> { synchronized (mDisplayContent.mWmService.mGlobalLock) { - for (int i = mShowingTransientTypes.size() - 1; i >= 0; i--) { + final SparseArray<WindowContainerInsetsSourceProvider> providers = + mStateController.getSourceProviders(); + for (int i = providers.size() - 1; i >= 0; i--) { + final WindowContainerInsetsSourceProvider provider = providers.valueAt(i); + if (!isTransient(provider.getSource().getType())) { + continue; + } // We are about to clear mShowingTransientTypes, we don't want the transient bar // can cause insets on the client. Restore the client visibility. - final @InternalInsetsType int type = mShowingTransientTypes.get(i); - mStateController.getSourceProvider(type).setClientVisible(false); + provider.setClientVisible(false); } - mShowingTransientTypes.clear(); + mShowingTransientTypes = 0; updateBarControlTarget(mFocusedWin); } }); } - boolean isTransient(@InternalInsetsType int type) { - return mShowingTransientTypes.indexOf(type) != -1; + boolean isTransient(@InsetsType int type) { + return (mShowingTransientTypes & type) != 0; } /** @@ -280,9 +291,9 @@ class InsetsPolicy { ? token.getFixedRotationTransformInsetsState() : mStateController.getRawInsetsState(); outInsetsState.set(srcState, true /* copySources */); - for (int i = mShowingTransientTypes.size() - 1; i >= 0; i--) { - final InsetsSource source = outInsetsState.peekSource(mShowingTransientTypes.get(i)); - if (source != null) { + for (int i = outInsetsState.sourceSize() - 1; i >= 0; i--) { + final InsetsSource source = outInsetsState.sourceAt(i); + if (isTransient(source.getType())) { source.setVisible(false); } } @@ -333,8 +344,8 @@ class InsetsPolicy { } } - final ArrayMap<Integer, WindowContainerInsetsSourceProvider> providers = mStateController - .getSourceProviders(); + final SparseArray<WindowContainerInsetsSourceProvider> providers = + mStateController.getSourceProviders(); final int windowType = attrs.type; for (int i = providers.size() - 1; i >= 0; i--) { final WindowContainerInsetsSourceProvider otherProvider = providers.valueAt(i); @@ -365,18 +376,17 @@ class InsetsPolicy { private InsetsState adjustVisibilityForTransientTypes(InsetsState originalState) { InsetsState state = originalState; - for (int i = mShowingTransientTypes.size() - 1; i >= 0; i--) { - final @InternalInsetsType int type = mShowingTransientTypes.get(i); - final InsetsSource originalSource = state.peekSource(type); - if (originalSource != null && originalSource.isVisible()) { + for (int i = state.sourceSize() - 1; i >= 0; i--) { + final InsetsSource source = state.sourceAt(i); + if (isTransient(source.getType()) && source.isVisible()) { if (state == originalState) { // The source will be modified, create a non-deep copy to store the new one. state = new InsetsState(originalState); } // Replace the source with a copy in invisible state. - final InsetsSource source = new InsetsSource(originalSource); - source.setVisible(false); - state.addSource(source); + final InsetsSource outSource = new InsetsSource(source); + outSource.setVisible(false); + state.addSource(outSource); } } return state; @@ -385,18 +395,23 @@ class InsetsPolicy { private InsetsState adjustVisibilityForIme(WindowState w, InsetsState originalState, boolean copyState) { if (w.mIsImWindow) { + InsetsState state = originalState; // If navigation bar is not hidden by IME, IME should always receive visible // navigation bar insets. final boolean navVisible = !mHideNavBarForKeyboard; - final InsetsSource originalNavSource = originalState.peekSource(ITYPE_NAVIGATION_BAR); - if (originalNavSource != null && originalNavSource.isVisible() != navVisible) { - final InsetsState state = copyState ? new InsetsState(originalState) - : originalState; - final InsetsSource navSource = new InsetsSource(originalNavSource); + for (int i = originalState.sourceSize() - 1; i >= 0; i--) { + final InsetsSource source = originalState.sourceAt(i); + if (source.getType() != Type.navigationBars() || source.isVisible() == navVisible) { + continue; + } + if (state == originalState && copyState) { + state = new InsetsState(originalState); + } + final InsetsSource navSource = new InsetsSource(source); navSource.setVisible(navVisible); state.addSource(navSource); - return state; } + return state; } else if (w.mActivityRecord != null && w.mActivityRecord.mImeInsetsFrozenUntilStartInput) { // During switching tasks with gestural navigation, before the next IME input target // starts the input, we should adjust and freeze the last IME visibility of the window @@ -447,23 +462,22 @@ class InsetsPolicy { * @param caller who changed the insets state. */ private void checkAbortTransient(InsetsControlTarget caller) { - if (mShowingTransientTypes.size() != 0) { - final IntArray abortTypes = new IntArray(); - final boolean imeRequestedVisible = caller.isRequestedVisible(Type.ime()); - for (int i = mShowingTransientTypes.size() - 1; i >= 0; i--) { - final @InternalInsetsType int type = mShowingTransientTypes.get(i); - if ((mStateController.isFakeTarget(type, caller) - && caller.isRequestedVisible(InsetsState.toPublicType(type))) - || (type == ITYPE_NAVIGATION_BAR && imeRequestedVisible)) { - mShowingTransientTypes.remove(i); - abortTypes.add(type); - } - } - StatusBarManagerInternal statusBarManagerInternal = - mPolicy.getStatusBarManagerInternal(); - if (abortTypes.size() > 0 && statusBarManagerInternal != null) { - statusBarManagerInternal.abortTransient( - mDisplayContent.getDisplayId(), abortTypes.toArray()); + if (mShowingTransientTypes == 0) { + return; + } + final boolean isImeVisible = mStateController.getImeSourceProvider().isClientVisible(); + final @InsetsType int fakeControllingTypes = + mStateController.getFakeControllingTypes(caller); + final @InsetsType int abortTypes = + (fakeControllingTypes & caller.getRequestedVisibleTypes()) + | (isImeVisible ? Type.navigationBars() : 0); + mShowingTransientTypes &= ~abortTypes; + if (abortTypes != 0) { + mDisplayContent.setLayoutNeeded(); + mDisplayContent.mWmService.requestTraversal(); + final StatusBarManagerInternal statusBarManager = mPolicy.getStatusBarManagerInternal(); + if (statusBarManager != null) { + statusBarManager.abortTransient(mDisplayContent.getDisplayId(), abortTypes); } } } @@ -473,12 +487,16 @@ class InsetsPolicy { * updateBarControlTarget(mFocusedWin) after this invocation. */ private void abortTransient() { - StatusBarManagerInternal statusBarManagerInternal = mPolicy.getStatusBarManagerInternal(); - if (statusBarManagerInternal != null) { - statusBarManagerInternal.abortTransient( - mDisplayContent.getDisplayId(), mShowingTransientTypes.toArray()); + if (mShowingTransientTypes == 0) { + return; + } + final StatusBarManagerInternal statusBarManager = mPolicy.getStatusBarManagerInternal(); + if (statusBarManager != null) { + statusBarManager.abortTransient(mDisplayContent.getDisplayId(), mShowingTransientTypes); } - mShowingTransientTypes.clear(); + mShowingTransientTypes = 0; + mDisplayContent.setLayoutNeeded(); + mDisplayContent.mWmService.requestTraversal(); dispatchTransientSystemBarsVisibilityChanged( mFocusedWin, @@ -488,7 +506,7 @@ class InsetsPolicy { private @Nullable InsetsControlTarget getStatusControlTarget(@Nullable WindowState focusedWin, boolean fake) { - if (!fake && isShowingTransientTypes(Type.statusBars())) { + if (!fake && isTransient(Type.statusBars())) { return mDummyControlTarget; } final WindowState notificationShade = mPolicy.getNotificationShade(); @@ -541,7 +559,7 @@ class InsetsPolicy { // configured to be hidden by the IME. return null; } - if (!fake && isShowingTransientTypes(Type.navigationBars())) { + if (!fake && isTransient(Type.navigationBars())) { return mDummyControlTarget; } if (focusedWin == mPolicy.getNotificationShade()) { @@ -577,16 +595,6 @@ class InsetsPolicy { return focusedWin; } - private boolean isShowingTransientTypes(@InsetsType int types) { - final IntArray showingTransientTypes = mShowingTransientTypes; - for (int i = showingTransientTypes.size() - 1; i >= 0; i--) { - if ((InsetsState.toPublicType(showingTransientTypes.get(i)) & types) != 0) { - return true; - } - } - return false; - } - /** * Determines whether the remote insets controller should take control of system bars for all * windows. @@ -622,21 +630,23 @@ class InsetsPolicy { @VisibleForTesting void startAnimation(boolean show, Runnable callback) { - int typesReady = 0; - final SparseArray<InsetsSourceControl> controls = new SparseArray<>(); - final IntArray showingTransientTypes = mShowingTransientTypes; - for (int i = showingTransientTypes.size() - 1; i >= 0; i--) { - final int sourceId = showingTransientTypes.get(i); - final WindowContainerInsetsSourceProvider provider = - mStateController.getSourceProvider(sourceId); - final InsetsSourceControl control = provider.getControl(mDummyControlTarget); - if (control == null || control.getLeash() == null) { - continue; + @InsetsType int typesReady = 0; + final SparseArray<InsetsSourceControl> controlsReady = new SparseArray<>(); + final InsetsSourceControl[] controls = + mStateController.getControlsForDispatch(mDummyControlTarget); + if (controls == null) { + if (callback != null) { + DisplayThread.getHandler().post(callback); + } + return; + } + for (InsetsSourceControl control : controls) { + if (isTransient(control.getType()) && control.getLeash() != null) { + typesReady |= control.getType(); + controlsReady.put(control.getId(), new InsetsSourceControl(control)); } - typesReady |= control.getType(); - controls.put(sourceId, new InsetsSourceControl(control)); } - controlAnimationUnchecked(typesReady, controls, show, callback); + controlAnimationUnchecked(typesReady, controlsReady, show, callback); } private void controlAnimationUnchecked(int typesReady, diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java index f5af2929c2bd..2b7a45144200 100644 --- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java @@ -164,7 +164,7 @@ abstract class InsetsSourceProvider { // TODO: Ideally, we should wait for the animation to finish so previous window can // animate-out as new one animates-in. mWindowContainer.cancelAnimation(); - mWindowContainer.getProvidedInsetsSources().remove(mSource.getId()); + mWindowContainer.getInsetsSourceProviders().remove(mSource.getId()); mSeamlessRotating = false; } ProtoLog.d(WM_DEBUG_WINDOW_INSETS, "InsetsSource setWin %s for type %s", @@ -180,7 +180,7 @@ abstract class InsetsSourceProvider { mSource.setInsetsRoundedCornerFrame(false); mSourceFrame.setEmpty(); } else { - mWindowContainer.getProvidedInsetsSources().put(mSource.getId(), mSource); + mWindowContainer.getInsetsSourceProviders().put(mSource.getId(), this); if (mControllable) { mWindowContainer.setControllableInsetProvider(this); if (mPendingControlTarget != null) { @@ -192,13 +192,6 @@ abstract class InsetsSourceProvider { } /** - * @return Whether there is a window container which backs this source. - */ - boolean hasWindowContainer() { - return mWindowContainer != null; - } - - /** * The source frame can affect the layout of other windows, so this should be called once the * window container gets laid out. */ @@ -363,9 +356,9 @@ abstract class InsetsSourceProvider { } /** - * @see InsetsStateController#onControlFakeTargetChanged(int, InsetsControlTarget) + * @see InsetsStateController#onControlTargetChanged */ - void updateControlForFakeTarget(@Nullable InsetsControlTarget fakeTarget) { + void updateFakeControlTarget(@Nullable InsetsControlTarget fakeTarget) { if (fakeTarget == mFakeControlTarget) { return; } @@ -570,6 +563,10 @@ abstract class InsetsSourceProvider { return mControlTarget; } + InsetsControlTarget getFakeControlTarget() { + return mFakeControlTarget; + } + boolean isClientVisible() { return mClientVisible; } @@ -609,15 +606,15 @@ abstract class InsetsSourceProvider { } if (mControlTarget != null) { pw.print(prefix + "mControlTarget="); - pw.println(mControlTarget.getWindow()); + pw.println(mControlTarget); } if (mPendingControlTarget != null) { pw.print(prefix + "mPendingControlTarget="); - pw.println(mPendingControlTarget.getWindow()); + pw.println(mPendingControlTarget); } if (mFakeControlTarget != null) { pw.print(prefix + "mFakeControlTarget="); - pw.println(mFakeControlTarget.getWindow()); + pw.println(mFakeControlTarget); } } diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java index a3f62b2c5693..0e1e63e84250 100644 --- a/services/core/java/com/android/server/wm/InsetsStateController.java +++ b/services/core/java/com/android/server/wm/InsetsStateController.java @@ -18,10 +18,6 @@ package com.android.server.wm; import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static android.view.InsetsSource.ID_IME; -import static android.view.InsetsState.ITYPE_CLIMATE_BAR; -import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR; -import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; -import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.WindowInsets.Type.displayCutout; import static android.view.WindowInsets.Type.ime; import static android.view.WindowInsets.Type.mandatorySystemGestures; @@ -38,10 +34,11 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.SparseArray; import android.util.proto.ProtoOutputStream; +import android.view.InsetsSource; import android.view.InsetsSourceControl; import android.view.InsetsState; -import android.view.InsetsState.InternalInsetsType; import android.view.WindowInsets; +import android.view.WindowInsets.Type.InsetsType; import com.android.internal.protolog.common.ProtoLog; import com.android.server.inputmethod.InputMethodManagerInternal; @@ -49,7 +46,6 @@ import com.android.server.inputmethod.InputMethodManagerInternal; import java.io.PrintWriter; import java.util.ArrayList; import java.util.function.Consumer; -import java.util.function.Function; /** * Manages global window inset state in the system represented by {@link InsetsState}. @@ -60,14 +56,11 @@ class InsetsStateController { private final InsetsState mState = new InsetsState(); private final DisplayContent mDisplayContent; - private final ArrayMap<Integer, WindowContainerInsetsSourceProvider> mProviders = - new ArrayMap<>(); - private final ArrayMap<InsetsControlTarget, ArrayList<Integer>> mControlTargetTypeMap = - new ArrayMap<>(); - private final SparseArray<InsetsControlTarget> mTypeControlTargetMap = new SparseArray<>(); - - /** @see #onControlFakeTargetChanged */ - private final SparseArray<InsetsControlTarget> mTypeFakeControlTargetMap = new SparseArray<>(); + private final SparseArray<WindowContainerInsetsSourceProvider> mProviders = new SparseArray<>(); + private final ArrayMap<InsetsControlTarget, ArrayList<InsetsSourceProvider>> + mControlTargetProvidersMap = new ArrayMap<>(); + private final SparseArray<InsetsControlTarget> mIdControlTargetMap = new SparseArray<>(); + private final SparseArray<InsetsControlTarget> mIdFakeControlTargetMap = new SparseArray<>(); private final ArraySet<InsetsControlTarget> mPendingControlChanged = new ArraySet<>(); @@ -92,15 +85,8 @@ class InsetsStateController { } }; - private final Function<Integer, WindowContainerInsetsSourceProvider> mSourceProviderFunc; - InsetsStateController(DisplayContent displayContent) { mDisplayContent = displayContent; - mSourceProviderFunc = id -> (id == ID_IME) - ? new ImeInsetsSourceProvider(mState.getOrCreateSource( - id, ime()), this, mDisplayContent) - : new WindowContainerInsetsSourceProvider(mState.getOrCreateSource( - id, InsetsState.toPublicType(id)), this, mDisplayContent); } InsetsState getRawInsetsState() { @@ -108,39 +94,55 @@ class InsetsStateController { } @Nullable InsetsSourceControl[] getControlsForDispatch(InsetsControlTarget target) { - ArrayList<Integer> controlled = mControlTargetTypeMap.get(target); + final ArrayList<InsetsSourceProvider> controlled = mControlTargetProvidersMap.get(target); if (controlled == null) { return null; } final int size = controlled.size(); final InsetsSourceControl[] result = new InsetsSourceControl[size]; for (int i = 0; i < size; i++) { - result[i] = mProviders.get(controlled.get(i)).getControl(target); + result[i] = controlled.get(i).getControl(target); } return result; } - ArrayMap<Integer, WindowContainerInsetsSourceProvider> getSourceProviders() { + SparseArray<WindowContainerInsetsSourceProvider> getSourceProviders() { return mProviders; } /** * @return The provider of a specific source ID. */ - WindowContainerInsetsSourceProvider getSourceProvider(int id) { - return mProviders.computeIfAbsent(id, mSourceProviderFunc); + WindowContainerInsetsSourceProvider getOrCreateSourceProvider(int id, @InsetsType int type) { + WindowContainerInsetsSourceProvider provider = mProviders.get(id); + if (provider != null) { + return provider; + } + final InsetsSource source = mState.getOrCreateSource(id, type); + provider = id == ID_IME + ? new ImeInsetsSourceProvider(source, this, mDisplayContent) + : new WindowContainerInsetsSourceProvider(source, this, mDisplayContent); + mProviders.put(id, provider); + return provider; } ImeInsetsSourceProvider getImeSourceProvider() { - return (ImeInsetsSourceProvider) getSourceProvider(ID_IME); + return (ImeInsetsSourceProvider) getOrCreateSourceProvider(ID_IME, ime()); + } + + void removeSourceProvider(int id) { + if (id != ID_IME) { + mState.removeSource(id); + mProviders.remove(id); + } } /** - * @return The provider of a specific type or null if we don't have it. + * @return The provider of a source ID or null if we don't have it. */ @Nullable - WindowContainerInsetsSourceProvider peekSourceProvider(@InternalInsetsType int type) { - return mProviders.get(type); + WindowContainerInsetsSourceProvider peekSourceProvider(int id) { + return mProviders.get(id); } /** @@ -208,8 +210,16 @@ class InsetsStateController { } } - boolean isFakeTarget(@InternalInsetsType int type, InsetsControlTarget target) { - return mTypeFakeControlTargetMap.get(type) == target; + @InsetsType int getFakeControllingTypes(InsetsControlTarget target) { + @InsetsType int types = 0; + for (int i = mProviders.size() - 1; i >= 0; i--) { + final InsetsSourceProvider provider = mProviders.valueAt(i); + final InsetsControlTarget fakeControlTarget = provider.getFakeControlTarget(); + if (target == fakeControlTarget) { + types |= provider.getSource().getType(); + } + } + return types; } void onImeControlTargetChanged(@Nullable InsetsControlTarget imeTarget) { @@ -217,7 +227,7 @@ class InsetsStateController { // Make sure that we always have a control target for the IME, even if the IME target is // null. Otherwise there is no leash that will hide it and IME becomes "randomly" visible. InsetsControlTarget target = imeTarget != null ? imeTarget : mEmptyImeControlTarget; - onControlChanged(ID_IME, target); + onControlTargetChanged(getImeSourceProvider(), target, false /* fake */); ProtoLog.d(WM_DEBUG_IME, "onImeControlTargetChanged %s", target != null ? target.getWindow() : "null"); notifyPendingInsetsControlChanged(); @@ -235,101 +245,88 @@ class InsetsStateController { @Nullable InsetsControlTarget fakeStatusControlling, @Nullable InsetsControlTarget navControlling, @Nullable InsetsControlTarget fakeNavControlling) { - onControlChanged(ITYPE_STATUS_BAR, statusControlling); - onControlChanged(ITYPE_NAVIGATION_BAR, navControlling); - onControlChanged(ITYPE_CLIMATE_BAR, statusControlling); - onControlChanged(ITYPE_EXTRA_NAVIGATION_BAR, navControlling); - onControlFakeTargetChanged(ITYPE_STATUS_BAR, fakeStatusControlling); - onControlFakeTargetChanged(ITYPE_NAVIGATION_BAR, fakeNavControlling); - onControlFakeTargetChanged(ITYPE_CLIMATE_BAR, fakeStatusControlling); - onControlFakeTargetChanged(ITYPE_EXTRA_NAVIGATION_BAR, fakeNavControlling); + for (int i = mProviders.size() - 1; i >= 0; i--) { + final InsetsSourceProvider provider = mProviders.valueAt(i); + final @InsetsType int type = provider.getSource().getType(); + if (type == WindowInsets.Type.statusBars()) { + onControlTargetChanged(provider, statusControlling, false /* fake */); + onControlTargetChanged(provider, fakeStatusControlling, true /* fake */); + } else if (type == WindowInsets.Type.navigationBars()) { + onControlTargetChanged(provider, navControlling, false /* fake */); + onControlTargetChanged(provider, fakeNavControlling, true /* fake */); + } + } notifyPendingInsetsControlChanged(); } void notifyControlRevoked(@NonNull InsetsControlTarget previousControlTarget, InsetsSourceProvider provider) { - removeFromControlMaps(previousControlTarget, provider.getSource().getId(), - false /* fake */); + removeFromControlMaps(previousControlTarget, provider, false /* fake */); } - private void onControlChanged(@InternalInsetsType int type, - @Nullable InsetsControlTarget target) { - final InsetsControlTarget previous = mTypeControlTargetMap.get(type); - if (target == previous) { - return; - } - final WindowContainerInsetsSourceProvider provider = mProviders.get(type); - if (provider == null) { + private void onControlTargetChanged(InsetsSourceProvider provider, + @Nullable InsetsControlTarget target, boolean fake) { + final InsetsControlTarget lastTarget = fake + ? mIdFakeControlTargetMap.get(provider.getSource().getId()) + : mIdControlTargetMap.get(provider.getSource().getId()); + if (target == lastTarget) { return; } if (!provider.isControllable()) { return; } - provider.updateControlForTarget(target, false /* force */); - target = provider.getControlTarget(); - if (previous != null) { - removeFromControlMaps(previous, type, false /* fake */); - mPendingControlChanged.add(previous); - } - if (target != null) { - addToControlMaps(target, type, false /* fake */); - mPendingControlChanged.add(target); - } - } + if (fake) { + // The fake target updated here will be used to pretend to the app that it's still under + // control of the bars while it's not really, but we still need to find out the apps + // intentions around showing/hiding. For example, when the transient bars are showing, + // and the fake target requests to show system bars, the transient state will be + // aborted. + provider.updateFakeControlTarget(target); + } else { + provider.updateControlForTarget(target, false /* force */); - /** - * The fake target saved here will be used to pretend to the app that it's still under control - * of the bars while it's not really, but we still need to find out the apps intentions around - * showing/hiding. For example, when the transient bars are showing, and the fake target - * requests to show system bars, the transient state will be aborted. - */ - void onControlFakeTargetChanged(@InternalInsetsType int type, - @Nullable InsetsControlTarget fakeTarget) { - final InsetsControlTarget previous = mTypeFakeControlTargetMap.get(type); - if (fakeTarget == previous) { - return; - } - final WindowContainerInsetsSourceProvider provider = mProviders.get(type); - if (provider == null) { - return; + // Get control target again in case the provider didn't accept the one we passed to it. + target = provider.getControlTarget(); + if (target == lastTarget) { + return; + } } - provider.updateControlForFakeTarget(fakeTarget); - if (previous != null) { - removeFromControlMaps(previous, type, true /* fake */); - mPendingControlChanged.add(previous); + if (lastTarget != null) { + removeFromControlMaps(lastTarget, provider, fake); + mPendingControlChanged.add(lastTarget); } - if (fakeTarget != null) { - addToControlMaps(fakeTarget, type, true /* fake */); - mPendingControlChanged.add(fakeTarget); + if (target != null) { + addToControlMaps(target, provider, fake); + mPendingControlChanged.add(target); } } private void removeFromControlMaps(@NonNull InsetsControlTarget target, - @InternalInsetsType int type, boolean fake) { - final ArrayList<Integer> array = mControlTargetTypeMap.get(target); + InsetsSourceProvider provider, boolean fake) { + final ArrayList<InsetsSourceProvider> array = mControlTargetProvidersMap.get(target); if (array == null) { return; } - array.remove((Integer) type); + array.remove(provider); if (array.isEmpty()) { - mControlTargetTypeMap.remove(target); + mControlTargetProvidersMap.remove(target); } if (fake) { - mTypeFakeControlTargetMap.remove(type); + mIdFakeControlTargetMap.remove(provider.getSource().getId()); } else { - mTypeControlTargetMap.remove(type); + mIdControlTargetMap.remove(provider.getSource().getId()); } } private void addToControlMaps(@NonNull InsetsControlTarget target, - @InternalInsetsType int type, boolean fake) { - final ArrayList<Integer> array = mControlTargetTypeMap.computeIfAbsent(target, - key -> new ArrayList<>()); - array.add(type); + InsetsSourceProvider provider, boolean fake) { + final ArrayList<InsetsSourceProvider> array = mControlTargetProvidersMap.computeIfAbsent( + target, key -> new ArrayList<>()); + array.add(provider); if (fake) { - mTypeFakeControlTargetMap.put(type, target); + mIdFakeControlTargetMap.put(provider.getSource().getId(), target); } else { - mTypeControlTargetMap.put(type, target); + mIdControlTargetMap.put(provider.getSource().getId(), target); } } @@ -351,7 +348,7 @@ class InsetsStateController { for (int i = mPendingControlChanged.size() - 1; i >= 0; i--) { final InsetsControlTarget controlTarget = mPendingControlChanged.valueAt(i); controlTarget.notifyInsetsControlChanged(); - if (mControlTargetTypeMap.containsKey(controlTarget)) { + if (mControlTargetProvidersMap.containsKey(controlTarget)) { // We only collect targets who get controls, not lose controls. newControlTargets.add(controlTarget); } @@ -377,10 +374,25 @@ class InsetsStateController { prefix = prefix + " "; mState.dump(prefix, pw); pw.println(prefix + "Control map:"); - for (int i = mTypeControlTargetMap.size() - 1; i >= 0; i--) { + for (int i = mControlTargetProvidersMap.size() - 1; i >= 0; i--) { + final InsetsControlTarget controlTarget = mControlTargetProvidersMap.keyAt(i); pw.print(prefix + " "); - pw.println(InsetsState.typeToString(mTypeControlTargetMap.keyAt(i)) + " -> " - + mTypeControlTargetMap.valueAt(i)); + pw.print(controlTarget); + pw.println(":"); + final ArrayList<InsetsSourceProvider> providers = mControlTargetProvidersMap.valueAt(i); + for (int j = providers.size() - 1; j >= 0; j--) { + final InsetsSourceProvider provider = providers.get(j); + if (provider != null) { + pw.print(prefix + " "); + if (controlTarget == provider.getFakeControlTarget()) { + pw.print("(fake) "); + } + pw.println(provider.getControl(controlTarget)); + } + } + } + if (mControlTargetProvidersMap.isEmpty()) { + pw.print(prefix + " none"); } pw.println(prefix + "InsetsSourceProviders:"); for (int i = mProviders.size() - 1; i >= 0; i--) { diff --git a/services/core/java/com/android/server/wm/RefreshRatePolicy.java b/services/core/java/com/android/server/wm/RefreshRatePolicy.java index f952adbb5d21..99831d3f6e48 100644 --- a/services/core/java/com/android/server/wm/RefreshRatePolicy.java +++ b/services/core/java/com/android/server/wm/RefreshRatePolicy.java @@ -19,9 +19,6 @@ package com.android.server.wm; import static android.hardware.display.DisplayManager.SWITCHING_TYPE_NONE; import static android.hardware.display.DisplayManager.SWITCHING_TYPE_RENDER_FRAME_RATE_ONLY; -import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; -import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION; - import android.hardware.display.DisplayManager; import android.view.Display; import android.view.Display.Mode; @@ -140,7 +137,7 @@ class RefreshRatePolicy { // to run in default refresh rate. But if the display size of default mode is different // from the using preferred mode, then still keep the preferred mode to avoid disturbing // the animation. - if (w.isAnimating(TRANSITION | PARENTS)) { + if (w.isAnimationRunningSelfOrParent()) { Display.Mode preferredMode = null; for (Display.Mode mode : mDisplayInfo.supportedModes) { if (preferredDisplayModeId == mode.getModeId()) { @@ -254,7 +251,7 @@ class RefreshRatePolicy { // If app is animating, it's not able to control refresh rate because we want the animation // to run in default refresh rate. - if (w.isAnimating(TRANSITION | PARENTS)) { + if (w.isAnimationRunningSelfOrParent()) { return w.mFrameRateVote.reset(); } @@ -293,7 +290,7 @@ class RefreshRatePolicy { float getPreferredMinRefreshRate(WindowState w) { // If app is animating, it's not able to control refresh rate because we want the animation // to run in default refresh rate. - if (w.isAnimating(TRANSITION | PARENTS)) { + if (w.isAnimationRunningSelfOrParent()) { return 0; } @@ -316,7 +313,7 @@ class RefreshRatePolicy { float getPreferredMaxRefreshRate(WindowState w) { // If app is animating, it's not able to control refresh rate because we want the animation // to run in default refresh rate. - if (w.isAnimating(TRANSITION | PARENTS)) { + if (w.isAnimationRunningSelfOrParent()) { return 0; } diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java index ca86db9e4f7c..408ea6eb8c1a 100644 --- a/services/core/java/com/android/server/wm/SurfaceAnimator.java +++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java @@ -565,6 +565,11 @@ class SurfaceAnimator { public static final int ANIMATION_TYPE_STARTING_REVEAL = 1 << 7; /** + * Animation when a back gesture animation is applied to a window container. + * @hide + */ + public static final int ANIMATION_TYPE_PREDICT_BACK = 1 << 8; + /** * Bitmask to include all animation types. This is NOT an {@link AnimationType} * @hide */ @@ -583,7 +588,8 @@ class SurfaceAnimator { ANIMATION_TYPE_WINDOW_ANIMATION, ANIMATION_TYPE_INSETS_CONTROL, ANIMATION_TYPE_TOKEN_TRANSFORM, - ANIMATION_TYPE_STARTING_REVEAL + ANIMATION_TYPE_STARTING_REVEAL, + ANIMATION_TYPE_PREDICT_BACK }) @Retention(RetentionPolicy.SOURCE) @interface AnimationType {} @@ -602,6 +608,7 @@ class SurfaceAnimator { case ANIMATION_TYPE_INSETS_CONTROL: return "insets_animation"; case ANIMATION_TYPE_TOKEN_TRANSFORM: return "token_transform"; case ANIMATION_TYPE_STARTING_REVEAL: return "starting_reveal"; + case ANIMATION_TYPE_PREDICT_BACK: return "predict_back"; default: return "unknown type:" + type; } } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index ee11f685af73..1e53cc34daac 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -149,7 +149,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.res.Configuration; -import android.graphics.Insets; import android.graphics.Matrix; import android.graphics.Point; import android.graphics.Rect; @@ -171,6 +170,7 @@ import android.util.DisplayMetrics; import android.util.Slog; import android.util.proto.ProtoOutputStream; import android.view.DisplayInfo; +import android.view.InsetsSource; import android.view.InsetsState; import android.view.RemoteAnimationAdapter; import android.view.Surface; @@ -2833,14 +2833,13 @@ class Task extends TaskFragment { void adjustAnimationBoundsForTransition(Rect animationBounds) { TaskTransitionSpec spec = mWmService.mTaskTransitionSpec; if (spec != null) { - for (@InsetsState.InternalInsetsType int insetType : spec.animationBoundInsets) { - WindowContainerInsetsSourceProvider insetProvider = getDisplayContent() - .getInsetsStateController() - .getSourceProvider(insetType); - - Insets insets = insetProvider.getSource().calculateVisibleInsets( - animationBounds); - animationBounds.inset(insets); + final InsetsState state = + getDisplayContent().getInsetsStateController().getRawInsetsState(); + for (int id : spec.animationBoundInsets) { + final InsetsSource source = state.peekSource(id); + if (source != null) { + animationBounds.inset(source.calculateVisibleInsets(animationBounds)); + } } } } diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java index 8570db275a08..3a30e4b0cf1f 100644 --- a/services/core/java/com/android/server/wm/TaskOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java @@ -722,6 +722,14 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { return true; } + boolean isSupportWindowlessStartingSurface() { + // Enable after ag/20426257 + final ITaskOrganizer lastOrganizer = mTaskOrganizers.peekLast(); + if (lastOrganizer == null) { + return false; + } + return false; + } /** * Notify the shell ({@link com.android.wm.shell.ShellTaskOrganizer} that the client has * removed the splash screen view. diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 04a276185563..8b90eeddd6b5 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -92,6 +92,7 @@ import com.android.internal.protolog.ProtoLogGroup; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.function.pooled.PooledLambda; import com.android.server.inputmethod.InputMethodManagerInternal; +import com.android.server.statusbar.StatusBarManagerInternal; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -1136,6 +1137,11 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { // client, we should finish and apply it here so the transactions aren't lost. postCleanupOnFailure(); } + final AccessibilityController accessibilityController = + dc.mWmService.mAccessibilityController; + if (accessibilityController.hasCallbacks()) { + accessibilityController.onWMTransition(dc.getDisplayId(), mType); + } } else { // No player registered or it's not enabled, so just finish/apply immediately if (!mIsPlayerEnabled) { @@ -1205,6 +1211,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { } } + // TODO(b/188595497): Remove after migrating to shell. /** @see RecentsAnimationController#attachNavigationBarToApp */ private void handleLegacyRecentsStartBehavior(DisplayContent dc, TransitionInfo info) { if ((mFlags & TRANSIT_FLAG_IS_RECENTS) == 0) { @@ -1285,8 +1292,9 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { // Place the nav bar on top of anything else in the top activity. t.setLayer(navSurfaceControl, Integer.MAX_VALUE); } - if (mController.mStatusBar != null) { - mController.mStatusBar.setNavigationBarLumaSamplingEnabled(mRecentsDisplayId, false); + final StatusBarManagerInternal bar = dc.getDisplayPolicy().getStatusBarManagerInternal(); + if (bar != null) { + bar.setNavigationBarLumaSamplingEnabled(mRecentsDisplayId, false); } } @@ -1300,12 +1308,12 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { mRecentsDisplayId = DEFAULT_DISPLAY; } - if (mController.mStatusBar != null) { - mController.mStatusBar.setNavigationBarLumaSamplingEnabled(mRecentsDisplayId, true); - } - final DisplayContent dc = mController.mAtm.mRootWindowContainer.getDisplayContent(mRecentsDisplayId); + final StatusBarManagerInternal bar = dc.getDisplayPolicy().getStatusBarManagerInternal(); + if (bar != null) { + bar.setNavigationBarLumaSamplingEnabled(mRecentsDisplayId, true); + } final WindowState navWindow = dc.getDisplayPolicy().getNavigationBar(); if (navWindow == null) return; navWindow.setSurfaceTranslationY(0); diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java index 2c23b5de403f..1102e6a95e3d 100644 --- a/services/core/java/com/android/server/wm/TransitionController.java +++ b/services/core/java/com/android/server/wm/TransitionController.java @@ -55,8 +55,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.ProtoLogGroup; import com.android.internal.protolog.common.ProtoLog; import com.android.server.FgThread; -import com.android.server.LocalServices; -import com.android.server.statusbar.StatusBarManagerInternal; import java.util.ArrayList; import java.util.function.LongConsumer; @@ -88,12 +86,12 @@ class TransitionController { private ITransitionPlayer mTransitionPlayer; final TransitionMetricsReporter mTransitionMetricsReporter = new TransitionMetricsReporter(); - final TransitionTracer mTransitionTracer; private WindowProcessController mTransitionPlayerProc; final ActivityTaskManagerService mAtm; - final TaskSnapshotController mTaskSnapshotController; final RemotePlayer mRemotePlayer; + TaskSnapshotController mTaskSnapshotController; + TransitionTracer mTransitionTracer; private final ArrayList<WindowManagerInternal.AppTransitionListener> mLegacyListeners = new ArrayList<>(); @@ -111,9 +109,6 @@ class TransitionController { /** The transition currently being constructed (collecting participants). */ private Transition mCollectingTransition = null; - // TODO(b/188595497): remove when not needed. - final StatusBarManagerInternal mStatusBar; - /** * `true` when building surface layer order for the finish transaction. We want to prevent * wm from touching z-order of surfaces during transitions, but we still need to be able to @@ -133,14 +128,9 @@ class TransitionController { */ boolean mIsWaitingForDisplayEnabled = false; - TransitionController(ActivityTaskManagerService atm, - TaskSnapshotController taskSnapshotController, - TransitionTracer transitionTracer) { + TransitionController(ActivityTaskManagerService atm) { mAtm = atm; mRemotePlayer = new RemotePlayer(atm); - mStatusBar = LocalServices.getService(StatusBarManagerInternal.class); - mTaskSnapshotController = taskSnapshotController; - mTransitionTracer = transitionTracer; mTransitionPlayerDeath = () -> { synchronized (mAtm.mGlobalLock) { detachPlayer(); @@ -148,6 +138,13 @@ class TransitionController { }; } + void setWindowManager(WindowManagerService wms) { + mTaskSnapshotController = wms.mTaskSnapshotController; + mTransitionTracer = wms.mTransitionTracer; + mIsWaitingForDisplayEnabled = !wms.mDisplayEnabled; + registerLegacyListener(wms.mActivityManagerAppTransitionNotifier); + } + private void detachPlayer() { if (mTransitionPlayer == null) return; // Clean-up/finish any playing transitions. diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index b06bdb10c7dd..71739807290d 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -170,9 +170,9 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< protected InsetsSourceProvider mControllableInsetProvider; /** - * The insets sources provided by this windowContainer. + * The {@link InsetsSourceProvider}s provided by this window container. */ - protected SparseArray<InsetsSource> mProvidedInsetsSources = null; + protected SparseArray<InsetsSourceProvider> mInsetsSourceProviders = null; // List of children for this window container. List is in z-order as the children appear on // screen with the top-most window container at the tail of the list. @@ -366,7 +366,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< * {@link WindowState#mMergedLocalInsetsSources} by visiting the entire hierarchy. * * {@link WindowState#mAboveInsetsState} is updated by visiting all the windows in z-order - * top-to-bottom manner and considering the {@link WindowContainer#mProvidedInsetsSources} + * top-to-bottom manner and considering the {@link WindowContainer#mInsetsSourceProviders} * provided by the {@link WindowState}s at the top. * {@link WindowState#updateAboveInsetsState(InsetsState, SparseArray, ArraySet)} visits the * IME container in the correct order to make sure the IME insets are passed correctly to the @@ -1035,11 +1035,21 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< } } - public SparseArray<InsetsSource> getProvidedInsetsSources() { - if (mProvidedInsetsSources == null) { - mProvidedInsetsSources = new SparseArray<>(); + /** + * Returns {@code true} if this node provides insets. + */ + public boolean hasInsetsSourceProvider() { + return mInsetsSourceProviders != null; + } + + /** + * Returns {@link InsetsSourceProvider}s provided by this node. + */ + public SparseArray<InsetsSourceProvider> getInsetsSourceProviders() { + if (mInsetsSourceProviders == null) { + mInsetsSourceProviders = new SparseArray<>(); } - return mProvidedInsetsSources; + return mInsetsSourceProviders; } public DisplayContent getDisplayContent() { @@ -4102,13 +4112,13 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< } } - private void hideInsetSourceViewOverflows(Set<Integer> insetTypes) { - final ArrayList<SurfaceControl> surfaceControls = - new ArrayList<>(insetTypes.size()); - - for (int insetType : insetTypes) { - WindowContainerInsetsSourceProvider insetProvider = getDisplayContent() - .getInsetsStateController().getSourceProvider(insetType); + private void hideInsetSourceViewOverflows(Set<Integer> sourceIds) { + final InsetsStateController controller = getDisplayContent().getInsetsStateController(); + for (int id : sourceIds) { + final InsetsSourceProvider insetProvider = controller.peekSourceProvider(id); + if (insetProvider == null) { + return; + } // Will apply it immediately to current leash and to all future inset animations // until we disable it. diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 73e417e5ce9f..296b0130856b 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -146,7 +146,8 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub final DisplayAreaOrganizerController mDisplayAreaOrganizerController; final TaskFragmentOrganizerController mTaskFragmentOrganizerController; - TransitionController mTransitionController; + final TransitionController mTransitionController; + /** * A Map which manages the relationship between * {@link TaskFragmentCreationParams#getFragmentToken()} and {@link TaskFragment} @@ -163,13 +164,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub mTaskOrganizerController = new TaskOrganizerController(mService); mDisplayAreaOrganizerController = new DisplayAreaOrganizerController(mService); mTaskFragmentOrganizerController = new TaskFragmentOrganizerController(atm, this); - } - - void setWindowManager(WindowManagerService wms) { - mTransitionController = new TransitionController(mService, wms.mTaskSnapshotController, - wms.mTransitionTracer); - mTransitionController.mIsWaitingForDisplayEnabled = !wms.mDisplayEnabled; - mTransitionController.registerLegacyListener(wms.mActivityManagerAppTransitionNotifier); + mTransitionController = new TransitionController(atm); } TransitionController getTransitionController() { diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 7b880fef276a..d8ac0ffb2d3b 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1392,15 +1392,18 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } void updateSourceFrame(Rect winFrame) { + if (!hasInsetsSourceProvider()) { + // This window doesn't provide any insets. + return; + } if (mGivenInsetsPending) { // The given insets are pending, and they are not reliable for now. The source frame // should be updated after the new given insets are sent to window manager. return; } - final SparseArray<InsetsSource> providedSources = getProvidedInsetsSources(); - final InsetsStateController controller = getDisplayContent().getInsetsStateController(); - for (int i = providedSources.size() - 1; i >= 0; i--) { - controller.getSourceProvider(providedSources.keyAt(i)).updateSourceFrame(winFrame); + final SparseArray<InsetsSourceProvider> providers = getInsetsSourceProviders(); + for (int i = providers.size() - 1; i >= 0; i--) { + providers.valueAt(i).updateSourceFrame(winFrame); } } @@ -1879,11 +1882,11 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } boolean providesNonDecorInsets() { - if (mProvidedInsetsSources == null) { + if (mInsetsSourceProviders == null) { return false; } - for (int i = mProvidedInsetsSources.size() - 1; i >= 0; i--) { - final InsetsSource source = mProvidedInsetsSources.valueAt(i); + for (int i = mInsetsSourceProviders.size() - 1; i >= 0; i--) { + final InsetsSource source = mInsetsSourceProviders.valueAt(i).getSource(); if (source.getType() == WindowInsets.Type.navigationBars()) { return true; } @@ -2081,7 +2084,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP final ActivityRecord atoken = mActivityRecord; return isDrawn() && isVisibleByPolicy() && ((!isParentWindowHidden() && (atoken == null || atoken.isVisibleRequested())) - || isAnimating(TRANSITION | PARENTS)); + || isAnimationRunningSelfOrParent()); } /** @@ -2324,7 +2327,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP boolean isObscuringDisplay() { Task task = getTask(); - if (task != null && task.getRootTask() != null && !task.getRootTask().fillsParent()) { + if (task != null && !task.fillsParent()) { return false; } return isOpaqueDrawn() && fillsDisplay(); @@ -2589,7 +2592,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } } final boolean isAnimating = allowExitAnimation - && (mAnimatingExit || isExitAnimationRunningSelfOrParent()); + && (mAnimatingExit || isAnimationRunningSelfOrParent()); final boolean lastWindowIsStartingWindow = startingWindow && mActivityRecord != null && mActivityRecord.isLastWindow(this); // We delay the removal of a window if it has a showing surface that can be used to run @@ -4840,10 +4843,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP insetsChangedWindows.add(w); } - final SparseArray<InsetsSource> providedSources = w.mProvidedInsetsSources; - if (providedSources != null) { - for (int i = providedSources.size() - 1; i >= 0; i--) { - aboveInsetsState.addSource(providedSources.valueAt(i)); + final SparseArray<InsetsSourceProvider> providers = w.mInsetsSourceProviders; + if (providers != null) { + for (int i = providers.size() - 1; i >= 0; i--) { + aboveInsetsState.addSource(providers.valueAt(i).getSource()); } } }, true /* traverseTopToBottom */); @@ -4986,7 +4989,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return false; } - boolean isExitAnimationRunningSelfOrParent() { + boolean isAnimationRunningSelfOrParent() { return inTransitionSelfOrParent() || isAnimating(0 /* flags */, ANIMATION_TYPE_WINDOW_ANIMATION); } @@ -5002,7 +5005,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return true; } // Exit animation is running. - if (isExitAnimationRunningSelfOrParent()) { + if (isAnimationRunningSelfOrParent()) { ProtoLog.d(WM_DEBUG_APP_TRANSITIONS, "shouldWaitAnimatingExit: isAnimating: %s", this); return false; diff --git a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java index be60946dc655..447c67fa44f8 100644 --- a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java @@ -23,6 +23,7 @@ import android.credentials.ClearCredentialStateRequest; import android.credentials.IClearCredentialStateCallback; import android.credentials.ui.ProviderData; import android.credentials.ui.RequestInfo; +import android.os.CancellationSignal; import android.os.RemoteException; import android.service.credentials.CallingAppInfo; import android.service.credentials.CredentialProviderInfo; @@ -41,9 +42,9 @@ public final class ClearRequestSession extends RequestSession<ClearCredentialSta public ClearRequestSession(Context context, int userId, int callingUid, IClearCredentialStateCallback callback, ClearCredentialStateRequest request, - CallingAppInfo callingAppInfo) { + CallingAppInfo callingAppInfo, CancellationSignal cancellationSignal) { super(context, userId, callingUid, request, callback, RequestInfo.TYPE_UNDEFINED, - callingAppInfo); + callingAppInfo, cancellationSignal); } /** @@ -111,6 +112,12 @@ public final class ClearRequestSession extends RequestSession<ClearCredentialSta private void respondToClientWithResponseAndFinish() { Log.i(TAG, "respondToClientWithResponseAndFinish"); + if (isSessionCancelled()) { + // TODO: Differentiate btw cancelled and false + logApiCalled(RequestType.CLEAR_CREDENTIALS, /* isSuccessful */ true); + finishSession(/*propagateCancellation=*/true); + return; + } try { mClientCallback.onSuccess(); logApiCalled(RequestType.CLEAR_CREDENTIALS, /* isSuccessful */ true); @@ -118,18 +125,24 @@ public final class ClearRequestSession extends RequestSession<ClearCredentialSta Log.i(TAG, "Issue while propagating the response to the client"); logApiCalled(RequestType.CLEAR_CREDENTIALS, /* isSuccessful */ false); } - finishSession(); + finishSession(/*propagateCancellation=*/false); } private void respondToClientWithErrorAndFinish(String errorType, String errorMsg) { Log.i(TAG, "respondToClientWithErrorAndFinish"); + if (isSessionCancelled()) { + // TODO: Differentiate btw cancelled and false + logApiCalled(RequestType.CLEAR_CREDENTIALS, /* isSuccessful */ true); + finishSession(/*propagateCancellation=*/true); + return; + } try { mClientCallback.onError(errorType, errorMsg); } catch (RemoteException e) { e.printStackTrace(); } logApiCalled(RequestType.CLEAR_CREDENTIALS, /* isSuccessful */ false); - finishSession(); + finishSession(/*propagateCancellation=*/false); } private void processResponses() { diff --git a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java index 351afb9b91d3..2345e3f5a3f0 100644 --- a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java @@ -27,6 +27,7 @@ import android.credentials.CredentialManager; import android.credentials.ICreateCredentialCallback; import android.credentials.ui.ProviderData; import android.credentials.ui.RequestInfo; +import android.os.CancellationSignal; import android.os.RemoteException; import android.service.credentials.CallingAppInfo; import android.service.credentials.CredentialProviderInfo; @@ -47,9 +48,10 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR CreateRequestSession(@NonNull Context context, int userId, int callingUid, CreateCredentialRequest request, ICreateCredentialCallback callback, - CallingAppInfo callingAppInfo) { + CallingAppInfo callingAppInfo, + CancellationSignal cancellationSignal) { super(context, userId, callingUid, request, callback, RequestInfo.TYPE_CREATE, - callingAppInfo); + callingAppInfo, cancellationSignal); } /** @@ -119,6 +121,12 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR private void respondToClientWithResponseAndFinish(CreateCredentialResponse response) { Log.i(TAG, "respondToClientWithResponseAndFinish"); + if (isSessionCancelled()) { + // TODO: Differentiate btw cancelled and false + logApiCalled(RequestType.CREATE_CREDENTIALS, /* isSuccessful */ true); + finishSession(/*propagateCancellation=*/true); + return; + } try { mClientCallback.onResponse(response); logApiCalled(RequestType.CREATE_CREDENTIALS, /* isSuccessful */ true); @@ -126,18 +134,24 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR Log.i(TAG, "Issue while responding to client: " + e.getMessage()); logApiCalled(RequestType.CREATE_CREDENTIALS, /* isSuccessful */ false); } - finishSession(); + finishSession(/*propagateCancellation=*/false); } private void respondToClientWithErrorAndFinish(String errorType, String errorMsg) { Log.i(TAG, "respondToClientWithErrorAndFinish"); + if (isSessionCancelled()) { + // TODO: Differentiate btw cancelled and false + logApiCalled(RequestType.CREATE_CREDENTIALS, /* isSuccessful */ true); + finishSession(/*propagateCancellation=*/true); + return; + } try { mClientCallback.onError(errorType, errorMsg); } catch (RemoteException e) { Log.i(TAG, "Issue while responding to client: " + e.getMessage()); } logApiCalled(RequestType.CREATE_CREDENTIALS, /* isSuccessful */ false); - finishSession(); + finishSession(/*propagateCancellation=*/false); } @Override diff --git a/services/credentials/java/com/android/server/credentials/CredentialDescriptionRegistry.java b/services/credentials/java/com/android/server/credentials/CredentialDescriptionRegistry.java index fbdcc441a419..3d504efd1797 100644 --- a/services/credentials/java/com/android/server/credentials/CredentialDescriptionRegistry.java +++ b/services/credentials/java/com/android/server/credentials/CredentialDescriptionRegistry.java @@ -19,35 +19,72 @@ package com.android.server.credentials; import android.credentials.CredentialDescription; import android.credentials.RegisterCredentialDescriptionRequest; import android.credentials.UnregisterCredentialDescriptionRequest; +import android.service.credentials.CredentialEntry; import android.util.SparseArray; +import com.android.internal.annotations.GuardedBy; + import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.locks.ReentrantLock; /** Contains information on what CredentialProvider has what provisioned Credential. */ -public class CredentialDescriptionRegistry { +public final class CredentialDescriptionRegistry { private static final int MAX_ALLOWED_CREDENTIAL_DESCRIPTIONS = 128; private static final int MAX_ALLOWED_ENTRIES_PER_PROVIDER = 16; - private static SparseArray<CredentialDescriptionRegistry> sCredentialDescriptionSessionPerUser; + @GuardedBy("sLock") + private static final SparseArray<CredentialDescriptionRegistry> + sCredentialDescriptionSessionPerUser; + private static final ReentrantLock sLock; static { sCredentialDescriptionSessionPerUser = new SparseArray<>(); + sLock = new ReentrantLock(); + } + + /** Represents the results of a given query into the registry. */ + public static final class FilterResult { + final String mPackageName; + final List<CredentialEntry> mCredentialEntries; + + private FilterResult(String packageName, + List<CredentialEntry> credentialEntries) { + mPackageName = packageName; + mCredentialEntries = credentialEntries; + } } - // TODO(b/265992655): add a way to update CredentialRegistry when a user is removed. /** Get and/or create a {@link CredentialDescription} for the given user id. */ + @GuardedBy("sLock") public static CredentialDescriptionRegistry forUser(int userId) { - CredentialDescriptionRegistry session = - sCredentialDescriptionSessionPerUser.get(userId, null); + sLock.lock(); + try { + CredentialDescriptionRegistry session = + sCredentialDescriptionSessionPerUser.get(userId, null); + + if (session == null) { + session = new CredentialDescriptionRegistry(); + sCredentialDescriptionSessionPerUser.put(userId, session); + } + return session; + } finally { + sLock.unlock(); + } + } - if (session == null) { - session = new CredentialDescriptionRegistry(); - sCredentialDescriptionSessionPerUser.put(userId, session); + /** Clears an existing session for a given user identifier. */ + @GuardedBy("sLock") + public static void clearUserSession(int userId) { + sLock.lock(); + try { + sCredentialDescriptionSessionPerUser.remove(userId); + } finally { + sLock.unlock(); } - return session; } private Map<String, Set<CredentialDescription>> mCredentialDescriptions; @@ -74,7 +111,7 @@ public class CredentialDescriptionRegistry { int size = mCredentialDescriptions.get(callingPackageName).size(); mCredentialDescriptions.get(callingPackageName) .addAll(descriptions); - mTotalDescriptionCount += size - mCredentialDescriptions.get(callingPackageName).size(); + mTotalDescriptionCount += mCredentialDescriptions.get(callingPackageName).size() - size; } } @@ -93,21 +130,33 @@ public class CredentialDescriptionRegistry { } } - /** Returns package names of CredentialProviders that can satisfy a given + /** Returns package names and entries of a CredentialProviders that can satisfy a given * {@link CredentialDescription}. */ - public Set<String> filterCredentials(String flatRequestString) { + public Set<FilterResult> getFilteredResultForProvider(String packageName, + List<String> flatRequestStrings) { + Set<FilterResult> result = new HashSet<>(); + Set<CredentialDescription> currentSet = mCredentialDescriptions.get(packageName); + for (CredentialDescription containedDescription: currentSet) { + if (flatRequestStrings.contains(containedDescription.getFlattenedRequestString())) { + result.add(new FilterResult(packageName, containedDescription + .getCredentialEntries())); + } + } + return result; + } + /** Returns package names of CredentialProviders that can satisfy a given + * {@link CredentialDescription}. */ + public Set<String> getMatchingProviders(Set<String> flatRequestString) { Set<String> result = new HashSet<>(); - - for (String componentName: mCredentialDescriptions.keySet()) { - Set<CredentialDescription> currentSet = mCredentialDescriptions.get(componentName); - for (CredentialDescription containedDescription: currentSet) { - if (flatRequestString.equals(containedDescription.getFlattenedRequestString())) { - result.add(componentName); + for (String packageName: mCredentialDescriptions.keySet()) { + Set<CredentialDescription> currentSet = mCredentialDescriptions.get(packageName); + for (CredentialDescription containedDescription : currentSet) { + if (flatRequestString.contains(containedDescription.getFlattenedRequestString())) { + result.add(packageName); } } } - return result; } diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java index ff72ed7abf4d..aa5881d68df9 100644 --- a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java +++ b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java @@ -17,6 +17,7 @@ package com.android.server.credentials; import static android.content.Context.CREDENTIAL_SERVICE; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; import android.annotation.NonNull; import android.annotation.UserIdInt; @@ -61,13 +62,11 @@ import com.android.server.infra.AbstractMasterSystemService; import com.android.server.infra.SecureSettingsServiceNameResolver; import java.util.ArrayList; -import java.util.Collection; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.function.Consumer; -import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.Stream; /** * Entry point service for credential management. @@ -83,17 +82,17 @@ public final class CredentialManagerService private static final String TAG = "CredManSysService"; private static final String DEVICE_CONFIG_ENABLE_CREDENTIAL_DESC_API = "enable_credential_description_api"; + private static final String PERMISSION_DENIED_ERROR = "permission_denied"; + private static final String PERMISSION_DENIED_WRITE_SECURE_SETTINGS_ERROR = + "Caller is missing WRITE_SECURE_SETTINGS permission"; private final Context mContext; - /** - * Cache of system service list per user id. - */ + /** Cache of system service list per user id. */ @GuardedBy("mLock") private final SparseArray<List<CredentialManagerServiceImpl>> mSystemServicesCacheList = new SparseArray<>(); - public CredentialManagerService(@NonNull Context context) { super( context, @@ -111,9 +110,11 @@ public final class CredentialManagerService List<CredentialManagerServiceImpl> services = new ArrayList<>(); List<CredentialProviderInfo> credentialProviderInfos = CredentialProviderInfo.getAvailableSystemServices(mContext, resolvedUserId); - credentialProviderInfos.forEach(info -> { - services.add(new CredentialManagerServiceImpl(this, mLock, resolvedUserId, info)); - }); + credentialProviderInfos.forEach( + info -> { + services.add( + new CredentialManagerServiceImpl(this, mLock, resolvedUserId, info)); + }); return services; } @@ -176,10 +177,9 @@ public final class CredentialManagerService CredentialManagerServiceImpl serviceToBeRemoved = null; for (CredentialManagerServiceImpl service : services) { if (service != null) { - CredentialProviderInfo credentialProviderInfo = - service.getCredentialProviderInfo(); - ComponentName componentName = credentialProviderInfo.getServiceInfo() - .getComponentName(); + CredentialProviderInfo credentialProviderInfo = service.getCredentialProviderInfo(); + ComponentName componentName = + credentialProviderInfo.getServiceInfo().getComponentName(); if (packageName.equals(componentName.getPackageName())) { serviceToBeRemoved = service; removeServiceFromMultiModeSettings(componentName.flattenToString(), userId); @@ -195,8 +195,6 @@ public final class CredentialManagerService // TODO("Iterate over system services and remove if needed") } - - @GuardedBy("mLock") private List<CredentialManagerServiceImpl> getOrConstructSystemServiceListLock( int resolvedUserId) { @@ -208,6 +206,16 @@ public final class CredentialManagerService return services; } + private boolean hasWriteSecureSettingsPermission() { + final String permission = android.Manifest.permission.WRITE_SECURE_SETTINGS; + final boolean result = + mContext.checkCallingOrSelfPermission(permission) == PERMISSION_GRANTED; + if (!result) { + Slog.e(TAG, "Caller does not have WRITE_SECURE_SETTINGS permission."); + } + return result; + } + private void runForUser(@NonNull final Consumer<CredentialManagerServiceImpl> c) { final int userId = UserHandle.getCallingUserId(); final long origId = Binder.clearCallingIdentity(); @@ -225,8 +233,7 @@ public final class CredentialManagerService } @GuardedBy("mLock") - private List<CredentialManagerServiceImpl> getAllCredentialProviderServicesLocked( - int userId) { + private List<CredentialManagerServiceImpl> getAllCredentialProviderServicesLocked(int userId) { List<CredentialManagerServiceImpl> concatenatedServices = new ArrayList<>(); List<CredentialManagerServiceImpl> userConfigurableServices = getServiceListForUserLocked(userId); @@ -236,6 +243,7 @@ public final class CredentialManagerService concatenatedServices.addAll(getOrConstructSystemServiceListLock(userId)); return concatenatedServices; } + public static boolean isCredentialDescriptionApiEnabled() { return DeviceConfig.getBoolean( DeviceConfig.NAMESPACE_CREDENTIAL, DEVICE_CONFIG_ENABLE_CREDENTIAL_DESC_API, false); @@ -244,44 +252,41 @@ public final class CredentialManagerService @SuppressWarnings("GuardedBy") // ErrorProne requires initiateProviderSessionForRequestLocked // to be guarded by 'service.mLock', which is the same as mLock. private List<ProviderSession> initiateProviderSessionsWithActiveContainers( - RequestSession session, - List<String> requestOptions, Set<ComponentName> activeCredentialContainers) { + GetRequestSession session, + List<String> requestOptions, + Set<String> activeCredentialContainers) { List<ProviderSession> providerSessions = new ArrayList<>(); // Invoke all services of a user to initiate a provider session - runForUser((service) -> { - if (activeCredentialContainers.contains(service.getComponentName())) { - ProviderSession providerSession = service - .initiateProviderSessionForRequestLocked(session, requestOptions); - if (providerSession != null) { - providerSessions.add(providerSession); - } - } - }); + for (String packageName : activeCredentialContainers) { + providerSessions.add( + ProviderRegistryGetSession.createNewSession( + mContext, + UserHandle.getCallingUserId(), + session, + packageName, + requestOptions)); + } return providerSessions; } @NonNull - private Set<String> getMatchingProviders(GetCredentialRequest request) { + private Set<String> getFilteredResultFromRegistry(List<CredentialOption> options) { // Session for active/provisioned credential descriptions; - CredentialDescriptionRegistry registry = CredentialDescriptionRegistry - .forUser(UserHandle.getCallingUserId()); + CredentialDescriptionRegistry registry = + CredentialDescriptionRegistry.forUser(UserHandle.getCallingUserId()); // All requested credential descriptions based on the given request. Set<String> requestedCredentialDescriptions = - request.getCredentialOptions().stream().map( - credentialOption -> credentialOption - .getCredentialRetrievalData() - .getString(CredentialOption - .FLATTENED_REQUEST)) + options.stream() + .map( + getCredentialOption -> + getCredentialOption + .getCredentialRetrievalData() + .getString(CredentialOption.FLATTENED_REQUEST)) .collect(Collectors.toSet()); // All requested credential descriptions based on the given request. - return requestedCredentialDescriptions.stream() - .map(registry::filterCredentials) - .flatMap( - (Function<Set<String>, Stream<String>>) - Collection::stream) - .collect(Collectors.toSet()); + return registry.getMatchingProviders(requestedCredentialDescriptions); } @SuppressWarnings("GuardedBy") // ErrorProne requires initiateProviderSessionForRequestLocked @@ -304,13 +309,24 @@ public final class CredentialManagerService return providerSessions; } + @Override + @GuardedBy("CredentialDescriptionRegistry.sLock") + public void onUserStopped(@NonNull TargetUser user) { + super.onUserStopped(user); + CredentialDescriptionRegistry.clearUserSession(user.getUserIdentifier()); + } + private CallingAppInfo constructCallingAppInfo(String packageName, int userId) { final PackageInfo packageInfo; try { - packageInfo = getContext().getPackageManager().getPackageInfoAsUser( - packageName, - PackageManager.PackageInfoFlags.of(PackageManager.GET_SIGNING_CERTIFICATES), - userId); + packageInfo = + getContext() + .getPackageManager() + .getPackageInfoAsUser( + packageName, + PackageManager.PackageInfoFlags.of( + PackageManager.GET_SIGNING_CERTIFICATES), + userId); } catch (PackageManager.NameNotFoundException e) { Log.i(TAG, "Issue while retrieving signatureInfo : " + e.getMessage()); return new CallingAppInfo(packageName, null); @@ -338,19 +354,78 @@ public final class CredentialManagerService callingUid, callback, request, - constructCallingAppInfo(callingPackage, userId)); - - // Initiate all provider sessions - List<ProviderSession> providerSessions = - initiateProviderSessions( - session, - request.getCredentialOptions().stream() - .map(CredentialOption::getType) - .collect(Collectors.toList())); + constructCallingAppInfo(callingPackage, userId), + CancellationSignal.fromTransport(cancelTransport)); + + List<ProviderSession> providerSessions; + + if (isCredentialDescriptionApiEnabled()) { + List<CredentialOption> optionsThatRequireActiveCredentials = + request.getCredentialOptions().stream() + .filter( + getCredentialOption -> + !TextUtils.isEmpty( + getCredentialOption + .getCredentialRetrievalData() + .getString( + CredentialOption + .FLATTENED_REQUEST, + null))) + .toList(); + + List<CredentialOption> optionsThatDoNotRequireActiveCredentials = + request.getCredentialOptions().stream() + .filter( + getCredentialOption -> + TextUtils.isEmpty( + getCredentialOption + .getCredentialRetrievalData() + .getString( + CredentialOption + .FLATTENED_REQUEST, + null))) + .toList(); + + List<ProviderSession> sessionsWithoutRemoteService = + initiateProviderSessionsWithActiveContainers( + session, + optionsThatRequireActiveCredentials.stream() + .map( + getCredentialOption -> + getCredentialOption + .getCredentialRetrievalData() + .getString( + CredentialOption + .FLATTENED_REQUEST)) + .collect(Collectors.toList()), + getFilteredResultFromRegistry(optionsThatRequireActiveCredentials)); + + List<ProviderSession> sessionsWithRemoteService = + initiateProviderSessions( + session, + optionsThatDoNotRequireActiveCredentials.stream() + .map(CredentialOption::getType) + .collect(Collectors.toList())); + + Set<ProviderSession> all = new LinkedHashSet<>(); + all.addAll(sessionsWithRemoteService); + all.addAll(sessionsWithoutRemoteService); + + providerSessions = new ArrayList<>(all); + } else { + // Initiate all provider sessions + providerSessions = + initiateProviderSessions( + session, + request.getCredentialOptions().stream() + .map(CredentialOption::getType) + .collect(Collectors.toList())); + } if (providerSessions.isEmpty()) { try { - callback.onError(GetCredentialException.TYPE_NO_CREDENTIAL, + callback.onError( + GetCredentialException.TYPE_NO_CREDENTIAL, "No credentials available on this device."); } catch (RemoteException e) { Log.i( @@ -360,9 +435,8 @@ public final class CredentialManagerService + e.getMessage()); } } - - // Iterate over all provider sessions and invoke the request providerSessions.forEach(ProviderSession::invokeSession); + return cancelTransport; } @@ -385,7 +459,8 @@ public final class CredentialManagerService callingUid, request, callback, - constructCallingAppInfo(callingPackage, userId)); + constructCallingAppInfo(callingPackage, userId), + CancellationSignal.fromTransport(cancelTransport)); // Initiate all provider sessions List<ProviderSession> providerSessions = @@ -393,7 +468,8 @@ public final class CredentialManagerService if (providerSessions.isEmpty()) { try { - callback.onError(CreateCredentialException.TYPE_NO_CREDENTIAL, + callback.onError( + CreateCredentialException.TYPE_NO_CREDENTIAL, "No credentials available on this device."); } catch (RemoteException e) { Log.i( @@ -405,8 +481,7 @@ public final class CredentialManagerService } // Iterate over all provider sessions and invoke the request - providerSessions.forEach( - ProviderSession::invokeSession); + providerSessions.forEach(ProviderSession::invokeSession); return cancelTransport; } @@ -417,6 +492,16 @@ public final class CredentialManagerService Log.i(TAG, "listEnabledProviders"); ICancellationSignal cancelTransport = CancellationSignal.createTransport(); + if (!hasWriteSecureSettingsPermission()) { + try { + callback.onError( + PERMISSION_DENIED_ERROR, PERMISSION_DENIED_WRITE_SECURE_SETTINGS_ERROR); + } catch (RemoteException e) { + Log.e(TAG, "Issue with invoking response: " + e.getMessage()); + } + return cancelTransport; + } + List<String> enabledProviders = new ArrayList<>(); runForUser( (service) -> { @@ -439,6 +524,16 @@ public final class CredentialManagerService List<String> providers, int userId, ISetEnabledProvidersCallback callback) { Log.i(TAG, "setEnabledProviders"); + if (!hasWriteSecureSettingsPermission()) { + try { + callback.onError( + PERMISSION_DENIED_ERROR, PERMISSION_DENIED_WRITE_SECURE_SETTINGS_ERROR); + } catch (RemoteException e) { + Log.e(TAG, "Issue with invoking response: " + e.getMessage()); + } + return; + } + userId = ActivityManager.handleIncomingUser( Binder.getCallingPid(), @@ -479,6 +574,37 @@ public final class CredentialManagerService } @Override + public boolean isEnabledCredentialProviderService( + ComponentName componentName, String callingPackage) { + Log.i(TAG, "isEnabledCredentialProviderService"); + + // TODO(253157366): Check additional set of services. + final int userId = UserHandle.getCallingUserId(); + synchronized (mLock) { + final List<CredentialManagerServiceImpl> services = + getServiceListForUserLocked(userId); + for (CredentialManagerServiceImpl s : services) { + final ComponentName serviceComponentName = s.getServiceComponentName(); + + if (serviceComponentName.equals(componentName)) { + if (!s.getServicePackageName().equals(callingPackage)) { + // The component name and the package name do not match. + Log.w( + TAG, + "isEnabledCredentialProviderService: Component name does not" + + " match package name."); + return false; + } + + return true; + } + } + } + + return false; + } + + @Override public ICancellationSignal clearCredentialState( ClearCredentialStateRequest request, IClearCredentialStateCallback callback, @@ -497,7 +623,8 @@ public final class CredentialManagerService callingUid, callback, request, - constructCallingAppInfo(callingPackage, userId)); + constructCallingAppInfo(callingPackage, userId), + CancellationSignal.fromTransport(cancelTransport)); // Initiate all provider sessions // TODO: Determine if provider needs to have clear capability in their manifest @@ -506,8 +633,7 @@ public final class CredentialManagerService if (providerSessions.isEmpty()) { try { // TODO("Replace with properly defined error type") - callback.onError("UNKNOWN", "No crdentials available on this " - + "device"); + callback.onError("UNKNOWN", "No crdentials available on this " + "device"); } catch (RemoteException e) { Log.i( TAG, @@ -518,47 +644,57 @@ public final class CredentialManagerService } // Iterate over all provider sessions and invoke the request - providerSessions.forEach( - ProviderSession::invokeSession); + providerSessions.forEach(ProviderSession::invokeSession); return cancelTransport; } @Override public void registerCredentialDescription( RegisterCredentialDescriptionRequest request, String callingPackage) - throws IllegalArgumentException , NonCredentialProviderCallerException { + throws IllegalArgumentException, NonCredentialProviderCallerException { Log.i(TAG, "registerCredentialDescription"); List<CredentialProviderInfo> services = - CredentialProviderInfo.getAvailableServices(mContext, - UserHandle.getCallingUserId()); + CredentialProviderInfo.getAvailableServices( + mContext, UserHandle.getCallingUserId()); - List<String> providers = services.stream() - .map(credentialProviderInfo - -> credentialProviderInfo.getServiceInfo().packageName).toList(); + List<String> providers = + services.stream() + .map( + credentialProviderInfo -> + credentialProviderInfo.getServiceInfo().packageName) + .toList(); if (!providers.contains(callingPackage)) { throw new NonCredentialProviderCallerException(callingPackage); } - List<CredentialProviderInfo> matchingService = services.stream().filter( - credentialProviderInfo -> - credentialProviderInfo.getServiceInfo() - .packageName.equals(callingPackage)).toList(); + List<CredentialProviderInfo> matchingService = + services.stream() + .filter( + credentialProviderInfo -> + credentialProviderInfo + .getServiceInfo() + .packageName + .equals(callingPackage)) + .toList(); CredentialProviderInfo credentialProviderInfo = matchingService.get(0); - Set<String> supportedTypes = request.getCredentialDescriptions() - .stream().map(CredentialDescription::getType).filter( - credentialProviderInfo::hasCapability).collect(Collectors.toSet()); + Set<String> supportedTypes = + request.getCredentialDescriptions().stream() + .map(CredentialDescription::getType) + .filter(credentialProviderInfo::hasCapability) + .collect(Collectors.toSet()); if (supportedTypes.size() != request.getCredentialDescriptions().size()) { - throw new IllegalArgumentException("CredentialProvider does not support one or more" - + "of the registered types. Check your XML entry."); + throw new IllegalArgumentException( + "CredentialProvider does not support one or more" + + "of the registered types. Check your XML entry."); } - CredentialDescriptionRegistry session = CredentialDescriptionRegistry - .forUser(UserHandle.getCallingUserId()); + CredentialDescriptionRegistry session = + CredentialDescriptionRegistry.forUser(UserHandle.getCallingUserId()); session.executeRegisterRequest(request, callingPackage); } @@ -571,19 +707,22 @@ public final class CredentialManagerService ICancellationSignal cancelTransport = CancellationSignal.createTransport(); List<CredentialProviderInfo> services = - CredentialProviderInfo.getAvailableServices(mContext, - UserHandle.getCallingUserId()); + CredentialProviderInfo.getAvailableServices( + mContext, UserHandle.getCallingUserId()); - List<String> providers = services.stream() - .map(credentialProviderInfo - -> credentialProviderInfo.getServiceInfo().packageName).toList(); + List<String> providers = + services.stream() + .map( + credentialProviderInfo -> + credentialProviderInfo.getServiceInfo().packageName) + .toList(); if (!providers.contains(callingPackage)) { throw new NonCredentialProviderCallerException(callingPackage); } - CredentialDescriptionRegistry session = CredentialDescriptionRegistry - .forUser(UserHandle.getCallingUserId()); + CredentialDescriptionRegistry session = + CredentialDescriptionRegistry.forUser(UserHandle.getCallingUserId()); session.executeUnregisterRequest(request, callingPackage); } diff --git a/services/credentials/java/com/android/server/credentials/GetRequestSession.java b/services/credentials/java/com/android/server/credentials/GetRequestSession.java index e3a27ecebd31..e732c23ca2d9 100644 --- a/services/credentials/java/com/android/server/credentials/GetRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/GetRequestSession.java @@ -25,6 +25,7 @@ import android.credentials.GetCredentialResponse; import android.credentials.IGetCredentialCallback; import android.credentials.ui.ProviderData; import android.credentials.ui.RequestInfo; +import android.os.CancellationSignal; import android.os.RemoteException; import android.service.credentials.CallingAppInfo; import android.service.credentials.CredentialProviderInfo; @@ -43,8 +44,9 @@ public final class GetRequestSession extends RequestSession<GetCredentialRequest public GetRequestSession(Context context, int userId, int callingUid, IGetCredentialCallback callback, GetCredentialRequest request, - CallingAppInfo callingAppInfo) { - super(context, userId, callingUid, request, callback, RequestInfo.TYPE_GET, callingAppInfo); + CallingAppInfo callingAppInfo, CancellationSignal cancellationSignal) { + super(context, userId, callingUid, request, callback, RequestInfo.TYPE_GET, + callingAppInfo, cancellationSignal); } /** @@ -102,6 +104,12 @@ public final class GetRequestSession extends RequestSession<GetCredentialRequest } private void respondToClientWithResponseAndFinish(GetCredentialResponse response) { + if (isSessionCancelled()) { + // TODO: Differentiate btw cancelled and false + logApiCalled(RequestType.GET_CREDENTIALS, /* isSuccessful */ false); + finishSession(/*propagateCancellation=*/true); + return; + } try { mClientCallback.onResponse(response); logApiCalled(RequestType.GET_CREDENTIALS, /* isSuccessful */ true); @@ -109,18 +117,22 @@ public final class GetRequestSession extends RequestSession<GetCredentialRequest Log.i(TAG, "Issue while responding to client with a response : " + e.getMessage()); logApiCalled(RequestType.GET_CREDENTIALS, /* isSuccessful */ false); } - finishSession(); + finishSession(/*propagateCancellation=*/false); } private void respondToClientWithErrorAndFinish(String errorType, String errorMsg) { + if (isSessionCancelled()) { + logApiCalled(RequestType.GET_CREDENTIALS, /* isSuccessful */ false); + finishSession(/*propagateCancellation=*/true); + return; + } try { mClientCallback.onError(errorType, errorMsg); } catch (RemoteException e) { Log.i(TAG, "Issue while responding to client with error : " + e.getMessage()); - } logApiCalled(RequestType.GET_CREDENTIALS, /* isSuccessful */ false); - finishSession(); + finishSession(/*propagateCancellation=*/false); } @Override diff --git a/services/credentials/java/com/android/server/credentials/PendingIntentResultHandler.java b/services/credentials/java/com/android/server/credentials/PendingIntentResultHandler.java index c2b346fc2921..efb394d29826 100644 --- a/services/credentials/java/com/android/server/credentials/PendingIntentResultHandler.java +++ b/services/credentials/java/com/android/server/credentials/PendingIntentResultHandler.java @@ -23,8 +23,8 @@ import android.credentials.CreateCredentialResponse; import android.credentials.GetCredentialException; import android.credentials.GetCredentialResponse; import android.credentials.ui.ProviderPendingIntentResponse; +import android.service.credentials.BeginGetCredentialResponse; import android.service.credentials.CredentialProviderService; -import android.service.credentials.CredentialsResponseContent; /** * Helper class for setting up pending intent, and extracting objects from it. @@ -45,14 +45,14 @@ public class PendingIntentResultHandler { return pendingIntentResponse.getResultCode() == Activity.RESULT_CANCELED; } - /** Extracts the {@link CredentialsResponseContent} object added to the result data. */ - public static CredentialsResponseContent extractResponseContent(Intent resultData) { + /** Extracts the {@link BeginGetCredentialResponse} object added to the result data. */ + public static BeginGetCredentialResponse extractResponseContent(Intent resultData) { if (resultData == null) { return null; } return resultData.getParcelableExtra( - CredentialProviderService.EXTRA_CREDENTIALS_RESPONSE_CONTENT, - CredentialsResponseContent.class); + CredentialProviderService.EXTRA_BEGIN_GET_CREDENTIAL_RESPONSE, + BeginGetCredentialResponse.class); } /** Extracts the {@link CreateCredentialResponse} object added to the result data. */ diff --git a/services/credentials/java/com/android/server/credentials/ProviderClearSession.java b/services/credentials/java/com/android/server/credentials/ProviderClearSession.java index b1126499d56f..b20f0cd0f906 100644 --- a/services/credentials/java/com/android/server/credentials/ProviderClearSession.java +++ b/services/credentials/java/com/android/server/credentials/ProviderClearSession.java @@ -118,8 +118,8 @@ public final class ProviderClearSession extends ProviderSession<ClearCredentialS @Override protected void invokeSession() { - this.mRemoteCredentialService.onClearCredentialState( - this.getProviderRequest(), - /*callback=*/this); + if (mRemoteCredentialService != null) { + mRemoteCredentialService.onClearCredentialState(mProviderRequest, this); + } } } diff --git a/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java b/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java index cc5a8ab5e729..ade40ad064ee 100644 --- a/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java +++ b/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java @@ -51,6 +51,8 @@ public final class ProviderCreateSession extends ProviderSession< // Key to be used as an entry key for a save entry private static final String SAVE_ENTRY_KEY = "save_entry_key"; + // Key to be used as an entry key for a remote entry + private static final String REMOTE_ENTRY_KEY = "remote_entry_key"; @NonNull private final Map<String, CreateEntry> mUiSaveEntries = new HashMap<>(); @@ -199,9 +201,9 @@ public final class ProviderCreateSession extends ProviderSession< @Override protected void invokeSession() { - this.mRemoteCredentialService.onCreateCredential( - this.getProviderRequest(), - /*callback=*/this); + if (mRemoteCredentialService != null) { + mRemoteCredentialService.onCreateCredential(mProviderRequest, this); + } } private List<Entry> prepareUiSaveEntries(@NonNull List<CreateEntry> saveEntries) { diff --git a/services/credentials/java/com/android/server/credentials/ProviderGetSession.java b/services/credentials/java/com/android/server/credentials/ProviderGetSession.java index dec34325bbdd..ead2acbd933b 100644 --- a/services/credentials/java/com/android/server/credentials/ProviderGetSession.java +++ b/services/credentials/java/com/android/server/credentials/ProviderGetSession.java @@ -35,7 +35,6 @@ import android.service.credentials.CallingAppInfo; import android.service.credentials.CredentialEntry; import android.service.credentials.CredentialProviderInfo; import android.service.credentials.CredentialProviderService; -import android.service.credentials.CredentialsResponseContent; import android.service.credentials.GetCredentialRequest; import android.util.Log; import android.util.Pair; @@ -59,21 +58,21 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential implements RemoteCredentialService.ProviderCallbacks<BeginGetCredentialResponse> { private static final String TAG = "ProviderGetSession"; - - // Key to be used as an entry key for a credential entry - private static final String CREDENTIAL_ENTRY_KEY = "credential_key"; - // Key to be used as the entry key for an action entry private static final String ACTION_ENTRY_KEY = "action_key"; // Key to be used as the entry key for the authentication entry private static final String AUTHENTICATION_ACTION_ENTRY_KEY = "authentication_action_key"; + // Key to be used as an entry key for a remote entry + private static final String REMOTE_ENTRY_KEY = "remote_entry_key"; + // Key to be used as an entry key for a credential entry + private static final String CREDENTIAL_ENTRY_KEY = "credential_key"; @NonNull private final Map<String, CredentialEntry> mUiCredentialEntries = new HashMap<>(); @NonNull private final Map<String, Action> mUiActionsEntries = new HashMap<>(); @Nullable - private Pair<String, Action> mUiAuthenticationAction = null; + private final Map<String, Action> mUiAuthenticationEntries = new HashMap<>(); /** The complete request to be used in the second round. */ private final android.credentials.GetCredentialRequest mCompleteRequest; @@ -108,16 +107,15 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential return new BeginGetCredentialRequest.Builder(callingAppInfo) .setBeginGetCredentialOptions( filteredRequest.getCredentialOptions().stream().map( - option -> { - return new BeginGetCredentialOption( - option.getType(), - option.getCandidateQueryData()); - }).collect(Collectors.toList())) + option -> new BeginGetCredentialOption( + option.getType(), + option.getCandidateQueryData())).collect(Collectors + .toList())) .build(); } @Nullable - private static android.credentials.GetCredentialRequest filterOptions( + protected static android.credentials.GetCredentialRequest filterOptions( List<String> providerCapabilities, android.credentials.GetCredentialRequest clientRequest ) { @@ -154,12 +152,6 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential setStatus(Status.PENDING); } - /** Returns the credential entry maintained in state by this provider session. */ - @Nullable - public CredentialEntry getCredentialEntry(@NonNull String entryId) { - return mUiCredentialEntries.get(entryId); - } - /** Called when the provider response has been updated by an external source. */ @Override // Callback from the remote provider public void onProviderResponseSuccess(@Nullable BeginGetCredentialResponse response) { @@ -210,12 +202,13 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential onActionEntrySelected(providerPendingIntentResponse); break; case AUTHENTICATION_ACTION_ENTRY_KEY: - if (mUiAuthenticationAction.first.equals(entryKey)) { - onAuthenticationEntrySelected(providerPendingIntentResponse); - } else { - Log.i(TAG, "Unexpected authentication entry key"); + Action authenticationEntry = mUiAuthenticationEntries.get(entryKey); + if (authenticationEntry == null) { + Log.i(TAG, "Unexpected authenticationEntry key"); invokeCallbackOnInternalInvalidState(); + return; } + onAuthenticationEntrySelected(providerPendingIntentResponse); break; case REMOTE_ENTRY_KEY: if (mUiRemoteEntry.first.equals(entryKey)) { @@ -232,9 +225,9 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential @Override protected void invokeSession() { - this.mRemoteCredentialService.onBeginGetCredential( - this.getProviderRequest(), - /*callback=*/this); + if (mRemoteCredentialService != null) { + mRemoteCredentialService.onBeginGetCredential(mProviderRequest, this); + } } @Override // Call from request session to data to be shown on the UI @@ -249,23 +242,11 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential Log.i(TAG, "In prepareUiData response null"); throw new IllegalStateException("Response must be in completion mode"); } - if (mProviderResponse.getAuthenticationAction() != null) { - Log.i(TAG, "In prepareUiData - top level authentication mode"); - return prepareUiProviderData(null, null, - prepareUiAuthenticationAction(mProviderResponse.getAuthenticationAction()), - /*remoteEntry=*/null); - } - if (mProviderResponse.getCredentialsResponseContent() != null) { - Log.i(TAG, "In prepareUiData credentialsResponseContent not null"); - return prepareUiProviderData(prepareUiActionEntries( - mProviderResponse.getCredentialsResponseContent().getActions()), - prepareUiCredentialEntries(mProviderResponse.getCredentialsResponseContent() - .getCredentialEntries()), - /*authenticationAction=*/null, - prepareUiRemoteEntry(mProviderResponse - .getCredentialsResponseContent().getRemoteCredentialEntry())); - } - return null; + return prepareUiProviderData(prepareUiActionEntries( + mProviderResponse.getActions()), + prepareUiCredentialEntries(mProviderResponse.getCredentialEntries()), + prepareUiAuthenticationEntries(mProviderResponse.getAuthenticationActions()), + prepareUiRemoteEntry(mProviderResponse.getRemoteCredentialEntry())); } private Entry prepareUiRemoteEntry(CredentialEntry remoteCredentialEntry) { @@ -278,14 +259,19 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential return remoteEntry; } - private Entry prepareUiAuthenticationAction(@NonNull Action authenticationAction) { - String entryId = generateEntryId(); - Entry authEntry = new Entry( - AUTHENTICATION_ACTION_ENTRY_KEY, entryId, - authenticationAction.getSlice(), - setUpFillInIntentForAuthentication()); - mUiAuthenticationAction = new Pair<>(entryId, authenticationAction); - return authEntry; + private List<Entry> prepareUiAuthenticationEntries( + @NonNull List<Action> authenticationEntries) { + List<Entry> authenticationUiEntries = new ArrayList<>(); + + for (Action authenticationAction : authenticationEntries) { + String entryId = generateEntryId(); + mUiAuthenticationEntries.put(entryId, authenticationAction); + authenticationUiEntries.add(new Entry( + AUTHENTICATION_ACTION_ENTRY_KEY, entryId, + authenticationAction.getSlice(), + setUpFillInIntentForAuthentication())); + } + return authenticationUiEntries; } private List<Entry> prepareUiCredentialEntries(@NonNull @@ -340,12 +326,12 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential } private GetCredentialProviderData prepareUiProviderData(List<Entry> actionEntries, - List<Entry> credentialEntries, Entry authenticationActionEntry, + List<Entry> credentialEntries, List<Entry> authenticationActionEntries, Entry remoteEntry) { return new GetCredentialProviderData.Builder( mComponentName.flattenToString()).setActionChips(actionEntries) .setCredentialEntries(credentialEntries) - .setAuthenticationEntry(authenticationActionEntry) + .setAuthenticationEntries(authenticationActionEntries) .setRemoteEntry(remoteEntry) .build(); } @@ -379,12 +365,35 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential invokeCallbackOnInternalInvalidState(); } + @Nullable + protected GetCredentialException maybeGetPendingIntentException( + ProviderPendingIntentResponse pendingIntentResponse) { + if (pendingIntentResponse == null) { + Log.i(TAG, "pendingIntentResponse is null"); + return null; + } + if (PendingIntentResultHandler.isValidResponse(pendingIntentResponse)) { + GetCredentialException exception = PendingIntentResultHandler + .extractGetCredentialException(pendingIntentResponse.getResultData()); + if (exception != null) { + Log.i(TAG, "Pending intent contains provider exception"); + return exception; + } + } else if (PendingIntentResultHandler.isCancelledResponse(pendingIntentResponse)) { + return new GetCredentialException(GetCredentialException.TYPE_USER_CANCELED); + } else { + return new GetCredentialException(GetCredentialException.TYPE_NO_CREDENTIAL); + } + return null; + } + private void onAuthenticationEntrySelected( @Nullable ProviderPendingIntentResponse providerPendingIntentResponse) { //TODO: Other provider intent statuses if (providerPendingIntentResponse == null) { Log.i(TAG, "providerPendingIntentResponse is null"); onUpdateEmptyResponse(); + return; } GetCredentialException exception = maybeGetPendingIntentException( @@ -396,11 +405,11 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential } // Check if pending intent has the content - CredentialsResponseContent content = PendingIntentResultHandler + BeginGetCredentialResponse content = PendingIntentResultHandler .extractResponseContent(providerPendingIntentResponse .getResultData()); if (content != null) { - onUpdateResponse(BeginGetCredentialResponse.createWithResponseContent(content)); + onUpdateResponse(content); return; } @@ -417,42 +426,13 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential /** Updates the response being maintained in state by this provider session. */ private void onUpdateResponse(BeginGetCredentialResponse response) { mProviderResponse = response; - if (response.getAuthenticationAction() != null) { - Log.i(TAG , "updateResponse with authentication entry"); - updateStatusAndInvokeCallback(Status.REQUIRES_AUTHENTICATION); - } else if (response.getCredentialsResponseContent() != null) { - Log.i(TAG , "updateResponse with credentialEntries"); - // TODO validate response - updateStatusAndInvokeCallback(Status.CREDENTIALS_RECEIVED); - } + updateStatusAndInvokeCallback(Status.CREDENTIALS_RECEIVED); } private void onUpdateEmptyResponse() { updateStatusAndInvokeCallback(Status.NO_CREDENTIALS); } - @Nullable - private GetCredentialException maybeGetPendingIntentException( - ProviderPendingIntentResponse pendingIntentResponse) { - if (pendingIntentResponse == null) { - Log.i(TAG, "pendingIntentResponse is null"); - return null; - } - if (PendingIntentResultHandler.isValidResponse(pendingIntentResponse)) { - GetCredentialException exception = PendingIntentResultHandler - .extractGetCredentialException(pendingIntentResponse.getResultData()); - if (exception != null) { - Log.i(TAG, "Pending intent contains provider exception"); - return exception; - } - } else if (PendingIntentResultHandler.isCancelledResponse(pendingIntentResponse)) { - return new GetCredentialException(GetCredentialException.TYPE_USER_CANCELED); - } else { - return new GetCredentialException(GetCredentialException.TYPE_NO_CREDENTIAL); - } - return null; - } - /** * When an invalid state occurs, e.g. entry mismatch or no response from provider, * we send back a TYPE_UNKNOWN error as to the developer. diff --git a/services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java b/services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java new file mode 100644 index 000000000000..461f447fcc4a --- /dev/null +++ b/services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java @@ -0,0 +1,261 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.credentials; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.UserIdInt; +import android.content.Context; +import android.content.Intent; +import android.credentials.CredentialOption; +import android.credentials.GetCredentialException; +import android.credentials.GetCredentialRequest; +import android.credentials.GetCredentialResponse; +import android.credentials.ui.Entry; +import android.credentials.ui.GetCredentialProviderData; +import android.credentials.ui.ProviderData; +import android.credentials.ui.ProviderPendingIntentResponse; +import android.service.credentials.CallingAppInfo; +import android.service.credentials.CredentialEntry; +import android.service.credentials.CredentialProviderService; +import android.telecom.Log; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * Central provider session that utilizes {@link CredentialDescriptionRegistry} and therefor is able + * to bypass having to use a {@link RemoteCredentialService}. + * + * @hide + */ +public class ProviderRegistryGetSession extends ProviderSession<GetCredentialRequest, + Set<CredentialDescriptionRegistry.FilterResult>> { + + private static final String TAG = "ProviderRegistryGetSession"; + private static final String CREDENTIAL_ENTRY_KEY = "credential_key"; + + /** Creates a new provider session to be used by the request session. */ + @Nullable + public static ProviderRegistryGetSession createNewSession( + @NonNull Context context, + @UserIdInt int userId, + @NonNull GetRequestSession getRequestSession, + @NonNull String credentialProviderPackageName, + @NonNull List<String> requestOptions) { + return new ProviderRegistryGetSession( + context, + userId, + getRequestSession, + getRequestSession.mClientRequest, + getRequestSession.mClientAppInfo, + credentialProviderPackageName, + requestOptions); + } + + @NonNull + private final Map<String, CredentialEntry> mUiCredentialEntries = new HashMap<>(); + @NonNull + private final CredentialDescriptionRegistry mCredentialDescriptionRegistry; + @NonNull + private final CallingAppInfo mCallingAppInfo; + @NonNull + private final String mCredentialProviderPackageName; + @NonNull + private final GetRequestSession mGetRequestSession; + @NonNull + private final List<String> mRequestOptions; + private List<CredentialEntry> mCredentialEntries; + + protected ProviderRegistryGetSession(@NonNull Context context, + @NonNull int userId, + @NonNull GetRequestSession session, + @NonNull GetCredentialRequest request, + @NonNull CallingAppInfo callingAppInfo, + @NonNull String servicePackageName, + @NonNull List<String> requestOptions) { + super(context, null, request, session, userId, null); + mGetRequestSession = session; + mCredentialDescriptionRegistry = CredentialDescriptionRegistry.forUser(userId); + mCallingAppInfo = callingAppInfo; + mCredentialProviderPackageName = servicePackageName; + mRequestOptions = requestOptions; + } + + private List<Entry> prepareUiCredentialEntries( + @NonNull List<CredentialEntry> credentialEntries) { + Log.i(TAG, "in prepareUiProviderDataWithCredentials"); + List<Entry> credentialUiEntries = new ArrayList<>(); + + // Populate the credential entries + for (CredentialEntry credentialEntry : credentialEntries) { + String entryId = generateEntryId(); + mUiCredentialEntries.put(entryId, credentialEntry); + Log.i(TAG, "in prepareUiProviderData creating ui entry with id " + entryId); + credentialUiEntries.add(new Entry(CREDENTIAL_ENTRY_KEY, entryId, + credentialEntry.getSlice(), + setUpFillInIntent(credentialEntry.getType()))); + } + return credentialUiEntries; + } + + private Intent setUpFillInIntent(String type) { + Intent intent = new Intent(); + for (CredentialOption option : mProviderRequest.getCredentialOptions()) { + if (option.getType().equals(type)) { + intent.putExtra( + CredentialProviderService + .EXTRA_GET_CREDENTIAL_REQUEST, + new android.service.credentials.GetCredentialRequest( + mCallingAppInfo, option)); + return intent; + } + } + return intent; + } + + @Override + protected ProviderData prepareUiData() { + Log.i(TAG, "In prepareUiData"); + if (!ProviderSession.isUiInvokingStatus(getStatus())) { + Log.i(TAG, "In prepareUiData - provider does not want to show UI: " + + mComponentName.flattenToString()); + return null; + } + if (mProviderResponse == null) { + Log.i(TAG, "In prepareUiData response null"); + throw new IllegalStateException("Response must be in completion mode"); + } + return new GetCredentialProviderData.Builder( + mComponentName.flattenToString()).setActionChips(null) + .setCredentialEntries(prepareUiCredentialEntries( + mProviderResponse.stream().flatMap((Function<CredentialDescriptionRegistry + .FilterResult, + Stream<CredentialEntry>>) filterResult -> + filterResult.mCredentialEntries.stream()) + .collect(Collectors.toList()))) + .build(); + } + + @Override // Selection call from the request provider + protected void onUiEntrySelected(String entryType, String entryKey, + ProviderPendingIntentResponse providerPendingIntentResponse) { + switch (entryType) { + case CREDENTIAL_ENTRY_KEY: + CredentialEntry credentialEntry = mUiCredentialEntries.get(entryKey); + if (credentialEntry == null) { + Log.i(TAG, "Unexpected credential entry key"); + return; + } + onCredentialEntrySelected(credentialEntry, providerPendingIntentResponse); + break; + default: + Log.i(TAG, "Unsupported entry type selected"); + } + } + + private void onCredentialEntrySelected(CredentialEntry credentialEntry, + ProviderPendingIntentResponse providerPendingIntentResponse) { + if (!mCredentialEntries.contains(credentialEntry)) { + invokeCallbackWithError("", + ""); + } + + if (providerPendingIntentResponse != null) { + // Check if pending intent has an error + GetCredentialException exception = maybeGetPendingIntentException( + providerPendingIntentResponse); + if (exception != null) { + invokeCallbackWithError(exception.getType(), + exception.getMessage()); + return; + } + + // Check if pending intent has a credential + GetCredentialResponse getCredentialResponse = PendingIntentResultHandler + .extractGetCredentialResponse( + providerPendingIntentResponse.getResultData()); + if (getCredentialResponse != null) { + if (mCallbacks != null) { + mCallbacks.onFinalResponseReceived(mComponentName, + getCredentialResponse); + } + return; + } + + Log.i(TAG, "Pending intent response contains no credential, or error"); + } + Log.i(TAG, "CredentialEntry does not have a credential or a pending intent result"); + } + + @Override + public void onProviderResponseSuccess( + @Nullable Set<CredentialDescriptionRegistry.FilterResult> response) { + // No need to do anything since this class does not rely on a remote service. + } + + @Override + public void onProviderResponseFailure(int internalErrorCode, @Nullable Exception e) { + // No need to do anything since this class does not rely on a remote service. + } + + @Override + public void onProviderServiceDied(RemoteCredentialService service) { + // No need to do anything since this class does not rely on a remote service. + } + + @Override + protected void invokeSession() { + mProviderResponse = mCredentialDescriptionRegistry + .getFilteredResultForProvider(mCredentialProviderPackageName, + mRequestOptions); + mCredentialEntries = mProviderResponse.stream().flatMap( + (Function<CredentialDescriptionRegistry.FilterResult, + Stream<CredentialEntry>>) filterResult + -> filterResult.mCredentialEntries.stream()) + .collect(Collectors.toList()); + setStatus(Status.CREDENTIALS_RECEIVED); + } + + @Nullable + protected GetCredentialException maybeGetPendingIntentException( + ProviderPendingIntentResponse pendingIntentResponse) { + if (pendingIntentResponse == null) { + android.util.Log.i(TAG, "pendingIntentResponse is null"); + return null; + } + if (PendingIntentResultHandler.isValidResponse(pendingIntentResponse)) { + GetCredentialException exception = PendingIntentResultHandler + .extractGetCredentialException(pendingIntentResponse.getResultData()); + if (exception != null) { + android.util.Log.i(TAG, "Pending intent contains provider exception"); + return exception; + } + } else if (PendingIntentResultHandler.isCancelledResponse(pendingIntentResponse)) { + return new GetCredentialException(GetCredentialException.TYPE_USER_CANCELED); + } else { + return new GetCredentialException(GetCredentialException.TYPE_NO_CREDENTIAL); + } + return null; + } +} diff --git a/services/credentials/java/com/android/server/credentials/ProviderSession.java b/services/credentials/java/com/android/server/credentials/ProviderSession.java index 8e0d6f86a199..d6f97ff6e04d 100644 --- a/services/credentials/java/com/android/server/credentials/ProviderSession.java +++ b/services/credentials/java/com/android/server/credentials/ProviderSession.java @@ -23,8 +23,11 @@ import android.content.Context; import android.credentials.Credential; import android.credentials.ui.ProviderData; import android.credentials.ui.ProviderPendingIntentResponse; +import android.os.ICancellationSignal; +import android.os.RemoteException; import android.service.credentials.CredentialEntry; import android.service.credentials.CredentialProviderInfo; +import android.util.Log; import android.util.Pair; import java.util.UUID; @@ -38,17 +41,16 @@ public abstract class ProviderSession<T, R> implements RemoteCredentialService.ProviderCallbacks<R> { private static final String TAG = "ProviderSession"; - // Key to be used as an entry key for a remote entry - protected static final String REMOTE_ENTRY_KEY = "remote_entry_key"; @NonNull protected final Context mContext; @NonNull protected final ComponentName mComponentName; - @NonNull protected final CredentialProviderInfo mProviderInfo; - @NonNull protected final RemoteCredentialService mRemoteCredentialService; + @Nullable protected final CredentialProviderInfo mProviderInfo; + @Nullable protected final RemoteCredentialService mRemoteCredentialService; @NonNull protected final int mUserId; @NonNull protected Status mStatus = Status.NOT_STARTED; - @NonNull protected final ProviderInternalCallback mCallbacks; + @Nullable protected final ProviderInternalCallback mCallbacks; @Nullable protected Credential mFinalCredentialResponse; + @Nullable protected ICancellationSignal mProviderCancellationSignal; @NonNull protected final T mProviderRequest; @Nullable protected R mProviderResponse; @NonNull protected Boolean mProviderResponseSet = false; @@ -109,9 +111,9 @@ public abstract class ProviderSession<T, R> protected ProviderSession(@NonNull Context context, @NonNull CredentialProviderInfo info, @NonNull T providerRequest, - @NonNull ProviderInternalCallback callbacks, + @Nullable ProviderInternalCallback callbacks, @NonNull int userId, - @NonNull RemoteCredentialService remoteCredentialService) { + @Nullable RemoteCredentialService remoteCredentialService) { mContext = context; mProviderInfo = info; mProviderRequest = providerRequest; @@ -151,6 +153,18 @@ public abstract class ProviderSession<T, R> return mFinalCredentialResponse; } + /** Propagates cancellation signal to the remote provider service. */ + public void cancelProviderRemoteSession() { + try { + if (mProviderCancellationSignal != null) { + mProviderCancellationSignal.cancel(); + } + setStatus(Status.CANCELED); + } catch (RemoteException e) { + Log.i(TAG, "Issue while cancelling provider session: " + e.getMessage()); + } + } + protected void setStatus(@NonNull Status status) { mStatus = status; } @@ -165,7 +179,7 @@ public abstract class ProviderSession<T, R> return mComponentName; } - @NonNull + @Nullable protected RemoteCredentialService getRemoteCredentialService() { return mRemoteCredentialService; } diff --git a/services/credentials/java/com/android/server/credentials/RemoteCredentialService.java b/services/credentials/java/com/android/server/credentials/RemoteCredentialService.java index 8cad6acebc4a..2dea8bda78d5 100644 --- a/services/credentials/java/com/android/server/credentials/RemoteCredentialService.java +++ b/services/credentials/java/com/android/server/credentials/RemoteCredentialService.java @@ -110,7 +110,7 @@ public class RemoteCredentialService extends ServiceConnector.Impl<ICredentialPr * @param callback the callback to be used to send back the provider response to the * {@link ProviderGetSession} class that maintains provider state */ - public void onBeginGetCredential(@NonNull BeginGetCredentialRequest request, + public ICancellationSignal onBeginGetCredential(@NonNull BeginGetCredentialRequest request, ProviderCallbacks<BeginGetCredentialResponse> callback) { Log.i(TAG, "In onGetCredentials in RemoteCredentialService"); AtomicReference<ICancellationSignal> cancellationSink = new AtomicReference<>(); @@ -149,6 +149,8 @@ public class RemoteCredentialService extends ServiceConnector.Impl<ICredentialPr futureRef.set(connectThenExecute); connectThenExecute.whenComplete((result, error) -> Handler.getMain().post(() -> handleExecutionResponse(result, error, cancellationSink, callback))); + + return cancellationSink.get(); } /** Main entry point to be called for executing a beginCreateCredential call on the remote @@ -157,7 +159,7 @@ public class RemoteCredentialService extends ServiceConnector.Impl<ICredentialPr * @param callback the callback to be used to send back the provider response to the * {@link ProviderCreateSession} class that maintains provider state */ - public void onCreateCredential(@NonNull BeginCreateCredentialRequest request, + public ICancellationSignal onCreateCredential(@NonNull BeginCreateCredentialRequest request, ProviderCallbacks<BeginCreateCredentialResponse> callback) { Log.i(TAG, "In onCreateCredential in RemoteCredentialService"); AtomicReference<ICancellationSignal> cancellationSink = new AtomicReference<>(); @@ -196,6 +198,8 @@ public class RemoteCredentialService extends ServiceConnector.Impl<ICredentialPr futureRef.set(connectThenExecute); connectThenExecute.whenComplete((result, error) -> Handler.getMain().post(() -> handleExecutionResponse(result, error, cancellationSink, callback))); + + return cancellationSink.get(); } /** Main entry point to be called for executing a clearCredentialState call on the remote @@ -204,7 +208,7 @@ public class RemoteCredentialService extends ServiceConnector.Impl<ICredentialPr * @param callback the callback to be used to send back the provider response to the * {@link ProviderClearSession} class that maintains provider state */ - public void onClearCredentialState(@NonNull ClearCredentialStateRequest request, + public ICancellationSignal onClearCredentialState(@NonNull ClearCredentialStateRequest request, ProviderCallbacks<Void> callback) { Log.i(TAG, "In onClearCredentialState in RemoteCredentialService"); AtomicReference<ICancellationSignal> cancellationSink = new AtomicReference<>(); @@ -243,6 +247,8 @@ public class RemoteCredentialService extends ServiceConnector.Impl<ICredentialPr futureRef.set(connectThenExecute); connectThenExecute.whenComplete((result, error) -> Handler.getMain().post(() -> handleExecutionResponse(result, error, cancellationSink, callback))); + + return cancellationSink.get(); } private <T> void handleExecutionResponse(T result, diff --git a/services/credentials/java/com/android/server/credentials/RequestSession.java b/services/credentials/java/com/android/server/credentials/RequestSession.java index f92ffe208cf4..9f1bd8f69dde 100644 --- a/services/credentials/java/com/android/server/credentials/RequestSession.java +++ b/services/credentials/java/com/android/server/credentials/RequestSession.java @@ -29,6 +29,7 @@ import android.content.Context; import android.credentials.ui.ProviderData; import android.credentials.ui.UserSelectionDialogResult; import android.os.Binder; +import android.os.CancellationSignal; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -83,13 +84,16 @@ abstract class RequestSession<T, U> implements CredentialManagerUi.CredentialMan private final int mCallingUid; @NonNull protected final CallingAppInfo mClientAppInfo; + @NonNull + protected final CancellationSignal mCancellationSignal; protected final Map<String, ProviderSession> mProviders = new HashMap<>(); protected RequestSession(@NonNull Context context, @UserIdInt int userId, int callingUid, @NonNull T clientRequest, U clientCallback, @NonNull String requestType, - CallingAppInfo callingAppInfo) { + CallingAppInfo callingAppInfo, + CancellationSignal cancellationSignal) { mContext = context; mUserId = userId; mCallingUid = callingUid; @@ -97,6 +101,7 @@ abstract class RequestSession<T, U> implements CredentialManagerUi.CredentialMan mClientCallback = clientCallback; mRequestType = requestType; mClientAppInfo = callingAppInfo; + mCancellationSignal = cancellationSignal; mHandler = new Handler(Looper.getMainLooper(), null, true); mRequestId = new Binder(); mCredentialManagerUi = new CredentialManagerUi(mContext, @@ -112,6 +117,10 @@ abstract class RequestSession<T, U> implements CredentialManagerUi.CredentialMan @Override // from CredentialManagerUiCallbacks public void onUiSelection(UserSelectionDialogResult selection) { + if (isSessionCancelled()) { + finishSession(/*propagateCancellation=*/true); + return; + } String providerId = selection.getProviderId(); Log.i(TAG, "onUiSelection, providerId: " + providerId); ProviderSession providerSession = mProviders.get(providerId); @@ -127,18 +136,19 @@ abstract class RequestSession<T, U> implements CredentialManagerUi.CredentialMan @Override // from CredentialManagerUiCallbacks public void onUiCancellation(boolean isUserCancellation) { Log.i(TAG, "Ui canceled. Canceled by user: " + isUserCancellation); + if (isSessionCancelled()) { + finishSession(/*propagateCancellation=*/true); + return; + } // User canceled the activity - finishSession(); + finishSession(/*propagateCancellation=*/false); } - protected void finishSession() { + protected void finishSession(boolean propagateCancellation) { Log.i(TAG, "finishing session"); - clearProviderSessions(); - } - - protected void clearProviderSessions() { - Log.i(TAG, "Clearing sessions"); - //TODO: Implement + if (propagateCancellation) { + mProviders.values().forEach(ProviderSession::cancelProviderRemoteSession); + } mProviders.clear(); } @@ -178,6 +188,10 @@ abstract class RequestSession<T, U> implements CredentialManagerUi.CredentialMan isSuccessful ? METRICS_API_STATUS_SUCCESS : METRICS_API_STATUS_FAILURE); } + protected boolean isSessionCancelled() { + return mCancellationSignal.isCanceled(); + } + /** * Returns true if at least one provider is ready for UI invocation, and no * provider is pending a response. @@ -197,6 +211,11 @@ abstract class RequestSession<T, U> implements CredentialManagerUi.CredentialMan Log.i(TAG, "In getProviderDataAndInitiateUi"); Log.i(TAG, "In getProviderDataAndInitiateUi providers size: " + mProviders.size()); + if (isSessionCancelled()) { + finishSession(/*propagateCancellation=*/true); + return; + } + ArrayList<ProviderData> providerDataList = new ArrayList<>(); for (ProviderSession session : mProviders.values()) { Log.i(TAG, "preparing data for : " + session.getComponentName()); @@ -208,7 +227,11 @@ abstract class RequestSession<T, U> implements CredentialManagerUi.CredentialMan } if (!providerDataList.isEmpty()) { Log.i(TAG, "provider list not empty about to initiate ui"); - launchUiWithProviderData(providerDataList); + if (isSessionCancelled()) { + Log.i(TAG, "In getProviderDataAndInitiateUi but session has been cancelled"); + } else { + launchUiWithProviderData(providerDataList); + } } } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index c6b22077f5f9..9b26a54cc12a 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -9321,7 +9321,11 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { @Override public CharSequence getDeviceOwnerLockScreenInfo() { - return mLockPatternUtils.getDeviceOwnerInfo(); + final CallerIdentity caller = getCallerIdentity(); + Preconditions.checkCallAuthorization( + isDefaultDeviceOwner(caller) || isProfileOwnerOfOrganizationOwnedDevice(caller)); + return mInjector.binderWithCleanCallingIdentity(() -> + mLockPatternUtils.getDeviceOwnerInfo()); } private void clearUserPoliciesLocked(int userId) { diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 5c6cc9f6ecaa..cae6c39a1a10 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -427,6 +427,9 @@ public final class SystemServer implements Dumpable { "com.android.server.sdksandbox.SdkSandboxManagerService$Lifecycle"; private static final String AD_SERVICES_MANAGER_SERVICE_CLASS = "com.android.server.adservices.AdServicesManagerService$Lifecycle"; + private static final String ON_DEVICE_PERSONALIZATION_SYSTEM_SERVICE_CLASS = + "com.android.server.ondevicepersonalization." + + "OnDevicePersonalizationSystemService$Lifecycle"; private static final String UPDATABLE_DEVICE_CONFIG_SERVICE_CLASS = "com.android.server.deviceconfig.DeviceConfigInit$Lifecycle"; @@ -2619,6 +2622,11 @@ public final class SystemServer implements Dumpable { mSystemServiceManager.startService(AD_SERVICES_MANAGER_SERVICE_CLASS); t.traceEnd(); + // OnDevicePersonalizationSystemService + t.traceBegin("StartOnDevicePersonalizationSystemService"); + mSystemServiceManager.startService(ON_DEVICE_PERSONALIZATION_SYSTEM_SERVICE_CLASS); + t.traceEnd(); + if (safeMode) { mActivityManagerService.enterSafeMode(); } diff --git a/services/tests/RemoteProvisioningServiceTests/src/com/android/server/security/rkp/RemoteProvisioningRegistrationTest.java b/services/tests/RemoteProvisioningServiceTests/src/com/android/server/security/rkp/RemoteProvisioningRegistrationTest.java index 7b361d3e0832..1dcd0b936c86 100644 --- a/services/tests/RemoteProvisioningServiceTests/src/com/android/server/security/rkp/RemoteProvisioningRegistrationTest.java +++ b/services/tests/RemoteProvisioningServiceTests/src/com/android/server/security/rkp/RemoteProvisioningRegistrationTest.java @@ -23,6 +23,7 @@ import static org.mockito.AdditionalAnswers.answerVoid; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.argThat; +import static org.mockito.Mockito.contains; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.eq; @@ -39,6 +40,7 @@ import android.security.rkp.IGetKeyCallback; import android.security.rkp.IStoreUpgradedKeyCallback; import android.security.rkp.service.RegistrationProxy; import android.security.rkp.service.RemotelyProvisionedKey; +import android.security.rkp.service.RkpProxyException; import androidx.test.runner.AndroidJUnit4; @@ -48,8 +50,9 @@ import org.junit.runner.RunWith; import org.mockito.stubbing.Answer; import org.mockito.stubbing.VoidAnswer4; -import java.time.Duration; +import java.lang.reflect.Field; import java.util.Arrays; +import java.util.Map; import java.util.concurrent.Executor; /** @@ -104,7 +107,7 @@ public class RemoteProvisioningRegistrationTest { } @Test - public void getKeyHandlesError() throws Exception { + public void getKeyHandlesArbitraryException() throws Exception { Exception expectedException = new Exception("oops!"); doAnswer( answerGetKeyAsync((keyId, cancelSignal, executor, receiver) -> @@ -112,11 +115,38 @@ public class RemoteProvisioningRegistrationTest { .when(mRegistrationProxy).getKeyAsync(eq(0), any(), any(), any()); IGetKeyCallback callback = mock(IGetKeyCallback.class); mRegistration.getKey(0, callback); - verify(callback).onError(eq(expectedException.getMessage())); + verify(callback).onError(eq(IGetKeyCallback.ErrorCode.ERROR_UNKNOWN), eq("oops!")); verifyNoMoreInteractions(callback); } @Test + public void getKeyMapsRkpErrorsCorrectly() throws Exception { + Map<Byte, Integer> expectedConversions = Map.of( + IGetKeyCallback.ErrorCode.ERROR_UNKNOWN, + RkpProxyException.ERROR_UNKNOWN, + IGetKeyCallback.ErrorCode.ERROR_REQUIRES_SECURITY_PATCH, + RkpProxyException.ERROR_REQUIRES_SECURITY_PATCH, + IGetKeyCallback.ErrorCode.ERROR_PENDING_INTERNET_CONNECTIVITY, + RkpProxyException.ERROR_PENDING_INTERNET_CONNECTIVITY, + IGetKeyCallback.ErrorCode.ERROR_PERMANENT, + RkpProxyException.ERROR_PERMANENT); + + for (Field errorField: IGetKeyCallback.ErrorCode.class.getFields()) { + byte error = (Byte) errorField.get(null); + Exception expectedException = new RkpProxyException(expectedConversions.get(error), + errorField.getName()); + doAnswer( + answerGetKeyAsync((keyId, cancelSignal, executor, receiver) -> + executor.execute(() -> receiver.onError(expectedException)))) + .when(mRegistrationProxy).getKeyAsync(eq(0), any(), any(), any()); + IGetKeyCallback callback = mock(IGetKeyCallback.class); + mRegistration.getKey(0, callback); + verify(callback).onError(eq(error), contains(errorField.getName())); + verifyNoMoreInteractions(callback); + } + } + + @Test public void getKeyCancelDuringProxyOperation() throws Exception { IGetKeyCallback callback = mock(IGetKeyCallback.class); doAnswer( @@ -179,7 +209,8 @@ public class RemoteProvisioningRegistrationTest { IGetKeyCallback callback = mock(IGetKeyCallback.class); mRegistration.getKey(0, callback); - verify(callback).onError(eq(expectedException.getMessage())); + verify(callback).onError(eq(IGetKeyCallback.ErrorCode.ERROR_UNKNOWN), + eq(expectedException.getMessage())); assertThrows(IllegalArgumentException.class, () -> mRegistration.cancelGetKey(callback)); verifyNoMoreInteractions(callback); } diff --git a/services/tests/mockingservicestests/src/com/android/server/am/AsyncProcessStartTest.java b/services/tests/mockingservicestests/src/com/android/server/am/AsyncProcessStartTest.java new file mode 100644 index 000000000000..ea14ffbe3572 --- /dev/null +++ b/services/tests/mockingservicestests/src/com/android/server/am/AsyncProcessStartTest.java @@ -0,0 +1,282 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.am; + +import static android.os.Process.myPid; +import static android.os.Process.myUid; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + +import android.app.ActivityManagerInternal; +import android.app.IApplicationThread; +import android.app.usage.UsageStatsManagerInternal; +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManagerInternal; +import android.os.Binder; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IBinder; +import android.os.SystemClock; +import android.util.Log; + +import androidx.test.filters.MediumTest; +import androidx.test.platform.app.InstrumentationRegistry; + +import com.android.server.DropBoxManagerInternal; +import com.android.server.LocalServices; +import com.android.server.am.ActivityManagerService.Injector; +import com.android.server.appop.AppOpsService; +import com.android.server.wm.ActivityTaskManagerInternal; +import com.android.server.wm.ActivityTaskManagerService; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.io.File; +import java.util.Arrays; + + +/** + * Tests to verify process starts are completed or timeout correctly + */ +@MediumTest +@SuppressWarnings("GuardedBy") +public class AsyncProcessStartTest { + private static final String TAG = "AsyncProcessStartTest"; + + private static final String PACKAGE = "com.foo"; + + @Rule + public final ApplicationExitInfoTest.ServiceThreadRule + mServiceThreadRule = new ApplicationExitInfoTest.ServiceThreadRule(); + + private Context mContext; + private HandlerThread mHandlerThread; + + @Mock + private AppOpsService mAppOpsService; + @Mock + private DropBoxManagerInternal mDropBoxManagerInt; + @Mock + private PackageManagerInternal mPackageManagerInt; + @Mock + private UsageStatsManagerInternal mUsageStatsManagerInt; + @Mock + private ActivityManagerInternal mActivityManagerInt; + @Mock + private ActivityTaskManagerInternal mActivityTaskManagerInt; + @Mock + private BatteryStatsService mBatteryStatsService; + + private ActivityManagerService mRealAms; + private ActivityManagerService mAms; + + private ProcessList mRealProcessList = new ProcessList(); + private ProcessList mProcessList; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + + mContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + mHandlerThread = new HandlerThread(TAG); + mHandlerThread.start(); + + LocalServices.removeServiceForTest(DropBoxManagerInternal.class); + LocalServices.addService(DropBoxManagerInternal.class, mDropBoxManagerInt); + + LocalServices.removeServiceForTest(PackageManagerInternal.class); + LocalServices.addService(PackageManagerInternal.class, mPackageManagerInt); + + LocalServices.removeServiceForTest(ActivityManagerInternal.class); + LocalServices.addService(ActivityManagerInternal.class, mActivityManagerInt); + + LocalServices.removeServiceForTest(ActivityTaskManagerInternal.class); + LocalServices.addService(ActivityTaskManagerInternal.class, mActivityTaskManagerInt); + + doReturn(new ComponentName("", "")).when(mPackageManagerInt).getSystemUiServiceComponent(); + doReturn(true).when(mActivityTaskManagerInt).attachApplication(any()); + doNothing().when(mActivityTaskManagerInt).onProcessMapped(anyInt(), any()); + + mRealAms = new ActivityManagerService( + new TestInjector(mContext), mServiceThreadRule.getThread()); + mRealAms.mActivityTaskManager = new ActivityTaskManagerService(mContext); + mRealAms.mActivityTaskManager.initialize(null, null, mContext.getMainLooper()); + mRealAms.mAtmInternal = mActivityTaskManagerInt; + mRealAms.mPackageManagerInt = mPackageManagerInt; + mRealAms.mUsageStatsService = mUsageStatsManagerInt; + mRealAms.mProcessesReady = true; + mAms = spy(mRealAms); + mRealProcessList.mService = mAms; + mProcessList = spy(mRealProcessList); + + doAnswer((invocation) -> { + Log.v(TAG, "Intercepting isProcStartValidLocked() for " + + Arrays.toString(invocation.getArguments())); + return null; + }).when(mProcessList).isProcStartValidLocked(any(), anyLong()); + } + + @After + public void tearDown() throws Exception { + mHandlerThread.quit(); + } + + private class TestInjector extends Injector { + TestInjector(Context context) { + super(context); + } + + @Override + public AppOpsService getAppOpsService(File file, Handler handler) { + return mAppOpsService; + } + + @Override + public Handler getUiHandler(ActivityManagerService service) { + return mHandlerThread.getThreadHandler(); + } + + @Override + public ProcessList getProcessList(ActivityManagerService service) { + return mRealProcessList; + } + + @Override + public BatteryStatsService getBatteryStatsService() { + return mBatteryStatsService; + } + } + + private ProcessRecord makeActiveProcessRecord(String packageName, boolean wedge) + throws Exception { + final ApplicationInfo ai = makeApplicationInfo(packageName); + return makeActiveProcessRecord(ai, wedge); + } + + private ProcessRecord makeActiveProcessRecord(ApplicationInfo ai, boolean wedge) + throws Exception { + final IApplicationThread thread = mock(IApplicationThread.class); + final IBinder threadBinder = new Binder(); + doReturn(threadBinder).when(thread).asBinder(); + doAnswer((invocation) -> { + Log.v(TAG, "Intercepting bindApplication() for " + + Arrays.toString(invocation.getArguments())); + if (!wedge) { + mRealAms.finishAttachApplication(0); + } + return null; + }).when(thread).bindApplication( + any(), any(), + any(), any(), + any(), any(), + any(), any(), + any(), + any(), anyInt(), + anyBoolean(), anyBoolean(), + anyBoolean(), anyBoolean(), any(), + any(), any(), any(), + any(), any(), + any(), any(), + any(), + anyLong(), anyLong()); + + final ProcessRecord r = spy(new ProcessRecord(mAms, ai, ai.processName, ai.uid)); + r.setPid(myPid()); + r.setStartUid(myUid()); + r.setHostingRecord(new HostingRecord(HostingRecord.HOSTING_TYPE_BROADCAST)); + r.makeActive(thread, mAms.mProcessStats); + doNothing().when(r).killLocked(any(), any(), anyInt(), anyInt(), anyBoolean(), + anyBoolean()); + + return r; + } + + static ApplicationInfo makeApplicationInfo(String packageName) { + final ApplicationInfo ai = new ApplicationInfo(); + ai.packageName = packageName; + ai.processName = packageName; + ai.uid = myUid(); + return ai; + } + + /** + * Verify that we don't kill a normal process + */ + @Test + public void testNormal() throws Exception { + ProcessRecord app = startProcessAndWait(false); + + verify(app, never()).killLocked(any(), anyInt(), anyBoolean()); + } + + /** + * Verify that we kill a wedged process after the process start timeout + */ + @Test + public void testWedged() throws Exception { + ProcessRecord app = startProcessAndWait(true); + + verify(app).killLocked(any(), anyInt(), anyBoolean()); + } + + private ProcessRecord startProcessAndWait(boolean wedge) throws Exception { + final ProcessRecord app = makeActiveProcessRecord(PACKAGE, wedge); + final ApplicationInfo appInfo = makeApplicationInfo(PACKAGE); + + mProcessList.handleProcessStartedLocked(app, app.getPid(), /* usingWrapper */ false, + /* expectedStartSeq */ 0, /* procAttached */ false); + + app.getThread().bindApplication(PACKAGE, appInfo, + null, null, + null, + null, + null, null, + null, + null, 0, + false, false, + true, false, + null, + null, null, + null, + null, null, null, + null, null, + 0, 0); + + // Sleep until timeout should have triggered + SystemClock.sleep(ActivityManagerService.PROC_START_TIMEOUT + 1000); + + return app; + } +} diff --git a/services/tests/servicestests/src/com/android/server/accessibility/FlashNotificationsControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/FlashNotificationsControllerTest.java new file mode 100644 index 000000000000..8a057df7e836 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/accessibility/FlashNotificationsControllerTest.java @@ -0,0 +1,509 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.accessibility; + +import static android.hardware.camera2.CameraCharacteristics.FLASH_INFO_AVAILABLE; +import static android.hardware.camera2.CameraCharacteristics.LENS_FACING; +import static android.hardware.camera2.CameraMetadata.LENS_FACING_BACK; + +import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; + +import static com.android.server.accessibility.FlashNotificationsController.ACTION_FLASH_NOTIFICATION_START_PREVIEW; +import static com.android.server.accessibility.FlashNotificationsController.ACTION_FLASH_NOTIFICATION_STOP_PREVIEW; +import static com.android.server.accessibility.FlashNotificationsController.EXTRA_FLASH_NOTIFICATION_PREVIEW_COLOR; +import static com.android.server.accessibility.FlashNotificationsController.EXTRA_FLASH_NOTIFICATION_PREVIEW_TYPE; +import static com.android.server.accessibility.FlashNotificationsController.PREVIEW_TYPE_LONG; +import static com.android.server.accessibility.FlashNotificationsController.PREVIEW_TYPE_SHORT; +import static com.android.server.accessibility.FlashNotificationsController.SETTING_KEY_CAMERA_FLASH_NOTIFICATION; +import static com.android.server.accessibility.FlashNotificationsController.SETTING_KEY_SCREEN_FLASH_NOTIFICATION; +import static com.android.server.accessibility.FlashNotificationsController.SETTING_KEY_SCREEN_FLASH_NOTIFICATION_COLOR; + +import static com.google.common.truth.Truth.assertThat; + +import static org.junit.Assume.assumeTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; + +import static java.lang.Integer.max; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraManager; +import android.media.AudioAttributes; +import android.media.AudioManager; +import android.media.AudioPlaybackConfiguration; +import android.media.PlayerBase; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IBinder; +import android.os.UserHandle; +import android.provider.Settings; +import android.testing.AndroidTestingRunner; +import android.testing.TestableContentResolver; +import android.testing.TestableContext; +import android.testing.TestableLooper; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.view.accessibility.AccessibilityManager; + +import androidx.annotation.NonNull; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Tests for {@link FlashNotificationsController}. + */ +@RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper(setAsMainLooper = true) +public class FlashNotificationsControllerTest { + private static final String CALL_TAG = "com.android.server.telecom"; + private static final String NOTI_TAG = "android"; + private static final String NOTI_REASON_PKG = "noti.reason.pkg"; + private static final int COLOR_YELLOW = 0x66FFFF00; + private static final int COLOR_BLUE = 0x4d0000fe; + + @Rule + public final TestableContext mTestableContext = new TestableContext( + getInstrumentation().getTargetContext()); + + private final Map<String, CameraInfo> mCameraInfoMap = new HashMap<>(); + private final Set<View> mViews = new HashSet<>(); + + @Mock + private IBinder mMockToken; + @Mock + private WindowManager mMockWindowManager; + @Mock + private AudioManager mMockAudioManager; + + private final List<AudioPlaybackConfiguration> mAudioConfigsWithAlarm = getConfigWithAlarm(); + + private CameraManager mCameraManager; + private AudioManager.AudioPlaybackCallback mAudioPlaybackCallback; + private TestableContentResolver mTestableContentResolver; + + private TestableLooper mTestableLooper; + private Handler mTestHandler; + private HandlerThread mFlashHandlerThread; + private Handler mFlashHandler; + + private FlashNotificationsController mController; + + private int mScreenFlashCount = 0; + private int mLastFlashedViewColor = Color.TRANSPARENT; + + private final CameraManager.TorchCallback mTorchCallback = new CameraManager.TorchCallback() { + @Override + public void onTorchModeChanged(@NonNull String cameraId, boolean enabled) { + CameraInfo info = mCameraInfoMap.getOrDefault(cameraId, + new CameraInfo(false)); + info.setEnabled(enabled); + mCameraInfoMap.put(cameraId, info); + } + }; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + + mTestableLooper = TestableLooper.get(this); + mTestHandler = new Handler(mTestableLooper.getLooper()); + mFlashHandlerThread = new HandlerThread("TestFlashHandlerThread"); + mFlashHandlerThread.start(); + mFlashHandler = mFlashHandlerThread.getThreadHandler(); + + doAnswer(invocation -> { + final View view = invocation.getArgument(0); + mLastFlashedViewColor = getBackgroundColor(view); + mViews.add(view); + return null; + }).when(mMockWindowManager).addView(any(View.class), any(ViewGroup.LayoutParams.class)); + doAnswer(invocation -> { + final View view = invocation.getArgument(0); + final boolean isAnyViewAdded = !mViews.isEmpty(); + mViews.remove(view); + if (isAnyViewAdded && mViews.isEmpty()) mScreenFlashCount++; + return null; + }).when(mMockWindowManager).removeView(any(View.class)); + mTestableContext.addMockSystemService(Context.WINDOW_SERVICE, mMockWindowManager); + + doAnswer(invocation -> { + mAudioPlaybackCallback = invocation.getArgument(0); + return null; + }).when(mMockAudioManager).registerAudioPlaybackCallback( + any(AudioManager.AudioPlaybackCallback.class), any(Handler.class)); + mTestableContext.addMockSystemService(Context.AUDIO_SERVICE, mMockAudioManager); + + mCameraManager = mTestableContext.getSystemService(CameraManager.class); + if (mCameraManager != null) { + try { + for (String id : mCameraManager.getCameraIdList()) { + CameraCharacteristics value = mCameraManager.getCameraCharacteristics(id); + Boolean available = value.get(FLASH_INFO_AVAILABLE); + Integer facing = value.get(LENS_FACING); + mCameraInfoMap.put(id, new CameraInfo( + available != null && available + && facing != null && facing == LENS_FACING_BACK + )); + } + } catch (CameraAccessException ignored) { + } + mCameraManager.registerTorchCallback(mTorchCallback, mTestHandler); + } + + mTestableContentResolver = mTestableContext.getContentResolver(); + putCameraFlash(false); + putScreenFlash(false); + putScreenColor(Color.TRANSPARENT); + } + + @After + public void tearDown() { + mCameraManager.unregisterTorchCallback(mTorchCallback); + mFlashHandlerThread.quit(); + mTestableLooper.processAllMessages(); + } + + @Test + public void testCallSequence_putCameraFlashTrue_assertCameraFlashedScreenNotFlashed() + throws InterruptedException { + assumeCameraTorchAvailable(); + putCameraFlash(true); + initController(mFlashHandler); + + simulateCallSequence(); + + assertThat(getCameraFlashedCount()).isGreaterThan(0); + assertThat(mScreenFlashCount).isEqualTo(0); + } + + @Test + public void testCallSequence_putScreenFlashTrue_assertScreenFlashedCameraNotFlashed() + throws InterruptedException { + putScreenFlash(true); + putScreenColor(COLOR_YELLOW); + initController(mFlashHandler); + + simulateCallSequence(); + + assertThat(mScreenFlashCount).isGreaterThan(0); + assertThat(getCameraFlashedCount()).isEqualTo(0); + } + + @Test + public void testAlarmSequence_putCameraFlashTrue_assertCameraFlashedScreenNotFlashed() + throws InterruptedException { + assumeCameraTorchAvailable(); + putCameraFlash(true); + initController(mFlashHandler); + + simulateAlarmSequence(); + + assertThat(getCameraFlashedCount()).isGreaterThan(0); + assertThat(mScreenFlashCount).isEqualTo(0); + } + + @Test + public void testAlarmSequence_putScreenFlashTrue_assertScreenFlashedCameraNotFlashed() + throws InterruptedException { + putScreenFlash(true); + putScreenColor(COLOR_YELLOW); + initController(mFlashHandler); + + simulateAlarmSequence(); + + assertThat(mScreenFlashCount).isGreaterThan(0); + assertThat(getCameraFlashedCount()).isEqualTo(0); + + } + + @Test + public void testEvent_putCameraFlashTrue_assertCameraFlashedScreenNotFlashed() { + assumeCameraTorchAvailable(); + putCameraFlash(true); + initController(mTestHandler); + + simulateNotificationEvent(); + + assertThat(getCameraFlashedCount()).isGreaterThan(0); + assertThat(mScreenFlashCount).isEqualTo(0); + } + + @Test + public void testEvent_putScreenFlashTrue_assertScreenFlashedCameraNotFlashed() { + putScreenFlash(true); + putScreenColor(COLOR_YELLOW); + initController(mTestHandler); + + simulateNotificationEvent(); + + assertThat(mScreenFlashCount).isGreaterThan(0); + assertThat(getCameraFlashedCount()).isEqualTo(0); + } + + @Test + public void testShortPreview_putCameraFlashTrue_assertCameraFlashedScreenNotFlashed() { + assumeCameraTorchAvailable(); + putCameraFlash(true); + initController(mTestHandler); + + simulateShortPreview(); + + assertThat(getCameraFlashedCount()).isGreaterThan(0); + assertThat(mScreenFlashCount).isEqualTo(0); + } + + @Test + public void testShortPreview_putScreenFlashTrue_assertScreenFlashedCameraNotFlashed() { + putScreenFlash(true); + putScreenColor(COLOR_YELLOW); + initController(mTestHandler); + + simulateShortPreview(); + + assertThat(mScreenFlashCount).isGreaterThan(0); + assertThat(getCameraFlashedCount()).isEqualTo(0); + } + + @Test + public void testLongPreview_assertScreenFlashed() + throws InterruptedException { + initController(mFlashHandler); + + simulateLongPreview(COLOR_YELLOW); + + assertThat(mScreenFlashCount).isGreaterThan(0); + } + + @Test + public void testLongPreview_putScreenFlashColorBlue_assertScreenFlashedYellow() + throws InterruptedException { + putScreenColor(COLOR_YELLOW); + initController(mFlashHandler); + + simulateLongPreview(COLOR_BLUE); + + assertThat(mLastFlashedViewColor).isEqualTo(COLOR_BLUE); + } + + @Test + public void testLongPreview_putCameraFlashTrue_assertNotCameraFlashed() + throws InterruptedException { + assumeCameraTorchAvailable(); + putCameraFlash(true); + initController(mFlashHandler); + + simulateLongPreview(COLOR_YELLOW); + + assertThat(getCameraFlashedCount()).isEqualTo(0); + } + + @Test + public void testStartFlashNotificationSequence_invalidToken() { + initController(mTestHandler); + + assertThat(mController.startFlashNotificationSequence(CALL_TAG, + AccessibilityManager.FLASH_REASON_CALL, null)).isFalse(); + } + + @Test + public void testOpenedCameraTest() { + assumeCameraTorchAvailable(); + putCameraFlash(true); + putScreenFlash(true); + putScreenColor(COLOR_YELLOW); + initController(mTestHandler); + + simulateCameraOpened(); + simulateNotificationEvent(); + simulateCameraClosed(); + + assertThat(getCameraFlashedCount()).isEqualTo(0); + } + + private void initController(Handler flashHandler) { + mController = new FlashNotificationsController(mTestableContext, + flashHandler, mTestHandler); + mController.mFlashBroadcastReceiver.onReceive(mTestableContext, + new Intent(Intent.ACTION_BOOT_COMPLETED)); + } + + private void assumeCameraTorchAvailable() { + assumeTrue(mCameraManager != null); + assumeTrue(!mCameraInfoMap.isEmpty()); + } + + private void simulateCallSequence() throws InterruptedException { + mController.startFlashNotificationSequence(CALL_TAG, + AccessibilityManager.FLASH_REASON_CALL, mMockToken); + processLooper(2500); + Thread.sleep(2500); + + mController.stopFlashNotificationSequence(CALL_TAG); + processLooper(500); + Thread.sleep(500); + } + + private void simulateAlarmSequence() throws InterruptedException { + mAudioPlaybackCallback.onPlaybackConfigChanged(mAudioConfigsWithAlarm); + processLooper(2500); + Thread.sleep(2500); + + mAudioPlaybackCallback.onPlaybackConfigChanged(Collections.emptyList()); + processLooper(500); + Thread.sleep(500); + } + + private void simulateNotificationEvent() { + mController.startFlashNotificationEvent(NOTI_TAG, + AccessibilityManager.FLASH_REASON_NOTIFICATION, NOTI_REASON_PKG); + + processLooper(3000); + } + + private void simulateShortPreview() { + Intent intent = new Intent(ACTION_FLASH_NOTIFICATION_START_PREVIEW); + intent.putExtra(EXTRA_FLASH_NOTIFICATION_PREVIEW_TYPE, PREVIEW_TYPE_SHORT); + mController.mFlashBroadcastReceiver.onReceive(mTestableContext, intent); + + processLooper(3000); + } + + private void simulateLongPreview(int color) throws InterruptedException { + Intent startIntent = new Intent(ACTION_FLASH_NOTIFICATION_START_PREVIEW); + startIntent.putExtra(EXTRA_FLASH_NOTIFICATION_PREVIEW_TYPE, PREVIEW_TYPE_LONG); + startIntent.putExtra(EXTRA_FLASH_NOTIFICATION_PREVIEW_COLOR, color); + mController.mFlashBroadcastReceiver.onReceive(mTestableContext, startIntent); + processLooper(2500); + Thread.sleep(2500); + + Intent stopIntent = new Intent(ACTION_FLASH_NOTIFICATION_STOP_PREVIEW); + mController.mFlashBroadcastReceiver.onReceive(mTestableContext, stopIntent); + processLooper(500); + Thread.sleep(500); + } + + private void processLooper(long millis) { + mTestableLooper.moveTimeForward(millis); + mTestableLooper.processAllMessages(); + } + + private static List<AudioPlaybackConfiguration> getConfigWithAlarm() { + List<AudioPlaybackConfiguration> list = new ArrayList<>(); + + AudioPlaybackConfiguration config = new AudioPlaybackConfiguration( + mock(PlayerBase.PlayerIdCard.class), 0, 0, 0); + config.handleStateEvent(AudioPlaybackConfiguration.PLAYER_STATE_STARTED, + AudioPlaybackConfiguration.PLAYER_DEVICEID_INVALID); + + AudioAttributes.Builder builder = new AudioAttributes.Builder(); + builder.setUsage(AudioAttributes.USAGE_ALARM); + AudioAttributes attr = builder.build(); + + config.handleAudioAttributesEvent(attr); + + list.add(config); + return list; + } + + private int getCameraFlashedCount() { + int count = 0; + for (CameraInfo info : mCameraInfoMap.values()) { + count = max(count, info.mTorchFlashCount); + } + return count; + } + + private int getBackgroundColor(View view) { + final Drawable background = view.getBackground(); + if (background instanceof ColorDrawable) { + return ((ColorDrawable) background).getColor(); + } else { + return Color.TRANSPARENT; + } + } + + private void putCameraFlash(boolean value) { + Settings.System.putIntForUser(mTestableContentResolver, + SETTING_KEY_CAMERA_FLASH_NOTIFICATION, + value ? 1 : 0, UserHandle.USER_CURRENT); + } + + private void putScreenFlash(boolean value) { + Settings.System.putIntForUser(mTestableContentResolver, + SETTING_KEY_SCREEN_FLASH_NOTIFICATION, + value ? 1 : 0, UserHandle.USER_CURRENT); + } + + private void putScreenColor(int color) { + Settings.System.putIntForUser(mTestableContentResolver, + SETTING_KEY_SCREEN_FLASH_NOTIFICATION_COLOR, + color, UserHandle.USER_CURRENT); + } + + private void simulateCameraOpened() { + for (String cameraId : mCameraInfoMap.keySet()) { + System.out.println("simulate open camera: " + cameraId); + mController.mTorchAvailabilityCallback.onCameraOpened(cameraId, ""); + } + processLooper(200); + } + + private void simulateCameraClosed() { + for (String cameraId : mCameraInfoMap.keySet()) { + System.out.println("simulate close camera: " + cameraId); + mController.mTorchAvailabilityCallback.onCameraClosed(cameraId); + } + processLooper(200); + } + + private static class CameraInfo { + final boolean mIsValid; + boolean mEnabled = false; + int mTorchFlashCount = 0; + + CameraInfo(boolean isValid) { + mIsValid = isValid; + } + + void setEnabled(boolean enabled) { + if (mEnabled && !enabled) mTorchFlashCount++; + mEnabled = enabled; + } + } +} diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java index 99f7905a9f70..e605a317f096 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java @@ -35,6 +35,7 @@ import static org.mockito.Mockito.when; import android.app.ActivityManager; import android.app.ActivityTaskManager; import android.content.ComponentName; +import android.hardware.biometrics.BiometricFingerprintConstants; import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.common.ICancellationSignal; import android.hardware.biometrics.common.OperationContext; @@ -364,6 +365,16 @@ public class FingerprintAuthenticationClientTest { showHideOverlay(c -> c.onLockoutPermanent()); } + @Test + public void testPowerPressForwardsErrorMessage() throws RemoteException { + final FingerprintAuthenticationClient client = createClient(); + + client.onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_VENDOR, + BiometricFingerprintConstants.BIOMETRIC_ERROR_POWER_PRESSED); + + verify(mClientMonitorCallbackConverter).onError(anyInt(), anyInt(), + eq(BiometricFingerprintConstants.BIOMETRIC_ERROR_POWER_PRESSED), eq(0)); + } private void showHideOverlay(Consumer<FingerprintAuthenticationClient> block) throws RemoteException { final FingerprintAuthenticationClient client = createClient(); diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClientTest.java index 26524d7df7c3..a40d3fe3a3d6 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClientTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClientTest.java @@ -16,8 +16,6 @@ package com.android.server.biometrics.sensors.fingerprint.aidl; -import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_POWER_PRESSED; - import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; @@ -29,6 +27,7 @@ import static org.mockito.Mockito.same; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.hardware.biometrics.BiometricFingerprintConstants; import android.hardware.biometrics.common.OperationContext; import android.hardware.biometrics.fingerprint.ISession; import android.hardware.biometrics.fingerprint.PointerContext; @@ -276,11 +275,12 @@ public class FingerprintEnrollClientTest { @Test public void testPowerPressForwardsAcquireMessage() throws RemoteException { final FingerprintEnrollClient client = createClient(); - client.start(mCallback); - client.onPowerPressed(); + + client.onAcquired(BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_VENDOR, + BiometricFingerprintConstants.BIOMETRIC_ERROR_POWER_PRESSED); verify(mClientMonitorCallbackConverter).onAcquired(anyInt(), - eq(FINGERPRINT_ACQUIRED_POWER_PRESSED), anyInt()); + eq(BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_POWER_PRESSED), eq(0)); } private void showHideOverlay(Consumer<FingerprintEnrollClient> block) diff --git a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java index ac1dca965310..488c533f6c63 100644 --- a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java +++ b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayMapperTest.java @@ -836,9 +836,9 @@ public class LogicalDisplayMapperTest { assertTrue(mLogicalDisplayMapper.getDisplayLocked(device2).isEnabledLocked()); assertEquals(POSITION_UNKNOWN, - mLogicalDisplayMapper.getDisplayLocked(device1).getPositionLocked()); + mLogicalDisplayMapper.getDisplayLocked(device1).getDevicePositionLocked()); assertEquals(POSITION_REAR, - mLogicalDisplayMapper.getDisplayLocked(device2).getPositionLocked()); + mLogicalDisplayMapper.getDisplayLocked(device2).getDevicePositionLocked()); } ///////////////// diff --git a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java index 1d70fc61c937..d28050d29b4a 100644 --- a/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java +++ b/services/tests/servicestests/src/com/android/server/display/LogicalDisplayTest.java @@ -26,12 +26,15 @@ import static org.mockito.Mockito.when; import android.app.PropertyInvalidatedCache; import android.graphics.Point; +import android.view.Display; import android.view.DisplayInfo; import android.view.Surface; import android.view.SurfaceControl; import androidx.test.filters.SmallTest; +import com.android.server.display.layout.Layout; + import org.junit.Before; import org.junit.Test; @@ -47,6 +50,7 @@ public class LogicalDisplayTest { private LogicalDisplay mLogicalDisplay; private DisplayDevice mDisplayDevice; + private DisplayDeviceRepository mDeviceRepo; private final DisplayDeviceInfo mDisplayDeviceInfo = new DisplayDeviceInfo(); @Before @@ -66,7 +70,7 @@ public class LogicalDisplayTest { // Disable binder caches in this process. PropertyInvalidatedCache.disableForTestMode(); - DisplayDeviceRepository repo = new DisplayDeviceRepository( + mDeviceRepo = new DisplayDeviceRepository( new DisplayManagerService.SyncRoot(), new PersistentDataStore(new PersistentDataStore.Injector() { @Override @@ -82,8 +86,8 @@ public class LogicalDisplayTest { @Override public void finishWrite(OutputStream os, boolean success) {} })); - repo.onDisplayDeviceEvent(mDisplayDevice, DisplayAdapter.DISPLAY_DEVICE_EVENT_ADDED); - mLogicalDisplay.updateLocked(repo); + mDeviceRepo.onDisplayDeviceEvent(mDisplayDevice, DisplayAdapter.DISPLAY_DEVICE_EVENT_ADDED); + mLogicalDisplay.updateLocked(mDeviceRepo); } @Test @@ -137,4 +141,29 @@ public class LogicalDisplayTest { verify(t).setDisplayFlags(any(), eq(SurfaceControl.DISPLAY_RECEIVES_INPUT)); reset(t); } + + @Test + public void testRearDisplaysArePresentationDisplaysThatDestroyContentOnRemoval() { + // Assert that the display isn't a presentation display by default, with a default remove + // mode + assertEquals(0, mLogicalDisplay.getDisplayInfoLocked().flags); + assertEquals(Display.REMOVE_MODE_MOVE_CONTENT_TO_PRIMARY, + mLogicalDisplay.getDisplayInfoLocked().removeMode); + + // Update position and test to see that it's been updated to a rear, presentation display + // that destroys content on removal + mLogicalDisplay.setDevicePositionLocked(Layout.Display.POSITION_REAR); + mLogicalDisplay.updateLocked(mDeviceRepo); + assertEquals(Display.FLAG_REAR | Display.FLAG_PRESENTATION, + mLogicalDisplay.getDisplayInfoLocked().flags); + assertEquals(Display.REMOVE_MODE_DESTROY_CONTENT, + mLogicalDisplay.getDisplayInfoLocked().removeMode); + + // And then check the unsetting the position resets both + mLogicalDisplay.setDevicePositionLocked(Layout.Display.POSITION_UNKNOWN); + mLogicalDisplay.updateLocked(mDeviceRepo); + assertEquals(0, mLogicalDisplay.getDisplayInfoLocked().flags); + assertEquals(Display.REMOVE_MODE_MOVE_CONTENT_TO_PRIMARY, + mLogicalDisplay.getDisplayInfoLocked().removeMode); + } } diff --git a/services/tests/servicestests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java b/services/tests/servicestests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java index d4ab794f55dc..ebd63a0a2ad3 100644 --- a/services/tests/servicestests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java @@ -47,7 +47,7 @@ import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) public final class DisplayBrightnessControllerTest { private static final int DISPLAY_ID = 1; - private static final float DEFAULT_BRIGHTNESS = 0.4f; + private static final float DEFAULT_BRIGHTNESS = 0.15f; @Mock private DisplayBrightnessStrategySelector mDisplayBrightnessStrategySelector; @@ -70,11 +70,18 @@ public final class DisplayBrightnessControllerTest { return mDisplayBrightnessStrategySelector; } }; + when(mBrightnessSetting.getBrightness()).thenReturn(Float.NaN); mDisplayBrightnessController = new DisplayBrightnessController(mContext, injector, DISPLAY_ID, DEFAULT_BRIGHTNESS, mBrightnessSetting, mOnBrightnessChangeRunnable); } @Test + public void testIfFirstScreenBrightnessIsDefault() { + assertEquals(mDisplayBrightnessController.getCurrentBrightness(), DEFAULT_BRIGHTNESS, + 0.0f); + } + + @Test public void testUpdateBrightness() { DisplayPowerRequest displayPowerRequest = mock(DisplayPowerRequest.class); DisplayBrightnessStrategy displayBrightnessStrategy = mock(DisplayBrightnessStrategy.class); diff --git a/services/tests/servicestests/src/com/android/server/locksettings/MockSyntheticPasswordManager.java b/services/tests/servicestests/src/com/android/server/locksettings/MockSyntheticPasswordManager.java index a40cb0625e1c..e8ef398f3738 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/MockSyntheticPasswordManager.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/MockSyntheticPasswordManager.java @@ -119,6 +119,5 @@ public class MockSyntheticPasswordManager extends SyntheticPasswordManager { public void enableWeaver() { mWeaverService = new MockWeaverService(); - initWeaverService(); } } diff --git a/services/tests/servicestests/src/com/android/server/power/stats/BatteryStatsUserLifecycleTests.java b/services/tests/servicestests/src/com/android/server/power/stats/BatteryStatsUserLifecycleTests.java index cff3bf8f80ad..b27ba88d4ccc 100644 --- a/services/tests/servicestests/src/com/android/server/power/stats/BatteryStatsUserLifecycleTests.java +++ b/services/tests/servicestests/src/com/android/server/power/stats/BatteryStatsUserLifecycleTests.java @@ -38,7 +38,6 @@ import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -51,8 +50,8 @@ public class BatteryStatsUserLifecycleTests { private static final long POLL_INTERVAL_MS = 500; private static final long USER_REMOVE_TIMEOUT_MS = 5_000; - private static final long STOP_USER_TIMEOUT_MS = 10_000; - private static final long USER_UIDS_REMOVE_TIMEOUT_MS = 15_000; + private static final long STOP_USER_TIMEOUT_MS = 20_000; + private static final long USER_UIDS_REMOVE_TIMEOUT_MS = 20_000; private static final long BATTERYSTATS_POLLING_TIMEOUT_MS = 5_000; private static final String CPU_DATA_TAG = "cpu"; @@ -79,26 +78,29 @@ public class BatteryStatsUserLifecycleTests { batteryOnScreenOff(); } - @Ignore("b/244349060") @Test public void testNoCpuDataForRemovedUser() throws Exception { mIam.startUserInBackground(mTestUserId); waitUntilTrue("No uids for started user " + mTestUserId, () -> getNumberOfUidsInBatteryStats() > 0, BATTERYSTATS_POLLING_TIMEOUT_MS); + final boolean[] userStopped = new boolean[1]; CountDownLatch stopUserLatch = new CountDownLatch(1); mIam.stopUser(mTestUserId, true, new IStopUserCallback.Stub() { @Override public void userStopped(int userId) throws RemoteException { + userStopped[0] = true; stopUserLatch.countDown(); } @Override public void userStopAborted(int userId) throws RemoteException { + stopUserLatch.countDown(); } }); - assertTrue("User " + mTestUserId + " could not be stopped", + assertTrue("User " + mTestUserId + " could not be stopped in " + STOP_USER_TIMEOUT_MS, stopUserLatch.await(STOP_USER_TIMEOUT_MS, TimeUnit.MILLISECONDS)); + assertTrue("User " + mTestUserId + " could not be stopped", userStopped[0]); mUm.removeUser(mTestUserId); waitUntilTrue("Unable to remove user " + mTestUserId, () -> { diff --git a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java index 08c2c6e6f26e..974238427587 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java @@ -1870,6 +1870,65 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { verifyVibrate(1); } + @Test + public void testStartFlashNotificationEvent_receiveBeepyNotification() throws Exception { + NotificationRecord r = getBeepyNotification(); + + mService.buzzBeepBlinkLocked(r); + + verifyBeepUnlooped(); + verifyNeverVibrate(); + verify(mAccessibilityService).startFlashNotificationEvent(any(), anyInt(), + eq(r.getSbn().getPackageName())); + assertTrue(r.isInterruptive()); + assertNotEquals(-1, r.getLastAudiblyAlertedMs()); + } + + @Test + public void testStartFlashNotificationEvent_receiveBuzzyNotification() throws Exception { + NotificationRecord r = getBuzzyNotification(); + + mService.buzzBeepBlinkLocked(r); + + verifyNeverBeep(); + verifyVibrate(); + verify(mAccessibilityService).startFlashNotificationEvent(any(), anyInt(), + eq(r.getSbn().getPackageName())); + assertTrue(r.isInterruptive()); + assertNotEquals(-1, r.getLastAudiblyAlertedMs()); + } + + @Test + public void testStartFlashNotificationEvent_receiveBuzzyBeepyNotification() throws Exception { + NotificationRecord r = getBuzzyBeepyNotification(); + + mService.buzzBeepBlinkLocked(r); + + verifyBeepUnlooped(); + verifyDelayedVibrate(r.getVibration()); + verify(mAccessibilityService).startFlashNotificationEvent(any(), anyInt(), + eq(r.getSbn().getPackageName())); + assertTrue(r.isInterruptive()); + assertNotEquals(-1, r.getLastAudiblyAlertedMs()); + } + + @Test + public void testStartFlashNotificationEvent_receiveBuzzyBeepyNotification_ringerModeSilent() + throws Exception { + NotificationRecord r = getBuzzyBeepyNotification(); + when(mAudioManager.getRingerModeInternal()).thenReturn(AudioManager.RINGER_MODE_SILENT); + when(mAudioManager.getStreamVolume(anyInt())).thenReturn(0); + + mService.buzzBeepBlinkLocked(r); + + verifyNeverBeep(); + verifyNeverVibrate(); + verify(mAccessibilityService).startFlashNotificationEvent(any(), anyInt(), + eq(r.getSbn().getPackageName())); + assertFalse(r.isInterruptive()); + assertEquals(-1, r.getLastAudiblyAlertedMs()); + } + static class VibrateRepeatMatcher implements ArgumentMatcher<VibrationEffect> { private final int mRepeatIndex; diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerTest.java index 0169a7d96f9f..beab107ec556 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationRecordLoggerTest.java @@ -130,4 +130,29 @@ public class NotificationRecordLoggerTest extends UiServiceTestCase { p.r.getSbn().getNotification().flags |= FLAG_FOREGROUND_SERVICE; assertTrue(NotificationRecordLogger.isForegroundService(p.r)); } + + + @Test + public void testIsNonDismissible_hasFlagNoDismiss_shouldReturnTrue() { + // Given: a notification pair's notification has flag FLAG_NO_DISMISS + NotificationRecordLogger.NotificationRecordPair p = getNotificationRecordPair( + 0, null); + p.r.getNotification().flags |= Notification.FLAG_NO_DISMISS; + + // When: check the value of isNonDismissible() + // Then: should return true + assertTrue(NotificationRecordLogger.isNonDismissible(p.r)); + } + + @Test + public void testIsNonDismissible_noFlagNoDismiss_shouldReturnFalse() { + // Given: a notification pair's notification doesn't have flag FLAG_NO_DISMISS + NotificationRecordLogger.NotificationRecordPair p = getNotificationRecordPair( + 0, null); + p.r.getNotification().flags &= ~Notification.FLAG_NO_DISMISS; + + // When: check the value of isNonDismissible() + // Then: should return false + assertFalse(NotificationRecordLogger.isNonDismissible(p.r)); + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 56d59b41133a..e5fe32a959e9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -3177,7 +3177,7 @@ public class ActivityRecordTests extends WindowTestsBase { public void testImeInsetsFrozenFlag_resetWhenReportedToBeImeInputTarget() { final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); - mDisplayContent.getInsetsStateController().getSourceProvider(ID_IME).setWindowContainer( + mDisplayContent.getInsetsStateController().getImeSourceProvider().setWindowContainer( mImeWindow, null, null); mImeWindow.getControllableInsetProvider().setServerVisible(true); @@ -3222,7 +3222,7 @@ public class ActivityRecordTests extends WindowTestsBase { final WindowState app1 = createWindow(null, TYPE_APPLICATION, "app1"); final WindowState app2 = createWindow(null, TYPE_APPLICATION, "app2"); - mDisplayContent.getInsetsStateController().getSourceProvider(ID_IME).setWindowContainer( + mDisplayContent.getInsetsStateController().getImeSourceProvider().setWindowContainer( mImeWindow, null, null); mImeWindow.getControllableInsetProvider().setServerVisible(true); @@ -3288,7 +3288,7 @@ public class ActivityRecordTests extends WindowTestsBase { makeWindowVisibleAndDrawn(app1, app2); final InsetsStateController controller = mDisplayContent.getInsetsStateController(); - controller.getSourceProvider(ID_IME).setWindowContainer( + controller.getImeSourceProvider().setWindowContainer( ime, null, null); ime.getControllableInsetProvider().setServerVisible(true); diff --git a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java index ee8a98870dd5..ff5ede7a316a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/BackNavigationControllerTests.java @@ -34,7 +34,6 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.annotation.NonNull; @@ -96,9 +95,7 @@ public class BackNavigationControllerTests extends WindowTestsBase { .isEqualTo(typeToString(BackNavigationInfo.TYPE_RETURN_TO_HOME)); // verify if back animation would start. - verify(mBackNavigationController).scheduleAnimationLocked( - eq(BackNavigationInfo.TYPE_RETURN_TO_HOME), any(), eq(mBackAnimationAdapter), - any()); + assertTrue("Animation scheduled", backNavigationInfo.isPrepareRemoteAnimation()); } @Test @@ -115,9 +112,7 @@ public class BackNavigationControllerTests extends WindowTestsBase { .isEqualTo(typeToString(BackNavigationInfo.TYPE_CROSS_TASK)); // verify if back animation would start. - verify(mBackNavigationController).scheduleAnimationLocked( - eq(BackNavigationInfo.TYPE_CROSS_TASK), any(), eq(mBackAnimationAdapter), - any()); + assertTrue("Animation scheduled", backNavigationInfo.isPrepareRemoteAnimation()); // reset drawning status topTask.forAllWindows(w -> { diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java index 45cf530eddde..6656f4c79022 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java @@ -163,19 +163,20 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase { InsetsStateController controller = mDisplayContent.getInsetsStateController(); controller.onPostLayout(); - InsetsSourceProvider statusBarProvider = controller.getSourceProvider(ITYPE_STATUS_BAR); + InsetsSourceProvider statusBarProvider = controller.peekSourceProvider(ITYPE_STATUS_BAR); assertEquals(new Rect(0, 0, 500, 100), statusBarProvider.getSource().getFrame()); assertEquals(Insets.of(0, 100, 0, 0), statusBarProvider.getSource().calculateInsets(new Rect(0, 0, 500, 500), false /* ignoreVisibility */)); - InsetsSourceProvider topGesturesProvider = controller.getSourceProvider(ITYPE_TOP_GESTURES); + InsetsSourceProvider topGesturesProvider = controller.peekSourceProvider( + ITYPE_TOP_GESTURES); assertEquals(new Rect(0, 0, 500, 100), topGesturesProvider.getSource().getFrame()); assertEquals(Insets.of(0, 100, 0, 0), topGesturesProvider.getSource().calculateInsets(new Rect(0, 0, 500, 500), false /* ignoreVisibility */)); - InsetsSourceProvider navigationBarProvider = controller.getSourceProvider( + InsetsSourceProvider navigationBarProvider = controller.peekSourceProvider( ITYPE_NAVIGATION_BAR); assertNotEquals(new Rect(0, 0, 500, 100), navigationBarProvider.getSource().getFrame()); } @@ -194,7 +195,7 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase { mDisplayContent.getInsetsStateController().onPostLayout(); InsetsSourceProvider provider = - mDisplayContent.getInsetsStateController().getSourceProvider(ITYPE_STATUS_BAR); + mDisplayContent.getInsetsStateController().peekSourceProvider(ITYPE_STATUS_BAR); // In the new flexible insets setup, the insets frame should always respect the window // layout result. assertEquals(new Rect(0, 0, 500, 100), provider.getSource().getFrame()); diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java index dba299566f84..1a126cfa5c2c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java @@ -280,8 +280,7 @@ public class InsetsPolicyTest extends WindowTestsBase { assertFalse(mDisplayContent.getInsetsStateController().getRawInsetsState() .isSourceOrDefaultVisible(ITYPE_NAVIGATION_BAR, navigationBars())); - policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}, - true /* isGestureOnSystemBar */); + policy.showTransient(navigationBars() | statusBars(), true /* isGestureOnSystemBar */); waitUntilWindowAnimatorIdle(); final InsetsSourceControl[] controls = mDisplayContent.getInsetsStateController().getControlsForDispatch(mAppWindow); @@ -308,11 +307,11 @@ public class InsetsPolicyTest extends WindowTestsBase { spyOn(policy); doNothing().when(policy).startAnimation(anyBoolean(), any()); policy.updateBarControlTarget(mAppWindow); - policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}, + policy.showTransient(navigationBars() | statusBars(), true /* isGestureOnSystemBar */); waitUntilWindowAnimatorIdle(); - assertTrue(policy.isTransient(ITYPE_STATUS_BAR)); - assertFalse(policy.isTransient(ITYPE_NAVIGATION_BAR)); + assertTrue(policy.isTransient(statusBars())); + assertFalse(policy.isTransient(navigationBars())); final InsetsSourceControl[] controls = mDisplayContent.getInsetsStateController().getControlsForDispatch(mAppWindow); @@ -344,7 +343,7 @@ public class InsetsPolicyTest extends WindowTestsBase { spyOn(policy); doNothing().when(policy).startAnimation(anyBoolean(), any()); policy.updateBarControlTarget(mAppWindow); - policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}, + policy.showTransient(navigationBars() | statusBars(), true /* isGestureOnSystemBar */); waitUntilWindowAnimatorIdle(); InsetsSourceControl[] controls = @@ -393,13 +392,13 @@ public class InsetsPolicyTest extends WindowTestsBase { spyOn(policy); doNothing().when(policy).startAnimation(anyBoolean(), any()); policy.updateBarControlTarget(app); - policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}, + policy.showTransient(navigationBars() | statusBars(), true /* isGestureOnSystemBar */); final InsetsSourceControl[] controls = mDisplayContent.getInsetsStateController().getControlsForDispatch(app); policy.updateBarControlTarget(app2); - assertFalse(policy.isTransient(ITYPE_STATUS_BAR)); - assertFalse(policy.isTransient(ITYPE_NAVIGATION_BAR)); + assertFalse(policy.isTransient(statusBars())); + assertFalse(policy.isTransient(navigationBars())); } private WindowState addNavigationBar() { diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java index 88ecd3fe2cea..74fde65c4dcd 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java @@ -20,11 +20,8 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.view.InsetsSource.ID_IME; -import static android.view.InsetsState.ITYPE_CLIMATE_BAR; -import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR; -import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; -import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.WindowInsets.Type.ime; +import static android.view.WindowInsets.Type.navigationBars; import static android.view.WindowInsets.Type.statusBars; import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; @@ -49,6 +46,7 @@ import static org.mockito.Mockito.verify; import android.graphics.Rect; import android.platform.test.annotations.Presubmit; import android.util.SparseArray; +import android.view.InsetsSource; import android.view.InsetsSourceControl; import android.view.InsetsState; @@ -64,6 +62,15 @@ import org.junit.runner.RunWith; @RunWith(WindowTestRunner.class) public class InsetsStateControllerTest extends WindowTestsBase { + private static final int ID_STATUS_BAR = + InsetsSource.createId(null /* owner */, 0 /* index */, statusBars()); + private static final int ID_NAVIGATION_BAR = + InsetsSource.createId(null /* owner */, 0 /* index */, navigationBars()); + private static final int ID_CLIMATE_BAR = + InsetsSource.createId(null /* owner */, 1 /* index */, statusBars()); + private static final int ID_EXTRA_NAVIGATION_BAR = + InsetsSource.createId(null /* owner */, 1 /* index */, navigationBars()); + @Test public void testStripForDispatch_navBar() { final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar"); @@ -73,14 +80,15 @@ public class InsetsStateControllerTest extends WindowTestsBase { // IME cannot be the IME target. ime.mAttrs.flags |= FLAG_NOT_FOCUSABLE; - getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null, - null); - getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindowContainer(navBar, null, - null); - getController().getSourceProvider(ID_IME).setWindowContainer(ime, null, null); + getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) + .setWindowContainer(statusBar, null, null); + getController().getOrCreateSourceProvider(ID_NAVIGATION_BAR, navigationBars()) + .setWindowContainer(navBar, null, null); + getController().getOrCreateSourceProvider(ID_IME, ime()) + .setWindowContainer(ime, null, null); assertNull(navBar.getInsetsState().peekSource(ID_IME)); - assertNull(navBar.getInsetsState().peekSource(ITYPE_STATUS_BAR)); + assertNull(navBar.getInsetsState().peekSource(ID_STATUS_BAR)); } @Test @@ -89,14 +97,14 @@ public class InsetsStateControllerTest extends WindowTestsBase { final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar"); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); - getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null, - null); - getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindowContainer(navBar, null, - null); + getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) + .setWindowContainer(statusBar, null, null); + getController().getOrCreateSourceProvider(ID_NAVIGATION_BAR, navigationBars()) + .setWindowContainer(navBar, null, null); app.setWindowingMode(WINDOWING_MODE_PINNED); - assertNull(app.getInsetsState().peekSource(ITYPE_STATUS_BAR)); - assertNull(app.getInsetsState().peekSource(ITYPE_NAVIGATION_BAR)); + assertNull(app.getInsetsState().peekSource(ID_STATUS_BAR)); + assertNull(app.getInsetsState().peekSource(ID_NAVIGATION_BAR)); assertNull(app.getInsetsState().peekSource(ID_IME)); } @@ -106,14 +114,14 @@ public class InsetsStateControllerTest extends WindowTestsBase { final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar"); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); - getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null, - null); - getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindowContainer(navBar, null, - null); + getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) + .setWindowContainer(statusBar, null, null); + getController().getOrCreateSourceProvider(ID_NAVIGATION_BAR, navigationBars()) + .setWindowContainer(navBar, null, null); app.setWindowingMode(WINDOWING_MODE_FREEFORM); - assertNull(app.getInsetsState().peekSource(ITYPE_STATUS_BAR)); - assertNull(app.getInsetsState().peekSource(ITYPE_NAVIGATION_BAR)); + assertNull(app.getInsetsState().peekSource(ID_STATUS_BAR)); + assertNull(app.getInsetsState().peekSource(ID_NAVIGATION_BAR)); } @Test @@ -122,21 +130,22 @@ public class InsetsStateControllerTest extends WindowTestsBase { final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar"); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); - getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null, - null); - getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindowContainer(navBar, null, - null); + getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) + .setWindowContainer(statusBar, null, null); + getController().getOrCreateSourceProvider(ID_NAVIGATION_BAR, navigationBars()) + .setWindowContainer(navBar, null, null); app.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); app.setAlwaysOnTop(true); - assertNull(app.getInsetsState().peekSource(ITYPE_STATUS_BAR)); - assertNull(app.getInsetsState().peekSource(ITYPE_NAVIGATION_BAR)); + assertNull(app.getInsetsState().peekSource(ID_STATUS_BAR)); + assertNull(app.getInsetsState().peekSource(ID_NAVIGATION_BAR)); } @SetupWindows(addWindows = W_INPUT_METHOD) @Test public void testStripForDispatch_independentSources() { - getController().getSourceProvider(ID_IME).setWindowContainer(mImeWindow, null, null); + getController().getOrCreateSourceProvider(ID_IME, ime()) + .setWindowContainer(mImeWindow, null, null); final WindowState app1 = createWindow(null, TYPE_APPLICATION, "app1"); final WindowState app2 = createWindow(null, TYPE_APPLICATION, "app2"); @@ -151,7 +160,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { @SetupWindows(addWindows = W_INPUT_METHOD) @Test public void testStripForDispatch_belowIme() { - getController().getSourceProvider(ID_IME).setWindowContainer(mImeWindow, null, null); + getController().getOrCreateSourceProvider(ID_IME, ime()) + .setWindowContainer(mImeWindow, null, null); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); app.mAboveInsetsState.getOrCreateSource(ID_IME, ime()) @@ -165,7 +175,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { @SetupWindows(addWindows = W_INPUT_METHOD) @Test public void testStripForDispatch_aboveIme() { - getController().getSourceProvider(ID_IME).setWindowContainer(mImeWindow, null, null); + getController().getOrCreateSourceProvider(ID_IME, ime()) + .setWindowContainer(mImeWindow, null, null); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); @@ -184,7 +195,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { // Make IME and stay visible during the test. mImeWindow.setHasSurface(true); - getController().getSourceProvider(ID_IME).setWindowContainer(mImeWindow, null, null); + getController().getOrCreateSourceProvider(ID_IME, ime()) + .setWindowContainer(mImeWindow, null, null); getController().onImeControlTargetChanged( mDisplayContent.getImeInputTarget().getWindowState()); mDisplayContent.getImeInputTarget().getWindowState().setRequestedVisibleTypes(ime(), ime()); @@ -228,7 +240,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { @SetupWindows(addWindows = W_INPUT_METHOD) @Test public void testStripForDispatch_childWindow_altFocusable() { - getController().getSourceProvider(ID_IME).setWindowContainer(mImeWindow, null, null); + getController().getOrCreateSourceProvider(ID_IME, ime()) + .setWindowContainer(mImeWindow, null, null); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); final WindowState child = createWindow(app, TYPE_APPLICATION, "child"); @@ -248,7 +261,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { @SetupWindows(addWindows = W_INPUT_METHOD) @Test public void testStripForDispatch_childWindow_splitScreen() { - getController().getSourceProvider(ID_IME).setWindowContainer(mImeWindow, null, null); + getController().getOrCreateSourceProvider(ID_IME, ime()) + .setWindowContainer(mImeWindow, null, null); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); final WindowState child = createWindow(app, TYPE_APPLICATION, "child"); @@ -274,20 +288,21 @@ public class InsetsStateControllerTest extends WindowTestsBase { ime.mAttrs.flags |= FLAG_NOT_FOCUSABLE; WindowContainerInsetsSourceProvider statusBarProvider = - getController().getSourceProvider(ITYPE_STATUS_BAR); + getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()); final SparseArray<TriConsumer<DisplayFrames, WindowContainer, Rect>> imeOverrideProviders = new SparseArray<>(); imeOverrideProviders.put(TYPE_INPUT_METHOD, ((displayFrames, windowState, rect) -> rect.set(0, 1, 2, 3))); statusBarProvider.setWindowContainer(statusBar, null, imeOverrideProviders); - getController().getSourceProvider(ID_IME).setWindowContainer(ime, null, null); + getController().getOrCreateSourceProvider(ID_IME, ime()) + .setWindowContainer(ime, null, null); statusBar.setControllableInsetProvider(statusBarProvider); statusBar.updateSourceFrame(statusBar.getFrame()); statusBarProvider.onPostLayout(); final InsetsState state = ime.getInsetsState(); - assertEquals(new Rect(0, 1, 2, 3), state.peekSource(ITYPE_STATUS_BAR).getFrame()); + assertEquals(new Rect(0, 1, 2, 3), state.peekSource(ID_STATUS_BAR).getFrame()); } @Test @@ -297,15 +312,14 @@ public class InsetsStateControllerTest extends WindowTestsBase { final WindowState climateBar = createWindow(null, TYPE_APPLICATION, "climateBar"); final WindowState extraNavBar = createWindow(null, TYPE_APPLICATION, "extraNavBar"); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); - getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null, - null); - getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindowContainer(navBar, null, - null); - getController().getSourceProvider(ITYPE_CLIMATE_BAR).setWindowContainer(climateBar, null, - null); - getController().getSourceProvider(ITYPE_EXTRA_NAVIGATION_BAR).setWindowContainer( - extraNavBar, null, - null); + getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) + .setWindowContainer(statusBar, null, null); + getController().getOrCreateSourceProvider(ID_NAVIGATION_BAR, navigationBars()) + .setWindowContainer(navBar, null, null); + getController().getOrCreateSourceProvider(ID_CLIMATE_BAR, statusBars()) + .setWindowContainer(climateBar, null, null); + getController().getOrCreateSourceProvider(ID_EXTRA_NAVIGATION_BAR, navigationBars()) + .setWindowContainer(extraNavBar, null, null); getController().onBarControlTargetChanged(app, null, app, null); InsetsSourceControl[] controls = getController().getControlsForDispatch(app); assertEquals(4, controls.length); @@ -315,8 +329,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { public void testControlRevoked() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); - getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null, - null); + getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) + .setWindowContainer(statusBar, null, null); getController().onBarControlTargetChanged(app, null, null, null); assertNotNull(getController().getControlsForDispatch(app)); getController().onBarControlTargetChanged(null, null, null, null); @@ -327,8 +341,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { public void testControlRevoked_animation() { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); - getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null, - null); + getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) + .setWindowContainer(statusBar, null, null); getController().onBarControlTargetChanged(app, null, null, null); assertNotNull(getController().getControlsForDispatch(app)); statusBar.cancelAnimation(); @@ -340,22 +354,22 @@ public class InsetsStateControllerTest extends WindowTestsBase { final WindowState statusBar = createWindow(null, TYPE_APPLICATION, "statusBar"); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); final WindowContainerInsetsSourceProvider provider = getController() - .getSourceProvider(ITYPE_STATUS_BAR); + .getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()); provider.setWindowContainer(statusBar, null, null); final InsetsState rotatedState = new InsetsState(app.getInsetsState(), true /* copySources */); - rotatedState.getOrCreateSource(ITYPE_STATUS_BAR, statusBars()); + rotatedState.getOrCreateSource(ID_STATUS_BAR, statusBars()); spyOn(app.mToken); doReturn(rotatedState).when(app.mToken).getFixedRotationTransformInsetsState(); - assertTrue(rotatedState.isSourceOrDefaultVisible(ITYPE_STATUS_BAR, statusBars())); + assertTrue(rotatedState.isSourceOrDefaultVisible(ID_STATUS_BAR, statusBars())); provider.getSource().setVisible(false); - mDisplayContent.getInsetsPolicy().showTransient(new int[] { ITYPE_STATUS_BAR }, + mDisplayContent.getInsetsPolicy().showTransient(statusBars(), true /* isGestureOnSystemBar */); - assertTrue(mDisplayContent.getInsetsPolicy().isTransient(ITYPE_STATUS_BAR)); - assertFalse(app.getInsetsState().isSourceOrDefaultVisible(ITYPE_STATUS_BAR, statusBars())); + assertTrue(mDisplayContent.getInsetsPolicy().isTransient(statusBars())); + assertFalse(app.getInsetsState().isSourceOrDefaultVisible(ID_STATUS_BAR, statusBars())); } @Test @@ -364,18 +378,18 @@ public class InsetsStateControllerTest extends WindowTestsBase { final WindowState statusBar = createTestWindow("statusBar"); final WindowState navBar = createTestWindow("navBar"); - getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null, - null); + getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) + .setWindowContainer(statusBar, null, null); - assertNull(app.mAboveInsetsState.peekSource(ITYPE_STATUS_BAR)); - assertNull(statusBar.mAboveInsetsState.peekSource(ITYPE_STATUS_BAR)); - assertNull(navBar.mAboveInsetsState.peekSource(ITYPE_STATUS_BAR)); + assertNull(app.mAboveInsetsState.peekSource(ID_STATUS_BAR)); + assertNull(statusBar.mAboveInsetsState.peekSource(ID_STATUS_BAR)); + assertNull(navBar.mAboveInsetsState.peekSource(ID_STATUS_BAR)); getController().updateAboveInsetsState(true /* notifyInsetsChange */); - assertNotNull(app.mAboveInsetsState.peekSource(ITYPE_STATUS_BAR)); - assertNull(statusBar.mAboveInsetsState.peekSource(ITYPE_STATUS_BAR)); - assertNull(navBar.mAboveInsetsState.peekSource(ITYPE_STATUS_BAR)); + assertNotNull(app.mAboveInsetsState.peekSource(ID_STATUS_BAR)); + assertNull(statusBar.mAboveInsetsState.peekSource(ID_STATUS_BAR)); + assertNull(navBar.mAboveInsetsState.peekSource(ID_STATUS_BAR)); verify(app, atLeastOnce()).notifyInsetsChanged(); } @@ -386,18 +400,18 @@ public class InsetsStateControllerTest extends WindowTestsBase { final WindowState statusBar = createTestWindow("statusBar"); final WindowState navBar = createTestWindow("navBar"); - getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null, - null); - getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindowContainer(navBar, null, - null); + getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) + .setWindowContainer(statusBar, null, null); + getController().getOrCreateSourceProvider(ID_NAVIGATION_BAR, navigationBars()) + .setWindowContainer(navBar, null, null); - assertNull(app.mAboveInsetsState.peekSource(ITYPE_STATUS_BAR)); - assertNull(app.mAboveInsetsState.peekSource(ITYPE_NAVIGATION_BAR)); + assertNull(app.mAboveInsetsState.peekSource(ID_STATUS_BAR)); + assertNull(app.mAboveInsetsState.peekSource(ID_NAVIGATION_BAR)); getController().updateAboveInsetsState(true /* notifyInsetsChange */); - assertNotNull(app.mAboveInsetsState.peekSource(ITYPE_STATUS_BAR)); - assertNotNull(app.mAboveInsetsState.peekSource(ITYPE_NAVIGATION_BAR)); + assertNotNull(app.mAboveInsetsState.peekSource(ID_STATUS_BAR)); + assertNotNull(app.mAboveInsetsState.peekSource(ID_NAVIGATION_BAR)); verify(app, atLeastOnce()).notifyInsetsChanged(); } @@ -409,19 +423,21 @@ public class InsetsStateControllerTest extends WindowTestsBase { final WindowState statusBar = createTestWindow("statusBar"); final WindowState navBar = createTestWindow("navBar"); - getController().getSourceProvider(ID_IME).setWindowContainer(ime, null, null); + final InsetsSourceProvider imeSourceProvider = + getController().getOrCreateSourceProvider(ID_IME, ime()); + imeSourceProvider.setWindowContainer(ime, null, null); waitUntilHandlersIdle(); clearInvocations(mDisplayContent); - getController().getSourceProvider(ID_IME).setClientVisible(true); + imeSourceProvider.setClientVisible(true); waitUntilHandlersIdle(); // The visibility change should trigger a traversal to notify the change. verify(mDisplayContent).notifyInsetsChanged(any()); - getController().getSourceProvider(ITYPE_STATUS_BAR).setWindowContainer(statusBar, null, - null); - getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindowContainer(navBar, null, - null); + getController().getOrCreateSourceProvider(ID_STATUS_BAR, statusBars()) + .setWindowContainer(statusBar, null, null); + getController().getOrCreateSourceProvider(ID_NAVIGATION_BAR, navigationBars()) + .setWindowContainer(navBar, null, null); getController().updateAboveInsetsState(false /* notifyInsetsChange */); @@ -429,8 +445,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { assertNull(app.mAboveInsetsState.peekSource(ID_IME)); assertNull(statusBar.mAboveInsetsState.peekSource(ID_IME)); assertNull(navBar.mAboveInsetsState.peekSource(ID_IME)); - assertNotNull(ime.mAboveInsetsState.peekSource(ITYPE_STATUS_BAR)); - assertNotNull(ime.mAboveInsetsState.peekSource(ITYPE_NAVIGATION_BAR)); + assertNotNull(ime.mAboveInsetsState.peekSource(ID_STATUS_BAR)); + assertNotNull(ime.mAboveInsetsState.peekSource(ID_NAVIGATION_BAR)); ime.getParent().positionChildAt(POSITION_TOP, ime, true /* includingParents */); getController().updateAboveInsetsState(true /* notifyInsetsChange */); @@ -439,8 +455,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { assertNotNull(app.mAboveInsetsState.peekSource(ID_IME)); assertNotNull(statusBar.mAboveInsetsState.peekSource(ID_IME)); assertNotNull(navBar.mAboveInsetsState.peekSource(ID_IME)); - assertNull(ime.mAboveInsetsState.peekSource(ITYPE_STATUS_BAR)); - assertNull(ime.mAboveInsetsState.peekSource(ITYPE_NAVIGATION_BAR)); + assertNull(ime.mAboveInsetsState.peekSource(ID_STATUS_BAR)); + assertNull(ime.mAboveInsetsState.peekSource(ID_NAVIGATION_BAR)); verify(ime, atLeastOnce()).notifyInsetsChanged(); verify(app, atLeastOnce()).notifyInsetsChanged(); @@ -454,7 +470,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { final WindowState ime = createWindow(null, TYPE_INPUT_METHOD, imeToken, "ime"); final WindowState app = createTestWindow("app"); - getController().getSourceProvider(ID_IME).setWindowContainer(ime, null, null); + getController().getOrCreateSourceProvider(ID_IME, ime()) + .setWindowContainer(ime, null, null); ime.getControllableInsetProvider().setServerVisible(true); app.mActivityRecord.setVisibility(true); @@ -489,12 +506,12 @@ public class InsetsStateControllerTest extends WindowTestsBase { @Test public void testDispatchGlobalInsets() { final WindowState navBar = createWindow(null, TYPE_APPLICATION, "navBar"); - getController().getSourceProvider(ITYPE_NAVIGATION_BAR).setWindowContainer(navBar, null, - null); + getController().getOrCreateSourceProvider(ID_NAVIGATION_BAR, navigationBars()) + .setWindowContainer(navBar, null, null); final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); - assertNull(app.getInsetsState().peekSource(ITYPE_NAVIGATION_BAR)); + assertNull(app.getInsetsState().peekSource(ID_NAVIGATION_BAR)); app.mAttrs.receiveInsetsIgnoringZOrder = true; - assertNotNull(app.getInsetsState().peekSource(ITYPE_NAVIGATION_BAR)); + assertNotNull(app.getInsetsState().peekSource(ID_NAVIGATION_BAR)); } @SetupWindows(addWindows = W_INPUT_METHOD) @@ -504,7 +521,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { final WindowState app2 = createTestWindow("app2"); makeWindowVisible(mImeWindow); - final InsetsSourceProvider imeInsetsProvider = getController().getSourceProvider(ID_IME); + final InsetsSourceProvider imeInsetsProvider = + getController().getOrCreateSourceProvider(ID_IME, ime()); imeInsetsProvider.setWindowContainer(mImeWindow, null, null); imeInsetsProvider.updateSourceFrame(mImeWindow.getFrame()); diff --git a/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java index 0037e578e89e..0db983c6396c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RefreshRatePolicyTest.java @@ -34,6 +34,7 @@ import android.os.Parcel; import android.platform.test.annotations.Presubmit; import android.view.Display.Mode; import android.view.Surface; +import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import androidx.test.filters.FlakyTest; @@ -292,6 +293,14 @@ public class RefreshRatePolicyTest extends WindowTestsBase { assertEquals(0, mPolicy.getPreferredMinRefreshRate(overrideWindow), FLOAT_TOLERANCE); assertEquals(0, mPolicy.getPreferredMaxRefreshRate(overrideWindow), FLOAT_TOLERANCE); + // Use default mode if it is animating by shell transition. + overrideWindow.mActivityRecord.mSurfaceAnimator.cancelAnimation(); + registerTestTransitionPlayer(); + final Transition transition = overrideWindow.mTransitionController.createTransition( + WindowManager.TRANSIT_OPEN); + transition.collect(overrideWindow.mActivityRecord); + assertEquals(0, mPolicy.getPreferredModeId(overrideWindow)); + // If there will be display size change when switching from preferred mode to default mode, // then keep the current preferred mode during animating. mDisplayInfo = spy(mDisplayInfo); diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java index 90181389c772..95348a043780 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java @@ -106,10 +106,8 @@ public class TransitionTests extends WindowTestsBase { private BLASTSyncEngine mSyncEngine; private Transition createTestTransition(int transitType) { - TransitionTracer tracer = mock(TransitionTracer.class); - final TransitionController controller = new TransitionController( - mock(ActivityTaskManagerService.class), mock(TaskSnapshotController.class), - mock(TransitionTracer.class)); + final TransitionController controller = new TestTransitionController( + mock(ActivityTaskManagerService.class)); mSyncEngine = createTestBLASTSyncEngine(); final Transition t = new Transition(transitType, 0 /* flags */, controller, mSyncEngine); @@ -780,8 +778,7 @@ public class TransitionTests extends WindowTestsBase { @Test public void testTimeout() { - final TransitionController controller = new TransitionController(mAtm, - mock(TaskSnapshotController.class), mock(TransitionTracer.class)); + final TransitionController controller = new TestTransitionController(mAtm); final BLASTSyncEngine sync = new BLASTSyncEngine(mWm); final CountDownLatch latch = new CountDownLatch(1); // When the timeout is reached, it will finish the sync-group and notify transaction ready. @@ -1062,9 +1059,7 @@ public class TransitionTests extends WindowTestsBase { @Test public void testIntermediateVisibility() { - final TaskSnapshotController snapshotController = mock(TaskSnapshotController.class); - final TransitionController controller = new TransitionController(mAtm, snapshotController, - mock(TransitionTracer.class)); + final TransitionController controller = new TestTransitionController(mAtm); final ITransitionPlayer player = new ITransitionPlayer.Default(); controller.registerTransitionPlayer(player, null /* playerProc */); final Transition openTransition = controller.createTransition(TRANSIT_OPEN); @@ -1135,10 +1130,8 @@ public class TransitionTests extends WindowTestsBase { @Test public void testTransientLaunch() { - final TaskSnapshotController snapshotController = mock(TaskSnapshotController.class); final ArrayList<ActivityRecord> enteringAnimReports = new ArrayList<>(); - final TransitionController controller = new TransitionController(mAtm, snapshotController, - mock(TransitionTracer.class)) { + final TransitionController controller = new TestTransitionController(mAtm) { @Override protected void dispatchLegacyAppTransitionFinished(ActivityRecord ar) { if (ar.mEnteringAnimation) { @@ -1147,6 +1140,7 @@ public class TransitionTests extends WindowTestsBase { super.dispatchLegacyAppTransitionFinished(ar); } }; + final TaskSnapshotController snapshotController = controller.mTaskSnapshotController; final ITransitionPlayer player = new ITransitionPlayer.Default(); controller.registerTransitionPlayer(player, null /* playerProc */); final Transition openTransition = controller.createTransition(TRANSIT_OPEN); @@ -1211,9 +1205,7 @@ public class TransitionTests extends WindowTestsBase { @Test public void testNotReadyPushPop() { - final TaskSnapshotController snapshotController = mock(TaskSnapshotController.class); - final TransitionController controller = new TransitionController(mAtm, snapshotController, - mock(TransitionTracer.class)); + final TransitionController controller = new TestTransitionController(mAtm); final ITransitionPlayer player = new ITransitionPlayer.Default(); controller.registerTransitionPlayer(player, null /* playerProc */); final Transition openTransition = controller.createTransition(TRANSIT_OPEN); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerInsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerInsetsSourceProviderTest.java index 1e5ec4c4e48c..7d13de84642e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerInsetsSourceProviderTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerInsetsSourceProviderTest.java @@ -170,10 +170,10 @@ public class WindowContainerInsetsSourceProviderTest extends WindowTestsBase { final WindowState target = createWindow(null, TYPE_APPLICATION, "target"); statusBar.getFrame().set(0, 0, 500, 100); mProvider.setWindowContainer(statusBar, null, null); - mProvider.updateControlForFakeTarget(target); + mProvider.updateFakeControlTarget(target); assertNotNull(mProvider.getControl(target)); assertNull(mProvider.getControl(target).getLeash()); - mProvider.updateControlForFakeTarget(null); + mProvider.updateFakeControlTarget(null); assertNull(mProvider.getControl(target)); } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java index cac7745a5e86..2984de9f9cf5 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java @@ -200,7 +200,7 @@ public class WindowManagerServiceTests extends WindowTestsBase { final WindowSurfaceController surfaceController = mock(WindowSurfaceController.class); doReturn(true).when(surfaceController).hasSurface(); spyOn(win); - doReturn(true).when(win).isExitAnimationRunningSelfOrParent(); + doReturn(true).when(win).isAnimationRunningSelfOrParent(); win.mWinAnimator.mSurfaceController = surfaceController; win.mViewVisibility = View.VISIBLE; win.mHasSurface = true; diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index c44869b10642..17b44ee65442 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -437,13 +437,15 @@ public class WindowStateTests extends WindowTestsBase { final WindowState app = mAppWindow; statusBar.mHasSurface = true; assertTrue(statusBar.isVisible()); - mDisplayContent.getInsetsStateController().getSourceProvider(ITYPE_STATUS_BAR) + mDisplayContent.getInsetsStateController() + .getOrCreateSourceProvider(ITYPE_STATUS_BAR, statusBars()) .setWindowContainer(statusBar, null /* frameProvider */, null /* imeFrameProvider */); mDisplayContent.getInsetsStateController().onBarControlTargetChanged( app, null /* fakeTopControlling */, app, null /* fakeNavControlling */); app.setRequestedVisibleTypes(0, statusBars()); - mDisplayContent.getInsetsStateController().getSourceProvider(ITYPE_STATUS_BAR) + mDisplayContent.getInsetsStateController() + .getOrCreateSourceProvider(ITYPE_STATUS_BAR, statusBars()) .updateClientVisibility(app); waitUntilHandlersIdle(); assertFalse(statusBar.isVisible()); @@ -1169,8 +1171,8 @@ public class WindowStateTests extends WindowTestsBase { mNotificationShadeWindow.setHasSurface(true); mNotificationShadeWindow.mAttrs.flags &= ~FLAG_NOT_FOCUSABLE; assertTrue(mNotificationShadeWindow.canBeImeTarget()); - mDisplayContent.getInsetsStateController().getSourceProvider(ID_IME).setWindowContainer( - mImeWindow, null, null); + mDisplayContent.getInsetsStateController().getOrCreateSourceProvider(ID_IME, ime()) + .setWindowContainer(mImeWindow, null, null); mDisplayContent.computeImeTarget(true); assertEquals(mNotificationShadeWindow, mDisplayContent.getImeTarget(IME_TARGET_LAYERING)); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index 3e8d259e26ec..323894ca76df 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -1743,6 +1743,14 @@ class WindowTestsBase extends SystemServiceTestsBase { } } + static class TestTransitionController extends TransitionController { + TestTransitionController(ActivityTaskManagerService atms) { + super(atms); + mTaskSnapshotController = mock(TaskSnapshotController.class); + mTransitionTracer = mock(TransitionTracer.class); + } + } + static class TestTransitionPlayer extends ITransitionPlayer.Stub { final TransitionController mController; final WindowOrganizerController mOrganizer; diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java index bd63560ee92f..714eb4b3c093 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTokenTests.java @@ -39,6 +39,7 @@ import android.content.res.Configuration; import android.os.Bundle; import android.os.IBinder; import android.platform.test.annotations.Presubmit; +import android.view.WindowInsets; import android.window.WindowContext; import androidx.test.filters.SmallTest; @@ -262,8 +263,9 @@ public class WindowTokenTests extends WindowTestsBase { @Test public void testSetInsetsFrozen_notAffectImeWindowState() { // Pre-condition: make the IME window be controlled by IME insets provider. - mDisplayContent.getInsetsStateController().getSourceProvider(ID_IME).setWindowContainer( - mDisplayContent.mInputMethodWindow, null, null); + mDisplayContent.getInsetsStateController() + .getOrCreateSourceProvider(ID_IME, WindowInsets.Type.ime()) + .setWindowContainer(mDisplayContent.mInputMethodWindow, null, null); // Simulate an app window to be the IME layering target, assume the app window has no // frozen insets state by default. diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index a480ebdf1bc7..12e5ed95fecb 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -44,7 +44,6 @@ import android.debug.AdbManagerInternal; import android.debug.AdbNotifications; import android.debug.AdbTransportType; import android.debug.IAdbTransport; -import android.hardware.usb.IUsbOperationInternal; import android.hardware.usb.ParcelableUsbPort; import android.hardware.usb.UsbAccessory; import android.hardware.usb.UsbConfiguration; @@ -57,7 +56,6 @@ import android.hardware.usb.UsbPortStatus; import android.hardware.usb.gadget.V1_0.GadgetFunction; import android.hardware.usb.gadget.V1_0.Status; import android.hardware.usb.gadget.V1_2.UsbSpeed; -import android.hidl.manager.V1_0.IServiceManager; import android.hidl.manager.V1_0.IServiceNotification; import android.os.BatteryManager; import android.os.Environment; @@ -1351,6 +1349,9 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser || (mCurrentFunctions == UsbManager.FUNCTION_NCM)) { titleRes = com.android.internal.R.string.usb_tether_notification_title; id = SystemMessage.NOTE_USB_TETHER; + } else if (mCurrentFunctions == UsbManager.FUNCTION_UVC) { + titleRes = com.android.internal.R.string.usb_uvc_notification_title; + id = SystemMessage.NOTE_USB_UVC; } else if (mCurrentFunctions == UsbManager.FUNCTION_ACCESSORY) { titleRes = com.android.internal.R.string.usb_accessory_notification_title; id = SystemMessage.NOTE_USB_ACCESSORY; @@ -2403,6 +2404,9 @@ public class UsbDeviceManager implements ActivityTaskManagerInternal.ScreenObser MetricsLogger.action(mContext, MetricsEvent.ACTION_USB_CONFIG_RNDIS); } else if (functions == UsbManager.FUNCTION_ACCESSORY) { MetricsLogger.action(mContext, MetricsEvent.ACTION_USB_CONFIG_ACCESSORY); + } else if (functions == UsbManager.FUNCTION_UVC) { + // MetricsLogger.action(mContext, MetricsEvent.ACTION_USB_CONFIG_UVC); + // TODO: Add MetricsEvent for UVC? } mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, functions, operationId); } diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index 7c86a75ac023..20564d6f3c14 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -951,6 +951,23 @@ public class TelecomManager { public static final String EXTRA_CALL_SOURCE = "android.telecom.extra.CALL_SOURCE"; /** + * Intent action to trigger "switch to managed profile" dialog for call in SystemUI + * + * @hide + */ + public static final String ACTION_SHOW_SWITCH_TO_WORK_PROFILE_FOR_CALL_DIALOG = + "android.telecom.action.SHOW_SWITCH_TO_WORK_PROFILE_FOR_CALL_DIALOG"; + + /** + * Extra specifying the managed profile user id. + * This is used with {@link TelecomManager#ACTION_SHOW_SWITCH_TO_WORK_PROFILE_FOR_CALL_DIALOG} + * + * @hide + */ + public static final String EXTRA_MANAGED_PROFILE_USER_ID = + "android.telecom.extra.MANAGED_PROFILE_USER_ID"; + + /** * Indicating the call is initiated via emergency dialer's shortcut button. * * @hide diff --git a/telephony/java/android/telephony/CallState.java b/telephony/java/android/telephony/CallState.java index 51ecfb0a0be8..836cb53488ef 100644 --- a/telephony/java/android/telephony/CallState.java +++ b/telephony/java/android/telephony/CallState.java @@ -285,12 +285,12 @@ public final class CallState implements Parcelable { /** * Builder of {@link CallState} * - * <p>The example below shows how you might create a new {@code CallState}: + * <p>The example below shows how you might create a new {@code CallState}. A precise call state + * {@link PreciseCallStates} is mandatory to build a CallState. * * <pre><code> * - * CallState = new CallState.Builder() - * .setCallState(3) + * CallState = new CallState.Builder({@link PreciseCallStates}) * .setNetworkType({@link TelephonyManager#NETWORK_TYPE_LTE}) * .setCallQuality({@link CallQuality}) * .setImsCallSessionId({@link String}) diff --git a/telephony/java/android/telephony/euicc/EuiccManager.java b/telephony/java/android/telephony/euicc/EuiccManager.java index 1e21e9a98ec2..ed4627631dd5 100644 --- a/telephony/java/android/telephony/euicc/EuiccManager.java +++ b/telephony/java/android/telephony/euicc/EuiccManager.java @@ -882,6 +882,16 @@ public class EuiccManager { @EnabledSince(targetSdkVersion = Build.VERSION_CODES.TIRAMISU) public static final long SHOULD_RESOLVE_PORT_INDEX_FOR_APPS = 224562872L; + /** + * Starting with Android U, a port is available if it is active without an enabled profile + * on it or calling app can activate a new profile on the selected port without any user + * interaction. + * @hide + */ + @ChangeId + @EnabledSince(targetSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final long INACTIVE_PORT_AVAILABILITY_CHECK = 240273417L; + private final Context mContext; private int mCardId; @@ -1611,8 +1621,12 @@ public class EuiccManager { /** * Returns whether the passing portIndex is available. - * A port is available if it is active without an enabled profile on it or calling app can - * activate a new profile on the selected port without any user interaction. + * A port is available if it is active without enabled profile on it or + * calling app has carrier privilege over the profile installed on the selected port. + * + * <p> From Android U, a port is available if it is active without an enabled profile on it or + * calling app can activate a new profile on the selected port without any user interaction. + * * Always returns false if the cardId is a physical card. * * @param portIndex is an enumeration of the ports available on the UICC. diff --git a/telephony/java/android/telephony/ims/ImsCallProfile.java b/telephony/java/android/telephony/ims/ImsCallProfile.java index 1ea7fdc982a5..d07edeb971ea 100644 --- a/telephony/java/android/telephony/ims/ImsCallProfile.java +++ b/telephony/java/android/telephony/ims/ImsCallProfile.java @@ -27,6 +27,7 @@ import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.telecom.VideoProfile; +import android.telephony.CallState; import android.telephony.emergency.EmergencyNumber; import android.telephony.emergency.EmergencyNumber.EmergencyCallRouting; import android.telephony.emergency.EmergencyNumber.EmergencyServiceCategories; @@ -78,7 +79,9 @@ public final class ImsCallProfile implements Parcelable { public static final int SERVICE_TYPE_EMERGENCY = 2; /** - * Call type none + * This value is returned if there is no valid IMS call type defined for the call. For example, + * if an ongoing call is circuit-switched and {@link CallState#getImsCallType()} is called, this + * value will be returned. */ public static final int CALL_TYPE_NONE = 0; /** diff --git a/telephony/java/com/android/internal/telephony/PhoneConstants.java b/telephony/java/com/android/internal/telephony/PhoneConstants.java index 0f83a0529436..a9ebd5c2d7cd 100644 --- a/telephony/java/com/android/internal/telephony/PhoneConstants.java +++ b/telephony/java/com/android/internal/telephony/PhoneConstants.java @@ -243,6 +243,13 @@ public class PhoneConstants { /** The key to specify the selected domain for dialing calls. */ public static final String EXTRA_DIAL_DOMAIN = "dial_domain"; + /** + * Indicates that this call should be routed over Wi-Fi. + * An internal extension of NetworkRegistrationInfo's DOMAIN_* constants + * to also include NON_3GPP_PS routing for the domain selection service. + */ + public static final int DOMAIN_NON_3GPP_PS = 4; + /** The key to specify the emergency service category */ public static final String EXTRA_EMERGENCY_SERVICE_CATEGORY = "emergency_service_category"; } diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/MeshActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/MeshActivity.java index d3a5885b324d..413f92c5446b 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/MeshActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/MeshActivity.java @@ -26,7 +26,7 @@ import android.graphics.MeshSpecification; import android.graphics.MeshSpecification.Attribute; import android.graphics.MeshSpecification.Varying; import android.graphics.Paint; -import android.graphics.Rect; +import android.graphics.RectF; import android.os.Bundle; import android.view.View; @@ -64,8 +64,8 @@ public class MeshActivity extends Activity { vertexBuffer.put(4, 0.0f); vertexBuffer.put(5, 400.0f); vertexBuffer.rewind(); - Mesh mesh = Mesh.make( - meshSpec, Mesh.TRIANGLES, vertexBuffer, 3, new Rect(0, 0, 1000, 1000)); + Mesh mesh = new Mesh( + meshSpec, Mesh.TRIANGLES, vertexBuffer, 3, new RectF(0, 0, 1000, 1000)); canvas.drawMesh(mesh, BlendMode.COLOR, new Paint()); @@ -98,8 +98,8 @@ public class MeshActivity extends Activity { } iVertexBuffer.rewind(); indexBuffer.rewind(); - Mesh mesh2 = Mesh.makeIndexed(meshSpec, Mesh.TRIANGLES, iVertexBuffer, 102, indexBuffer, - new Rect(0, 0, 1000, 1000)); + Mesh mesh2 = new Mesh(meshSpec, Mesh.TRIANGLES, iVertexBuffer, 102, indexBuffer, + new RectF(0, 0, 1000, 1000)); Paint paint = new Paint(); paint.setColor(Color.RED); canvas.drawMesh(mesh2, BlendMode.COLOR, paint); diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/MeshLargeActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/MeshLargeActivity.java index f97d942fa483..e62db6bd6c02 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/MeshLargeActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/MeshLargeActivity.java @@ -26,7 +26,7 @@ import android.graphics.MeshSpecification; import android.graphics.MeshSpecification.Attribute; import android.graphics.MeshSpecification.Varying; import android.graphics.Paint; -import android.graphics.Rect; +import android.graphics.RectF; import android.os.Bundle; import android.view.View; @@ -109,9 +109,9 @@ public class MeshLargeActivity extends Activity { } vertexBuffer.rewind(); indexBuffer.rewind(); - Mesh mesh = Mesh.makeIndexed( + Mesh mesh = new Mesh( meshSpec, Mesh.TRIANGLES, vertexBuffer, numTriangles + 2, indexBuffer, - new Rect(0, 0, 1000, 1000) + new RectF(0, 0, 1000, 1000) ); mesh.setFloatUniform("test", 1.0f, 2.0f); Paint paint = new Paint(); diff --git a/tests/InputMethodStressTest/src/com/android/inputmethod/stresstest/AutoShowTest.java b/tests/InputMethodStressTest/src/com/android/inputmethod/stresstest/AutoShowTest.java index 9b0f952133aa..0c7e452e49d3 100644 --- a/tests/InputMethodStressTest/src/com/android/inputmethod/stresstest/AutoShowTest.java +++ b/tests/InputMethodStressTest/src/com/android/inputmethod/stresstest/AutoShowTest.java @@ -60,12 +60,15 @@ import java.util.List; @RunWith(Parameterized.class) public final class AutoShowTest { - @Rule public UnlockScreenRule mUnlockScreenRule = new UnlockScreenRule(); - @Rule public ScreenCaptureRule mScreenCaptureRule = - new ScreenCaptureRule("/sdcard/InputMethodStressTest"); - @Rule public DisableLockScreenRule mDisableLockScreenRule = new DisableLockScreenRule(); - @Rule public ScreenOrientationRule mScreenOrientationRule = + @Rule(order = 0) public DisableLockScreenRule mDisableLockScreenRule = + new DisableLockScreenRule(); + @Rule(order = 1) public UnlockScreenRule mUnlockScreenRule = new UnlockScreenRule(); + @Rule(order = 2) public ScreenOrientationRule mScreenOrientationRule = new ScreenOrientationRule(true /* isPortrait */); + @Rule(order = 3) public PressHomeBeforeTestRule mPressHomeBeforeTestRule = + new PressHomeBeforeTestRule(); + @Rule(order = 4) public ScreenCaptureRule mScreenCaptureRule = + new ScreenCaptureRule("/sdcard/InputMethodStressTest"); // TODO(b/240359838): add test case {@code Configuration.SCREENLAYOUT_SIZE_LARGE}. @Parameterized.Parameters( diff --git a/tests/InputMethodStressTest/src/com/android/inputmethod/stresstest/ImeOpenCloseStressTest.java b/tests/InputMethodStressTest/src/com/android/inputmethod/stresstest/ImeOpenCloseStressTest.java index e3481849abdc..9d4aefb69386 100644 --- a/tests/InputMethodStressTest/src/com/android/inputmethod/stresstest/ImeOpenCloseStressTest.java +++ b/tests/InputMethodStressTest/src/com/android/inputmethod/stresstest/ImeOpenCloseStressTest.java @@ -68,12 +68,15 @@ public final class ImeOpenCloseStressTest { private static final String TAG = "ImeOpenCloseStressTest"; private static final int NUM_TEST_ITERATIONS = 10; - @Rule public UnlockScreenRule mUnlockScreenRule = new UnlockScreenRule(); - @Rule public ScreenCaptureRule mScreenCaptureRule = - new ScreenCaptureRule("/sdcard/InputMethodStressTest"); - @Rule public DisableLockScreenRule mDisableLockScreenRule = new DisableLockScreenRule(); - @Rule public ScreenOrientationRule mScreenOrientationRule = + @Rule(order = 0) public DisableLockScreenRule mDisableLockScreenRule = + new DisableLockScreenRule(); + @Rule(order = 1) public UnlockScreenRule mUnlockScreenRule = new UnlockScreenRule(); + @Rule(order = 2) public ScreenOrientationRule mScreenOrientationRule = new ScreenOrientationRule(true /* isPortrait */); + @Rule(order = 3) public PressHomeBeforeTestRule mPressHomeBeforeTestRule = + new PressHomeBeforeTestRule(); + @Rule(order = 4) public ScreenCaptureRule mScreenCaptureRule = + new ScreenCaptureRule("/sdcard/InputMethodStressTest"); private final Instrumentation mInstrumentation; private final int mSoftInputFlags; diff --git a/tests/InputMethodStressTest/src/com/android/inputmethod/stresstest/PressHomeBeforeTestRule.java b/tests/InputMethodStressTest/src/com/android/inputmethod/stresstest/PressHomeBeforeTestRule.java new file mode 100644 index 000000000000..6586f630fae4 --- /dev/null +++ b/tests/InputMethodStressTest/src/com/android/inputmethod/stresstest/PressHomeBeforeTestRule.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.inputmethod.stresstest; + +import android.support.test.uiautomator.UiDevice; + +import androidx.test.platform.app.InstrumentationRegistry; + +import org.junit.rules.TestWatcher; +import org.junit.runner.Description; + +/** This rule will press home before a test case. */ +public class PressHomeBeforeTestRule extends TestWatcher { + private final UiDevice mUiDevice = + UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); + + @Override + protected void starting(Description description) { + mUiDevice.pressHome(); + } +} diff --git a/tools/lint/framework/Android.bp b/tools/lint/framework/Android.bp index b7525030adc4..30a6daaef2a4 100644 --- a/tools/lint/framework/Android.bp +++ b/tools/lint/framework/Android.bp @@ -37,12 +37,6 @@ java_library_host { java_test_host { name: "AndroidFrameworkLintCheckerTest", - // TODO(b/239881504): Since this test was written, Android - // Lint was updated, and now includes classes that were - // compiled for java 15. The soong build doesn't support - // java 15 yet, so we can't compile against "lint". Disable - // the test until java 15 is supported. - enabled: false, srcs: ["checks/src/test/java/**/*.kt"], static_libs: [ "AndroidFrameworkLintChecker", @@ -52,5 +46,19 @@ java_test_host { ], test_options: { unit_test: true, + tradefed_options: [ + { + // lint bundles in some classes that were built with older versions + // of libraries, and no longer load. Since tradefed tries to load + // all classes in the jar to look for tests, it crashes loading them. + // Exclude these classes from tradefed's search. + name: "exclude-paths", + value: "org/apache", + }, + { + name: "exclude-paths", + value: "META-INF", + }, + ], }, } diff --git a/tools/lint/framework/checks/src/test/java/com/google/android/lint/RegisterReceiverFlagDetectorTest.kt b/tools/lint/framework/checks/src/test/java/com/google/android/lint/RegisterReceiverFlagDetectorTest.kt index b76342a81972..7c0ebca4ec1e 100644 --- a/tools/lint/framework/checks/src/test/java/com/google/android/lint/RegisterReceiverFlagDetectorTest.kt +++ b/tools/lint/framework/checks/src/test/java/com/google/android/lint/RegisterReceiverFlagDetectorTest.kt @@ -105,37 +105,38 @@ class RegisterReceiverFlagDetectorTest : LintDetectorTest() { .expectClean() } - fun testSubsequentFilterModification() { - lint().files( - java( - """ - package test.pkg; - import android.content.BroadcastReceiver; - import android.content.Context; - import android.content.Intent; - import android.content.IntentFilter; - public class TestClass1 { - public void testMethod(Context context, BroadcastReceiver receiver) { - IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); - filter.addAction(Intent.ACTION_BATTERY_LOW); - filter.addAction(Intent.ACTION_BATTERY_OKAY); - context.registerReceiver(receiver, filter); - filter.addAction("querty"); - context.registerReceiver(receiver, filter); - } - } - """ - ).indented(), - *stubs - ) - .run() - .expect(""" - src/test/pkg/TestClass1.java:13: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] - context.registerReceiver(receiver, filter); - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 0 errors, 1 warnings - """.trimIndent()) - } + // TODO(b/267510341): Reenable this test + // fun testSubsequentFilterModification() { + // lint().files( + // java( + // """ + // package test.pkg; + // import android.content.BroadcastReceiver; + // import android.content.Context; + // import android.content.Intent; + // import android.content.IntentFilter; + // public class TestClass1 { + // public void testMethod(Context context, BroadcastReceiver receiver) { + // IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); + // filter.addAction(Intent.ACTION_BATTERY_LOW); + // filter.addAction(Intent.ACTION_BATTERY_OKAY); + // context.registerReceiver(receiver, filter); + // filter.addAction("querty"); + // context.registerReceiver(receiver, filter); + // } + // } + // """ + // ).indented(), + // *stubs + // ) + // .run() + // .expect(""" + // src/test/pkg/TestClass1.java:13: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] + // context.registerReceiver(receiver, filter); + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // 0 errors, 1 warnings + // """.trimIndent()) + // } fun testNullReceiver() { lint().files( @@ -207,61 +208,63 @@ class RegisterReceiverFlagDetectorTest : LintDetectorTest() { .expectClean() } - fun testFlagArgumentAbsent() { - lint().files( - java( - """ - package test.pkg; - import android.content.BroadcastReceiver; - import android.content.Context; - import android.content.Intent; - import android.content.IntentFilter; - public class TestClass1 { - public void testMethod(Context context, BroadcastReceiver receiver) { - IntentFilter filter = new IntentFilter("qwerty"); - context.registerReceiver(receiver, filter); - } - } - """ - ).indented(), - *stubs - ) - .run() - .expect(""" - src/test/pkg/TestClass1.java:9: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] - context.registerReceiver(receiver, filter); - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 0 errors, 1 warnings - """.trimIndent()) - } + // TODO(b/267510341): Reenable this test + // fun testFlagArgumentAbsent() { + // lint().files( + // java( + // """ + // package test.pkg; + // import android.content.BroadcastReceiver; + // import android.content.Context; + // import android.content.Intent; + // import android.content.IntentFilter; + // public class TestClass1 { + // public void testMethod(Context context, BroadcastReceiver receiver) { + // IntentFilter filter = new IntentFilter("qwerty"); + // context.registerReceiver(receiver, filter); + // } + // } + // """ + // ).indented(), + // *stubs + // ) + // .run() + // .expect(""" + // src/test/pkg/TestClass1.java:9: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] + // context.registerReceiver(receiver, filter); + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // 0 errors, 1 warnings + // """.trimIndent()) + // } - fun testExportedFlagsAbsent() { - lint().files( - java( - """ - package test.pkg; - import android.content.BroadcastReceiver; - import android.content.Context; - import android.content.Intent; - import android.content.IntentFilter; - public class TestClass1 { - public void testMethod(Context context, BroadcastReceiver receiver) { - IntentFilter filter = new IntentFilter("qwerty"); - context.registerReceiver(receiver, filter, 0); - } - } - """ - ).indented(), - *stubs - ) - .run() - .expect(""" - src/test/pkg/TestClass1.java:9: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] - context.registerReceiver(receiver, filter, 0); - ~ - 0 errors, 1 warnings - """.trimIndent()) - } + // TODO(b/267510341): Reenable this test + // fun testExportedFlagsAbsent() { + // lint().files( + // java( + // """ + // package test.pkg; + // import android.content.BroadcastReceiver; + // import android.content.Context; + // import android.content.Intent; + // import android.content.IntentFilter; + // public class TestClass1 { + // public void testMethod(Context context, BroadcastReceiver receiver) { + // IntentFilter filter = new IntentFilter("qwerty"); + // context.registerReceiver(receiver, filter, 0); + // } + // } + // """ + // ).indented(), + // *stubs + // ) + // .run() + // .expect(""" + // src/test/pkg/TestClass1.java:9: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] + // context.registerReceiver(receiver, filter, 0); + // ~ + // 0 errors, 1 warnings + // """.trimIndent()) + // } fun testExportedFlagVariable() { lint().files( @@ -287,62 +290,64 @@ class RegisterReceiverFlagDetectorTest : LintDetectorTest() { .expectClean() } - fun testUnknownFilter() { - lint().files( - java( - """ - package test.pkg; - import android.content.BroadcastReceiver; - import android.content.Context; - import android.content.Intent; - import android.content.IntentFilter; - public class TestClass1 { - public void testMethod(Context context, BroadcastReceiver receiver, - IntentFilter filter) { - context.registerReceiver(receiver, filter); - } - } - """ - ).indented(), - *stubs - ) - .run() - .expect(""" - src/test/pkg/TestClass1.java:9: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] - context.registerReceiver(receiver, filter); - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 0 errors, 1 warnings - """.trimIndent()) - } + // TODO(b/267510341): Reenable this test + // fun testUnknownFilter() { + // lint().files( + // java( + // """ + // package test.pkg; + // import android.content.BroadcastReceiver; + // import android.content.Context; + // import android.content.Intent; + // import android.content.IntentFilter; + // public class TestClass1 { + // public void testMethod(Context context, BroadcastReceiver receiver, + // IntentFilter filter) { + // context.registerReceiver(receiver, filter); + // } + // } + // """ + // ).indented(), + // *stubs + // ) + // .run() + // .expect(""" + // src/test/pkg/TestClass1.java:9: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] + // context.registerReceiver(receiver, filter); + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // 0 errors, 1 warnings + // """.trimIndent()) + // } - fun testFilterEscapes() { - lint().files( - java( - """ - package test.pkg; - import android.content.BroadcastReceiver; - import android.content.Context; - import android.content.Intent; - import android.content.IntentFilter; - public class TestClass1 { - public void testMethod(Context context, BroadcastReceiver receiver) { - IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); - updateFilter(filter); - context.registerReceiver(receiver, filter); - } - } - """ - ).indented(), - *stubs - ) - .run() - .expect(""" - src/test/pkg/TestClass1.java:10: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] - context.registerReceiver(receiver, filter); - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 0 errors, 1 warnings - """.trimIndent()) - } + // TODO(b/267510341): Reenable this test + // fun testFilterEscapes() { + // lint().files( + // java( + // """ + // package test.pkg; + // import android.content.BroadcastReceiver; + // import android.content.Context; + // import android.content.Intent; + // import android.content.IntentFilter; + // public class TestClass1 { + // public void testMethod(Context context, BroadcastReceiver receiver) { + // IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); + // updateFilter(filter); + // context.registerReceiver(receiver, filter); + // } + // } + // """ + // ).indented(), + // *stubs + // ) + // .run() + // .expect(""" + // src/test/pkg/TestClass1.java:10: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] + // context.registerReceiver(receiver, filter); + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // 0 errors, 1 warnings + // """.trimIndent()) + // } fun testInlineFilter() { lint().files( @@ -367,135 +372,139 @@ class RegisterReceiverFlagDetectorTest : LintDetectorTest() { .expectClean() } - fun testInlineFilterApply() { - lint().files( - kotlin( - """ - package test.pkg - import android.content.BroadcastReceiver - import android.content.Context - import android.content.Intent - import android.content.IntentFilter - class TestClass1 { - fun test(context: Context, receiver: BroadcastReceiver) { - context.registerReceiver(receiver, - IntentFilter(Intent.ACTION_BATTERY_CHANGED).apply { - addAction("qwerty") - }) - } - } - """ - ).indented(), - *stubs - ) - .run() - .expect(""" - src/test/pkg/TestClass1.kt:8: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] - context.registerReceiver(receiver, - ^ - 0 errors, 1 warnings - """.trimIndent()) - } + // TODO(b/267510341): Reenable this test + // fun testInlineFilterApply() { + // lint().files( + // kotlin( + // """ + // package test.pkg + // import android.content.BroadcastReceiver + // import android.content.Context + // import android.content.Intent + // import android.content.IntentFilter + // class TestClass1 { + // fun test(context: Context, receiver: BroadcastReceiver) { + // context.registerReceiver(receiver, + // IntentFilter(Intent.ACTION_BATTERY_CHANGED).apply { + // addAction("qwerty") + // }) + // } + // } + // """ + // ).indented(), + // *stubs + // ) + // .run() + // .expect(""" + // src/test/pkg/TestClass1.kt:8: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] + // context.registerReceiver(receiver, + // ^ + // 0 errors, 1 warnings + // """.trimIndent()) + // } - fun testFilterVariableApply() { - lint().files( - kotlin( - """ - package test.pkg - import android.content.BroadcastReceiver - import android.content.Context - import android.content.Intent - import android.content.IntentFilter - class TestClass1 { - fun test(context: Context, receiver: BroadcastReceiver) { - val filter = IntentFilter(Intent.ACTION_BATTERY_CHANGED).apply { - addAction("qwerty") - } - context.registerReceiver(receiver, filter) - } - } - """ - ).indented(), - *stubs - ) - .run() - .expect(""" - src/test/pkg/TestClass1.kt:11: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] - context.registerReceiver(receiver, filter) - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 0 errors, 1 warnings - """.trimIndent()) - } + // TODO(b/267510341): Reenable this test + // fun testFilterVariableApply() { + // lint().files( + // kotlin( + // """ + // package test.pkg + // import android.content.BroadcastReceiver + // import android.content.Context + // import android.content.Intent + // import android.content.IntentFilter + // class TestClass1 { + // fun test(context: Context, receiver: BroadcastReceiver) { + // val filter = IntentFilter(Intent.ACTION_BATTERY_CHANGED).apply { + // addAction("qwerty") + // } + // context.registerReceiver(receiver, filter) + // } + // } + // """ + // ).indented(), + // *stubs + // ) + // .run() + // .expect(""" + // src/test/pkg/TestClass1.kt:11: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] + // context.registerReceiver(receiver, filter) + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // 0 errors, 1 warnings + // """.trimIndent()) + // } - fun testFilterVariableApply2() { - lint().files( - kotlin( - """ - package test.pkg - import android.content.BroadcastReceiver - import android.content.Context - import android.content.Intent - import android.content.IntentFilter - class TestClass1 { - fun test(context: Context, receiver: BroadcastReceiver) { - val filter = IntentFilter(Intent.ACTION_BATTERY_CHANGED).apply { - addAction(Intent.ACTION_BATTERY_OKAY) - } - context.registerReceiver(receiver, filter.apply { - addAction("qwerty") - }) - } - } - """ - ).indented(), - *stubs - ) - .run() - .expect(""" - src/test/pkg/TestClass1.kt:11: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] - context.registerReceiver(receiver, filter.apply { - ^ - 0 errors, 1 warnings - """.trimIndent()) - } + // TODO(b/267510341): Reenable this test + // fun testFilterVariableApply2() { + // lint().files( + // kotlin( + // """ + // package test.pkg + // import android.content.BroadcastReceiver + // import android.content.Context + // import android.content.Intent + // import android.content.IntentFilter + // class TestClass1 { + // fun test(context: Context, receiver: BroadcastReceiver) { + // val filter = IntentFilter(Intent.ACTION_BATTERY_CHANGED).apply { + // addAction(Intent.ACTION_BATTERY_OKAY) + // } + // context.registerReceiver(receiver, filter.apply { + // addAction("qwerty") + // }) + // } + // } + // """ + // ).indented(), + // *stubs + // ) + // .run() + // .expect(""" + // src/test/pkg/TestClass1.kt:11: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] + // context.registerReceiver(receiver, filter.apply { + // ^ + // 0 errors, 1 warnings + // """.trimIndent()) + // } - fun testFilterComplexChain() { - lint().files( - kotlin( - """ - package test.pkg - import android.content.BroadcastReceiver - import android.content.Context - import android.content.Intent - import android.content.IntentFilter - class TestClass1 { - fun test(context: Context, receiver: BroadcastReceiver) { - val filter = IntentFilter(Intent.ACTION_BATTERY_CHANGED).apply { - addAction(Intent.ACTION_BATTERY_OKAY) - } - val filter2 = filter - val filter3 = filter2.apply { - addAction(Intent.ACTION_BATTERY_LOW) - } - context.registerReceiver(receiver, filter3) - val filter4 = filter3.apply { - addAction("qwerty") - } - context.registerReceiver(receiver, filter4) - } - } - """ - ).indented(), - *stubs - ) - .run() - .expect(""" - src/test/pkg/TestClass1.kt:19: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] - context.registerReceiver(receiver, filter4) - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 0 errors, 1 warnings - """.trimIndent()) - } + // TODO(b/267510341): Reenable this test + // fun testFilterComplexChain() { + // lint().files( + // kotlin( + // """ + // package test.pkg + // import android.content.BroadcastReceiver + // import android.content.Context + // import android.content.Intent + // import android.content.IntentFilter + // class TestClass1 { + // fun test(context: Context, receiver: BroadcastReceiver) { + // val filter = IntentFilter(Intent.ACTION_BATTERY_CHANGED).apply { + // addAction(Intent.ACTION_BATTERY_OKAY) + // } + // val filter2 = filter + // val filter3 = filter2.apply { + // addAction(Intent.ACTION_BATTERY_LOW) + // } + // context.registerReceiver(receiver, filter3) + // val filter4 = filter3.apply { + // addAction("qwerty") + // } + // context.registerReceiver(receiver, filter4) + // } + // } + // """ + // ).indented(), + // *stubs + // ) + // .run() + // .expect(""" + // src/test/pkg/TestClass1.kt:19: Warning: Missing RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED flag [UnspecifiedRegisterReceiverFlag] + // context.registerReceiver(receiver, filter4) + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // 0 errors, 1 warnings + // """.trimIndent()) + // } private val broadcastReceiverStub: TestFile = java( """ |