diff options
1019 files changed, 20545 insertions, 8925 deletions
diff --git a/api/test-current.txt b/api/test-current.txt index cb3674ba6706..87295fa7caba 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -3256,10 +3256,13 @@ package android.view { } @UiThread public class View implements android.view.accessibility.AccessibilityEventSource android.graphics.drawable.Drawable.Callback android.view.KeyEvent.Callback { + method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, to="auto"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_YES, to="yes"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_NO, to="no"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, to="yesExcludeDescendants"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS, to="noExcludeDescendants")}) public int getImportantForContentCapture(); method public android.view.View getTooltipView(); method public boolean isAutofilled(); method public static boolean isDefaultFocusHighlightEnabled(); method public boolean isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable); + method public final boolean isImportantForContentCapture(); + method public void onProvideContentCaptureStructure(@NonNull android.view.ViewStructure, int); method protected void resetResolvedDrawables(); method public void resetResolvedLayoutDirection(); method public void resetResolvedPadding(); @@ -3270,7 +3273,13 @@ package android.view { method public boolean restoreFocusNotInCluster(); method public void setAutofilled(boolean); method public final void setFocusedInCluster(); + method public void setImportantForContentCapture(int); method public void setIsRootNamespace(boolean); + field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_AUTO = 0; // 0x0 + field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO = 2; // 0x2 + field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS = 8; // 0x8 + field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_YES = 1; // 0x1 + field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS = 4; // 0x4 } public class ViewConfiguration { diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index eed7f62eac34..e7cce068cf5f 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -319,6 +319,8 @@ message Atom { 217 [(log_from_module) = "permissioncontroller"]; PermissionAppsFragmentViewed permission_apps_fragment_viewed = 218 [(log_from_module) = "permissioncontroller"]; + ExclusionRectStateChanged exclusion_rect_state_changed = 223; + BackGesture back_gesture_reported_reported = 224; } // Pulled events will start at field 10000. @@ -2500,6 +2502,41 @@ message PhoneStateChanged { optional State state = 1; } +message BackGesture { + enum BackType { + DEFAULT_BACK_TYPE = 0; + COMPLETED = 1; + COMPLETED_REJECTED = 2; // successful because coming from rejected area + INCOMPLETE_EXCLUDED = 3; // would have been successful but in the exclusion area + INCOMPLETE = 4; + } + optional BackType type = 1; + + optional int32 y_coordinate = 2; // y coordinate for ACTION_DOWN event + enum WindowHorizontalLocation { + DEFAULT_LOCATION = 0; + LEFT = 1; + RIGHT = 2; + } + optional WindowHorizontalLocation x_location = 3; +} + +message ExclusionRectStateChanged { + optional string component_name = 1; // if not available, simply packageName + optional int32 requested_height = 2; // px + optional int32 rejected_height = 3; // px + + enum WindowHorizontalLocation { + DEFAULT_LOCATION = 0; + LEFT = 1; + RIGHT = 2; + } + optional WindowHorizontalLocation x_location = 4; + optional bool landscape = 5; + optional bool splitscreen = 6; + optional int32 duration_millis = 7; +} + message LauncherUIChanged { optional android.stats.launcher.LauncherAction action = 1; optional android.stats.launcher.LauncherState src_state = 2; @@ -3291,6 +3328,8 @@ message BiometricErrorOccurred { optional int32 error_info_vendor = 7; // Dictates if this message should trigger additional debugging. optional bool debug = 8; + // Time spent during the authentication attempt. + optional int64 latency_millis = 9; } /** @@ -5299,7 +5338,7 @@ message NetworkDnsEventReported { // Only valid for event_type = EVENT_RESNSEND. optional int32 res_nsend_flags = 5; - optional android.stats.dnsresolver.Transport network_type = 6; + optional android.stats.dnsresolver.NetworkType network_type = 6; // The DNS over TLS mode on a specific netId. optional android.stats.dnsresolver.PrivateDnsModes private_dns_modes = 7; @@ -5307,6 +5346,9 @@ message NetworkDnsEventReported { // Additional pass-through fields opaque to statsd. // The DNS resolver Mainline module can add new fields here without requiring an OS update. optional android.stats.dnsresolver.DnsQueryEvents dns_query_events = 8 [(log_mode) = MODE_BYTES]; + + // The sample rate of DNS stats (to statsd) is 1/sampling_rate_denom. + optional int32 sampling_rate_denom = 9; } /** diff --git a/cmds/statsd/src/external/PowerStatsPuller.cpp b/cmds/statsd/src/external/PowerStatsPuller.cpp index c56f9a27086e..b142caca3acc 100644 --- a/cmds/statsd/src/external/PowerStatsPuller.cpp +++ b/cmds/statsd/src/external/PowerStatsPuller.cpp @@ -85,7 +85,6 @@ bool PowerStatsPuller::PullInternal(vector<shared_ptr<LogEvent>>* data) { std::lock_guard<std::mutex> lock(gPowerStatsHalMutex); if (!getPowerStatsHalLocked()) { - ALOGE("power.stats Hal not loaded"); return false; } @@ -116,6 +115,7 @@ bool PowerStatsPuller::PullInternal(vector<shared_ptr<LogEvent>>* data) { if (gRailInfo.empty()) { ALOGE("power.stats has no rail information"); gPowerStatsExist = false; // No rail info, so never try again. + gPowerStatsHal = nullptr; return false; } } diff --git a/config/hiddenapi-greylist-max-p.txt b/config/hiddenapi-greylist-max-p.txt index 141e8e669dac..25d45b0e6570 100644 --- a/config/hiddenapi-greylist-max-p.txt +++ b/config/hiddenapi-greylist-max-p.txt @@ -70,6 +70,8 @@ Lcom/android/internal/R$styleable;->MenuView:[I Lcom/android/internal/R$styleable;->Searchable:[I Lcom/android/internal/R$styleable;->SearchableActionKey:[I Lcom/android/internal/telephony/IPhoneSubInfo$Stub;-><init>()V +Lcom/android/internal/telephony/ITelephony;->getDataActivity()I +Lcom/android/internal/telephony/ITelephony;->getDataState()I Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCallForwardingChanged(Z)V Lcom/android/internal/telephony/ITelephonyRegistry;->notifyCellLocation(Landroid/os/Bundle;)V Lcom/android/internal/telephony/ITelephonyRegistry;->notifyDataActivity(I)V diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java index 4771f9f6ad04..3bf659b663b0 100644 --- a/core/java/android/app/ActivityView.java +++ b/core/java/android/app/ActivityView.java @@ -120,6 +120,7 @@ public class ActivityView extends ViewGroup { mActivityTaskManager = ActivityTaskManager.getService(); mSurfaceView = new SurfaceView(context); + mSurfaceView.setAlpha(0f); mSurfaceCallback = new SurfaceCallback(); mSurfaceView.getHolder().addCallback(mSurfaceCallback); addView(mSurfaceView); @@ -347,6 +348,16 @@ public class ActivityView extends ViewGroup { } @Override + public void setAlpha(float alpha) { + mSurfaceView.setAlpha(alpha); + } + + @Override + public float getAlpha() { + return mSurfaceView.getAlpha(); + } + + @Override public boolean gatherTransparentRegion(Region region) { // The tap exclude region may be affected by any view on top of it, so we detect the // possible change by monitoring this function. diff --git a/core/java/android/app/ITaskStackListener.aidl b/core/java/android/app/ITaskStackListener.aidl index 0df3bbe42c7e..650147b45bd2 100644 --- a/core/java/android/app/ITaskStackListener.aidl +++ b/core/java/android/app/ITaskStackListener.aidl @@ -170,6 +170,14 @@ oneway interface ITaskStackListener { */ void onBackPressedOnTaskRoot(in ActivityManager.RunningTaskInfo taskInfo); + /* + * Called when contents are drawn for the first time on a display which can only contain one + * task. + * + * @param displayId the id of the display on which contents are drawn. + */ + void onSingleTaskDisplayDrawn(int displayId); + /** * Called when a task is reparented to a stack on a different display. * diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 789351e0d157..ceadd8510e44 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -3386,11 +3386,7 @@ public class Notification implements Parcelable */ private int mCachedContrastColor = COLOR_INVALID; private int mCachedContrastColorIsFor = COLOR_INVALID; - /** - * Caches a ambient version of {@link #mCachedAmbientColorIsFor}. - */ - private int mCachedAmbientColor = COLOR_INVALID; - private int mCachedAmbientColorIsFor = COLOR_INVALID; + /** * A neutral color color that can be used for icons. */ @@ -5441,26 +5437,14 @@ public class Notification implements Parcelable /** * Construct a RemoteViews for the display in public contexts like on the lockscreen. * + * @param isLowPriority is this notification low priority * @hide */ @UnsupportedAppUsage - public RemoteViews makePublicContentView() { - return makePublicView(false /* ambient */); - } - - /** - * Construct a RemoteViews for the display in public contexts like on the lockscreen. - * - * @hide - */ - public RemoteViews makePublicAmbientNotification() { - return makePublicView(true /* ambient */); - } - - private RemoteViews makePublicView(boolean ambient) { + public RemoteViews makePublicContentView(boolean isLowPriority) { if (mN.publicVersion != null) { final Builder builder = recoverBuilder(mContext, mN.publicVersion); - return ambient ? builder.makeAmbientNotification() : builder.createContentView(); + return builder.createContentView(); } Bundle savedBundle = mN.extras; Style style = mStyle; @@ -5484,7 +5468,11 @@ public class Notification implements Parcelable } mN.extras = publicExtras; RemoteViews view; - view = makeNotificationHeader(); + StandardTemplateParams params = mParams.reset().fillTextsFrom(this); + if (isLowPriority) { + params.forceDefaultColor(); + } + view = makeNotificationHeader(params); view.setBoolean(R.id.notification_header, "setExpandOnlyOnButton", true); mN.extras = savedBundle; mN.mLargeIcon = largeIcon; @@ -8118,8 +8106,7 @@ public class Notification implements Parcelable */ @Override public RemoteViews makeHeadsUpContentView(boolean increasedHeight) { - RemoteViews expanded = makeMediaBigContentView(); - return expanded != null ? expanded : makeMediaContentView(); + return makeMediaContentView(); } /** @hide */ diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java index af2d774508c4..205e7a13092b 100644 --- a/core/java/android/app/StatusBarManager.java +++ b/core/java/android/app/StatusBarManager.java @@ -433,6 +433,9 @@ public class StatusBarManager { private boolean mNotificationPeeking; private boolean mRecents; private boolean mSearch; + private boolean mSystemIcons; + private boolean mClock; + private boolean mNotificationIcons; /** @hide */ public DisableInfo(int flags1, int flags2) { @@ -441,6 +444,9 @@ public class StatusBarManager { mNotificationPeeking = (flags1 & DISABLE_NOTIFICATION_ALERTS) != 0; mRecents = (flags1 & DISABLE_RECENT) != 0; mSearch = (flags1 & DISABLE_SEARCH) != 0; + mSystemIcons = (flags1 & DISABLE_SYSTEM_INFO) != 0; + mClock = (flags1 & DISABLE_CLOCK) != 0; + mNotificationIcons = (flags1 & DISABLE_NOTIFICATION_ICONS) != 0; } /** @hide */ @@ -527,6 +533,48 @@ public class StatusBarManager { } /** + * @return {@code true} if system icons are disabled + * + * @hide + */ + public boolean areSystemIconsDisabled() { + return mSystemIcons; + } + + /** * @hide */ + public void setSystemIconsDisabled(boolean disabled) { + mSystemIcons = disabled; + } + + /** + * @return {@code true} if the clock icon is disabled + * + * @hide + */ + public boolean isClockDisabled() { + return mClock; + } + + /** * @hide */ + public void setClockDisabled(boolean disabled) { + mClock = disabled; + } + + /** + * @return {@code true} if notification icons are disabled + * + * @hide + */ + public boolean areNotificationIconsDisabled() { + return mNotificationIcons; + } + + /** * @hide */ + public void setNotificationIconsDisabled(boolean disabled) { + mNotificationIcons = disabled; + } + + /** * @return {@code true} if no components are disabled (default state) * * @hide @@ -535,7 +583,7 @@ public class StatusBarManager { @TestApi public boolean areAllComponentsEnabled() { return !mStatusBarExpansion && !mNavigateHome && !mNotificationPeeking && !mRecents - && !mSearch; + && !mSearch && !mSystemIcons && !mClock && !mNotificationIcons; } /** @hide */ @@ -545,6 +593,9 @@ public class StatusBarManager { mNotificationPeeking = false; mRecents = false; mSearch = false; + mSystemIcons = false; + mClock = false; + mNotificationIcons = false; } /** @@ -554,7 +605,7 @@ public class StatusBarManager { */ public boolean areAllComponentsDisabled() { return mStatusBarExpansion && mNavigateHome && mNotificationPeeking - && mRecents && mSearch; + && mRecents && mSearch && mSystemIcons && mClock && mNotificationIcons; } /** @hide */ @@ -564,6 +615,9 @@ public class StatusBarManager { mNotificationPeeking = true; mRecents = true; mSearch = true; + mSystemIcons = true; + mClock = true; + mNotificationIcons = true; } @Override @@ -576,6 +630,9 @@ public class StatusBarManager { .append(mNotificationPeeking ? "disabled" : "enabled"); sb.append(" mRecents=").append(mRecents ? "disabled" : "enabled"); sb.append(" mSearch=").append(mSearch ? "disabled" : "enabled"); + sb.append(" mSystemIcons=").append(mSystemIcons ? "disabled" : "enabled"); + sb.append(" mClock=").append(mClock ? "disabled" : "enabled"); + sb.append(" mNotificationIcons=").append(mNotificationIcons ? "disabled" : "enabled"); return sb.toString(); @@ -596,6 +653,9 @@ public class StatusBarManager { if (mNotificationPeeking) disable1 |= DISABLE_NOTIFICATION_ALERTS; if (mRecents) disable1 |= DISABLE_RECENT; if (mSearch) disable1 |= DISABLE_SEARCH; + if (mSystemIcons) disable1 |= DISABLE_SYSTEM_INFO; + if (mClock) disable1 |= DISABLE_CLOCK; + if (mNotificationIcons) disable1 |= DISABLE_NOTIFICATION_ICONS; return new Pair<Integer, Integer>(disable1, disable2); } diff --git a/core/java/android/app/TaskStackListener.java b/core/java/android/app/TaskStackListener.java index 73fc7a3db6c7..b63feb590ad1 100644 --- a/core/java/android/app/TaskStackListener.java +++ b/core/java/android/app/TaskStackListener.java @@ -176,6 +176,10 @@ public abstract class TaskStackListener extends ITaskStackListener.Stub { } @Override + public void onSingleTaskDisplayDrawn(int displayId) throws RemoteException { + } + + @Override public void onTaskDisplayChanged(int taskId, int newDisplayId) throws RemoteException { } } diff --git a/core/java/android/hardware/biometrics/BiometricManager.java b/core/java/android/hardware/biometrics/BiometricManager.java index 6c497d47c645..d8110f33d723 100644 --- a/core/java/android/hardware/biometrics/BiometricManager.java +++ b/core/java/android/hardware/biometrics/BiometricManager.java @@ -104,9 +104,17 @@ public class BiometricManager { */ @RequiresPermission(USE_BIOMETRIC) public @BiometricError int canAuthenticate() { + return canAuthenticate(mContext.getUserId()); + } + + /** + * @hide + */ + @RequiresPermission(USE_BIOMETRIC_INTERNAL) + public @BiometricError int canAuthenticate(int userId) { if (mService != null) { try { - return mService.canAuthenticate(mContext.getOpPackageName()); + return mService.canAuthenticate(mContext.getOpPackageName(), userId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -121,6 +129,25 @@ public class BiometricManager { } /** + * @hide + * @param userId + * @return + */ + @RequiresPermission(USE_BIOMETRIC_INTERNAL) + public boolean hasEnrolledBiometrics(int userId) { + if (mService != null) { + try { + return mService.hasEnrolledBiometrics(userId); + } catch (RemoteException e) { + Slog.w(TAG, "Remote exception in hasEnrolledBiometrics(): " + e); + return false; + } + } else { + return false; + } + } + + /** * Listens for changes to biometric eligibility on keyguard from user settings. * @param callback * @hide diff --git a/core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl b/core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl index d22e7e295b77..62d727c080e3 100644 --- a/core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl +++ b/core/java/android/hardware/biometrics/IBiometricEnabledOnKeyguardCallback.aidl @@ -22,5 +22,5 @@ import android.hardware.biometrics.BiometricSourceType; * @hide */ oneway interface IBiometricEnabledOnKeyguardCallback { - void onChanged(in BiometricSourceType type, boolean enabled); + void onChanged(in BiometricSourceType type, boolean enabled, int userId); }
\ No newline at end of file diff --git a/core/java/android/hardware/biometrics/IBiometricService.aidl b/core/java/android/hardware/biometrics/IBiometricService.aidl index 90d4921c3c18..f0a0b2f0235f 100644 --- a/core/java/android/hardware/biometrics/IBiometricService.aidl +++ b/core/java/android/hardware/biometrics/IBiometricService.aidl @@ -40,7 +40,10 @@ interface IBiometricService { void cancelAuthentication(IBinder token, String opPackageName); // Checks if biometrics can be used. - int canAuthenticate(String opPackageName); + int canAuthenticate(String opPackageName, int userId); + + // Checks if any biometrics are enrolled. + boolean hasEnrolledBiometrics(int userId); // Register callback for when keyguard biometric eligibility changes. void registerEnabledOnKeyguardCallback(IBiometricEnabledOnKeyguardCallback callback); diff --git a/core/java/android/hardware/display/AmbientDisplayConfiguration.java b/core/java/android/hardware/display/AmbientDisplayConfiguration.java index c45b8ed52187..3e995b624112 100644 --- a/core/java/android/hardware/display/AmbientDisplayConfiguration.java +++ b/core/java/android/hardware/display/AmbientDisplayConfiguration.java @@ -48,7 +48,8 @@ public class AmbientDisplayConfiguration { return pulseOnNotificationEnabled(user) || pulseOnLongPressEnabled(user) || alwaysOnEnabled(user) - || wakeScreenGestureEnabled(user) + || wakeLockScreenGestureEnabled(user) + || wakeDisplayGestureEnabled(user) || pickupGestureEnabled(user) || tapGestureEnabled(user) || doubleTapGestureEnabled(user); @@ -105,8 +106,14 @@ public class AmbientDisplayConfiguration { } /** {@hide} */ - public boolean wakeScreenGestureEnabled(int user) { - return boolSettingDefaultOn(Settings.Secure.DOZE_WAKE_SCREEN_GESTURE, user) + public boolean wakeLockScreenGestureEnabled(int user) { + return boolSettingDefaultOn(Settings.Secure.DOZE_WAKE_LOCK_SCREEN_GESTURE, user) + && wakeScreenGestureAvailable(); + } + + /** {@hide} */ + public boolean wakeDisplayGestureEnabled(int user) { + return boolSettingDefaultOn(Settings.Secure.DOZE_WAKE_DISPLAY_GESTURE, user) && wakeScreenGestureAvailable(); } diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java index 8596af107ac1..12b285a0f0ab 100644 --- a/core/java/android/hardware/face/FaceManager.java +++ b/core/java/android/hardware/face/FaceManager.java @@ -262,7 +262,7 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan * @hide */ @RequiresPermission(MANAGE_BIOMETRIC) - public void enroll(byte[] token, CancellationSignal cancel, + public void enroll(int userId, byte[] token, CancellationSignal cancel, EnrollmentCallback callback, int[] disabledFeatures) { if (callback == null) { throw new IllegalArgumentException("Must supply an enrollment callback"); @@ -281,7 +281,7 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan try { mEnrollmentCallback = callback; Trace.beginSection("FaceManager#enroll"); - mService.enroll(mToken, token, mServiceReceiver, + mService.enroll(userId, mToken, token, mServiceReceiver, mContext.getOpPackageName(), disabledFeatures); } catch (RemoteException e) { Log.w(TAG, "Remote exception in enroll: ", e); @@ -339,12 +339,13 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan * @hide */ @RequiresPermission(MANAGE_BIOMETRIC) - public void setFeature(int feature, boolean enabled, byte[] token, + public void setFeature(int userId, int feature, boolean enabled, byte[] token, SetFeatureCallback callback) { if (mService != null) { try { mSetFeatureCallback = callback; - mService.setFeature(feature, enabled, token, mServiceReceiver); + mService.setFeature(userId, feature, enabled, token, mServiceReceiver, + mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -355,11 +356,11 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan * @hide */ @RequiresPermission(MANAGE_BIOMETRIC) - public void getFeature(int feature, GetFeatureCallback callback) { + public void getFeature(int userId, int feature, GetFeatureCallback callback) { if (mService != null) { try { mGetFeatureCallback = callback; - mService.getFeature(feature, mServiceReceiver); + mService.getFeature(userId, feature, mServiceReceiver, mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -414,7 +415,8 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan try { mRemovalCallback = callback; mRemovalFace = face; - mService.remove(mToken, face.getBiometricId(), userId, mServiceReceiver); + mService.remove(mToken, face.getBiometricId(), userId, mServiceReceiver, + mContext.getOpPackageName()); } catch (RemoteException e) { Log.w(TAG, "Remote exception in remove: ", e); if (callback != null) { @@ -637,7 +639,7 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan } } Slog.w(TAG, "Invalid error message: " + errMsg + ", " + vendorCode); - return null; + return ""; } /** diff --git a/core/java/android/hardware/face/IFaceService.aidl b/core/java/android/hardware/face/IFaceService.aidl index 601be7595581..b6a0afbf716c 100644 --- a/core/java/android/hardware/face/IFaceService.aidl +++ b/core/java/android/hardware/face/IFaceService.aidl @@ -50,14 +50,15 @@ interface IFaceService { int callingUid, int callingPid, int callingUserId, boolean fromClient); // Start face enrollment - void enroll(IBinder token, in byte [] cryptoToken, IFaceServiceReceiver receiver, + void enroll(int userId, IBinder token, in byte [] cryptoToken, IFaceServiceReceiver receiver, String opPackageName, in int [] disabledFeatures); // Cancel enrollment in progress void cancelEnrollment(IBinder token); // Any errors resulting from this call will be returned to the listener - void remove(IBinder token, int faceId, int userId, IFaceServiceReceiver receiver); + void remove(IBinder token, int faceId, int userId, IFaceServiceReceiver receiver, + String opPackageName); // Rename the face specified by faceId to the given name void rename(int faceId, String name); @@ -98,10 +99,10 @@ interface IFaceService { // Enumerate all faces void enumerate(IBinder token, int userId, IFaceServiceReceiver receiver); - void setFeature(int feature, boolean enabled, in byte [] token, - IFaceServiceReceiver receiver); + void setFeature(int userId, int feature, boolean enabled, in byte [] token, + IFaceServiceReceiver receiver, String opPackageName); - void getFeature(int feature, IFaceServiceReceiver receiver); + void getFeature(int userId, int feature, IFaceServiceReceiver receiver, String opPackageName); void userActivity(); } diff --git a/core/java/android/net/INetworkStatsService.aidl b/core/java/android/net/INetworkStatsService.aidl index 41efc5040885..e5f3d26667a0 100644 --- a/core/java/android/net/INetworkStatsService.aidl +++ b/core/java/android/net/INetworkStatsService.aidl @@ -66,7 +66,6 @@ interface INetworkStatsService { /** Force update of ifaces. */ void forceUpdateIfaces( in Network[] defaultNetworks, - in VpnInfo[] vpnArray, in NetworkState[] networkStates, in String activeIface); /** Force update of statistics. */ diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java index e892b650bf40..6c7aa1379fb1 100644 --- a/core/java/android/net/NetworkStats.java +++ b/core/java/android/net/NetworkStats.java @@ -18,11 +18,11 @@ package android.net; import static android.os.Process.CLAT_UID; +import android.annotation.NonNull; import android.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; import android.os.SystemClock; -import android.util.Slog; import android.util.SparseBooleanArray; import com.android.internal.annotations.VisibleForTesting; @@ -36,6 +36,7 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.Objects; +import java.util.function.Predicate; /** * Collection of active network statistics. Can contain summary details across @@ -993,23 +994,33 @@ public class NetworkStats implements Parcelable { if (limitUid == UID_ALL && limitTag == TAG_ALL && limitIfaces == INTERFACES_ALL) { return; } + filter(e -> (limitUid == UID_ALL || limitUid == e.uid) + && (limitTag == TAG_ALL || limitTag == e.tag) + && (limitIfaces == INTERFACES_ALL + || ArrayUtils.contains(limitIfaces, e.iface))); + } + + /** + * Only keep entries with {@link #set} value less than {@link #SET_DEBUG_START}. + * + * <p>This mutates the original structure in place. + */ + public void filterDebugEntries() { + filter(e -> e.set < SET_DEBUG_START); + } + private void filter(Predicate<Entry> predicate) { Entry entry = new Entry(); int nextOutputEntry = 0; for (int i = 0; i < size; i++) { entry = getValues(i, entry); - final boolean matches = - (limitUid == UID_ALL || limitUid == entry.uid) - && (limitTag == TAG_ALL || limitTag == entry.tag) - && (limitIfaces == INTERFACES_ALL - || ArrayUtils.contains(limitIfaces, entry.iface)); - - if (matches) { - setValues(nextOutputEntry, entry); + if (predicate.test(entry)) { + if (nextOutputEntry != i) { + setValues(nextOutputEntry, entry); + } nextOutputEntry++; } } - size = nextOutputEntry; } @@ -1175,133 +1186,221 @@ public class NetworkStats implements Parcelable { /** * VPN accounting. Move some VPN's underlying traffic to other UIDs that use tun0 iface. * - * This method should only be called on delta NetworkStats. Do not call this method on a - * snapshot {@link NetworkStats} object because the tunUid and/or the underlyingIface may - * change over time. - * - * This method performs adjustments for one active VPN package and one VPN iface at a time. + * <p>This method should only be called on delta NetworkStats. Do not call this method on a + * snapshot {@link NetworkStats} object because the tunUid and/or the underlyingIface may change + * over time. * - * It is possible for the VPN software to use multiple underlying networks. This method - * only migrates traffic for the primary underlying network. + * <p>This method performs adjustments for one active VPN package and one VPN iface at a time. * * @param tunUid uid of the VPN application * @param tunIface iface of the vpn tunnel - * @param underlyingIface the primary underlying network iface used by the VPN application - * @return true if it successfully adjusts the accounting for VPN, false otherwise + * @param underlyingIfaces underlying network ifaces used by the VPN application */ - public boolean migrateTun(int tunUid, String tunIface, String underlyingIface) { - Entry tunIfaceTotal = new Entry(); - Entry underlyingIfaceTotal = new Entry(); + public void migrateTun(int tunUid, @NonNull String tunIface, + @NonNull String[] underlyingIfaces) { + // Combined usage by all apps using VPN. + final Entry tunIfaceTotal = new Entry(); + // Usage by VPN, grouped by its {@code underlyingIfaces}. + final Entry[] perInterfaceTotal = new Entry[underlyingIfaces.length]; + // Usage by VPN, summed across all its {@code underlyingIfaces}. + final Entry underlyingIfacesTotal = new Entry(); + + for (int i = 0; i < perInterfaceTotal.length; i++) { + perInterfaceTotal[i] = new Entry(); + } - tunAdjustmentInit(tunUid, tunIface, underlyingIface, tunIfaceTotal, underlyingIfaceTotal); + tunAdjustmentInit(tunUid, tunIface, underlyingIfaces, tunIfaceTotal, perInterfaceTotal, + underlyingIfacesTotal); - // If tunIface < underlyingIface, it leaves the overhead traffic in the VPN app. - // If tunIface > underlyingIface, the VPN app doesn't get credit for data compression. + // If tunIface < underlyingIfacesTotal, it leaves the overhead traffic in the VPN app. + // If tunIface > underlyingIfacesTotal, the VPN app doesn't get credit for data compression. // Negative stats should be avoided. - Entry pool = tunGetPool(tunIfaceTotal, underlyingIfaceTotal); - if (pool.isEmpty()) { - return true; - } - Entry moved = - addTrafficToApplications(tunUid, tunIface, underlyingIface, tunIfaceTotal, pool); - deductTrafficFromVpnApp(tunUid, underlyingIface, moved); - - if (!moved.isEmpty()) { - Slog.wtf(TAG, "Failed to deduct underlying network traffic from VPN package. Moved=" - + moved); - return false; - } - return true; + final Entry[] moved = + addTrafficToApplications(tunUid, tunIface, underlyingIfaces, tunIfaceTotal, + perInterfaceTotal, underlyingIfacesTotal); + deductTrafficFromVpnApp(tunUid, underlyingIfaces, moved); } /** * Initializes the data used by the migrateTun() method. * - * This is the first pass iteration which does the following work: - * (1) Adds up all the traffic through the tunUid's underlyingIface - * (both foreground and background). - * (2) Adds up all the traffic through tun0 excluding traffic from the vpn app itself. + * <p>This is the first pass iteration which does the following work: + * + * <ul> + * <li>Adds up all the traffic through the tunUid's underlyingIfaces (both foreground and + * background). + * <li>Adds up all the traffic through tun0 excluding traffic from the vpn app itself. + * </ul> + * + * @param tunUid uid of the VPN application + * @param tunIface iface of the vpn tunnel + * @param underlyingIfaces underlying network ifaces used by the VPN application + * @param tunIfaceTotal output parameter; combined data usage by all apps using VPN + * @param perInterfaceTotal output parameter; data usage by VPN app, grouped by its {@code + * underlyingIfaces} + * @param underlyingIfacesTotal output parameter; data usage by VPN, summed across all of its + * {@code underlyingIfaces} */ - private void tunAdjustmentInit(int tunUid, String tunIface, String underlyingIface, - Entry tunIfaceTotal, Entry underlyingIfaceTotal) { - Entry recycle = new Entry(); + private void tunAdjustmentInit(int tunUid, @NonNull String tunIface, + @NonNull String[] underlyingIfaces, @NonNull Entry tunIfaceTotal, + @NonNull Entry[] perInterfaceTotal, @NonNull Entry underlyingIfacesTotal) { + final Entry recycle = new Entry(); for (int i = 0; i < size; i++) { getValues(i, recycle); if (recycle.uid == UID_ALL) { throw new IllegalStateException( "Cannot adjust VPN accounting on an iface aggregated NetworkStats."); - } if (recycle.set == SET_DBG_VPN_IN || recycle.set == SET_DBG_VPN_OUT) { + } + if (recycle.set == SET_DBG_VPN_IN || recycle.set == SET_DBG_VPN_OUT) { throw new IllegalStateException( "Cannot adjust VPN accounting on a NetworkStats containing SET_DBG_VPN_*"); } - - if (recycle.uid == tunUid && recycle.tag == TAG_NONE - && Objects.equals(underlyingIface, recycle.iface)) { - underlyingIfaceTotal.add(recycle); + if (recycle.tag != TAG_NONE) { + // TODO(b/123666283): Take all tags for tunUid into account. + continue; } - if (recycle.uid != tunUid && recycle.tag == TAG_NONE - && Objects.equals(tunIface, recycle.iface)) { + if (recycle.uid == tunUid) { + // Add up traffic through tunUid's underlying interfaces. + for (int j = 0; j < underlyingIfaces.length; j++) { + if (Objects.equals(underlyingIfaces[j], recycle.iface)) { + perInterfaceTotal[j].add(recycle); + underlyingIfacesTotal.add(recycle); + break; + } + } + } else if (tunIface.equals(recycle.iface)) { // Add up all tunIface traffic excluding traffic from the vpn app itself. tunIfaceTotal.add(recycle); } } } - private static Entry tunGetPool(Entry tunIfaceTotal, Entry underlyingIfaceTotal) { - Entry pool = new Entry(); - pool.rxBytes = Math.min(tunIfaceTotal.rxBytes, underlyingIfaceTotal.rxBytes); - pool.rxPackets = Math.min(tunIfaceTotal.rxPackets, underlyingIfaceTotal.rxPackets); - pool.txBytes = Math.min(tunIfaceTotal.txBytes, underlyingIfaceTotal.txBytes); - pool.txPackets = Math.min(tunIfaceTotal.txPackets, underlyingIfaceTotal.txPackets); - pool.operations = Math.min(tunIfaceTotal.operations, underlyingIfaceTotal.operations); - return pool; - } + /** + * Distributes traffic across apps that are using given {@code tunIface}, and returns the total + * traffic that should be moved off of {@code tunUid} grouped by {@code underlyingIfaces}. + * + * @param tunUid uid of the VPN application + * @param tunIface iface of the vpn tunnel + * @param underlyingIfaces underlying network ifaces used by the VPN application + * @param tunIfaceTotal combined data usage across all apps using {@code tunIface} + * @param perInterfaceTotal data usage by VPN app, grouped by its {@code underlyingIfaces} + * @param underlyingIfacesTotal data usage by VPN, summed across all of its {@code + * underlyingIfaces} + */ + private Entry[] addTrafficToApplications(int tunUid, @NonNull String tunIface, + @NonNull String[] underlyingIfaces, @NonNull Entry tunIfaceTotal, + @NonNull Entry[] perInterfaceTotal, @NonNull Entry underlyingIfacesTotal) { + // Traffic that should be moved off of each underlying interface for tunUid (see + // deductTrafficFromVpnApp below). + final Entry[] moved = new Entry[underlyingIfaces.length]; + for (int i = 0; i < underlyingIfaces.length; i++) { + moved[i] = new Entry(); + } - private Entry addTrafficToApplications(int tunUid, String tunIface, String underlyingIface, - Entry tunIfaceTotal, Entry pool) { - Entry moved = new Entry(); - Entry tmpEntry = new Entry(); - tmpEntry.iface = underlyingIface; - for (int i = 0; i < size; i++) { - // the vpn app is excluded from the redistribution but all moved traffic will be - // deducted from the vpn app (see deductTrafficFromVpnApp below). - if (Objects.equals(iface[i], tunIface) && uid[i] != tunUid) { - if (tunIfaceTotal.rxBytes > 0) { - tmpEntry.rxBytes = pool.rxBytes * rxBytes[i] / tunIfaceTotal.rxBytes; - } else { - tmpEntry.rxBytes = 0; + final Entry tmpEntry = new Entry(); + final int origSize = size; + for (int i = 0; i < origSize; i++) { + if (!Objects.equals(iface[i], tunIface)) { + // Consider only entries that go onto the VPN interface. + continue; + } + if (uid[i] == tunUid) { + // Exclude VPN app from the redistribution, as it can choose to create packet + // streams by writing to itself. + continue; + } + tmpEntry.uid = uid[i]; + tmpEntry.tag = tag[i]; + tmpEntry.metered = metered[i]; + tmpEntry.roaming = roaming[i]; + tmpEntry.defaultNetwork = defaultNetwork[i]; + + // In a first pass, compute this entry's total share of data across all + // underlyingIfaces. This is computed on the basis of the share of this entry's usage + // over tunIface. + // TODO: Consider refactoring first pass into a separate helper method. + long totalRxBytes = 0; + if (tunIfaceTotal.rxBytes > 0) { + // Note - The multiplication below should not overflow since NetworkStatsService + // processes this every time device has transmitted/received amount equivalent to + // global threshold alert (~ 2MB) across all interfaces. + final long rxBytesAcrossUnderlyingIfaces = + underlyingIfacesTotal.rxBytes * rxBytes[i] / tunIfaceTotal.rxBytes; + // app must not be blamed for more than it consumed on tunIface + totalRxBytes = Math.min(rxBytes[i], rxBytesAcrossUnderlyingIfaces); + } + long totalRxPackets = 0; + if (tunIfaceTotal.rxPackets > 0) { + final long rxPacketsAcrossUnderlyingIfaces = + underlyingIfacesTotal.rxPackets * rxPackets[i] / tunIfaceTotal.rxPackets; + totalRxPackets = Math.min(rxPackets[i], rxPacketsAcrossUnderlyingIfaces); + } + long totalTxBytes = 0; + if (tunIfaceTotal.txBytes > 0) { + final long txBytesAcrossUnderlyingIfaces = + underlyingIfacesTotal.txBytes * txBytes[i] / tunIfaceTotal.txBytes; + totalTxBytes = Math.min(txBytes[i], txBytesAcrossUnderlyingIfaces); + } + long totalTxPackets = 0; + if (tunIfaceTotal.txPackets > 0) { + final long txPacketsAcrossUnderlyingIfaces = + underlyingIfacesTotal.txPackets * txPackets[i] / tunIfaceTotal.txPackets; + totalTxPackets = Math.min(txPackets[i], txPacketsAcrossUnderlyingIfaces); + } + long totalOperations = 0; + if (tunIfaceTotal.operations > 0) { + final long operationsAcrossUnderlyingIfaces = + underlyingIfacesTotal.operations * operations[i] / tunIfaceTotal.operations; + totalOperations = Math.min(operations[i], operationsAcrossUnderlyingIfaces); + } + // In a second pass, distribute these values across interfaces in the proportion that + // each interface represents of the total traffic of the underlying interfaces. + for (int j = 0; j < underlyingIfaces.length; j++) { + tmpEntry.iface = underlyingIfaces[j]; + tmpEntry.rxBytes = 0; + // Reset 'set' to correct value since it gets updated when adding debug info below. + tmpEntry.set = set[i]; + if (underlyingIfacesTotal.rxBytes > 0) { + tmpEntry.rxBytes = + totalRxBytes + * perInterfaceTotal[j].rxBytes + / underlyingIfacesTotal.rxBytes; } - if (tunIfaceTotal.rxPackets > 0) { - tmpEntry.rxPackets = pool.rxPackets * rxPackets[i] / tunIfaceTotal.rxPackets; - } else { - tmpEntry.rxPackets = 0; + tmpEntry.rxPackets = 0; + if (underlyingIfacesTotal.rxPackets > 0) { + tmpEntry.rxPackets = + totalRxPackets + * perInterfaceTotal[j].rxPackets + / underlyingIfacesTotal.rxPackets; } - if (tunIfaceTotal.txBytes > 0) { - tmpEntry.txBytes = pool.txBytes * txBytes[i] / tunIfaceTotal.txBytes; - } else { - tmpEntry.txBytes = 0; + tmpEntry.txBytes = 0; + if (underlyingIfacesTotal.txBytes > 0) { + tmpEntry.txBytes = + totalTxBytes + * perInterfaceTotal[j].txBytes + / underlyingIfacesTotal.txBytes; } - if (tunIfaceTotal.txPackets > 0) { - tmpEntry.txPackets = pool.txPackets * txPackets[i] / tunIfaceTotal.txPackets; - } else { - tmpEntry.txPackets = 0; + tmpEntry.txPackets = 0; + if (underlyingIfacesTotal.txPackets > 0) { + tmpEntry.txPackets = + totalTxPackets + * perInterfaceTotal[j].txPackets + / underlyingIfacesTotal.txPackets; } - if (tunIfaceTotal.operations > 0) { + tmpEntry.operations = 0; + if (underlyingIfacesTotal.operations > 0) { tmpEntry.operations = - pool.operations * operations[i] / tunIfaceTotal.operations; - } else { - tmpEntry.operations = 0; + totalOperations + * perInterfaceTotal[j].operations + / underlyingIfacesTotal.operations; } - tmpEntry.uid = uid[i]; - tmpEntry.tag = tag[i]; - tmpEntry.set = set[i]; - tmpEntry.metered = metered[i]; - tmpEntry.roaming = roaming[i]; - tmpEntry.defaultNetwork = defaultNetwork[i]; + // tmpEntry now contains the migrated data of the i-th entry for the j-th underlying + // interface. Add that data usage to this object. combineValues(tmpEntry); if (tag[i] == TAG_NONE) { - moved.add(tmpEntry); + // Add the migrated data to moved so it is deducted from the VPN app later. + moved[j].add(tmpEntry); // Add debug info tmpEntry.set = SET_DBG_VPN_IN; combineValues(tmpEntry); @@ -1311,38 +1410,45 @@ public class NetworkStats implements Parcelable { return moved; } - private void deductTrafficFromVpnApp(int tunUid, String underlyingIface, Entry moved) { - // Add debug info - moved.uid = tunUid; - moved.set = SET_DBG_VPN_OUT; - moved.tag = TAG_NONE; - moved.iface = underlyingIface; - moved.metered = METERED_ALL; - moved.roaming = ROAMING_ALL; - moved.defaultNetwork = DEFAULT_NETWORK_ALL; - combineValues(moved); - - // Caveat: if the vpn software uses tag, the total tagged traffic may be greater than - // the TAG_NONE traffic. - // - // Relies on the fact that the underlying traffic only has state ROAMING_NO and METERED_NO, - // which should be the case as it comes directly from the /proc file. We only blend in the - // roaming data after applying these adjustments, by checking the NetworkIdentity of the - // underlying iface. - int idxVpnBackground = findIndex(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, - METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO); - if (idxVpnBackground != -1) { - tunSubtract(idxVpnBackground, this, moved); - } + private void deductTrafficFromVpnApp( + int tunUid, + @NonNull String[] underlyingIfaces, + @NonNull Entry[] moved) { + for (int i = 0; i < underlyingIfaces.length; i++) { + moved[i].uid = tunUid; + // Add debug info + moved[i].set = SET_DBG_VPN_OUT; + moved[i].tag = TAG_NONE; + moved[i].iface = underlyingIfaces[i]; + moved[i].metered = METERED_ALL; + moved[i].roaming = ROAMING_ALL; + moved[i].defaultNetwork = DEFAULT_NETWORK_ALL; + combineValues(moved[i]); + + // Caveat: if the vpn software uses tag, the total tagged traffic may be greater than + // the TAG_NONE traffic. + // + // Relies on the fact that the underlying traffic only has state ROAMING_NO and + // METERED_NO, which should be the case as it comes directly from the /proc file. + // We only blend in the roaming data after applying these adjustments, by checking the + // NetworkIdentity of the underlying iface. + final int idxVpnBackground = findIndex(underlyingIfaces[i], tunUid, SET_DEFAULT, + TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO); + if (idxVpnBackground != -1) { + // Note - tunSubtract also updates moved[i]; whatever traffic that's left is removed + // from foreground usage. + tunSubtract(idxVpnBackground, this, moved[i]); + } - int idxVpnForeground = findIndex(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, - METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO); - if (idxVpnForeground != -1) { - tunSubtract(idxVpnForeground, this, moved); + final int idxVpnForeground = findIndex(underlyingIfaces[i], tunUid, SET_FOREGROUND, + TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO); + if (idxVpnForeground != -1) { + tunSubtract(idxVpnForeground, this, moved[i]); + } } } - private static void tunSubtract(int i, NetworkStats left, Entry right) { + private static void tunSubtract(int i, @NonNull NetworkStats left, @NonNull Entry right) { long rxBytes = Math.min(left.rxBytes[i], right.rxBytes); left.rxBytes[i] -= rxBytes; right.rxBytes -= rxBytes; diff --git a/core/java/android/net/NetworkTemplate.java b/core/java/android/net/NetworkTemplate.java index ae421a4991a4..87c7118c0ed8 100644 --- a/core/java/android/net/NetworkTemplate.java +++ b/core/java/android/net/NetworkTemplate.java @@ -48,6 +48,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.Arrays; +import java.util.List; import java.util.Objects; /** @@ -481,17 +482,39 @@ public class NetworkTemplate implements Parcelable { * For example, given an incoming template matching B, and the currently * active merge set [A,B], we'd return a new template that primarily matches * A, but also matches B. + * TODO: remove and use {@link #normalize(NetworkTemplate, List)}. */ @UnsupportedAppUsage public static NetworkTemplate normalize(NetworkTemplate template, String[] merged) { - if (template.isMatchRuleMobile() && ArrayUtils.contains(merged, template.mSubscriberId)) { - // Requested template subscriber is part of the merge group; return - // a template that matches all merged subscribers. - return new NetworkTemplate(template.mMatchRule, merged[0], merged, - template.mNetworkId); - } else { - return template; + return normalize(template, Arrays.<String[]>asList(merged)); + } + + /** + * Examine the given template and normalize if it refers to a "merged" + * mobile subscriber. We pick the "lowest" merged subscriber as the primary + * for key purposes, and expand the template to match all other merged + * subscribers. + * + * There can be multiple merged subscriberIds for multi-SIM devices. + * + * <p> + * For example, given an incoming template matching B, and the currently + * active merge set [A,B], we'd return a new template that primarily matches + * A, but also matches B. + */ + public static NetworkTemplate normalize(NetworkTemplate template, List<String[]> mergedList) { + if (!template.isMatchRuleMobile()) return template; + + for (String[] merged : mergedList) { + if (ArrayUtils.contains(merged, template.mSubscriberId)) { + // Requested template subscriber is part of the merge group; return + // a template that matches all merged subscribers. + return new NetworkTemplate(template.mMatchRule, merged[0], merged, + template.mNetworkId); + } } + + return template; } @UnsupportedAppUsage diff --git a/core/java/android/os/IVibratorService.aidl b/core/java/android/os/IVibratorService.aidl index e8b3ca6cb7ae..1456ff7e6c5e 100644 --- a/core/java/android/os/IVibratorService.aidl +++ b/core/java/android/os/IVibratorService.aidl @@ -16,6 +16,7 @@ package android.os; +import android.media.AudioAttributes; import android.os.VibrationEffect; /** {@hide} */ @@ -23,8 +24,8 @@ interface IVibratorService { boolean hasVibrator(); boolean hasAmplitudeControl(); - void vibrate(int uid, String opPkg, in VibrationEffect effect, int usageHint, String reason, - IBinder token); + void vibrate(int uid, String opPkg, in VibrationEffect effect, in AudioAttributes attributes, + String reason, IBinder token); void cancelVibrate(IBinder token); } diff --git a/core/java/android/os/ParcelFileDescriptor.java b/core/java/android/os/ParcelFileDescriptor.java index 8355e08b6aa8..2a4576adf192 100644 --- a/core/java/android/os/ParcelFileDescriptor.java +++ b/core/java/android/os/ParcelFileDescriptor.java @@ -581,12 +581,16 @@ public class ParcelFileDescriptor implements Parcelable, Closeable { public static ParcelFileDescriptor fromData(byte[] data, String name) throws IOException { if (data == null) return null; MemoryFile file = new MemoryFile(name, data.length); - if (data.length > 0) { - file.writeBytes(data, 0, 0, data.length); + try { + if (data.length > 0) { + file.writeBytes(data, 0, 0, data.length); + } + file.deactivate(); + FileDescriptor fd = file.getFileDescriptor(); + return fd != null ? ParcelFileDescriptor.dup(fd) : null; + } finally { + file.close(); } - file.deactivate(); - FileDescriptor fd = file.getFileDescriptor(); - return fd != null ? ParcelFileDescriptor.dup(fd) : null; } /** diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java index 53298d8d8aed..48fc2a6bf449 100644 --- a/core/java/android/os/RecoverySystem.java +++ b/core/java/android/os/RecoverySystem.java @@ -31,6 +31,8 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.provider.Settings; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; import android.telephony.euicc.EuiccManager; import android.text.TextUtils; import android.text.format.DateFormat; @@ -56,10 +58,12 @@ import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashSet; +import java.util.List; import java.util.Locale; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; @@ -87,11 +91,14 @@ public class RecoverySystem { private static final long PUBLISH_PROGRESS_INTERVAL_MS = 500; private static final long DEFAULT_EUICC_FACTORY_RESET_TIMEOUT_MILLIS = 30000L; // 30 s - private static final long MIN_EUICC_FACTORY_RESET_TIMEOUT_MILLIS = 5000L; // 5 s - private static final long MAX_EUICC_FACTORY_RESET_TIMEOUT_MILLIS = 60000L; // 60 s + private static final long DEFAULT_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS = + 45000L; // 45 s + private static final long MIN_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS = 15000L; // 15 s + private static final long MAX_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS = 90000L; // 90 s + /** Used to communicate with recovery. See bootable/recovery/recovery.cpp. */ private static final File RECOVERY_DIR = new File("/cache/recovery"); private static final File LOG_FILE = new File(RECOVERY_DIR, "log"); @@ -99,9 +106,14 @@ public class RecoverySystem { private static final String LAST_PREFIX = "last_"; private static final String ACTION_EUICC_FACTORY_RESET = "com.android.internal.action.EUICC_FACTORY_RESET"; + private static final String ACTION_EUICC_REMOVE_INVISIBLE_SUBSCRIPTIONS = + "com.android.internal.action.EUICC_REMOVE_INVISIBLE_SUBSCRIPTIONS"; - /** used in {@link #wipeEuiccData} as package name of callback intent */ - private static final String PACKAGE_NAME_WIPING_EUICC_DATA_CALLBACK = "android"; + /** + * Used in {@link #wipeEuiccData} & {@link #removeEuiccInvisibleSubs} as package name of + * callback intent. + */ + private static final String PACKAGE_NAME_EUICC_DATA_MANAGEMENT_CALLBACK = "android"; /** * The recovery image uses this file to identify the location (i.e. blocks) @@ -754,8 +766,11 @@ public class RecoverySystem { // Block until the ordered broadcast has completed. condition.block(); + EuiccManager euiccManager = context.getSystemService(EuiccManager.class); if (wipeEuicc) { - wipeEuiccData(context, PACKAGE_NAME_WIPING_EUICC_DATA_CALLBACK); + wipeEuiccData(context, PACKAGE_NAME_EUICC_DATA_MANAGEMENT_CALLBACK); + } else { + removeEuiccInvisibleSubs(context, euiccManager); } String shutdownArg = null; @@ -851,6 +866,110 @@ public class RecoverySystem { return false; } + private static void removeEuiccInvisibleSubs( + Context context, EuiccManager euiccManager) { + ContentResolver cr = context.getContentResolver(); + if (Settings.Global.getInt(cr, Settings.Global.EUICC_PROVISIONED, 0) == 0) { + // If the eUICC isn't provisioned, there's no need to remove euicc invisible profiles, + // as there's nothing to be removed. + Log.i(TAG, "Skip removing eUICC invisible profiles as it is not provisioned."); + return; + } else if (euiccManager == null || !euiccManager.isEnabled()) { + Log.i(TAG, "Skip removing eUICC invisible profiles as eUICC manager is not available."); + return; + } + SubscriptionManager subscriptionManager = + context.getSystemService(SubscriptionManager.class); + List<SubscriptionInfo> availableSubs = + subscriptionManager.getAvailableSubscriptionInfoList(); + if (availableSubs == null || availableSubs.isEmpty()) { + Log.i(TAG, "Skip removing eUICC invisible profiles as no available profiles found."); + return; + } + List<SubscriptionInfo> invisibleSubs = new ArrayList<>(); + for (SubscriptionInfo sub : availableSubs) { + if (sub.isEmbedded() && !subscriptionManager.isSubscriptionVisible(sub)) { + invisibleSubs.add(sub); + } + } + removeEuiccInvisibleSubs(context, invisibleSubs, euiccManager); + } + + private static boolean removeEuiccInvisibleSubs( + Context context, List<SubscriptionInfo> subscriptionInfos, EuiccManager euiccManager) { + if (subscriptionInfos == null || subscriptionInfos.isEmpty()) { + Log.i(TAG, "There are no eUICC invisible profiles needed to be removed."); + return true; + } + CountDownLatch removeSubsLatch = new CountDownLatch(subscriptionInfos.size()); + final AtomicInteger removedSubsCount = new AtomicInteger(0); + + BroadcastReceiver removeEuiccSubsReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (ACTION_EUICC_REMOVE_INVISIBLE_SUBSCRIPTIONS.equals(intent.getAction())) { + if (getResultCode() != EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_OK) { + int detailedCode = intent.getIntExtra( + EuiccManager.EXTRA_EMBEDDED_SUBSCRIPTION_DETAILED_CODE, 0); + Log.e(TAG, "Error removing euicc opportunistic profile, Detailed code = " + + detailedCode); + } else { + Log.e(TAG, "Successfully remove euicc opportunistic profile."); + removedSubsCount.incrementAndGet(); + } + removeSubsLatch.countDown(); + } + } + }; + + Intent intent = new Intent(ACTION_EUICC_REMOVE_INVISIBLE_SUBSCRIPTIONS); + intent.setPackage(PACKAGE_NAME_EUICC_DATA_MANAGEMENT_CALLBACK); + PendingIntent callbackIntent = PendingIntent.getBroadcastAsUser( + context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT, UserHandle.SYSTEM); + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(ACTION_EUICC_REMOVE_INVISIBLE_SUBSCRIPTIONS); + HandlerThread euiccHandlerThread = + new HandlerThread("euiccRemovingSubsReceiverThread"); + euiccHandlerThread.start(); + Handler euiccHandler = new Handler(euiccHandlerThread.getLooper()); + context.getApplicationContext() + .registerReceiver( + removeEuiccSubsReceiver, intentFilter, null, euiccHandler); + for (SubscriptionInfo subscriptionInfo : subscriptionInfos) { + Log.i( + TAG, + "Remove invisible subscription " + subscriptionInfo.getSubscriptionId() + + " from card " + subscriptionInfo.getCardId()); + euiccManager.createForCardId(subscriptionInfo.getCardId()) + .deleteSubscription(subscriptionInfo.getSubscriptionId(), callbackIntent); + } + try { + long waitingTimeMillis = Settings.Global.getLong( + context.getContentResolver(), + Settings.Global.EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS, + DEFAULT_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS); + if (waitingTimeMillis < MIN_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS) { + waitingTimeMillis = MIN_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS; + } else if (waitingTimeMillis > MAX_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS) { + waitingTimeMillis = MAX_EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS; + } + if (!removeSubsLatch.await(waitingTimeMillis, TimeUnit.MILLISECONDS)) { + Log.e(TAG, "Timeout removing invisible euicc profiles."); + return false; + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + Log.e(TAG, "Removing invisible euicc profiles interrupted", e); + return false; + } finally { + context.getApplicationContext().unregisterReceiver(removeEuiccSubsReceiver); + if (euiccHandlerThread != null) { + euiccHandlerThread.quit(); + } + } + return removedSubsCount.get() == subscriptionInfos.size(); + } + /** {@hide} */ public static void rebootPromptAndWipeUserData(Context context, String reason) throws IOException { diff --git a/core/java/android/os/SystemVibrator.java b/core/java/android/os/SystemVibrator.java index 4af514abfd69..a5188e7cd58d 100644 --- a/core/java/android/os/SystemVibrator.java +++ b/core/java/android/os/SystemVibrator.java @@ -77,16 +77,12 @@ public class SystemVibrator extends Vibrator { return; } try { - mService.vibrate(uid, opPkg, effect, usageForAttributes(attributes), reason, mToken); + mService.vibrate(uid, opPkg, effect, attributes, reason, mToken); } catch (RemoteException e) { Log.w(TAG, "Failed to vibrate.", e); } } - private static int usageForAttributes(AudioAttributes attributes) { - return attributes != null ? attributes.getUsage() : AudioAttributes.USAGE_UNKNOWN; - } - @Override public void cancel() { if (mService == null) { diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java index e30ba38c127f..1fd212df4469 100644 --- a/core/java/android/provider/DeviceConfig.java +++ b/core/java/android/provider/DeviceConfig.java @@ -336,6 +336,15 @@ public final class DeviceConfig { @TestApi String KEY_SYSTEM_GESTURES_EXCLUDED_BY_PRE_Q_STICKY_IMMERSIVE = "system_gestures_excluded_by_pre_q_sticky_immersive"; + + /** + * Key for controlling which packages are explicitly blocked from running at refresh rates + * higher than 60hz. + * + * @see android.provider.DeviceConfig#NAMESPACE_WINDOW_MANAGER + * @hide + */ + String KEY_HIGH_REFRESH_RATE_BLACKLIST = "high_refresh_rate_blacklist"; } private static final Object sLock = new Object(); diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 383d8dbce791..bf8b0066cb64 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -88,6 +88,7 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; import android.util.MemoryIntArray; +import android.view.Display; import android.view.inputmethod.InputMethodSystemProperty; import com.android.internal.annotations.GuardedBy; @@ -4073,7 +4074,7 @@ public final class Settings { * preference, this rotation value will be used. Must be one of the * {@link android.view.Surface#ROTATION_0 Surface rotation constants}. * - * @see android.view.Display#getRotation + * @see Display#getRotation */ public static final String USER_ROTATION = "user_rotation"; @@ -6321,13 +6322,15 @@ public final class Settings { "lock_screen_allow_remote_input"; /** - * Indicates which clock face to show on lock screen and AOD. + * Indicates which clock face to show on lock screen and AOD formatted as a serialized + * {@link org.json.JSONObject} with the format: + * {"clock": id, "_applied_timestamp": timestamp} * @hide */ public static final String LOCK_SCREEN_CUSTOM_CLOCK_FACE = "lock_screen_custom_clock_face"; private static final Validator LOCK_SCREEN_CUSTOM_CLOCK_FACE_VALIDATOR = - ANY_STRING_VALIDATOR; + SettingsValidators.JSON_OBJECT_VALIDATOR; /** * Indicates which clock face to show on lock screen and AOD while docked. @@ -7731,12 +7734,21 @@ public final class Settings { private static final Validator DOZE_TAP_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; /** - * Gesture that wakes up the display, showing the ambient version of the status bar. + * Gesture that wakes up the display, showing some version of the lock screen. + * @hide + */ + public static final String DOZE_WAKE_LOCK_SCREEN_GESTURE = "doze_wake_screen_gesture"; + + private static final Validator DOZE_WAKE_LOCK_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; + + /** + * Gesture that wakes up the display, toggling between {@link Display.STATE_OFF} and + * {@link Display.STATE_DOZE}. * @hide */ - public static final String DOZE_WAKE_SCREEN_GESTURE = "doze_wake_screen_gesture"; + public static final String DOZE_WAKE_DISPLAY_GESTURE = "doze_wake_display_gesture"; - private static final Validator DOZE_WAKE_SCREEN_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; + private static final Validator DOZE_WAKE_DISPLAY_GESTURE_VALIDATOR = BOOLEAN_VALIDATOR; /** * Gesture that skips media. @@ -7752,10 +7764,30 @@ public final class Settings { */ public static final String SKIP_GESTURE_COUNT = "skip_gesture_count"; + /** + * Count of non-gesture interaction. + * @hide + */ + public static final String SKIP_TOUCH_COUNT = "skip_touch_count"; + private static final Validator SKIP_GESTURE_COUNT_VALIDATOR = NON_NEGATIVE_INTEGER_VALIDATOR; /** + * Direction to advance media for skip gesture + * @hide + */ + public static final String SKIP_DIRECTION = "skip_gesture_direction"; + + /** + * Only used if FeatureFlag "settings_skip_direction_mutable" is enabled. + * If feature flag is disabled, should assume SKIP_DIRECTION = 0. + * 0 / false = right to left to advance to next + * 1 / true = left to right to advance to next + */ + private static final Validator SKIP_DIRECTION_VALIDATOR = BOOLEAN_VALIDATOR; + + /** * Gesture that silences sound (alarms, notification, calls). * @hide */ @@ -7782,11 +7814,22 @@ public final class Settings { public static final String SILENCE_CALL_GESTURE_COUNT = "silence_call_gesture_count"; /** - * Count of successful silence notification gestures. + * Count of non-gesture interaction. * @hide */ - public static final String SILENCE_NOTIFICATION_GESTURE_COUNT = - "silence_notification_gesture_count"; + public static final String SILENCE_ALARMS_TOUCH_COUNT = "silence_alarms_touch_count"; + + /** + * Count of non-gesture interaction. + * @hide + */ + public static final String SILENCE_TIMER_TOUCH_COUNT = "silence_timer_touch_count"; + + /** + * Count of non-gesture interaction. + * @hide + */ + public static final String SILENCE_CALL_TOUCH_COUNT = "silence_call_touch_count"; private static final Validator SILENCE_GESTURE_COUNT_VALIDATOR = NON_NEGATIVE_INTEGER_VALIDATOR; @@ -8250,6 +8293,16 @@ public final class Settings { BOOLEAN_VALIDATOR; /** + * Whether or not media is shown automatically when bypassing as a heads up. + * @hide + */ + public static final String SHOW_MEDIA_WHEN_BYPASSING = + "show_media_when_bypassing"; + + private static final Validator SHOW_MEDIA_WHEN_BYPASSING_VALIDATOR = + BOOLEAN_VALIDATOR; + + /** * Whether or not face unlock requires attention. This is a cached value, the source of * truth is obtained through the HAL. * @hide @@ -8948,10 +9001,12 @@ public final class Settings { DOZE_PICK_UP_GESTURE, DOZE_DOUBLE_TAP_GESTURE, DOZE_TAP_SCREEN_GESTURE, - DOZE_WAKE_SCREEN_GESTURE, + DOZE_WAKE_LOCK_SCREEN_GESTURE, + DOZE_WAKE_DISPLAY_GESTURE, NFC_PAYMENT_DEFAULT_COMPONENT, AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN, FACE_UNLOCK_KEYGUARD_ENABLED, + SHOW_MEDIA_WHEN_BYPASSING, FACE_UNLOCK_DISMISSES_KEYGUARD, FACE_UNLOCK_APP_ENABLED, FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION, @@ -8992,15 +9047,19 @@ public final class Settings { UI_NIGHT_MODE, LOCK_SCREEN_WHEN_TRUST_LOST, SKIP_GESTURE, + SKIP_DIRECTION, SILENCE_GESTURE, THEME_CUSTOMIZATION_OVERLAY_PACKAGES, NAVIGATION_MODE, AWARE_ENABLED, SKIP_GESTURE_COUNT, + SKIP_TOUCH_COUNT, SILENCE_ALARMS_GESTURE_COUNT, - SILENCE_NOTIFICATION_GESTURE_COUNT, SILENCE_CALL_GESTURE_COUNT, SILENCE_TIMER_GESTURE_COUNT, + SILENCE_ALARMS_TOUCH_COUNT, + SILENCE_CALL_TOUCH_COUNT, + SILENCE_TIMER_TOUCH_COUNT, DARK_MODE_DIALOG_SEEN, GLOBAL_ACTIONS_PANEL_ENABLED, AWARE_LOCK_ENABLED @@ -9119,13 +9178,15 @@ public final class Settings { VALIDATORS.put(DOZE_PICK_UP_GESTURE, DOZE_PICK_UP_GESTURE_VALIDATOR); VALIDATORS.put(DOZE_DOUBLE_TAP_GESTURE, DOZE_DOUBLE_TAP_GESTURE_VALIDATOR); VALIDATORS.put(DOZE_TAP_SCREEN_GESTURE, DOZE_TAP_SCREEN_GESTURE_VALIDATOR); - VALIDATORS.put(DOZE_WAKE_SCREEN_GESTURE, DOZE_WAKE_SCREEN_GESTURE_VALIDATOR); + VALIDATORS.put(DOZE_WAKE_LOCK_SCREEN_GESTURE, DOZE_WAKE_LOCK_SCREEN_GESTURE_VALIDATOR); + VALIDATORS.put(DOZE_WAKE_DISPLAY_GESTURE, DOZE_WAKE_DISPLAY_GESTURE_VALIDATOR); VALIDATORS.put(NFC_PAYMENT_DEFAULT_COMPONENT, NFC_PAYMENT_DEFAULT_COMPONENT_VALIDATOR); VALIDATORS.put(AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN, AUTOMATIC_STORAGE_MANAGER_DAYS_TO_RETAIN_VALIDATOR); VALIDATORS.put(FACE_UNLOCK_KEYGUARD_ENABLED, FACE_UNLOCK_KEYGUARD_ENABLED_VALIDATOR); VALIDATORS.put(FACE_UNLOCK_DISMISSES_KEYGUARD, FACE_UNLOCK_DISMISSES_KEYGUARD_VALIDATOR); + VALIDATORS.put(SHOW_MEDIA_WHEN_BYPASSING, SHOW_MEDIA_WHEN_BYPASSING_VALIDATOR); VALIDATORS.put(FACE_UNLOCK_APP_ENABLED, FACE_UNLOCK_APP_ENABLED_VALIDATOR); VALIDATORS.put(FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION, FACE_UNLOCK_ALWAYS_REQUIRE_CONFIRMATION_VALIDATOR); @@ -9178,16 +9239,21 @@ public final class Settings { VALIDATORS.put(LOCK_SCREEN_CUSTOM_CLOCK_FACE, LOCK_SCREEN_CUSTOM_CLOCK_FACE_VALIDATOR); VALIDATORS.put(LOCK_SCREEN_WHEN_TRUST_LOST, LOCK_SCREEN_WHEN_TRUST_LOST_VALIDATOR); VALIDATORS.put(SKIP_GESTURE, SKIP_GESTURE_VALIDATOR); + VALIDATORS.put(SKIP_DIRECTION, SKIP_DIRECTION_VALIDATOR); + VALIDATORS.put(SKIP_DIRECTION, SKIP_DIRECTION_VALIDATOR); VALIDATORS.put(SILENCE_GESTURE, SILENCE_GESTURE_VALIDATOR); VALIDATORS.put(THEME_CUSTOMIZATION_OVERLAY_PACKAGES, THEME_CUSTOMIZATION_OVERLAY_PACKAGES_VALIDATOR); VALIDATORS.put(NAVIGATION_MODE, NAVIGATION_MODE_VALIDATOR); VALIDATORS.put(AWARE_ENABLED, AWARE_ENABLED_VALIDATOR); VALIDATORS.put(SKIP_GESTURE_COUNT, SKIP_GESTURE_COUNT_VALIDATOR); + VALIDATORS.put(SKIP_TOUCH_COUNT, SKIP_GESTURE_COUNT_VALIDATOR); VALIDATORS.put(SILENCE_ALARMS_GESTURE_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); VALIDATORS.put(SILENCE_TIMER_GESTURE_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); VALIDATORS.put(SILENCE_CALL_GESTURE_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); - VALIDATORS.put(SILENCE_NOTIFICATION_GESTURE_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); + VALIDATORS.put(SILENCE_ALARMS_TOUCH_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); + VALIDATORS.put(SILENCE_TIMER_TOUCH_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); + VALIDATORS.put(SILENCE_CALL_TOUCH_COUNT, SILENCE_GESTURE_COUNT_VALIDATOR); VALIDATORS.put(ODI_CAPTIONS_ENABLED, ODI_CAPTIONS_ENABLED_VALIDATOR); VALIDATORS.put(DARK_MODE_DIALOG_SEEN, BOOLEAN_VALIDATOR); VALIDATORS.put(UI_NIGHT_MODE, UI_NIGHT_MODE_VALIDATOR); @@ -13549,6 +13615,16 @@ public final class Settings { "location_settings_link_to_permissions_enabled"; /** + * Flag to set the waiting time for removing invisible euicc profiles inside System > + * Settings. + * Type: long + * + * @hide + */ + public static final String EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS = + "euicc_removing_invisible_profiles_timeout_millis"; + + /** * Flag to set the waiting time for euicc factory reset inside System > Settings * Type: long * diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java index 324e02ceb1d5..0e0c676c2782 100644 --- a/core/java/android/util/FeatureFlagUtils.java +++ b/core/java/android/util/FeatureFlagUtils.java @@ -57,6 +57,7 @@ public class FeatureFlagUtils { DEFAULT_FLAGS.put(SCREENRECORD_LONG_PRESS, "false"); DEFAULT_FLAGS.put(PIXEL_WALLPAPER_CATEGORY_SWITCH, "false"); DEFAULT_FLAGS.put("settings_wifi_details_datausage_header", "false"); + DEFAULT_FLAGS.put("settings_skip_direction_mutable", "true"); } /** diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java index bbd44c8b85af..4b929683fd6d 100644 --- a/core/java/android/view/AccessibilityInteractionController.java +++ b/core/java/android/view/AccessibilityInteractionController.java @@ -830,6 +830,32 @@ public final class AccessibilityInteractionController { return false; } + private void adjustBoundsInScreenIfNeeded(List<AccessibilityNodeInfo> infos) { + if (infos == null || shouldBypassAdjustBoundsInScreen()) { + return; + } + final int infoCount = infos.size(); + for (int i = 0; i < infoCount; i++) { + final AccessibilityNodeInfo info = infos.get(i); + adjustBoundsInScreenIfNeeded(info); + } + } + + private void adjustBoundsInScreenIfNeeded(AccessibilityNodeInfo info) { + if (info == null || shouldBypassAdjustBoundsInScreen()) { + return; + } + final Rect boundsInScreen = mTempRect; + info.getBoundsInScreen(boundsInScreen); + boundsInScreen.offset(mViewRootImpl.mAttachInfo.mLocationInParentDisplay.x, + mViewRootImpl.mAttachInfo.mLocationInParentDisplay.y); + info.setBoundsInScreen(boundsInScreen); + } + + private boolean shouldBypassAdjustBoundsInScreen() { + return mViewRootImpl.mAttachInfo.mLocationInParentDisplay.equals(0, 0); + } + private void applyAppScaleAndMagnificationSpecIfNeeded(AccessibilityNodeInfo info, MagnificationSpec spec) { if (info == null) { @@ -921,6 +947,7 @@ public final class AccessibilityInteractionController { MagnificationSpec spec, Region interactiveRegion) { try { mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0; + adjustBoundsInScreenIfNeeded(infos); applyAppScaleAndMagnificationSpecIfNeeded(infos, spec); adjustIsVisibleToUserIfNeeded(infos, interactiveRegion); callback.setFindAccessibilityNodeInfosResult(infos, interactionId); @@ -939,6 +966,7 @@ public final class AccessibilityInteractionController { MagnificationSpec spec, Region interactiveRegion) { try { mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0; + adjustBoundsInScreenIfNeeded(info); applyAppScaleAndMagnificationSpecIfNeeded(info, spec); adjustIsVisibleToUserIfNeeded(info, interactiveRegion); callback.setFindAccessibilityNodeInfoResult(info, interactionId); diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java index c64386e8db79..e95b5caa4fa0 100644 --- a/core/java/android/view/Choreographer.java +++ b/core/java/android/view/Choreographer.java @@ -16,6 +16,7 @@ package android.view; +import static android.view.DisplayEventReceiver.CONFIG_CHANGED_EVENT_SUPPRESS; import static android.view.DisplayEventReceiver.VSYNC_SOURCE_APP; import static android.view.DisplayEventReceiver.VSYNC_SOURCE_SURFACE_FLINGER; @@ -910,7 +911,7 @@ public final class Choreographer { private int mFrame; public FrameDisplayEventReceiver(Looper looper, int vsyncSource) { - super(looper, vsyncSource); + super(looper, vsyncSource, CONFIG_CHANGED_EVENT_SUPPRESS); } // TODO(b/116025192): physicalDisplayId is ignored because SF only emits VSYNC events for diff --git a/core/java/android/view/DisplayEventReceiver.java b/core/java/android/view/DisplayEventReceiver.java index 60daddd663d5..91acc4638c26 100644 --- a/core/java/android/view/DisplayEventReceiver.java +++ b/core/java/android/view/DisplayEventReceiver.java @@ -53,6 +53,20 @@ public abstract class DisplayEventReceiver { */ public static final int VSYNC_SOURCE_SURFACE_FLINGER = 1; + /** + * Specifies to suppress config changed events from being generated from Surface Flinger. + * <p> + * Needs to be kept in sync with frameworks/native/include/gui/ISurfaceComposer.h + */ + public static final int CONFIG_CHANGED_EVENT_SUPPRESS = 0; + + /** + * Specifies to generate config changed events from Surface Flinger. + * <p> + * Needs to be kept in sync with frameworks/native/include/gui/ISurfaceComposer.h + */ + public static final int CONFIG_CHANGED_EVENT_DISPATCH = 1; + private static final String TAG = "DisplayEventReceiver"; private final CloseGuard mCloseGuard = CloseGuard.get(); @@ -65,7 +79,7 @@ public abstract class DisplayEventReceiver { private MessageQueue mMessageQueue; private static native long nativeInit(WeakReference<DisplayEventReceiver> receiver, - MessageQueue messageQueue, int vsyncSource); + MessageQueue messageQueue, int vsyncSource, int configChanged); private static native void nativeDispose(long receiverPtr); @FastNative private static native void nativeScheduleVsync(long receiverPtr); @@ -77,7 +91,7 @@ public abstract class DisplayEventReceiver { */ @UnsupportedAppUsage public DisplayEventReceiver(Looper looper) { - this(looper, VSYNC_SOURCE_APP); + this(looper, VSYNC_SOURCE_APP, CONFIG_CHANGED_EVENT_SUPPRESS); } /** @@ -85,15 +99,17 @@ public abstract class DisplayEventReceiver { * * @param looper The looper to use when invoking callbacks. * @param vsyncSource The source of the vsync tick. Must be on of the VSYNC_SOURCE_* values. + * @param configChanged Whether to dispatch config changed events. Must be one of the + * CONFIG_CHANGED_EVENT_* values. */ - public DisplayEventReceiver(Looper looper, int vsyncSource) { + public DisplayEventReceiver(Looper looper, int vsyncSource, int configChanged) { if (looper == null) { throw new IllegalArgumentException("looper must not be null"); } mMessageQueue = looper.getQueue(); mReceiverPtr = nativeInit(new WeakReference<DisplayEventReceiver>(this), mMessageQueue, - vsyncSource); + vsyncSource, configChanged); mCloseGuard.open("dispose"); } diff --git a/core/java/android/view/IRecentsAnimationController.aidl b/core/java/android/view/IRecentsAnimationController.aidl index 956161acd762..955be8d40c47 100644 --- a/core/java/android/view/IRecentsAnimationController.aidl +++ b/core/java/android/view/IRecentsAnimationController.aidl @@ -77,6 +77,21 @@ interface IRecentsAnimationController { void hideCurrentInputMethod(); /** + * This call is deprecated, use #setDeferCancelUntilNextTransition() instead + * TODO(138144750): Remove this method once there are no callers + * @deprecated + */ + void setCancelWithDeferredScreenshot(boolean screenshot); + + /** + * Clean up the screenshot of previous task which was created during recents animation that + * was cancelled by a stack order change. + * + * @see {@link IRecentsAnimationRunner#onAnimationCanceled} + */ + void cleanupScreenshot(); + + /** * Set a state for controller whether would like to cancel recents animations with deferred * task screenshot presentation. * @@ -86,22 +101,23 @@ interface IRecentsAnimationController { * screenshot, so that Launcher can still control the leash lifecycle & make the next app * transition animate smoothly without flickering. * - * @param screenshot When set {@code true}, means recents animation will be canceled when the - * next app launch. System will take previous task's screenshot when the next - * app transition starting, and skip previous task's animation. - * Set {@code false} means will not take screenshot & skip animation - * for previous task. + * @param defer When set {@code true}, means that the recents animation will defer canceling the + * animation when a stack order change is triggered until the subsequent app + * transition start and skip previous task's animation. + * When set to {@code false}, means that the recents animation will be canceled + * immediately when the stack order changes. + * @param screenshot When set {@code true}, means that the system will take previous task's + * screenshot and replace the contents of the leash with it when the next app + * transition starting. The runner must call #cleanupScreenshot() to end the + * recents animation. + * When set to {@code false}, means that the system will simply wait for the + * next app transition start to immediately cancel the recents animation. This + * can be useful when you want an immediate transition into a state where the + * task is shown in the home/recents activity (without waiting for a + * screenshot). * * @see #cleanupScreenshot() * @see IRecentsAnimationRunner#onCancelled */ - void setCancelWithDeferredScreenshot(boolean screenshot); - - /** - * Clean up the screenshot of previous task which was created during recents animation that - * was cancelled by a stack order change. - * - * @see {@link IRecentsAnimationRunner#onAnimationCanceled} - */ - void cleanupScreenshot(); + void setDeferCancelUntilNextTransition(boolean defer, boolean screenshot); } diff --git a/core/java/android/view/IRecentsAnimationRunner.aidl b/core/java/android/view/IRecentsAnimationRunner.aidl index 9c652a8d990b..6cda60c80b7d 100644 --- a/core/java/android/view/IRecentsAnimationRunner.aidl +++ b/core/java/android/view/IRecentsAnimationRunner.aidl @@ -36,7 +36,7 @@ oneway interface IRecentsAnimationRunner { * @param deferredWithScreenshot If set to {@code true}, the contents of the task will be * replaced with a screenshot, such that the runner's leash is * still active. As soon as the runner doesn't need the leash - * anymore, it can call + * anymore, it must call * {@link IRecentsAnimationController#cleanupScreenshot). * * @see {@link RecentsAnimationController#cleanupScreenshot} diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl index 699e795be980..f34f9e6d5ce8 100644 --- a/core/java/android/view/IWindow.aidl +++ b/core/java/android/view/IWindow.aidl @@ -17,6 +17,7 @@ package android.view; +import android.graphics.Point; import android.graphics.Rect; import android.os.Bundle; import android.os.ParcelFileDescriptor; @@ -57,6 +58,12 @@ oneway interface IWindow { in DisplayCutout.ParcelableWrapper displayCutout); /** + * Called when the window location in parent display has changed. The offset will only be a + * nonzero value if the window is on an embedded display that is re-parented to another window. + */ + void locationInParentDisplayChanged(in Point offset); + + /** * Called when the window insets configuration has changed. */ void insetsChanged(in InsetsState insetsState); diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index cb64ab1fd921..17f07b5a2ad4 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.UnsupportedAppUsage; import android.content.res.CompatibilityInfo.Translator; import android.graphics.Canvas; +import android.graphics.ColorSpace; import android.graphics.GraphicBuffer; import android.graphics.Matrix; import android.graphics.RecordingCanvas; @@ -80,7 +81,8 @@ public class Surface implements Parcelable { private static native long nativeGetNextFrameNumber(long nativeObject); private static native int nativeSetScalingMode(long nativeObject, int scalingMode); private static native int nativeForceScopedDisconnect(long nativeObject); - private static native int nativeAttachAndQueueBuffer(long nativeObject, GraphicBuffer buffer); + private static native int nativeAttachAndQueueBufferWithColorSpace(long nativeObject, + GraphicBuffer buffer, int colorSpaceId); private static native int nativeSetSharedBufferModeEnabled(long nativeObject, boolean enabled); private static native int nativeSetAutoRefreshEnabled(long nativeObject, boolean enabled); @@ -699,21 +701,38 @@ public class Surface implements Parcelable { } /** - * Transfer ownership of buffer and present it on the Surface. + * Transfer ownership of buffer with a color space and present it on the Surface. + * The supported color spaces are SRGB and Display P3, other color spaces will be + * treated as SRGB. * @hide */ - public void attachAndQueueBuffer(GraphicBuffer buffer) { + public void attachAndQueueBufferWithColorSpace(GraphicBuffer buffer, ColorSpace colorSpace) { synchronized (mLock) { checkNotReleasedLocked(); - int err = nativeAttachAndQueueBuffer(mNativeObject, buffer); + if (colorSpace == null) { + colorSpace = ColorSpace.get(ColorSpace.Named.SRGB); + } + int err = nativeAttachAndQueueBufferWithColorSpace(mNativeObject, buffer, + colorSpace.getId()); if (err != 0) { throw new RuntimeException( - "Failed to attach and queue buffer to Surface (bad object?)"); + "Failed to attach and queue buffer to Surface (bad object?), " + + "native error: " + err); } } } /** + * Deprecated, use attachAndQueueBufferWithColorSpace instead. + * Transfer ownership of buffer and present it on the Surface. + * The color space of the buffer is treated as SRGB. + * @hide + */ + public void attachAndQueueBuffer(GraphicBuffer buffer) { + attachAndQueueBufferWithColorSpace(buffer, ColorSpace.get(ColorSpace.Named.SRGB)); + } + + /** * Returns whether or not this Surface is backed by a single-buffered SurfaceTexture * @hide */ diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 63e14853b51d..3c045f4fdb88 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -1866,7 +1866,8 @@ public final class SurfaceControl implements Parcelable { final ScreenshotGraphicBuffer buffer = screenshotToBuffer(display, sourceCrop, width, height, useIdentityTransform, rotation); try { - consumer.attachAndQueueBuffer(buffer.getGraphicBuffer()); + consumer.attachAndQueueBufferWithColorSpace(buffer.getGraphicBuffer(), + buffer.getColorSpace()); } catch (RuntimeException e) { Log.w(TAG, "Failed to take screenshot - " + e.getMessage()); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index e3db475d6681..4e86e60fdd62 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -1390,6 +1390,74 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ public static final int AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x1; + /** @hide */ + @IntDef(prefix = { "IMPORTANT_FOR_CONTENT_CAPTURE_" }, value = { + IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, + IMPORTANT_FOR_CONTENT_CAPTURE_YES, + IMPORTANT_FOR_CONTENT_CAPTURE_NO, + IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, + IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS + }) + @Retention(RetentionPolicy.SOURCE) + public @interface ContentCaptureImportance {} + + /** + * Automatically determine whether a view is important for content capture. + * + * @see #isImportantForContentCapture() + * @see #setImportantForContentCapture(int) + * + * @hide + */ + @TestApi + public static final int IMPORTANT_FOR_CONTENT_CAPTURE_AUTO = 0x0; + + /** + * The view is important for content capture, and its children (if any) will be traversed. + * + * @see #isImportantForContentCapture() + * @see #setImportantForContentCapture(int) + * + * @hide + */ + @TestApi + public static final int IMPORTANT_FOR_CONTENT_CAPTURE_YES = 0x1; + + /** + * The view is not important for content capture, but its children (if any) will be traversed. + * + * @see #isImportantForContentCapture() + * @see #setImportantForContentCapture(int) + * + * @hide + */ + @TestApi + public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO = 0x2; + + /** + * The view is important for content capture, but its children (if any) will not be traversed. + * + * @see #isImportantForContentCapture() + * @see #setImportantForContentCapture(int) + * + * @hide + */ + @TestApi + public static final int IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS = 0x4; + + /** + * The view is not important for content capture, and its children (if any) will not be + * traversed. + * + * @see #isImportantForContentCapture() + * @see #setImportantForContentCapture(int) + * + * @hide + */ + @TestApi + public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS = 0x8; + + /** * This view is enabled. Interpretation varies by subclass. * Use with ENABLED_MASK when calling setFlags. @@ -3362,6 +3430,55 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /* End of masks for mPrivateFlags3 */ + /* + * Masks for mPrivateFlags4, as generated by dumpFlags(): + * + * |-------|-------|-------|-------| + * 1111 PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK + * 1 PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED + * 1 PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED + * 1 PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED + * 1 PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE + * 11 PFLAG4_CONTENT_CAPTURE_IMPORTANCE_MASK + * |-------|-------|-------|-------| + */ + + /** + * Mask for obtaining the bits which specify how to determine + * whether a view is important for autofill. + * + * <p>NOTE: the important for content capture values were the first flags added and are set in + * the rightmost position, so we don't need to shift them + */ + private static final int PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK = + IMPORTANT_FOR_CONTENT_CAPTURE_AUTO | IMPORTANT_FOR_CONTENT_CAPTURE_YES + | IMPORTANT_FOR_CONTENT_CAPTURE_NO + | IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS + | IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS; + + /* + * Variables used to control when the IntelligenceManager.notifyNodeAdded()/removed() methods + * should be called. + * + * The idea is to call notifyAppeared() after the view is layout and visible, then call + * notifyDisappeared() when it's gone (without known when it was removed from the parent). + */ + private static final int PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED = 0x10; + private static final int PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED = 0x20; + + /* + * Flags used to cache the value returned by isImportantForContentCapture while the view + * hierarchy is being traversed. + */ + private static final int PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED = 0x40; + private static final int PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE = 0x80; + + private static final int PFLAG4_CONTENT_CAPTURE_IMPORTANCE_MASK = + PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED + | PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE; + + /* End of masks for mPrivateFlags4 */ + /** @hide */ protected static final int VIEW_STRUCTURE_FOR_ASSIST = 0; /** @hide */ @@ -3985,6 +4102,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 129147060) int mPrivateFlags3; + private int mPrivateFlags4; + /** * This view's request for the visibility of the status bar. * @hide @@ -8442,6 +8561,65 @@ public class View implements Drawable.Callback, KeyEvent.Callback, onProvideStructure(structure, VIEW_STRUCTURE_FOR_AUTOFILL, flags); } + /** + * Populates a {@link ViewStructure} for content capture. + * + * <p>This method is called after a view is that is eligible for content capture + * (for example, if it {@link #isImportantForAutofill()}, an intelligence service is enabled for + * the user, and the activity rendering the view is enabled for content capture) is laid out and + * is visible. + * + * <p>The populated structure is then passed to the service through + * {@link ContentCaptureSession#notifyViewAppeared(ViewStructure)}. + * + * <p><b>Note: </b>views that manage a virtual structure under this view must populate just + * the node representing this view and return right away, then asynchronously report (not + * necessarily in the UI thread) when the children nodes appear, disappear or have their text + * changed by calling + * {@link ContentCaptureSession#notifyViewAppeared(ViewStructure)}, + * {@link ContentCaptureSession#notifyViewDisappeared(AutofillId)}, and + * {@link ContentCaptureSession#notifyViewTextChanged(AutofillId, CharSequence)} + * respectively. The structure for the a child must be created using + * {@link ContentCaptureSession#newVirtualViewStructure(AutofillId, long)}, and the + * {@code autofillId} for a child can be obtained either through + * {@code childStructure.getAutofillId()} or + * {@link ContentCaptureSession#newAutofillId(AutofillId, long)}. + * + * <p>When the virtual view hierarchy represents a web page, you should also: + * + * <ul> + * <li>Call {@link ContentCaptureManager#getContentCaptureConditions()} to infer content + * capture events should be generate for that URL. + * <li>Create a new {@link ContentCaptureSession} child for every HTML element that + * renders a new URL (like an {@code IFRAME}) and use that session to notify events from + * that subtree. + * </ul> + * + * <p><b>Note: </b>the following methods of the {@code structure} will be ignored: + * <ul> + * <li>{@link ViewStructure#setChildCount(int)} + * <li>{@link ViewStructure#addChildCount(int)} + * <li>{@link ViewStructure#getChildCount()} + * <li>{@link ViewStructure#newChild(int)} + * <li>{@link ViewStructure#asyncNewChild(int)} + * <li>{@link ViewStructure#asyncCommit()} + * <li>{@link ViewStructure#setWebDomain(String)} + * <li>{@link ViewStructure#newHtmlInfoBuilder(String)} + * <li>{@link ViewStructure#setHtmlInfo(android.view.ViewStructure.HtmlInfo)} + * <li>{@link ViewStructure#setDataIsSensitive(boolean)} + * <li>{@link ViewStructure#setAlpha(float)} + * <li>{@link ViewStructure#setElevation(float)} + * <li>{@link ViewStructure#setTransformation(Matrix)} + * + * </ul> + * + * @hide + */ + @TestApi + public void onProvideContentCaptureStructure(@NonNull ViewStructure structure, int flags) { + onProvideStructure(structure, VIEW_STRUCTURE_FOR_CONTENT_CAPTURE, flags); + } + /** @hide */ protected void onProvideStructure(@NonNull ViewStructure structure, @ViewStructureType int viewFor, int flags) { @@ -9080,6 +9258,280 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * Gets the mode for determining whether this view is important for content capture. + * + * <p>See {@link #setImportantForContentCapture(int)} and + * {@link #isImportantForContentCapture()} for more info about this mode. + * + * @return {@link #IMPORTANT_FOR_CONTENT_CAPTURE_AUTO} by default, or value passed to + * {@link #setImportantForContentCapture(int)}. + * + * @attr ref android.R.styleable#View_importantForContentCapture + * + * @hide + */ + @ViewDebug.ExportedProperty(mapping = { + @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, to = "auto"), + @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_YES, to = "yes"), + @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_NO, to = "no"), + @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, + to = "yesExcludeDescendants"), + @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS, + to = "noExcludeDescendants")}) +// @InspectableProperty(enumMapping = { +// @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, name = "auto"), +// @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_YES, name = "yes"), +// @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_NO, name = "no"), +// @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, +// name = "yesExcludeDescendants"), +// @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS, +// name = "noExcludeDescendants"), +// }) + @TestApi + public @ContentCaptureImportance int getImportantForContentCapture() { + // NOTE: the important for content capture values were the first flags added and are set in + // the rightmost position, so we don't need to shift them + return mPrivateFlags4 & PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK; + } + + /** + * Sets the mode for determining whether this view is considered important for content capture. + * + * <p>The platform determines the importance for autofill automatically but you + * can use this method to customize the behavior. Typically, a view that provides text should + * be marked as {@link #IMPORTANT_FOR_CONTENT_CAPTURE_YES}. + * + * @param mode {@link #IMPORTANT_FOR_CONTENT_CAPTURE_AUTO}, + * {@link #IMPORTANT_FOR_CONTENT_CAPTURE_YES}, {@link #IMPORTANT_FOR_CONTENT_CAPTURE_NO}, + * {@link #IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS}, + * or {@link #IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS}. + * + * @attr ref android.R.styleable#View_importantForContentCapture + * + * @hide + */ + @TestApi + public void setImportantForContentCapture(@ContentCaptureImportance int mode) { + // Reset first + mPrivateFlags4 &= ~PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK; + // Then set again + // NOTE: the important for content capture values were the first flags added and are set in + // the rightmost position, so we don't need to shift them + mPrivateFlags4 |= (mode & PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK); + } + + /** + * Hints the Android System whether this view is considered important for content capture, based + * on the value explicitly set by {@link #setImportantForContentCapture(int)} and heuristics + * when it's {@link #IMPORTANT_FOR_CONTENT_CAPTURE_AUTO}. + * + * <p>See {@link ContentCaptureManager} for more info about content capture. + * + * @return whether the view is considered important for content capture. + * + * @see #setImportantForContentCapture(int) + * @see #IMPORTANT_FOR_CONTENT_CAPTURE_AUTO + * @see #IMPORTANT_FOR_CONTENT_CAPTURE_YES + * @see #IMPORTANT_FOR_CONTENT_CAPTURE_NO + * @see #IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS + * @see #IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS + * + * @hide + */ + @TestApi + public final boolean isImportantForContentCapture() { + boolean isImportant; + if ((mPrivateFlags4 & PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED) != 0) { + isImportant = (mPrivateFlags4 & PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE) != 0; + return isImportant; + } + + isImportant = calculateIsImportantForContentCapture(); + + mPrivateFlags4 &= ~PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE; + if (isImportant) { + mPrivateFlags4 |= PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE; + } + mPrivateFlags4 |= PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED; + return isImportant; + } + + /** + * Calculates whether the flag is important for content capture so it can be used by + * {@link #isImportantForContentCapture()} while the tree is traversed. + */ + private boolean calculateIsImportantForContentCapture() { + // Check parent mode to ensure we're important + ViewParent parent = mParent; + while (parent instanceof View) { + final int parentImportance = ((View) parent).getImportantForContentCapture(); + if (parentImportance == IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS + || parentImportance == IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS) { + if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.VERBOSE)) { + Log.v(CONTENT_CAPTURE_LOG_TAG, "View (" + this + ") is not important for " + + "content capture because parent " + parent + "'s importance is " + + parentImportance); + } + return false; + } + parent = parent.getParent(); + } + + final int importance = getImportantForContentCapture(); + + // First, check the explicit states. + if (importance == IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS + || importance == IMPORTANT_FOR_CONTENT_CAPTURE_YES) { + return true; + } + if (importance == IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS + || importance == IMPORTANT_FOR_CONTENT_CAPTURE_NO) { + if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.VERBOSE)) { + Log.v(CONTENT_CAPTURE_LOG_TAG, "View (" + this + ") is not important for content " + + "capture because its importance is " + importance); + } + return false; + } + + // Then use some heuristics to handle AUTO. + if (importance != IMPORTANT_FOR_CONTENT_CAPTURE_AUTO) { + Log.w(CONTENT_CAPTURE_LOG_TAG, "invalid content capture importance (" + importance + + " on view " + this); + return false; + } + + // View group is important if at least one children also is + if (this instanceof ViewGroup) { + final ViewGroup group = (ViewGroup) this; + for (int i = 0; i < group.getChildCount(); i++) { + final View child = group.getChildAt(i); + if (child.isImportantForContentCapture()) { + return true; + } + } + } + + // If the app developer explicitly set hints or autofill hintsfor it, it's important. + if (getAutofillHints() != null) { + return true; + } + + // Otherwise, assume it's not important... + return false; + } + + /** + * Helper used to notify the {@link ContentCaptureManager} when the view is removed or + * added, based on whether it's laid out and visible, and without knowing if the parent removed + * it from the view hierarchy. + * + * <p>This method is called from many places (visibility changed, view laid out, view attached + * or detached to/from window, etc...) and hence must contain the logic to call the manager, as + * described below: + * + * <ol> + * <li>It should only be called when content capture is enabled for the view. + * <li>It must call viewAppeared() before viewDisappeared() + * <li>viewAppearead() can only be called when the view is visible and laidout + * <li>It should not call the same event twice. + * </ol> + */ + private void notifyAppearedOrDisappearedForContentCaptureIfNeeded(boolean appeared) { + AttachInfo ai = mAttachInfo; + // Skip it while the view is being laided out for the first time + if (ai != null && !ai.mReadyForContentCaptureUpdates) return; + + if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { + Trace.traceBegin(Trace.TRACE_TAG_VIEW, + "notifyContentCapture(" + appeared + ") for " + getClass().getSimpleName()); + } + try { + notifyAppearedOrDisappearedForContentCaptureIfNeededNoTrace(appeared); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } + } + + private void notifyAppearedOrDisappearedForContentCaptureIfNeededNoTrace(boolean appeared) { + AttachInfo ai = mAttachInfo; + + // First check if context has client, so it saves a service lookup when it doesn't + if (mContext.getContentCaptureOptions() == null) return; + + // Then check if it's enabled in the context... + final ContentCaptureManager ccm = ai != null ? ai.getContentCaptureManager(mContext) + : mContext.getSystemService(ContentCaptureManager.class); + if (ccm == null || !ccm.isContentCaptureEnabled()) return; + + // ... and finally at the view level + // NOTE: isImportantForContentCapture() is more expensive than cm.isContentCaptureEnabled() + if (!isImportantForContentCapture()) return; + + ContentCaptureSession session = getContentCaptureSession(); + if (session == null) return; + + if (appeared) { + if (!isLaidOut() || getVisibility() != VISIBLE + || (mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0) { + if (DEBUG_CONTENT_CAPTURE) { + Log.v(CONTENT_CAPTURE_LOG_TAG, "Ignoring 'appeared' on " + this + ": laid=" + + isLaidOut() + ", visibleToUser=" + isVisibleToUser() + + ", visible=" + (getVisibility() == VISIBLE) + + ": alreadyNotifiedAppeared=" + ((mPrivateFlags4 + & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0) + + ", alreadyNotifiedDisappeared=" + ((mPrivateFlags4 + & PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED) != 0)); + } + return; + } + setNotifiedContentCaptureAppeared(); + + if (ai != null) { + ai.delayNotifyContentCaptureEvent(session, this, appeared); + } else { + if (DEBUG_CONTENT_CAPTURE) { + Log.w(CONTENT_CAPTURE_LOG_TAG, "no AttachInfo on appeared for " + this); + } + } + } else { + if ((mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) == 0 + || (mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED) != 0) { + if (DEBUG_CONTENT_CAPTURE) { + Log.v(CONTENT_CAPTURE_LOG_TAG, "Ignoring 'disappeared' on " + this + ": laid=" + + isLaidOut() + ", visibleToUser=" + isVisibleToUser() + + ", visible=" + (getVisibility() == VISIBLE) + + ": alreadyNotifiedAppeared=" + ((mPrivateFlags4 + & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0) + + ", alreadyNotifiedDisappeared=" + ((mPrivateFlags4 + & PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED) != 0)); + } + return; + } + mPrivateFlags4 |= PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED; + mPrivateFlags4 &= ~PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED; + + if (ai != null) { + ai.delayNotifyContentCaptureEvent(session, this, appeared); + } else { + if (DEBUG_CONTENT_CAPTURE) { + Log.v(CONTENT_CAPTURE_LOG_TAG, "no AttachInfo on disappeared for " + this); + } + } + } + } + + private void setNotifiedContentCaptureAppeared() { + mPrivateFlags4 |= PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED; + mPrivateFlags4 &= ~PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED; + } + + /** @hide */ + protected boolean getNotifiedContentCaptureAppeared() { + return (mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0; + } + + + /** * Sets the (optional) {@link ContentCaptureSession} associated with this view. * * <p>This method should be called when you need to associate a {@link ContentCaptureContext} to @@ -9332,6 +9784,68 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * Dispatches the initial content capture events for a view structure. + * + * @hide + */ + public void dispatchInitialProvideContentCaptureStructure() { + AttachInfo ai = mAttachInfo; + if (ai == null) { + Log.w(CONTENT_CAPTURE_LOG_TAG, + "dispatchProvideContentCaptureStructure(): no AttachInfo for " + this); + return; + } + ContentCaptureManager ccm = ai.mContentCaptureManager; + if (ccm == null) { + Log.w(CONTENT_CAPTURE_LOG_TAG, "dispatchProvideContentCaptureStructure(): " + + "no ContentCaptureManager for " + this); + return; + } + + // We must set it before checkign if the view itself is important, because it might + // initially not be (for example, if it's empty), although that might change later (for + // example, if important views are added) + ai.mReadyForContentCaptureUpdates = true; + + if (!isImportantForContentCapture()) { + if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.DEBUG)) { + Log.d(CONTENT_CAPTURE_LOG_TAG, + "dispatchProvideContentCaptureStructure(): decorView is not important"); + } + return; + } + + ai.mContentCaptureManager = ccm; + + ContentCaptureSession session = getContentCaptureSession(); + if (session == null) { + if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.DEBUG)) { + Log.d(CONTENT_CAPTURE_LOG_TAG, + "dispatchProvideContentCaptureStructure(): no session for " + this); + } + return; + } + + session.internalNotifyViewTreeEvent(/* started= */ true); + try { + dispatchProvideContentCaptureStructure(); + } finally { + session.internalNotifyViewTreeEvent(/* started= */ false); + } + } + + /** @hide */ + void dispatchProvideContentCaptureStructure() { + ContentCaptureSession session = getContentCaptureSession(); + if (session != null) { + ViewStructure structure = session.newViewStructure(this); + onProvideContentCaptureStructure(structure, /* flags= */ 0); + setNotifiedContentCaptureAppeared(); + session.notifyViewAppeared(structure); + } + } + + /** * @see #onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo) * * Note: Called from the default {@link AccessibilityDelegate}. @@ -13288,6 +13802,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, public void dispatchStartTemporaryDetach() { mPrivateFlags3 |= PFLAG3_TEMPORARY_DETACH; notifyEnterOrExitForAutoFillIfNeeded(false); + notifyAppearedOrDisappearedForContentCaptureIfNeeded(false); onStartTemporaryDetach(); } @@ -13314,6 +13829,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, notifyFocusChangeToInputMethodManager(true /* hasFocus */); } notifyEnterOrExitForAutoFillIfNeeded(true); + notifyAppearedOrDisappearedForContentCaptureIfNeeded(true); } /** @@ -13905,6 +14421,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, : AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_DISAPPEARED); } } + + notifyAppearedOrDisappearedForContentCaptureIfNeeded(isVisible); } /** @@ -17600,6 +18118,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } // Reset content capture caches + mPrivateFlags4 &= ~PFLAG4_CONTENT_CAPTURE_IMPORTANCE_MASK; mCachedContentCaptureSession = null; if ((mPrivateFlags & (PFLAG_DRAWN | PFLAG_HAS_BOUNDS)) == (PFLAG_DRAWN | PFLAG_HAS_BOUNDS) @@ -19609,6 +20128,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, needGlobalAttributesUpdate(false); notifyEnterOrExitForAutoFillIfNeeded(true); + notifyAppearedOrDisappearedForContentCaptureIfNeeded(true); } @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) @@ -19658,6 +20178,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } notifyEnterOrExitForAutoFillIfNeeded(false); + notifyAppearedOrDisappearedForContentCaptureIfNeeded(false); } /** @@ -21992,6 +22513,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mPrivateFlags3 &= ~PFLAG3_NOTIFY_AUTOFILL_ENTER_ON_LAYOUT; notifyEnterOrExitForAutoFillIfNeeded(true); } + + notifyAppearedOrDisappearedForContentCaptureIfNeeded(true); } private boolean hasParentWantsFocus() { @@ -28057,6 +28580,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, boolean mHandlingPointerEvent; /** + * The offset of this view's window when it's on an embedded display that is re-parented + * to another window. + */ + final Point mLocationInParentDisplay = new Point(); + + /** * Global to the view hierarchy used as a temporary for dealing with * x/y points in the transparent region computations. */ @@ -28203,6 +28732,23 @@ public class View implements Drawable.Callback, KeyEvent.Callback, View mTooltipHost; /** + * The initial structure has been reported so the view is ready to report updates. + */ + boolean mReadyForContentCaptureUpdates; + + /** + * Map(keyed by session) of content capture events that need to be notified after the view + * hierarchy is traversed: value is either the view itself for appearead events, or its + * autofill id for disappeared. + */ + SparseArray<ArrayList<Object>> mContentCaptureEvents; + + /** + * Cached reference to the {@link ContentCaptureManager}. + */ + ContentCaptureManager mContentCaptureManager; + + /** * Creates a new set of attachment information with the specified * events handler and thread. * @@ -28220,6 +28766,31 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mRootCallbacks = effectPlayer; mTreeObserver = new ViewTreeObserver(context); } + + private void delayNotifyContentCaptureEvent(@NonNull ContentCaptureSession session, + @NonNull View view, boolean appeared) { + if (mContentCaptureEvents == null) { + // Most of the time there will be just one session, so intial capacity is 1 + mContentCaptureEvents = new SparseArray<>(1); + } + int sessionId = session.getId(); + // TODO: life would be much easier if we provided a MultiMap implementation somwhere... + ArrayList<Object> events = mContentCaptureEvents.get(sessionId); + if (events == null) { + events = new ArrayList<>(); + mContentCaptureEvents.put(sessionId, events); + } + events.add(appeared ? view : view.getAutofillId()); + } + + @Nullable + ContentCaptureManager getContentCaptureManager(@NonNull Context context) { + if (mContentCaptureManager != null) { + return mContentCaptureManager; + } + mContentCaptureManager = context.getSystemService(ContentCaptureManager.class); + return mContentCaptureManager; + } } /** diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index d362024ed525..937bd1b34e61 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -3606,7 +3606,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager return; } - final ChildListForAutofill children = getChildrenForAutofill(flags); + final ChildListForAutoFillOrContentCapture children = getChildrenForAutofill(flags); final int childrenCount = children.size(); structure.setChildCount(childrenCount); for (int i = 0; i < childrenCount; i++) { @@ -3617,14 +3617,30 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager children.recycle(); } + /** @hide */ + @Override + public void dispatchProvideContentCaptureStructure() { + super.dispatchProvideContentCaptureStructure(); + + if (!isLaidOut()) return; + + final ChildListForAutoFillOrContentCapture children = getChildrenForContentCapture(); + final int childrenCount = children.size(); + for (int i = 0; i < childrenCount; i++) { + final View child = children.get(i); + child.dispatchProvideContentCaptureStructure(); + } + children.recycle(); + } + /** * Gets the children for autofill. Children for autofill are the first * level descendants that are important for autofill. The returned * child list object is pooled and the caller must recycle it once done. * @hide */ - private @NonNull ChildListForAutofill getChildrenForAutofill( + private @NonNull ChildListForAutoFillOrContentCapture getChildrenForAutofill( @AutofillFlags int flags) { - final ChildListForAutofill children = ChildListForAutofill + final ChildListForAutoFillOrContentCapture children = ChildListForAutoFillOrContentCapture .obtain(); populateChildrenForAutofill(children, flags); return children; @@ -3652,6 +3668,34 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } } + private @NonNull ChildListForAutoFillOrContentCapture getChildrenForContentCapture() { + final ChildListForAutoFillOrContentCapture children = ChildListForAutoFillOrContentCapture + .obtain(); + populateChildrenForContentCapture(children); + return children; + } + + /** @hide */ + private void populateChildrenForContentCapture(ArrayList<View> list) { + final int childrenCount = mChildrenCount; + if (childrenCount <= 0) { + return; + } + final ArrayList<View> preorderedList = buildOrderedChildList(); + final boolean customOrder = preorderedList == null + && isChildrenDrawingOrderEnabled(); + for (int i = 0; i < childrenCount; i++) { + final int childIndex = getAndVerifyPreorderedIndex(childrenCount, i, customOrder); + final View child = (preorderedList == null) + ? mChildren[childIndex] : preorderedList.get(childIndex); + if (child.isImportantForContentCapture()) { + list.add(child); + } else if (child instanceof ViewGroup) { + ((ViewGroup) child).populateChildrenForContentCapture(list); + } + } + } + private static View getAndVerifyPreorderedView(ArrayList<View> preorderedList, View[] children, int childIndex) { final View child; @@ -8634,16 +8678,16 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager /** * Pooled class that to hold the children for autifill. */ - private static class ChildListForAutofill extends ArrayList<View> { + private static class ChildListForAutoFillOrContentCapture extends ArrayList<View> { private static final int MAX_POOL_SIZE = 32; - private static final Pools.SimplePool<ChildListForAutofill> sPool = + private static final Pools.SimplePool<ChildListForAutoFillOrContentCapture> sPool = new Pools.SimplePool<>(MAX_POOL_SIZE); - public static ChildListForAutofill obtain() { - ChildListForAutofill list = sPool.acquire(); + public static ChildListForAutoFillOrContentCapture obtain() { + ChildListForAutoFillOrContentCapture list = sPool.acquire(); if (list == null) { - list = new ChildListForAutofill(); + list = new ChildListForAutoFillOrContentCapture(); } return list; } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index aceb276e9fc0..440df89f814f 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -105,7 +105,11 @@ import android.view.accessibility.IAccessibilityInteractionConnection; import android.view.accessibility.IAccessibilityInteractionConnectionCallback; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.Interpolator; +import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; +import android.view.contentcapture.ContentCaptureManager; +import android.view.contentcapture.ContentCaptureSession; +import android.view.contentcapture.MainContentCaptureSession; import android.view.inputmethod.InputMethodManager; import android.widget.Scroller; @@ -220,6 +224,21 @@ public final class ViewRootImpl implements ViewParent, */ static final int MAX_TRACKBALL_DELAY = 250; + /** + * Initial value for {@link #mContentCaptureEnabled}. + */ + private static final int CONTENT_CAPTURE_ENABLED_NOT_CHECKED = 0; + + /** + * Value for {@link #mContentCaptureEnabled} when it was checked and set to {@code true}. + */ + private static final int CONTENT_CAPTURE_ENABLED_TRUE = 1; + + /** + * Value for {@link #mContentCaptureEnabled} when it was checked and set to {@code false}. + */ + private static final int CONTENT_CAPTURE_ENABLED_FALSE = 2; + @UnsupportedAppUsage static final ThreadLocal<HandlerActionQueue> sRunQueues = new ThreadLocal<HandlerActionQueue>(); @@ -410,6 +429,10 @@ public final class ViewRootImpl implements ViewParent, boolean mLayoutRequested; boolean mFirst; + @Nullable + int mContentCaptureEnabled = CONTENT_CAPTURE_ENABLED_NOT_CHECKED; + boolean mPerformContentCapture; + boolean mReportNextDraw; boolean mFullRedrawNeeded; boolean mNewSurfaceNeeded; @@ -607,6 +630,7 @@ public final class ViewRootImpl implements ViewParent, mTransparentRegion = new Region(); mPreviousTransparentRegion = new Region(); mFirst = true; // true for the first time the view is added + mPerformContentCapture = true; // also true for the first time the view is added mAdded = false; mAttachInfo = new View.AttachInfo(mWindowSession, mWindow, display, this, mHandler, this, context); @@ -2765,9 +2789,55 @@ public final class ViewRootImpl implements ViewParent, } } + if (mAttachInfo.mContentCaptureEvents != null) { + notifyContentCatpureEvents(); + } + mIsInTraversal = false; } + private void notifyContentCatpureEvents() { + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "notifyContentCaptureEvents"); + try { + MainContentCaptureSession mainSession = mAttachInfo.mContentCaptureManager + .getMainContentCaptureSession(); + for (int i = 0; i < mAttachInfo.mContentCaptureEvents.size(); i++) { + int sessionId = mAttachInfo.mContentCaptureEvents.keyAt(i); + mainSession.notifyViewTreeEvent(sessionId, /* started= */ true); + ArrayList<Object> events = mAttachInfo.mContentCaptureEvents + .valueAt(i); + for_each_event: for (int j = 0; j < events.size(); j++) { + Object event = events.get(j); + if (event instanceof AutofillId) { + mainSession.notifyViewDisappeared(sessionId, (AutofillId) event); + } else if (event instanceof View) { + View view = (View) event; + ContentCaptureSession session = view.getContentCaptureSession(); + if (session == null) { + Log.w(mTag, "no content capture session on view: " + view); + continue for_each_event; + } + int actualId = session.getId(); + if (actualId != sessionId) { + Log.w(mTag, "content capture session mismatch for view (" + view + + "): was " + sessionId + " before, it's " + actualId + " now"); + continue for_each_event; + } + ViewStructure structure = session.newViewStructure(view); + view.onProvideContentCaptureStructure(structure, /* flags= */ 0); + session.notifyViewAppeared(structure); + } else { + Log.w(mTag, "invalid content capture event: " + event); + } + } + mainSession.notifyViewTreeEvent(sessionId, /* started= */ false); + } + mAttachInfo.mContentCaptureEvents = null; + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } + } + private void notifySurfaceDestroyed() { mSurfaceHolder.ungetCallbacks(); SurfaceHolder.Callback[] callbacks = mSurfaceHolder.getCallbacks(); @@ -2902,6 +2972,13 @@ public final class ViewRootImpl implements ViewParent, } } mFirstInputStage.onWindowFocusChanged(hasWindowFocus); + + // NOTE: there's no view visibility (appeared / disapparead) events when the windows focus + // is lost, so we don't need to to force a flush - there might be other events such as + // text changes, but these should be flushed independently. + if (hasWindowFocus) { + handleContentCaptureFlush(); + } } private void fireAccessibilityFocusEventIfHasFocusedNode() { @@ -3468,6 +3545,86 @@ public final class ViewRootImpl implements ViewParent, pendingDrawFinished(); } } + if (mPerformContentCapture) { + performContentCaptureInitialReport(); + } + } + + /** + * Checks (and caches) if content capture is enabled for this context. + */ + private boolean isContentCaptureEnabled() { + switch (mContentCaptureEnabled) { + case CONTENT_CAPTURE_ENABLED_TRUE: + return true; + case CONTENT_CAPTURE_ENABLED_FALSE: + return false; + case CONTENT_CAPTURE_ENABLED_NOT_CHECKED: + final boolean reallyEnabled = isContentCaptureReallyEnabled(); + mContentCaptureEnabled = reallyEnabled ? CONTENT_CAPTURE_ENABLED_TRUE + : CONTENT_CAPTURE_ENABLED_FALSE; + return reallyEnabled; + default: + Log.w(TAG, "isContentCaptureEnabled(): invalid state " + mContentCaptureEnabled); + return false; + } + + } + + /** + * Checks (without caching) if content capture is enabled for this context. + */ + private boolean isContentCaptureReallyEnabled() { + // First check if context supports it, so it saves a service lookup when it doesn't + if (mContext.getContentCaptureOptions() == null) return false; + + final ContentCaptureManager ccm = mAttachInfo.getContentCaptureManager(mContext); + // Then check if it's enabled in the contex itself. + if (ccm == null || !ccm.isContentCaptureEnabled()) return false; + + return true; + } + + private void performContentCaptureInitialReport() { + mPerformContentCapture = false; // One-time offer! + final View rootView = mView; + if (DEBUG_CONTENT_CAPTURE) { + Log.v(mTag, "performContentCaptureInitialReport() on " + rootView); + } + if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "dispatchContentCapture() for " + + getClass().getSimpleName()); + } + try { + if (!isContentCaptureEnabled()) return; + + // Content capture is a go! + rootView.dispatchInitialProvideContentCaptureStructure(); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } + } + + private void handleContentCaptureFlush() { + if (DEBUG_CONTENT_CAPTURE) { + Log.v(mTag, "handleContentCaptureFlush()"); + } + if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "flushContentCapture for " + + getClass().getSimpleName()); + } + try { + if (!isContentCaptureEnabled()) return; + + final ContentCaptureManager ccm = mAttachInfo.mContentCaptureManager; + if (ccm == null) { + Log.w(TAG, "No ContentCapture on AttachInfo"); + return; + } + ccm.flush(ContentCaptureSession.FLUSH_REASON_VIEW_ROOT_ENTERED); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } } private boolean draw(boolean fullRedrawNeeded) { @@ -3834,6 +3991,13 @@ public final class ViewRootImpl implements ViewParent, } } + void updateLocationInParentDisplay(int x, int y) { + if (mAttachInfo != null + && !mAttachInfo.mLocationInParentDisplay.equals(x, y)) { + mAttachInfo.mLocationInParentDisplay.set(x, y); + } + } + /** * Set the root-level system gesture exclusion rects. These are added to those provided by * the root's view hierarchy. @@ -4338,6 +4502,7 @@ public final class ViewRootImpl implements ViewParent, private static final int MSG_INSETS_CHANGED = 30; private static final int MSG_INSETS_CONTROL_CHANGED = 31; private static final int MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED = 32; + private static final int MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED = 33; final class ViewRootHandler extends Handler { @Override @@ -4399,6 +4564,8 @@ public final class ViewRootImpl implements ViewParent, return "MSG_INSETS_CONTROL_CHANGED"; case MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED: return "MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED"; + case MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED: + return "MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED"; } return super.getMessageName(message); } @@ -4634,6 +4801,9 @@ public final class ViewRootImpl implements ViewParent, case MSG_SYSTEM_GESTURE_EXCLUSION_CHANGED: { systemGestureExclusionChanged(); } break; + case MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED: { + updateLocationInParentDisplay(msg.arg1, msg.arg2); + } break; } } } @@ -7840,6 +8010,17 @@ public final class ViewRootImpl implements ViewParent, mHandler.sendMessage(msg); } + /** + * Dispatch the offset changed. + * + * @param offset the offset of this view in the parent window. + */ + public void dispatchLocationInParentDisplayChanged(Point offset) { + Message msg = + mHandler.obtainMessage(MSG_LOCATION_IN_PARENT_DISPLAY_CHANGED, offset.x, offset.y); + mHandler.sendMessage(msg); + } + public void windowFocusChanged(boolean hasFocus, boolean inTouchMode) { synchronized (this) { mWindowFocusChanged = true; @@ -8367,6 +8548,14 @@ public final class ViewRootImpl implements ViewParent, } @Override + public void locationInParentDisplayChanged(Point offset) { + final ViewRootImpl viewAncestor = mViewAncestor.get(); + if (viewAncestor != null) { + viewAncestor.dispatchLocationInParentDisplayChanged(offset); + } + } + + @Override public void insetsChanged(InsetsState insetsState) { final ViewRootImpl viewAncestor = mViewAncestor.get(); if (viewAncestor != null) { diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index a25f2eede905..2e5a7501f898 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -261,6 +261,13 @@ public interface WindowManager extends ViewManager { int TRANSIT_TASK_CHANGE_WINDOWING_MODE = 27; /** + * A display which can only contain one task is being shown because the first activity is + * started or it's being turned on. + * @hide + */ + int TRANSIT_SHOW_SINGLE_TASK_DISPLAY = 28; + + /** * @hide */ @IntDef(prefix = { "TRANSIT_" }, value = { @@ -287,7 +294,8 @@ public interface WindowManager extends ViewManager { TRANSIT_TRANSLUCENT_ACTIVITY_OPEN, TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE, TRANSIT_CRASHING_ACTIVITY_CLOSE, - TRANSIT_TASK_CHANGE_WINDOWING_MODE + TRANSIT_TASK_CHANGE_WINDOWING_MODE, + TRANSIT_SHOW_SINGLE_TASK_DISPLAY }) @Retention(RetentionPolicy.SOURCE) @interface TransitionType {} @@ -311,6 +319,12 @@ public interface WindowManager extends ViewManager { int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER = 0x4; /** + * Transition flag: Keyguard is going away with subtle animation. + * @hide + */ + int TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION = 0x8; + + /** * @hide */ @IntDef(flag = true, prefix = { "TRANSIT_FLAG_" }, value = { diff --git a/core/java/android/view/WindowManagerPolicyConstants.java b/core/java/android/view/WindowManagerPolicyConstants.java index 46a59f09eca7..a22f5a576ab6 100644 --- a/core/java/android/view/WindowManagerPolicyConstants.java +++ b/core/java/android/view/WindowManagerPolicyConstants.java @@ -38,10 +38,11 @@ public interface WindowManagerPolicyConstants { int FLAG_INTERACTIVE = 0x20000000; int FLAG_PASS_TO_USER = 0x40000000; - // Flags for IActivityManager.keyguardGoingAway() + // Flags for IActivityTaskManager.keyguardGoingAway() int KEYGUARD_GOING_AWAY_FLAG_TO_SHADE = 1 << 0; int KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS = 1 << 1; int KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER = 1 << 2; + int KEYGUARD_GOING_AWAY_FLAG_SUBTLE_WINDOW_ANIMATIONS = 1 << 3; // Flags used for indicating whether the internal and/or external input devices // of some type are available. diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java index c5a5f7360321..cee79439d1b3 100644 --- a/core/java/android/view/contentcapture/MainContentCaptureSession.java +++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java @@ -428,14 +428,16 @@ public final class MainContentCaptureSession extends ContentCaptureSession { } final int flushFrequencyMs; - if (reason == FLUSH_REASON_IDLE_TIMEOUT) { - flushFrequencyMs = mManager.mOptions.idleFlushingFrequencyMs; - } else if (reason == FLUSH_REASON_TEXT_CHANGE_TIMEOUT) { + if (reason == FLUSH_REASON_TEXT_CHANGE_TIMEOUT) { flushFrequencyMs = mManager.mOptions.textChangeFlushingFrequencyMs; } else { - Log.e(TAG, "handleScheduleFlush(" + getDebugState(reason) + "): not called with a " - + "timeout reason."); - return; + if (reason != FLUSH_REASON_IDLE_TIMEOUT) { + if (sDebug) { + Log.d(TAG, "handleScheduleFlush(" + getDebugState(reason) + "): not a timeout " + + "reason because mDirectServiceInterface is not ready yet"); + } + } + flushFrequencyMs = mManager.mOptions.idleFlushingFrequencyMs; } mNextFlush = System.currentTimeMillis() + flushFrequencyMs; diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 14be73dec41c..87963636a003 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -413,6 +413,9 @@ public class WebView extends AbsoluteLayout if (getImportantForAutofill() == IMPORTANT_FOR_AUTOFILL_AUTO) { setImportantForAutofill(IMPORTANT_FOR_AUTOFILL_YES); } + if (getImportantForContentCapture() == IMPORTANT_FOR_CONTENT_CAPTURE_AUTO) { + setImportantForContentCapture(IMPORTANT_FOR_CONTENT_CAPTURE_YES); + } if (context == null) { throw new IllegalArgumentException("Invalid context argument"); @@ -2803,6 +2806,12 @@ public class WebView extends AbsoluteLayout mProvider.getViewDelegate().onProvideAutofillVirtualStructure(structure, flags); } + /** @hide */ + @Override + public void onProvideContentCaptureStructure(ViewStructure structure, int flags) { + mProvider.getViewDelegate().onProvideContentCaptureStructure(structure, flags); + } + @Override public void autofill(SparseArray<AutofillValue>values) { mProvider.getViewDelegate().autofill(values); diff --git a/core/java/android/widget/AdapterView.java b/core/java/android/widget/AdapterView.java index c3bb9a0201d0..c55f7d654548 100644 --- a/core/java/android/widget/AdapterView.java +++ b/core/java/android/widget/AdapterView.java @@ -1318,7 +1318,8 @@ public abstract class AdapterView<T extends Adapter> extends ViewGroup { @ViewStructureType int viewFor, int flags) { super.onProvideStructure(structure, viewFor, flags); - if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) { + if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL + || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { final Adapter adapter = getAdapter(); if (adapter == null) return; diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 62598fce5947..0918c5fdefa8 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -162,6 +162,8 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.AnimationUtils; import android.view.autofill.AutofillManager; import android.view.autofill.AutofillValue; +import android.view.contentcapture.ContentCaptureManager; +import android.view.contentcapture.ContentCaptureSession; import android.view.inputmethod.BaseInputConnection; import android.view.inputmethod.CompletionInfo; import android.view.inputmethod.CorrectionInfo; @@ -977,6 +979,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (getImportantForAutofill() == IMPORTANT_FOR_AUTOFILL_AUTO) { setImportantForAutofill(IMPORTANT_FOR_AUTOFILL_YES); } + if (getImportantForContentCapture() == IMPORTANT_FOR_CONTENT_CAPTURE_AUTO) { + setImportantForContentCapture(IMPORTANT_FOR_CONTENT_CAPTURE_YES); + } setTextInternal(""); @@ -10558,7 +10563,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } /** - * Notify managers (such as {@link AutofillManager}) that are interested in text changes. + * Notify managers (such as {@link AutofillManager} and {@link ContentCaptureManager}) that are + * interested on text changes. */ private void notifyListeningManagersAfterTextChanged() { @@ -10574,6 +10580,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener afm.notifyValueChanged(TextView.this); } } + + // TODO(b/121045053): should use a flag / boolean to keep status of SHOWN / HIDDEN instead + // of using isLaidout(), so it's not called in cases where it's laid out but a + // notifyAppeared was not sent. + + // ContentCapture + if (isLaidOut() && isImportantForContentCapture() && getNotifiedContentCaptureAppeared()) { + final ContentCaptureManager cm = mContext.getSystemService(ContentCaptureManager.class); + if (cm != null && cm.isContentCaptureEnabled()) { + final ContentCaptureSession session = getContentCaptureSession(); + if (session != null) { + // TODO(b/111276913): pass flags when edited by user / add CTS test + session.notifyViewTextChanged(getAutofillId(), getText()); + } + } + } } private boolean isAutofillable() { @@ -11417,7 +11439,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final boolean isPassword = hasPasswordTransformationMethod() || isPasswordInputType(getInputType()); - if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) { + if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL + || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) { structure.setDataIsSensitive(!mTextSetFromXmlOrResourceId); } @@ -11433,8 +11456,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } - if (!isPassword || viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) { + if (!isPassword || viewFor == VIEW_STRUCTURE_FOR_AUTOFILL + || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { if (mLayout == null) { + if (viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { + Log.w(LOG_TAG, "onProvideContentCaptureStructure(): calling assumeLayout()"); + } assumeLayout(); } Layout layout = mLayout; @@ -11522,7 +11549,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } - if (viewFor == VIEW_STRUCTURE_FOR_ASSIST) { + if (viewFor == VIEW_STRUCTURE_FOR_ASSIST + || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { // Extract style information that applies to the TextView as a whole. int style = 0; int typefaceStyle = getTypefaceStyle(); @@ -11550,7 +11578,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener structure.setTextStyle(getTextSize(), getCurrentTextColor(), AssistStructure.ViewNode.TEXT_COLOR_UNDEFINED /* bgColor */, style); } - if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) { + if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL + || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) { structure.setMinTextEms(getMinEms()); structure.setMaxTextEms(getMaxEms()); int maxLength = -1; diff --git a/core/java/com/android/internal/colorextraction/ColorExtractor.java b/core/java/com/android/internal/colorextraction/ColorExtractor.java index b27c11b524e5..3003ce80cbc1 100644 --- a/core/java/com/android/internal/colorextraction/ColorExtractor.java +++ b/core/java/com/android/internal/colorextraction/ColorExtractor.java @@ -73,13 +73,8 @@ public class ColorExtractor implements WallpaperManager.OnColorsChangedListener } mOnColorsChangedListeners = new ArrayList<>(); - - if (wallpaperManager == null) { - Log.w(TAG, "Can't listen to color changes!"); - } else { - wallpaperManager.addOnColorsChangedListener(this, null /* handler */); - initExtractColors(wallpaperManager, immediately); - } + wallpaperManager.addOnColorsChangedListener(this, null /* handler */); + initExtractColors(wallpaperManager, immediately); } private void initExtractColors(WallpaperManager wallpaperManager, boolean immediately) { diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 8dc47a401580..40ee511b0727 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -106,7 +106,7 @@ public final class SystemUiDeviceConfigFlags { */ public static final String HASH_SALT_MAX_DAYS = "hash_salt_max_days"; - // Flags related to Assistant Handles + // Flags related to Assistant /** * (String) Which behavior mode for the Assistant Handles to use. @@ -177,11 +177,48 @@ public final class SystemUiDeviceConfigFlags { "assist_handles_suppress_on_apps"; /** + * Allow touch passthrough above assist area during a session. + */ + public static final String ASSIST_TAP_PASSTHROUGH = "assist_tap_passthrough"; + + /** * (bool) Whether to show handles when taught. */ public static final String ASSIST_HANDLES_SHOW_WHEN_TAUGHT = "assist_handles_show_when_taught"; /** + * (long) Duration per pixel, in milliseconds, of scrolling text at fast speed. + */ + public static final String ASSIST_TRANSCRIPTION_DURATION_PER_PX_FAST = + "assist_transcription_duration_per_px_fast"; + + /** + * (long) Duration per pixel, in milliseconds, of scrolling text at regular speed. + */ + public static final String ASSIST_TRANSCRIPTION_DURATION_PER_PX_REGULAR = + "assist_transcription_duration_per_px_regular"; + + /** + * (long) Duration, in milliseconds, over which text fades in. + */ + public static final String ASSIST_TRANSCRIPTION_FADE_IN_DURATION = + "assist_transcription_fade_in_duration"; + + /** + * (long) Maximum total duration, in milliseconds, for a given transcription. + */ + public static final String ASSIST_TRANSCRIPTION_MAX_DURATION = + "assist_transcription_max_duration"; + + /** + * (long) Minimum total duration, in milliseconds, for a given transcription. + */ + public static final String ASSIST_TRANSCRIPTION_MIN_DURATION = + "assist_transcription_min_duration"; + + // Flags related to brightline falsing + + /** * (bool) Whether to use the new BrightLineFalsingManager. */ public static final String BRIGHTLINE_FALSING_MANAGER_ENABLED = @@ -270,5 +307,6 @@ public final class SystemUiDeviceConfigFlags { "brightline_falsing_zigzag_y_secondary_deviance"; - private SystemUiDeviceConfigFlags() { } + private SystemUiDeviceConfigFlags() { + } } diff --git a/core/java/com/android/internal/net/VpnInfo.java b/core/java/com/android/internal/net/VpnInfo.java index b1a412871bd2..e74af5eb50de 100644 --- a/core/java/com/android/internal/net/VpnInfo.java +++ b/core/java/com/android/internal/net/VpnInfo.java @@ -19,6 +19,8 @@ package com.android.internal.net; import android.os.Parcel; import android.os.Parcelable; +import java.util.Arrays; + /** * A lightweight container used to carry information of the ongoing VPN. * Internal use only.. @@ -28,14 +30,14 @@ import android.os.Parcelable; public class VpnInfo implements Parcelable { public int ownerUid; public String vpnIface; - public String primaryUnderlyingIface; + public String[] underlyingIfaces; @Override public String toString() { return "VpnInfo{" + "ownerUid=" + ownerUid + ", vpnIface='" + vpnIface + '\'' - + ", primaryUnderlyingIface='" + primaryUnderlyingIface + '\'' + + ", underlyingIfaces='" + Arrays.toString(underlyingIfaces) + '\'' + '}'; } @@ -48,7 +50,7 @@ public class VpnInfo implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeInt(ownerUid); dest.writeString(vpnIface); - dest.writeString(primaryUnderlyingIface); + dest.writeStringArray(underlyingIfaces); } public static final Parcelable.Creator<VpnInfo> CREATOR = new Parcelable.Creator<VpnInfo>() { @@ -57,7 +59,7 @@ public class VpnInfo implements Parcelable { VpnInfo info = new VpnInfo(); info.ownerUid = source.readInt(); info.vpnIface = source.readString(); - info.primaryUnderlyingIface = source.readString(); + info.underlyingIfaces = source.readStringArray(); return info; } diff --git a/core/java/com/android/internal/policy/ScreenDecorationsUtils.java b/core/java/com/android/internal/policy/ScreenDecorationsUtils.java index adf7692adc56..52172cf04362 100644 --- a/core/java/com/android/internal/policy/ScreenDecorationsUtils.java +++ b/core/java/com/android/internal/policy/ScreenDecorationsUtils.java @@ -36,13 +36,16 @@ public class ScreenDecorationsUtils { } // Radius that should be used in case top or bottom aren't defined. - float defaultRadius = resources.getDimension(R.dimen.rounded_corner_radius); + float defaultRadius = resources.getDimension(R.dimen.rounded_corner_radius) + - resources.getDimension(R.dimen.rounded_corner_radius_adjustment); - float topRadius = resources.getDimension(R.dimen.rounded_corner_radius_top); + float topRadius = resources.getDimension(R.dimen.rounded_corner_radius_top) + - resources.getDimension(R.dimen.rounded_corner_radius_top_adjustment); if (topRadius == 0f) { topRadius = defaultRadius; } - float bottomRadius = resources.getDimension(R.dimen.rounded_corner_radius_bottom); + float bottomRadius = resources.getDimension(R.dimen.rounded_corner_radius_bottom) + - resources.getDimension(R.dimen.rounded_corner_radius_bottom_adjustment); if (bottomRadius == 0f) { bottomRadius = defaultRadius; } diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java index fb9ff15c79ac..f9cdf3d0be61 100644 --- a/core/java/com/android/internal/view/BaseIWindow.java +++ b/core/java/com/android/internal/view/BaseIWindow.java @@ -16,6 +16,7 @@ package com.android.internal.view; +import android.graphics.Point; import android.graphics.Rect; import android.hardware.input.InputManager; import android.os.Bundle; @@ -55,6 +56,10 @@ public class BaseIWindow extends IWindow.Stub { } @Override + public void locationInParentDisplayChanged(Point offset) { + } + + @Override public void insetsChanged(InsetsState insetsState) { } diff --git a/core/java/com/android/internal/widget/LockPatternView.java b/core/java/com/android/internal/widget/LockPatternView.java index 22182677babe..3f6c4d4f5634 100644 --- a/core/java/com/android/internal/widget/LockPatternView.java +++ b/core/java/com/android/internal/widget/LockPatternView.java @@ -627,6 +627,13 @@ public class LockPatternView extends View { } /** + * If there are any cells being drawn. + */ + public boolean isEmpty() { + return mPattern.isEmpty(); + } + + /** * Clear the pattern lookup table. Also reset the line fade start times for * the next attempt. */ diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 14dbabb1ce02..c3e7a36bef78 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -575,7 +575,7 @@ static void android_os_Debug_getMemInfo(JNIEnv *env, jobject clazz, jlongArray o if (outArray != NULL) { outLen = MEMINFO_COUNT; for (int i = 0; i < outLen; i++) { - if (i == MEMINFO_VMALLOC_USED) { + if (i == MEMINFO_VMALLOC_USED && mem[i] == 0) { outArray[i] = smi.ReadVmallocInfo() / 1024; continue; } diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp index 8d702d11d8fe..ba538a855f81 100644 --- a/core/jni/android_view_DisplayEventReceiver.cpp +++ b/core/jni/android_view_DisplayEventReceiver.cpp @@ -48,7 +48,8 @@ static struct { class NativeDisplayEventReceiver : public DisplayEventDispatcher { public: NativeDisplayEventReceiver(JNIEnv* env, - jobject receiverWeak, const sp<MessageQueue>& messageQueue, jint vsyncSource); + jobject receiverWeak, const sp<MessageQueue>& messageQueue, jint vsyncSource, + jint configChanged); void dispose(); @@ -68,9 +69,11 @@ private: NativeDisplayEventReceiver::NativeDisplayEventReceiver(JNIEnv* env, - jobject receiverWeak, const sp<MessageQueue>& messageQueue, jint vsyncSource) : + jobject receiverWeak, const sp<MessageQueue>& messageQueue, jint vsyncSource, + jint configChanged) : DisplayEventDispatcher(messageQueue->getLooper(), - static_cast<ISurfaceComposer::VsyncSource>(vsyncSource)), + static_cast<ISurfaceComposer::VsyncSource>(vsyncSource), + static_cast<ISurfaceComposer::ConfigChanged>(configChanged)), mReceiverWeakGlobal(env->NewGlobalRef(receiverWeak)), mMessageQueue(messageQueue) { ALOGV("receiver %p ~ Initializing display event receiver.", this); @@ -136,7 +139,7 @@ void NativeDisplayEventReceiver::dispatchConfigChanged(nsecs_t timestamp, static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, - jobject messageQueueObj, jint vsyncSource) { + jobject messageQueueObj, jint vsyncSource, jint configChanged) { sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj); if (messageQueue == NULL) { jniThrowRuntimeException(env, "MessageQueue is not initialized."); @@ -144,7 +147,7 @@ static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, } sp<NativeDisplayEventReceiver> receiver = new NativeDisplayEventReceiver(env, - receiverWeak, messageQueue, vsyncSource); + receiverWeak, messageQueue, vsyncSource, configChanged); status_t status = receiver->initialize(); if (status) { String8 message; @@ -179,7 +182,7 @@ static void nativeScheduleVsync(JNIEnv* env, jclass clazz, jlong receiverPtr) { static const JNINativeMethod gMethods[] = { /* name, signature, funcPtr */ { "nativeInit", - "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;I)J", + "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;II)J", (void*)nativeInit }, { "nativeDispose", "(J)V", diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index ccadc7d7c22a..ff14a2acc4d7 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -75,6 +75,24 @@ static struct { jfieldID bottom; } gRectClassInfo; +class JNamedColorSpace { +public: + // ColorSpace.Named.SRGB.ordinal() = 0; + static constexpr jint SRGB = 0; + + // ColorSpace.Named.DISPLAY_P3.ordinal() = 7; + static constexpr jint DISPLAY_P3 = 7; +}; + +constexpr ui::Dataspace fromNamedColorSpaceValueToDataspace(const jint colorSpace) { + switch (colorSpace) { + case JNamedColorSpace::DISPLAY_P3: + return ui::Dataspace::DISPLAY_P3; + default: + return ui::Dataspace::V0_SRGB; + } +} + // ---------------------------------------------------------------------------- // this is just a pointer we use to pass to inc/decStrong @@ -425,11 +443,12 @@ static jint nativeForceScopedDisconnect(JNIEnv *env, jclass clazz, jlong nativeO return surface->disconnect(-1, IGraphicBufferProducer::DisconnectMode::AllLocal); } -static jint nativeAttachAndQueueBuffer(JNIEnv *env, jclass clazz, jlong nativeObject, - jobject graphicBuffer) { +static jint nativeAttachAndQueueBufferWithColorSpace(JNIEnv *env, jclass clazz, jlong nativeObject, + jobject graphicBuffer, jint colorSpaceId) { Surface* surface = reinterpret_cast<Surface*>(nativeObject); sp<GraphicBuffer> bp = graphicBufferForJavaObject(env, graphicBuffer); - int err = Surface::attachAndQueueBuffer(surface, bp); + int err = Surface::attachAndQueueBufferWithDataspace(surface, bp, + fromNamedColorSpaceValueToDataspace(colorSpaceId)); return err; } @@ -531,7 +550,8 @@ static const JNINativeMethod gSurfaceMethods[] = { {"nativeGetNextFrameNumber", "(J)J", (void*)nativeGetNextFrameNumber }, {"nativeSetScalingMode", "(JI)I", (void*)nativeSetScalingMode }, {"nativeForceScopedDisconnect", "(J)I", (void*)nativeForceScopedDisconnect}, - {"nativeAttachAndQueueBuffer", "(JLandroid/graphics/GraphicBuffer;)I", (void*)nativeAttachAndQueueBuffer}, + {"nativeAttachAndQueueBufferWithColorSpace", "(JLandroid/graphics/GraphicBuffer;I)I", + (void*)nativeAttachAndQueueBufferWithColorSpace}, {"nativeSetSharedBufferModeEnabled", "(JZ)I", (void*)nativeSetSharedBufferModeEnabled}, {"nativeSetAutoRefreshEnabled", "(JZ)I", (void*)nativeSetAutoRefreshEnabled}, diff --git a/core/proto/android/providers/settings/secure.proto b/core/proto/android/providers/settings/secure.proto index fed2efaf8a78..61799eefdca6 100644 --- a/core/proto/android/providers/settings/secure.proto +++ b/core/proto/android/providers/settings/secure.proto @@ -198,11 +198,19 @@ message SecureSettingsProto { optional SettingProto silence_alarms_count = 2 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto silence_calls_count = 3 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto silence_enabled = 4 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto silence_notification_count = 5 [ (android.privacy).dest = DEST_AUTOMATIC ]; + // del: silence_notification_count = 5 optional SettingProto silence_timer_count = 6 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto skip_count = 7 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto skip_enabled = 8 [ (android.privacy).dest = DEST_AUTOMATIC ]; + + optional SettingProto silence_alarms_touch_count = 9 [ (android.privacy).dest = + DEST_AUTOMATIC ]; + optional SettingProto silence_calls_touch_count = 10 [ (android.privacy).dest = + DEST_AUTOMATIC ]; + optional SettingProto silence_timer_touch_count = 11 [ (android.privacy).dest = + DEST_AUTOMATIC ]; + optional SettingProto skip_touch_count = 12 [ (android.privacy).dest = DEST_AUTOMATIC ]; } optional Gesture gesture = 74; diff --git a/core/proto/android/stats/dnsresolver/dns_resolver.proto b/core/proto/android/stats/dnsresolver/dns_resolver.proto index af6fea017bef..9eaabfbca463 100644 --- a/core/proto/android/stats/dnsresolver/dns_resolver.proto +++ b/core/proto/android/stats/dnsresolver/dns_resolver.proto @@ -1,214 +1,217 @@ -/*
- * Copyright (C) 2019 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.
- */
-syntax = "proto2";
-package android.stats.dnsresolver;
-
-enum EventType {
- EVENT_UNKNOWN = 0;
- EVENT_GETADDRINFO = 1;
- EVENT_GETHOSTBYNAME = 2;
- EVENT_GETHOSTBYADDR = 3;
- EVENT_RES_NSEND = 4;
-}
-
-// The return value of the DNS resolver for each DNS lookups.
-// bionic/libc/include/netdb.h
-// system/netd/resolv/include/netd_resolv/resolv.h
-enum ReturnCode {
- RC_EAI_NO_ERROR = 0;
- RC_EAI_ADDRFAMILY = 1;
- RC_EAI_AGAIN = 2;
- RC_EAI_BADFLAGS = 3;
- RC_EAI_FAIL = 4;
- RC_EAI_FAMILY = 5;
- RC_EAI_MEMORY = 6;
- RC_EAI_NODATA = 7;
- RC_EAI_NONAME = 8;
- RC_EAI_SERVICE = 9;
- RC_EAI_SOCKTYPE = 10;
- RC_EAI_SYSTEM = 11;
- RC_EAI_BADHINTS = 12;
- RC_EAI_PROTOCOL = 13;
- RC_EAI_OVERFLOW = 14;
- RC_RESOLV_TIMEOUT = 255;
- RC_EAI_MAX = 256;
-}
-
-enum NsRcode {
- NS_R_NO_ERROR = 0; // No error occurred.
- NS_R_FORMERR = 1; // Format error.
- NS_R_SERVFAIL = 2; // Server failure.
- NS_R_NXDOMAIN = 3; // Name error.
- NS_R_NOTIMPL = 4; // Unimplemented.
- NS_R_REFUSED = 5; // Operation refused.
- // these are for BIND_UPDATE
- NS_R_YXDOMAIN = 6; // Name exists
- NS_R_YXRRSET = 7; // RRset exists
- NS_R_NXRRSET = 8; // RRset does not exist
- NS_R_NOTAUTH = 9; // Not authoritative for zone
- NS_R_NOTZONE = 10; // Zone of record different from zone section
- NS_R_MAX = 11;
- // The following are EDNS extended rcodes
- NS_R_BADVERS = 16;
- // The following are TSIG errors
- // NS_R_BADSIG = 16,
- NS_R_BADKEY = 17;
- NS_R_BADTIME = 18;
-}
-
-// Currently defined type values for resources and queries.
-enum NsType {
- NS_T_INVALID = 0; // Cookie.
- NS_T_A = 1; // Host address.
- NS_T_NS = 2; // Authoritative server.
- NS_T_MD = 3; // Mail destination.
- NS_T_MF = 4; // Mail forwarder.
- NS_T_CNAME = 5; // Canonical name.
- NS_T_SOA = 6; // Start of authority zone.
- NS_T_MB = 7; // Mailbox domain name.
- NS_T_MG = 8; // Mail group member.
- NS_T_MR = 9; // Mail rename name.
- NS_T_NULL = 10; // Null resource record.
- NS_T_WKS = 11; // Well known service.
- NS_T_PTR = 12; // Domain name pointer.
- NS_T_HINFO = 13; // Host information.
- NS_T_MINFO = 14; // Mailbox information.
- NS_T_MX = 15; // Mail routing information.
- NS_T_TXT = 16; // Text strings.
- NS_T_RP = 17; // Responsible person.
- NS_T_AFSDB = 18; // AFS cell database.
- NS_T_X25 = 19; // X_25 calling address.
- NS_T_ISDN = 20; // ISDN calling address.
- NS_T_RT = 21; // Router.
- NS_T_NSAP = 22; // NSAP address.
- NS_T_NSAP_PTR = 23; // Reverse NSAP lookup (deprecated).
- NS_T_SIG = 24; // Security signature.
- NS_T_KEY = 25; // Security key.
- NS_T_PX = 26; // X.400 mail mapping.
- NS_T_GPOS = 27; // Geographical position (withdrawn).
- NS_T_AAAA = 28; // IPv6 Address.
- NS_T_LOC = 29; // Location Information.
- NS_T_NXT = 30; // Next domain (security).
- NS_T_EID = 31; // Endpoint identifier.
- NS_T_NIMLOC = 32; // Nimrod Locator.
- NS_T_SRV = 33; // Server Selection.
- NS_T_ATMA = 34; // ATM Address
- NS_T_NAPTR = 35; // Naming Authority PoinTeR
- NS_T_KX = 36; // Key Exchange
- NS_T_CERT = 37; // Certification record
- NS_T_A6 = 38; // IPv6 address (experimental)
- NS_T_DNAME = 39; // Non-terminal DNAME
- NS_T_SINK = 40; // Kitchen sink (experimentatl)
- NS_T_OPT = 41; // EDNS0 option (meta-RR)
- NS_T_APL = 42; // Address prefix list (RFC 3123)
- NS_T_DS = 43; // Delegation Signer
- NS_T_SSHFP = 44; // SSH Fingerprint
- NS_T_IPSECKEY = 45; // IPSEC Key
- NS_T_RRSIG = 46; // RRset Signature
- NS_T_NSEC = 47; // Negative security
- NS_T_DNSKEY = 48; // DNS Key
- NS_T_DHCID = 49; // Dynamic host configuratin identifier
- NS_T_NSEC3 = 50; // Negative security type 3
- NS_T_NSEC3PARAM = 51; // Negative security type 3 parameters
- NS_T_HIP = 55; // Host Identity Protocol
- NS_T_SPF = 99; // Sender Policy Framework
- NS_T_TKEY = 249; // Transaction key
- NS_T_TSIG = 250; // Transaction signature.
- NS_T_IXFR = 251; // Incremental zone transfer.
- NS_T_AXFR = 252; // Transfer zone of authority.
- NS_T_MAILB = 253; // Transfer mailbox records.
- NS_T_MAILA = 254; // Transfer mail agent records.
- NS_T_ANY = 255; // Wildcard match.
- NS_T_ZXFR = 256; // BIND-specific, nonstandard.
- NS_T_DLV = 32769; // DNSSEC look-aside validatation.
- NS_T_MAX = 65536;
-}
-
-enum IpVersion {
- IV_UNKNOWN = 0;
- IV_IPV4 = 1;
- IV_IPV6 = 2;
-}
-
-enum TransportType {
- TT_UNKNOWN = 0;
- TT_UDP = 1;
- TT_TCP = 2;
- TT_DOT = 3;
-}
-
-enum PrivateDnsModes {
- PDM_UNKNOWN = 0;
- PDM_OFF = 1;
- PDM_OPPORTUNISTIC = 2;
- PDM_STRICT = 3;
-}
-
-enum Transport {
- // Indicates this network uses a Cellular transport.
- TRANSPORT_DEFAULT = 0; // TRANSPORT_CELLULAR
- // Indicates this network uses a Wi-Fi transport.
- TRANSPORT_WIFI = 1;
- // Indicates this network uses a Bluetooth transport.
- TRANSPORT_BLUETOOTH = 2;
- // Indicates this network uses an Ethernet transport.
- TRANSPORT_ETHERNET = 3;
- // Indicates this network uses a VPN transport.
- TRANSPORT_VPN = 4;
- // Indicates this network uses a Wi-Fi Aware transport.
- TRANSPORT_WIFI_AWARE = 5;
- // Indicates this network uses a LoWPAN transport.
- TRANSPORT_LOWPAN = 6;
-}
-
-enum CacheStatus{
- // the cache can't handle that kind of queries.
- // or the answer buffer is too small.
- CS_UNSUPPORTED = 0;
- // the cache doesn't know about this query.
- CS_NOTFOUND = 1;
- // the cache found the answer.
- CS_FOUND = 2;
- // Don't do anything on cache.
- CS_SKIP = 3;
-}
-
-message DnsQueryEvent {
- optional android.stats.dnsresolver.NsRcode rcode = 1;
-
- optional android.stats.dnsresolver.NsType type = 2;
-
- optional android.stats.dnsresolver.CacheStatus cache_hit = 3;
-
- optional android.stats.dnsresolver.IpVersion ip_version = 4;
-
- optional android.stats.dnsresolver.TransportType transport = 5;
-
- // Number of DNS query retry times
- optional int32 retry_times = 6;
-
- // Ordinal number of name server.
- optional int32 dns_server_count = 7;
-
- // Used only by TCP and DOT. True for new connections.
- optional bool connected = 8;
-
- optional int32 latency_micros = 9;
-}
-
-message DnsQueryEvents {
- repeated DnsQueryEvent dns_query_event = 1;
-}
+/* + * Copyright (C) 2019 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. + */ +syntax = "proto2"; +package android.stats.dnsresolver; + +enum EventType { + EVENT_UNKNOWN = 0; + EVENT_GETADDRINFO = 1; + EVENT_GETHOSTBYNAME = 2; + EVENT_GETHOSTBYADDR = 3; + EVENT_RES_NSEND = 4; +} + +// The return value of the DNS resolver for each DNS lookups. +// bionic/libc/include/netdb.h +// system/netd/resolv/include/netd_resolv/resolv.h +enum ReturnCode { + RC_EAI_NO_ERROR = 0; + RC_EAI_ADDRFAMILY = 1; + RC_EAI_AGAIN = 2; + RC_EAI_BADFLAGS = 3; + RC_EAI_FAIL = 4; + RC_EAI_FAMILY = 5; + RC_EAI_MEMORY = 6; + RC_EAI_NODATA = 7; + RC_EAI_NONAME = 8; + RC_EAI_SERVICE = 9; + RC_EAI_SOCKTYPE = 10; + RC_EAI_SYSTEM = 11; + RC_EAI_BADHINTS = 12; + RC_EAI_PROTOCOL = 13; + RC_EAI_OVERFLOW = 14; + RC_RESOLV_TIMEOUT = 255; + RC_EAI_MAX = 256; +} + +enum NsRcode { + NS_R_NO_ERROR = 0; // No error occurred. + NS_R_FORMERR = 1; // Format error. + NS_R_SERVFAIL = 2; // Server failure. + NS_R_NXDOMAIN = 3; // Name error. + NS_R_NOTIMPL = 4; // Unimplemented. + NS_R_REFUSED = 5; // Operation refused. + // these are for BIND_UPDATE + NS_R_YXDOMAIN = 6; // Name exists + NS_R_YXRRSET = 7; // RRset exists + NS_R_NXRRSET = 8; // RRset does not exist + NS_R_NOTAUTH = 9; // Not authoritative for zone + NS_R_NOTZONE = 10; // Zone of record different from zone section + NS_R_MAX = 11; + // The following are EDNS extended rcodes + NS_R_BADVERS = 16; + // The following are TSIG errors + // NS_R_BADSIG = 16, + NS_R_BADKEY = 17; + NS_R_BADTIME = 18; + NS_R_INTERNAL_ERROR = 254; + NS_R_TIMEOUT = 255; +} + +// Currently defined type values for resources and queries. +enum NsType { + NS_T_INVALID = 0; // Cookie. + NS_T_A = 1; // Host address. + NS_T_NS = 2; // Authoritative server. + NS_T_MD = 3; // Mail destination. + NS_T_MF = 4; // Mail forwarder. + NS_T_CNAME = 5; // Canonical name. + NS_T_SOA = 6; // Start of authority zone. + NS_T_MB = 7; // Mailbox domain name. + NS_T_MG = 8; // Mail group member. + NS_T_MR = 9; // Mail rename name. + NS_T_NULL = 10; // Null resource record. + NS_T_WKS = 11; // Well known service. + NS_T_PTR = 12; // Domain name pointer. + NS_T_HINFO = 13; // Host information. + NS_T_MINFO = 14; // Mailbox information. + NS_T_MX = 15; // Mail routing information. + NS_T_TXT = 16; // Text strings. + NS_T_RP = 17; // Responsible person. + NS_T_AFSDB = 18; // AFS cell database. + NS_T_X25 = 19; // X_25 calling address. + NS_T_ISDN = 20; // ISDN calling address. + NS_T_RT = 21; // Router. + NS_T_NSAP = 22; // NSAP address. + NS_T_NSAP_PTR = 23; // Reverse NSAP lookup (deprecated). + NS_T_SIG = 24; // Security signature. + NS_T_KEY = 25; // Security key. + NS_T_PX = 26; // X.400 mail mapping. + NS_T_GPOS = 27; // Geographical position (withdrawn). + NS_T_AAAA = 28; // IPv6 Address. + NS_T_LOC = 29; // Location Information. + NS_T_NXT = 30; // Next domain (security). + NS_T_EID = 31; // Endpoint identifier. + NS_T_NIMLOC = 32; // Nimrod Locator. + NS_T_SRV = 33; // Server Selection. + NS_T_ATMA = 34; // ATM Address + NS_T_NAPTR = 35; // Naming Authority PoinTeR + NS_T_KX = 36; // Key Exchange + NS_T_CERT = 37; // Certification record + NS_T_A6 = 38; // IPv6 address (experimental) + NS_T_DNAME = 39; // Non-terminal DNAME + NS_T_SINK = 40; // Kitchen sink (experimentatl) + NS_T_OPT = 41; // EDNS0 option (meta-RR) + NS_T_APL = 42; // Address prefix list (RFC 3123) + NS_T_DS = 43; // Delegation Signer + NS_T_SSHFP = 44; // SSH Fingerprint + NS_T_IPSECKEY = 45; // IPSEC Key + NS_T_RRSIG = 46; // RRset Signature + NS_T_NSEC = 47; // Negative security + NS_T_DNSKEY = 48; // DNS Key + NS_T_DHCID = 49; // Dynamic host configuratin identifier + NS_T_NSEC3 = 50; // Negative security type 3 + NS_T_NSEC3PARAM = 51; // Negative security type 3 parameters + NS_T_HIP = 55; // Host Identity Protocol + NS_T_SPF = 99; // Sender Policy Framework + NS_T_TKEY = 249; // Transaction key + NS_T_TSIG = 250; // Transaction signature. + NS_T_IXFR = 251; // Incremental zone transfer. + NS_T_AXFR = 252; // Transfer zone of authority. + NS_T_MAILB = 253; // Transfer mailbox records. + NS_T_MAILA = 254; // Transfer mail agent records. + NS_T_ANY = 255; // Wildcard match. + NS_T_ZXFR = 256; // BIND-specific, nonstandard. + NS_T_DLV = 32769; // DNSSEC look-aside validatation. + NS_T_MAX = 65536; +} + +enum IpVersion { + IV_UNKNOWN = 0; + IV_IPV4 = 1; + IV_IPV6 = 2; +} + +enum Protocol { + PROTO_UNKNOWN = 0; + PROTO_UDP = 1; + PROTO_TCP = 2; + PROTO_DOT = 3; +} + +enum PrivateDnsModes { + PDM_UNKNOWN = 0; + PDM_OFF = 1; + PDM_OPPORTUNISTIC = 2; + PDM_STRICT = 3; +} + +enum NetworkType { + NT_UNKNOWN = 0; + // Indicates this network uses a Cellular transport. + NT_CELLULAR = 1; + // Indicates this network uses a Wi-Fi transport. + NT_WIFI = 2; + // Indicates this network uses a Bluetooth transport. + NT_BLUETOOTH = 3; + // Indicates this network uses an Ethernet transport. + NT_ETHERNET = 4; + // Indicates this network uses a VPN transport. + NT_VPN = 5; + // Indicates this network uses a Wi-Fi Aware transport. + NT_WIFI_AWARE = 6; + // Indicates this network uses a LoWPAN transport. + NT_LOWPAN = 7; +} + +enum CacheStatus{ + // the cache can't handle that kind of queries. + // or the answer buffer is too small. + CS_UNSUPPORTED = 0; + // the cache doesn't know about this query. + CS_NOTFOUND = 1; + // the cache found the answer. + CS_FOUND = 2; + // Don't do anything on cache. + CS_SKIP = 3; +} + +message DnsQueryEvent { + optional android.stats.dnsresolver.NsRcode rcode = 1; + + optional android.stats.dnsresolver.NsType type = 2; + + optional android.stats.dnsresolver.CacheStatus cache_hit = 3; + + optional android.stats.dnsresolver.IpVersion ip_version = 4; + + optional android.stats.dnsresolver.Protocol protocol = 5; + + // Number of DNS query retry times + optional int32 retry_times = 6; + + // Ordinal number of name server. + optional int32 dns_server_index = 7; + + // Used only by TCP and DOT. True for new connections. + optional bool connected = 8; + + optional int32 latency_micros = 9; +} + +message DnsQueryEvents { + repeated DnsQueryEvent dns_query_event = 1; +} diff --git a/core/res/res/anim/lock_in.xml b/core/res/res/anim/lock_in.xml deleted file mode 100644 index c7014e80d33e..000000000000 --- a/core/res/res/anim/lock_in.xml +++ /dev/null @@ -1,227 +0,0 @@ -<!-- Copyright (C) 2019 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"> - <aapt:attr name="android:drawable"> - <vector android:height="42dp" android:width="32dp" android:viewportHeight="42" - android:viewportWidth="32"> - <group android:name="_R_G"> - <group android:name="_R_G_L_2_G" android:translateX="1.6669999999999998" - android:translateY="11.992999999999999" android:pivotX="14.333" - android:pivotY="13" android:scaleX="0" android:scaleY="0"> - <path android:name="_R_G_L_2_G_D_0_P_0" android:strokeColor="#ffffff" - android:strokeLineCap="round" android:strokeLineJoin="round" - android:strokeWidth="2" android:strokeAlpha="1" - android:pathData=" M22.33 21 C22.33,21 6.33,21 6.33,21 C5.6,21 5,20.4 5,19.67 C5,19.67 5,6.33 5,6.33 C5,5.6 5.6,5 6.33,5 C6.33,5 22.33,5 22.33,5 C23.07,5 23.67,5.6 23.67,6.33 C23.67,6.33 23.67,19.67 23.67,19.67 C23.67,20.4 23.07,21 22.33,21c "/> - </group> - <group android:name="_R_G_L_1_G_N_4_T_0" android:translateX="1.6669999999999998" - android:translateY="11.992999999999999" android:pivotX="14.333" - android:pivotY="13" android:scaleX="0" android:scaleY="0"> - <group android:name="_R_G_L_1_G" android:translateX="11.583" - android:translateY="10.257"> - <path android:name="_R_G_L_1_G_D_0_P_0" android:fillColor="#ffffff" - android:fillAlpha="1" android:fillType="nonZero" - android:pathData=" M2.75 0.25 C4.13,0.25 5.25,1.37 5.25,2.75 C5.25,4.13 4.13,5.25 2.75,5.25 C1.37,5.25 0.25,4.13 0.25,2.75 C0.25,1.37 1.37,0.25 2.75,0.25c "/> - </group> - </group> - <group android:name="_R_G_L_0_G_N_4_T_0" android:translateX="1.6669999999999998" - android:translateY="11.992999999999999" android:pivotX="14.333" - android:pivotY="13" android:scaleX="0" android:scaleY="0"> - <group android:name="_R_G_L_0_G_T_1" android:translateX="14.333" - android:translateY="3.172"> - <group android:name="_R_G_L_0_G" android:translateX="-9.667" - android:translateY="-9.667"> - <path android:name="_R_G_L_0_G_D_0_P_0" android:strokeColor="#ffffff" - android:strokeLineCap="round" android:strokeLineJoin="round" - android:strokeWidth="2" android:strokeAlpha="1" - android:trimPathStart="0.14" android:trimPathEnd="0.89" - android:trimPathOffset="0" - android:pathData=" M14.33 14.33 C14.33,14.33 14.33,9.67 14.33,9.67 C14.33,7.09 12.24,5 9.67,5 C7.09,5 5,7.09 5,9.67 C5,9.67 5,14.33 5,14.33 "/> - </group> - </group> - </group> - </group> - <group android:name="time_group"/> - </vector> - </aapt:attr> - <target android:name="_R_G_L_2_G"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator android:propertyName="scaleX" android:duration="233" - android:startOffset="0" android:valueFrom="0" android:valueTo="1.02" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleY" android:duration="233" - android:startOffset="0" android:valueFrom="0" android:valueTo="1.02" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleX" android:duration="117" - android:startOffset="233" android:valueFrom="1.02" - android:valueTo="1" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleY" android:duration="117" - android:startOffset="233" android:valueFrom="1.02" - android:valueTo="1" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_1_G_N_4_T_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator android:propertyName="scaleX" android:duration="233" - android:startOffset="0" android:valueFrom="0" android:valueTo="1.02" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleY" android:duration="233" - android:startOffset="0" android:valueFrom="0" android:valueTo="1.02" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleX" android:duration="117" - android:startOffset="233" android:valueFrom="1.02" - android:valueTo="1" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleY" android:duration="117" - android:startOffset="233" android:valueFrom="1.02" - android:valueTo="1" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 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="trimPathStart" android:duration="50" - android:startOffset="0" android:valueFrom="0.14" - android:valueTo="0.14" 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="trimPathStart" android:duration="67" - android:startOffset="50" android:valueFrom="0.14" - 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="trimPathEnd" android:duration="50" - android:startOffset="0" android:valueFrom="0.89" - android:valueTo="0.89" 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="trimPathEnd" android:duration="67" - android:startOffset="50" android:valueFrom="0.89" - 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_T_1"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator android:propertyName="translateY" android:duration="150" - android:startOffset="0" android:valueFrom="3.172" - android:valueTo="0.34" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.23,-0.46 0.2,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - </set> - </aapt:attr> - </target> - <target android:name="_R_G_L_0_G_N_4_T_0"> - <aapt:attr name="android:animation"> - <set android:ordering="together"> - <objectAnimator android:propertyName="scaleX" android:duration="233" - android:startOffset="0" android:valueFrom="0" android:valueTo="1.02" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleY" android:duration="233" - android:startOffset="0" android:valueFrom="0" android:valueTo="1.02" - android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.001,0 0.438,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleX" android:duration="117" - android:startOffset="233" android:valueFrom="1.02" - android:valueTo="1" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,1 1.0,1.0"/> - </aapt:attr> - </objectAnimator> - <objectAnimator android:propertyName="scaleY" android:duration="117" - android:startOffset="233" android:valueFrom="1.02" - android:valueTo="1" android:valueType="floatType"> - <aapt:attr name="android:interpolator"> - <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.565,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="717" - 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/core/res/res/anim/lock_screen_behind_enter_subtle.xml b/core/res/res/anim/lock_screen_behind_enter_subtle.xml new file mode 100644 index 000000000000..f9f69b12514c --- /dev/null +++ b/core/res/res/anim/lock_screen_behind_enter_subtle.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2019 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> + +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:detachWallpaper="true" + android:shareInterpolator="false"> + + <alpha + android:fromAlpha="0.0" android:toAlpha="1.0" + android:fillEnabled="true" android:fillBefore="true" + android:interpolator="@interpolator/linear" + android:startOffset="80" + android:duration="233"/> + <translate android:fromYDelta="5%p" android:toYDelta="0" + android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" + android:interpolator="@interpolator/fast_out_slow_in" + android:startOffset="80" + android:duration="233" /> +</set>
\ No newline at end of file diff --git a/core/res/res/drawable/ic_audio_alarm.xml b/core/res/res/drawable/ic_audio_alarm.xml index 96206ea3ce57..93f9f8f99cdc 100644 --- a/core/res/res/drawable/ic_audio_alarm.xml +++ b/core/res/res/drawable/ic_audio_alarm.xml @@ -14,8 +14,8 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="32.0dp" - android:height="32.0dp" + android:width="24dp" + android:height="24dp" android:viewportWidth="48.0" android:viewportHeight="48.0" android:tint="?attr/colorControlNormal"> diff --git a/core/res/res/drawable/ic_audio_alarm_mute.xml b/core/res/res/drawable/ic_audio_alarm_mute.xml index 7f248c3b33e6..510a7c630fd2 100644 --- a/core/res/res/drawable/ic_audio_alarm_mute.xml +++ b/core/res/res/drawable/ic_audio_alarm_mute.xml @@ -14,8 +14,8 @@ Copyright (C) 2014 The Android Open Source Project limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="32.0dp" - android:height="32.0dp" + android:width="24dp" + android:height="24dp" android:viewportWidth="48.0" android:viewportHeight="48.0" android:tint="?attr/colorControlNormal"> diff --git a/core/res/res/drawable/ic_battery_80_24dp.xml b/core/res/res/drawable/ic_battery_80_24dp.xml new file mode 100644 index 000000000000..2513d0d6d615 --- /dev/null +++ b/core/res/res/drawable/ic_battery_80_24dp.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="@android:color/white" + android:pathData="M9.5,2v2H7.33C6.6,4 6,4.6 6,5.33V15v5.67C6,21.4 6.6,22 7.33,22h9.33C17.4,22 18,21.4 18,20.67V15V5.33C18,4.6 17.4,4 16.67,4H14.5V2H9.5zM8,20v-5V6h8v9v5H8L8,20z"/> + <path + android:fillColor="@android:color/white" + android:pathData="M16.67,22H7.33C6.6,22 6,21.4 6,20.67V8h12v12.67C18,21.4 17.4,22 16.67,22z"/> +</vector>
\ No newline at end of file diff --git a/core/res/res/drawable/ic_bluetooth_share_icon.xml b/core/res/res/drawable/ic_bluetooth_share_icon.xml index 2152af55d5b6..6acfd57e669f 100644 --- a/core/res/res/drawable/ic_bluetooth_share_icon.xml +++ b/core/res/res/drawable/ic_bluetooth_share_icon.xml @@ -19,7 +19,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24" - android:tint="@android:color/accent_device_default_light"> + android:tint="@*android:color/accent_device_default_light"> <path android:fillColor="@android:color/white" diff --git a/core/res/res/drawable/ic_corp_badge.xml b/core/res/res/drawable/ic_corp_badge.xml index 6a7ac4a20ff3..16df45290302 100644 --- a/core/res/res/drawable/ic_corp_badge.xml +++ b/core/res/res/drawable/ic_corp_badge.xml @@ -15,8 +15,8 @@ Copyright (C) 2018 The Android Open Source Project limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="48dp" - android:height="48dp" + android:width="24dp" + android:height="24dp" android:tint="@*android:color/accent_device_default_light" android:viewportWidth="24" android:viewportHeight="24"> diff --git a/core/res/res/drawable/ic_file_copy.xml b/core/res/res/drawable/ic_file_copy.xml index b6d5e7328c40..d05b55f1279f 100644 --- a/core/res/res/drawable/ic_file_copy.xml +++ b/core/res/res/drawable/ic_file_copy.xml @@ -16,9 +16,10 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" + android:tint="@*android:color/material_grey_600" android:viewportWidth="24" android:viewportHeight="24"> <path android:pathData="M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM15,5l6,6v10c0,1.1 -0.9,2 -2,2L7.99,23C6.89,23 6,22.1 6,21l0.01,-14c0,-1.1 0.89,-2 1.99,-2h7zM14,12h5.5L14,6.5L14,12z" - android:fillColor="#FF737373"/> + android:fillColor="@android:color/white"/> </vector> diff --git a/core/res/res/drawable/ic_qs_auto_rotate.xml b/core/res/res/drawable/ic_qs_auto_rotate.xml index 47e1059fab44..8858e2b778bb 100644 --- a/core/res/res/drawable/ic_qs_auto_rotate.xml +++ b/core/res/res/drawable/ic_qs_auto_rotate.xml @@ -16,8 +16,8 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="48dp" - android:width="48dp" + android:height="24dp" + android:width="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path diff --git a/core/res/res/drawable/ic_qs_battery_saver.xml b/core/res/res/drawable/ic_qs_battery_saver.xml index 93975b61948e..6e1ced083ba7 100644 --- a/core/res/res/drawable/ic_qs_battery_saver.xml +++ b/core/res/res/drawable/ic_qs_battery_saver.xml @@ -15,8 +15,8 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" - android:width="32.0dp" - android:height="32.0dp" + android:width="24dp" + android:height="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0" android:tint="?android:attr/colorControlNormal"> diff --git a/core/res/res/drawable/ic_qs_flashlight.xml b/core/res/res/drawable/ic_qs_flashlight.xml index e63595300d5f..59b0ccd493dd 100644 --- a/core/res/res/drawable/ic_qs_flashlight.xml +++ b/core/res/res/drawable/ic_qs_flashlight.xml @@ -15,8 +15,8 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="48dp" - android:height="48dp" + android:width="24dp" + android:height="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path diff --git a/core/res/res/drawable/ic_qs_ui_mode_night.xml b/core/res/res/drawable/ic_qs_ui_mode_night.xml index 72278272e330..34b535bd40c3 100644 --- a/core/res/res/drawable/ic_qs_ui_mode_night.xml +++ b/core/res/res/drawable/ic_qs_ui_mode_night.xml @@ -15,11 +15,11 @@ ~ limitations under the License --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="48dp" - android:height="48dp" + android:width="24dp" + android:height="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path - android:fillColor="#FF000000" + android:fillColor="@android:color/white" android:pathData="M12,22C17.52,22 22,17.52 22,12 22,6.48 17.52,2 12,2 6.48,2 2,6.48 2,12 2,17.52 6.48,22 12,22ZM12,3.915c3.889,0 8,4.005 8,8.085 0,4.08 -3.927,7.992 -7.928,7.992z"/> -</vector>
\ No newline at end of file +</vector> diff --git a/core/res/res/drawable/perm_group_activity_recognition.xml b/core/res/res/drawable/perm_group_activity_recognition.xml index 0ade6c674171..ef025acbcb0c 100644 --- a/core/res/res/drawable/perm_group_activity_recognition.xml +++ b/core/res/res/drawable/perm_group_activity_recognition.xml @@ -17,6 +17,7 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportWidth="24" android:viewportHeight="24"> diff --git a/core/res/res/drawable/perm_group_aural.xml b/core/res/res/drawable/perm_group_aural.xml index b2737f24b86e..4b4c62cb73b6 100644 --- a/core/res/res/drawable/perm_group_aural.xml +++ b/core/res/res/drawable/perm_group_aural.xml @@ -16,6 +16,7 @@ Copyright (C) 2015 The Android Open Source Project <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path diff --git a/core/res/res/drawable/perm_group_calendar.xml b/core/res/res/drawable/perm_group_calendar.xml index 4b46dd36e3b1..0dfb30150535 100644 --- a/core/res/res/drawable/perm_group_calendar.xml +++ b/core/res/res/drawable/perm_group_calendar.xml @@ -17,13 +17,12 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportWidth="24" android:viewportHeight="24"> <path android:fillColor="#000000" android:pathData="M19 4h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99 0.9 -1.99 2L3 20c0 1.1 0.89 2 2 2h14c1.1 0 2-0.9 2-2V6c0-1.1-0.9-2-2-2zm0 16H5V10h14v10zm-4.5-7c-1.38 0-2.5 1.12-2.5 2.5s1.12 2.5 2.5 2.5 2.5-1.12 2.5-2.5-1.12-2.5-2.5-2.5z" /> - <path - android:pathData="M0 0h24v24H0V0z" /> -</vector>
\ No newline at end of file +</vector> diff --git a/core/res/res/drawable/perm_group_call_log.xml b/core/res/res/drawable/perm_group_call_log.xml index 0dfdbee4e600..a37ed88bebfc 100644 --- a/core/res/res/drawable/perm_group_call_log.xml +++ b/core/res/res/drawable/perm_group_call_log.xml @@ -18,6 +18,7 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path diff --git a/core/res/res/drawable/perm_group_camera.xml b/core/res/res/drawable/perm_group_camera.xml index db7833f63faf..e65501c4efcc 100644 --- a/core/res/res/drawable/perm_group_camera.xml +++ b/core/res/res/drawable/perm_group_camera.xml @@ -17,6 +17,7 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportWidth="24" android:viewportHeight="24"> diff --git a/core/res/res/drawable/perm_group_contacts.xml b/core/res/res/drawable/perm_group_contacts.xml index b834a27bac4b..dd6ae210181f 100644 --- a/core/res/res/drawable/perm_group_contacts.xml +++ b/core/res/res/drawable/perm_group_contacts.xml @@ -17,6 +17,7 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportWidth="24" android:viewportHeight="24"> diff --git a/core/res/res/drawable/perm_group_location.xml b/core/res/res/drawable/perm_group_location.xml index a7fa52471ab4..a87fc0dc43df 100644 --- a/core/res/res/drawable/perm_group_location.xml +++ b/core/res/res/drawable/perm_group_location.xml @@ -17,6 +17,7 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportWidth="24" android:viewportHeight="24"> diff --git a/core/res/res/drawable/perm_group_microphone.xml b/core/res/res/drawable/perm_group_microphone.xml index 9b532c1a7376..a1ed72510cf8 100644 --- a/core/res/res/drawable/perm_group_microphone.xml +++ b/core/res/res/drawable/perm_group_microphone.xml @@ -17,6 +17,7 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportWidth="24" android:viewportHeight="24"> diff --git a/core/res/res/drawable/perm_group_phone_calls.xml b/core/res/res/drawable/perm_group_phone_calls.xml index 324d86492703..563222698b46 100644 --- a/core/res/res/drawable/perm_group_phone_calls.xml +++ b/core/res/res/drawable/perm_group_phone_calls.xml @@ -17,6 +17,7 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportWidth="24" android:viewportHeight="24"> <path @@ -25,4 +26,4 @@ .37 2.33 .57 3.57 .57 .55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55 .45 -1 1-1h3.5c.55 0 1 .45 1 1 0 1.25 .2 2.45 .57 3.57 .11 .35 .03 .74-.25 1.02l-2.2 2.2z" /> -</vector>
\ No newline at end of file +</vector> diff --git a/core/res/res/drawable/perm_group_sensors.xml b/core/res/res/drawable/perm_group_sensors.xml index e4663d7206fc..f800965b6058 100644 --- a/core/res/res/drawable/perm_group_sensors.xml +++ b/core/res/res/drawable/perm_group_sensors.xml @@ -17,6 +17,7 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportWidth="24" android:viewportHeight="24"> <path diff --git a/core/res/res/drawable/perm_group_sms.xml b/core/res/res/drawable/perm_group_sms.xml index ebcf3d1fcd82..44ccdd6394e6 100644 --- a/core/res/res/drawable/perm_group_sms.xml +++ b/core/res/res/drawable/perm_group_sms.xml @@ -17,6 +17,7 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportWidth="24" android:viewportHeight="24"> diff --git a/core/res/res/drawable/perm_group_storage.xml b/core/res/res/drawable/perm_group_storage.xml index 4b8965bd9ef8..fceda2b84885 100644 --- a/core/res/res/drawable/perm_group_storage.xml +++ b/core/res/res/drawable/perm_group_storage.xml @@ -17,6 +17,7 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportWidth="24" android:viewportHeight="24"> diff --git a/core/res/res/drawable/perm_group_visual.xml b/core/res/res/drawable/perm_group_visual.xml index 9b21c279e30a..bf3edea74199 100644 --- a/core/res/res/drawable/perm_group_visual.xml +++ b/core/res/res/drawable/perm_group_visual.xml @@ -16,11 +16,10 @@ Copyright (C) 2015 The Android Open Source Project <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path android:fillColor="#000000" android:pathData="M20,4v12H8V4H20 M20,2H8C6.9,2,6,2.9,6,4v12c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2V4C22,2.9,21.1,2,20,2L20,2z M2,6v14 c0,1.1,0.9,2,2,2h14v-2H4V6H2z M15.67,11l-2.5,2.98L11.5,11.8L9,15h10L15.67,11z" /> - <path - android:pathData="M0,0h24v24H0V0z" /> </vector> diff --git a/core/res/res/layout/notification_template_material_media.xml b/core/res/res/layout/notification_template_material_media.xml index 13fef67c5e2f..575295b1be45 100644 --- a/core/res/res/layout/notification_template_material_media.xml +++ b/core/res/res/layout/notification_template_material_media.xml @@ -15,7 +15,7 @@ ~ limitations under the License --> -<FrameLayout +<com.android.internal.widget.MediaNotificationView android:id="@+id/status_bar_latest_event_content" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" @@ -24,8 +24,8 @@ android:tag="media" > <ImageView android:id="@+id/right_icon" - android:layout_width="wrap_content" - android:layout_height="match_parent" + android:layout_width="0dp" + android:layout_height="0dp" android:adjustViewBounds="true" android:layout_gravity="top|end" android:scaleType="centerCrop" @@ -91,4 +91,4 @@ android:layout_alignParentBottom="true" /> </LinearLayout> -</FrameLayout> +</com.android.internal.widget.MediaNotificationView> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 13b2ad8e7086..10e851b3d630 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Stemboodskappe"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-oproepe"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-status"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Hoëprioriteit-SIM-status"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Ander party het TTY-modus VOL versoek"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Ander party het TTY-modus GOD versoek"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Ander party het TTY-modus SOD versoek"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Vingerafdrukikoon"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"bestuur gesigstawinghardeware"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"bestuur gesigslothardeware"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Laat program toe om metodes te benut om gesigtemplate vir gebruik by te voeg en uit te vee."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"gebruik gesigstawinghardeware"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Laat die program toe om gesigstawinghardeware vir stawing te gebruik"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Gesigstawing"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"gebruik gesigslothardeware"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Laat die program toe om gesigslothardeware vir stawing te gebruik"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Gesigslot"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Skryf jou gesig weer in"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Skryf asseblief jou gesig weer in om herkenning te verbeter"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Kon nie gesigdata akkuraat vasvang nie. Probeer weer."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Beweeg foon na links."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Beweeg foon na regs."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Kyk asseblief meer reguit na jou toestel."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Kan nie jou gesig sien nie. Kyk na die foon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Posisioneer jou gesig direk voor die foon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Te veel beweging. Hou foon stil."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Skryf jou gesig asseblief weer in."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Kan nie meer gesig herken nie. Probeer weer."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Draai jou kop \'n bietjie minder."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Draai jou kop \'n bietjie minder."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Verwyder enigiets wat jou gesig versteek."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Maak die sensor op die skerm se borand skoon."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Maak die bokant van jou skerm skoon, insluitend die swart balk"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Kan nie gesig verifieer nie. Hardeware nie beskikbaar nie."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Probeer gesigstawing weer."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Probeer gesigslot weer."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Kan nie nuwe gesigdata berg nie. Vee eers \'n ou een uit."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Gesighandeling is gekanselleer"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Gesigstawing is deur gebruiker gekanselleer"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Gesighandeling is gekanselleer."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Gebruiker het gesigslot gekanselleer."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Te veel pogings. Probeer later weer."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Te veel pogings. Gesigstawing is gedeaktiveer."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Te veel pogings. Gesigslot is gedeaktiveer."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Kan nie gesig verifieer nie. Probeer weer."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Jy het nie gesigstawing opgestel nie"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Gesigstawing word nie op hierdie toestel gesteun nie"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Jy het nie gesigslot opgestel nie."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Gesigslot word nie op hierdie toestel gesteun nie."</string> <string name="face_name_template" msgid="7004562145809595384">"Gesig <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 3ad8263f6ae5..06654c4590ea 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"የድምጽ መልዕክቶች"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"የWi-Fi ጥሪ"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"የሲም ሁኔታ"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"ከፍተኛ ቅድሚያ ተሰጪ የሲም ኹናቴ"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ FULL ጠይቋል"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ HCO ጠይቋል"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ VCO ጠይቋል"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"የጣት አሻራ አዶ"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"የማረጋገጫ ሃርድዌር ፊትን ያስተዳድሩ"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"በመልክ መክፈቻ ሃርድዌርን ማስተዳደር"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"መተግበሪያው ጥቅም ላይ እንዲውሉ የፊት ቅንብር ደንቦችን ለማከል እና ለመሰረዝ የሚያስችሉ ስልቶችን እንዲያስጀምር ያስችለዋል።"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"የፊት ማረጋገጫ ሃርድዌር ይጠቀሙ"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"መተግበሪያው የማረጋገጫ ሃርድዌር ለማረጋገጥ ሥራ እንዲጠቀም ያስችለዋል"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"በመልክ ማረጋገጥ"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"በመልክ መክፈት ሃርድዌርን መጠቀም"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"መተግበሪያው የመልክ መክፈቻ ሃርድዌርን ለማረጋገጥ እንዲጠቀም ያስችለዋል"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"በመልክ መክፈት"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"የእርስዎን ፊት ዳግመኛ ያስመዝግቡ"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ማንነትን ለይቶ ማወቅን ለማሻሻል፣ እባክዎ የእርስዎን ፊት ዳግም ያስመዝግቡ"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"ትክክለኛ የፊት ውሂብ ማንሳት አልተቻለም። እንደገና ይሞክሩ።"</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ስልክን ወደ ግራ ያንቀሳቅሱ።"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ስልክን ወደ ቀኝ ያንቀሳቅሱ።"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"እባክዎ መሣሪያዎን ይበልጥ በቀጥታ ይመልከቱ።"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"የእርስዎን ፊት መመልከት አይችልም። ስልኩ ላይ ይመልከቱ።"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"መልክዎን በቀጥታ ከስልኩ ፊት ያድርጉት።"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ከልክ በላይ ብዙ እንቅስቃሴ። ስልኩን ቀጥ አድርገው ይያዙት።"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"እባክዎ ፊትዎን እንደገና ያስመዝግቡ"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ከእንግዲህ ፊትን ለይቶ ማወቅ አይችልም። እንደገና ይሞክሩ።"</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"ጭንቅላትዎን ትንሽ ብቻ ያዙሩት።"</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"ጭንቅላትዎን ትንሽ ብቻ ያዙሩት።"</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"የእርስዎን ፊት የሚደብቀውን ሁሉንም ነገር በማስወገድ ላይ"</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"በማያ ገጹ ላይኛው ጫፍ ላይ ዳሳሹን ያጽዱ።"</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"የማያ ገጽዎን አናት ያጽዱት፣ ጥቁር አሞሌውን ጨምሮ"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"መልክን ማረጋገጥ አይቻልም። ሃርድዌር የለም።"</string> - <string name="face_error_timeout" msgid="3202585609451248103">"በመልክ ማረጋገጥን እንደገና ይሞክሩ።"</string> + <string name="face_error_timeout" msgid="981512090365729465">"በመልክ መክፈትን እንደገና ይሞክሩ።"</string> <string name="face_error_no_space" msgid="2712120617457553825">"አዲስ የመልክ ውውሂብ ማስቀመጥ አልተቻለም። መጀመሪያ የድሮውን ይሰርዙት።"</string> - <string name="face_error_canceled" msgid="2768146728600802422">"የመልክ ክወና ተሰርዟል"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"መልክን ማረጋገጥ በተጠቃሚ ተሰርዟል"</string> + <string name="face_error_canceled" msgid="283945501061931023">"የፊት ሥርዓተ ክወና ተሰርዟል።"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"በመልክ መክፈት በተጠቃሚ ተሰርዟል።"</string> <string name="face_error_lockout" msgid="3407426963155388504">"ከልክ በላይ ብዙ ሙከራዎች። በኋላ ላይ እንደገና ይሞክሩ።"</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"በጣም ብዙ ሙከራዎች። የመልክ ማረጋገጫ ተሰናክሏል።"</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"በጣም ብዙ ሙከራዎች። በመልክ መክፈት ተሰናክሏል።"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"ፊትን ማረጋገጥ አይቻልም። እንደገና ይሞክሩ።"</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"የመልክ ማረጋገጫን አላቀናበሩም"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"የመልክ ማረጋገጫ መስጫ በዚህ መሣሪያ ላይ አይደገፍም።"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"በመልክ መክፈትን አላቀናበሩም።"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"በመልክ መክፈት መስጫ በዚህ መሣሪያ ላይ አይደገፍም።"</string> <string name="face_name_template" msgid="7004562145809595384">"ፊት <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 45031746ca2a..deb815cf42ea 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -99,6 +99,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"رسائل البريد الصوتي"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"الاتصال عبر Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"حالة شريحة SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"حالة شريحة SIM ذات أولوية"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"طلب النظير وضع TTY الكامل"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"طلب النظير وضع TTY على HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"طلب النظير وضع TTY على VCO"</string> @@ -562,11 +563,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"رمز بصمة الإصبع"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"إدارة أجهزة مصادقة الوجه"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"إدارة أجهزة \"فتح القفل بالوجه\""</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"السماح للتطبيق باستدعاء طرق لإضافة نماذج من الوجوه وحذفها"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"استخدام أجهزة مصادقة الوجه"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"السماح للتطبيق باستخدام أجهزة مصادقة الوجه"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"المصادقة بالوجه"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"استخدام أجهزة \"فتح القفل بالوجه\""</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"السماح للتطبيق باستخدام أجهزة \"فتح القفل بالوجه\" لإجراء المصادقة"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"فتح القفل بالوجه"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"إعادة تسجيل وجهك"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"لتحسين قدرة الجهاز على معرفة وجهك، يُرجى إعادة تسجيل الوجه."</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"تعذّر تسجيل بيانات دقيقة للوجه. حاول مرة أخرى."</string> @@ -579,7 +580,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"يُرجى نقل الهاتف إلى اليمين."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"يُرجى نقل الهاتف إلى اليسار."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"يُرجى النظر إلى جهازك مباشرة أكثر."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"يتعذّر رؤية وجهك. يُرجى النظر إلى الهاتف."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ضع وجهك أمام الهاتف مباشرة."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"حركة أكثر من اللازم يُرجى حمل بدون حركة."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"يُرجى إعادة تسجيل وجهك."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"لم يعُد يمكن التعرّف على الوجه. حاول مرة أخرى."</string> @@ -588,19 +589,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"حرّك رأسك قليلاً نحو الأمام مباشرة."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"حرّك رأسك قليلاً نحو الوسط."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"عليك بإزالة أي شيء يُخفي وجهك."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"نظِّف المستشعر أعلى الشاشة."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"يُرجى تنظيف الجزء العلوي من الشاشة، بما في ذلك الشريط الأسود."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"يتعذّر التحقُّق من الوجه. الجهاز غير مُتاح."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"جرِّب مصادقة الوجه مرة أخرى."</string> + <string name="face_error_timeout" msgid="981512090365729465">"حاول استخدام \"فتح القفل بالوجه\" مرة أخرى."</string> <string name="face_error_no_space" msgid="2712120617457553825">"يتعذَّر تخزين بيانات الوجه الجديد. احذف الوجه القديم أولاً."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"تم إلغاء عملية مصادقة الوجه."</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"ألغَى المستخدم مصادقة الوجه."</string> + <string name="face_error_canceled" msgid="283945501061931023">"تمّ إلغاء عملية مصادقة الوجه."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"ألغى المستخدم \"فتح القفل بالوجه\"."</string> <string name="face_error_lockout" msgid="3407426963155388504">"تمّ إجراء محاولات كثيرة. أعِد المحاولة لاحقًا."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"محاولات كثيرة جدًا. تم إيقاف مصادقة الوجه."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"تم إجراء عدد كبير جدًا من المحاولات. وتم إيقاف \"فتح القفل بالوجه\"."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"يتعذّر التحقق من الوجه. حاول مرة أخرى."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"لم يسبق لك إعداد مصادقة الوجه."</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"لا تتوفّر إمكانية مصادقة الوجه على هذا الجهاز."</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"لم يسبق لك إعداد \"فتح القفل بالوجه\"."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"\"فتح القفل بالوجه\" غير متوفر على هذا الجهاز."</string> <string name="face_name_template" msgid="7004562145809595384">"الوجه <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index fe08ba3d339b..c53af2b3fa7e 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ভইচমেইলৰ বাৰ্তাসমূহ"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"ৱাই-ফাই কলিং"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"ছিমৰ স্থিতি"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"উচ্চ অগ্ৰাধিকাৰযুক্ত ছিমৰ স্থিতি"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"নেটৱৰ্ক পীয়েৰে TTY ম\'ড FULLলৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"নেটৱৰ্ক পীয়েৰে TTY ম\'ড HCOলৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"নেটৱৰ্ক পীয়েৰে TTY ম\'ড VCO লৈ সলনি কৰিবলৈ অনুৰোধ কৰিছে"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ফিংগাৰপ্ৰিণ্ট আইকন"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"মুখমণ্ডল সত্যাপন হাৰ্ডৱেৰ পৰিচালনা কৰক"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"মুখাৱয়বৰদ্বাৰা আনলক হার্ডৱেৰ পৰিচালনা কৰক"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"মুখমণ্ডলৰ টেম্প্লেট যোগ কৰাৰ বা মচাৰ পদ্ধতি কামত লগাবলৈ আহ্বান কৰিবলৈ এপটোক অনুমতি দিয়ে।"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"মুখমণ্ডল সত্যাপন হাৰ্ডৱেৰ ব্যৱহাৰ কৰক"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"বিশ্বাসযোগ্য়তা প্ৰমাণীকৰণৰ বাবে এপক মুখমণ্ডল সত্যাপন হাৰ্ডৱেৰ ব্য়ৱহাৰ কৰিবলৈ অনুমতি দিয়ে"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"মুখমণ্ডলৰ বিশ্বাসযোগ্যতাৰ প্ৰমাণীকৰণ"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"মুখাৱয়বৰদ্বাৰা আনলক হার্ডৱেৰ ব্যৱহাৰ কৰক"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ বাবে এপ্ক মুখাৱয়বৰদ্বাৰা আনলক কৰা হাৰ্ডৱেৰ ব্যৱহাৰ কৰিবলৈ দিয়ে"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"মুখাৱয়বৰদ্বাৰা আনলক কৰা সুবিধা"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ণ কৰক"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"চিনাক্তকৰণৰ সুবিধাটো উন্নত কৰিবলৈ, অনুগ্ৰহ কৰি আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ন কৰক"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"সঠিক মুখমণ্ডলৰ ডেটা কেপচাৰ নহ’ল। আকৌ চেষ্টা কৰক।"</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ফ’নটো বাওঁফালে নিয়ক।"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ফ’নটো সোঁফালে নিয়ক।"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"আপোনাৰ ডিভাইচটোলৈ অধিক পোনে পোনে চাওক।"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"আপোনাৰ মুখমণ্ডল দেখা নাই। ফ’নটোলৈ চাওক।"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"আপোনাৰ মুখখন পোনপটীয়াকৈ ফ’নটোৰ সন্মুখত ৰাখক।"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"বেছি লৰচৰ কৰি আছে। ফ’নটো স্থিৰকৈ ধৰক।"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"আপোনাৰ মুখমণ্ডল পুনৰ পঞ্জীয়ন কৰক।"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"মুখমণ্ডল আৰু চিনাক্ত কৰিব নোৱাৰি। আকৌ চেষ্টা কৰক।"</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"আপোনাৰ মূৰটো সামান্য কমকৈ ঘূৰাওক।"</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"আপোনাৰ মূৰটো সামান্য কমকৈ ঘূৰাওক।"</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"আপোনাৰ মুখখন ঢাকি ৰখা বস্তুবোৰ আঁতৰাওক।"</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"স্ক্ৰীণৰ একেবাৰে ওপৰৰ কাষত থকা ছেন্সৰটো চাফা কৰক।"</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"ক’লা বাৰডালকে ধৰি আপোনাৰ স্ক্রীণৰ ওপৰৰ অংশ চাফা কৰক"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"মুখমণ্ডল সত্যাপন কৰিব পৰা নগ’ল। হাৰ্ডৱেৰ নাই।"</string> - <string name="face_error_timeout" msgid="3202585609451248103">"আকৌ মুখমণ্ডল সত্যাপন কৰিবলৈ চেষ্টা কৰক।"</string> + <string name="face_error_timeout" msgid="981512090365729465">"পুনৰ মুখাৱয়বৰদ্বাৰা আনলক কৰি চাওক।"</string> <string name="face_error_no_space" msgid="2712120617457553825">"নতুন মুখমণ্ডলৰ ডেটা জমা কৰিব পৰা নাই। প্ৰথমে পুৰণি এখন মচক।"</string> - <string name="face_error_canceled" msgid="2768146728600802422">"মুখমণ্ডলৰ প্ৰক্ৰিয়া বাতিল কৰা হ’ল"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"ব্যৱহাৰকাৰীয়ে মুখমণ্ডল প্ৰমাণীকৰণ বাতিল কৰিছে"</string> + <string name="face_error_canceled" msgid="283945501061931023">"মুখমণ্ডলৰ প্ৰক্ৰিয়া বাতিল কৰা হ’ল।"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"ব্যৱহাৰকাৰীয়ে মুখাৱয়বৰদ্বাৰা আনলক কৰাটো বাতিল কৰিছে।"</string> <string name="face_error_lockout" msgid="3407426963155388504">"অত্যধিক ভুল প্ৰয়াস। কিছুসময়ৰ পাছত আকৌ চেষ্টা কৰক।"</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"অতি বেছি প্ৰয়াস। মুখমণ্ডল প্ৰমাণীকৰণ অক্ষম কৰা হ’ল।"</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"অতি বেছি প্ৰয়াস। মুখাৱয়বৰদ্বাৰা আনলক কৰাটো অক্ষম কৰা হৈছে।"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"মুখমণ্ডল সত্যাপন কৰিব পৰা নগ’ল। আকৌ চেষ্টা কৰক।"</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"আপুনি মুখমণ্ডল প্ৰমাণীকৰণ ছেট আপ কৰা নাই"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"এই ডিভাইচটোত মুখমণ্ডল প্ৰমাণীকৰণ ব্যৱহাৰ কৰিব নোৱাৰি"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"আপুনি মুখাৱয়বৰদ্বাৰা আনলক কৰাটো ছেট আপ কৰা নাই।"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"এই ডিভাইচটোত মুখাৱয়বৰদ্বাৰা আনলক কৰা সুবিধাটো নচলে।"</string> <string name="face_name_template" msgid="7004562145809595384">"মুখমণ্ডল <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 4ac94c1ca20a..a3a2f2a0ecff 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Səsli e-poçt mesajları"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi zəngi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Yüksək Prioritetli SIM statusu"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Eskpert TTY Rejimi FULL-u sorğuladı"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Ekspert TTY Rejimi HCO-nu sorğuladı"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Ekspert TTY Rejimi VCO-nu sorğuladı"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Barmaq izi ikonası"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"üz identifikasiyası proqramını idarə edin"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"üz kilidi avadanlığını idarə edin"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Proqramdan istifadə üçün barmaq izi şablonlarını əlavə etmək və silmək məqsədilə üsullara müraciət etməyə imkan verir."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"üz identifikasiyası proqramından istifadə edin"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Tətbiqin üz identifikasiyası proqramından identifikasiya zamanı istifadə etməsinə icazə verir"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Üz identifikasiyası"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"üz kilidi avadanlığından istifadə edin"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"İdentifikasiya üçün tətbiqin üz kilidi avadanlığından istifadə etməsinə icazə verir"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Üz kilidi"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Üzünüzü yenidən qeydiyyatdan keçirin"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Tanınmanı təkmilləşdirmək üçün üzünüzü yenidən qeydiyyatdan keçirin"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Dəqiq üz datası əldə edilmədi. Yenidən cəhd edin."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Telefonu sola hərəkət etdirin."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Telefonu sağa hərəkət etdirin."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Birbaşa cihaza baxın."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Üzünüz görünmür. Telefona baxın."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Üzünüzü telefonun qarşısında sabit saxlayın."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Cihaz stabil deyil. Telefonu tərpətməyin."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Üzünüzü yenidən qeydiyyatdan keçirin."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Üzü artıq tanımaq olmur. Yenidən cəhd edin."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Başınızı bir az döndərin."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Başınızı bir az döndərin."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Üzünüzü gizlədən maneələri kənarlaşdırın."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Ekranın yuxarı küncündəki sensoru təmizləyin."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Qara panel daxil olmaqla, ekranın yuxarısını təmizləyin"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Üz doğrulanmadı. Avadanlıq əlçatan deyil."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Üz identifikasiyasını yenidən sınayın."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Üz kilidini yenidən sınayın."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Yeni üz datası saxlanmadı. Əvvəlcə köhnə olanı silin."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Üz əməliyyatı ləğv edildi"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Üz dorğulaması istifadəçi tərəfindən ləğv edildi"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Üz əməliyyatı ləğv edildi."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"İstifadəçi üz kilidini ləğv edib."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Həddindən çox cəhd. Sonraya saxlayın."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Həddindən çox cəhd. Üz doğrulaması deaktiv edildi."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Həddindən çox cəhd. Üz kilidi deaktiv edildi."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Üz doğrulanmadı. Yenidən cəhd edin."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Üz doğrulaması quraşdırmamısınız"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Üz doğrulaması bu cihazda dəstəklənmir"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Üz kilidi quraşdırmamısınız."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Üz kilidi bu cihazda dəstəklənmir."</string> <string name="face_name_template" msgid="7004562145809595384">"Üz <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 3911067ba4f8..61a2167b8860 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -96,6 +96,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Poruke govorne pošte"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Pozivanje preko Wi-Fi mreže"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Status SIM-a"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Obaveštenja SIM kartice sa statusom „visok prioritet“"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Korisnik zahteva POTPUN režim TTY"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Korisnik zahteva PRENOS ZVUKA za režim TTY"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Korisnik zahteva PRENOS GLASA za režim TTY"</string> @@ -553,11 +554,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona otiska prsta"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"upravljanje hardv. za potvrdu identiteta pomoću lica"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"upravljanje hardv. za otključavanje licem"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Dozvoljava da aplikacija aktivira metode za dodavanje i brisanje šablona lica radi korišćenja."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"korišćenje hardv. za potvrdu identiteta pomoću lica"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Dozvoljava da aplikacija koristi hardver za potvrdu identiteta pomoću lica"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Potvrda identiteta licem"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"korišćenje hardvera za otključavanje licem"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Dozvoljava da aplikacija koristi hardver za otključavanje licem radi potvrde identiteta"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Otključavanje licem"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Ponovo registrujte lice"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Da biste poboljšali prepoznavanje, ponovo registrujte lice"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Snimanje lica nije uspelo. Probajte ponovo."</string> @@ -570,7 +571,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Pomerite telefon ulevo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Pomerite telefon udesno."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Gledajte pravo u uređaj."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ne vidi se lice. Gledajte u telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Postavite lice direktno ispred telefona"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Mnogo se pomerate. Držite telefon mirno."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Ponovo registrujte lice."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Više ne može da se prepozna lice. Probajte ponovo."</string> @@ -579,19 +580,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Malo manje pomerite glavu."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Malo manje pomerite glavu."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Uklonite sve što vam zaklanja lice."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Očistite senzor na gornjoj ivici ekrana."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Očistite gornji deo ekrana, uključujući crnu traku"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Provera lica nije uspela. Hardver nije dostupan."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Probajte ponovo potvrdu identiteta pomoću lica."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Probajte ponovo otključavanje licem."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Novi podaci o licu nisu sačuvani. Prvo izbrišete prethodne."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Obrada lica je otkazana"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Korisnik je otkazao potvrdu identiteta licem"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Obrada lica je otkazana."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Korisnik je otkazao otključavanje licem"</string> <string name="face_error_lockout" msgid="3407426963155388504">"Previše pokušaja. Probajte ponovo kasnije."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Previše pokušaja. Potvrda identiteta licem je onemogućena."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Previše pokušaja. Otključavanje licem je onemogućeno."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Provera lica nije uspela. Probajte ponovo."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Niste podesili potvrdu identiteta licem"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Prepoznavanje lica nije podržano na ovom uređaju"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Niste podesili otključavanje licem"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Otključavanje licem nije podržano na ovom uređaju"</string> <string name="face_name_template" msgid="7004562145809595384">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index e416c4516f9b..cb6b3707b355 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -97,6 +97,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Паведамленні галасавой пошты"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-тэлефанія"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Статус SIM-карты"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Стан SIM-карты з высокім прыярытэтам"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Аднарангавая прылада запытала рэжым TTY FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Аднарангавая прылада запытала рэжым TTY НСО"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Аднарангавая прылада запытала рэжым TTY VCO"</string> @@ -556,11 +557,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Значок адбіткаў пальцаў"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"кіраваць абсталяваннем для распазнавання твару"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"кіраваць апаратным забеспячэннем для распазнавання твару"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Праграма зможа дадаваць і выдаляць шаблоны твару."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"карыстацца абсталяваннем для распазнавання твару"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Праграма зможа выкарыстоўваць абсталяванне распазнавання твару для аўтэнтыфікацыі"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Распазнаванне твару"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"выкарыстоўваць апаратнае забеспячэнне для распазнавання твару"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Для аўтэнтыфікацыі праграма зможа ўжываць апаратнае забеспячэнне для распазнавання твару"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Распазнаванне твару"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Паўтарыце рэгістрацыю твару"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Каб палепшыць распазнавальнасць, яшчэ раз выканайце рэгістрацыю твару"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Не атрымалася распазнаць твар. Паўтарыце спробу."</string> @@ -573,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Перамясціце тэлефон улева."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Перамясціце тэлефон управа."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Глядзіце прама на экран прылады."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Не відаць твару. Глядзіце на тэлефон."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Трымайце тэлефон прама перад тварам."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Трымайце прыладу нерухома. Трымайце тэлефон роўна."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Паўтарыце рэгістрацыю твару."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Не ўдаецца распазнаць твар. Паўтарыце спробу."</string> @@ -582,19 +583,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Галава не ў цэнтры."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Вы занадта моцна павярнулі галаву."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Прыміце ўсё, што закрывае ваш твар."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Ачысціце датчык уверсе экрана."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Ачысціце ад бруду верхнюю частку экрана, у тым ліку чорную панэль"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Твар не спраўджаны. Абсталяванне недаступнае."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Выканайце распазнаванне твару паўторна."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Выканайце распазнаванне твару паўторна."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Новыя даныя пра твар не захаваны. Спачатку выдаліце старыя."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Распазнаванне твару скасавана"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Распазнаванне твару скасавана карыстальнікам"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Распазнаванне твару скасавана."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Распазнаванне твару скасавана карыстальнікам."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Занадта шмат спроб. Паўтарыце спробу пазней."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Занадта шмат спроб. Распазнаванне твару выключана."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Занадта шмат спроб. Распазнаванне твару выключана."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Не ўдалося спраўдзіць твар. Паўтарыце спробу."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Вы не наладзілі распазнаванне твару"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"На гэтай прыладзе распазнаванне твару не падтрымліваецца"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Вы не наладзілі распазнаванне твару."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"На гэтай прыладзе распазнаванне твару не падтрымліваецца."</string> <string name="face_name_template" msgid="7004562145809595384">"Твар <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 843452275809..7c44bcaedd93 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Съобщения в гласовата поща"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Обаждания през Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Състояние на SIM картата"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Състояние на SIM картата с висок приоритет"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Отсрещният потребител заяви пълен TTY режим (FULL)"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Отсрещният потребител заяви TTY режим с пренос на слух (HCO)"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Отсрещният потребител заяви TTY режим с пренос на глас (VCО)"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Икона за отпечатък"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"управление на хардуера за удостоверяване с лице"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"управление на хардуера за отключване с лице"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Разрешава на прил. да извиква методи за добавяне и изтриване на лицеви шаблони за ползване"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"използване на хардуера за удостоверяване с лице"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Разрешава на приложението при необходимост да използва хардуера за удостоверяване с лице"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Удостоверяване с лице"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"използване на хардуера за отключване с лице"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Разрешава на приложението да използва хардуера за отключване с лице с цел удостоверяване"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Отключване с лице"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Регистрирайте отново лицето си"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"С цел подобряване на разпознаването регистрирайте отново лицето си"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Лицето не бе заснето точно. Опитайте отново."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Преместете телефона наляво."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Преместете телефона надясно."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Моля, гледайте точно към устройството си."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Лицето ви не се вижда. Погледнете към телефона."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Позиционирайте лицето си директно пред телефона."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Твърде много движение. Дръжте телефона неподвижно."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Моля, регистрирайте лицето си отново."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Лицето не бе разпознато. Опитайте отново."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Не завъртайте главата си толкова много."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Не завъртайте главата си толкова много."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Премахнете всичко, което закрива лицето ви."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Изчистете сензора в горния край на екрана."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Почистете горната част на екрана си, включително черната лента"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Лицето не може да се потвърди. Хардуерът не е налице."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Опитайте отново да удостоверите с лице."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Опитайте отново да отключите с лице."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Не може да се запази ново лице. Първо изтрийте старо."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Операцията с лице е анулирана"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Удостоверяването с лице е анулирано от потребителя"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Операцията с лице е анулирана."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Отключването с лице е анулирано от потребителя."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Твърде много опити. Опитайте отново по-късно."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Твърде много опити. Удостоверяването с лице е деактивирано."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Твърде много опити. Отключването с лице е деактивирано."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Лицето не може да се потвърди. Опитайте отново."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Не сте настроили удостоверяването с лице"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Удостоверяването с лице не се поддържа на това устройство"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Не сте настроили отключването с лице."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Отключването с лице не се поддържа на това устройство."</string> <string name="face_name_template" msgid="7004562145809595384">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 7170dbbd6192..3d834d5922a6 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ভয়েসমেল মেসেজ"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"ওয়াই-ফাই কলিং"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"সিম কার্ডের স্টাটাস"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"উচ্চ প্রায়রিটি সিম স্ট্যাটাস"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"পির TTY মোড FULL অনুরোধ করেছে"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"পির TTY মোড HCO অনুরোধ করেছে"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"পির TTY মোড VCO অনুরোধ করেছে"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"আঙ্গুলের ছাপ আইকন"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"ফেস যাচাইকরণ হার্ডওয়্যার পরিচালনা করুন"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"মুখের সাহায্যে আনলক করার হার্ডওয়্যার ম্যানেজ করা"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"ব্যবহার করার জন্য ফেস টেম্পলেট যোগ করা এবং মোছার পদ্ধতি গ্রহণ করতে অ্যাপটিকে অনুমতি দেয়৷"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ফেস যাচাইকরণ হার্ডওয়্যার ব্যবহার করুন"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"প্রমাণীকরণের জন্য ফেস যাচাইকরণ হার্ডওয়্যার ব্যবহার করার অনুমতি অ্যাপটিকে দেয়"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"ফেস যাচাইকরণ"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"মুখের সাহায্যে আনলক করার হার্ডওয়্যার ব্যবহার করা"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"অ্যাপকে যাচাইকরণের জন্য মুখের সাহায্যে আনলক করার হার্ডওয়্যার ব্যবহার করতে দেয়"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"মুখের সাহায্যে আনলক"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"আপনার ফেস আবার এনরোল করুন"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"শনাক্তকরণের উন্নতি করতে আপনার ফেস আবার এনরোল করুন"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"মুখের সঠিক ডেটা পাওয়া যায়নি। আবার চেষ্টা করুন।"</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ফোনটি বাঁদিকে সরান।"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ফোনটি ডানদিকে সরান।"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"সরাসরি ডিভাইসের দিকে তাকান।"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"আপনার মুখ দেখা যাচ্ছে না। ফোনের দিকে তাকান।"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"আপনার মুখ সরাসরি ফোনের সামনে রাখুন।"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"খুব বেশি নড়ছে। ফোনটি যাতে না কাঁপে সেইভাবে ধরুন।"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"আপনার মুখের ছবি আবার নথিভুক্ত করুন।"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"আর মুখ চিনতে পারবেন না। আবার চেষ্টা করুন।"</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"আপনার মাথাটি নিচের দিকে সামান্য নামান।"</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"আপনার মাথাটি সামান্য ঘোরান।"</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"আপনার ফেসকে আড়াল করে এমন সব কিছু সরিয়ে দিন।"</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"স্ক্রিনের উপরের প্রান্তের সেন্সর মুছুন।"</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"ব্ল্যাক বার সহ আপনার স্ক্রিনের উপরের অংশ মুছে ফেলুন"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"ফেস যাচাই করা যায়নি। হার্ডওয়্যার উপলভ্য নেই।"</string> - <string name="face_error_timeout" msgid="3202585609451248103">"ফেস যাচাইকরণের ফিচার আবার ব্যবহার করুন।"</string> + <string name="face_error_timeout" msgid="981512090365729465">"আবার মুখের সাহায্যে আনলক করার চেষ্টা করুন।"</string> <string name="face_error_no_space" msgid="2712120617457553825">"নতুন ফেস ডেটা স্টোর করা যায়নি। প্রথমে পুরনোটি মুছে ফেলুন।"</string> - <string name="face_error_canceled" msgid="2768146728600802422">"ফেস যাচাই করার প্রসেস বাতিল করা হয়েছে"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"ব্যবহারকারী মুখ শনাক্তকরণ প্রক্রিয়া বাতিল করেছেন"</string> + <string name="face_error_canceled" msgid="283945501061931023">"ফেস অপারেশন বাতিল করা হয়েছে৷"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"ব্যবহারকারী মুখের সাহায্যে আনলক বাতিল করে দিয়েছেন।"</string> <string name="face_error_lockout" msgid="3407426963155388504">"অনেকবার চেষ্টা করা হয়েছে। পরে আবার চেষ্টা করুন।"</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"অনেকবার চেষ্টা করেছেন। ফেস যাচাই করার ফিচারটি বন্ধ করা আছে।"</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"অনেকবার চেষ্টা করেছেন। মুখের সাহায্যে আনলক করার সুবিধা বন্ধ করা হয়েছে।"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"আপনার মুখ যাচাই করা যাচ্ছে না। আবার চেষ্টা করুন।"</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"ফেস যাচাই করার প্রক্রিয়াটি সেট-আপ করেননি"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"এই ডিভাইসে ফেস যাচাই করা যাবে না"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"এখনও মুখের সাহায্যে আনলক করার সুবিধা সেট-আপ করেননি।"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"এই ডিভাইসে মুখের সাহায্যে আনলক করার সুবিধাটি কাজ করে না।"</string> <string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g> ফেস"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index c7ea23d090bd..572b8eaec5eb 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -96,6 +96,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Poruke govorne pošte"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Pozivanje putem WiFi-ja"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Status SIM-a"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Status visokog prioriteta SIM-a"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Ravnopravni uređaj zatražio načina rada TTY FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Ravnopravni uređaj zatražio načina rada TTY HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Ravnopravni uređaj zatražio načina rada TTY VCO"</string> @@ -553,11 +554,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona za otisak prsta"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"upravljanje hardverom za autentifikaciju licem"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"upravljanje hardverom za otključavanje licem"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Omogućava aplikaciji korištenje metoda za dodavanje i brisanje šablona lica za upotrebu."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"upotreba hardvera za autentifikaciju licem"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Omogućava aplikaciji da za autentifikaciju koristi hardver za autentifikaciju licem"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autentifikacija licem"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"korištenje hardvera za otključavanje licem"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Omogućava aplikaciji da za autentifikaciju koristi hardver za otključavanje licem"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Otključavanje licem"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Ponovo registrirajte lice"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Ponovo registrirajte lice da poboljšate prepoznavanje"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Lice nije snimljeno precizno. Pokušajte ponovo."</string> @@ -570,7 +571,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Pomjerite telefon ulijevo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Pomjerite telefon udesno."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Gledajte direktno u uređaj."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ne vidi se lice. Gledajte u telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Postavite lice direktno ispred telefona"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Previše pokreta. Držite telefon mirno."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Ponovo registrirajte lice."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Nije više moguće prepoznati lice. Pokušajte opet."</string> @@ -579,19 +580,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Malo manje zakrenite glavu."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Malo manje zakrenite glavu."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Uklonite prepreke koje blokiraju vaše lice."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Očistite senzor na gornjem rubu ekrana."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Očistite vrh ekrana, uključujući crnu traku"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Nije moguće potvrditi lice. Hardver nije dostupan."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Pokušajte ponovo s autentifikacijom lica."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Pokušajte ponovo s otključavanjem licem."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Nije moguće sačuvati nove podatke o licu. Prvo izbrišite stare."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Prepoznavanje lica je otkazano"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Korisnik je otkazao provjeru lica"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Prepoznavanje lica je otkazano."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Korisnik je otkazao otključavanje licem."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Previše pokušaja. Pokušajte ponovo kasnije."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Previše pokušaja. Autentifikacija licem je onemogućena."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Previše pokušaja. Otključavanje licem je onemogućeno."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Nije moguće potvrditi lice. Pokušajte ponovo."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Niste postavili autentifikaciju pomoću lica"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Autentifikacija pomoću lica nije podržana na ovom uređaju"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Niste postavili otključavanje licem."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Otključavanje licem nije podržano na ovom uređaju."</string> <string name="face_name_template" msgid="7004562145809595384">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 5dfab4c954ff..f4b341c2283d 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Missatges de veu"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Trucades per Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Estat de la SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Estat de la SIM d\'alta prioritat"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"L\'altre dispositiu ha sol·licitat el mode TTY COMPLET."</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"L\'altre dispositiu ha sol·licitat el mode TTY HCO."</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"L\'altre dispositiu ha sol·licitat el mode TTY VCO."</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icona d\'empremta digital"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"gestiona el maquinari d\'autenticació facial"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"gestiona el maquinari de desbloqueig facial"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Permet que l\'aplicació afegeixi i suprimeixi plantilles de cares que es puguin fer servir."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"utilitza el maquinari d\'autenticació facial"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permet que l\'aplicació faci servir maquinari d\'autenticació facial"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autenticació facial"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"utilitza el maquinari de desbloqueig facial"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Permet que l\'aplicació faci servir el maquinari de desbloqueig facial per a l\'autenticació"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Desbloqueig facial"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Torna a registrar la cara"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Per millorar el reconeixement, torna a registrar la cara"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"No es reconeix la teva cara. Torna-ho a provar."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mou el telèfon cap a l\'esquerra."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mou el telèfon cap a la dreta."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Mira més directament cap al dispositiu."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"No se\'t veu la cara. Mira el telèfon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Posa la cara directament davant del telèfon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Massa moviment. Subjecta bé el telèfon."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Torna a registrar la teva cara."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ja no es reconeix la teva cara. Torna-ho a provar."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"No inclinis tant el cap."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"No giris tant el cap."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Suprimeix qualsevol cosa que amagui la teva cara."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Neteja el sensor de l\'extrem superior."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Neteja la part superior de la pantalla, inclosa la barra negra"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"No es pot verificar la cara. Maquinari no disponible."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Torna a provar l\'autenticació facial."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Torna a provar el desbloqueig facial."</string> <string name="face_error_no_space" msgid="2712120617457553825">"No es poden desar dades facials noves. Suprimeix-ne d\'antigues."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"S\'ha cancel·lat el reconeixement facial"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"L\'usuari ha cancel·lat l\'autenticació facial"</string> + <string name="face_error_canceled" msgid="283945501061931023">"S\'ha cancel·lat el reconeixement facial."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"L\'usuari ha cancel·lat el desbloqueig facial."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Massa intents. Torna-ho a provar més tard."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Massa intents. S\'ha desactivat l\'autenticació facial."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Massa intents. S\'ha desactivat el desbloqueig facial."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"No es pot verificar la cara. Torna-ho a provar."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"No has configurat l\'autenticació facial"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"L\'autenticació facial no és compatible amb el dispositiu."</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"No has configurat el desbloqueig facial"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"El desbloqueig facial no és compatible amb el dispositiu."</string> <string name="face_name_template" msgid="7004562145809595384">"Cara <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 40150ff1b66a..d0d060723572 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -97,6 +97,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Hlasové zprávy"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Volání přes Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Stav SIM karty"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Stav SIM karty: vysoká priorita"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Partner požádal o přechod na režim TTY FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Partner požádal o přechod na režim TTY HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Partner požádal o přechod na režim TTY VCO"</string> @@ -556,11 +557,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona otisku prstů"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"správa hardwaru k ověření obličeje"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"správa hardwaru k odemknutí obličejem"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Umožňuje aplikaci volat metody k přidání a smazání šablon obličeje, které budou použity."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"použití hardwaru k ověření obličeje"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Umožňuje aplikaci provést ověření pomocí hardwaru k ověření obličeje"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Ověřování obličejem"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"použití hardwaru k odemknutí obličejem"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Umožňuje aplikaci provést ověření pomocí hardwaru k odemknutí obličejem"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Odemknutí obličejem"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Zaznamenejte obličej znovu"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Chcete-li rozpoznání zdokonalit, zaznamenejte obličej znovu"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Obličej se nepodařilo zachytit. Zkuste to znovu."</string> @@ -573,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Přesuňte telefon vlevo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Přesuňte telefon vpravo."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Dívejte se přímo na zařízení."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Obličej není vidět. Podívejte se na telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Umístěte obličej přímo před telefon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Příliš mnoho pohybu. Držte telefon nehybně."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Zaznamenejte obličej znovu."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Obličej už nelze rozpoznat. Zkuste to znovu."</string> @@ -582,19 +583,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Natočte hlavu o něco méně."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Natočte hlavu o něco méně."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Odstraňte vše, co vám zakrývá obličej."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Vyčistěte snímač u horního okraje obrazovky."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Očistěte horní část obrazovky včetně černé části"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Obličej nelze ověřit. Hardware není dostupný."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Zopakujte ověření obličeje."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Zopakujte odemknutí obličejem."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Údaje o novém obličeji nelze uložit. Nejdřív vymažte starý."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Operace snímání obličeje byla zrušena"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Ověření obličejem zrušil uživatel"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Operace snímání obličeje byla zrušena."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Odemknutí obličejem zrušil uživatel."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Příliš mnoho pokusů. Zkuste to později."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Příliš mnoho pokusů. Ověření obličejem je vypnuto."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Příliš mnoho pokusů. Odemknutí obličejem bylo deaktivováno."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Obličej se nepodařilo ověřit. Zkuste to znovu."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Ověření obličejem nemáte nastavené"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Ověření obličejem na tomto zařízení není podporováno"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Ověření obličejem nemáte nastavené."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Odemknutí obličejem na tomto zařízení není podporováno."</string> <string name="face_name_template" msgid="7004562145809595384">"Obličej <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index d841631e8610..ee5597f289bc 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Talebeskeder"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-opkald"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-status"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"SIM-kort med høj prioritet"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Den anden enhed har skiftet til FULD TTY-tilstand"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Den anden enhed har skiftet til TTY-tilstanden HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Den anden enhed har skiftet til TTY-tilstanden VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon for fingeraftryk"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"administrer hardware til ansigtsgenkendelse"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"administrere hardware til ansigtslås"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Tillader, at appen kan bruge metoder til at tilføje og slette ansigtsskabeloner."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"brug hardware til ansigtsgenkendelse"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Tillader, at appen bruger ansigtsgenkendelseshardware til godkendelse"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Ansigtsgodkendelse"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"bruge hardware til ansigtslås"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Tillader, at appen bruger hardware til ansigtslås til godkendelse"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Ansigtslås"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Registrer dit ansigt igen"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Registrer dit ansigt igen for at forbedre genkendelsen af det"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Der blev ikke registreret ansigtsdata. Prøv igen."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Flyt telefonen til venstre."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Flyt telefonen til højre."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Kig mere direkte på din enhed."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Dit ansigt kan ikke registreres. Kig på telefonen."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Sørg for, at dit ansigt er direkte foran telefonen."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Der er for meget bevægelse. Hold telefonen stille."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registrer dit ansigt igen."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ansigtet kan ikke længere genkendes. Prøv igen."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Du skal ikke dreje hovedet så meget."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Du skal ikke dreje hovedet så meget."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Hvis noget skjuler dit ansigt, skal du fjerne det."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Rens sensoren ved skærmens øverste kant."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Rengør toppen af din skærm, inkl. den sorte bjælke"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Ansigt ikke bekræftet. Hardware ikke tilgængelig."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Prøv ansigtsgodkendelse igen."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Prøv ansigtslås igen."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Der kan ikke gemmes nye ansigtsdata. Slet et gammelt først."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Ansigtshandlingen blev annulleret"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Ansigtsgodkendelsen blev annulleret af brugeren"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Ansigtshandlingen blev annulleret."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Ansigtslås blev annulleret af brugeren."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Du har prøvet for mange gange. Prøv igen senere."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"For mange forsøg. Ansigtsgodkendelse er deaktiveret."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Du har brugt for mange forsøg. Ansigtslås er deaktiveret."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Ansigtet kan ikke genkendes. Prøv igen."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Du har ikke konfigureret ansigtsgodkendelse"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Ansigtsgodkendelse understøttes ikke på denne enhed"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Du har ikke konfigureret ansigtslås."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Ansigtslås understøttes ikke på denne enhed."</string> <string name="face_name_template" msgid="7004562145809595384">"Ansigt <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 9c6fc1631956..ebca5d4faf2e 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mailboxnachrichten"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"WLAN-Telefonie"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Status der SIM-Karte"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Benachrichtigungen mit hoher Priorität von der SIM-Karte"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Peer hat TTY-Modus \"Vollständig\" angefordert."</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Peer hat TTY-Modus \"HCO\" angefordert."</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Peer hat TTY-Modus \"VC\" angefordert."</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerabdruck-Symbol"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"Gesichtserkennungshardware verwalten"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"Face Unlock-Hardware verwalten"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Ermöglicht der App, Gesichtsvorlagen hinzuzufügen oder zu entfernen."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"Gesichtserkennungshardware verwenden"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Ermöglicht der App, für die Authentifizierung Gesichtserkennungshardware zu verwenden"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Gesichtserkennung"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"Face Unlock-Hardware verwenden"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Ermöglicht der App, zu Authentifizierungszwecken Face Unlock-Hardware zu verwenden"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Face Unlock"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Gesicht neu scannen lassen"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Für bessere Erkennung Gesicht neu scannen lassen"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Gesichtsdaten nicht gut erfasst. Erneut versuchen."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Beweg das Smartphone nach links."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Beweg das Smartphone nach rechts."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Bitte sieh direkt auf dein Gerät."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Gesicht wurde nicht gefunden. Blicke aufs Telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Halte dein Gesicht direkt vor dein Smartphone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Zu viel Unruhe. Halte das Smartphone ruhig."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Bitte registriere dein Gesicht noch einmal."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Gesicht wird nicht mehr erkannt. Erneut versuchen."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Neig den Kopf etwas weniger stark."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Neig den Kopf etwas weniger stark."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Entferne alles, was dein Gesicht verdeckt."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Reinige den Sensor am oberen Rand des Bildschirms."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Reinige den oberen Teil deines Bildschirms, einschließlich der schwarzen Leiste"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Gesicht nicht erkannt. Hardware nicht verfügbar."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Gesichtserkennung noch einmal versuchen."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Face Unlock noch einmal versuchen."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Kein Speicherplatz frei. Bitte erst ein Gesicht löschen."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Gesichtserkennung abgebrochen"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Gesichtserkennung vom Nutzer abgebrochen"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Gesichtserkennung abgebrochen."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Face Unlock vom Nutzer abgebrochen."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Zu viele Versuche, bitte später noch einmal versuchen"</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Zu viele Versuche. Die Gesichtserkennung wurde deaktiviert."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Zu viele Versuche. Face Unlock wurde deaktiviert."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Gesichtsprüfung nicht möglich. Noch mal versuchen."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Die Gesichtserkennung ist nicht eingerichtet"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Gesichtserkennung wird auf diesem Gerät nicht unterstützt"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Face Unlock ist nicht eingerichtet."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Face Unlock wird auf diesem Gerät nicht unterstützt."</string> <string name="face_name_template" msgid="7004562145809595384">"Gesicht <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 766b2ead6d32..d74bc5951d5e 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Μηνύματα αυτόματου τηλεφωνητή"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Κλήση Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Κατάσταση SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Κατάσταση SIM υψηλής προτεραιότητας"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Αίτημα peer για TTY ΠΛΗΡΗΣ Λειτουργία"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Αίτημα peer για TTY Λειτουργία HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Αίτημα peer για TTY Λειτουργία VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"διαχείριση υλικολογισμ. ελέγχου ταυτότ. προσώπου"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"διαχείριση εξοπλισμού Face Unlock"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Επιτρέπει στην εφαρμογή να επικαλείται μεθόδους προσθήκης/διαγραφής προτύπων για χρήση."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"χρήση υλικολογισμικού ελέγχου ταυτότητας προσώπου"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Επιτρέπει στην εφαρμογή να χρησιμοποιεί υλικολογισμικό για έλεγχο ταυτότητας"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Έλεγχος ταυτότητας προσώπου"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"χρήση εξοπλισμού Face Unlock"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Επιτρέπει στην εφαρμογή να χρησιμοποιεί εξοπλισμό Face Unlock για έλεγχο ταυτότητας"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Face Unlock"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Εγγράψτε ξανά το πρόσωπό σας"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Για να βελτιώσετε την αναγνώριση, εγγράψτε ξανά το πρόσωπό σας"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Αδύνατη λήψη ακριβών δεδομ. προσώπου. Επανάληψη."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Μετακινήστε το τηλέφωνο στα αριστερά."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Μετακινήστε το τηλέφωνο στα δεξιά."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Κοιτάξτε απευθείας τη συσκευή σας."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Δεν εντοπίστηκε το πρόσωπό σας. Δείτε το τηλέφωνο."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Στρέψτε το πρόσωπό σάς απευθείας στο τηλέφωνο."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Πάρα πολλή κίνηση. Κρατήστε σταθερό το τηλέφωνο."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Καταχωρίστε ξανά το πρόσωπό σας."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Αδύνατη η αναγνώριση του προσώπου. Επανάληψη."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Στρέψτε λιγότερο το κεφάλι σας."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Στρέψτε λιγότερο το κεφάλι σας."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Απομακρύνετε οτιδήποτε κρύβει το πρόσωπό σας."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Καθαρίστε τον αισθητήρα επάνω στην οθόνη."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Καθαρίστε το επάνω μέρος της οθόνης σας, συμπεριλαμβανομένης της μαύρης γραμμής"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Αδύν. επαλήθ. προσώπου. Μη διαθέσιμος εξοπλισμός."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Επαναλάβετε τον έλεγχο ταυτότητας προσώπου."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Δοκιμάστε ξανά το Face Unlock."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Η αποθήκ. νέων δεδομ. προσώπ. είναι αδύν. Διαγρ. ένα παλιό."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Η λειτουργία προσώπου ακυρώθηκε"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Ο έλεγχ. ταυτότ. προσώπου ακυρώθηκε από τον χρήστη"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Η ενέργεια προσώπου ακυρώθηκε."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Το Face Unlock ακυρώθηκε από τον χρήστη."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά αργότερα."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Υπερβ. πολλές προσπάθειες. Ο έλεγχ. ταυτ. προσώπου απενεργ."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Υπερβολικά πολλές προσπάθειες. Το Face Unlock απενεργοποιήθηκε."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Αδύνατη επαλήθευση του προσώπου. Επανάληψη."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Δεν έχετε ρυθμίσει τον έλεγχο ταυτότητας προσώπου"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Ο έλεγχος ταυτότητας προσώπου δεν υποστηρίζεται στη συσκευή"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Δεν έχετε ρυθμίσει το Face Unlock."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Το Face Unlock δεν υποστηρίζεται σε αυτήν τη συσκευή."</string> <string name="face_name_template" msgid="7004562145809595384">"Πρόσωπο <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 9ca98f308dc2..f5a5698b5b61 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi Calling"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"High priority SIM status"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerprint icon"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"manage face authentication hardware"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"manage Face Unlock hardware"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Face Authentication"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"use Face Unlock hardware"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Allows the app to use Face Unlock hardware for authentication"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Face unlock"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Re-enrol your face"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"To improve recognition, please re-enrol your face"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Couldn’t capture accurate face data. Try again."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move phone to the left."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move phone to the right."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Please look more directly at your device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Can’t see your face. Look at the phone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Position your face directly in front of the phone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Too much motion. Hold phone steady."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No longer able to recognise face. Try again."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Turn your head a little less."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Turn your head a little less."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Remove anything hiding your face."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Clean the sensor at the top edge of the screen."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Clean the top of your screen, including the black bar"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Can’t verify face. Hardware not available."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Try face authentication again."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Try Face Unlock again."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Can’t store new face data. Delete an old one first."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Face operation cancelled"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Face authentication cancelled by user"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Face Unlock cancelled by user."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Too many attempts. Face authentication disabled."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Too many attempts. Face Unlock disabled."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Can’t verify face. Try again."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"You haven’t set up face authentication"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Face authentication is not supported on this device"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"You haven’t set up Face Unlock."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Face Unlock is not supported on this device."</string> <string name="face_name_template" msgid="7004562145809595384">"Face <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 4da6381a2887..47318862c76f 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi Calling"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"High priority SIM status"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerprint icon"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"manage face authentication hardware"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"manage Face Unlock hardware"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Face Authentication"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"use Face Unlock hardware"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Allows the app to use Face Unlock hardware for authentication"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Face unlock"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Re-enrol your face"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"To improve recognition, please re-enrol your face"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Couldn’t capture accurate face data. Try again."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move phone to the left."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move phone to the right."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Please look more directly at your device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Can’t see your face. Look at the phone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Position your face directly in front of the phone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Too much motion. Hold phone steady."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No longer able to recognise face. Try again."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Turn your head a little less."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Turn your head a little less."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Remove anything hiding your face."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Clean the sensor at the top edge of the screen."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Clean the top of your screen, including the black bar"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Can’t verify face. Hardware not available."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Try face authentication again."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Try Face Unlock again."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Can’t store new face data. Delete an old one first."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Face operation cancelled"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Face authentication cancelled by user"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Face Unlock cancelled by user."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Too many attempts. Face authentication disabled."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Too many attempts. Face Unlock disabled."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Can’t verify face. Try again."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"You haven’t set up face authentication"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Face authentication is not supported on this device"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"You haven’t set up Face Unlock."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Face Unlock is not supported on this device."</string> <string name="face_name_template" msgid="7004562145809595384">"Face <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 9ca98f308dc2..f5a5698b5b61 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi Calling"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"High priority SIM status"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerprint icon"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"manage face authentication hardware"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"manage Face Unlock hardware"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Face Authentication"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"use Face Unlock hardware"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Allows the app to use Face Unlock hardware for authentication"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Face unlock"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Re-enrol your face"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"To improve recognition, please re-enrol your face"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Couldn’t capture accurate face data. Try again."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move phone to the left."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move phone to the right."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Please look more directly at your device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Can’t see your face. Look at the phone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Position your face directly in front of the phone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Too much motion. Hold phone steady."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No longer able to recognise face. Try again."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Turn your head a little less."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Turn your head a little less."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Remove anything hiding your face."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Clean the sensor at the top edge of the screen."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Clean the top of your screen, including the black bar"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Can’t verify face. Hardware not available."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Try face authentication again."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Try Face Unlock again."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Can’t store new face data. Delete an old one first."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Face operation cancelled"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Face authentication cancelled by user"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Face Unlock cancelled by user."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Too many attempts. Face authentication disabled."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Too many attempts. Face Unlock disabled."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Can’t verify face. Try again."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"You haven’t set up face authentication"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Face authentication is not supported on this device"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"You haven’t set up Face Unlock."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Face Unlock is not supported on this device."</string> <string name="face_name_template" msgid="7004562145809595384">"Face <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 9ca98f308dc2..f5a5698b5b61 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi Calling"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"High priority SIM status"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerprint icon"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"manage face authentication hardware"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"manage Face Unlock hardware"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Face Authentication"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"use Face Unlock hardware"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Allows the app to use Face Unlock hardware for authentication"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Face unlock"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Re-enrol your face"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"To improve recognition, please re-enrol your face"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Couldn’t capture accurate face data. Try again."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move phone to the left."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move phone to the right."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Please look more directly at your device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Can’t see your face. Look at the phone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Position your face directly in front of the phone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Too much motion. Hold phone steady."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No longer able to recognise face. Try again."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Turn your head a little less."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Turn your head a little less."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Remove anything hiding your face."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Clean the sensor at the top edge of the screen."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Clean the top of your screen, including the black bar"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Can’t verify face. Hardware not available."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Try face authentication again."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Try Face Unlock again."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Can’t store new face data. Delete an old one first."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Face operation cancelled"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Face authentication cancelled by user"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Face operation cancelled."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Face Unlock cancelled by user."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Too many attempts. Face authentication disabled."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Too many attempts. Face Unlock disabled."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Can’t verify face. Try again."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"You haven’t set up face authentication"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Face authentication is not supported on this device"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"You haven’t set up Face Unlock."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Face Unlock is not supported on this device."</string> <string name="face_name_template" msgid="7004562145809595384">"Face <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index 71946ee5a566..95ebcdc8c603 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi calling"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"High priority SIM status"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingerprint icon"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"manage face authentication hardware"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"manage face unlock hardware"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Allows the app to invoke methods to add and delete facial templates for use."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"use face authentication hardware"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Allows the app to use face authentication hardware for authentication"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Face Authentication"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"use face unlock hardware"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Allows the app to use face unlock hardware for authentication"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Face unlock"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Re-enroll your face"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"To improve recognition, please re-enroll your face"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Couldn’t capture accurate face data. Try again."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move phone to the left."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move phone to the right."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Please look more directly at your device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Can’t see your face. Look at the phone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Position your face directly in front of the phone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Too much motion. Hold phone steady."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Please re-enroll your face."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No longer able to recognize face. Try again."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Turn your head a little less."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Turn your head a little less."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Remove anything hiding your face."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Clean the sensor at the top edge of the screen."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Clean the top of your screen, including the black bar"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Can’t verify face. Hardware not available."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Try face authentication again."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Try face unlock again."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Can’t store new face data. Delete an old one first."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Face operation canceled"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Face authentication canceled by user"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Face operation canceled."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Face unlock canceled by user."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Too many attempts. Try again later."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Too many attempts. Face authentication disabled."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Too many attempts. Face unlock disabled."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Can’t verify face. Try again."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"You haven’t set up face authentication"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Face authentication is not supported on this device"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"You haven’t set up face unlock."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Face unlock is not supported on this device."</string> <string name="face_name_template" msgid="7004562145809595384">"Face <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 2b56aa6be780..7a22a8e454a1 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensajes del buzón de voz"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Llamada con Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Estado de SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Notificaciones de prioridad alta sobre el estado de la SIM"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"El dispositivo del mismo nivel solicitó el modo TTY FULL."</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"El dispositivo del mismo nivel solicitó el modo TTY HCO."</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"El dispositivo del mismo nivel solicitó el modo TTY VCO."</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ícono de huella digital"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"administrar el hardware de autenticación facial"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"administrar el hardware de Desbloqueo facial"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que la app emplee métodos para agregar y borrar plantillas de rostros para su uso."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar el hardware de autenticación facial"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que la app use el hardware de autenticación facial para reconocerte"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autenticación facial"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"usar el hardware de Desbloqueo facial"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Permite que la app use el hardware de Desbloqueo facial con fines de autenticación"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Desbloqueo facial"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Vuelve a registrar tu rostro"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Para mejorar el reconocimiento, vuelve a registrar tu rostro"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Datos faciales imprecisos. Vuelve a intentarlo."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mueve el teléfono hacia la izquierda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mueve el teléfono hacia la derecha."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Mira directamente al dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"No se ve tu cara. Mira el teléfono."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Ubica el rostro directamente frente al teléfono."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Te estás moviendo demasiado. No muevas el teléfono"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Vuelve a registrar tu cara."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ya no se reconoce la cara. Vuelve a intentarlo."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Gira la cabeza un poco menos."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Gira la cabeza un poco menos."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Quítate cualquier objeto que te cubra el rostro."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Limpiar sensor del borde superior de la pantalla."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Limpia la parte superior de la pantalla, incluida la barra negra"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"No se verificó el rostro. Hardware no disponible."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Vuelve a realizar la autenticación de rostro."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Vuelve a probar el Desbloqueo facial."</string> <string name="face_error_no_space" msgid="2712120617457553825">"No hay espacio para datos faciales nuevos. Borra uno viejo."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Se canceló el reconocimiento facial"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"El usuario canceló la autenticación facial"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Se canceló el reconocimiento facial."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"El usuario canceló el Desbloqueo facial."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Demasiados intentos. Inténtalo de nuevo más tarde."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Demasiados intentos. Se inhabilitó la autenticación facial."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Demasiados intentos. Se inhabilitó el Desbloqueo facial."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"No se pudo verificar la cara. Vuelve a intentarlo."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"No configuraste la autenticación facial"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"No se admite la autenticación facial en este dispositivo"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"No configuraste el Desbloqueo facial."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"No se admite el Desbloqueo facial en este dispositivo."</string> <string name="face_name_template" msgid="7004562145809595384">"Rostro <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 7a31b1af781f..ae7f38a18986 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensajes de voz"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Llamada por Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Estado de la tarjeta SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Estado de SIM de alta prioridad"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Un dispositivo ha solicitado el modo TTY FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Un dispositivo ha solicitado el modo TTY HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Un dispositivo ha solicitado el modo TTY VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icono de huella digital"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"gestionar el hardware de autenticación facial"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"gestionar el hardware de desbloqueo facial"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que la app use métodos para añadir y suprimir plantillas de caras para su uso."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar el hardware de autenticación facial"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que la aplicación utilice el hardware de autenticación facial para autenticarte"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autenticación facial"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"Utilizar hardware de desbloqueo facial"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Permite que la aplicación utilice el hardware de desbloqueo facial para autenticarte"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Desbloqueo facial"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Volver a registrar la cara"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Para mejorar el reconocimiento, vuelve a registrar tu cara"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Datos faciales no reconocidos. Vuelve a intentarlo."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mueve el teléfono hacia la izquierda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mueve el teléfono hacia la derecha."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Mira de forma más directa al dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"No se detecta tu cara. Mira al teléfono."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Coloca la cara directamente frente al teléfono."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"El teléfono se mueve demasiado. Mantenlo quieto."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Vuelve a registrar tu cara."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"No puede reconocer tu cara. Vuelve a intentarlo."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Gira la cabeza un poco menos."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"No gires tanto la cabeza."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Retira cualquier objeto que te tape la cara."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Limpia el sensor situado en la parte superior."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Limpia la parte superior de la pantalla, incluida la barra de color negro"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"No se puede verificar. Hardware no disponible."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Vuelve a probar la autenticación facial."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Vuelve a probar el desbloqueo facial."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Para guardar nuevos datos faciales, borra otros antiguos."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Se ha cancelado el reconocimiento facial"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"El usuario ha cancelado la autenticación facial"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Se ha cancelado el reconocimiento facial."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"El usuario ha cancelado el desbloqueo facial."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Demasiados intentos. Inténtalo de nuevo más tarde."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Muchos intentos. Se ha inhabilitado la autenticación facial."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Muchos intentos. Se ha inhabilitado el desbloqueo facial."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"No se ha verificado tu cara. Vuelve a intentarlo."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"No has configurado la autenticación facial"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Autenticación facial no disponible en este dispositivo"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"No has configurado el desbloqueo facial."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"El desbloqueo facial no está disponible en este dispositivo."</string> <string name="face_name_template" msgid="7004562145809595384">"Cara <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 3f37768e9b3d..d3404a646301 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Kõnepostisõnumid"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"WiFi-kõned"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-kaardi olek"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Kõrge prioriteediga SIM-i olek"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Partner taotles TTY-režiimi TÄIELIK"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Partner taotles TTY-režiimi HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Partner taotles TTY-režiimi VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Sõrmejälje ikoon"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"hallata näo autentimise riistvara"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"hallata Face Unlocki riistvara"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Lubab rakendusel tühistada meetodid kasutatavate näomallide lisamiseks ja kustutamiseks."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"kasutada näo autentimise riistvara"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Võimaldab rakendusel autentimiseks kasutada näo autentimise riistvara"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Näo autentimine"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"kasutada Face Unlocki riistvara"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Võimaldab rakendusel autentimiseks kasutada Face Unlocki riistvara"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Face Unlock"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Registreerige oma nägu uuesti"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Tuvastamise parandamiseks registreerige oma nägu uuesti"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Näoandmeid ei saanud jäädvustada. Proovige uuesti."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Liigutage telefoni vasakule."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Liigutage telefoni paremale."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Vaadake otse oma seadmesse."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Teie nägu ei ole näha. Vaadake telefoni poole."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Hoidke oma nägu otse telefoni ees."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Liiga palju liikumist. Hoidke telefoni paigal."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registreerige oma nägu uuesti."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Nägu ei õnnestu enam tuvastada. Proovige uuesti."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Pöörake oma pead veidi vähem."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Pöörake oma pead veidi vähem."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Eemaldage kõik, mis varjab teie nägu."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Puhastage ekraani ülaservas olev andur."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Puhastage ekraani ülaosa, sh musta värvi riba"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Nägu ei saa kinnitada. Riistvara pole saadaval."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Proovige uuesti näo autentimist."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Proovige Face Unlocki uuesti."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Uue näo andmeid ei saa salvestada. Kustutage enne vanad."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Näo autentimise toiming tühistati"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Kasutaja tühistas näo autentimise"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Näotuvastuse toiming tühistati."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Kasutaja tühistas Face Unlocki."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Liiga palju katseid. Proovige hiljem uuesti."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Liiga palju katseid. Näo autentimine on keelatud."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Liiga palju katseid. Face Unlock on keelatud."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Nägu ei saa kinnitada. Proovige uuesti."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Näo autentimist ei ole seadistatud."</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Seade ei toeta näo autentimist"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Face Unlocki ei ole seadistatud."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Seade ei toeta Face Unlocki."</string> <string name="face_name_template" msgid="7004562145809595384">"Nägu <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index d6a770084cad..a2a1b37118ec 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Erantzungailuko mezuak"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi bidezko deiak"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIMaren egoera"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"SIM txartelaren lehentasun handiko jakinarazpenak"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Beste gailuak TTY osagarria FULL moduan erabiltzea eskatu du"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Beste gailuak TTY osagarria HCO moduan erabiltzea eskatu du"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Beste gailuak TTY osagarria VCO moduan erabiltzea eskatu du"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Hatz-markaren ikonoa"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"kudeatu aurpegi bidez autentifikatzeko hardwarea"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"kudeatu aurpegiaren bidez desblokeatzeko hardwarea"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Aurpegi-txantiloiak gehitu eta ezabatzeko metodoei dei egitea baimentzen dio aplikazioari."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"erabili aurpegi bidez autentifikatzeko hardwarea"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Aurpegi bidez autentifikatzeko hardwarea erabiltzea baimentzen dio aplikazioari"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Aurpegi bidezko autentifikazioa"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"erabili aurpegiaren bidez desblokeatzeko hardwarea"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Autentifikazioa egiteko aurpegiaren bidez desblokeatzeko hardwarea erabiltzeko baimena ematen dio aplikazioari"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Aurpegiaren bidez desblokeatzeko aukera"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Erregistratu aurpegia berriro"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Ezagutzea hobetzeko, erregistratu aurpegia berriro"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Ezin izan dira bildu argazkiaren datu zehatzak. Saiatu berriro."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mugitu telefonoa ezkerretara."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mugitu telefonoa eskuinetara."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Begiratu zuzenago gailuari."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ez da hautematen aurpegia. Begiratu telefonoari."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Ipini aurrez aurre aurpegia eta telefonoa."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Mugimendu gehiegi dago. Eutsi tinko telefonoari."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Erregistratu berriro aurpegia."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ez dugu ezagutzen aurpegi hori. Saiatu berriro."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Biratu burua pixka bat gutxiago."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Biratu burua pixka bat gutxiago."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Kendu aurpegia estaltzen dizuten gauzak."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Garbitu pantailaren goiko ertzeko sentsorea."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Garbitu pantailaren goialdea, barra beltza barne"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Ezin da egiaztatu aurpegia. Hardwarea ez dago erabilgarri."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Saiatu berriro aurpegi bidez autentifikatzen"</string> + <string name="face_error_timeout" msgid="981512090365729465">"Saiatu berriro aurpegiaren bidez desblokeatzen."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Ezin dira gorde aurpegiaren datu berriak. Ezabatu zaharrak."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Utzi da aurpegi bidezko eragiketa"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Erabiltzaileak utzi du aurpegi bidezko autentifikazioa"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Utzi da aurpegiaren bidezko eragiketa."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Erabiltzaileak bertan behera utzi du aurpegiaren bidez desblokeatzea."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Saiakera gehiegi egin dituzu. Saiatu berriro geroago."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Saiakera gehiegi egin dira. Desgaitu egin da aurpegi bidezko autentifikazioa."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Saiakera gehiegi egin dira. Aurpegiaren bidez desblokeatzeko aukera desgaitu egin da."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Ezin da egiaztatu aurpegia. Saiatu berriro."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Ez duzu konfiguratu aurpegi bidezko autentifikazioa"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Gailu honek ez du onartzen aurpegi bidezko autentifikazioa"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Ez duzu konfiguratu aurpegiaren bidez desblokeatzeko aukera."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Gailu honek ez du onartzen aurpegiaren bidez desblokeatzea."</string> <string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g> aurpegia"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index c1fc07453a98..7d86be9a8ecd 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"پیامهای پست صوتی"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"تماس ازطریق Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"وضعیت سیمکارت"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"وضعیت سیم با اولویت بالا"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"دستگاه مرتبط درخواست TTY حالت FULL کرد"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"دستگاه مرتبط درخواست TTY حالت HCO کرد"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"دستگاه مرتبط درخواست TTY حالت VCO کرد"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"نماد اثر انگشت"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"مدیریت سختافزار احراز هویت با چهره"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"مدیریت سختافزار «بازگشایی با چهره»"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"به برنامه امکان میدهد روشهایی را برای افزودن و حذف الگوهای چهره جهت استفاده فرابخواند."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"استفاده از سختافزار احراز هویت با چهره"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"به برنامه امکان میدهد از سختافزار احراز هویت با چهره برای احراز هویت استفاده کند"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"احراز هویت با چهره"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"استفاده از سختافزار «بازگشایی با چهره»"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"به برنامه امکان میدهد از سختافزار «بازگشایی با چهره» برای احراز هویت استفاده کند"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"بازگشایی با چهره"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"ثبت مجدد چهره"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"برای بهبود تشخیص، لطفاً چهرهتان را دوباره ثبت کنید"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"دادههای دقیق چهره ضبط نشد. دوباره امتحان کنید."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"تلفن را بهسمت چپ حرکت دهید."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"تلفن را به سمت راست حرکت دهید."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"لطفاً مستقیم به دستگاه نگه کنید."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"چهرهتان دیده نمیشود. به تلفن نگاه کنید."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"صورتتان را مستقیماً روبروی تلفن قرار دهید."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"حرکت خیلی زیاد است. تلفن را ثابت نگهدارید."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"لطفاً چهرهتان را مجدداً ثبت کنید."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"دیگر چهره را تشخیص نمیدهد. دوباره امتحان کنید."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"سرتان را کمی پایین آورید."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"سرتان را کمی پایین آورید."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"هرچیزی را که حائل چهرهتان است بردارید."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"حسگر واقع در لبه بالای صفحه را تمیز کنید."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"بالای صفحه و همچنین نوار مشکی را تمیز کنید."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"چهره تأیید نشد. سختافزار در دسترس نیست."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"احراز هویت با چهره با دوباره امتحان کنید."</string> + <string name="face_error_timeout" msgid="981512090365729465">"«بازگشایی با چهره» را دوباره امتحان کنید."</string> <string name="face_error_no_space" msgid="2712120617457553825">"داده چهره جدید ذخیره نشد. اول داده چهره قدیمی را حذف کنید."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"عملیات شناسایی چهره لغو شد"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"احراز هویت چهره توسط کاربر لغو شد"</string> + <string name="face_error_canceled" msgid="283945501061931023">"عملیات شناسایی چهره لغو شد."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"کاربر «بازگشایی با چهره» را لغو کرد."</string> <string name="face_error_lockout" msgid="3407426963155388504">"تعداد زیادی تلاش ناموفق. بعداً دوباره امتحان کنید."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"تعداد تلاشها بیشازحد مجاز است. احرازهویت چهره غیرفعال شد."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"تعداد تلاشها بیشازحد مجاز است. «بازگشایی با چهره» غیرفعال است."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"چهره تأیید نشد. دوباره امتحان کنید."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"احراز هویت چهره راهاندازی نشده است"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"احراز هویت چهره در این دستگاه پشتیبانی نمیشود."</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"«بازگشایی با چهره» را راهاندازی نکردهاید."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"«بازگشایی با چهره» در این دستگاه پشتیبانی نمیشود."</string> <string name="face_name_template" msgid="7004562145809595384">"چهره <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 6181a2715877..0a6132d10a85 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Vastaajaviestit"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-puhelut"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-kortin tila"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Tärkeät SIM-ilmoitukset"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Toinen käyttäjä vaihtoi TTY-tilaksi TÄYSI"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Toinen käyttäjä vaihtoi TTY-tilaksi HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Toinen käyttäjä vaihtoi TTY-tilaksi VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Sormenjälkikuvake"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"hallinnoida kasvojentodennuslaitteistoa"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"hallinnoida Face Unlock ‑laitteistoa"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Sallii sovelluksen käyttää menetelmiä, joilla voidaan lisätä tai poistaa kasvomalleja."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"käyttää kasvojentodennuslaitteistoa"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Sallii sovelluksen käyttää todennuslaitteistoa todennukseen"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Kasvojentunnistus"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"käyttää Face Unlock ‑laitteistoa"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Sallii sovelluksen käyttää Face Unlock ‑laitteistoa todennukseen"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Face Unlock"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Lisää kasvot uudelleen"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Lisää kasvosi uudelleen tunnistamisen parantamiseksi"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Tarkan kasvodatan tallennus epäonnistui. Yritä uudelleen."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Siirrä puhelinta vasemmalle."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Siirrä puhelinta oikealle."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Katso suoremmin laitteeseen."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Kasvojasi ei näy. Katso puhelinta."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Aseta kasvosi suoraan puhelimen eteen."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Laite liikkui liikaa. Pidä puhelin vakaana."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Rekisteröi kasvot uudelleen."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ei enää tunnista kasvoja. Yritä uudelleen."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Käännä päätä vähän vähemmän."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Käännä päätä vähän vähemmän."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Poista esteet kasvojesi edestä."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Puhdista näytön yläreunassa oleva anturi."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Puhdista näytön yläreuna, mukaan lukien musta palkki"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Kasvoja ei voi vahvistaa. Laitteisto ei käytettäv."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Yritä kasvojentunnistusta uudelleen."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Yritä käyttää Face Unlockia uudelleen."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Uutta kasvodataa ei voi tallentaa. Poista ensin vanhaa."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Kasvotoiminto peruutettu"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Käyttäjä peruutti kasvojentunnistuksen"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Kasvotoiminto peruutettu"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Käyttäjä peruutti Face Unlockin."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Liian monta yritystä. Yritä myöhemmin uudelleen."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Liian monta yritystä. Kasvojentunnistus poistettu käytöstä."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Liian monta yritystä. Face Unlock poistettu käytöstä."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Kasvoja ei voi vahvistaa. Yritä uudelleen."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Et ole määrittänyt kasvojentunnistusta"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Tämä laite ei tue kasvojentunnistusta."</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Et ole määrittänyt Face Unlockia."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Tämä laite ei tue Face Unlockia."</string> <string name="face_name_template" msgid="7004562145809595384">"Kasvot <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 3905c861ce5d..8d12675b833d 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Messages vocaux"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Appels Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"État de la carte SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"État SIM de priorité élevée"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Mode TTY COMPLET demandé par un pair"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Mode TTY HCO demandé par un pair"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Mode TTY VCO demandé par un pair"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icône d\'empreinte digitale"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"gérer le matériel d\'authentification de visage"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"gérer le matériel de déverrouillage par reconnaissance faciale"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Permet à l\'appli d\'employer des méthodes d\'aj. et de suppr. de modèles de reconn. visage."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"utiliser le matériel d\'authentification de visage"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permet à l\'appli d\'utiliser du matériel de reconnaissance du visage pour l\'authentification"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Authentification du visage"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"utiliser le matériel de déverrouillage par reconnaissance faciale"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Permet à l\'appli d\'utiliser du matériel de déverr. par reconn faciale pour l\'authentific."</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Déverrouillage par reconnaissance faciale"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Inscrivez votre visage à nouveau"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Pour améliorer la reconnaissance, veuillez enregistrer à nouveau votre visage"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Imposs. capt. données visage précises. Réessayez."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Déplacez le téléphone vers la gauche."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Déplacez le téléphone vers la droite."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Veuillez regarder plus directement votre appareil."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Visage non détecté. Regardez le téléphone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Placez votre visage directement devant le téléphone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Trop de mouvement. Tenez le téléphone immobile."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Veuillez inscrire votre visage à nouveau."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ce visage ne sera plus reconnu. Réessayez."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Tournez un peu moins votre tête."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Tournez un peu moins votre tête."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Retirez tout ce qui pourrait couvrir votre visage."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Nettoyez le capteur dans le haut de l\'écran."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Nettoyez le haut de l\'écran, y compris la barre noire"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Imposs. de vérif. visage. Matériel non accessible."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Réessayez l\'authentification du visage."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Réessayez le déverr. par reconnaissance faciale."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Impossible de stocker de nouveaux visages. Supprimez-en un."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Opération de reconnaissance du visage annulée"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Authentification du visage annulée par l\'utilisateur"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Opération de reconnaissance du visage annulée."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Déverr. par reconn. faciale annulé par l\'utilisateur."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Trop de tentatives. Veuillez réessayer plus tard."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Trop de tentatives. Authentification du visage désactivée."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Trop de tentatives. Le déverr. par reconnaissance faciale est désactivé."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Impossible de vérifier le visage. Réessayez."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Vous n\'avez pas configuré l\'authentific. du visage"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Cet appareil ne prend pas en charge l\'authentific. du visage"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Vous n\'avez pas config. le déverr. par reconn. faciale."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Cet appar. ne prend pas en charge le déverr. par reconn. faciale."</string> <string name="face_name_template" msgid="7004562145809595384">"Visage <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 5b6881487546..c1cac17bbb74 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Messages vocaux"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Appels Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"État de la carte SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Notifications prioritaires de la carte SIM"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Mode TTY demandé par l\'interlocuteur : COMPLET"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Mode TTY demandé par l\'interlocuteur : HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Mode TTY demandé par l\'interlocuteur : VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icône d\'empreinte digitale"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"gérer le matériel d\'authentification faciale"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"gérer les composants de Face Unlock"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Autorise l\'appli à invoquer des méthodes pour ajouter et supprimer des modèles de visages."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"utiliser le matériel d\'authentification faciale"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Autorise l\'appli à utiliser le matériel d\'authentification faciale pour l\'authentification"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Authentification faciale"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"utiliser les composants de Face Unlock"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Autorise l\'application à utiliser les composants de Face Unlock pour l\'authentification"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Face Unlock"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Enregistrer à nouveau votre visage"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Pour améliorer la reconnaissance, veuillez enregistrer à nouveau votre visage"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Capture du visage impossible. Réessayez."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Déplacez le téléphone vers la gauche."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Déplacez le téléphone vers la droite."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Veuillez regarder plus directement l\'appareil."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Visage non détecté. Regardez le téléphone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Placez votre visage en face du téléphone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Trop de mouvement. Ne bougez pas le téléphone."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Veuillez enregistrer à nouveau votre visage."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Impossible de reconnaître le visage. Réessayez."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Tournez un peu moins la tête."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Tournez un peu moins la tête."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Retirez tout ce qui cache votre visage."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Nettoyez le capteur en haut de l\'écran."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Nettoyez la partie supérieure de l\'écran, y compris la barre noire"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Imposs. valider visage. Matériel non disponible."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Réessayez d\'activer l\'authentification faciale."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Réessayez d\'activer Face Unlock."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Impossible stocker nouv. visages. Veuillez en supprimer un."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Opération de reconnaissance faciale annulée"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Authentification faciale annulée par l\'utilisateur"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Opération de reconnaissance faciale annulée."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Face Unlock annulé par l\'utilisateur."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Trop de tentatives. Réessayez plus tard."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Trop de tentatives. Authentification faciale désactivée."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Tentatives trop nombreuses. Désactivation de Face Unlock."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Impossible de valider votre visage. Réessayez."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"L\'authentification faciale n\'est pas configurée"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Appareil incompatible avec l\'authentification faciale"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Face Unlock n\'est pas configuré."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Face Unlock n\'est pas compatible avec cet appareil."</string> <string name="face_name_template" msgid="7004562145809595384">"Visage <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 7b70ea931f7a..6bdf045de2b6 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensaxes de correo de voz"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas por wifi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Estado da SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Estado da SIM con prioridade alta"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Outro dispositivo solicitou o modo TTY COMPLETO"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Outro dispositivo solicitou o modo TTY HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Outro dispositivo solicitou o modo TTY VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icona de impresión dixital"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"xestionar hardware de autenticación facial"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"xestionar o hardware de desbloqueo facial"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que a aplicación invoque métodos para engadir e eliminar modelos faciais de uso."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar hardware de autenticación facial"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que a aplicación utilice hardware facial para a autenticación"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autenticación facial"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"utilizar o hardware de desbloqueo facial"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Permite que a aplicación utilice o hardware de desbloqueo facial para a autenticación"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Desbloqueo facial"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Volve inscribir a túa cara"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Para mellorar o recoñecemento, inscribe de novo a túa cara"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Sen datos faciais exactos. Téntao de novo."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Move o teléfono cara á esquerda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Move o teléfono cara á dereita."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Mira o dispositivo de forma máis directa."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Non se ve a túa cara. Mira para o teléfono"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Coloca a cara directamente diante do teléfono."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Demasiado movemento. Non movas o teléfono."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Volve rexistrar a túa cara."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Xa non se pode recoñecer a cara. Téntao de novo."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Xira a cabeza un pouco menos."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Xira a cabeza un pouco menos."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Quita todo o que oculte a túa cara."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Limpa o sensor na parte superior da pantalla."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Limpa a parte superior da pantalla, incluída a barra de cor negra"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Sen verificar a cara. Hardware non dispoñible."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Tenta utilizar a autenticación facial de novo."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Tenta utilizar o desbloqueo facial de novo."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Para gardar novos datos faciais, elimina os antigos."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Cancelouse a operación relacionada coa cara"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"O usuario cancelou a autenticación facial"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Cancelouse a operación relacionada coa cara"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"O usuario cancelou o desbloqueo facial."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Demasiados intentos. Téntao de novo máis tarde."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Demasiados intentos. Desactivouse a autenticación facial."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Demasiados intentos. Desactivouse o desbloqueo facial."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Non se puido verificar a cara. Téntao de novo."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Non configuraches a autenticación facial"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Este dispositivo non é compatible coa autenticación facial"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Non configuraches o desbloqueo facial."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Este dispositivo non admite o desbloqueo facial."</string> <string name="face_name_template" msgid="7004562145809595384">"Cara <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index def64c507193..b2a9e781e2aa 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"વૉઇસમેઇલ સંદેશા"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"વાઇ-ફાઇ કૉલિંગ"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"સિમનું સ્ટેટસ"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"સિમ કાર્ડનું ઉચ્ચ પ્રાધાન્યતાનું સ્ટેટસ"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"પીઅરે TTY મોડ પૂર્ણની વિનંતી કરી"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"પીઅરે TTY મોડ HCO ની વિનંતી કરી"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"પીઅરે TTY મોડ VCO ની વિનંતી કરી"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ફિંગરપ્રિન્ટ આયકન"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"ચહેરા પ્રમાણીકરણના હાર્ડવેરને મેનેજ કરો"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"ફેસ અનલૉકના હાર્ડવેરને મેનેજ કરો"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"ઍપને ઉપયોગ માટે ચહેરાના નમૂના ઉમેરવા અને ડિલીટ કરવાની પદ્ધતિને રદ કરવાની મંજૂરી આપે છે."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ચહેરા પ્રમાણીકરણના હાર્ડવેરનો ઉપયોગ કરો"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ઍપને પ્રમાણીકરણ માટે ચહેરા પ્રમાણીકરણના હાર્ડવેરનો ઉપયોગ કરવાની મંજૂરી આપે છે"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"ચહેરાનું પ્રમાણીકરણ"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"ફેસ અનલૉક હાર્ડવેરનો ઉપયોગ કરો"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"ઍપને પ્રમાણીકરણ માટે ફેસ અનલૉકના હાર્ડવેરનો ઉપયોગ કરવાની મંજૂરી આપે છે"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"ફેસ અનલૉક"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"તમારા ચહેરાની ફરી નોંધણી કરાવો"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ઓળખવાની પ્રક્રિયાને બહેતર બનાવવા માટે કૃપા કરીને તમારા ચહેરાની ફરી નોંધણી કરાવો"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"ચહેરાનો સચોટ ડેટા કૅપ્ચર ન થયો. ફરી પ્રયાસ કરો."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ફોનને ડાબી બાજુ ખસેડો."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ફોનને જમણી બાજુ ખસેડો."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"કૃપા કરીને તમારા ડિવાઇસ તરફ સીધું જુઓ."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"તમારો ચહેરો દેખાતો નથી. ફોનની સામે જુઓ."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"તમારો ચહેરો તમારા ફોનની બિલકુલ સામે રાખો."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ડિવાઇસ અસ્થિર છે. ફોનને સ્થિર રાખો."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"કૃપા કરીને તમારા ચહેરાની ફરી નોંધણી કરાવો."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ચહેરો ઓળખી શકાતો નથી. ફરી પ્રયાસ કરો."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"તમારું માથું થોડું ફેરવો."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"તમારું માથું થોડું ઓછું ફેરવો."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"તમારા ચહેરાને છુપાવતી કંઈપણ વસ્તુ દૂર કરો."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"સ્ક્રીનની ટોચની ધાર પરના સેન્સરને સાફ કરો."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"કાળી પટ્ટી સહિત, તમારી સ્ક્રીનની ટોચ સાફ કરો"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"ચહેરો ચકાસી શકાતો નથી. હાર્ડવેર ઉપલબ્ધ નથી."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"ચહેરા પ્રમાણીકરણનો ફરીથી પ્રયાસ કરી જુઓ."</string> + <string name="face_error_timeout" msgid="981512090365729465">"ફેસ અનલૉકને ફરી અજમાવો."</string> <string name="face_error_no_space" msgid="2712120617457553825">"ચહેરાનો નવો ડેટા સ્ટોર કરી શકતાં નથી. પહેલા જૂનો ડિલીટ કરો."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"ચહેરા સંબંધિત પ્રક્રિયા રદ કરવામાં આવી છે"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"વપરાશકર્તાએ ચહેરાનું પ્રમાણીકરણ રદ કર્યુ"</string> + <string name="face_error_canceled" msgid="283945501061931023">"ચહેરા સંબંધિત કાર્યવાહી રદ કરવામાં આવી છે."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"વપરાશકર્તાએ ફેસ અનલૉક રદ કર્યું."</string> <string name="face_error_lockout" msgid="3407426963155388504">"ઘણા બધા પ્રયત્નો. થોડા સમય પછી ફરી પ્રયાસ કરો."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"ઘણા બધા પ્રયાસો. ચહેરાનું પ્રમાણીકરણ બંધ કરવામાં આવ્યું છે."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"ઘણા બધા પ્રયાસો. ફેસ અનલૉક બંધ કર્યું."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"ચહેરો ચકાસી શકાતો નથી. ફરી પ્રયાસ કરો."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"તમે ચહેરાના પ્રમાણીકરણનું સેટઅપ કર્યું નથી"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"આ ડિવાઇસ પર ચહેરાનું પ્રમાણીકરણ કરવાની સુવિધા નથી"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"તમે ફેસ અનલૉકનું સેટઅપ કર્યું નથી."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"આ ડિવાઇસ પર ફેસ અનલૉક કરવાની સુવિધા નથી."</string> <string name="face_name_template" msgid="7004562145809595384">"ચહેરાનું <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index ab5bfc287852..e1bfe5eb2721 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"वॉइसमेल संदेश"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"वाई-फ़ाई कॉलिंग"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"सिम की स्थिति"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"सिम की ज़रूरी सूचनाओं की स्थिति"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"पीयर ने टेलीटाइपराइटर (TTY) मोड फ़ुल का अनुरोध किया"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"पीयर ने टेलीटाइपराइटर (TTY) मोड एचसीओ (HCO) का अनुरोध किया"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"पीयर ने टेलीटाइपराइटर (TTY) मोड वीसीओ (VCO) का अनुरोध किया"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"फ़िंगरप्रिंट आइकॉन"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"चेहरे की पुष्टि करने वाला हार्डवेयर प्रबंधित करें"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"\'मालिक का चेहरा पहचानकर अनलॉक\' वाला हार्डवेयर प्रबंधित करें"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"ऐप्लिकेशन को चेहरे के टेम्पलेट इस्तेमाल के तरीके जोड़ने और मिटाने की मंज़ूरी मिलती है."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"चेहरे की पुष्टि करने वाला हार्डवेयर इस्तेमाल करें"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ऐप्लिकेशन को चेहरे की पुष्टि करने वाले हार्डवेयर का इस्तेमाल करने की मंज़ूरी मिलती है"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"चेहरे की पहचान"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"\'मालिक का चेहरा पहचानकर अनलॉक\' वाला हार्डवेयर इस्तेमाल करें"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"ऐप्लिकेशन को \'मालिक का चेहरा पहचानकर अनलॉक\' वाले हार्डवेयर के इस्तेमाल की मंज़ूरी देता है"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"मालिक का चेहरा पहचानकर अनलॉक"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"अपना चेहरा फिर से दर्ज करें"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"कृपया अपना चेहरा फिर से दर्ज करें ताकि आपको बेहतर तरीके से पहचाना जा सके"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"चेहरे से जुड़ा सटीक डेटा कैप्चर नहीं किया जा सका. फिर से कोशिश करें."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"फ़ोन को बाईं ओर घुमाएं."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"फ़ोन को दाईं ओर घुमाएं."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"कृपया अपने डिवाइस की तरफ़ सीधे देखें."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"आपका चेहरा नहीं दिखाई दे रहा. फ़ोन की तरफ़ देखें."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"अपने चेहरे को फोन के ठीक सामने लाएं."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"डिवाइस बहुत ज़्यादा हिल रहा है. फ़ोन को बिना हिलाएं पकड़ें."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"कृपया फिर से अपने चेहरे की पहचान कराएं."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"अब चेहरे की पहचान नहीं कर पा रहा. फिर से कोशिश करें."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"अपना सिर थोड़ा कम घुमाएं."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"अपना सिर थोड़ा कम घुमाएं."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"आपके चेहरे को छिपाने वाली सभी चीज़ों को हटाएं."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"स्क्रीन के ऊपरी किनारे पर मौजूद सेंसर को साफ करें."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"अपनी स्क्रीन के सबसे ऊपरी हिस्से को साफ़ करें, जिसमें काले रंग वाला बार भी शामिल है"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"चेहरा नहीं पहचान पा रहे. हार्डवेयर उपलब्ध नहीं है."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"चेहरे की पुष्टि के लिए फिर से कोशिश करें."</string> + <string name="face_error_timeout" msgid="981512090365729465">"\'मालिक का चेहरा पहचानकर अनलॉक\' फिर से आज़माएं."</string> <string name="face_error_no_space" msgid="2712120617457553825">"चेहरे का नया डेटा सेव नहीं हो सकता. कोई पुराना डेटा मिटाएं."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"चेहरा पहचानने की कार्रवाई रद्द की गई"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"उपयोगकर्ता ने \'चेहरे की पहचान\' रद्द कर दी."</string> + <string name="face_error_canceled" msgid="283945501061931023">"चेहरा पहचानने की कार्रवाई रद्द की गई."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"उपयोगकर्ता ने \'मालिक का चेहरा पहचानकर अनलॉक\' रद्द की."</string> <string name="face_error_lockout" msgid="3407426963155388504">"कई बार कोशिश की गई. बाद में कोशिश करें."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"कई बार कोशिश की जा चुकी है. \'चेहरे की पहचान\' बंद कर दी गई."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"कई बार कोशिश की जा चुकी है. \'मालिक का चेहरा पहचानकर अनलॉक\' बंद है."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"चेहरा नहीं पहचान पा रहे. फिर से कोशिश करें."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"आपने डिवाइस पर \'चेहरे की पहचान\' सेट नहीं की है."</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"इस डिवाइस पर \'चेहरे की पहचान\' सुविधा काम नहीं करती."</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"आपने \'मालिक का चेहरा पहचानकर अनलॉक\' सेट नहीं की है."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"इस डिवाइस पर \'मालिक का चेहरा पहचानकर अनलॉक\' काम नहीं करती है."</string> <string name="face_name_template" msgid="7004562145809595384">"चेहरा <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index abb14139bfa8..aca3b2d8098e 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -96,6 +96,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Poruke govorne pošte"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi pozivi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Status SIM-a"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Status SIM-a visokog prioriteta"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Način TTY FULL koji zahtijeva paralelni uređaj"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Način TTY HCO koji zahtijeva paralelni uređaj"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Način TTY VCO koji zahtijeva paralelni uređaj"</string> @@ -553,11 +554,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona otiska prsta"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"upravljati hardverom za autentifikaciju lica"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"Upravljajte hardverom za otključavanje licem"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Aplikaciji omogućuje pozivanje načina za dodavanje i brisanje predložaka lica za upotrebu."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"upotrebljavati hardver za autentifikaciju lica"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Aplikaciji omogućuje upotrebu hardvera za autentifikaciju lica radi autentifikacije"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autentifikacija licem"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"Koristiti hardver za otključavanje licem"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Aplikaciji omogućuje upotrebu hardvera za otključavanje licem radi autentifikacije"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Otključavanje licem"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Ponovo registrirajte svoje lice"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Za poboljšanje prepoznavanja ponovo registrirajte svoje lice"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Podaci o licu nisu točni. Pokušajte ponovo."</string> @@ -570,7 +571,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Pomaknite telefon ulijevo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Pomaknite telefon udesno."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Gledajte izravnije prema uređaju."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Vaše se lice ne vidi. Pogledajte telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Postavite lice izravno ispred telefona."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Previše kretanja. Držite telefon mirno."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Ponovo registrirajte svoje lice."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Lice nije prepoznato. Pokušajte ponovo."</string> @@ -579,19 +580,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Nagnite glavu malo manje."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Nagnite glavu malo manje."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Uklonite sve što vam zakriva lice."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Očistite senzor na gornjem rubu zaslona."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Očistite vrh zaslona, uključujući crnu traku"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Lice nije potvrđeno. Hardver nije dostupan."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Pokušajte ponovo autentificirati lice."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Ponovo pokušajte otključavanje licem."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Podaci o novom licu nisu pohranjeni. Izbrišite neko staro."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Otkazana je radnja s licem"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Autentifikaciju lica otkazao je korisnik"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Otkazana je radnja s licem."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Otključavanje licem otkazao je korisnik."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Previše pokušaja. Pokušajte ponovo kasnije."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Previše pokušaja. Autentifikacija lica onemogućena."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Previše pokušaja. Onemogućeno otključavanje licem"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Lice nije potvrđeno. Pokušajte ponovo."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Niste postavili autentifikaciju lica"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Autentifikacija lica nije podržana na ovom uređaju"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Niste postavili otključavanje licem"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Otključavanje licem nije podržano na ovom uređaju."</string> <string name="face_name_template" msgid="7004562145809595384">"Lice <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 0ece955adbf2..ff91dcf7a466 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Hangpostaüzenetek"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-hívás"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-kártya állapota"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Elsődleges SIM-kártya állapota"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Partner által kért TTY-mód: FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Partner által kért TTY-mód: HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Partner által kért TTY-mód: VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ujjlenyomat ikon"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"arcfelismerő hardver kezelése"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"arcalapú feloldásra szolgáló hardver kezelése"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Engedélyezi, hogy az alkalmazás arcsablon-hozzáadási és -törlési metódusokat hívjon."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"arcfelismerő hardver használata"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Engedélyezi, hogy az alkalmazás hitelesítésre használja az arcfelismerő hardvert"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Arcfelismerés"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"arcalapú feloldásra szolgáló hardver használata"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Engedélyezi, hogy az alkalmazás hitelesítésre használja az arcalapú feloldás hardverét"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Arcalapú feloldás"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Rögzítsen újra képet az arcáról"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"A felismerés javítása érdekében rögzítsen újra az arcáról készített képet"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Sikertelen az arc pontos rögzítése. Próbálja újra."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mozgassa a telefont balra."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mozgassa a telefont jobbra."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Szemből nézzen az eszközre."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Nem látszik az arca. Nézzen a telefonra."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"A telefont közvetlenül az arca elé tegye."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Túl sok a mozgás. Tartsa stabilan a telefont."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Rögzítsen újra képet az arcáról."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Már nem lehet felismerni az arcát. Próbálja újra."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Kicsit kevésbé fordítsa el a fejét."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Kicsit kevésbé fordítsa el a fejét."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Távolítson el mindent, ami takarja az arcát."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Tisztítsa meg a képernyő tetején lévő érzékelőt."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Tisztítsa meg a képernyő tetejét, a fekete sávot is beleértve."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Sikertelen arcellenőrzés. A hardver nem érhető el."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Próbálja újra az arcfelismerést."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Próbálja újra az arcalapú feloldást."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Nem tárolhatók újabb arcadatok. Törölje valamelyik arcot."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Az arccal kapcsolatos művelet megszakítva"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Az arc hitelesítését megszakította a felhasználó"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Az arccal kapcsolatos művelet törölve."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Az arcalapú feloldást megszakította a felhasználó."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Túl sok próbálkozás. Próbálja újra később."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Túl sokszor próbálkozott. Arcfelismerés letiltva."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Túl sok próbálkozás. Az arcalapú feloldás letiltva."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Nem sikerült ellenőrizni az arcát. Próbálja újra."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Nem állította be az arcfelismerést"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Az eszköz nem támogatja az arcfelismerést"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Nem állította be az arcalapú feloldást."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Az eszköz nem támogatja az arcalapú feloldást"</string> <string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g> arc"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 47e7e10b22fc..7ee4fb609b47 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Ձայնային փոստի հաղորդագրություններ"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Զանգեր Wi-Fi-ի միջոցով"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM քարտի կարգավիճակը"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"SIM քարտի բարձր առաջնահերթության ծանուցումներ"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Բաժանորդի սարքում ընտրված է հեռատիպի ԲՈԼՈՐԸ ռեժիմը"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Բաժանորդի սարքում ընտրված է հեռատիպի HCO ռեժիմը"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Բաժանորդի սարքում ընտրված է հեռատիպի VCO ռեժիմը"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Մատնահետքի պատկերակ"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"կառավարել դեմքի ճանաչման սարքը"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"կառավարել դեմքով ապակողպման համար սարքը"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Հավելվածին թույլ է տալիս ավելացնել և հեռացնել դեմքի նմուշներ:"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"օգտագործել դեմքի ճանաչման սարքը"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Հավելվածին թույլ է տալիս օգտագործել նույնականացման համար նախատեսված սարքը"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Նույնականացում դեմքի միջոցով"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"օգտագործել դեմքով ապակողպման համար սարքը"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Թույլ է տալիս հավելվածին օգտագործել դեմքով ապակողպման համար նախատեսված սարքը"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Դեմքով ապակողպում"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Նորից գրանցեք ձեր դեմքը"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Ճանաչումը լավացնելու համար նորից գրանցեք ձեր դեմքը"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Չհաջողվեց գրանցել դեմքի ճշգրիտ տվյալները։ Կրկնեք։"</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Տեղափոխեք հեռախոսը ձախ:"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Տեղափոխեք հեռախոսը աջ:"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Նայեք ուղիղ էկրանին։"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ձեր դեմքը չի երևում։ Նայեք հեռախոսին։"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Պահեք ձեր դեմքն անմիջապես հեռախոսի էկրանի դիմաց:"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Շատ եք շարժում։ Հեռախոսն անշարժ պահեք։"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Նորից փորձեք։"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Չհաջողվեց ճանաչել դեմքը։ Նորից փորձեք:"</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Գլուխն ուղիղ պահեք։"</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Գլուխն ուղիղ պահեք։"</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Հեռացրեք այն ամենը, ինչը թաքցնում է ձեր երեսը:"</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Մաքրեք էկրանի վերևի անկյունում գտնվող տվիչը:"</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Մաքրեք էկրանի վերևի մասը, ներառյալ սև գոտին"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Չհաջողվեց հաստատել դեմքը։ Սարքն անհասանելի է:"</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Նորից փորձեք դեմքի ճանաչումը։"</string> + <string name="face_error_timeout" msgid="981512090365729465">"Նորից փորձեք դեմքով ապակողպումը։"</string> <string name="face_error_no_space" msgid="2712120617457553825">"Չհաջողվեց պահել նոր դեմքը։ Ջնջեք հին տարբերակը։"</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Դեմքի ճանաչումը չեղարկվել է"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Դեմքի ճանաչումը չեղարկվել է օգտատիրոջ կողմից"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Դեմքի ճանաչումը չեղարկվել է։"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Դեմքով ապակողմումը չեղարկվել է օգտատիրոջ կողմից:"</string> <string name="face_error_lockout" msgid="3407426963155388504">"Չափից շատ փորձեր եք կատարել: Փորձեք ավելի ուշ:"</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Չափազանց շատ փորձեր են արվել։ Դեմքի ճանաչումն անջատված է։"</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Չափազանց շատ փորձեր են արվել։ Դեմքով ապակողպումն անջատված է:"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Չհաջողվեց հաստատել դեմքը։ Նորից փորձեք։"</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Դուք չեք կարգավորել դեմքի ճանաչումը"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Դեմքի ճանաչումն այս սարքում չի աջակցվում"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Դուք չեք կարգավորել դեմքով ապակողպումը:"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Դեմքով ապակողպումն այս սարքում չի աջակցվում"</string> <string name="face_name_template" msgid="7004562145809595384">"Դեմք <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 05f70c0b1969..48bd1751a13d 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Notifikasi pesan suara"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Panggilan Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Status SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Status SIM prioritas tinggi"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Rekan meminta Mode TTY PENUH"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Rekan meminta Mode TTY HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Rekan meminta Mode TTY VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon sidik jari"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"kelola hardware autentikasi wajah"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"kelola hardware face unlock"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Mengizinkan apl memicu metode untuk menambah & menghapus template wajah untuk digunakan."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"gunakan hardware autentikasi wajah"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Mengizinkan aplikasi untuk menggunakan hardware autentikasi wajah untuk autentikasi"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autentikasi Wajah"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"gunakan hardware face unlock"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Mengizinkan aplikasi untuk menggunakan hardware face unlock untuk autentikasi"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Face unlock"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Daftarkan kembali wajah Anda"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Untuk menyempurnakan pengenalan wajah, daftarkan kembali wajah Anda"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Tidak bisa mengambil data wajah akurat. Coba lagi."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Gerakkan ponsel ke kiri."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Gerakkan ponsel ke kanan."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Lihat langsung ke perangkat."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Tidak dapat melihat wajah Anda. Lihat ke ponsel."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Posisikan wajah Anda langsung di depan ponsel."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Terlalu banyak gerakan. Stabilkan ponsel."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Daftarkan ulang wajah Anda."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Tidak lagi dapat mengenali wajah. Coba lagi."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Putar sedikit kepala Anda."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Putar sedikit kepala Anda."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Singkirkan apa saja yang menutupi wajah Anda."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Bersihkan sensor di tepi atas layar."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Bersihkan bagian atas layar, termasuk kotak hitam"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Tidak dapat memverifikasi wajah. Hardware tidak tersedia."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Coba autentikasi wajah lagi."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Coba face unlock lagi."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Tidak dapat menyimpan data wajah. Hapus dahulu data lama."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Pemrosesan wajah dibatalkan"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Autentikasi wajah dibatalkan oleh pengguna"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Pemrosesan wajah dibatalkan."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Face unlock dibatalkan oleh pengguna."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Terlalu banyak percobaan. Coba lagi nanti."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Terlalu banyak percobaan. Autentikasi wajah dinonaktifkan."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Terlalu banyak gagal. Face unlock dinonaktifkan."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Tidak dapat memverifikasi wajah. Coba lagi."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Anda belum menyiapkan autentikasi wajah"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Autentikasi wajah tidak didukung di perangkat ini"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Anda belum menyiapkan face unlock."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Face unlock tidak didukung di perangkat ini."</string> <string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g> wajah"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 956c052e427d..b06a7f0714c6 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Talhólfsskilaboð"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi símtöl"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Staða SIM-korts"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Áríðandi staða SIM-korts"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Jafningi bað um FULLA stillingu fjarrita"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Jafningi bað um HCO-stillingu fjarrita"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Jafningi bað um VCO-stillingu fjarrita"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Fingrafaratákn"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"stjórna vélbúnaði andlitsgreiningar"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"stjórna vélbúnaði andlitsopnunar"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Leyfir forritinu að beita aðferðum til að bæta við og eyða andlitssniðmátum til notkunar."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"nota vélbúnað andlitsgreiningar"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Leyfir forritinu að nota andlitsgreiningarvélbúnað til auðkenningar"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Andlitsgreining"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"nota vélbúnað andlitsopnunar"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Leyfir forritinu að nota andlitsopnunarvélbúnað til auðkenningar"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Andlitsopnun"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Skráðu andlitið þitt aftur"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Skráðu andlitið þitt til að bæta kennsl"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Nákvæm andlitsgögn fengust ekki. Reyndu aftur."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Færðu símann til vinstri."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Færðu símann til hægri."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Horfðu beint á tækið."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Sé ekki andlit þitt. Horfðu á símann."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Hafðu andlitið beint fyrir framan símann."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Of mikil hreyfing. Haltu símanum stöðugum."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Skráðu nafnið þitt aftur."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Andlit þekkist ekki lengur. Reyndu aftur."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Hallaðu höfðinu aðeins minna."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Snúðu höfðinu aðeins minna."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Fjarlægðu það sem kann að hylja andlitið."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Hreinsaðu skynjarann á efri brún skjásins."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Hreinsaðu efsta hluta skjásins þíns, þ.m.t. svörtu stikuna"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Andlit ekki staðfest. Vélbúnaður er ekki tiltækur."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Prófaðu andlitsgreiningu aftur."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Prófaðu andlitsopnun aftur."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Ekki er hægt að vista ný andlitsgögn. Eyddu gömlu fyrst."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Hætt við andlitsgreiningu"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Notandi hætti við andlitsgreiningu"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Hætt við andlitsgreiningu."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Notandi hætti við andlitsopnun."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Of margar tilraunir. Reyndu aftur síðar."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Of margar tilraunir. Slökkt á andlitsgreiningu."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Of margar tilraunir. Slökkt á andlitsopnun."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Ekki tókst að staðfesta andlit. Reyndu aftur."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Þú hefur ekki sett upp andlitsgreiningu"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Andlitsgreining er ekki studd í þessu tæki."</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Þú hefur ekki sett upp andlitsopnun."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Andlitsopnun er ekki studd í þessu tæki."</string> <string name="face_name_template" msgid="7004562145809595384">"Andlit <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 748248ee0264..98f5fb2a2cd3 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Messaggi vocali"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Chiamate Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Stato SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Stato SIM con priorità elevata"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Peer ha richiesto la modalità TTY FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Peer ha richiesto la modalità TTY HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Peer ha richiesto la modalità TTY VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icona dell\'impronta digitale"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"gestione di hardware per l\'autenticazione dei volti"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"gestione dell\'hardware per Sblocco col sorriso"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Consente all\'app di richiamare i metodi per aggiungere e rimuovere i modelli di volti."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"utilizzo di hardware per l\'autenticazione dei volti"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Consente all\'app di utilizzare hardware per l\'autenticazione dei volti"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autenticazione volti"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"utilizzo dell\'hardware per Sblocco col sorriso"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Consente all\'app di utilizzare hardware per l\'autenticazione con Sblocco col sorriso"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Sblocco col sorriso"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Registra di nuovo il volto"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Per migliorare il riconoscimento, registra di nuovo il tuo volto"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Impossibile acquisire dati viso accurati. Riprova."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Sposta il telefono verso sinistra."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Sposta il telefono verso destra."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Guarda più direttamente verso il dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Impossibile vedere il volto. Guarda il telefono."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Posiziona il viso davanti al telefono."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Troppo movimento. Tieni fermo il telefono."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Ripeti l\'acquisizione del volto."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Non è più possibile riconoscere il volto. Riprova."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Gira un po\' meno la testa."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Gira un po\' meno la testa."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Rimuovi tutto ciò che ti nasconde il viso."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Pulisci sensore sul bordo superiore dello schermo."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Pulisci la parte superiore dello schermo, inclusa la barra nera"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Imposs. verificare volto. Hardware non disponibile."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Riprova l\'autenticazione volti."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Riprova Sblocco col sorriso."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Imposs. salvare dati nuovi volti. Elimina un volto vecchio."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Operazione associata al volto annullata"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Autenticazione volti annullata dall\'utente"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Operazione associata al volto annullata."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Sblocco col sorriso annullato dall\'utente."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Troppi tentativi. Riprova più tardi."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Troppi tentativi. Autenticazione volti disattivata."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Troppi tentativi. Sblocco col sorriso disattivato"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Impossibile verificare il volto. Riprova."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Non hai configurato l\'autenticazione volti"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Autenticazione volti non supportata su questo dispositivo"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Non hai configurato Sblocco col sorriso."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Sblocco col sorriso non supportato su questo dispositivo."</string> <string name="face_name_template" msgid="7004562145809595384">"Volto <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 8afd95a48357..00a37ebd6208 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -97,6 +97,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"הודעות קוליות"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"שיחות Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"סטטוס SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"סטטוס התראות SIM בעדיפות גבוהה"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"העמית ביקש TTY במצב FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"העמית ביקש TTY במצב HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"העמית ביקש TTY במצב VCO"</string> @@ -556,11 +557,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"סמל טביעת אצבע"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"ניהול של חומרה של זיהוי פנים לצורך אימות"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"ניהול החומרה לשחרור נעילה על ידי זיהוי פנים"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"מאפשרת לאפליקציה להפעיל שיטות להוספה ומחיקה של תבניות פנים שבהן ייעשה שימוש."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"שימוש בחומרה של זיהוי פנים לצורך אימות"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"מאפשרת לאפליקציה להשתמש בחומרה של זיהוי פנים לצורך אימות"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"אימות פנים"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"שימוש בחומרה לשחרור נעילה על ידי זיהוי פנים"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"מאפשרת לאפליקציה להשתמש בחומרה לשחרור נעילה על ידי זיהוי פנים לצורך אימות"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"שחרור נעילה על ידי זיהוי פנים"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"יש לבצע רישום מחדש של הפנים שלך"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"לשיפור הזיהוי יש לבצע רישום מחדש של הפנים שלך"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"לא ניתן היה לקלוט את הפנים במדויק. יש לנסות שוב."</string> @@ -573,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"צריך להזיז את הטלפון שמאלה."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"צריך להזיז את הטלפון ימינה."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"יש להביט ישירות אל המכשיר."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"אי אפשר לראות את הפנים שלך. צריך להביט אל הטלפון."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"עליך למקם את הפנים ישירות מול הטלפון."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"יותר מדי תנועה. יש להחזיק את הטלפון בצורה יציבה."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"יש לרשום מחדש את הפנים."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"כבר לא ניתן לזהות פנים. יש לנסות שוב."</string> @@ -582,19 +583,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"עליך ליישר קצת את הראש."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"עליך ליישר קצת את הראש."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"יש להסיר כל דבר שמסתיר את הפנים."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"יש לנקות את החיישן שבקצה העליון של המסך."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"עליך לנקות את החלק העליון של המסך, כולל הסרגל השחור"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"לא ניתן לאמת את הפנים. החומרה לא זמינה."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"יש לנסות שוב את זיהוי הפנים לצורך אימות."</string> + <string name="face_error_timeout" msgid="981512090365729465">"יש לנסות שוב את שחרור הנעילה על ידי זיהוי פנים."</string> <string name="face_error_no_space" msgid="2712120617457553825">"לא ניתן לאחסן נתוני פנים. תחילה יש למחוק פנים ישנים."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"פעולת הפנים בוטלה"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"זיהוי הפנים בוטל על ידי המשתמש"</string> + <string name="face_error_canceled" msgid="283945501061931023">"פעולת הפנים בוטלה."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"שחרור הנעילה על ידי זיהוי פנים בוטל על ידי המשתמש."</string> <string name="face_error_lockout" msgid="3407426963155388504">"יותר מדי ניסיונות. יש לנסות שוב מאוחר יותר."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"יותר מדי ניסיונות. אימות פנים הושבת."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"יותר מדי ניסיונות. שחרור נעילה על ידי זיהוי פנים מושבת."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"לא ניתן לאמת את הפנים. יש לנסות שוב."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"לא הגדרת אימות פנים"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"המכשיר הזה לא תומך באימות פנים"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"לא הגדרת שחרור נעילה על ידי זיהוי פנים."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"המכשיר הזה לא תומך בשחרור נעילה על ידי זיהוי פנים."</string> <string name="face_name_template" msgid="7004562145809595384">"פנים <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index a2e577b44aed..7b1d8a5f9845 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ボイスメール メッセージ"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 通話"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM のステータス"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"高優先度: SIM のステータス"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"ピアから、TTY モードを FULL にするようリクエストされました"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"ピアから、TTYモードをHCOにするようリクエストされました"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"ピアから、TTYモードをVCOにするようリクエストされました"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指紋アイコン"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"顔認証ハードウェアの管理"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"顔認証ハードウェアの管理"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"使用する顔テンプレートの追加や削除を行うメソッドの呼び出しをアプリに許可します。"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"顔認証ハードウェアの使用"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"顔認証ハードウェアを認証に使用することをアプリに許可します"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"顔認証"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"顔認証ハードウェアの使用"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"顔認証ハードウェアを認証に使用することをアプリに許可します"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"顔認証"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"顔の再登録"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"認識を改善するには、顔を再登録してください"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"顔を認識できませんでした。もう一度お試しください。"</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"スマートフォンを左に動かしてください。"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"スマートフォンを右に動かしてください。"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"もっとまっすぐデバイスに顔を向けてください。"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"顔を確認できません。スマートフォンを見てください。"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"顔をスマートフォンの真正面に向けてください。"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"あまり動かさないでください。安定させてください。"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"顔を登録し直してください。"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"顔を認識できなくなりました。もう一度お試しください。"</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"顔の向きを少し戻してください。"</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"顔の向きを少し戻してください。"</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"顔を隠しているものをすべて外してください"</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"画面の上端にあるセンサーの汚れを落としてください。"</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"黒いバーを含め、画面の上部をきれいにしてください"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"顔を確認できません。ハードウェアを利用できません。"</string> - <string name="face_error_timeout" msgid="3202585609451248103">"顔認証をもう一度お試しください。"</string> + <string name="face_error_timeout" msgid="981512090365729465">"顔認証をもう一度お試しください。"</string> <string name="face_error_no_space" msgid="2712120617457553825">"新しい顔データを保存できません。古いデータを削除してください。"</string> - <string name="face_error_canceled" msgid="2768146728600802422">"顔の操作をキャンセルしました"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"顔の認証がユーザーによりキャンセルされました"</string> + <string name="face_error_canceled" msgid="283945501061931023">"顔の操作をキャンセルしました。"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"顔認証はユーザーによりキャンセルされました。"</string> <string name="face_error_lockout" msgid="3407426963155388504">"試行回数の上限です。後でもう一度お試しください。"</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"入力回数が上限を超えました。顔認証が無効になりました。"</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"試行回数が上限を超えたため、顔認証を無効にしました。"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"顔を確認できません。もう一度お試しください。"</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"顔認証を設定していません"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"顔認証はこのデバイスではご利用いただけません"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"顔認証を設定していません。"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"このデバイスでは、顔認証はご利用いただけません。"</string> <string name="face_name_template" msgid="7004562145809595384">"顔 <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 23fdad44864b..896ad137dec9 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ხმოვანი ფოსტის შეტყობინებები"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"დარეკვა Wi-Fi-ს მეშვეობით"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM სტატუსი"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"მაღალპრიორიტეტული SIM სტატუსი"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"მოთხოვნილია კვანძი TTY რეჟიმი FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"მოთხოვნილია კვანძი TTY რეჟიმი HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"მოთხოვნილია კვანძი TTY რეჟიმი VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"თითის ანაბეჭდის ხატულა"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"სახის ამოცნობის აპარატურის მართვა"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"სახით განბლოკვის აპარატურის მართვა"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"საშუალებას აძლევს აპს, დაამატოს და წაშალოს სახეების შაბლონები."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"სახის ამოცნობის აპარატურის გამოყენება"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"საშუალებას აძლევს აპს, ავტორიზაციისთვის გამოიყენოს სახის ამოცნობის აპარატურა"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"სახის ამოცნობა"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"სახით განბლოკვის აპარატურის გამოყენება"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"საშუალებას აძლევს აპს, ამოცნობისთვის გამოიყენოს სახით განბლოკვის აპარატურა"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"განბლოკვა სახით"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"დაარეგისტრირეთ თქვენი სახე ხელახლა"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ამოცნობის გასაუმჯობესებლად, გთხოვთ, ხელახლა დაარეგისტრიროთ თქვენი სახე"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"სახის ზუსტი მონაცემები არ აღიბეჭდა. ცადეთ ხელახლა."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"გადაანაცვლეთ ტელეფონი მარცხნივ."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"გადაანაცვლეთ ტელეფონი მარჯვნივ."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"გთხოვთ, უფრო პირდაპირ შეხედოთ თქვენს მოწყობილობას."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"თქვენი სახე არ ჩანს. შეხედეთ ტელეფონს."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"დაიჭირეთ სახე უშუალოდ ტელეფონის წინ."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"მეტისმეტად მოძრაობთ. მყარად დაიჭირეთ ტელეფონი."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"გთხოვთ, ხელახლა დაარეგისტრიროთ თქვენი სახე."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"სახის ამოცნობა ვეღარ ხერხდება. ცადეთ ხელახლა."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"თავი ცოტა ნაკლებად მიაბრუნეთ."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"თავი ცოტა ნაკლებად მიაბრუნეთ."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"მოაშორეთ ყველაფერი, რაც სახეს გიფარავთ."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"გაწმინდეთ სენსორი ეკრანის ზედა კიდეზე."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"გაწმინდეთ ეკრანის ზედა ნაწილი, შავი ზოლის ჩათვლით."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"სახე ვერ დასტურდება. აპარატი მიუწვდომელია."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"ცადეთ ხელახლა სახის ამოცნობა."</string> + <string name="face_error_timeout" msgid="981512090365729465">"ცადეთ ხელახლა სახით განბლოკვა."</string> <string name="face_error_no_space" msgid="2712120617457553825">"სახის ახალი მონაცემები ვერ ინახება. ჯერ ძველი წაშალეთ."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"სახის ოპერაცია გაუქმდა."</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"სახის ავთენტიფიკაცია გაუქმდა მომხმარებლის მიერ"</string> + <string name="face_error_canceled" msgid="283945501061931023">"სახის ამოცნობა გაუქმდა."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"განბლოკვა სახით გაუქმდა მომხმარებლის მიერ."</string> <string name="face_error_lockout" msgid="3407426963155388504">"დაფიქსირდა ბევრი მცდელობა. ცადეთ მოგვიანებით."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"მეტისმეტად ბევრი მცდელობა იყო. სახის ამოცნობა გათიშულია."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"მეტისმეტად ბევრი მცდელობა იყო. სახით განბლოკვა გათიშულია."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"სახის დადასტურება ვერ ხერხდება. ცადეთ ხელახლა."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"თქვენ არ დაგიყენებიათ სახის ავთენტიფიკაცია"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"სახის ავთენტიფიკაცია ამ მოწყობილობაზე მხარდაჭერილი არ არის"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"თქვენ არ დაგიყენებიათ სახით განბლოკვა."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"განბლოკვა სახით ამ მოწყობილობაზე მხარდაჭერილი არ არის."</string> <string name="face_name_template" msgid="7004562145809595384">"სახე <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 9a6dc6baad9a..801e3777e24c 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Дауыстық пошта хабарлары"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi қоңыраулары"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM күйі"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"SIM картасы туралы маңызды хабарландырулар"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Пир TTY режимі ТОЛЫҚ сұрады"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Пир TTY режимінің HCO сұрады"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Пир TTY режимінің VCO сұрады"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Саусақ ізі белгішесі"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"бетті тану жабдығын басқару"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"Face Unlock жабдығын басқару"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Қолданбаға пайдаланатын бет үлгілерін енгізу және жою әдістерін шақыруға мүмкіндік береді."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"бетті тану жабдығын пайдалану"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Қолданбаға бетті тану жабдығын қолдануға рұқсат етеді"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Бетті тану"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"Face Unlock жабдығын пайдалану"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Аутентификациялау үшін қолданбаға Face Unlock жабдығын пайдалануға рұқсат береді."</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Face Unlock"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Бетті қайта тіркеу"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Құрылғы жүзіңізді жақсырақ тануы үшін, бетіңізді қайта тіркеңіз."</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Бет деректері дұрыс алынбады. Әрекетті қайталаңыз."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Телефонды солға жылжытыңыз."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Телефонды оңға жылжытыңыз."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Құрылғының камерасына тура қараңыз."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Бетіңіз көрінбейді. Телефонға қараңыз."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Бетіңізді телефонға тура қаратыңыз."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Қозғалыс тым көп. Телефонды қозғалтпаңыз."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Қайта тіркеліңіз."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Енді бет анықтау мүмкін емес. Әрекетті қайталаңыз."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Басыңызды түзурек ұстаңыз."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Басыңызды кішкене бұрыңыз."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Бетіңізді жауып тұрған нәрсені алып тастаңыз."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Экранның жоғарғы жиегіндегі датчикті тазалаңыз."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Экранның жоғарғы жағын, сонымен қатар қара жолақты өшіріңіз."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Бетті тану мүмкін емес. Жабдық қолжетімді емес."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Құрылғы бетіңізді танымады. Қайталап көріңіз."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Face Unlock функциясын қайта қолданып көріңіз."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Жаңа бетті сақтау мүмкін емес. Алдымен ескісін жойыңыз."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Бетті танудан бас тартылды."</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Пайдаланушы бетті тану әрекетінен бас тартты."</string> + <string name="face_error_canceled" msgid="283945501061931023">"Бетті танудан бас тартылды."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Пайдаланушы Face Unlock функциясынан бас тартты."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Тым көп әрекет жасалды. Кейінірек қайталаңыз."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Тым көп әрекет жасалды. Бетті тану функциясы өшірілді."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Тым көп әрекет жасалды. Face Unlock функциясы өшірілді."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Бетті тану мүмкін емес. Әрекетті қайталаңыз."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Бетті тану функциясы реттелмеген."</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Бетті тану функциясын бұл құрылғы қолдамайды."</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Face Unlock реттелмеді."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Бұл құрылғыда Face Unlock функциясы істемейді."</string> <string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g> беті"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 1275e1418683..8bb03e061e7e 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"សារជាសំឡេង"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"ការហៅទូរសព្ទតាម Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"ស្ថានភាពស៊ីម"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"ស្ថានភាពស៊ីមដែលមានអាទិភាពខ្ពស់"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"ម៉ាស៊ីនកូនបានស្នើ TTY Mode FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"ម៉ាស៊ីនកូនបានស្នើ TTY Mode HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"ម៉ាស៊ីនកូនបានស្នើ TTY Mode VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"រូបតំណាងស្នាមម្រាមដៃ"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"គ្រប់គ្រងផ្នែករឹងផ្ទៀងផ្ទាត់ផ្ទៃមុខ"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"គ្រប់គ្រងហាតវែរដោះសោតាមទម្រង់មុខ"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"អនុញ្ញាតឱ្យកម្មវិធីប្រើវិធីសាស្ត្រដើម្បីបញ្ចូល និងលុបទម្រង់គំរូផ្ទៃមុខសម្រាប់ប្រើប្រាស់។"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ប្រើផ្នែករឹងផ្ទៀងផ្ទាត់ផ្ទៃមុខ"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"អនុញ្ញាតឱ្យកម្មវិធីប្រើផ្នែករឹងផ្ទៀងផ្ទាត់ផ្ទៃមុខសម្រាប់ការផ្ទៀងផ្ទាត់"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"ការផ្ទៀងផ្ទាត់មុខ"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"ប្រើហាតវែរដោះសោតាមទម្រង់មុខ"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"អនុញ្ញាតឱ្យកម្មវិធីប្រើហាតវែរដោះសោតាមទម្រង់មុខសម្រាប់ការផ្ទៀងផ្ទាត់"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"ការដោះសោតាមទម្រង់មុខ"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"ស្កេនបញ្ចូលមុខរបស់អ្នកម្ដងទៀត"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ដើម្បីធ្វើឱ្យការសម្គាល់មុខប្រសើរជាងមុន សូមស្កេនបញ្ចូលមុខរបស់អ្នកម្ដងទៀត"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"មិនអាចថតទិន្នន័យទម្រង់មុខបានត្រឹមត្រូវទេ។ សូមព្យាយាមម្ដងទៀត។"</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ផ្លាស់ទីទូរសព្ទទៅខាងឆ្វេង។"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ផ្លាស់ទីទូរសព្ទទៅខាងស្ដាំ។"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"សូមមើលឱ្យចំឧបករណ៍របស់អ្នកជាងមុន។"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"មើលមិនឃើញមុខរបស់អ្នកទេ។ សូមសម្លឹងមើលទូរសព្ទ។"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"បែរមុខរបស់អ្នកឱ្យចំពីមុខទូរសព្ទផ្ទាល់។"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"មានចលនាខ្លាំងពេក។ សូមកាន់ទូរសព្ទឱ្យនឹង។"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"សូមស្កេនបញ្ចូលមុខរបស់អ្នកម្ដងទៀត។"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"មិនអាចសម្គាល់មុខបានទៀតទេ។ សូមព្យាយាមម្ដងទៀត។"</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"ងាកក្បាលរបស់អ្នកតិចជាងមុនបន្តិច។"</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"ងាកក្បាលរបស់អ្នកបន្តិចទៀត។"</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"យកអ្វីដែលបាំងមុខរបស់អ្នកចេញ។"</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"សម្អាតឧបករណ៍ចាប់សញ្ញានៅគែមខាងលើនៃអេក្រង់។"</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"សម្អាតផ្នែកខាងលើនៃអេក្រង់របស់អ្នក រួមទាំងរបារខ្មៅ"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"មិនអាចផ្ទៀងផ្ទាត់មុខបានទេ។ មិនមានហាតវែរទេ។"</string> - <string name="face_error_timeout" msgid="3202585609451248103">"សាកល្បងផ្ទៀងផ្ទាត់មុខម្ដងទៀត។"</string> + <string name="face_error_timeout" msgid="981512090365729465">"សាកល្បងដោះសោតាមទម្រង់មុខម្ដងទៀត។"</string> <string name="face_error_no_space" msgid="2712120617457553825">"មិនអាចផ្ទុកទិន្នន័យទម្រង់មុខថ្មីបានទេ។ សូមលុបទិន្នន័យទម្រង់មុខចាស់ជាមុនសិន។"</string> - <string name="face_error_canceled" msgid="2768146728600802422">"បានបោះបង់ប្រតិបត្តិការចាប់ទម្រង់មុខ"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"ការផ្ទៀងផ្ទាត់មុខត្រូវបានបោះបង់ដោយអ្នកប្រើប្រាស់"</string> + <string name="face_error_canceled" msgid="283945501061931023">"បានបោះបង់ប្រតិបត្តិការចាប់ផ្ទៃមុខ។"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"អ្នកប្រើប្រាស់បានបោះបង់ការដោះសោតាមទម្រង់មុខ។"</string> <string name="face_error_lockout" msgid="3407426963155388504">"ព្យាយាមចូលច្រើនពេកហើយ។ សូមព្យាយាមម្តងទៀតពេលក្រោយ។"</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"ព្យាយាមចូលច្រើនពេក។ បានបិទការផ្ទៀងផ្ទាត់មុខ។"</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"ការដោះសោតាមទម្រង់មុខត្រូវបានបិទ ដោយសារព្យាយាមច្រើនដងពេក។"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"មិនអាចផ្ទៀងផ្ទាត់មុខបានទេ។ សូមព្យាយាមម្ដងទៀត។"</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"អ្នកមិនទាន់រៀបចំការផ្ទៀងផ្ទាត់មុខនៅឡើយទេ"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"មិនអាចប្រើការផ្ទៀងផ្ទាត់មុខនៅលើឧបករណ៍នេះបានទេ"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"អ្នកមិនទាន់រៀបចំការដោះសោតាមទម្រង់មុខនៅឡើយទេ។"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"មិនអាចប្រើការដោះសោតាមទម្រង់មុខនៅលើឧបករណ៍នេះបានទេ។"</string> <string name="face_name_template" msgid="7004562145809595384">"ផ្ទៃមុខទី <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 20d077cdbede..8e5ea6af10d0 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ಧ್ವನಿಮೇಲ್ ಸಂದೇಶಗಳು"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"ಸಿಮ್ ಸ್ಥಿತಿ"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"ಹೆಚ್ಚಿನ ಆದ್ಯತೆಯ ಸಿಮ್ ಸ್ಥಿತಿ"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ಬೆರಳಚ್ಚು ಐಕಾನ್"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"ಮುಖ ದೃಢೀಕರಣ ಹಾರ್ಡ್ವೇರ್ ಅನ್ನು ನಿರ್ವಹಿಸಿ"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಹಾರ್ಡ್ವೇರ್ ಅನ್ನು ನಿರ್ವಹಿಸಿ"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"ಬಳಕೆಗೆ ಮುಖದ ಟೆಂಪ್ಲೇಟ್ಗಳನ್ನು ಸೇರಿಸಲು ಮತ್ತು ಅಳಿಸಲು ವಿಧಾನಗಳನ್ನು ಮನವಿ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ಮುಖ ದೃಢೀಕರಣ ಹಾರ್ಡ್ವೇರ್ ಅನ್ನು ಬಳಸಿ"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ಧೃಡೀಕರಣಕ್ಕಾಗಿ ಮುಖದ ಹಾರ್ಡ್ವೇರ್ ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"ಮುಖ ಗುರುತಿಸುವಿಕೆ"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಹಾರ್ಡ್ವೇರ್ ಬಳಸಿ"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"ಪ್ರಮಾಣೀಕರಣಕ್ಕಾಗಿ ಫೇಸ್ ಅನ್ಲಾಕ್ ಹಾರ್ಡ್ವೇರ್ ಬಳಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"ಫೇಸ್ ಅನ್ಲಾಕ್"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ಗುರುತಿಸುವಿಕೆಯನ್ನು ಹೆಚ್ಚಿಸಲು ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"ಸರಿಯಾಗಿ ಮುಖ ಕ್ಯಾಪ್ಚರ್ ಮಾಡಲಾಗಲಿಲ್ಲ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ಫೋನ್ ಅನ್ನು ಎಡಕ್ಕೆ ಸರಿಸಿ."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ಫೋನ್ ಅನ್ನು ಬಲಕ್ಕೆ ಸರಿಸಿ."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಹೆಚ್ಚಿನದ್ದನ್ನು ನೇರವಾಗಿ ನೋಡಿ."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ನಿಮ್ಮ ಮುಖ ಕಾಣಿಸುತ್ತಿಲ್ಲ. ಫೋನ್ ಕಡೆಗೆ ನೋಡಿ."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ನಿಮ್ಮ ಮುಖವನ್ನು ಫೋನ್ಗೆ ನೇರವಾಗಿ ಇರಿಸಿ."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ತುಂಬಾ ಅಲುಗಾಡುತ್ತಿದೆ ಫೋನ್ ಅನ್ನು ಸ್ಥಿರವಾಗಿ ಹಿಡಿಯಿರಿ."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"ನಿಮ್ಮ ಮುಖವನ್ನು ಮರುನೋಂದಣಿ ಮಾಡಿ."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ಮುಖ ಗುರುತಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"ನಿಮ್ಮ ತಲೆಯನ್ನು ಹೆಚ್ಚು ತಿರುಗಿಸಬೇಡಿ."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"ನಿಮ್ಮ ತಲೆಯನ್ನು ಸ್ವಲ್ಪ ಕಡಿಮೆ ತಿರುಗಿಸಿ."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"ನಿಮ್ಮ ಮುಖವನ್ನು ಮರೆಮಾಡುವ ಯಾವುದನ್ನಾದರೂ ತೆಗೆದುಹಾಕಿ."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"ಸ್ಕ್ರೀನ್ ಮೇಲ್ಬಾಗದ ಅಂಚಿನಲ್ಲಿನ ಸೆನ್ಸರ್ ಸ್ವಚ್ಚಗೊಳಿಸಿ."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"ಬ್ಲ್ಯಾಕ್ ಬಾರ್ ಸೇರಿದಂತೆ ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ನ ಮೇಲ್ಭಾಗವನ್ನು ತೆರವುಗೊಳಿಸಿ"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"ಮುಖ ದೃಢೀಕರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಹಾರ್ಡ್ವೇರ್ ಲಭ್ಯವಿಲ್ಲ."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"ಮುಖ ದೃಢೀಕರಣ ಹಾರ್ಡ್ವೇರ್ ಅನ್ನು ಬಳಸಿ ನೋಡಿ."</string> + <string name="face_error_timeout" msgid="981512090365729465">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಅನ್ನು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="face_error_no_space" msgid="2712120617457553825">"ಹೊಸ ಮುಖ ಡೇಟಾ ಸಂಗ್ರಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಮೊದಲು ಹಳೆಯದನ್ನು ಅಳಿಸಿ"</string> - <string name="face_error_canceled" msgid="2768146728600802422">"ಮುಖದ ಕಾರ್ಯಚರಣೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"ಮುಖ ಗುರುತಿಸುವಿಕೆಯನ್ನು ಬಳಕೆದಾರರು ರದ್ದುಗೊಳಿಸಿದ್ದಾರೆ"</string> + <string name="face_error_canceled" msgid="283945501061931023">"ಮುಖದ ಕಾರ್ಯಚರಣೆಯನ್ನು ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"ಫೇಸ್ ಅನ್ಲಾಕ್ ಅನ್ನು ಬಳಕೆದಾರರು ರದ್ದುಗೊಳಿಸಿದ್ದಾರೆ."</string> <string name="face_error_lockout" msgid="3407426963155388504">"ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"ಹಲವಾರು ಪ್ರಯತ್ನಗಳು. ಮುಖ ಗುರುತಿಸುವಿಕೆ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಫೇಸ್ ಅನ್ಲಾಕ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"ಮುಖವನ್ನು ದೃಢೀಕರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"ಮುಖ ಗುರುತಿಸುವಿಕೆಯನ್ನು ನೀವು ಸೆಟಪ್ ಮಾಡಿಲ್ಲ"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"ಈ ಸಾಧನದಲ್ಲಿ ಮುಖ ಗುರುತಿಸುವಿಕೆ ವೈಶಿಷ್ಟ್ಯವು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"ನೀವು ಫೇಸ್ ಅನ್ಲಾಕ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಿಲ್ಲ."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"ಈ ಸಾಧನದಲ್ಲಿ ಫೇಸ್ ಅನ್ಲಾಕ್ ವೈಶಿಷ್ಟ್ಯವು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ."</string> <string name="face_name_template" msgid="7004562145809595384">"ಮುಖದ <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 33ce9944d7cb..9d547ca682f3 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"음성사서함 메시지"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 통화"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM 상태"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"우선순위가 높은 SIM 상태"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"피어가 TTY 모드 FULL을 요청했습니다."</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"피어가 TTY 모드 HCO를 요청했습니다."</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"피어가 TTY 모드 VCO를 요청했습니다."</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"지문 아이콘"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"얼굴 인증 하드웨어 관리"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"얼굴인식 잠금해제 하드웨어 관리"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"사용할 얼굴 템플릿의 추가 및 삭제 메서드를 앱에서 호출하도록 허용합니다."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"얼굴 인증 하드웨어 사용"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"앱에서 얼굴 인증 하드웨어를 인증에 사용하도록 허용합니다."</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"얼굴 인증"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"얼굴인식 잠금해제 하드웨어 사용"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"앱에서 얼굴인식 잠금해제 하드웨어를 인증에 사용하도록 허용합니다."</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"얼굴인식 잠금해제"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"얼굴 재등록 필요"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"인식률을 개선하려면 얼굴을 다시 등록하세요."</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"정확한 얼굴 데이터를 캡처하지 못했습니다. 다시 시도하세요."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"휴대전화를 왼쪽으로 이동하세요."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"휴대전화를 오른쪽으로 이동하세요."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"기기에서 더 똑바로 바라보세요."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"얼굴이 보이지 않습니다. 휴대전화를 바라보세요."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"휴대전화가 얼굴 정면을 향하도록 두세요."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"너무 많이 움직였습니다. 휴대전화를 흔들리지 않게 잡으세요."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"얼굴을 다시 등록해 주세요."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"더 이상 얼굴을 인식할 수 없습니다. 다시 시도하세요."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"고개를 조금 덜 돌려 보세요."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"고개를 조금 덜 돌려 보세요."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"얼굴이 가려지지 않도록 해 주세요."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"화면 상단 가장자리의 센서를 깨끗하게 닦아 주세요."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"검은색 바를 포함한 화면 상단을 청소하세요."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"얼굴을 확인할 수 없습니다. 하드웨어를 사용할 수 없습니다."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"얼굴 인증을 다시 시도해 보세요."</string> + <string name="face_error_timeout" msgid="981512090365729465">"얼굴인식 잠금해제를 다시 시도해 주세요."</string> <string name="face_error_no_space" msgid="2712120617457553825">"새 얼굴 데이터를 저장할 수 없습니다. 먼저 기존 얼굴 데이터를 삭제하세요."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"얼굴 인식 작업이 취소되었습니다."</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"사용자가 얼굴 인증을 취소했습니다."</string> + <string name="face_error_canceled" msgid="283945501061931023">"얼굴 인식 작업이 취소되었습니다."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"사용자가 얼굴인식 잠금해제를 취소했습니다."</string> <string name="face_error_lockout" msgid="3407426963155388504">"시도 횟수가 너무 많습니다. 나중에 다시 시도하세요."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"시도 횟수가 너무 많습니다. 얼굴 인증이 사용 중지되었습니다."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"시도 횟수가 너무 많습니다. 얼굴인식 잠금해제가 사용 중지되었습니다."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"얼굴을 확인할 수 없습니다. 다시 시도하세요."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"얼굴 인증을 설정하지 않았습니다."</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"이 기기에서는 얼굴 인증이 지원되지 않습니다."</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"얼굴인식 잠금해제를 설정하지 않았습니다."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"이 기기에서는 얼굴인식 잠금해제가 지원되지 않습니다."</string> <string name="face_name_template" msgid="7004562145809595384">"얼굴 <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index b34fcf2c6664..d3d1cd0f2953 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Үн почтасынын билдирүүлөрү"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi аркылуу чалуу"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-картанын абалы"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"SIM картадагы өтө маанилүү билдирмелер"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Peer TTY режимин FULL кылууну суранды"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Peer TTY режимин HCO кылууну суранды"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Peer TTY режимин VCO кылууну суранды"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Манжа изинин сүрөтчөсү"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"жүздүн аныктыгын текшерүүчү аппараттык камсыздоону башкаруу"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"жүзүнөн таануу функциясынын аппараттык камсыздоосун башкаруу"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Колдонмого пайдалануу үчүн жүздүн үлгүлөрүн кошуу жана жок кылуу мүмкүндүгүн берет."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"жүздүн аныктыгын текшерүүчү аппараттык камсыздоону колдонуу"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Колдонмого аныктыгын текшерүү үчүн жүздүн аныктыгын текшерүүчү аппараттык камсыздоону пайдалануу мүмкүндүгүн берет"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Жүздүн аныктыгын текшерүү"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"аппараттык камсыздоо үчүн жүзүнөн таанууну колдонуу"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Колдонмо аныктыкты текшерүүдө Жүзүнөн таануу функциясынын аппараттык камсыздоосун колдонот"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Жүзүнөн таануу"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Жүзүңүздү кайра таанытыңыз."</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Мыкты таануу үчүн, жүзүңүздү кайра таанытыңыз"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Жүзүңүз жакшы тартылган жок. Кайра аракет кылыңыз."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Телефонду солго жылдырыңыз."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Телефонду оңго жылдырыңыз."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Түзмөгүңүзгө түз караңыз."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Жүзүңүз көрүнбөй жатат. Телефонду караңыз."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Телефонду жүзүңүздүн маңдайында кармаңыз."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Кыймылдап жибердиңиз. Телефонду түз кармаңыз."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Жүзүңүздү кайра таанытыңыз."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Жүз таанылган жок. Кайра аракет кылыңыз."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Башыңызды бир аз гана эңкейтиңиз."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Башыңызды бир аз гана эңкейтиңиз."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Жүзүңүздү жашырып турган нерселерди алып салыңыз."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Экрандын жогору жагындагы сенсорду тазалаңыз."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Экраныңыздын жогору жагын, анын ичинде тилкени да тазалаңыз"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Жүз ырасталбай жатат. Аппараттык камсыздоо жеткиликсиз."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Жүздүн аныктыгын кайра текшерип көрүңүз"</string> + <string name="face_error_timeout" msgid="981512090365729465">"Жүзүнөн таануу функциясын кайра текшерип көрүңүз."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Жаңы жүздү сактоо мүмкүн эмес. Адегенде эскисин өчүрүңүз."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Жүздүн аныктыгын текшерүү жокко чыгарылды"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Жүздүн аныктыгын текшерүү колдонуучу аркылуу жокко чыгарылды"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Жүздүн аныктыгын текшерүү жокко чыгарылды."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Жүзүнөн таануу функциясын колдонуучу өчүрүп салды."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Өтө көп жолу аракет жасадыңыз. Кийинчерээк кайра аракет кылыңыз."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Өтө көп аракеттер аткарылды. Жүздүн аныктыгын текшерүү өчүк."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Өтө көп жолу аракет кылдыңыз. Жүзүнөн таануу функциясы өчүрүлдү."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Жүз ырасталбай жатат. Кайра аракет кылыңыз."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Жүздүн аныктыгын текшерүүнү жөндөй элексиз"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Жүздүн аныктыгын текшерүү бул түзмөктө колдоого алынбайт"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Жүзүнөн таануу функциясын жөндөй элексиз."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Жүзүнөн таануу функциясы бул түзмөктө иштебейт."</string> <string name="face_name_template" msgid="7004562145809595384">"Жүз <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 3b887a2131e7..55747d0556f4 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ຂໍ້ຄວາມສຽງ"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"ການໂທ Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"ສະຖານະ SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"ສະຖານະ SIM ຄວາມສຳຄັນສູງ"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"ໂໝດ TTY ທີ່ເພື່ອນຂໍນັ້ນເຕັມແລ້ວ"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"ໂໝດ TTY ທີ່ເພື່ອນຂໍ HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"ໂໝດ TTY ທີ່ເພື່ອນຂໍ VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ໄອຄອນລາຍນິ້ວມື"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"ຈັດການຮາດແວການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າ"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"ຈັດການຮາດແວປົດລັອກດ້ວຍໜ້າ"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"ອະນຸຍາດໃຫ້ແອັບເປີດວິທີການຕ່າງໆເພື່ອເພີ່ມ ແລະ ລຶບແມ່ແບບໃບໜ້າສຳລັບການນຳໃຊ້."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ໃຊ້ຮາດແວການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າ"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ອະນຸຍາດໃຫ້ແອັບໃຊ້ຮາດແວການກວດສອບຄວາມຖືກຕ້ອງດ້ວຍໃບໜ້າສຳລັບການກວດສອບຄວາມຖືກຕ້ອງ"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"ການພິສູດຢືນຢັນດ້ວຍໃບໜ້າ"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"ໃຊ້ຮາດແວການປົດລັອກໃບໜ້າ"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"ອະນຸຍາດໃຫ້ແອັບໃຊ້ຮາດແວການປົດລັອກດ້ວຍໜ້າເພື່ອພິສູດຢືນຢັນ"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"ປົດລັອກດ້ວຍໜ້າ"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"ລົງທະບຽນໃບໜ້າຂອງທ່ານຄືນໃໝ່"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ເພື່ອປັບປຸງການຈຳແນກ, ກະລຸນາລົງທະບຽນໃບໜ້າຂອງທ່ານຄືນໃໝ່."</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"ບໍ່ສາມາດບັນທຶກຂໍ້ມູນໃບໜ້າທີ່ຖືກຕ້ອງໄດ້. ກະລຸນາລອງໃໝ່."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ຍ້າຍໂທລະສັບໄປທາງຊ້າຍ."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ຍ້າຍໂທລະສັບໄປທາງຂວາ."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"ກະລຸນາເບິ່ງອຸປະກອນຂອງທ່ານໃຫ້ຊື່ໆ."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ບໍ່ສາມາດເບິ່ງເຫັນໜ້າຂອງທ່ານໄດ້. ກະລຸນາເບິ່ງໂທລະສັບ."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ຫັນໜ້າຂອງທ່ານໄປໃສ່ໜ້າໂທລະສັບໂດຍກົງ."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ເຄື່ອນໄຫວຫຼາຍເກີນໄປ. ກະລຸນາຖືໂທລະສັບໄວ້ຊື່ໆ."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"ກະລຸນາລົງທະບຽນອຸປະກອນຂອງທ່ານອີກເທື່ອໜຶ່ງ."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ບໍ່ສາມາດຈຳແນກໃບໜ້າໄດ້ອີກຕໍ່ໄປ. ກະລຸນາລອງໃໝ່."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"ອຽງຫົວຂອງທ່ານໜ້ອຍໜຶ່ງ."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"ອຽງຫົວຂອງທ່ານໜ້ອຍໜຶ່ງ."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"ນຳສິ່ງທີ່ກີດຂວາງໃບໜ້າທ່ານອອກ."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"ທຳຄວາມສະອາດເຊັນເຊີຢູ່ເທິງສຸດຂອງຂອບຈໍ."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"ທຳຄວາມສະອາດສ່ວນເທິງສຸດຂອງໜ້າຈໍທ່ານ, ຮວມທັງແຖບດຳນຳ"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"ບໍ່ສາມາດຢັ້ງຢືນໃບໜ້າໄດ້. ບໍ່ມີຮາດແວໃຫ້ໃຊ້."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"ລອງໃຊ້ການພິສູດຢືນຢັນໃບໜ້າອີກເທື່ອໜຶ່ງ"</string> + <string name="face_error_timeout" msgid="981512090365729465">"ລອງປົດລັອກດ້ວຍໜ້າອີກເທື່ອໜຶ່ງ."</string> <string name="face_error_no_space" msgid="2712120617457553825">"ບໍ່ສາມາດບັນທຶກຂໍ້ມູນໃບໜ້າໃໝ່ໄດ້. ກະລຸນາລຶບຂໍ້ມູນເກົ່າອອກກ່ອນ."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"ຍົກເລີກການດຳເນີນການກັບໃບໜ້າແລ້ວ"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"ຜູ້ໃຊ້ຍົກເລີກການພິສູດຢືນຢັນໃບໜ້າແລ້ວ"</string> + <string name="face_error_canceled" msgid="283945501061931023">"ຍົກເລີກການດຳເນີນການກັບໃບໜ້າແລ້ວ."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"ຜູ້ໃຊ້ຍົກເລີກການປົດລັອກດ້ວຍໜ້າແລ້ວ."</string> <string name="face_error_lockout" msgid="3407426963155388504">"ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ກະລຸນາລອງໃໝ່ໃນພາຍຫຼັງ."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"ພະຍາຍາມຫຼາຍເທື່ອເກີນໄປ. ປິດການພິສູດຢືນຢັນດ້ວຍໃບໜ້າແລ້ວ."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"ພະຍາຍາມຫຼາຍເທື່ອເກີນໄປ. ປິດນຳໃຊ້ການປົດລັອກດ້ວຍໜ້າແລ້ວ."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"ບໍ່ສາມາດຢັ້ງຢືນໃບໜ້າໄດ້. ກະລຸນາລອງໃໝ່."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"ທ່ານຍັງບໍ່ໄດ້ຕັ້ງຄ່າການພິສູດຢືນຢັນດ້ວຍໃບໜ້າເທື່ອ"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"ບໍ່ຮອງຮັບການພິສູດຢືນຢັນໃບໜ້າຢູ່ອຸປະກອນນີ້"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"ທ່ານຍັງບໍ່ໄດ້ຕັ້ງການປົດລັອກດ້ວຍໜ້າເທື່ອ."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"ບໍ່ຮອງຮັບການປົດລັອກດ້ວຍໜ້າຢູ່ອຸປະກອນນີ້."</string> <string name="face_name_template" msgid="7004562145809595384">"ໃບໜ້າ <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index e3163cf8bfc8..f0ce8621142c 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -97,6 +97,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Balso pašto pranešimai"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"„Wi-Fi“ skambinimas"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM būsena"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Didelio prioriteto SIM kortelės būsena"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Lygiavertis naudotojas pateikė užklausą dėl TTY režimo FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Lygiavertis naudotojas pateikė užklausą dėl TTY režimo HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Lygiavertis naudotojas pateikė užklausą dėl TTY režimo VCO"</string> @@ -556,11 +557,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Piršto antspaudo piktograma"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"tvarkyti veido autentifikavimo aparatinę įrangą"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"tvarkyti Atrakinimo pagal veidą aparatinę įrangą"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Programai leidžiama aktyv. metodus, norint pridėti ir ištrinti naudojamus veidų šablonus."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"naudoti veido autentifikavimo aparatinę įrangą"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Programai leidžiama naudoti veido autentifikavimo aparatinę įrangą tapatybei nustatyti"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Veido autentifikavimas"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"naudoti Atrakinimo pagal veidą aparatinę įrangą"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Programai leidžiama naudoti Atrakinimo pagal veidą aparatinę įrangą tapatybei nustatyti"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Atrakinimas pagal veidą"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Pakartotinis veido registravimas"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Kad patobulintumėte atpažinimą, iš naujo užregistruokite veidą"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Neužfiks. tikslūs veido duom. Bandykite dar kartą."</string> @@ -573,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Pasukite telefoną kairėn."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Pasukite telefoną dešinėn."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Žiūrėkite tiesiai į įrenginį."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Nematau jūsų veido. Žiūrėkite į telefoną."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Veidas turi būti prieš telefoną."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Įrenginys per daug judinamas. Nejudink. telefono."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Užregistruokite veidą iš naujo."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Nebegalima atpažinti veido. Bandykite dar kartą."</string> @@ -582,19 +583,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Nesukite tiek galvos."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Nesukite tiek galvos."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Patraukite viską, kas užstoja jūsų veidą."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Nuvalykite jutiklį, esantį ekrano viršuje."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Išvalykite ekrano viršų, įskaitant juodą juostą"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Nepavyko patv. veido. Aparatinė įranga negalima."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Bandykite naudoti veido autentifikavimą dar kartą."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Band. naudoti Atrakinimą pagal veidą dar kartą."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Nepavyko išs. naujų veido duomenų. Pirm. ištrinkite senus."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Veido atpažinimo operacija atšaukta"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Veido autentifikavimą atšaukė naudotojas"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Veido atpažinimo operacija atšaukta."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Atrakinimą pagal veidą atšaukė naudotojas."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Per daug bandymų. Vėliau bandykite dar kartą."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Per daug bandymų. Veido autentifikavimas išjungtas."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Per daug bandymų. Atrakinimas pagal veidą išjungtas."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Nepavyko patvirtinti veido. Bandykite dar kartą."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Nenustatėte veido autentifikavimo"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Veido autentifikavimo funkcija šiame įrenginyje nepalaikoma"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Nenustatėte Atrakinimo pagal veidą."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Atrakinimas pagal veidą šiame įrenginyje nepalaikomas."</string> <string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g> veidas"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index e5e9dfc903c1..bed07f26da80 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -96,6 +96,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Balss pasta ziņojumi"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi zvani"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM kartes statuss"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Augstas prioritātes SIM kartes statuss"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Vienādranga ierīce pieprasīja teksta tālruņa režīmu FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Vienādranga ierīce pieprasīja teksta tālruņa režīmu HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Vienādranga ierīce pieprasīja teksta tālruņa režīmu VCO"</string> @@ -553,11 +554,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Pirksta nospieduma ikona"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"pārvaldīt sejas autentifikācijas aparatūru"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"pārvaldīt aparatūru, kas paredzēta autorizācijai pēc sejas"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Atļauj lietotnei izsaukt metodes izmantojamo sejas veidņu pievienošanai un dzēšanai."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"izmantot sejas autentifikācijas aparatūru"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Atļauj lietotnei izmantot sejas autentifikācijas aparatūru autentificēšanai"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Sejas autentificēšana"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"lietot aparatūru, kas paredzēta autorizācijai pēc sejas"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Atļauj lietotnei izmantot autentificēšanai aparatūru, ar ko veic autorizāciju pēc sejas"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Autorizācija pēc sejas"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Atkārtoti reģistrējiet seju"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Lai uzlabotu atpazīšanu, lūdzu, atkārtoti reģistrējiet savu seju"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Neizdevās tvert sejas datus. Mēģiniet vēlreiz."</string> @@ -570,7 +571,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Pārvietojiet tālruni pa kreisi."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Pārvietojiet tālruni pa labi."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Lūdzu, tiešāk skatieties uz savu ierīci."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Jūsu seja nav redzama. Paskatieties uz tālruni."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Novietojiet savu seju tieši pretī tālrunim."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Pārāk daudz kustību. Nekustīgi turiet tālruni."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Lūdzu, atkārtoti reģistrējiet savu seju."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Seju vairs nevar atpazīt. Mēģiniet vēlreiz."</string> @@ -579,19 +580,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Pagrieziet galvu nedaudz mazāk."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Pagrieziet galvu nedaudz mazāk."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Noņemiet visu, kas aizsedz jūsu seju."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Notīriet sensoru ekrāna augšējā malā."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Notīriet ekrāna augšdaļu, tostarp melno joslu."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Nevar verificēt seju. Aparatūra nav pieejama."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Vēlreiz veiciet sejas autentificēšanu."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Vēlreiz mēģiniet veikt autorizāciju pēc sejas."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Nevar saglabāt jaunās sejas datus. Dzēsiet kādu no vecajām."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Darbība ar sejas datiem atcelta"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Lietotājs atcēla sejas autentificēšanu"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Darbība ar sejas datiem atcelta."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Lietotājs atcēla autorizāciju pēc sejas."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Pārāk daudz mēģinājumu. Vēlāk mēģiniet vēlreiz."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Pārāk daudz mēģinājumu. Sejas autentificēšana ir atspējota."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Pārāk daudz mēģinājumu. Autorizācija pēc sejas ir atspējota."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Nevar verificēt seju. Mēģiniet vēlreiz."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Sejas autentifikācija nav iestatīta"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Sejas autentificēšana šajā ierīcē netiek atbalstīta"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Autorizācija pēc sejas nav iestatīta."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Autorizācija pēc sejas šajā ierīcē netiek atbalstīta"</string> <string name="face_name_template" msgid="7004562145809595384">"Seja <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-mcc313-mnc100/config.xml b/core/res/res/values-mcc313-mnc100/config.xml new file mode 100644 index 000000000000..ccd03f10616a --- /dev/null +++ b/core/res/res/values-mcc313-mnc100/config.xml @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2019, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array translatable="false" name="config_twoDigitNumberPattern"> + <item>"0"</item> + <item>"00"</item> + <item>"*0"</item> + <item>"*1"</item> + <item>"*2"</item> + <item>"*3"</item> + <item>"*4"</item> + <item>"*5"</item> + <item>"*6"</item> + <item>"*7"</item> + <item>"*8"</item> + <item>"*9"</item> + <item>"#0"</item> + <item>"#1"</item> + <item>"#2"</item> + <item>"#3"</item> + <item>"#4"</item> + <item>"#5"</item> + <item>"#6"</item> + <item>"#7"</item> + <item>"#8"</item> + <item>"#9"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 8bac7f612abe..530b0237e822 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Пораки од говорна пошта"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Повикување преку Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Статус на SIM-картичка"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Статус на SIM-известувања со висок приоритет"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Рамноправен уред го побара режимот на TTY „FULL“"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Рамноправен уред го побара режимот на TTY „HCO“"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Рамноправен уред го побара режимот на TTY „VCO“"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Икона за отпечатоци"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"управува со хардвер за проверка на лице"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"управува со хардвер за „Отклучување со лик“"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Дозволува апликац. да повика начини за додавање и бришење шаблони на лице за користење."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"користи хардвер за проверка на лице"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Дозволува апликацијата да користи хардвер за лице за проверка"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Проверка на лик"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"користи хардвер за „Отклучување со лик“"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Дозволува апликацијата да користи хардвер за „Отклучување со лик“ за проверка"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Отклучување со лик"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Повторно регистрирајте го ликот"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"За да се подобри препознавањето, повторно регистрирајте го ликот"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Не се сними прецизна слика. Обидете се повторно."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Поместете го телефонот налево."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Поместете го телефонот надесно."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Погледнете подиректно во уредот."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Не ви се гледа ликот. Гледајте во телефонот."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Наместете го лицето директно пред телефонот."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Премногу движење. Држете го телефонот стабилно."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Повторно регистрирајте го лицето."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ликот не се препознава. Обидете се повторно."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Не вртете ја главата толку многу."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Не вртете ја главата толку многу."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Отстранете ги работите што ви го покриваат лицето."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Исчистете го сензорот на горниот врв од екранот."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Исчистете го врвот на екранот, вклучувајќи ја црната лента"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Ликот не може да се потврди. Хардвер - недостапен."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Пробајте ја проверката на лице повторно."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Пробајте „Отклучување со лик“ повторно."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Не се зачуваа податоците за нов лик. Избришете го стариот."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Операцијата со лик се откажа"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Проверката на ликот е откажана од корисникот"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Операцијата со лице се откажа."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"„Отклучувањето со лик“ е откажано од корисникот."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Премногу обиди. Обидете се повторно подоцна."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Премногу обиди. Проверката на лик е оневозможена."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Премногу обиди. „Отклучувањето со лик“ е оневозможено."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Ликот не може да се потврди. Обидете се повторно."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Не сте поставиле проверка на лик"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Проверката на лик не е поддржана на уредов"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Не сте поставиле „Отклучување со лик“."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"„Отклучувањето со лик“ не е поддржано на уредов."</string> <string name="face_name_template" msgid="7004562145809595384">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index cf49ab2134df..9ad8b1341567 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"വോയ്സ്മെയിൽ സന്ദേശങ്ങൾ"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"വൈഫൈ കോളിംഗ്"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"സിം നില"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"ഉയർന്ന മുൻഗണനയുള്ള സിം നില"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് \'ഫുൾ\'"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"വിരലടയാള ഐക്കൺ"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"മുഖം തിരിച്ചറിയൽ ഹാർഡ്വെയർ മാനേജ് ചെയ്യുക"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ഹാർഡ്വെയർ മാനേജ് ചെയ്യുക"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"ഉപയോഗിക്കാനായി, മുഖത്തിന്റെ ടെംപ്ലേറ്റുകൾ ചേർക്കാനും ഇല്ലാതാക്കാനുമുള്ള രീതികൾ അഭ്യർത്ഥിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"മുഖം തിരിച്ചറിയൽ ഹാർഡ്വെയർ ഉപയോഗിക്കുക"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"പരിശോധിച്ചുറപ്പിക്കലിനായി മുഖം തിരിച്ചറിയൽ ഹാർഡ്വെയർ ഉപയോഗിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"മുഖം പരിശോധിച്ചുറപ്പിക്കൽ"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ഹാർഡ്വെയർ ഉപയോഗിക്കുക"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"പരിശോധിച്ചുറപ്പിക്കാൻ മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ഹാർഡ്വെയർ ഉപയോഗിക്കാൻ അനുവദിക്കുന്നു"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക്"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"നിങ്ങളുടെ മുഖം വീണ്ടും എൻറോൾ ചെയ്യൂ"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"തിരിച്ചറിയൽ മെച്ചപ്പെടുത്താൻ, നിങ്ങളുടെ മുഖം ദയവായി വീണ്ടും എൻറോൾ ചെയ്യൂ"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"കൃത്യ മുഖ ഡാറ്റ എടുക്കാനായില്ല. വീണ്ടും ശ്രമിക്കൂ."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ഫോൺ ഇടത്തോട്ട് നീക്കുക."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ഫോൺ വലത്തോട്ട് നീക്കുക."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"നിങ്ങളുടെ ഉപകരണത്തിന് നേരെ കൂടുതൽ നന്നായി നോക്കുക."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"നിങ്ങളുടെ മുഖം കാണാനാവുന്നില്ല. ഫോണിലേക്ക് നോക്കൂ."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"നിങ്ങളുടെ മുഖം ക്യാമറയ്ക്ക് നേരെയാക്കുക."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"വളരെയധികം ചലനം. ഫോൺ അനക്കാതെ നേരെ പിടിക്കുക."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"നിങ്ങളുടെ മുഖം വീണ്ടും എൻറോൾ ചെയ്യുക."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ഇനി മുഖം തിരിച്ചറിയാനാവില്ല. വീണ്ടും ശ്രമിക്കൂ."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"നിങ്ങളുടെ തല ഇത്ര തിരിക്കേണ്ട."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"നിങ്ങളുടെ തല ഇത്ര തിരിക്കേണ്ട."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"നിങ്ങളുടെ മുഖം മറയ്ക്കുന്നത് എല്ലാം നീക്കം ചെയ്യൂ."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"സ്ക്രീനിന്റെ മുകളിലെ സെൻസർ വൃത്തിയാക്കുക."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"കറുപ്പ് ബാർ ഉൾപ്പെടെ നിങ്ങളുടെ സ്ക്രീനിന്റെ മുകൾഭാഗം വൃത്തിയാക്കുക"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"മുഖം പരിശോധിക്കാൻ കഴിയില്ല. ഹാർഡ്വെയർ ലഭ്യമല്ല."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"മുഖം പരിശോധിച്ചുറപ്പിക്കാൻ വീണ്ടും ശ്രമിക്കുക."</string> + <string name="face_error_timeout" msgid="981512090365729465">"മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് വീണ്ടും പരീക്ഷിക്കൂ"</string> <string name="face_error_no_space" msgid="2712120617457553825">"പുതിയ മുഖ ഡാറ്റ സംഭരിക്കാനാകില്ല. ആദ്യം പഴയത് ഇല്ലാതാക്കുക."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"മുഖം തിരിച്ചറിയൽ പ്രവർത്തനം റദ്ദാക്കി"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"മുഖം പരിശോധിച്ചുറപ്പിക്കൽ ഉപയോക്താവ് റദ്ദാക്കി"</string> + <string name="face_error_canceled" msgid="283945501061931023">"മുഖത്തിന്റെ പ്രവർത്തനം റദ്ദാക്കി."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"ഉപയോക്താവ് മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് റദ്ദാക്കി"</string> <string name="face_error_lockout" msgid="3407426963155388504">"നിരവധി തവണ ശ്രമിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"വളരെയധികം ശ്രമങ്ങൾ. മുഖം തിരിച്ചറിയൽ പ്രവർത്തനരഹിതമാക്കി."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"വളരെയധികം ശ്രമങ്ങൾ. മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് പ്രവർത്തനരഹിതമാക്കി"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"മുഖം പരിശോധിക്കാൻ കഴിയില്ല. വീണ്ടും ശ്രമിക്കൂ."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"നിങ്ങൾ മുഖം പരിശോധിച്ചുറപ്പിക്കൽ സജ്ജീകരിച്ചില്ല"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"ഈ ഉപകരണം മുഖം പരിശോധിച്ചുറപ്പിക്കൽ പിന്തുണയ്ക്കുന്നില്ല"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് സജ്ജീകരിച്ചില്ല."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക് ഈ ഉപകരണം പിന്തുണയ്ക്കുന്നില്ല."</string> <string name="face_name_template" msgid="7004562145809595384">"മുഖം <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index c8cea4956bc8..d5f358b20997 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Дуут шуудангийн мессеж"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi дуудлага"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM статус"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Өндөр ач холбогдолтой SIM-н статус"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Хандлагын цэгт хүсэлт тавьсан TTY Mode FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Хандлагын цэгт хүсэлт тавьсан TTY Mode HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Хандлагын цэгт хүсэлт тавьсан TTY Mode VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Хурууны хээний дүрс"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"царай танилтын техник хангамжийг удирдах"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"царайгаар тайлах техник хангамжийг удирдах"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Аппад царайны загварыг ашиглахын тулд нэмэх эсвэл устгах аргыг идэвхжүүлэхийг зөвшөөрдөг."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"царай танилтын техник хангамжийг ашиглах"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Аппад царай танилтын техник хангамжийг баталгаажуулалтад ашиглахыг зөвшөөрдөг"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Царайн нотолгоо"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"царайгаар тайлах техник хангамж ашиглах"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Аппад царайгаар тайлах техник хангамжийг баталгаажуулалтад ашиглахыг зөвшөөрдөг"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Царайгаар тайлах"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Царайгаа дахин бүртгүүлнэ үү"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Танилтыг сайжруулахын тулд царайгаа дахин бүртгүүлнэ үү"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Царайн өгөгдлийг зөв авч чадсангүй. Дахин оролдоно уу."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Утсаа зүүн тийш болгоно уу."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Утсаа баруун тийш болгоно уу."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Төхөөрөмж рүүгээ аль болох эгц харна уу."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Таны царайг харахгүй байна. Утас руу харна уу."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Царайгаа утасны урд эгц байрлуулна уу"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Хэт их хөдөлгөөнтэй байна. Утсаа хөдөлгөөнгүй барина уу."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Нүүрээ дахин бүртгүүлнэ үү."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Царайг таних боломжгүй боллоо. Дахин оролдоно уу."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Толгойгоо арай багаар эргүүлнэ үү."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Толгойгоо арай багаар эргүүлнэ үү."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Таны нүүрийг далдалж буй аливаа зүйлийг хасна уу."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Дэлгэцийн дээд ирмэгт байрлах мэдрэгчийг цэвэрлэнэ үү."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Хар хэсэг зэрэг дэлгэцийнхээ дээд хэсгийг цэвэрлэнэ үү"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Царайг бататгаж чадсангүй. Техник хангамж боломжгүй байна."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Царайн нотолгоог дахин оролдоно уу."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Царайгаар тайлахыг дахин оролдоно уу."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Царайн шинэ өгөгдлийг хадгалж чадсангүй. Эхлээд хуучин өгөгдлийг устгана уу."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Царайн үйл ажиллагааг цуцаллаа"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Хэрэглэгч царайн нотолгоог цуцалсан байна"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Царайны үйл ажиллагааг цуцаллаа."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Хэрэглэгч царайгаар тайлахыг цуцалсан."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Хэт олон удаа оролдлоо. Дараа дахин оролдоно уу."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Хэт олон удаа оролдлоо. Царайн нотолгоог идэвхгүй болголоо."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Хэтэрхий олон удаа оролдлоо. Царайгаар тайлахыг идэвхгүй болголоо."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Царайг бататгаж чадсангүй. Дахин оролдоно уу."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Та царайн нотолгоог тохируулаагүй байна"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Царайн нотолгоог энэ төхөөрөмж дээр дэмждэггүй"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Та царайгаар тайлахыг тохируулаагүй байна."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Царайгаар тайлахыг энэ төхөөрөмж дээр дэмждэггүй."</string> <string name="face_name_template" msgid="7004562145809595384">"Царай <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index d3d5a8f99898..faafeb70df32 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"व्हॉइसमेल मेसेज"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"वाय-फाय कॉलिंग"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"सिम स्थिती"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"उच्च प्राधान्य सिम स्थिती"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"समवयस्क व्यक्तीने TTY मोड पूर्ण ची विनंती केली"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"समवयस्क व्यक्तीने TTY मोड HCO ची विनंती केली"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"समवयस्क व्यक्तीने TTY मोड VCO ची विनंती केली"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"फिंगरप्रिंट आयकन"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"चेहरा ऑथेंटिकेशन हार्डवेअर व्यवस्थापित करा"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"फेस अनलॉक हार्डवेअर व्यवस्थापित करा"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"अॅपला वापरासाठी चेहरा टेम्पलेट जोडण्याच्या आणि हटवण्याच्या पद्धती जारी करू देते."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"चेहरा ऑथेंटिकेशन हार्डवेअर वापरा"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"अॅपला चेहरा ऑथेंटिकेशनसाठी ऑथेंटिकेशन हार्डवेअर वापरू देते"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"फेस ऑथेंटिकेशन"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"फेस अनलॉक हार्डवेअर वापरा"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"अॅपला ऑथेंटिकेशनसाठी फेस अनलॉक हार्डवेअर वापरण्याची अनुमती देते"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"फेस अनलॉक"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"तुमच्या चेहऱ्याची पुन्हा नोंदणी करा"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ओळखण्यामध्ये सुधारणा करण्यासाठी, कृपया तुमच्या चेहऱ्याची पुन्हा नोंदणी करा"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"अचूक फेस डेटा कॅप्चर करता आला नाही. पुन्हा करा."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"फोन डावीकडे हलवा."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"फोन उजवीकडे हलवा."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"कृपया तुमच्या डिव्हाइसकडे थेट पाहा"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"तुमचा चेहरा दिसत नाही. फोनकडे पहा."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"तुमचा चेहरा थेट फोन समोर आणा."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"खूप हलत आहे. फोन स्थिर धरून ठेवा."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"कृपया तुमच्या चेहऱ्याची पुन्हा नोंदणी करा."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"चेहरा ओळखू शकत नाही. पुन्हा प्रयत्न करा."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"तुमचे डोके थोडे कमी फिरवा."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"तुमचे डोके थोडे कमी फिरवा."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"तुमचा चहेरा लपवणारे काहीही काढून टाका."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"स्क्रीनच्या वरील उजव्या कडेवरील सेन्सर साफ करा."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"ब्लॅक बार सह तुमच्या स्क्रीनची वरची बाजू साफ करा"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"चेहरा पडताळू शकत नाही. हार्डवेअर उपलब्ध नाही."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"चेहरा ऑथेंटिकेशनचा पुन्हा प्रयत्न करा"</string> + <string name="face_error_timeout" msgid="981512090365729465">"फेस अनलॉकचा पुन्हा प्रयत्न करा."</string> <string name="face_error_no_space" msgid="2712120617457553825">"नवीन फेस डेटा स्टोअर करू शकत नाही. आधी जुना हटवा."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"फेस ऑपरेशन रद्द केले आहे"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"वापरकर्त्याने फेस ऑथेंटिकेशन रद्द केले आहे"</string> + <string name="face_error_canceled" msgid="283945501061931023">"चेहरा ऑपरेशन रद्द केले गेले."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"वापरकर्त्याने फेस अनलॉक रद्द केले आहे."</string> <string name="face_error_lockout" msgid="3407426963155388504">"खूप जास्त प्रयत्न केले. नंतर पुन्हा प्रयत्न करा."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"बरेच प्रयत्न. फेस ऑथेंटिकेशन बंद केले आहे."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"बरेच प्रयत्न. फेस अनलॉक बंद केले आहे."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"चेहरा पडताळणी करू शकत नाही. पुन्हा प्रयत्न करा."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"तुम्ही फेस ऑथेंटिकेशन सेट केले नाही"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"या डिव्हाइसवर फेस ऑथेंटिकेशन ला सपोर्ट होत नाही"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"तुम्ही फेस अनलॉक सेट केले नाही."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"या डिव्हाइसवर फेस अनलॉकला सपोर्ट नाही."</string> <string name="face_name_template" msgid="7004562145809595384">"चेहरा <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 7c19f44b4aea..b6743f4b257a 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mesej mel suara"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Panggilan Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Status SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Status SIM keutamaan tinggi"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Rakan meminta Mod TTY PENUH"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Rakan meminta Mod TTY HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Rakan meminta Mod TTY VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon cap jari"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"urus perkakasan pengesahan wajah"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"urus perkakasan wajah buka kunci"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Membenarkan apl menggunakan kaedah untuk menambahkan dan memadamkan templat wajah untuk digunakan."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"gunakan perkakasan pengesahan wajah"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Membenarkan apl menggunakan perkakasan pengesahan wajah untuk pengesahan"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Pengesahan Wajah"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"gunakan perkakasan wajah buka kunci"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Membenarkan apl menggunakan perkakasan wajah buka kunci untuk pengesahan"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Wajah buka kunci"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Daftarkan semula wajah anda"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Untuk meningkatkan pengecaman, sila daftarkan semula wajah anda"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Gagal menangkap data wajah dgn tepat. Cuba lagi."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Alihkan telefon ke kiri."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Alihkan telefon ke kanan."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Sila lihat terus pada peranti anda."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Gagal mengesan wajah anda. Lihat telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Letakkan wajah anda betul-betul di depan telefon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Terlalu bnyk gerakan. Pegang telefon dgn stabil."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Sila daftarkan semula wajah anda."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Tidak lagi dapat mengecam wajah. Cuba lagi."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Pusingkan kepala anda kurang sedikit."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Pusingkan kepala anda kurang sedikit."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Alih keluar apa saja yang melindungi wajah anda."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Bersihkan penderia di tepi bahagian atas skrin."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Bersihkan bahagian atas skrin anda, termasuk bar hitam"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Tdk dpt sahkan wajah. Perkakasan tidak tersedia."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Cuba pengesahan wajah sekali lagi."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Cuba wajah buka kunci sekali lagi."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Tdk dpt menyimpan data wajah baharu. Padamkan yg lama dahulu."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Pengendalian wajah dibatalkan"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Pengesahan wajah dibatalkan oleh pengguna"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Pengendalian wajah dibatalkan."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Wajah buka kunci dibatalkan oleh pengguna."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Terlalu banyak percubaan. Cuba sebentar lagi."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Terlalu banyak percubaan. Pengesahan wajah dilumpuhkan."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Terlalu banyak percubaan. Wajah buka kunci dilumpuhkan."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Tidak dapat mengesahkan wajah. Cuba lagi."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Anda belum menyediakan pengesahan wajah"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Pengesahan wajah tidak disokong pada peranti ini"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Anda belum menyediakan wajah buka kunci."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Wajah buka kunci tidak disokong pada peranti ini."</string> <string name="face_name_template" msgid="7004562145809595384">"Wajah <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index d590e2538e34..ad5aaca1a2b9 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"အသံမေးလ် မက်ဆေ့ဂျ်များ"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi ခေါ်ဆိုမှု"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"ဆင်းမ်ကဒ် အခြေအနေ"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"အထူးဦးစားပေး ဆင်းမ်ကတ်အခြေအနေ"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"အခြားစက်မှ TTY မုဒ် FULL ပြုရန် တောင်းဆို၏"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"အခြားစက်မှ TTY မုဒ် HCO ပြုရန် တောင်းဆို၏"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"TTY မုဒ် VCO ပြုရန် အခြားစက်မှ တောင်းဆို၏"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"လက်ဗွေ အိုင်ကွန်"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"မျက်နှာအထောက်အထားစိစစ်ခြင်း စက်ပစ္စည်းကို စီမံပါ"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"မျက်နှာမှတ် သော့ဖွင့်ခြင်း စက်ပစ္စည်းကို စီမံခြင်း"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"အသုံးပြုရန်အတွက် မျက်နှာပုံစံထည့်ရန် (သို့) ဖျက်ရန်နည်းလမ်းကို အက်ပ်အား သုံးခွင့်ပြုသည်။"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"မျက်နှာအထောက်အထားစိစစ်ခြင်း စက်ပစ္စည်းကို သုံးပါ"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"အထောက်အထားစိစစ်ရန်အတွက် ဤအက်ပ်အား မျက်နှာအထောက်အထားစိစစ်ခြင်း စက်ပစ္စည်းကိုသုံးခွင့်ပြုသည်"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"မျက်နှာ စိစစ်ခြင်း"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"မျက်နှာမှတ် သော့ဖွင့်ခြင်း စက်ပစ္စည်းကို သုံးပါ"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"အထောက်အထားစိစစ်ရန်အတွက် ဤအက်ပ်အား မျက်နှာမှတ်သော့ဖွင့်ခြင်း စက်ပစ္စည်းကိုသုံးခွင့်ပြုသည်"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"မျက်နှာမှတ် သော့ဖွင့်ခြင်း"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"သင့်မျက်နှာကို စာရင်းပြန်သွင်းပါ"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ပိုမှတ်မိစေရန် သင့်မျက်နှာကို စာရင်းပြန်သွင်းပါ"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"မျက်နှာဒေတာ အမှန် မရိုက်ယူနိုင်ပါ၊ ထပ်စမ်းကြည့်ပါ။"</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ဖုန်းကို ဘယ်ဘက်သို့ရွှေ့ပါ။"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ဖုန်းကို ညာဘက်သို့ ရွှေ့ပါ။"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"သင့်စက်ပစ္စည်းကို တည့်တည့်ကြည့်ပါ။"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"သင့်မျက်နှာကို မမြင်ရပါ။ ဖုန်းကိုကြည့်ပါ။"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"မျက်နှာကို ဖုန်းရှေ့တွင် တည့်အောင်ထားပါ။"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"လှုပ်လွန်းသည်။ ဖုန်းကို ငြိမ်ငြိမ်ကိုင်ပါ။"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"သင့်မျက်နှာကို ပြန်စာရင်းသွင်းပါ။"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"မျက်နှာ မမှတ်သားနိုင်တော့ပါ။ ထပ်စမ်းကြည့်ပါ။"</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"ခေါင်းကို သိပ်မလှည့်ပါနှင့်။"</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"ခေါင်းကို သိပ်မလှည့်ပါနှင့်။"</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"သင့်မျက်နှာကို ကွယ်နေသည့်အရာအားလုံး ဖယ်ပါ။"</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"မျက်နှာပြင်ထိပ်ရှိ အာရုံခံဆင်ဆာကို သန့်ရှင်းပါ။"</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"အနက်ရောင်ဘားအပါအဝင် ဖန်သားပြင်ထိပ်ကို သန့်ရှင်းရေး လုပ်ပါ"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"မျက်နှာကို အတည်ပြု၍ မရပါ။ ဟာ့ဒ်ဝဲ မရနိုင်ပါ။"</string> - <string name="face_error_timeout" msgid="3202585609451248103">"မျက်နှာဖြင့် ထပ်မံ၍ အထောက်အထား စိစစ်ကြည့်ပါ။"</string> + <string name="face_error_timeout" msgid="981512090365729465">"မျက်နှာမှတ် သော့ဖွင့်ခြင်းကို ထပ်စမ်းကြည့်ပါ။"</string> <string name="face_error_no_space" msgid="2712120617457553825">"မျက်နှာဒေတာအသစ် သိမ်း၍မရပါ။ အဟောင်းကို အရင်ဖျက်ပါ။"</string> - <string name="face_error_canceled" msgid="2768146728600802422">"မျက်နှာဆိုင်ရာ ဆောင်ရွက်မှုကို ပယ်ဖျက်လိုက်ပါပြီ"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"အသုံးပြုသူက မျက်နှာအထောက်အထားစိစစ်မှု မလုပ်တော့ပါ"</string> + <string name="face_error_canceled" msgid="283945501061931023">"မျက်နှာ ဆောင်ရွက်ခြင်းကို ပယ်ဖျက်လိုက်ပါပြီ။"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"မှတ်နှာမှတ် သော့ဖွင့်ခြင်းကို အသုံးပြုသူက မလုပ်တော့ပါ။"</string> <string name="face_error_lockout" msgid="3407426963155388504">"အကြိမ်များစွာ စမ်းပြီးပါပြီ။ နောက်မှထပ်စမ်းပါ။"</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"စမ်းသပ်ကြိမ် များနေပြီ။ မျက်နှာစိစစ်ခြင်း ပိတ်လိုက်သည်။"</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"စမ်းသပ်ကြိမ် များနေပြီ။ မျက်နှာမှတ် သော့ဖွင့်ခြင်းကို ပိတ်လိုက်ပါပြီ။"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"မျက်နှာကို အတည်ပြု၍ မရပါ။ ထပ်စမ်းကြည့်ပါ။"</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"မျက်နှာ အထောက်အထားစိစစ်ခြင်းကို ထည့်သွင်းမထားပါ"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"ဤစက်ပစ္စည်းတွင် မျက်နှာအထောက်အထား စိစစ်ခြင်းကို သုံး၍မရပါ"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"မျက်နှာမှတ် သော့ဖွင့်ခြင်းကို ထည့်သွင်းမထားပါ"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"ဤစက်ပစ္စည်းတွင် မျက်နှာမှတ် သော့ဖွင့်ခြင်းကို သုံး၍မရပါ။"</string> <string name="face_name_template" msgid="7004562145809595384">"မျက်နှာ <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 42139422529c..c6d16987c005 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Talepostmeldinger"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-anrop"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-status"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"SIM-status er satt til høy prioritet"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Motpart ba om TTY-modus FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Motpart ba om TTY-modus HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Motpart ba om TTY-modus VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon for fingeravtrykk"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"administrere maskinvare for ansiktsautentisering"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"administrere maskinvare for Ansiktslås"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Lar appen bruke metoder for å legge til og slette ansiktmaler for bruk."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"bruke maskinvare for ansiktsautentisering"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Lar appen bruke maskinvare for ansiktsautentisering til autentisering"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Ansiktsautentisering"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"bruke maskinvare for Ansiktslås"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Lar appen bruke maskinvare for Ansiktslås til autentisering"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Ansiktslås"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Registrer ansiktet ditt på nytt"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"For å forbedre gjenkjennelse, registrer ansiktet ditt på nytt"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Kunne ikke ta opp nøyaktige ansiktsdata Prøv igjen"</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Flytt telefonen til venstre."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Flytt telefonen til høyre."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Se mer direkte på enheten din."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Kan ikke se ansiktet ditt. Se på telefonen."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Hold ansiktet ditt rett foran telefonen."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"For mye bevegelse. Hold telefonen stødig."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registrer ansiktet ditt på nytt."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Kan ikke gjenkjenne ansiktet lenger. Prøv igjen."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Vri hodet ditt litt mindre."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Vri hodet ditt litt mindre."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Fjern alt som skjuler ansiktet ditt."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Rengjør sensoren på toppkanten av skjermen."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Rengjør den øverste delen av skjermen, inkludert den svarte linjen"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Kan ikke bekrefte ansikt. Utilgjengelig maskinvare."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Prøv ansiktsautentisering igjen."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Prøv Ansiktslås igjen."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Kan ikke lagre nye ansiktsdata. Slett gamle data først."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Ansiktsoperasjonen ble avbrutt"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Ansiktsautentiseringen ble avbrutt av brukeren"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Ansikt-operasjonen ble avbrutt."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Ansiktslås ble avbrutt av brukeren."</string> <string name="face_error_lockout" msgid="3407426963155388504">"For mange forsøk. Prøv igjen senere."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"For mange forsøk. Ansiktsautentisering er slått av."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"For mange forsøk. Ansiktslås er slått av."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Kan ikke bekrefte ansiktet. Prøv igjen."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Du har ikke konfigurert ansiktsautentisering"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Ansiktsautentisering støttes ikke på denne enheten"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Du har ikke konfigurert Ansiktslås."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Ansiktslås støttes ikke på denne enheten"</string> <string name="face_name_template" msgid="7004562145809595384">"Ansikt <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 717d7d8c4866..47392328f27f 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"भ्वाइस मेल सन्देशहरू"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi कल"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM को स्थिति"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"उच्च प्राथमिकता रहेको SIM को स्थिति"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"सहकर्मी अनुरोध गरियो। TTY मोड पूर्ण"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"सहकर्मी अनुरोध गरियो। TTY मोड HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"सहकर्मी अनुरोध गरियो। TTY मोड VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"फिंगरप्रिन्ट आइकन"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"अनुहार प्रमाणिकरण हार्डवेयर व्यवस्थापन गर्नुहोस्"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"फेस अनलकको हार्डवेयर व्यवस्थित गर्नुहोस्"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"अनुप्रयोगलाई प्रयोगका लागि अनुहार टेम्प्लेट थप्न र मेटाउने तरिका आह्वान गर्न अनुमति दिन्छ।"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"अनुहार प्रमाणिकरण हार्डवेयर प्रयोग गर्नुहोस्"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"अनुप्रयोगलाई प्रमाणीकरणका लागि अनुहार प्रमाणीकरण हार्डवेयर प्रयोग गर्न अनुमति दिन्छ"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"अनुहार प्रमाणीकरण"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"फेस अनलकको हार्डवेयर प्रयोग गर्नुहोस्"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"अनुप्रयोगलाई प्रमाणीकरणका लागि फेस अनलकको हार्डवेयर प्रयोग गर्न अनुमति दिन्छ"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"फेस अनलक"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"आफ्नो अनुहार पुनः दर्ता गर्नुहोस्"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"अनुहार पहिचानको गुणस्तर सुधार गर्न कृपया आफ्नो अनुहार पुनः दर्ता गर्नुहोस्"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"अनुहारको सटीक डेटा खिच्न सकिएन। फेरि प्रयास गर्नुहोस्।"</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"फोन बायाँतिर सार्नुहोस्।"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"फोन दायाँतिर सार्नुहोस्।"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"कृपया अझ सीधा गरी आफ्नो स्क्रिनमा हेर्नुहोस्।"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"तपाईंको अनुहार देखिएन। फोनमा हेर्नुहोस्।"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"आफ्नो अनुहार फोनको सीधा अगाडि पार्नुहोस्।"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"अत्यधिक हल्लियो। फोन स्थिर राख्नुहोस्।"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"कृपया आफ्नो अनुहार पुनः दर्ता गर्नुहोस्।"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"अब उप्रान्त अनुहार पहिचान गर्न सकिएन। फेरि प्रयास गर्नुहोस्।"</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"आफ्नो टाउको अलि थोरै घुमाउनुहोस्।"</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"आफ्नो टाउको अलि थोरै घुमाउनुहोस्।"</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"तपाईंको अनुहार लुकाउने सबै कुरा लुकाउनुहोस्।"</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"स्क्रिनको शीर्ष कुनामा रहेको सेन्सर सफा गर्नुहोस्।"</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"कालो रङको पट्टीलगायत आफ्नो स्क्रिनको माथिल्लो भाग सफा गर्नुहोस्"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"अनुहार पुष्टि गर्न सकिएन। हार्डवेयर उपलब्ध छैन।"</string> - <string name="face_error_timeout" msgid="3202585609451248103">"फेरि अनुहारको प्रमाणीकरण गरी हेर्नुहोस्।"</string> + <string name="face_error_timeout" msgid="981512090365729465">"फेरि फेस अनलक प्रयोग गरी हेर्नुहोस्।"</string> <string name="face_error_no_space" msgid="2712120617457553825">"अनुहारसम्बन्धी नयाँ डेटा भण्डारण गर्न सकिएन। पहिले कुनै पुरानो डेटा मेटाउनुहोस्।"</string> - <string name="face_error_canceled" msgid="2768146728600802422">"अनुहार पहिचान गर्ने सुविधा रद्द गरियो"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"प्रयोगकर्ताले अनुहार प्रमाणीकरण सेवा रद्द गर्नुभयो"</string> + <string name="face_error_canceled" msgid="283945501061931023">"अनुहार पहिचान रद्द गरियो।"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"प्रयोगकर्ताले फेस अनलकको कार्य रद्द गर्नुभयो।"</string> <string name="face_error_lockout" msgid="3407426963155388504">"धेरैपटक प्रयासहरू भए। पछि फेरि प्रयास गर्नुहोस्।"</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"अत्यधिक प्रयासहरू भए। अनुहार प्रमाणीकरण गर्ने सुविधा असक्षम पारियो।"</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"अत्यधिक प्रयासहरू भए। फेस अनलक असक्षम पारियो।"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"अनुहार पुष्टि गर्न सकिएन। फेरि प्रयास गर्नुहोस्।"</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"तपाईंले अनुहार प्रमाणीकरण गर्ने सुविधा सेट अप गर्नुभएको छैन"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"यस यन्त्रमा अनुहार प्रमाणीकरण गर्ने सुविधा प्रयोग गर्न मिल्दैन"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"तपाईंले फेस अनलक सुविधा सेट अप गर्नुभएको छैन।"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"यस यन्त्रमा फेस अनलक सुविधा प्रयोग गर्न मिल्दैन।"</string> <string name="face_name_template" msgid="7004562145809595384">"अनुहार <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index d0dff88d86a7..fe53b2387f8c 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemailberichten"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Bellen via wifi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Simkaartstatus"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Meldingen met hoge prioriteit voor de simkaartstatus"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Door peer aangevraagde TTY-modus VOL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Door peer aangevraagde TTY-modus HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Door peer aangevraagde TTY-modus VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Vingerafdruk-pictogram"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"hardware voor gezichtsherkenning beheren"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"hardware voor ontgrendelen via gezichtsherkenning beheren"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Hiermee kan de app methoden aanroepen om gezichtstemplates toe te voegen en te verwijderen voor gebruik."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"hardware voor gezichtsherkenning gebruiken"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Hiermee kan de app hardware voor gezichtsherkenning gebruiken voor verificatie"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Gezichtsherkenning"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"hardware voor ontgrendelen via gezichtsherkenning gebruiken"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Hiermee kan de app hardware voor ontgrendelen via gezichtsherkenning gebruiken voor verificatie"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Ontgrendelen via gezichtsherkenning"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Je gezicht opnieuw registreren"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Registreer je gezicht opnieuw om de herkenning te verbeteren"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Geen accurate gegevens. Probeer het nog eens."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Beweeg je telefoon meer naar links."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Beweeg je telefoon meer naar rechts."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Kijk rechter naar je apparaat."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Je gezicht is niet te zien. Kijk naar de telefoon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Houd je gezicht recht voor de telefoon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Te veel beweging. Houd je telefoon stil."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registreer je gezicht opnieuw."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Herkent gezicht niet meer. Probeer het nog eens."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Draai je hoofd iets minder."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Draai je hoofd iets minder."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Zorg dat je gezicht volledig zichtbaar is."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Maak de sensor bovenaan het scherm schoon."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Reinig de bovenkant van je scherm, inclusief de zwarte balk"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Kan gezicht niet verifiëren. Hardware niet beschikbaar."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Probeer de gezichtsverificatie opnieuw."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Probeer ontgrendelen via gezichtsherkenning opnieuw."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Kan nieuwe gezichten niet opslaan. Verwijder eerst een oude."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Gezichtsbewerking geannuleerd"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Gezichtsverificatie geannuleerd door gebruiker"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Bewerking voor gezichtsherkenning geannuleerd."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Ontgrendelen via gezichtsherkenning geannuleerd door gebruiker."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Te veel pogingen. Probeer het later opnieuw."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Te veel pogingen. Gezichtsherkenning uitgeschakeld."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Te veel pogingen. Ontgrendelen via gezichtsherkenning uitgeschakeld."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Kan gezicht niet verifiëren. Probeer het nog eens."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Je hebt gezichtsverificatie niet ingesteld"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Gezichtsverificatie wordt niet ondersteund op dit apparaat"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Je hebt ontgrendelen via gezichtsherkenning niet ingesteld."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Ontgrendelen via gezichtsherkenning wordt niet ondersteund op dit apparaat."</string> <string name="face_name_template" msgid="7004562145809595384">"Gezicht <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 2f5e99b40389..ce40db3e71a8 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ଭଏସମେଲ୍ ମେସେଜ୍"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"ୱାଇ-ଫାଇ କଲିଙ୍ଗ"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM ଷ୍ଟାଟସ୍"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"ଉଚ୍ଚ ପ୍ରାଥମିକତା SIM ସ୍ଥିତି"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"ପୀଆର୍ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍ FULL ଅଟେ"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"ପୀଅର୍ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍ HCO ଅଟେ"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"ପୀଅର୍ ଅନୁରୋଧ କରିଥିବା TTY ମୋଡ୍ VCO ଅଟେ"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ଆଇକନ୍"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"ଫେସ୍ ପ୍ରମାଣୀକରଣ ହାର୍ଡୱେର୍ର ପରିଚାଳନା କରନ୍ତୁ"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"ଫେସ୍ ଅନ୍ଲକ୍ ହାର୍ଡୱେର୍ ପରିଚାଳନା କରନ୍ତୁ"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"ବ୍ୟବହାର ପାଇଁ ଆପ୍କୁ ଫେସିଆଲ୍ ଟେମ୍ପଲେଟ୍ ଯୋଡିବା ଓ ଡିଲିଟ୍ ର ପଦ୍ଧତି ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ଫେସ୍ ପ୍ରମାଣୀକରଣ ହାର୍ଡୱେର୍ ବ୍ୟବହାର କରନ୍ତୁ"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ଫେସ୍ ପ୍ରମାଣୀକରଣ ହାର୍ଡୱେର୍ର ପ୍ରମାଣ ପାଇଁ ଆପ୍କୁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"ମୁହଁ ପ୍ରାମାଣିକତା"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"ଫେସ୍ ଅନ୍ଲକ୍ ହାର୍ଡୱେର୍ ବ୍ୟବହାର କରନ୍ତୁ"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"ପ୍ରାମାଣିକତା ପାଇଁ ଫେସ୍ ଅନ୍ଲକ୍ ହାର୍ଡୱେର୍ର ବ୍ୟବହାର ପାଇଁ ଆପ୍କୁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"ଫେସ୍ ଅନ୍ଲକ୍"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍ରୋଲ୍ କରନ୍ତୁ"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ଚିହ୍ନଟକରଣକୁ ଉନ୍ନତ କରିବା ପାଇଁ, ଦୟାକରି ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍ରୋଲ୍ କରନ୍ତୁ।"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"ମୁହଁର ଡାଟା କ୍ୟାପଚର୍ ହେଲାନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ବାମ ପଟକୁ ଫୋନ୍ ଘୁଞ୍ଚାନ୍ତୁ।"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ଡାହାଣ ପଟକୁ ଫୋନ୍ ଘୁଞ୍ଚାନ୍ତୁ।"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"ଦୟାକରି ଆପଣଙ୍କ ଡିଭାଇସ୍କୁ ସିଧାସଳଖ ଦେଖନ୍ତୁ।"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ଆପଣଙ୍କର ମୁହଁ ଦେଖି ପାରୁନାହିଁ। ଫୋନ୍କୁ ଦେଖନ୍ତୁ।"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ଆପଣଙ୍କ ମୁହଁକୁ ଫୋନ୍ ସାମ୍ନାରେ ସିଧାସଳଖ ରଖନ୍ତୁ।"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ଅତ୍ୟଧିକ ଅସ୍ଥିର। ଫୋନ୍କୁ ସ୍ଥିର ଭାବେ ଧରନ୍ତୁ।"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"ଦୟାକରି ଆପଣଙ୍କର ମୁହଁ ପୁଣି-ଏନ୍ରୋଲ୍ କରନ୍ତୁ।"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ଆଉ ମୁହଁ ଚିହ୍ନଟ କରିହେଲା ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"ଆପଣଙ୍କର ମୁଣ୍ଡକୁ ଟିକିଏ ବୁଲାନ୍ତୁ।"</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"ଆପଣଙ୍କର ମୁଣ୍ଡକୁ ଟିକିଏ ବୁଲାନ୍ତୁ।"</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"ଆପଣଙ୍କର ମୁହଁ ଲୁଚାଉଥିବା ଜିନିଷକୁ କାଢ଼ି ଦିଅନ୍ତୁ।"</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"ସ୍କ୍ରିନ୍ର ଉପର ପ୍ରାନ୍ତରେ ଥିବା ସେନ୍ସର୍କୁ ଖାଲି କରନ୍ତୁ।"</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"କଳା ବାର୍ ସମେତ ଆପଣଙ୍କ ସ୍କ୍ରିନ୍ର ଶୀର୍ଷକୁ ସଫା କରନ୍ତୁ"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"ମୁହଁ ଚିହ୍ନଟ କରିପାରିଲା ନାହିଁ। ହାର୍ଡୱେୟାର୍ ଉପଲବ୍ଧ ନାହିଁ।"</string> - <string name="face_error_timeout" msgid="3202585609451248103">"ପୁଣି ମୁହଁ ପ୍ରାମାଣିକତା କରନ୍ତୁ।"</string> + <string name="face_error_timeout" msgid="981512090365729465">"ଫେସ୍ ଅନ୍ଲକ୍ ପୁଣି ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ"</string> <string name="face_error_no_space" msgid="2712120617457553825">"ନୂଆ ମୁହଁ ଡାଟା ଷ୍ଟୋର୍ ହେବ ନାହିଁ। ପ୍ରଥମେ ପୁରୁଣାକୁ ଡିଲିଟ୍ କରନ୍ତୁ।"</string> - <string name="face_error_canceled" msgid="2768146728600802422">"ମୁହଁ ପ୍ରମାଣିକିକରଣ ପ୍ରକ୍ରିୟା ବାତିଲ୍ ହୋଇଛି"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"ଉପଯୋଗକର୍ତ୍ତା ମୁହଁ ପ୍ରମାଣିକିକରଣ ବାତିଲ୍ କରିଛନ୍ତି"</string> + <string name="face_error_canceled" msgid="283945501061931023">"ଫେସ୍ର ଅପରେଶନ୍ କ୍ୟାନ୍ସଲ୍ ହୋଇଗଲା"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ଦ୍ୱାରା ଫେସ୍ ଅନଲକ୍ ବାତିଲ୍ କରାଯାଇଛି।"</string> <string name="face_error_lockout" msgid="3407426963155388504">"ବାରମ୍ବାର ଚେଷ୍ଟା। ପରେ ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"ଅତ୍ୟଧିକ ପ୍ରଚେଷ୍ଟା. ମୁହଁ ପ୍ରମାଣିକିକରଣ ଅକ୍ଷମ ହୋଇଛି।"</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"ଅତ୍ୟଧିକ ପ୍ରଚେଷ୍ଟା. ଫେସ୍ ଅନ୍ଲକ୍ ଅକ୍ଷମ କରନ୍ତୁ"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"ମୁହଁ ଚିହ୍ନଟ କରିପାରିଲା ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"ଆପଣ ମୁହଁ ପ୍ରମାଣିକିକରଣ ସେଟ୍ ଅପ୍ କରିନାହାଁନ୍ତି"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"ଏହି ଡିଭାଇସ୍ରେ ମୁହଁ ପ୍ରମାଣିକିକରଣ ସମର୍ଥିତ ନୁହେଁ"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"ଆପଣ ଫେସ୍ ଅନ୍ଲକ୍ ସେଟ୍ ଅପ୍ କରିନାହାଁନ୍ତି"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"ଏହି ଡିଭାଇସ୍ରେ ଫେସ୍ ଅନ୍ଲକ୍ ସମର୍ଥିତ ନୁହେଁ।"</string> <string name="face_name_template" msgid="7004562145809595384">"<xliff:g id="FACEID">%d</xliff:g>ଙ୍କ ଫେସ୍"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index f605c3c50f6e..591ba0a9fcc3 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ਵੌਇਸਮੇਲ ਸੁਨੇਹੇ"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"ਸਿਮ ਅਵਸਥਾ"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"ਉੱਚ ਤਰਜੀਹੀ ਸਿਮ ਸਥਿਤੀ"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"ਪੀਅਰ ਨੇ TTY Mode FULL ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"ਪੀਅਰ ਨੇ TTY Mode HCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"ਪੀਅਰ ਨੇ TTY Mode VCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਪ੍ਰਤੀਕ"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਹਾਰਡਵੇਅਰ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"ਚਿਹਰਾ ਅਣਲਾਕ ਹਾਰਡਵੇਅਰ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"ਐਪ ਨੂੰ ਵਰਤਣ ਲਈ ਚਿਹਰਾ ਟੈਮਪਲੇਟ ਸ਼ਾਮਲ ਕਰਨ ਜਾਂ ਮਿਟਾਉਣ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਬੇਨਤੀ ਕਰਨ ਦਿੰਦੀ ਹੈ।"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਹਾਰਡਵੇਅਰ ਵਰਤੋ"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ਐਪ ਨੂੰ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਹਾਰਡਵੇਅਰ ਵਰਤਣ ਦਿੰਦੀ ਹੈ"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"ਚਿਹਰਾ ਅਣਲਾਕ ਹਾਰਡਵੇਅਰ ਵਰਤੋ"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"ਐਪ ਨੂੰ ਪ੍ਰਮਾਣੀਕਰਨ ਲਈ ਚਿਹਰਾ ਅਣਲਾਕ ਹਾਰਡਵੇਅਰ ਵਰਤਣ ਦਿੰਦੀ ਹੈ"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"ਚਿਹਰਾ ਅਣਲਾਕ"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"ਆਪਣਾ ਚਿਹਰਾ ਮੁੜ-ਦਰਜ ਕਰੋ"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"ਪਛਾਣ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੇ ਚਿਹਰੇ ਨੂੰ ਮੁੜ-ਦਰਜ ਕਰੋ"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"ਸਟੀਕ ਚਿਹਰਾ ਡਾਟਾ ਕੈਪਚਰ ਨਹੀਂ ਹੋਇਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ਫ਼ੋਨ ਨੂੰ ਖੱਬੇ ਪਾਸੇ ਲਿਜਾਓ।"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ਫ਼ੋਨ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਲਿਜਾਓ।"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"ਕਿਰਪਾ ਕਰਕੇ ਸਿੱਧਾ ਆਪਣੇ ਡੀਵਾਈਸ ਵੱਲ ਦੇਖੋ।"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ਤੁਹਾਡਾ ਚਿਹਰਾ ਨਹੀਂ ਦਿਸ ਰਿਹਾ। ਫ਼ੋਨ ਵੱਲ ਦੇਖੋ।"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ਆਪਣਾ ਚਿਹਰਾ ਫ਼ੋਨ ਦੇ ਬਿਲਕੁਲ ਸਾਹਮਣੇ ਰੱਖੋ।"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"ਬਹੁਤ ਜ਼ਿਆਦਾ ਹਿਲਜੁਲ। ਫ਼ੋਨ ਨੂੰ ਸਥਿਰ ਰੱਖੋ।"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਚਿਹਰਾ ਦੁਬਾਰਾ ਦਰਜ ਕਰੋ।"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ਹੁਣ ਚਿਹਰਾ ਪਛਾਣਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"ਆਪਣਾ ਸਿਰ ਥੋੜਾ ਜਿਹਾ ਝੁਕਾਓ।"</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"ਆਪਣਾ ਸਿਰ ਥੋੜਾ ਜਿਹਾ ਝੁਕਾਓ।"</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"ਤੁਹਾਡਾ ਚਿਹਰਾ ਲੁਕਾਉਣ ਵਾਲੀ ਕੋਈ ਵੀ ਚੀਜ਼ ਹਟਾਓ।"</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"ਸਕ੍ਰੀਨ ਦੇ ਸਿਖਰਲੇ ਕਿਨਾਰੇ ਦਾ ਸੈਂਸਰ ਸਾਫ਼ ਕਰੋ।"</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"ਕਾਲੀ ਪੱਟੀ ਸਮੇਤ, ਆਪਣੀ ਸਕ੍ਰੀਨ ਦੇ ਸਿਖਰ ਨੂੰ ਸਾਫ਼ ਕਰੋ"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"ਚਿਹਰੇ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਹੋ ਸਕੀ। ਹਾਰਡਵੇਅਰ ਉਪਲਬਧ ਨਹੀਂ।"</string> - <string name="face_error_timeout" msgid="3202585609451248103">"ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਦੁਬਾਰਾ ਵਰਤ ਕੇ ਦੇਖੋ।"</string> + <string name="face_error_timeout" msgid="981512090365729465">"ਚਿਹਰਾ ਅਣਲਾਕ ਦੁਬਾਰਾ ਵਰਤ ਕੇ ਦੇਖੋ।"</string> <string name="face_error_no_space" msgid="2712120617457553825">"ਨਵਾਂ ਚਿਹਰਾ ਡਾਟਾ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਪਹਿਲਾਂ ਪੁਰਾਣਾ ਹਟਾਓ।"</string> - <string name="face_error_canceled" msgid="2768146728600802422">"ਚਿਹਰਾ ਪਛਾਣਨ ਦੀ ਪ੍ਰਕਿਰਿਆ ਰੱਦ ਕੀਤੀ ਗਈ"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"ਵਰਤੋਂਕਾਰ ਵੱਲੋਂ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਨੂੰ ਰੱਦ ਕੀਤਾ ਗਿਆ"</string> + <string name="face_error_canceled" msgid="283945501061931023">"ਚਿਹਰਾ ਪਛਾਣਨ ਦੀ ਪ੍ਰਕਿਰਿਆ ਰੱਦ ਕੀਤੀ ਗਈ।"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"ਵਰਤੋਂਕਾਰ ਨੇ ਚਿਹਰਾ ਅਣਲਾਕ ਰੱਦ ਕੀਤਾ।"</string> <string name="face_error_lockout" msgid="3407426963155388504">"ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ। ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਬੰਦ ਕੀਤਾ ਗਿਆ।"</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ। ਚਿਹਰਾ ਅਣਲਾਕ ਬੰਦ ਕੀਤਾ ਗਿਆ।"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"ਚਿਹਰੇ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"ਤੁਸੀਂ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਸੈੱਟਅੱਪ ਨਹੀਂ ਕੀਤਾ ਹੈ"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਦੀ ਸੁਵਿਧਾ ਨਹੀਂ ਹੈ"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"ਤੁਸੀਂ ਚਿਹਰਾ ਅਣਲਾਕ ਸੈੱਟਅੱਪ ਨਹੀਂ ਕੀਤਾ ਹੈ।"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"ਇਸ ਡੀਵਾਈਸ ਵਿੱਚ ਚਿਹਰਾ ਅਣਲਾਕ ਦੀ ਸੁਵਿਧਾ ਨਹੀਂ ਹੈ।"</string> <string name="face_name_template" msgid="7004562145809595384">"ਚਿਹਰਾ <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 6569b34f7254..302f541e3f55 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -97,6 +97,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Wiadomości poczty głosowej"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Połączenia przez Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Stan karty SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Stan karty SIM – wysoki priorytet"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Drugie urządzenie zażądało trybu „TTY pełny”"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Drugie urządzenie zażądało trybu „TTY HCO”"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Drugie urządzenie zażądało trybu „TTY VCO”"</string> @@ -556,11 +557,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona odcisku palca"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"zarządzanie sprzętem do uwierzytelniania za pomocą twarzy"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"zarządzanie sprzętem do rozpoznawania twarzy"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Zezwala na aktywowanie przez aplikację metody dodawania i usuwania szablonów twarzy."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"używanie sprzętu do uwierzytelniania za pomocą twarzy"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Zezwala na używanie przez aplikację sprzętu do analizy twarzy na potrzeby uwierzytelniania"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Uwierzytelnianie twarzą"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"używanie sprzętu do rozpoznawania twarzy"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Zezwala na używanie przez aplikację sprzętu do rozpoznawania twarzy w uwierzytelniania"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Rozpoznanie twarzy"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Zarejestruj swoją twarz ponownie"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Aby poprawić rozpoznawanie, ponownie zarejestruj swoją twarz"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Nie udało się zarejestrować danych twarzy. Spróbuj ponownie."</string> @@ -573,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Przesuń telefon w lewo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Przesuń telefon w prawo."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Patrz prosto na urządzenie."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Nie widzę Twojej twarzy. Spójrz na telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Ustaw twarz dokładnie na wprost telefonu."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Telefon się porusza. Trzymaj go nieruchomo."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Zarejestruj swoją twarz ponownie."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Nie można już rozpoznać twarzy. Spróbuj ponownie."</string> @@ -582,19 +583,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Trochę mniej obróć głowę."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Trochę mniej obróć głowę."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Usuń wszystko, co zasłania Ci twarz."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Wyczyść czujnik na górnej krawędzi ekranu."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Wyczyść górną krawędź ekranu, w tym czarny pasek"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Nie można zweryfikować twarzy. Sprzęt niedostępny."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Spróbuj uwierzytelniania twarzą ponownie."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Spróbuj rozpoznania twarzy ponownie."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Nie można przechowywać nowych danych twarzy. Usuń stare."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Analiza twarzy została anulowana"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Użytkownik anulował uwierzytelnianie twarzą"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Analiza twarzy została anulowana."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Użytkownik anulował rozpoznanie twarzy."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Zbyt wiele prób. Spróbuj ponownie później."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Zbyt wiele prób. Uwierzytelnianie twarzą zostało wyłączone."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Zbyt wiele prób. Rozpoznanie twarzy zostało wyłączone."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Nie można zweryfikować twarzy. Spróbuj ponownie."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Uwierzytelnianie twarzą nie jest skonfigurowane"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"To urządzenie nie obsługuje uwierzytelniania twarzą"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Rozpoznanie twarzy nie jest skonfigurowane."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"To urządzenie nie obsługuje rozpoznania twarzy."</string> <string name="face_name_template" msgid="7004562145809595384">"Twarz <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 4f24abcd2d72..d0e1bc95e048 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensagens do correio de voz"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas por Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Status do chip"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Status de prioridade alta do chip"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"TTD modo COMPLETO solicitado"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"TTD modo HCO solicitado"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"TTD modo VCO solicitado"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ícone de impressão digital"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"gerenciar hardware de autenticação facial"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"gerenciar hardware de desbloqueio facial"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar hardware de autenticação facial"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que o app use o hardware de autenticação facial para autenticação"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autenticação facial"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"usar hardware de desbloqueio facial"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Permite que o app use o hardware de desbloqueio facial para autenticação"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Desbloqueio facial"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Registre seu rosto novamente"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Para melhorar o reconhecimento, registre seu rosto novamente"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Dados precisos não capturados. Tente novamente."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mova o smartphone para a esquerda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mova o smartphone para a direita."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Olhe mais diretamente para o dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Não é possível ver o rosto. Olhe para o telefone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Deixe o rosto diretamente na frente do smartphone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Muito movimento. Não mova o smartphone."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registre seu rosto novamente."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"O rosto não é mais reconhecido. Tente novamente."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Incline a cabeça um pouco menos."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Incline a cabeça um pouco menos."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Remova tudo que esteja ocultando seu rosto."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Limpe o sensor na borda superior da tela."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Limpe a parte superior da tela, inclusive a barra preta"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Impossível verificar rosto. Hardware indisponível."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Tente realizar a autenticação facial novamente."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Tente usar o desbloqueio facial novamente."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Não é possível salvar dados faciais. Exclua dados antigos."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Operação facial cancelada"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Autenticação facial cancelada pelo usuário"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Operação facial cancelada."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Desbloqueio facial cancelado pelo usuário."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Excesso de tentativas. Tente novamente mais tarde."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Muitas tentativas. Autenticação facial desativada."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Muitas tentativas. Desbloqueio facial desativado."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Não é possível verificar o rosto. Tente novamente."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Autenticação facial não configurada"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"A autenticação facial não é permitida neste dispositivo"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"O desbloqueio facial não foi configurado."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"O desbloqueio facial não é compatível com este dispositivo."</string> <string name="face_name_template" msgid="7004562145809595384">"Rosto <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index c4ae520d75a5..a4cbc3e13fed 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensagens de correio de voz"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Estado do SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Estado do SIM de elevada prioridade"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"O par solicitou o modo COMPLETO de teletipo"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"O par solicitou o modo HCO de teletipo"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"O par solicitou o modo VCO de teletipo"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ícone de impressão digital"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"gerir hardware de autenticação facial"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"gerir hardware de Desbloqueio Através do Rosto"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Permite à aplicação invocar métodos para adicionar e eliminar modelos faciais para uso."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"utilizar hardware de autenticação facial"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que a aplicação utilize hardware de autenticação facial para autenticação."</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autenticação facial"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"utilizar hardware de Desbloqueio Através do Rosto"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Permite que a aplicação utilize hardware de Desbloqueio Através do Rosto para autenticação"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Desbloqueio Através do Rosto"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Volte a inscrever o seu rosto"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Para melhorar o reconhecimento, volte a inscrever o seu rosto."</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Imp. capt. dados rosto precisos. Tente novamente."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mova o telemóvel para a esquerda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mova o telemóvel para a direita."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Olhe mais diretamente para o dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Não consigo ver o rosto. Olhe para o telemóvel."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Posicione o rosto em frente ao telemóvel."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Demasiado movimento. Mantenha o telemóvel firme."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Volte a inscrever o rosto."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Impossível reconhecer o rosto. Tente novamente."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Rode a cabeça um pouco menos."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Rode a cabeça um pouco menos."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Remova tudo o que esteja a ocultar o seu rosto."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Limpe o sensor na extremidade superior do ecrã."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Limpe a parte superior do ecrã, incluindo a barra preta."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Não pode validar o rosto. Hardware não disponível."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Tente efetuar a autenticação facial novamente."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Experimente de novo o Desbloqueio Através do Rosto"</string> <string name="face_error_no_space" msgid="2712120617457553825">"Não pode guardar novos dados de rostos. Elimine um antigo."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Operação de rosto cancelada."</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Autenticação facial cancelada pelo utilizador."</string> + <string name="face_error_canceled" msgid="283945501061931023">"Operação de rosto cancelada."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Desbloqueio Através do Rosto cancelado pelo utilizador"</string> <string name="face_error_lockout" msgid="3407426963155388504">"Demasiadas tentativas. Tente novamente mais tarde."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Demasiadas tentativas. Autenticação facial desativada."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Demasiadas tentativas. O Desbloqueio Através do Rosto está desativado."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Não é possível validar o rosto. Tente novamente."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Não configurou a autenticação facial."</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"A autenticação facial não é suportada neste dispositivo."</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Não configurou o Desbloqueio Através do Rosto."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Desbloqueio Através do Rosto não suportado neste dispositivo."</string> <string name="face_name_template" msgid="7004562145809595384">"Rosto <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 4f24abcd2d72..d0e1bc95e048 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensagens do correio de voz"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas por Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Status do chip"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Status de prioridade alta do chip"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"TTD modo COMPLETO solicitado"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"TTD modo HCO solicitado"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"TTD modo VCO solicitado"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ícone de impressão digital"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"gerenciar hardware de autenticação facial"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"gerenciar hardware de desbloqueio facial"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Permite que o app execute métodos para adicionar e excluir modelos de rosto para uso."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"usar hardware de autenticação facial"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite que o app use o hardware de autenticação facial para autenticação"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autenticação facial"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"usar hardware de desbloqueio facial"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Permite que o app use o hardware de desbloqueio facial para autenticação"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Desbloqueio facial"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Registre seu rosto novamente"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Para melhorar o reconhecimento, registre seu rosto novamente"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Dados precisos não capturados. Tente novamente."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mova o smartphone para a esquerda."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mova o smartphone para a direita."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Olhe mais diretamente para o dispositivo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Não é possível ver o rosto. Olhe para o telefone."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Deixe o rosto diretamente na frente do smartphone."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Muito movimento. Não mova o smartphone."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registre seu rosto novamente."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"O rosto não é mais reconhecido. Tente novamente."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Incline a cabeça um pouco menos."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Incline a cabeça um pouco menos."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Remova tudo que esteja ocultando seu rosto."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Limpe o sensor na borda superior da tela."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Limpe a parte superior da tela, inclusive a barra preta"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Impossível verificar rosto. Hardware indisponível."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Tente realizar a autenticação facial novamente."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Tente usar o desbloqueio facial novamente."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Não é possível salvar dados faciais. Exclua dados antigos."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Operação facial cancelada"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Autenticação facial cancelada pelo usuário"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Operação facial cancelada."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Desbloqueio facial cancelado pelo usuário."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Excesso de tentativas. Tente novamente mais tarde."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Muitas tentativas. Autenticação facial desativada."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Muitas tentativas. Desbloqueio facial desativado."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Não é possível verificar o rosto. Tente novamente."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Autenticação facial não configurada"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"A autenticação facial não é permitida neste dispositivo"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"O desbloqueio facial não foi configurado."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"O desbloqueio facial não é compatível com este dispositivo."</string> <string name="face_name_template" msgid="7004562145809595384">"Rosto <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 50d6a495e147..245864cb4cb5 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -96,6 +96,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mesaje din mesageria vocală"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Apelare prin Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Starea cardului SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Notificări de la SIM cu prioritate ridicată"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Cealaltă persoană a solicitat modul TTY cu setarea COMPLET"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Cealaltă persoană a solicitat modul TTY cu setarea HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Cealaltă persoană a solicitat modul TTY cu setarea VCO"</string> @@ -553,11 +554,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Pictograma amprentă"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"să gestioneze hardware-ul de autentificare facială"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"să gestioneze hardware de deblocare facială"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Permite aplicației să invoce metode pentru a adăuga și a șterge șabloane faciale pentru utilizare."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"să folosească hardware de autentificare facială"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Permite aplicației să folosească hardware de autentificare facială pentru autentificare"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Autentificare facială"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"să folosească hardware de deblocare facială"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Permite aplicației să folosească hardware de deblocare facială pentru autentificare"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Deblocare facială"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Reînregistrați-vă chipul"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Pentru a îmbunătăți recunoașterea, reînregistrați-vă chipul"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Nu s-a putut fotografia fața cu precizie. Încercați din nou."</string> @@ -570,7 +571,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Mutați telefonul spre stânga."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Mutați telefonul spre dreapta."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Priviți mai direct spre dispozitiv."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Nu vi se vede fața. Uitați-vă la telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Stați cu capul direct în fața telefonului."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Prea multă mișcare. Țineți telefonul nemișcat."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Reînregistrați-vă chipul."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Nu se mai poate recunoaște fața. Încercați din nou."</string> @@ -579,19 +580,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Întoarceți capul mai puțin."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Întoarceți capul mai puțin."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Eliminați orice vă ascunde chipul."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Curățați senzorul de la marginea de sus a ecranului."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Curățați partea de sus a ecranului, inclusiv bara neagră"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Nu se poate confirma fața. Hardware-ul nu este disponibil."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Încercați din nou autentificarea facială."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Încercați din nou deblocarea facială."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Nu se pot stoca date faciale noi. Ștergeți întâi unele vechi."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Operațiunea privind fața a fost anulată"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Autentificarea chipului este anulată de utilizator"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Operațiunea privind chipul a fost anulată."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Deblocarea facială este anulată de utilizator."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Prea multe încercări. Reîncercați mai târziu."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Prea multe încercări. Autentificarea facială este dezactivată"</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Prea multe încercări. Deblocarea facială este dezactivată."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Nu se poate confirma fața. Încercați din nou."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Nu ați configurat autentificarea facială"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Autentificarea facială nu este acceptată pe dispozitiv"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Nu ați configurat deblocarea facială."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Deblocarea facială nu este acceptată pe dispozitiv."</string> <string name="face_name_template" msgid="7004562145809595384">"Chip <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 2d668f6a905e..29c2e124f4b8 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -97,6 +97,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Голосовые сообщения"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Звонки по Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Статус SIM-карты"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Важные уведомления SIM-карты"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"На устройстве абонента выбран режим телетайпа \"ВСЕ\""</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"На устройстве абонента выбран режим телетайпа HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"На устройстве абонента выбран режим телетайпа VCO"</string> @@ -556,11 +557,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Значок отпечатка пальца"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"Управлять оборудованием для распознавания лиц"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"Управление аппаратным обеспечением для функции \"Фейсконтроль\""</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Приложение сможет добавлять и удалять шаблоны лиц."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"Использовать оборудование для распознавания лиц"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Приложение сможет использовать распознающее оборудование для аутентификации."</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Распознавание лица"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"Использование аппаратного обеспечения для функции \"Фейсконтроль\""</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Приложение сможет использовать для аутентификации аппаратное обеспечение Фейсконтроля."</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Фейсконтроль"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Зарегистрируйте лицо ещё раз"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Чтобы улучшить распознавание лица, зарегистрируйте его ещё раз"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Не удалось собрать данные. Повторите попытку."</string> @@ -573,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Переместите телефон влево."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Переместите телефон вправо."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Смотрите прямо на устройство."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Вашего лица не видно. Смотрите на телефон."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Держите телефон прямо перед лицом."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Не перемещайте устройство. Держите его неподвижно."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Повторите попытку."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Не удалось распознать лицо. Повторите попытку."</string> @@ -582,19 +583,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Держите голову ровнее."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Держите голову ровнее."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Ваше лицо плохо видно."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Очистите сканер в верхней части экрана."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Протрите верхнюю часть экрана (в том числе черную панель)."</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Не удалось распознать лицо. Сканер недоступен."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Лицо не распознано. Попробуйте ещё раз."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Попробуйте воспользоваться функцией ещё раз."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Недостаточно места. Удалите старые данные для распознавания."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Распознавание отменено."</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Распознавание лица отменено пользователем."</string> + <string name="face_error_canceled" msgid="283945501061931023">"Распознавание отменено"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Фейсконтроль: операция отменена пользователем."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Слишком много попыток. Повторите позже."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Слишком много попыток. Распознавание лица отключено."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Слишком много попыток. Функция \"Фейсконтроль\" отключена."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Не удалось распознать лицо. Повторите попытку."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Вы не настроили распознавание лица."</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Это устройство не поддерживает распознавание лица."</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Вы не настроили фейсконтроль."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Это устройство не поддерживает функцию \"Фейсконтроль\"."</string> <string name="face_name_template" msgid="7004562145809595384">"Лицо <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index fdf4d53f15b4..65b899c10754 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"හඬ තැපැල් පණිවිඩ"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi ඇමතීම"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM තත්ත්වය"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"ඉහළ ප්රමුඛතා SIM තත්ත්වය"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"සම ඉල්ලීම් කළ TTY ප්රකාරය පූර්ණයි"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"සම ඉල්ලීම් කළ TTY ප්රකාරය HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"සම ඉල්ලීම් කළ TTY ප්රකාරය VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ඇඟිලි සලකුණු නිරූපකය"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"මුහුණු සත්යාපක දෘඪාංග කළමනාකරණය කරන්න"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"මුහුණු අඟුලු ඇරීමේ දෘඪාංග කළමනා කරන්න"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"මුහුණු අච්චු එකතු කිරීමට සහ ඉවත් කිරීමට අදාළ ක්රම භාවිතය සඳහා මෙම යෙදුමට ඉඩ දෙයි."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"මුහුණු සත්යාපක දෘඪාංග භාවිතා කරන්න"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"සත්යාපනය සඳහා සත්යාපක දෘඪාංග භාවිත කිරීමට යෙදුමට ඉඩ දෙයි"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"මුහුණු සත්යාපනය"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"මුහුණු අඟුලු ඇරීමේ දෘඪාංග භෘවිත කරන්න"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"සත්යාපනය සඳහා මුහුණු අඟුලු ඇරීමේ දෘඪාංග භාවිත කිරීමට යෙදුමට ඉඩ දෙයි"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"මුහුණු අඟුලු ඇරීම"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"ඔබේ මුහුණ යළි ලියාපදිංචි කරන්න"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"හඳුනා ගැනීම වැඩිදියුණු කිරීමට, ඔබේ මුහුණ යළි-ලියාපදිංචි කරන්න"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"නිරවද්ය මුහුණු දත්ත ගත නොහැකි විය. නැවත උත්සාහ කරන්න."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"දුරකථනය වමට ගෙන යන්න."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"දුරකථනය දකුණට ගෙන යන්න."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"ඔබේ උපාංගය වෙත තවත් ඍජුව බලන්න."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ඔබේ මුහුණ දැකිය නොහැක. දුරකථනය වෙත බලන්න."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"ඔබේ මුහුණ දුරකථනයට සෘජුවම ඉදිරියෙන් ස්ථානගත කරන්න."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"චලනය ඉතා වැඩියි. දුරකථනය ස්ථිරව අල්ලා සිටින්න."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"ඔබේ මුහුණ යළි ලියාපදිංචි කරන්න."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"තවදුරටත් මුහුණ හඳුනාගත නොහැක. නැවත උත්සාහ කරන්න."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"ඔබේ හිස ටිකක් අඩුවෙන් කරකවන්න."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"ඔබේ හිස ටිකක් අඩුවෙන් කරකවන්න."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"ඔබේ මුහුණ සඟවන කිසිවක් ඉවත් කරන්න."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"තිරයේ ඉහළ කෙළවරේ සංවේදකය පිරිසිදු කරන්න."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"කලු තීරුව ඇතුළුව, ඔබේ තිරයෙහි මුදුන පිරිසිදු කරන්න"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"මුහුණ සත්යාපනය කළ නොහැක. දෘඩාංගය නොමැත."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"මුහුණු සත්යාපනයට උත්සාහ කරන්න."</string> + <string name="face_error_timeout" msgid="981512090365729465">"නැවතත් මුහුණු අඟුලු ඇරීම උත්සාහ කරන්න."</string> <string name="face_error_no_space" msgid="2712120617457553825">"නව මුහුණු දත්ත ගබඩා කළ නොහැක. පළමුව පැරණි එකක් මකන්න."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"මුහුණු මෙහෙයුම අවලංගුයි"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"පරිශීලකයා විසින් මුහුණ සත්යාපනය අවලංගු කර ඇත"</string> + <string name="face_error_canceled" msgid="283945501061931023">"මුහුණු මෙහෙයුම අවලංගු කරන ලදී."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"පරිශීලකයා මුහුණු අඟුලු ඇරීම අවලංගු කර ඇත."</string> <string name="face_error_lockout" msgid="3407426963155388504">"උත්සාහයන් ඉතා වැඩි ගණනකි. පසුව නැවත උත්සාහ කරන්න."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"ප්රයත්නයන් බොහෝමයකි. මුහුණු සත්යාපනය අබලයි."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"ප්රයත්න ගණන වැඩියි. මුහුණු අඟුලු ඇරීම අබලයි."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"මුහුණ සත්යාපන කළ නොහැක. නැවත උත්සාහ කරන්න."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"ඔබ මුහුණු සත්යාපනය පිහිටුවා නැත"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"මෙම උපාංගයෙහි මුහුණු සත්යාපනයට සහාය නොදක්වයි"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"ඔබ මුහුණු අඟුලු ඇරීම සකසා නැත"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"මෙම උපාංගයෙහි මුහුණු අඟුලු ඇරීමට සහය නොදැක්වේ"</string> <string name="face_name_template" msgid="7004562145809595384">"මුහුණු <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 874b247d7621..ee04effced2b 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -97,6 +97,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Správy hlasovej schránky"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Volanie cez Wi‑Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Stav SIM karty"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Stav SIM karty: vysoká priorita"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Používateľ, s ktorým komunikujete, požiadal o režim FULL textového telefónu"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Používateľ, s ktorým komunikujete, požiadal o režim HCO textového telefónu"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Používateľ, s ktorým komunikujete, požiadal o režim VCO textového telefónu"</string> @@ -556,11 +557,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona odtlačku prsta"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"správa hardvéru na overenie tváre"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"spravovať hardvér odomknutia tvárou"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Umožňuje aplikácii vyvolať metódy, ktoré pridávajú a odstraňujú šablóny tvárí."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"používanie hardvéru na overenie tváre"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Umožňuje aplikácii používať na overenie totožnosti hardvér na overenie tváre"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Overenie tváre"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"používať hardvér Odomknutia tvárou"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Umožňuje aplikácii používať na overenie totožnosti hardvér Odomknutia tvárou"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Odomknutie tvárou"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Znova zaregistrujte svoju tvár"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Znova zaregistrujte svoju tvár, aby sa zlepšilo rozpoznávanie"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Nepodarilo sa nasnímať presné údaje o tvári. Skúste to znova."</string> @@ -573,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Posuňte telefón doľava."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Posuňte telefón doprava."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Pozrite sa priamejšie na zariadenie."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Nie je vidieť vašu tvár. Pozrite sa na telefón."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Umiestnite svoju tvár priamo pred telefón."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Priveľa pohybu. Nehýbte telefónom."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Znova zaregistrujte svoju tvár."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Tvár už nie je možné rozpoznať. Skúste to znova."</string> @@ -582,19 +583,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Otočte hlavu o niečo menej."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Otočte hlavu o niečo menej."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Odstráňte všetko, čo vám zakrýva tvár."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Vyčistite senzor v hornom okraji obrazovky."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Vyčistite hornú časť obrazovky vrátane čierneho panela"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Tvár sa nedá overiť. Hardvér nie je k dispozícii."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Vyskúšajte znova overenie tváre."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Skúste znova použiť odomknutie tvárou."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Nové údaje o tvári sa nedajú uložiť. Najprv odstráňte jeden zo starých záznamov."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Operácia týkajúca sa tváre bola zrušená"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Overenie tváre bolo zrušené používateľom"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Operácia týkajúca sa tváre bola zrušená"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Odomknutie tvárou zrušil používateľ."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Príliš veľa pokusov. Skúste to znova neskôr."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Príliš veľa pokusov. Overenie tváre bolo deaktivované."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Príliš veľa pokusov. Odomknutie tvárou bolo zakázané."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Nedá sa overiť tvár. Skúste to znova."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Overenie tváre ste nenastavili"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Toto zariadenie nepodporuje overenie tváre"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Nenastavili ste odomknutie tvárou."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Toto zariadenie nepodporuje odomknutie tvárou."</string> <string name="face_name_template" msgid="7004562145809595384">"Tvár <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 2dc10edcee40..bf5e88b1b2be 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -97,6 +97,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Sporočila v odzivniku"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Klicanje prek Wi-Fi-ja"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Stanje kartice SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Stanje kartice SIM z visoko stopnjo prednosti"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Enakovredna naprava je zahtevala način TTY FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Enakovredna naprava je zahtevala način TTY HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Enakovredna naprava je zahtevala način TTY VCO"</string> @@ -556,11 +557,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona prstnih odtisov"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"upravljanje strojne opreme za preverjanje pristnosti obraza"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"upravljanje strojne opreme za odklepanje z obrazom"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Aplikaciji omogoča sprožanje načinov za dodajanje in brisanje predlog z obrazi za uporabo."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"uporaba strojne opreme za preverjanje pristnosti obraza"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Aplikaciji omogoča uporabo strojne opreme za preverjanje pristnosti obraza"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Preverjanje pristnosti z obrazom"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"uporaba strojne opreme za odklepanje z obrazom"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Aplikaciji omogoča uporabo strojne opreme za odklepanje z obrazom za preverj. pristnosti"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Odklepanje z obrazom"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Znova prijavite obraz"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Za izboljšanje prepoznavanja znova prijavite svoj obraz"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Točnih podatkov o obrazu ni bilo mogoče zajeti. Poskusite znova."</string> @@ -573,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Telefon premaknite v levo."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Telefon premaknite v desno."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Glejte bolj naravnost v napravo."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Obraz ni viden. Poglejte v telefon."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Obraz nastavite naravnost pred telefon."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Preveč se premikate. Držite telefon pri miru."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Znova prijavite svoj obraz."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Obraza ni več mogoče prepoznati. Poskusite znova."</string> @@ -582,19 +583,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Malce manj nagnite glavo."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Glejte malce bolj naravnost."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Umaknite vse, kar vam morda zakriva obraz."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Očistite tipalo na zgornjem robu zaslona."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Očistite vrhnji del zaslona, vključno s črno vrstico"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Obraza ni mogoče preveriti. Str. opr. ni na voljo."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Znova izvedite preverjanje pristnosti z obrazom."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Znova izvedite odklepanje z obrazom."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Novega obraza ni mogoče shraniti. Najprej izbrišite starega."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Dejanje z obrazom je bilo preklicano"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Preverjanje pristnosti obraza preklical uporabnik"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Dejanje z obrazom je bilo preklicano."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Odklepanje z obrazom je preklical uporabnik."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Preveč poskusov. Poskusite znova pozneje."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Preveč poskusov. Preverjanje pristnosti obraza onemogočeno."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Preveč poskusov. Odklepanje z obrazom je onemogočeno."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Obraza ni mogoče preveriti. Poskusite znova."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Preverjanje pristnosti obraza ni nastavljeno"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Ta naprava ne podpira preverjanja pristnosti obraza"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Odklepanja z obrazom niste nastavili."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Ta naprava ne podpira odklepanja z obrazom."</string> <string name="face_name_template" msgid="7004562145809595384">"Obraz <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 1c2f64ef900d..77a83abb2bc8 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mesazhet e postës zanore"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Telefonata me Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Statusi i kartës SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Statusi i kartës SIM me përparësi të lartë"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Homologu yt kërkoi modalitet \"TTY\" të plotë"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Homologu kërkoi modalitet \"TTY\" të llojit \"HCO\""</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Homologu yt kërkoi modalitet \"TTY\" të llojit \"VCO\""</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikona e gjurmës së gishtit"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"menaxho harduerin për vërtetimin e fytyrës"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"menaxho harduerin për shkyçjen me fytyrën"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Lejon aplikacionin të aktivizojë mënyra për shtim e fshirje të shablloneve të përdorura."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"përdor harduerin për vërtetimin e fytyrës"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Lejon aplikacionin të përdorë harduer vërtetimi të fytyrës për procesin e vërtetimit"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Vërtetimi me fytyrë"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"përdor harduerin e shkyçjes me fytyrën"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Lejon aplikacionin të përdorë harduerin e shkyçjes me fytyrën për procesin e vërtetimit"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Shkyçja me fytyrë"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Regjistro përsëri fytyrën tënde"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Për të përmirësuar njohjen, regjistro përsëri fytyrën tënde"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"S\'mund të regjistroheshin të dhëna të sakta të fytyrës. Provo përsëri."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Lëvize telefonin majtas."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Lëvize telefonin djathtas"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Shiko më drejt në pajisjen tënde."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Fytyra jote nuk shfaqet. Shiko te telefoni."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Pozicionoje fytyrën tënde direkt përpara telefonit."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Ka shumë lëvizje. Mbaje telefonin të palëvizur."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Regjistroje përsëri fytyrën tënde."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Fytyra nuk mund të njihet më. Provo përsëri."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Ktheje kokën pak më pak."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Ktheje kokën pak më pak."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Hiq gjithçka që fsheh fytyrën tënde."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Pastro sensorin në anën e sipërme të ekranit."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Pastro kreun e ekranit, duke përfshirë shiritin e zi"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Fytyra s\'mund të verifikohet. Hardueri nuk ofrohet."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Provo përsëri vërtetimin e fytyrës."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Provo përsëri shkyçjen me fytyrën."</string> <string name="face_error_no_space" msgid="2712120617457553825">"S\'mund të ruhen të dhëna të reja fytyre. Fshi një të vjetër në fillim."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Veprimi me fytyrën u anulua"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Vërtetimi me fytyrë u anulua nga përdoruesi"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Veprimi me fytyrën u anulua."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Shkyçja me fytyrë u anulua nga përdoruesi."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Shumë përpjekje. Provo sërish më vonë."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Shumë përpjekje. Vërtetimi me fytyrë u çaktivizua."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Shumë përpjekje. Shkyçja me fytyrë u çaktivizua."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Fytyra nuk mund të verifikohet. Provo përsëri."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Nuk e ke konfiguruar vërtetimin me fytyrë."</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Vërtetimi me fytyrë nuk mbështetet në këtë pajisje"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Nuk e ke konfiguruar shkyçjen me fytyrë."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Shkyçja me fytyrë nuk mbështetet në këtë pajisje"</string> <string name="face_name_template" msgid="7004562145809595384">"Fytyra <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 0b3656e1cb89..a8a4c5c13d5e 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -96,6 +96,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Поруке говорне поште"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Позивање преко Wi-Fi мреже"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Статус SIM-а"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Обавештења SIM картице са статусом „висок приоритет“"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Корисник захтева ПОТПУН режим TTY"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Корисник захтева ПРЕНОС ЗВУКА за режим TTY"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Корисник захтева ПРЕНОС ГЛАСА за режим TTY"</string> @@ -553,11 +554,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Икона отиска прста"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"управљање хардв. за потврду идентитета помоћу лица"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"управљање хардв. за откључавање лицем"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Дозвољава да апликација активира методе за додавање и брисање шаблона лица ради коришћења."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"коришћење хардв. за потврду идентитета помоћу лица"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Дозвољава да апликација користи хардвер за потврду идентитета помоћу лица"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Потврда идентитета лицем"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"коришћење хардвера за откључавање лицем"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Дозвољава да апликација користи хардвер за откључавање лицем ради потврде идентитета"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Откључавање лицем"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Поново региструјте лице"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Да бисте побољшали препознавање, поново региструјте лице"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Снимање лица није успело. Пробајте поново."</string> @@ -570,7 +571,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Померите телефон улево."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Померите телефон удесно."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Гледајте право у уређај."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Не види се лице. Гледајте у телефон."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Поставите лице директно испред телефона"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Много се померате. Држите телефон мирно."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Поново региструјте лице."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Више не може да се препозна лице. Пробајте поново."</string> @@ -579,19 +580,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Мало мање померите главу."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Мало мање померите главу."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Уклоните све што вам заклања лице."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Очистите сензор на горњој ивици екрана."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Очистите горњи део екрана, укључујући црну траку"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Провера лица није успела. Хардвер није доступан."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Пробајте поново потврду идентитета помоћу лица."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Пробајте поново откључавање лицем."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Нови подаци о лицу нису сачувани. Прво избришете претходне."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Обрада лица је отказана"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Корисник је отказао потврду идентитета лицем"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Обрада лица је отказана."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Корисник је отказао откључавање лицем"</string> <string name="face_error_lockout" msgid="3407426963155388504">"Превише покушаја. Пробајте поново касније."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Превише покушаја. Потврда идентитета лицем је онемогућена."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Превише покушаја. Откључавање лицем је онемогућено."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Провера лица није успела. Пробајте поново."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Нисте подесили потврду идентитета лицем"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Препознавање лица није подржано на овом уређају"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Нисте подесили откључавање лицем"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Откључавање лицем није подржано на овом уређају"</string> <string name="face_name_template" msgid="7004562145809595384">"Лице <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 66256fa550de..12143f490cd0 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Röstmeddelanden"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-samtal"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Status för SIM-kort"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"SIM-aviseringar med hög prioritet"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Peer-enheten begärde texttelefonläget FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Peer-enheten begärde texttelefonläget HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Peer-enheten begärde texttelefonläget VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Ikon för fingeravtryck"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"hantera maskinvara för ansiktsautentisering"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"hantera maskinvara för ansiktslås"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Tillåter att appen anropar metoder för att lägga till och radera ansiktsmallar."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"använda maskinvara för ansiktsautentisering"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Tillåter att appen använder maskinvara för ansiktsigenkänning vid autentisering"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Ansiktsautentisering"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"använd maskinvara för ansiktslås"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Tillåter att appen använder maskinvara för ansiktslås vid autentisering"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Ansiktslås"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Registrera ansiktet på nytt"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Gör om registreringen av ansiktet så att ansiktsigenkänningen ska fungera bättre"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Det gick inte att fånga ansiktsdata. Försök igen."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Flytta mobilen åt vänster."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Flytta mobilen åt höger."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Titta rakt på enheten."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ansiktet syns inte. Titta på mobilen."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Ha ansiktet direkt framför telefonen."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"För mycket rörelse. Håll mobilen stilla."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Registrera ansiktet på nytt."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ansiktet kan inte längre kännas igen. Försök igen."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Vrid mindre på huvudet."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Vrid mindre på huvudet."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Ta bort allt som täcker ansiktet."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Rengör sensorn på skärmens överkant."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Rengör skärmens överkant, inklusive det svarta fältet"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Ansiktsverifiering går ej. Otillgänglig maskinvara."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Testa ansiktsautentiseringen igen."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Försök att använda ansiktslåset igen."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Kan inte lagra ny ansiktsdata. Radera först gammal data."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Ansiktsåtgärden har avbrutits"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Autentiseringen av ansiktet avbröts av användaren"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Ansiktsåtgärden har avbrutits."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Ansiktslås avbröts av användaren."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Du har gjort för många försök. Försök igen senare."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"För många försök. Ansiktsautentisering har inaktiverats."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"För många försök. Ansiktslås har inaktiverats."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Det gick inte att verifiera ansiktet. Försök igen."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Du har inte konfigurerat ansiktsautentisering"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Ansiktsautentisering stöds inte på den här enheten"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Du har inte konfigurerat ansiktslås."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Ansiktslås stöds inte på den här enheten."</string> <string name="face_name_template" msgid="7004562145809595384">"Ansikte <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index d75df35b3d1d..cded9f1097af 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Ujumbe wa sauti"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Kupiga simu kupitia Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Hali ya SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Hali ya SIM ya kipaumbele cha juu"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Hali ya TTY iliyoombwa na mtandao mwenza KAMILI"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Hali ya TTY iliyoombwa na mtandao mwenza HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Hali ya TTY iliyoombwa na mtandao mwenza VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Aikoni ya kitambulisho"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"dhibiti maunzi ya kuthibitisha uso"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"dhibiti maunzi ya kufungua kwa uso"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Huruhusu programu iombe njia za kuongeza na kufuta violezo vya uso vitakavyotumiwa."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"tumia maunzi ya kuthibistiha uso"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Huruhusu programu ithibitishe uso kwa kutumia maunzi ya kuthibitisha"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Utambuzi wa Uso"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"tumia maunzi ya kufungua kwa uso"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Huruhusu programu itumie maunzi ya kufungua kwa uso ili kuthibitisha"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Kufungua kwa uso"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Sajili uso wako tena"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Ili kuimarisha utambuzi, tafadhali sajili uso wako tena"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Imeshindwa kunasa data sahihi ya uso. Jaribu tena."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Sogeza simu upande wa kushoto."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Sogeza simu upande wa kulia."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Tafadhali angalia kifaa chako moja kwa moja."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Uso wako hauonekani. Angalia simu."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Weka uso wako moja kwa moja mbele ya simu."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Inatikisika sana. Ishike simu iwe thabiti."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Tafadhali sajili uso wako tena."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Haiwezi tena kutambua uso. Jaribu tena."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Geuza kichwa chako kidogo."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Geuza kichwa chako kidogo."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Ondoa kitu chochote kinachoficha uso wako."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Safisha kitambuzi kwenye ukingo wa juu wa skrini."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Safisha sehemu ya juu ya skrini yako, ikiwa ni pamoja na upau mweusi"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Imeshindwa kuthibitisha uso. Maunzi hayapatikani."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Jaribu tena uthibitishaji wa uso."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Jaribu kufungua kwa uso tena."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Imeshindwa kuhifadhi data ya uso mpya. Futa wa kale kwanza."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Utendaji wa kitambulisho umeghairiwa"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Mtumiaji ameghairi uthibitishaji wa uso"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Utendaji wa kitambulisho umeghairiwa."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Kufungua kwa uso kumeghairiwa na mtumiaji."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Umejaribu mara nyingi mno. Jaribu tena baadaye."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Umejaribu mara nyingi mno. Uthibitishaji wa uso umezimwa."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Umejaribu mara nyingi mno. Kipengele cha kufungua kwa uso kimezimwa."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Imeshindwa kuthibitisha uso. Jaribu tena."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Hujaweka mipangilio ya uthibitishaji wa uso"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Uthibitishaji wa uso hautumiki kwenye kifaa hiki"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Hujaweka mipangilio ya kufungua kwa uso."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Kufungua kwa uso hakutumiki kwenye kifaa hiki."</string> <string name="face_name_template" msgid="7004562145809595384">"Uso wa <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index a2a15dabfb94..fb815de04adf 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"குரலஞ்சல் செய்திகள்"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"வைஃபை அழைப்பு"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"சிம் நிலை"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"அதிக முன்னுரிமையுடைய சிம்மின் நிலை"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"TTY Mode FULLஐ இணைச் செயல்பாடு கோரியது"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"TTY Mode HCOஐ இணைச் செயல்பாடு கோரியது"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"TTY Mode VCOஐ இணைச் செயல்பாடு கோரியது"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"கைரேகை ஐகான்"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"முக அங்கீகாரத்திற்கான வன்பொருளை நிர்வகித்தல்"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"\'முகம் காட்டித் திறத்தலுக்கான\' வன்பொருளை நிர்வகித்தல்"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"உபயோகிப்பதற்காக முக டெம்ப்ளேட்டுகளை சேர்க்கும்/நீக்கும் முறைகளை இயக்க, ஆப்ஸை அனுமதிக்கும்."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"முக அங்கீகாரத்திற்கான வன்பொருளைப் பயன்படுத்துதல்"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"அடையாளம் காண்பதற்கு, முக அங்கீகார வன்பொருளைப் பயன்படுத்த ஆப்ஸை அனுமதிக்கிறது"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"முக அங்கீகாரம்"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"’முகம் காட்டித் திறத்தல்’ அம்சத்திற்கான வன்பொருளைப் பயன்படுத்துதல்"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"அடையாளம் காண \'முகம் காட்டித் திறத்தலுக்கான\' வன்பொருளைப் பயன்படுத்த ஆப்ஸை அனுமதிக்கும்"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"முகம் காட்டித் திறத்தல்"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"முகத்தை மீண்டும் பதிவுசெய்யவும்"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"அடையாளத்தை மேம்படுத்த முகத்தை மீண்டும் பதிவுசெய்யவும்"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"முகம் தெளிவாகப் பதிவாகவில்லை. மீண்டும் முயலவும்."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"மொபைலை இடப்புறம் நகர்த்தவும்."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"மொபைலை வலப்புறம் நகர்த்தவும்."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"முழுமுகம் தெரியுமாறு நேராகப் பார்க்கவும்."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"முகம் சரியாகத் தெரியவில்லை. மொபைலைப் பார்க்கவும்."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"முகத்தை மொபைலுக்கு நேராக வைக்கவும்."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"அதிகமாக அசைகிறது. மொபைலை அசைக்காமல் பிடிக்கவும்."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"உங்கள் முகத்தை மீண்டும் பதிவுசெய்யுங்கள்."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"முகத்தைக் கண்டறிய இயலவில்லை. மீண்டும் முயலவும்."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"தலையை லேசாகத் திருப்பவும்."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"உங்கள் தலையைச் சற்றுத் திருப்பவும்."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"உங்கள் முகத்தை மறைக்கும் அனைத்தையும் நீக்குக."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"திரையின் மேல்முனையிலுள்ள சென்சாரைச் சுத்தம் செய்க."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"திரையையும் அதிலுள்ள கருப்புப் பட்டியையும் சுத்தம் செய்யவும்"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"முகத்தைச் சரிபார்க்க இயலவில்லை. வன்பொருள் இல்லை."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"முக அங்கீகாரத்தை மீண்டும் முயலவும்."</string> + <string name="face_error_timeout" msgid="981512090365729465">"\'முகம் காட்டித் திறத்தலை\' மீண்டும் முயலவும்."</string> <string name="face_error_no_space" msgid="2712120617457553825">"புதிய முகங்களைச் சேர்க்க இயலவில்லை. பழையது ஒன்றை நீக்கவும்."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"முக அங்கீகாரச் செயல்பாடு ரத்துசெய்யப்பட்டது"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"முக அங்கீகாரம் பயனரால் ரத்துசெய்யப்பட்டது"</string> + <string name="face_error_canceled" msgid="283945501061931023">"முக அங்கீகாரச் செயல்பாடு ரத்துசெய்யப்பட்டது."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"\'முகம் காட்டித் திறத்தல்\' பயனரால் ரத்துசெய்யப்பட்டது."</string> <string name="face_error_lockout" msgid="3407426963155388504">"பலமுறை முயன்றுவிட்டீர்கள். பிறகு முயலவும்."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"பலமுறை முயன்றுவிட்டீர்கள். முக அங்கீகாரம் முடக்கப்பட்டது."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"பலமுறை முயன்றுவிட்டீர்கள். \'முகம் காட்டித் திறத்தல்’ முடக்கப்பட்டது."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"முகத்தைச் சரிபார்க்க இயலவில்லை. மீண்டும் முயலவும்."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"முக அங்கீகாரத்தை இன்னும் நீங்கள் அமைக்கவில்லை"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"இந்தச் சாதனத்தில் முக அங்கீகாரம் ஆதரிக்கப்படவில்லை"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"’முகம் காட்டித் திறத்தலை’ நீங்கள் அமைக்கவில்லை."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"இந்த சாதனத்தில் ’முகம் காட்டித் திறத்தல்’ ஆதரிக்கப்படவில்லை."</string> <string name="face_name_template" msgid="7004562145809595384">"முகம் <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 1556b1739fb7..776d39e1156e 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"వాయిస్ మెయిల్ సందేశాలు"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi కాలింగ్"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM స్థితి"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"అధిక ప్రాధాన్యత గల SIM స్థితి"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"అవతలి వారు FULL TTY మోడ్ని అభ్యర్థించారు"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"అవతలి వారు HCO TTY మోడ్ని అభ్యర్థించారు"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"అవతలి వారు VCO TTY మోడ్ని అభ్యర్థించారు"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"వేలిముద్ర చిహ్నం"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"ముఖ ప్రమాణీకరణ హార్డ్వేర్ను నిర్వహించండి"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"ముఖంతో అన్లాక్ చేయగల హార్డ్వేర్ నిర్వహణ"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"వినియోగం కోసం ముఖ టెంప్లేట్లను జోడించే మరియు తొలగించే పద్ధతులను అమలు చేయడానికి యాప్ను అనుమతిస్తుంది."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ముఖ ప్రమాణీకరణ హార్డ్వేర్ను వాడండి"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ప్రమాణీకరణ కోసం ముఖ ప్రామాణీకరణ హార్డ్వేర్ను ఉపయోగించడానికి యాప్ని అనుమతిస్తుంది"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"ముఖ ప్రామాణీకరణ"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"ముఖంతో అన్లాక్ చేయగల హార్డ్వేర్ వినియోగం"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"ప్రమాణీకరణ కోసం ముఖంతో అన్లాక్ చేయగల హార్డ్వేర్ను ఉపయోగించడానికి యాప్ను అనుమతిస్తుంది"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"ముఖంతో అన్లాక్"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"మీ ముఖాన్ని తిరిగి నమోదు చేయండి"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"గుర్తింపును మెరుగుపరచడానికి, దయచేసి మీ ముఖంను తిరిగి నమోదు చేసుకోండి"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"ముఖం డేటా సరిగ్గా రాలేదు. మళ్లీ ప్రయత్నించండి."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"ఫోన్ను ఎడమవైపునకు జరపండి."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"ఫోన్ను కుడివైపునకు జరపండి."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"దయచేసి మీ పరికరం వైపు మరింత నేరుగా చూడండి."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"మీ ముఖం కనిపించడం లేదు. ఫోన్ వైపు చూడండి."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"మీ ముఖాన్ని ఫోన్కు ఎదురుగా ఉంచండి."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"బాగా కదుపుతున్నారు. ఫోన్ను స్థిరంగా పట్టుకోండి"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"దయచేసి మీ ముఖాన్ని మళ్లీ నమోదు చేయండి."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"ఇక ముఖం గుర్తించలేదు. మళ్లీ ప్రయత్నించండి."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"మీ తలను ఇంకాస్త తక్కువ తిప్పండి."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"మీ తలను ఎడమ/కుడి వైపుగా ఇంకాస్త తిప్పండి."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"మీ ముఖానికి అడ్డుగా ఉన్నవాటిని తీసివేస్తుంది."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"స్క్రీన్ ఎగువన ఉన్న సెన్సార్ను శుభ్రం చేస్తుంది."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"నల్లని పట్టీతో సహా మీ స్క్రీన్ పైభాగం అంతటినీ శుభ్రంగా తుడవండి"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"ముఖం ధృవీకరించలేరు. హార్డ్వేర్ అందుబాటులో లేదు."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"ముఖ ప్రామాణీకరణను మళ్ళీ ప్రయత్నించండి."</string> + <string name="face_error_timeout" msgid="981512090365729465">"ముఖంతో అన్లాక్ను మళ్లీ ప్రయత్నించండి."</string> <string name="face_error_no_space" msgid="2712120617457553825">"కొత్త ముఖం డేటాను నిల్వ చేయడం కాదు. మొదట పాతది తొలిగించండి."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"ముఖ కార్యకలాపం రద్దయింది"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"వినియోగదారు ద్వారా ముఖ ప్రామాణీకరణ రద్దు చేయబడింది"</string> + <string name="face_error_canceled" msgid="283945501061931023">"ముఖ కార్యకలాపం రద్దయింది."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"ముఖంతో అన్లాక్ను వినియోగదారు రద్దు చేశారు."</string> <string name="face_error_lockout" msgid="3407426963155388504">"చాలా ఎక్కువ ప్రయత్నాలు చేసారు. తర్వాత మళ్లీ ప్రయత్నించండి."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"అనేకసార్లు ప్రయత్నించారు. ముఖ ప్రమాణీకరణ నిలిపివేయబడింది."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"అనేకసార్లు ప్రయత్నించారు. ముఖంతో అన్లాక్ నిలిపివేయబడింది."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"ముఖం ధృవీకరించలేకపోయింది. మళ్లీ ప్రయత్నించండి."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"మీరు ముఖ ప్రామాణీకరణను సెటప్ చేయలేదు"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"ఈ పరికరంలో ముఖ ప్రమాణీకరణకు మద్దతు లేదు"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"మీరు ముఖంతో అన్లాక్ను సెటప్ చేయలేదు."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"ఈ పరికరంలో ముఖంతో అన్లాక్ను ఉపయోగించడానికి మద్దతు లేదు."</string> <string name="face_name_template" msgid="7004562145809595384">"ముఖ <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 8328af539578..fdedffaea9a9 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ข้อความเสียง"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"การโทรผ่าน Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"สถานะซิม"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"สถานะซิมลำดับความสำคัญสูง"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"อีกฝั่งหนึ่งขอโหมด TTY เป็น \"เต็ม\""</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"อีกฝั่งหนึ่งขอโหมด TTY เป็น \"HCO\""</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"อีกฝั่งหนึ่งขอโหมด TTY เป็น \"VCO\""</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"ไอคอนลายนิ้วมือ"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"จัดการฮาร์ดแวร์ตรวจสอบสิทธิ์ด้วยใบหน้า"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"จัดการฮาร์ดแวร์ Face Unlock"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"อนุญาตให้แอปเรียกใช้วิธีเพิ่มและลบเทมเพลตใบหน้าสำหรับการใช้งาน"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"ใช้ฮาร์ดแวร์ตรวจสอบสิทธิ์ด้วยใบหน้า"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"อนุญาตให้แอปใช้ฮาร์ดแวร์ตรวจสอบสิทธิ์ด้วยใบหน้าเพื่อตรวจสอบสิทธิ์"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"การตรวจสอบสิทธิ์ด้วยใบหน้า"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"ใช้ฮาร์ดแวร์ Face Unlock"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"อนุญาตให้แอปใช้ฮาร์ดแวร์ Face Unlock เพื่อตรวจสอบสิทธิ์"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Face Unlock"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"ลงทะเบียนใบหน้าอีกครั้ง"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"โปรดลงทะเบียนใบหน้าอีกครั้งเพื่อปรับปรุงการจดจำ"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"บันทึกข้อมูลใบหน้าที่ถูกต้องไม่ได้ ลองอีกครั้ง"</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"เลื่อนโทรศัพท์ไปทางซ้าย"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"เลื่อนโทรศัพท์ไปทางขวา"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"โปรดมองตรงมาที่อุปกรณ์"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"ไม่เห็นหน้าเลย ลองมองที่โทรศัพท์"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"หันหน้าให้ตรงกับโทรศัพท์"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"มีการเคลื่อนไหวมากเกินไป ถือโทรศัพท์นิ่งๆ"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"โปรดลงทะเบียนใบหน้าอีกครั้ง"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"จำใบหน้าไม่ได้แล้ว ลองอีกครั้ง"</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"จัดตำแหน่งศีรษะให้ตรง"</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"จัดตำแหน่งศีรษะให้ตรง"</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"เอาสิ่งที่ปิดบังใบหน้าออก"</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"ทำความสะอาดเซ็นเซอร์ที่ขอบด้านบนของหน้าจอ"</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"ทำความสะอาดด้านบนของหน้าจอ รวมถึงแถบสีดำ"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"ยืนยันใบหน้าไม่ได้ ฮาร์ดแวร์ไม่พร้อมใช้งาน"</string> - <string name="face_error_timeout" msgid="3202585609451248103">"ลองใช้การตรวจสอบสิทธิ์ด้วยใบหน้าอีกครั้ง"</string> + <string name="face_error_timeout" msgid="981512090365729465">"ลองใช้ Face Unlock อีกครั้ง"</string> <string name="face_error_no_space" msgid="2712120617457553825">"จัดเก็บข้อมูลใบหน้าใหม่ไม่ได้ ลบข้อมูลเก่าออกไปก่อน"</string> - <string name="face_error_canceled" msgid="2768146728600802422">"ยกเลิกการดำเนินการด้วยใบหน้าแล้ว"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"ผู้ใช้ยกเลิกการตรวจสอบสิทธิ์ด้วยใบหน้า"</string> + <string name="face_error_canceled" msgid="283945501061931023">"ยกเลิกการดำเนินการกับใบหน้าแล้ว"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"ผู้ใช้ยกเลิกการใช้ Face Unlock"</string> <string name="face_error_lockout" msgid="3407426963155388504">"ดำเนินการหลายครั้งเกินไป ลองอีกครั้งในภายหลัง"</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"ลองหลายครั้งเกินไป การตรวจสอบสิทธิ์ด้วยใบหน้าถูกปิดใช้"</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"ลองหลายครั้งเกินไป ปิดใช้ Face Unlock แล้ว"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"ยืนยันใบหน้าไม่ได้ ลองอีกครั้ง"</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"คุณยังไม่ได้ตั้งค่าการตรวจสอบสิทธิ์ด้วยใบหน้า"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"อุปกรณ์นี้ไม่รองรับการตรวจสอบสิทธิ์ด้วยใบหน้า"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"คุณยังไม่ได้ตั้งค่า Face Unlock"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"อุปกรณ์นี้ไม่รองรับ Face Unlock"</string> <string name="face_name_template" msgid="7004562145809595384">"ใบหน้า <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index db96753de7c4..c33e5611ce7a 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mga mensahe sa voicemail"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Pagtawag gamit ang Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Status ng SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"High priority na status ng SIM"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Hiniling ng peer ang TTY Mode FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Hiniling ng peer ang TTY Mode HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Hiniling ng peer ang TTY Mode VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Icon ng fingerprint"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"pamahalaan ang hardware sa authentication ng mukha"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"pamahalaan ang hardware ng face unlock"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Pumapayag na mag-invoke ang app ng paraang magdagdag at mag-delete ng template ng mukha."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"gumamit ng hardware sa pag-authenticate ng mukha"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Pumapayag na gumamit ng face authentication hardware ang app para sa pag-authenticate"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Pag-authenticate ng Mukha"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"gamitin ang hardware ng face unlock"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Pinapayagan ang app na gamitin ang hardware ng face unlock para sa pag-authenticate"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Face unlock"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"I-enroll ulit ang iyong mukha"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Para mapahusay ang pagkilala, paki-enroll ulit ang iyong mukha"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Hindi makakuha ng tamang face data. Subukang muli."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Igalaw ang telepono pakaliwa."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Igalaw ang telepono pakanan."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Tumingin nang mas direkta sa iyong device."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Hindi makita ang mukha mo. Tumingin sa telepono."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Itapat ang mukha mo sa mismong harap ng telepono."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Masyadong magalaw. Hawakang mabuti ang telepono."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Paki-enroll muli ang iyong mukha."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Hindi na makilala ang mukha. Subukang muli."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Huwag masyadong tumingala o yumuko."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Huwag masyadong lumingon."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Alisin ang anumang humaharang sa iyong mukha."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Linisinin ang sensor sa itaas na gilid ng screen."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Linisin ang itaas ng iyong screen, kasama ang itim na bar"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Di ma-verify ang mukha. Di available ang hardware."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Subukan ulit ang pag-authenticate sa mukha."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Subukan ulit ang face unlock."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Hindi ma-store ang data ng mukha. Mag-delete muna ng iba."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Nakansela ang operation kaugnay ng mukha"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Kinansela ng user ang pag-authenticate ng mukha"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Nakansela ang operation kaugnay ng mukha."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Kinansela ng user ang face unlock."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Masyadong maraming pagsubok. Subukang muli mamaya."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Sumobra ang pagsubok. Na-disable ang face authentication."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Masyadong maraming pagsubok. Na-disable ang face unlock."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Hindi ma-verify ang mukha. Subukang muli."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Hindi pa na-set up ang pag-authenticate ng mukha"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Hindi sinusuportahan ang pag-authenticate ng mukha sa device"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Hindi mo pa nase-set up ang face unlock."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Hindi sinusuportahan ang face unlock sa device na ito."</string> <string name="face_name_template" msgid="7004562145809595384">"Mukha <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 4dfb34874493..7d69213ebe0c 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Sesli mesajlar"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Kablosuz çağrı"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM durumu"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Yüksek öncelikli SIM durumu"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Karşı taraf TTY Modunu TAM yaptı"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Karşı taraf TTY Modunu HCO yaptı"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Karşı taraf TTY Modunu VCO yaptı"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Parmak izi simgesi"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"yüz kimlik doğrulaması donanımını yönetme"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"yüz tanıma kilidi donanımı yönet"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Uygulamanın, kullanılacak yüz şablonlarını ekleme ve silme yöntemlerini başlatmasına izin verir."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"yüz kimlik doğrulaması donanımını kullanma"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Uygulamanın yüz kimlik doğrulaması donanımı kullanmasına izin verir"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Yüzle Kimlik Doğrulama"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"yüz tanıma kilidi donanımını kullan"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Uygulamanın yüz tanıma kilidi donanımı kullanmasına izin verir"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Yüz tanıma kilidi"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Yüzünüzü yeniden kaydedin"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Daha iyi tanınmasını sağlamak için lütfen yüzünüzü yeniden kaydedin"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Doğru yüz verileri yakalanamadı. Tekrar deneyin."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Telefonu sola hareket ettirin."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Telefonu sağa hareket ettirin."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Lütfen cihazınıza daha doğrudan bakın."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Yüzünüz görülmüyor. Telefona bakın."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Yüzünüz telefonun tam karşısına gelmelidir."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Çok fazla hareket ediyorsunuz. Telefonu sabit tutun."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Lütfen yüzünüzü yeniden kaydedin."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Yüz artık tanınamıyor. Tekrar deneyin."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Başınızı biraz daha az çevirin."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Başınızı biraz daha az çevirin."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Yüzünüzün görünmesini engelleyen şeyleri kaldırın."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Ekranın üst kenarındaki sensörü temizleyin."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Siyah çubuk da dahil olmak üzere ekranınızın üst kısmını temizleyin"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Yüz doğrulanamıyor. Donanım kullanılamıyor."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Yüzle kimlik doğrulamayı tekrar deneyin."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Yüz tanıma kilidini yeniden deneyin."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Yeni yüz verisi depolanamıyor. Önce eski bir tanesini silin."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Yüz işlemi iptal edildi"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Yüz kimlik doğrulama işlemini kullanıcı iptal etti"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Yüz işlemi iptal edildi."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Yüz tanıma kilidi kullanıcı tarafından iptal edildi."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Çok fazla deneme yapıldı. Daha sonra tekrar deneyin."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Çok fazla deneme yapıldı. Yüz kimlik doğrulaması devre dışı."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Çok fazla deneme yapıldı. Yüz tanıma kilidi devredışı."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Yüz doğrulanamıyor. Tekrar deneyin."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Yüz kimlik doğrulaması ayarlamadınız"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Bu cihazda yüz kimlik doğrulaması desteklenmiyor"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Yüz tanıma kilidi ayarlamadınız."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Bu cihazda yüz tanıma kilidi desteklenmiyor"</string> <string name="face_name_template" msgid="7004562145809595384">"Yüz <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 565021fd918d..13c89296c4bc 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -97,6 +97,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Повідомлення голосової пошти"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Дзвінки через Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Статус SIM-карти"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Високопріоритетні сповіщення із SIM-карти"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Пристрій змінив режим TTY на FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Пристрій змінив режим TTY на HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Пристрій змінив режим TTY на VCO"</string> @@ -556,11 +557,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Значок відбитка пальця"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"керувати обладнанням для автентифікації облич"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"керувати апаратним забезпечення для Фейсконтролю"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Додаток може активувати способи додавання й видалення шаблонів облич."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"застосовувати обладнання для автентифікації облич"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Додаток може застосовувати обладнання для автентифікації облич"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Автентифікація за обличчям"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"використовувати апаратне забезпечення для Фейсконтролю"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Додаток може використовувати апаратне забезпечення для Фейсконтролю"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Фейсконтроль"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Повторно проскануйте обличчя"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Повторно проскануйте обличчя для ефективнішого розпізнавання"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Не вдалося чітко зняти обличчя. Повторіть спробу."</string> @@ -573,7 +574,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Тримайте телефон лівіше."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Тримайте телефон правіше."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Дивіться просто на пристрій."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Обличчя не видно. Дивіться на телефон."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Тримайте телефон просто перед обличчям."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Забагато рухів. Тримайте телефон нерухомо."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Повторно проскануйте обличчя."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Розпізнати обличчя вже не вдається. Повторіть спробу."</string> @@ -582,19 +583,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Трохи перемістіть обличчя."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Трохи поверніть обличчя."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Приберіть об’єкти, які затуляють ваше обличчя."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Очистьте датчик угорі екрана."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Очистьте верхню частину екрана, зокрема чорну панель"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Не вдається перевірити обличчя. Апаратне забезпечення недоступне."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Повторіть автентифікацію за обличчям."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Скористайтеся Фейсконтролем ще раз."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Не вдається зберегти нові дані про обличчя. Видаліть старі."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Дію з обличчям скасовано"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Користувач скасував автентифікацію за обличчям"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Дію з обличчям скасовано."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Користувач скасував Фейсконтроль."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Забагато спроб. Повторіть пізніше."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Забагато спроб. Автентифікацію за обличчям вимкнено."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Забагато спроб. Фейсконтроль вимкнено."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Не вдається перевірити обличчя. Повторіть спробу."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Ви не налаштували автентифікацію за обличчям"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"На цьому пристрої автентифікація за обличчям не підтримується"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Ви не налаштували Фейсконтроль"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"На цьому пристрої не підтримується Фейсконтроль."</string> <string name="face_name_template" msgid="7004562145809595384">"Обличчя <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index b510ed72b419..dba7f8f06f67 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"صوتی میل پیغامات"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi کالنگ"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM کا اسٹیٹس"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"اعلی ترجیحی SIM کی صورتحال"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"ہمسر نے TTY وضع مکمل کی درخواست کی"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"ہمسر نے TTY وضع HCO کی درخواست کی"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"ہمسر نے TTY وضع VCO کی درخواست کی"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"فنگر پرنٹ آئیکن"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"چہرے کی توثیق کے ہارڈویئر کا نظم کریں"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"چہرے کے ذریعے غیر مقفل کرنے والے ہارڈ ویئر کا نظم کریں"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"ایپ کو چہرے کی تمثیلات شامل اور حذف کرنے کے طریقوں کو کالعدم قرار دینے کی اجازت دیتا ہے۔"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"چہرے کی توثیق کا ہارڈویئر استعمال کریں"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"ایپ کو توثیق کیلئے چہرے کا ہارڈ ویئر استعمال کرنے کی اجازت دیتا ہے"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"چہرے سے تصدیق"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"چہرے کے ذریعے غیر مقفل کرنے والا ہارڈ ویئر استعمال کریں"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"ایپ کو تصدیق کے لیے چہرے کے ذریعے غیر مقفل کرنے کا ہارڈ ویئر استعمال کرنے کی اجازت دیتی ہے"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"چہرے کے ذریعے غیر مقفل کریں"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"اپنے چہرے کو دوبارہ مندرج کریں"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"شناخت کو بہتر بنانے کے لیے براہ کرم اپنے چہرے کو دوبارہ مندرج کریں"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"چہرے کا درست ڈيٹا کیپچر نہیں ہو سکا۔ پھر آزمائيں۔"</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"فون کو بائیں جانب لے جائيں۔"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"فون کو دائیں جانب لے جائیں۔"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"براہ کرم اپنے آلہ کی طرف چہرے کو سیدھا رکھیں۔"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"آپ کا چہرہ دکھائی نہیں دے رہا۔ فون کی طرف دیکھیں۔"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"اپنے چہرے کو براہ راست فون کے سامنے رکھیں۔"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"کافی حرکت ہو رہی ہے۔ فون کو مضبوطی سے پکڑیں۔"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"براہ کرم اپنے چہرے کو دوبارہ مندرج کریں۔"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"اب چہرے کی شناخت نہیں کر سکتے۔ پھر آزمائيں۔"</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"اپنا سر تھوڑا کم کریں۔"</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"اپنا سر تھوڑا کم کریں۔"</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"آپ کے چہرہ کو چھپانے والی ہر چیز کو ہٹائیں۔"</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"اسکرین کے بالائی کنارے پر سنسر کو صاف کریں۔"</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"سیاہ بار سمیت، اپنی اسکرین کے اوپری حصے کو صاف کریں"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"چہرے کی توثیق نہیں کی جا سکی۔ ہارڈ ویئر دستیاب نہیں ہے۔"</string> - <string name="face_error_timeout" msgid="3202585609451248103">"چہرے سے تصدیق دوبارہ آزمائيں۔"</string> + <string name="face_error_timeout" msgid="981512090365729465">"چہرے کے ذریعے غیر مقفل کرنے کو دوبارہ آزمائیں۔"</string> <string name="face_error_no_space" msgid="2712120617457553825">"چہرے کا نیا ڈیٹا اسٹور نہیں کر سکتے۔ پہلے پرانا حذف کریں۔"</string> - <string name="face_error_canceled" msgid="2768146728600802422">"چہرے پر آپریشن منسوخ ہو گئی"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"صارف نے چہرے کی تصدیق کو منسوخ کر دیا"</string> + <string name="face_error_canceled" msgid="283945501061931023">"چہرے پر ہونے والی کارروائی منسوخ ہو گئی۔"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"صارف نے چہرے کے ذریعے غیر مقفل کرنے کو منسوخ کر دیا۔"</string> <string name="face_error_lockout" msgid="3407426963155388504">"کافی زیادہ کوششیں کی گئیں۔ دوبارہ کوشش کریں۔"</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"کافی زیادہ کوششیں۔ چہرے سے تصدیق غیر فعال کر دی گئی ہے۔"</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"کافی زیادہ کوششیں۔ چہرے کے ذریعے غیر مقفل کرنا غیر فعال کر دیا گیا۔"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"چہرے کی توثیق نہیں کی جا سکی۔ پھر آزمائيں۔"</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"آپ نے چہرے سے تصدیق سیٹ اپ نہیں کیا ہے"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"اس آلہ پر چہرے سے تصدیق تعاون یافتہ نہیں ہے"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"آپ نے بذریعہ چہرہ غیر مقفل کرنے کو سیٹ نہیں کیا ہے۔"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"اس آلہ پر چہرے کے ذریعے غیر مقفل کرنا تعاون یافتہ نہیں ہے۔"</string> <string name="face_name_template" msgid="7004562145809595384">"چہرہ <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 04672e4de0d6..f06a0a029b98 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Ovozli xabarlar"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi chaqiruv"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM karta holati"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"SIM kartadagi muhim bildirishnomalar"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Teng huquqli ishtirokchi teletayp rejimini FULL (to‘liq) qilib o‘zgartirdi"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Teng huquqli ishtirokchi teletayp rejimini HCO (eshitadi, gapirolmaydi) qilib o‘zgartirdi"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Teng huquqli ishtirokchi teletayp rejimini VCO (gapiradi, eshitolmaydi) qilib o‘zgartirdi"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Barmoq izi belgisi"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"yuzni aniqlash qurilmasini boshqarish"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"yuz bilan ochish qurilmasini boshqarish"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Ilova foydalanish uchun yuz namunalarini qo‘shish va o‘chirish usullarini tatbiq qilishi mumkin."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"yuzni aniqlash qurilmasidan foydalanish"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Haqiqiylikni tekshirish uchun skanerdan foydalanish imkonini beradi"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Yuz tekshiruvi"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"yuz bilan ochish qurilmasidan foydalanish"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Haqiqiylikni tekshirish uchun yuz bilan ochishdan foydalanish imkonini beradi"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Yuz bilan ochish"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Yuzingizni yana qayd qiling"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Yuzingiz yanada yaxshiroq aniqlanishi uchun uni yana bir marta qayd qiling"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Yuz ravshan suratga olinmadi. Qaytadan urining."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Telefonni chapga suring."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Telefonni oʻngga suring."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Qurilmaga tik qarang."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Yuzingiz koʻrinmayapti. Telefonga qarang."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Telefoningizga yuzingizni tik tuting."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Ortiqcha harakatlanmoqda. Qimirlatmasdan ushlang."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Yuzingizni qaytadan qayd qildiring."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Yuz tanilmadi. Qaytadan urining."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Boshingizni asta buring."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Boshingizni asta buring."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Yuzingizni berkitayotgan narsalarni olib tashlang."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Ekranning tepasidagi sensorni tozalang."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Ekranning yuqori qismini, shuningdek, qora panelni ham tozalang"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Yuzingiz tasdiqlanmadi. Qurilma ishlamayapti."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Yana yuz tekshiruvini amalga oshirish."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Yana yuz bilan ochishga urining."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Yuzga oid axborot saqlanmadi. Avval eskilari tozalansin."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Yuzni aniqlash bekor qilindi"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Yuz tekshiruvi bekor qilindi."</string> + <string name="face_error_canceled" msgid="283945501061931023">"Yuzni aniqlash bekor qilindi."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Yuz bilan ochishni foydalanuvchi bekor qildi."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Juda ko‘p urinildi. Keyinroq qaytadan urining."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Juda koʻp urinildi. Yuz tekshiruvi faolsizlantirildi."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Juda koʻp urinildi. Yuz bilan ochish faolsizlantirildi."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Yuzingiz tasdiqlanmadi. Qaytadan urining."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Hali yuz tekshiruvini sozlamagansiz"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Yuz tekshiruvi bu qurilmada ishlamaydi"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Hali yuz bilan ochishni sozlamagansiz"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Yuz bilan ochish bu qurilmada ishlamaydi"</string> <string name="face_name_template" msgid="7004562145809595384">"Yuz <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 8326bec7c0d3..c5bd7cc026c0 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Thư thoại"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Gọi qua Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Trạng thái SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Trạng thái SIM có mức ưu tiên cao"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"TTY theo yêu cầu của thiết bị ngang hàng ở chế độ ĐẦY ĐỦ"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"TTY theo yêu cầu của thiết bị ngang hàng ở chế độ HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"TTY theo yêu cầu của thiết bị ngang hàng ở chế độ VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Biểu tượng vân tay"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"quản lý phần cứng xác thực khuôn mặt"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"quản lý phần cứng mở khóa bằng khuôn mặt"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Cho phép ứng dụng gọi ra các phương pháp để thêm và xóa mẫu khuôn mặt sử dụng."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"sử dụng phần cứng xác thực khuôn mặt"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Cho phép ứng dụng sử dụng phần cứng xác thực khuôn mặt để tiến hành xác thực"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Xác thực khuôn mặt"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"sử dụng phần cứng mở khóa bằng khuôn mặt"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Cho phép ứng dụng dùng phần cứng mở khóa bằng khuôn mặt để tiến hành xác thực"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"Mở khóa bằng khuôn mặt"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Đăng ký lại khuôn mặt của bạn"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Để cải thiện khả năng nhận dạng, hãy đăng ký lại khuôn mặt của bạn"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Không thể ghi lại đúng dữ liệu mặt. Hãy thử lại."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Đưa điện thoại sang bên trái."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Đưa điện thoại sang bên phải."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Vui lòng nhìn thẳng vào thiết bị."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Hệ thống không phát hiện được khuôn mặt bạn. Hãy nhìn vào điện thoại."</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Hướng thẳng khuôn mặt về phía trước điện thoại."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Thiết bị di chuyển quá nhiều. Giữ yên thiết bị."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Vui lòng đăng ký lại khuôn mặt của bạn."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Không nhận ra khuôn mặt. Hãy thử lại."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Hãy bớt di chuyển đầu."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Hãy bớt di chuyển đầu."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Hãy loại bỏ mọi thứ che khuất khuôn mặt bạn."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Hãy lau sạch cảm biến ở cạnh trên của màn hình."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Vệ sinh phần đầu màn hình, bao gồm cả thanh màu đen"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Không thể xác minh khuôn mặt. Phần cứng không có sẵn."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Thử xác thực lại khuôn mặt."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Thử lại thao tác mở khóa bằng khuôn mặt."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Không lưu được dữ liệu khuôn mặt mới. Hãy xóa dữ liệu cũ trước."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Đã hủy thao tác dùng khuôn mặt"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Người dùng đã hủy thao tác xác thực khuôn mặt"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Đã hủy thao tác dùng khuôn mặt."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"Người dùng đã hủy thao tác mở khóa bằng khuôn mặt."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Bạn đã thử quá nhiều lần. Hãy thử lại sau."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Quá nhiều lần thử. Tính năng xác thực khuôn mặt đã tắt."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Quá nhiều lần thử. Đã tắt tính năng mở khóa bằng khuôn mặt."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Không thể xác minh khuôn mặt. Hãy thử lại."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Bạn chưa thiết lập tính năng xác thực khuôn mặt"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Thiết bị này không hỗ trợ tính năng xác thực khuôn mặt"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Bạn chưa thiết lập tính năng mở khóa bằng khuôn mặt."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"Thiết bị này không hỗ trợ tính năng mở khóa bằng khuôn mặt."</string> <string name="face_name_template" msgid="7004562145809595384">"Khuôn mặt <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 6014290ca7dc..487e4a020f2c 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"语音邮件"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"WLAN 通话"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM 卡状态"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"高优先顺序 SIM 卡状态"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"对方请求使用“TTY 完整”模式"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"对方请求使用“TTY HCO”模式"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"对方请求使用“TTY VCO”模式"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指纹图标"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"管理人脸身份验证硬件"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"管理人脸解锁硬件"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"允许该应用调用方法来添加和删除可用的人脸模板。"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"使用人脸身份验证硬件"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"允许该应用使用人脸身份验证硬件进行身份验证"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"面孔身份验证"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"使用人脸解锁硬件"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"允许该应用使用人脸解锁硬件进行身份验证"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"人脸解锁"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"重新注册您的面孔"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"要提升识别精确度,请重新注册您的面孔"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"无法捕获准确的人脸数据,请重试。"</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"请将手机向左移动。"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"请将手机向右移动。"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"请直视您的设备。"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"看不到您的脸部,请直视手机。"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"请将你的面部正对手机。"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"摄像头过于晃动。请将手机拿稳。"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"请重新注册您的面孔。"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"已无法识别人脸,请重试。"</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"请将您的头稍微上下倾斜。"</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"请将您的头稍微左右旋转。"</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"请移除所有遮挡您面部的物体。"</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"请将屏幕顶部边缘的传感器擦拭干净。"</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"请将屏幕顶部(包括黑色条栏)清理干净"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"无法验证人脸。硬件无法使用。"</string> - <string name="face_error_timeout" msgid="3202585609451248103">"请重新尝试面孔身份验证。"</string> + <string name="face_error_timeout" msgid="981512090365729465">"请重新尝试人脸解锁。"</string> <string name="face_error_no_space" msgid="2712120617457553825">"无法存储新的人脸数据。请先删除旧的人脸数据。"</string> - <string name="face_error_canceled" msgid="2768146728600802422">"人脸处理操作已取消"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"用户已取消人脸身份验证"</string> + <string name="face_error_canceled" msgid="283945501061931023">"面孔处理操作已取消。"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"用户已取消人脸解锁。"</string> <string name="face_error_lockout" msgid="3407426963155388504">"尝试次数过多,请稍后重试。"</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"尝试次数过多,人脸身份验证已停用。"</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"尝试次数过多,人脸解锁已停用。"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"无法验证人脸,请重试。"</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"您尚未设置人脸身份验证"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"此设备不支持人脸身份验证"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"您尚未设置人脸解锁。"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"此设备不支持人脸解锁。"</string> <string name="face_name_template" msgid="7004562145809595384">"面孔 <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 66c89e87d598..c634c68ba954 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"留言訊息"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 通話"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM 卡狀態"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"重要 SIM 卡狀態"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"對方曾要求 TTY 完整模式"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"對方曾要求 TTY 模式 (HCO)"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"對方曾要求 TTY 模式 (VCO)"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指紋圖示"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"管理臉孔驗證硬件"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"管理臉孔解鎖硬件"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"允許應用程式調用方法,以加入和刪除可用的臉孔範本。"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"使用臉孔驗證硬件"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"允許應用程式使用臉孔驗證硬件來驗證"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"臉孔驗證"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"使用臉孔解鎖硬件"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"允許應用程式使用臉孔解鎖硬件來驗證"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"臉孔解鎖"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"重新註冊臉孔"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"如要提高識別能力,請重新註冊您的臉孔"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"無法擷取準確的臉容資料。請再試一次。"</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"請將手機向左移。"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"請將手機向右移。"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"請以更直視的角度看著裝置。"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"看不到您的臉。請看著手機。"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"將手機對準您的臉孔正面。"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"裝置不夠穩定。請拿穩手機。"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"請重新註冊臉孔。"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"無法再識別臉孔。請再試一次。"</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"減少頭部上下轉動幅度。"</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"減少頭部左右轉動幅度。"</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"移除遮住您臉孔的任何東西。"</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"請清潔螢幕頂部邊緣的感應器。"</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"請清理螢幕頂部,包括黑色列"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"無法驗證臉孔,硬件無法使用。"</string> - <string name="face_error_timeout" msgid="3202585609451248103">"請再次嘗試驗證臉孔。"</string> + <string name="face_error_timeout" msgid="981512090365729465">"請再次嘗試「臉孔解鎖」。"</string> <string name="face_error_no_space" msgid="2712120617457553825">"無法儲存新的臉容資料,請先刪除舊資料。"</string> - <string name="face_error_canceled" msgid="2768146728600802422">"臉孔操作已取消"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"使用者已取消臉孔驗證"</string> + <string name="face_error_canceled" msgid="283945501061931023">"臉孔操作已取消。"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"使用者已取消「臉孔解鎖」。"</string> <string name="face_error_lockout" msgid="3407426963155388504">"嘗試次數過多,請稍後再試。"</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"嘗試次數過多,臉孔驗證已停用。"</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"嘗試次數過多,「臉孔解鎖」已停用。"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"無法驗證臉孔。請再試一次。"</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"您尚未設定臉孔驗證"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"此裝置不支援臉孔驗證"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"您尚未設定「臉孔解鎖」。"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"此裝置不支援「臉孔解鎖」。"</string> <string name="face_name_template" msgid="7004562145809595384">"臉孔 <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index c50b10cec745..483d42fb4327 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"語音留言"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 通話"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"SIM 卡狀態"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"高優先順序 SIM 卡狀態"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"通訊對象要求使用 TTY 的 FULL 模式"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"通訊對象要求使用 TTY 的 HCO 模式"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"通訊對象要求使用 TTY 的 VCO 模式"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"指紋圖示"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"管理臉孔驗證硬體"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"管理人臉解鎖硬體"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"允許應用程式呼叫方法來新增及移除可用的臉孔範本。"</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"使用臉孔驗證硬體"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"允許應用程式使用臉孔驗證硬體進行驗證"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"臉孔驗證"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"使用人臉解鎖硬體"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"允許應用程式使用人臉解鎖硬體進行驗證"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"人臉解鎖"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"請重新註冊你的臉孔"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"為提升辨識精準度,請重新註冊你的臉孔"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"無法擷取精準臉孔資料,請再試一次。"</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"請將手機向左移動。"</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"請將手機向右移動。"</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"請儘可能直視裝置正面。"</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"無法偵測你的臉孔,請直視手機。"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"將你的臉孔正對手機。"</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"鏡頭過度晃動,請拿穩手機。"</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"請重新註冊你的臉孔。"</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"已無法辨識臉孔,請再試一次。"</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"請將你的頭部稍微向上或向下傾斜。"</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"請將你的頭部稍微向左或向右旋轉。"</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"請移除任何會遮住臉孔的物體。"</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"請清除螢幕頂端感應器的髒汙。"</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"請清理螢幕頂端,包括黑色橫列"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"相關硬體無法使用,因此無法驗證臉孔。"</string> - <string name="face_error_timeout" msgid="3202585609451248103">"請重新驗證臉孔。"</string> + <string name="face_error_timeout" msgid="981512090365729465">"請重新進行人臉解鎖。"</string> <string name="face_error_no_space" msgid="2712120617457553825">"無法儲存新的臉孔資料,請先刪除舊的資料。"</string> - <string name="face_error_canceled" msgid="2768146728600802422">"臉孔處理作業已取消"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"使用者已取消臉孔驗證作業"</string> + <string name="face_error_canceled" msgid="283945501061931023">"臉孔處理作業已取消。"</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"使用者已取消人臉解鎖作業。"</string> <string name="face_error_lockout" msgid="3407426963155388504">"嘗試次數過多,請稍後再試。"</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"嘗試次數過多,因此系統已停用臉孔驗證。"</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"嘗試次數過多,因此系統已停用人臉解鎖功能。"</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"無法驗證臉孔,請再試一次。"</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"你尚未設定臉孔驗證"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"這個裝置不支援臉孔驗證"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"你尚未設定人臉解鎖功能。"</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"這個裝置不支援人臉解鎖功能。"</string> <string name="face_name_template" msgid="7004562145809595384">"臉孔 <xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 0c20cf4a10eb..9d19775f9af6 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -95,6 +95,7 @@ <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Imilayezo yevoyisimeyili"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Ukushaya kwe-Wi-Fi"</string> <string name="notification_channel_sim" msgid="4052095493875188564">"Isimo se-SIM"</string> + <string name="notification_channel_sim_high_prio" msgid="1787666807724243207">"Isimo se-SIM esiphezulu kakhulu"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Umngani ucele imodi ye-TTY ephelele"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Umngani ucele imodi ye-TTY HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Umngani ucele imodi ye-TTY VCO"</string> @@ -550,11 +551,11 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Isithonjana sezigxivizo zeminwe"</string> - <string name="permlab_manageFace" msgid="2137540986007309781">"phatha izingxenyekazi zekhompuyutha zokufakazela ubuqiniso zobuso"</string> + <string name="permlab_manageFace" msgid="7262837876352591553">"phatha izingxenyekazi zekhompuyutha ze-face unlock"</string> <string name="permdesc_manageFace" msgid="8919637120670185330">"Ivumela uhlelo lokusebenza ukuthi luhoxise izindlela zokungeza nokususa amathempulethi obuso azosetshenziswa."</string> - <string name="permlab_useFaceAuthentication" msgid="8996134460546804535">"sebenzisa izingxenyekazi zekhompuyutha zokufakazela ubuqiniso kobuso"</string> - <string name="permdesc_useFaceAuthentication" msgid="5011118722951833089">"Ivumela uhlelo lokusebenza ukuthi lusebenzise ukufakazela ubuqiniso bobuso bezingxenyekazi ukuze kufakazelwe ubuqiniso"</string> - <string name="face_recalibrate_notification_name" msgid="3976629945250435054">"Ukufakazela ubuqiniso bobuso"</string> + <string name="permlab_useFaceAuthentication" msgid="2565716575739037572">"sebenzisa izingxenyekazi zekhompuyutha ze-face unlock"</string> + <string name="permdesc_useFaceAuthentication" msgid="4712947955047607722">"Ivumela uhlelo lokusebenza ukuthi lusebenzise izingxenyekazi zekhompuyutha ze-face unlock ukuze kufakazelwe ubuqiniso"</string> + <string name="face_recalibrate_notification_name" msgid="1913676850645544352">"I-Face unlock"</string> <string name="face_recalibrate_notification_title" msgid="4087620069451499365">"Phinda ubhalise ubuso bakho"</string> <string name="face_recalibrate_notification_content" msgid="5530308842361499835">"Ukuze uthuthukise ukubonwa, sicela uphinde ubhalise ubuso bakho"</string> <string name="face_acquired_insufficient" msgid="2767330364802375742">"Ayikwazanga ukuthwebula idatha enembile yobuso. Zama futhi."</string> @@ -567,7 +568,7 @@ <string name="face_acquired_too_right" msgid="3667075962661863218">"Hambisa ifoni ngakwesokunxele."</string> <string name="face_acquired_too_left" msgid="3148242963894703424">"Hambisa ifoni ngakwesokudla."</string> <string name="face_acquired_poor_gaze" msgid="5606479370806754905">"Sicela ubheke ngokuqondile kakhulu kudivayisi yakho."</string> - <string name="face_acquired_not_detected" msgid="4885504661626728809">"Ayikwazi ukubona ubuso bakho. Bheka ifoni"</string> + <string name="face_acquired_not_detected" msgid="1879714205006680222">"Beka ubuso bakho ngqo phambi kwefoni."</string> <string name="face_acquired_too_much_motion" msgid="3149332171102108851">"Ukunyakaza okuningi kakhulu. Bamba ifoni iqine."</string> <string name="face_acquired_recalibrate" msgid="8077949502893707539">"Sicela uphinde ubhalise ubuso bakho."</string> <string name="face_acquired_too_different" msgid="7663983770123789694">"Ayisakwazi ukubona ubuso. Zama futhi."</string> @@ -576,19 +577,19 @@ <string name="face_acquired_tilt_too_extreme" msgid="4019954263012496468">"Jikisa ikhanda lakho kancane."</string> <string name="face_acquired_roll_too_extreme" msgid="6312973147689664409">"Jikisa ikhanda lakho kancane."</string> <string name="face_acquired_obscured" msgid="5357207702967893283">"Susa noma yini efihle ubuso bakho."</string> - <string name="face_acquired_sensor_dirty" msgid="2535761002815565222">"Hlanza inzwa kunqenqema oluphezulu lwesikrini."</string> + <string name="face_acquired_sensor_dirty" msgid="7905138627046865579">"Hlanza okuphezulu kwesikrini sakho, kufaka phakathi ibha emnyama"</string> <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="396883585636963908">"Ayikwazi ukuqinisekisa ubuso. Izingxenyekazi zekhompyutha azitholakali."</string> - <string name="face_error_timeout" msgid="3202585609451248103">"Zama ukufakazela ubuqiniso bobuso futhi."</string> + <string name="face_error_timeout" msgid="981512090365729465">"Zama i-face unlock futhi."</string> <string name="face_error_no_space" msgid="2712120617457553825">"Ayikwazi ukulondoloza idatha yobuso. Susa endala."</string> - <string name="face_error_canceled" msgid="2768146728600802422">"Umsebenzi wobuso ukhanselwe"</string> - <string name="face_error_user_canceled" msgid="9003022830076496163">"Ukufakazela ubuqiniso kobuso kukhanselwe umsebenzisi"</string> + <string name="face_error_canceled" msgid="283945501061931023">"Umsebenzi wobuso ukhanselwe."</string> + <string name="face_error_user_canceled" msgid="5317030072349668946">"I-face unlock ikhanselwe umsebenzisi."</string> <string name="face_error_lockout" msgid="3407426963155388504">"Imizamo eminingi kakhulu. Zama futhi emuva kwesikhathi."</string> - <string name="face_error_lockout_permanent" msgid="3485837851962070925">"Imizamo eminingi kakhulu. Ukugunyaza ubuso kukhutshaziwe."</string> + <string name="face_error_lockout_permanent" msgid="4723594314443097159">"Imizamo eminingi kakhulu. I-Face unlock ikhutshaziwe."</string> <string name="face_error_unable_to_process" msgid="4940944939691171539">"Ayikwazi ukuqinisekisa ubuso. Zama futhi."</string> - <string name="face_error_not_enrolled" msgid="2600952202843125796">"Awukakasethi ukufakazela ubuqiniso bobuso"</string> - <string name="face_error_hw_not_present" msgid="1317845121210260372">"Ukufakazela ubuqiniso bobuso akusekelwe kule divayisi"</string> + <string name="face_error_not_enrolled" msgid="4016937174832839540">"Awukakasethi i-face unlock."</string> + <string name="face_error_hw_not_present" msgid="8302690289757559738">"I-face unlock ayisekelwe kule divayisi."</string> <string name="face_name_template" msgid="7004562145809595384">"Ubuso be-<xliff:g id="FACEID">%d</xliff:g>"</string> <string-array name="face_error_vendor"> </string-array> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index eb7d02bad168..4eee1dbda6ba 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1115,6 +1115,22 @@ regularly selected color mode will be used if this value is negative. --> <integer name="config_accessibilityColorMode">-1</integer> + <!-- The following two arrays specify which color space to use for display composition when a + certain color mode is active. + Composition color spaces are defined in android.view.Display.COLOR_MODE_xxx, and color + modes are defined in ColorDisplayManager.COLOR_MODE_xxx and + ColorDisplayManager.VENDOR_COLOR_MODE_xxx. + The color space COLOR_MODE_DEFAULT (0) lets the system select the most appropriate + composition color space for currently displayed content. Other values (e.g., + COLOR_MODE_SRGB) override system selection; these other color spaces must be supported by + the device for for display composition. + If a color mode does not have a corresponding color space specified in this array, the + currently set composition color space will not be modified.--> + <integer-array name="config_displayCompositionColorModes"> + </integer-array> + <integer-array name="config_displayCompositionColorSpaces"> + </integer-array> + <!-- Indicate whether to allow the device to suspend when the screen is off due to the proximity sensor. This resource should only be set to true if the sensor HAL correctly handles the proximity sensor as a wake-up source. @@ -2283,7 +2299,7 @@ effectively and terminate the dream. Use -1 to disable this safety feature. --> <integer name="config_dreamsBatteryLevelDrainCutoff">5</integer> <!-- Limit of how long the device can remain unlocked due to attention checking. --> - <integer name="config_attentionMaximumExtension">240000</integer> <!-- 4 minutes --> + <integer name="config_attentionMaximumExtension">330000</integer> <!-- 5 minutes and 30 sec.--> <!-- How long we should wait until we give up on receiving an attention API callback. --> <integer name="config_attentionApiTimeout">2000</integer> <!-- 2 seconds --> @@ -2316,7 +2332,7 @@ <!-- If the sensor that wakes up the lock screen is available or not. --> <bool name="config_dozeWakeLockScreenSensorAvailable">false</bool> - <integer name="config_dozeWakeLockScreenDebounce">1500</integer> + <integer name="config_dozeWakeLockScreenDebounce">300</integer> <!-- Control whether the always on display mode is available. This should only be enabled on devices where the display has been tuned to be power efficient in DOZE and/or DOZE_SUSPEND @@ -3787,9 +3803,11 @@ <integer name="config_stableDeviceDisplayWidth">-1</integer> <integer name="config_stableDeviceDisplayHeight">-1</integer> - <!-- Decide whether to display 'No service' on status bar instead of 'Emergency calls only' - when SIM is unready. --> - <bool name="config_display_no_service_when_sim_unready">false</bool> + <!-- List of countries in which we display 'No service' on status bar + instead of 'Emergency calls only' when SIM is unready. --> + <string-array translatable="false" name="config_display_no_service_when_sim_unready"> + <item>"DE"</item> + </string-array> <!-- Class names of device specific services inheriting com.android.server.SystemService. The classes are instantiated in the order of the array. --> @@ -4021,16 +4039,62 @@ </array> <!-- See DisplayWhiteBalanceController. - The ambient brightness threshold (in lux) beneath which we fall back to a fixed ambient - color temperature. --> - <item name="config_displayWhiteBalanceLowLightAmbientBrightnessThreshold" format="float" type="dimen">10.0</item> + A float array containing a list of ambient brightnesses, in Lux. This array, + together with config_displayWhiteBalanceLowLightAmbientBiases, is used to generate a + lookup table used in DisplayWhiteBalanceController. This lookup table is used to map + ambient brightness readings to a bias, where the bias is used to linearly interpolate + between ambient color temperature and + config_displayWhiteBalanceLowLightAmbientColorTemperature. + This table is optional. If used, this array must, + 1) Contain at least two entries + 2) Be the same length as config_displayWhiteBalanceLowLightAmbientBiases. --> + <array name ="config_displayWhiteBalanceLowLightAmbientBrightnesses"> + <item>10.0</item> + <item>10.0</item> + </array> + + <!-- See DisplayWhiteBalanceController. + An array containing a list of biases. See + config_displayWhiteBalanceLowLightAmbientBrightnesses for additional details. + This array must be in the range of [0.0, 1.0]. --> + <array name ="config_displayWhiteBalanceLowLightAmbientBiases"> + <item>0.0</item> + <item>1.0</item> + </array> <!-- See DisplayWhiteBalanceController. - The ambient color temperature (in cct) to which we fall back when the ambient brightness - drops beneath a certain threshold. --> + The ambient color temperature (in cct) to which we interpolate towards using the + the look up table generated by config_displayWhiteBalanceLowLightAmbientBrightnesses + and config_displayWhiteBalanceLowLightAmbientBiases. --> <item name="config_displayWhiteBalanceLowLightAmbientColorTemperature" format="float" type="dimen">6500.0</item> <!-- See DisplayWhiteBalanceController. + A float array containing a list of ambient brightnesses, in Lux. This array, + together with config_displayWhiteBalanceHighLightAmbientBiases, is used to generate a + lookup table used in DisplayWhiteBalanceController. This lookup table is used to map + ambient brightness readings to a bias, where the bias is used to linearly interpolate + between ambient color temperature and + config_displayWhiteBalanceHighLightAmbientColorTemperature. + This table is optional. If used, this array must, + 1) Contain at least two entries + 2) Be the same length as config_displayWhiteBalanceHighLightAmbientBiases. --> + <array name ="config_displayWhiteBalanceHighLightAmbientBrightnesses"> + </array> + + <!-- See DisplayWhiteBalanceController. + An array containing a list of biases. See + config_displayWhiteBalanceHighLightAmbientBrightnesses for additional details. + This array must be in the range of [0.0, 1.0]. --> + <array name ="config_displayWhiteBalanceHighLightAmbientBiases"> + </array> + + <!-- See DisplayWhiteBalanceController. + The ambient color temperature (in cct) to which we interpolate towards using the + the look up table generated by config_displayWhiteBalanceHighLightAmbientBrightnesses + and config_displayWhiteBalanceHighLightAmbientBiases. --> + <item name="config_displayWhiteBalanceHighLightAmbientColorTemperature" format="float" type="dimen">8000.0</item> + + <!-- See DisplayWhiteBalanceController. A float array containing a list of ambient color temperatures, in Kelvin. This array, together with config_displayWhiteBalanceDisplayColorTemperatures, is used to generate a lookup table used in DisplayWhiteBalanceController. This lookup table is used to map @@ -4064,6 +4128,15 @@ M9,10l-2,0l0,-2l-2,0l0,2l-2,0l0,2l2,0l0,2l2,0l0,-2l2,0z </string> + <!-- X path for SignalDrawable as defined on a 24x24 canvas. --> + <string name="config_signalXPath" translatable="false"> + M22,16.41L20.59,15l-2.09,2.09L16.41,15L15,16.41l2.09,2.09L15,20.59L16.41,22l2.09-2.08L20.59,22L22,20.59l-2.08-2.09 L22,16.41z + </string> + <!-- config_signalCutout{Height,Width}Fraction define fraction of the 24x24 canvas that + should be cut out to display config_signalXPath.--> + <item name="config_signalCutoutWidthFraction" format="float" type="dimen">11</item> + <item name="config_signalCutoutHeightFraction" format="float" type="dimen">11</item> + <!-- A dual tone battery meter draws the perimeter path twice - once to define the shape and a second time clipped to the fill level to indicate charge --> <bool name="config_batterymeterDualTone">false</bool> @@ -4072,6 +4145,28 @@ for higher refresh rates to be automatically used out of the box --> <integer name="config_defaultPeakRefreshRate">60</integer> + <!-- The display uses different gamma curves for different refresh rates. It's hard for panel + vendor to tune the curves to have exact same brightness for different refresh rate. So + flicker could be observed at switch time. The issue is worse at the gamma lower end. + In addition, human eyes are more sensitive to the flicker at darker environment. + To prevent flicker, we only support higher refresh rates if the display brightness is above + a threshold. And the darker environment could have higher threshold. + For example, no higher refresh rate if + display brightness <= disp0 && ambient brightness <= amb0 + || display brightness <= disp1 && ambient brightness <= amb1 --> + <integer-array translatable="false" name="config_brightnessThresholdsOfPeakRefreshRate"> + <!-- + <item>disp0</item> + <item>disp1</item> + --> + </integer-array> + <integer-array translatable="false" name="config_ambientThresholdsOfPeakRefreshRate"> + <!-- + <item>amb0</item> + <item>amb1</item> + --> + </integer-array> + <!-- The type of the light sensor to be used by the display framework for things like auto-brightness. If unset, then it just gets the default sensor of type TYPE_LIGHT. --> <string name="config_displayLightSensorType" translatable="false" /> @@ -4134,6 +4229,9 @@ <integer-array name="config_face_acquire_vendor_biometricprompt_ignorelist" translatable="false" > </integer-array> + <!-- If face auth sends the user directly to home/last open app, or stays on keyguard --> + <bool name="config_faceAuthDismissesKeyguard">true</bool> + <!-- The component name for the default profile supervisor, which can be set as a profile owner even after user setup is complete. The defined component should be used for supervision purposes only. The component must be part of a system app. --> @@ -4145,4 +4243,8 @@ <!-- Sharesheet: define a max number of targets per application for new shortcuts-based direct share introduced in Q --> <integer name="config_maxShortcutTargetsPerApp">3</integer> + + <!-- The list of packages to automatically opt out of refresh rates higher than 60hz because + of known compatibility issues. --> + <string-array name="config_highRefreshRateBlacklist"></string-array> </resources> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 5363ef920886..665387943bbd 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -90,6 +90,24 @@ orientation. If zero, the value of rounded_corner_radius is used. --> <dimen name="rounded_corner_radius_bottom">0dp</dimen> + <!-- Default adjustment for the software rounded corners since corners are not perfectly + round. This value is used when retrieving the "radius" of the rounded corner in cases + where the exact bezier curve cannot be retrieved. This value will be subtracted from + rounded_corner_radius to more accurately provide a "radius" for the rounded corner. --> + <dimen name="rounded_corner_radius_adjustment">0px</dimen> + <!-- Top adjustment for the software rounded corners since corners are not perfectly + round. This value is used when retrieving the "radius" of the top rounded corner in cases + where the exact bezier curve cannot be retrieved. This value will be subtracted from + rounded_corner_radius_top to more accurately provide a "radius" for the top rounded corners. + --> + <dimen name="rounded_corner_radius_top_adjustment">0px</dimen> + <!-- Bottom adjustment for the software rounded corners since corners are not perfectly + round. This value is used when retrieving the "radius" of the bottom rounded corner in + cases where the exact bezier curve cannot be retrieved. This value will be subtracted from + rounded_corner_radius_bottom to more accurately provide a "radius" for the bottom rounded + corners. --> + <dimen name="rounded_corner_radius_bottom_adjustment">0px</dimen> + <!-- Width of the window of the divider bar used to resize docked stacks. --> <dimen name="docked_stack_divider_thickness">48dp</dimen> @@ -261,7 +279,7 @@ <dimen name="notification_expand_button_padding_top">1dp</dimen> <!-- Height of a small notification in the status bar --> - <dimen name="notification_min_height">92dp</dimen> + <dimen name="notification_min_height">106dp</dimen> <!-- The width of the big icons in notifications. --> <dimen name="notification_large_icon_width">64dp</dimen> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 152b131af8f5..b4edc4d88c3e 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -187,6 +187,9 @@ <string name="notification_channel_wfc">Wi-Fi calling</string> <!-- Telephony notification channel name for a channel containing SIM notifications --> <string name="notification_channel_sim">SIM status</string> + <!-- Telephony notification channel name for a channel containing high priority SIM notifications --> + <string name="notification_channel_sim_high_prio">High priority SIM status</string> + <!-- Displayed to tell the user that peer changed TTY mode --> <string name="peerTtyModeFull">Peer requested TTY Mode FULL</string> @@ -1502,16 +1505,16 @@ <string name="fingerprint_icon_content_description">Fingerprint icon</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=70] --> - <string name="permlab_manageFace">manage face authentication hardware</string> + <string name="permlab_manageFace">manage face unlock hardware</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=90] --> <string name="permdesc_manageFace">Allows the app to invoke methods to add and delete facial templates for use.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=70] --> - <string name="permlab_useFaceAuthentication">use face authentication hardware</string> + <string name="permlab_useFaceAuthentication">use face unlock hardware</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. [CHAR LIMIT=90] --> - <string name="permdesc_useFaceAuthentication">Allows the app to use face authentication hardware for authentication</string> + <string name="permdesc_useFaceAuthentication">Allows the app to use face unlock hardware for authentication</string> <!-- Notification name shown when the system requires the user to re-enroll their face. [CHAR LIMIT=NONE] --> - <string name="face_recalibrate_notification_name">Face Authentication</string> + <string name="face_recalibrate_notification_name">Face unlock</string> <!-- Notification title shown when the system requires the user to re-enroll their face. [CHAR LIMIT=NONE] --> <string name="face_recalibrate_notification_title">Re-enroll your face</string> <!-- Notification content shown when the system requires the user to re-enroll their face. [CHAR LIMIT=NONE] --> @@ -1538,7 +1541,7 @@ <!-- Message shown during face acquisition when the user is not front facing the sensor [CHAR LIMIT=50] --> <string name="face_acquired_poor_gaze">Please look more directly at your device.</string> <!-- Message shown during face acquisition when the user is not detected [CHAR LIMIT=50] --> - <string name="face_acquired_not_detected">Can\u2019t see your face. Look at the phone.</string> + <string name="face_acquired_not_detected">Position your face directly in front of the phone.</string> <!-- Message shown during face acquisition when the device is not steady [CHAR LIMIT=50] --> <string name="face_acquired_too_much_motion">Too much motion. Hold phone steady.</string> <!-- Message shown during face acquisition when the sensor needs to be recalibrated [CHAR LIMIT=50] --> @@ -1555,8 +1558,8 @@ <string name="face_acquired_roll_too_extreme">Turn your head a little less.</string> <!-- Message shown during acquisition when the user's face is obscured [CHAR LIMIT=50] --> <string name="face_acquired_obscured">Remove anything hiding your face.</string> - <!-- Message shown during acquisition when the sensor is dirty [CHAR LIMIT=50] --> - <string name="face_acquired_sensor_dirty">Clean the sensor at the top edge of the screen.</string> + <!-- Message shown during acquisition when the sensor is dirty [CHAR LIMIT=100] --> + <string name="face_acquired_sensor_dirty">Clean the top of your screen, including the black bar</string> <!-- Array containing custom messages shown during face acquisition from vendor. Vendor is expected to add and translate these strings --> <string-array name="face_acquired_vendor"> </string-array> @@ -1564,23 +1567,23 @@ <!-- Error message shown when the face hardware can't be accessed. [CHAR LIMIT=69] --> <string name="face_error_hw_not_available">Can\u2019t verify face. Hardware not available.</string> <!-- Error message shown when the face hardware timer has expired and the user needs to restart the operation. [CHAR LIMIT=50] --> - <string name="face_error_timeout">Try face authentication again.</string> + <string name="face_error_timeout">Try face unlock again.</string> <!-- Error message shown when the face hardware has run out of room for storing faces. [CHAR LIMIT=69] --> <string name="face_error_no_space">Can\u2019t store new face data. Delete an old one first.</string> <!-- Generic error message shown when the face operation (e.g. enrollment or authentication) is canceled. Generally not shown to the user. [CHAR LIMIT=50] --> - <string name="face_error_canceled">Face operation canceled</string> - <!-- Generic error message shown when the face authentication operation is canceled due to user input. Generally not shown to the user [CHAR LIMIT=54] --> - <string name="face_error_user_canceled">Face authentication canceled by user</string> + <string name="face_error_canceled">Face operation canceled.</string> + <!-- Generic error message shown when the face unlock operation is canceled due to user input. Generally not shown to the user [CHAR LIMIT=54] --> + <string name="face_error_user_canceled">Face unlock canceled by user.</string> <!-- Generic error message shown when the face operation fails because too many attempts have been made. [CHAR LIMIT=50] --> <string name="face_error_lockout">Too many attempts. Try again later.</string> <!-- Generic error message shown when the face operation fails because strong authentication is required. [CHAR LIMIT=71] --> - <string name="face_error_lockout_permanent">Too many attempts. Face authentication disabled.</string> + <string name="face_error_lockout_permanent">Too many attempts. Face unlock disabled.</string> <!-- Generic error message shown when the face hardware can't recognize the face. [CHAR LIMIT=50] --> <string name="face_error_unable_to_process">Can\u2019t verify face. Try again.</string> <!-- Generic error message shown when the user has no enrolled face. [CHAR LIMIT=52] --> - <string name="face_error_not_enrolled">You haven\u2019t set up face authentication</string> - <!-- Generic error message shown when the app requests face authentication on a device without a sensor. [CHAR LIMIT=61] --> - <string name="face_error_hw_not_present">Face authentication is not supported on this device</string> + <string name="face_error_not_enrolled">You haven\u2019t set up face unlock.</string> + <!-- Generic error message shown when the app requests face unlock on a device without a sensor. [CHAR LIMIT=61] --> + <string name="face_error_hw_not_present">Face unlock is not supported on this device.</string> <!-- Template to be used to name enrolled faces by default. [CHAR LIMIT=10] --> <string name="face_name_template">Face <xliff:g id="faceId" example="1">%d</xliff:g></string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 2fa68a5d8775..d275a37e7540 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -648,6 +648,7 @@ <java-symbol type="string" name="notification_channel_voice_mail" /> <java-symbol type="string" name="notification_channel_wfc" /> <java-symbol type="string" name="notification_channel_sim" /> + <java-symbol type="string" name="notification_channel_sim_high_prio" /> <java-symbol type="string" name="SetupCallDefault" /> <java-symbol type="string" name="accept" /> <java-symbol type="string" name="activity_chooser_view_see_all" /> @@ -2268,14 +2269,10 @@ <java-symbol type="anim" name="lock_screen_behind_enter" /> <java-symbol type="anim" name="lock_screen_behind_enter_wallpaper" /> <java-symbol type="anim" name="lock_screen_behind_enter_fade_in" /> + <java-symbol type="anim" name="lock_screen_behind_enter_subtle" /> <java-symbol type="anim" name="lock_screen_wallpaper_exit" /> <java-symbol type="anim" name="launch_task_behind_source" /> <java-symbol type="anim" name="wallpaper_open_exit" /> - <java-symbol type="anim" name="lock_to_error" /> - <java-symbol type="anim" name="lock_lock" /> - <java-symbol type="anim" name="lock_unlock" /> - <java-symbol type="anim" name="lock_in" /> - <java-symbol type="anim" name="lock_scanning" /> <java-symbol type="bool" name="config_alwaysUseCdmaRssi" /> <java-symbol type="dimen" name="status_bar_icon_size" /> @@ -2586,6 +2583,7 @@ <java-symbol type="array" name="config_face_acquire_vendor_keyguard_ignorelist" /> <java-symbol type="array" name="config_face_acquire_biometricprompt_ignorelist" /> <java-symbol type="array" name="config_face_acquire_vendor_biometricprompt_ignorelist" /> + <java-symbol type="bool" name="config_faceAuthDismissesKeyguard" /> <!-- Face config --> <java-symbol type="integer" name="config_faceMaxTemplatesPerUser" /> @@ -3195,6 +3193,8 @@ <java-symbol type="array" name="config_nightDisplayColorTemperatureCoefficientsNative" /> <java-symbol type="array" name="config_availableColorModes" /> <java-symbol type="integer" name="config_accessibilityColorMode" /> + <java-symbol type="array" name="config_displayCompositionColorModes" /> + <java-symbol type="array" name="config_displayCompositionColorSpaces" /> <java-symbol type="bool" name="config_displayWhiteBalanceAvailable" /> <java-symbol type="bool" name="config_displayWhiteBalanceEnabledDefault" /> <java-symbol type="integer" name="config_displayWhiteBalanceColorTemperatureMin" /> @@ -3268,6 +3268,9 @@ <java-symbol type="string" name="config_batterymeterBoltPath" /> <java-symbol type="string" name="config_batterymeterPowersavePath" /> <java-symbol type="bool" name="config_batterymeterDualTone" /> + <java-symbol type="string" name="config_signalXPath" /> + <java-symbol type="dimen" name="config_signalCutoutWidthFraction" /> + <java-symbol type="dimen" name="config_signalCutoutHeightFraction" /> <java-symbol type="bool" name="config_debugEnableAutomaticSystemServerHeapDumps" /> <java-symbol type="integer" name="config_debugSystemServerPssThresholdBytes" /> @@ -3552,7 +3555,7 @@ <java-symbol type="integer" name="config_stableDeviceDisplayWidth" /> <java-symbol type="integer" name="config_stableDeviceDisplayHeight" /> - <java-symbol type="bool" name="config_display_no_service_when_sim_unready" /> + <java-symbol type="array" name="config_display_no_service_when_sim_unready" /> <java-symbol type="layout" name="slice_grid" /> <java-symbol type="layout" name="slice_message_local" /> @@ -3703,6 +3706,9 @@ <java-symbol type="dimen" name="rounded_corner_radius" /> <java-symbol type="dimen" name="rounded_corner_radius_top" /> <java-symbol type="dimen" name="rounded_corner_radius_bottom" /> + <java-symbol type="dimen" name="rounded_corner_radius_adjustment" /> + <java-symbol type="dimen" name="rounded_corner_radius_top_adjustment" /> + <java-symbol type="dimen" name="rounded_corner_radius_bottom_adjustment" /> <java-symbol type="bool" name="config_supportsRoundedCornersOnWindows" /> <java-symbol type="string" name="config_defaultModuleMetadataProvider" /> @@ -3752,8 +3758,12 @@ <java-symbol type="array" name="config_displayWhiteBalanceBaseThresholds" /> <java-symbol type="array" name="config_displayWhiteBalanceIncreaseThresholds" /> <java-symbol type="array" name="config_displayWhiteBalanceDecreaseThresholds" /> - <java-symbol type="dimen" name="config_displayWhiteBalanceLowLightAmbientBrightnessThreshold" /> + <java-symbol type="array" name="config_displayWhiteBalanceLowLightAmbientBrightnesses" /> + <java-symbol type="array" name="config_displayWhiteBalanceLowLightAmbientBiases" /> <java-symbol type="dimen" name="config_displayWhiteBalanceLowLightAmbientColorTemperature" /> + <java-symbol type="array" name="config_displayWhiteBalanceHighLightAmbientBrightnesses" /> + <java-symbol type="array" name="config_displayWhiteBalanceHighLightAmbientBiases" /> + <java-symbol type="dimen" name="config_displayWhiteBalanceHighLightAmbientColorTemperature" /> <java-symbol type="array" name="config_displayWhiteBalanceAmbientColorTemperatures" /> <java-symbol type="array" name="config_displayWhiteBalanceDisplayColorTemperatures" /> <java-symbol type="drawable" name="ic_action_open" /> @@ -3781,11 +3791,14 @@ <!-- For high refresh rate displays --> <java-symbol type="integer" name="config_defaultPeakRefreshRate" /> + <java-symbol type="array" name="config_brightnessThresholdsOfPeakRefreshRate" /> + <java-symbol type="array" name="config_ambientThresholdsOfPeakRefreshRate" /> <!-- For Auto-Brightness --> <java-symbol type="string" name="config_displayLightSensorType" /> <java-symbol type="drawable" name="iconfactory_adaptive_icon_drawable_wrapper"/> + <java-symbol type="dimen" name="notification_min_height" /> <java-symbol type="dimen" name="resolver_icon_size"/> <java-symbol type="dimen" name="resolver_badge_size"/> <java-symbol type="dimen" name="resolver_button_bar_spacing"/> @@ -3814,6 +3827,8 @@ <java-symbol type="string" name="config_defaultSupervisionProfileOwnerComponent" /> <java-symbol type="bool" name="config_inflateSignalStrength" /> + <java-symbol type="array" name="config_highRefreshRateBlacklist" /> + <java-symbol type="drawable" name="android_logotype" /> <java-symbol type="layout" name="platlogo_layout" /> diff --git a/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java b/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java index 1b6560322a13..707d7b30e09b 100644 --- a/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java +++ b/core/tests/benchmarks/src/android/net/NetworkStatsBenchmark.java @@ -19,13 +19,22 @@ package android.net; import com.google.caliper.BeforeExperiment; import com.google.caliper.Param; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class NetworkStatsBenchmark { - private static final String UNDERLYING_IFACE = "wlan0"; + private static final String[] UNDERLYING_IFACES = {"wlan0", "rmnet0"}; private static final String TUN_IFACE = "tun0"; private static final int TUN_UID = 999999999; @Param({"100", "1000"}) private int mSize; + /** + * Should not be more than the length of {@link #UNDERLYING_IFACES}. + */ + @Param({"1", "2"}) + private int mNumUnderlyingIfaces; private NetworkStats mNetworkStats; @BeforeExperiment @@ -33,8 +42,10 @@ public class NetworkStatsBenchmark { mNetworkStats = new NetworkStats(0, mSize + 2); int uid = 0; NetworkStats.Entry recycle = new NetworkStats.Entry(); + final List<String> allIfaces = getAllIfacesForBenchmark(); // also contains TUN_IFACE. + final int totalIfaces = allIfaces.size(); for (int i = 0; i < mSize; i++) { - recycle.iface = (i < mSize / 2) ? TUN_IFACE : UNDERLYING_IFACE; + recycle.iface = allIfaces.get(i % totalIfaces); recycle.uid = uid; recycle.set = i % 2; recycle.tag = NetworkStats.TAG_NONE; @@ -48,22 +59,39 @@ public class NetworkStatsBenchmark { uid++; } } - recycle.iface = UNDERLYING_IFACE; - recycle.uid = TUN_UID; - recycle.set = NetworkStats.SET_FOREGROUND; - recycle.tag = NetworkStats.TAG_NONE; - recycle.rxBytes = 90000 * mSize; - recycle.rxPackets = 40 * mSize; - recycle.txBytes = 180000 * mSize; - recycle.txPackets = 1200 * mSize; - recycle.operations = 0; - mNetworkStats.addValues(recycle); + + for (int i = 0; i < mNumUnderlyingIfaces; i++) { + recycle.iface = UNDERLYING_IFACES[i]; + recycle.uid = TUN_UID; + recycle.set = NetworkStats.SET_FOREGROUND; + recycle.tag = NetworkStats.TAG_NONE; + recycle.rxBytes = 90000 * mSize; + recycle.rxPackets = 40 * mSize; + recycle.txBytes = 180000 * mSize; + recycle.txPackets = 1200 * mSize; + recycle.operations = 0; + mNetworkStats.addValues(recycle); + } + } + + private String[] getVpnUnderlyingIfaces() { + return Arrays.copyOf(UNDERLYING_IFACES, mNumUnderlyingIfaces); + } + + /** + * Same as {@link #getVpnUnderlyingIfaces}, but also contains {@link #TUN_IFACE}. + */ + private List<String> getAllIfacesForBenchmark() { + List<String> ifaces = new ArrayList<>(); + ifaces.add(TUN_IFACE); + ifaces.addAll(Arrays.asList(getVpnUnderlyingIfaces())); + return ifaces; } public void timeMigrateTun(int reps) { for (int i = 0; i < reps; i++) { NetworkStats stats = mNetworkStats.clone(); - stats.migrateTun(TUN_UID, TUN_IFACE, UNDERLYING_IFACE); + stats.migrateTun(TUN_UID, TUN_IFACE, getVpnUnderlyingIfaces()); } } diff --git a/core/tests/coretests/res/values/overlayable_icons_test.xml b/core/tests/coretests/res/values/overlayable_icons_test.xml index 68de2c0caf18..6503f3ee6d57 100644 --- a/core/tests/coretests/res/values/overlayable_icons_test.xml +++ b/core/tests/coretests/res/values/overlayable_icons_test.xml @@ -20,15 +20,18 @@ <array name="overlayable_icons"> <item>@*android:drawable/ic_audio_alarm</item> <item>@*android:drawable/ic_audio_alarm_mute</item> + <item>@*android:drawable/ic_battery_80_24dp</item> <item>@*android:drawable/ic_bluetooth_share_icon</item> <item>@*android:drawable/ic_bt_headphones_a2dp</item> <item>@*android:drawable/ic_bt_headset_hfp</item> <item>@*android:drawable/ic_bt_hearing_aid</item> <item>@*android:drawable/ic_bt_laptop</item> + <item>@*android:drawable/ic_bt_misc_hid</item> <item>@*android:drawable/ic_bt_network_pan</item> <item>@*android:drawable/ic_bt_pointing_hid</item> <item>@*android:drawable/ic_corp_badge</item> <item>@*android:drawable/ic_expand_more</item> + <item>@*android:drawable/ic_faster_emergency</item> <item>@*android:drawable/ic_file_copy</item> <item>@*android:drawable/ic_lock</item> <item>@*android:drawable/ic_lock_bugreport</item> @@ -36,6 +39,7 @@ <item>@*android:drawable/ic_lock_power_off</item> <item>@*android:drawable/ic_lockscreen_ime</item> <item>@*android:drawable/ic_mode_edit</item> + <item>@*android:drawable/ic_notifications_alerted</item> <item>@*android:drawable/ic_phone</item> <item>@*android:drawable/ic_qs_airplane</item> <item>@*android:drawable/ic_qs_auto_rotate</item> @@ -44,6 +48,7 @@ <item>@*android:drawable/ic_qs_dnd</item> <item>@*android:drawable/ic_qs_flashlight</item> <item>@*android:drawable/ic_qs_night_display_on</item> + <item>@*android:drawable/ic_qs_ui_mode_night</item> <item>@*android:drawable/ic_restart</item> <item>@*android:drawable/ic_screenshot</item> <item>@*android:drawable/ic_settings_bluetooth</item> @@ -65,6 +70,7 @@ <item>@*android:drawable/ic_wifi_signal_3</item> <item>@*android:drawable/ic_wifi_signal_4</item> <item>@*android:drawable/perm_group_activity_recognition</item> + <item>@*android:drawable/perm_group_aural</item> <item>@*android:drawable/perm_group_calendar</item> <item>@*android:drawable/perm_group_call_log</item> <item>@*android:drawable/perm_group_camera</item> diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index cd36ba746a39..88bda9d64084 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -264,6 +264,7 @@ public class SettingsBackupTest { Settings.Global.EUICC_PROVISIONED, Settings.Global.EUICC_SUPPORTED_COUNTRIES, Settings.Global.EUICC_FACTORY_RESET_TIMEOUT_MILLIS, + Settings.Global.EUICC_REMOVING_INVISIBLE_PROFILES_TIMEOUT_MILLIS, Settings.Global.FANCY_IME_ANIMATIONS, Settings.Global.FORCE_ALLOW_ON_EXTERNAL, Settings.Global.FORCED_APP_STANDBY_ENABLED, diff --git a/libs/androidfw/DisplayEventDispatcher.cpp b/libs/androidfw/DisplayEventDispatcher.cpp index 660614895603..d8a3f42690f4 100644 --- a/libs/androidfw/DisplayEventDispatcher.cpp +++ b/libs/androidfw/DisplayEventDispatcher.cpp @@ -34,8 +34,9 @@ namespace android { static const size_t EVENT_BUFFER_SIZE = 100; DisplayEventDispatcher::DisplayEventDispatcher(const sp<Looper>& looper, - ISurfaceComposer::VsyncSource vsyncSource) : - mLooper(looper), mReceiver(vsyncSource), mWaitingForVsync(false) { + ISurfaceComposer::VsyncSource vsyncSource, + ISurfaceComposer::ConfigChanged configChanged) : + mLooper(looper), mReceiver(vsyncSource, configChanged), mWaitingForVsync(false) { ALOGV("dispatcher %p ~ Initializing display event dispatcher.", this); } diff --git a/libs/androidfw/include/androidfw/DisplayEventDispatcher.h b/libs/androidfw/include/androidfw/DisplayEventDispatcher.h index 5381c0174cb0..8bc25202b3ab 100644 --- a/libs/androidfw/include/androidfw/DisplayEventDispatcher.h +++ b/libs/androidfw/include/androidfw/DisplayEventDispatcher.h @@ -23,7 +23,8 @@ namespace android { class DisplayEventDispatcher : public LooperCallback { public: explicit DisplayEventDispatcher(const sp<Looper>& looper, - ISurfaceComposer::VsyncSource vsyncSource = ISurfaceComposer::eVsyncSourceApp); + ISurfaceComposer::VsyncSource vsyncSource = ISurfaceComposer::eVsyncSourceApp, + ISurfaceComposer::ConfigChanged configChanged = ISurfaceComposer::eConfigChangedSuppress); status_t initialize(); void dispose(); diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index f326ce8d23e9..9898a1c30856 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -148,7 +148,8 @@ void CanvasContext::setSurface(sp<Surface>&& surface) { if (surface) { mNativeSurface = new ReliableSurface{std::move(surface)}; - mNativeSurface->setDequeueTimeout(500_ms); + // TODO: Fix error handling & re-shorten timeout + mNativeSurface->setDequeueTimeout(4000_ms); } else { mNativeSurface = nullptr; } diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp index 41cb8fdc66bd..71c5b53f727a 100644 --- a/libs/hwui/renderthread/RenderThread.cpp +++ b/libs/hwui/renderthread/RenderThread.cpp @@ -156,7 +156,9 @@ void RenderThread::initializeDisplayEventReceiver() { LOG_ALWAYS_FATAL_IF(mVsyncSource, "Initializing a second DisplayEventReceiver?"); if (!Properties::isolatedProcess) { - auto receiver = std::make_unique<DisplayEventReceiver>(); + auto receiver = std::make_unique<DisplayEventReceiver>( + ISurfaceComposer::eVsyncSourceApp, + ISurfaceComposer::eConfigChangedDispatch); status_t status = receiver->initCheck(); LOG_ALWAYS_FATAL_IF(status != NO_ERROR, "Initialization of DisplayEventReceiver " diff --git a/packages/CaptivePortalLogin/res/values-bs/strings.xml b/packages/CaptivePortalLogin/res/values-bs/strings.xml new file mode 100644 index 000000000000..60c153a06471 --- /dev/null +++ b/packages/CaptivePortalLogin/res/values-bs/strings.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="5934709770924185752">"Prijava na zaštitnom portalu"</string> + <string name="action_use_network" msgid="6076184727448466030">"Koristi ovu mrežu kakva jeste"</string> + <string name="action_do_not_use_network" msgid="4577366536956516683">"Ne koristi ovu mrežu"</string> + <string name="action_bar_label" msgid="917235635415966620">"Prijava na mrežu"</string> + <string name="action_bar_title" msgid="5645564790486983117">"Prijava na %1$s"</string> + <string name="ssl_error_warning" msgid="6653188881418638872">"Mreža kojoj pokušavate pristupiti ima sigurnosnih problema."</string> + <string name="ssl_error_example" msgid="647898534624078900">"Naprimjer, stranica za prijavu možda ne pripada prikazanoj organizaciji."</string> + <string name="ssl_error_continue" msgid="6492718244923937110">"Ipak nastavi preko preglednika"</string> + <string name="ssl_error_untrusted" msgid="1496280318271264520">"Ova potvrda ne potiče iz pouzdanog izvora."</string> + <string name="ssl_error_mismatch" msgid="3060364165934822383">"Naziv web lokacije se ne podudara s nazivom na potvrdi."</string> + <string name="ssl_error_expired" msgid="1501588340716182495">"Ova potvrda je istekla."</string> + <string name="ssl_error_not_yet_valid" msgid="8648649030525886924">"Ova potvrda još uvijek nije važeća."</string> + <string name="ssl_error_date_invalid" msgid="88425990680059223">"Ova potvrda sadrži nevažeći datum."</string> + <string name="ssl_error_invalid" msgid="2540546515565633432">"Ova potvrda je nevažeća."</string> + <string name="ssl_error_unknown" msgid="4405203446079465859">"Nepoznata greška potvrde."</string> + <string name="ssl_security_warning_title" msgid="8768539813847504404">"Sigurnosno upozorenje"</string> + <string name="ssl_error_view_certificate" msgid="5722652540168339333">"Prikaži potvrdu"</string> + <string name="ok" msgid="2817931639040794018">"UREDU"</string> + <string name="page_info_address" msgid="1261481517455692363">"Adresa:"</string> + <string name="page_info" msgid="4416941086705172545">"Informacije o stranici"</string> +</resources> diff --git a/packages/CarSystemUI/src/com/android/systemui/qs/car/CarQSFragment.java b/packages/CarSystemUI/src/com/android/systemui/qs/car/CarQSFragment.java index 769fc52a574c..f9cfafa5c471 100644 --- a/packages/CarSystemUI/src/com/android/systemui/qs/car/CarQSFragment.java +++ b/packages/CarSystemUI/src/com/android/systemui/qs/car/CarQSFragment.java @@ -171,11 +171,6 @@ public class CarQSFragment extends Fragment implements QS { } @Override - public void setKeyguardShowing(boolean keyguardShowing) { - // No keyguard to show. - } - - @Override public void animateHeaderSlidingIn(long delay) { // No header to animate. } diff --git a/packages/PrintSpooler/res/values-or/strings.xml b/packages/PrintSpooler/res/values-or/strings.xml index 7eeac8771032..f385391c8d78 100644 --- a/packages/PrintSpooler/res/values-or/strings.xml +++ b/packages/PrintSpooler/res/values-or/strings.xml @@ -72,7 +72,7 @@ <string name="select_to_add_printers" msgid="3800709038689830974">"ପ୍ରିଣ୍ଟର ଯୋଡ଼ିବାକୁ ଚୟନ କରନ୍ତୁ"</string> <string name="enable_print_service" msgid="3482815747043533842">"ସକ୍ଷମ କରିବା ପାଇଁ ଚୟନ କରନ୍ତୁ"</string> <string name="enabled_services_title" msgid="7036986099096582296">"ସକ୍ଷମ କରାଯାଇଥିବା ସର୍ଭିସ୍"</string> - <string name="recommended_services_title" msgid="3799434882937956924">"ସୁପାରିସ କରାଯାଇଥିବା ସର୍ଭିସ୍"</string> + <string name="recommended_services_title" msgid="3799434882937956924">"ସୁପାରିଶ କରାଯାଇଥିବା ସର୍ଭିସ୍"</string> <string name="disabled_services_title" msgid="7313253167968363211">"ଅକ୍ଷମ କରାଯାଇଥିବା ସର୍ଭିସ୍"</string> <string name="all_services_title" msgid="5578662754874906455">"ସମସ୍ତ ସର୍ଭିସ୍"</string> <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138"> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 238eba58e0a5..3a20d04d7ab2 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -46,7 +46,7 @@ <string name="wifi_limited_connection" msgid="7717855024753201527">"सीमित कनेक्शन"</string> <string name="wifi_status_no_internet" msgid="5784710974669608361">"इंटरनेट कनेक्शन नहीं है"</string> <string name="wifi_status_sign_in_required" msgid="123517180404752756">"साइन इन करना ज़रूरी है"</string> - <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"एक्सेस पॉइंट फ़िलहाल भरा हुआ है"</string> + <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ऐक्सेस पॉइंट फ़िलहाल भरा हुआ है"</string> <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s के ज़रिए कनेक्ट"</string> <string name="available_via_carrier" msgid="1469036129740799053">"%1$s के ज़रिए उपलब्ध"</string> <string name="osu_opening_provider" msgid="5488997661548640424">"<xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g> खोला जा रहा है"</string> @@ -68,7 +68,7 @@ <string name="bluetooth_pairing" msgid="1426882272690346242">"युग्मित कर रहा है…"</string> <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"जुड़ गया (फ़ोन के ऑडियो को छोड़कर)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"जुड़ गया (मीडिया ऑडियो को छोड़कर)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> - <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"जुड़ गया (मैसेज का एक्सेस नहीं)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> + <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"जुड़ गया (मैसेज का ऐक्सेस नहीं)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"जुड़ गया (फ़ोन या मीडिया ऑडियो को छोड़कर)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"जुड़ गया, बैटरी का लेवल <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string> <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"जुड़ गया (फ़ोन के ऑडियो को छोड़कर), बैटरी का लेवल <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string> @@ -88,7 +88,7 @@ <string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"संपर्क साझाकरण के लिए उपयोग करें"</string> <string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"इंटरनेट कनेक्शन साझाकरण"</string> <string name="bluetooth_profile_map" msgid="1019763341565580450">"लेख संदेश"</string> - <string name="bluetooth_profile_sap" msgid="5764222021851283125">"सिम एक्सेस"</string> + <string name="bluetooth_profile_sap" msgid="5764222021851283125">"सिम ऐक्सेस"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ऑडियो: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ऑडियो"</string> <string name="bluetooth_profile_hearing_aid" msgid="6680721080542444257">"सुनने में मदद करने वाले डिवाइस"</string> @@ -200,7 +200,7 @@ <string name="development_settings_not_available" msgid="4308569041701535607">"यह उपयोगकर्ता, डेवलपर के लिए सेटिंग और टूल का इस्तेमाल नहीं कर सकता"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN सेटिंग इस उपयोगकर्ता के लिए उपलब्ध नहीं हैं"</string> <string name="tethering_settings_not_available" msgid="6765770438438291012">"टेदरिंग सेटिंग इस उपयोगकर्ता के लिए उपलब्ध नहीं हैं"</string> - <string name="apn_settings_not_available" msgid="7873729032165324000">"एक्सेस पॉइंट के नाम की सेटिंग इस उपयोगकर्ता के लिए मौजूद नहीं हैं"</string> + <string name="apn_settings_not_available" msgid="7873729032165324000">"ऐक्सेस पॉइंट के नाम की सेटिंग इस उपयोगकर्ता के लिए मौजूद नहीं हैं"</string> <string name="enable_adb" msgid="7982306934419797485">"USB डीबग करना"</string> <string name="enable_adb_summary" msgid="4881186971746056635">"डीबग मोड जब USB कनेक्ट किया गया हो"</string> <string name="clear_adb_keys" msgid="4038889221503122743">"USB डीबग करने की मंज़ूरी रद्द करें"</string> @@ -414,7 +414,7 @@ <string name="disabled" msgid="9206776641295849915">"बंद किया गया"</string> <string name="external_source_trusted" msgid="2707996266575928037">"अनुमति है"</string> <string name="external_source_untrusted" msgid="2677442511837596726">"अनुमति नहीं है"</string> - <string name="install_other_apps" msgid="6986686991775883017">"अनजान ऐप्लिकेशन इंस्टॉल करने का एक्सेस"</string> + <string name="install_other_apps" msgid="6986686991775883017">"अनजान ऐप्लिकेशन इंस्टॉल करने का ऐक्सेस"</string> <string name="home" msgid="3256884684164448244">"सेटिंग का होम पेज"</string> <string-array name="battery_labels"> <item msgid="8494684293649631252">"0%"</item> diff --git a/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/SharedPreferencesLogger.java b/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/SharedPreferencesLogger.java index 320380fc0ed9..869de0debd37 100644 --- a/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/SharedPreferencesLogger.java +++ b/packages/SettingsLib/src/com/android/settingslib/core/instrumentation/SharedPreferencesLogger.java @@ -102,7 +102,8 @@ public class SharedPreferencesLogger implements SharedPreferences { OnSharedPreferenceChangeListener listener) { } - private void logValue(String key, Object value) { + @VisibleForTesting + protected void logValue(String key, Object value) { logValue(key, value, false /* forceLog */); } @@ -138,11 +139,18 @@ public class SharedPreferencesLogger implements SharedPreferences { } else { intVal = (int) floatValue; } + } else if (value instanceof String) { + try { + intVal = Integer.parseInt((String) value); + } catch (NumberFormatException e) { + Log.w(LOG_TAG, "Tried to log unloggable object=" + value); + return; + } } else { - Log.w(LOG_TAG, "Tried to log unloggable object" + value); + Log.w(LOG_TAG, "Tried to log unloggable object=" + value); return; } - // Pref key exists in set, log it's change in metrics. + // Pref key exists in set, log its change in metrics. mMetricsFeature.action(SettingsEnums.PAGE_UNKNOWN, SettingsEnums.ACTION_SETTINGS_PREFERENCE_CHANGE, SettingsEnums.PAGE_UNKNOWN, diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java index c7380c580e2f..5ac788e1b374 100644 --- a/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java +++ b/packages/SettingsLib/src/com/android/settingslib/graph/SignalDrawable.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Canvas; import android.graphics.ColorFilter; +import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Path.Direction; @@ -33,6 +34,7 @@ import android.graphics.drawable.DrawableWrapper; import android.os.Handler; import android.telephony.SignalStrength; import android.util.LayoutDirection; +import android.util.PathParser; import com.android.settingslib.R; import com.android.settingslib.Utils; @@ -48,7 +50,6 @@ public class SignalDrawable extends DrawableWrapper { private static final float VIEWPORT = 24f; private static final float PAD = 2f / VIEWPORT; - private static final float CUT_OUT = 7.9f / VIEWPORT; private static final float DOT_SIZE = 3f / VIEWPORT; private static final float DOT_PADDING = 1.5f / VIEWPORT; @@ -65,21 +66,6 @@ public class SignalDrawable extends DrawableWrapper { private static final long DOT_DELAY = 1000; - private static float[][] X_PATH = new float[][]{ - {21.9f / VIEWPORT, 17.0f / VIEWPORT}, - {-1.1f / VIEWPORT, -1.1f / VIEWPORT}, - {-1.9f / VIEWPORT, 1.9f / VIEWPORT}, - {-1.9f / VIEWPORT, -1.9f / VIEWPORT}, - {-1.1f / VIEWPORT, 1.1f / VIEWPORT}, - {1.9f / VIEWPORT, 1.9f / VIEWPORT}, - {-1.9f / VIEWPORT, 1.9f / VIEWPORT}, - {1.1f / VIEWPORT, 1.1f / VIEWPORT}, - {1.9f / VIEWPORT, -1.9f / VIEWPORT}, - {1.9f / VIEWPORT, 1.9f / VIEWPORT}, - {1.1f / VIEWPORT, -1.1f / VIEWPORT}, - {-1.9f / VIEWPORT, -1.9f / VIEWPORT}, - }; - private final Paint mForegroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private final Paint mTransparentPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private final int mDarkModeFillColor; @@ -87,7 +73,11 @@ public class SignalDrawable extends DrawableWrapper { private final Path mCutoutPath = new Path(); private final Path mForegroundPath = new Path(); private final Path mXPath = new Path(); + private final Matrix mXScaleMatrix = new Matrix(); + private final Path mScaledXPath = new Path(); private final Handler mHandler; + private final float mCutoutWidthFraction; + private final float mCutoutHeightFraction; private float mDarkIntensity = -1; private final int mIntrinsicSize; private boolean mAnimating; @@ -95,6 +85,14 @@ public class SignalDrawable extends DrawableWrapper { public SignalDrawable(Context context) { super(context.getDrawable(com.android.internal.R.drawable.ic_signal_cellular)); + final String xPathString = context.getString( + com.android.internal.R.string.config_signalXPath); + mXPath.set(PathParser.createPathFromPathData(xPathString)); + updateScaledXPath(); + mCutoutWidthFraction = context.getResources().getFloat( + com.android.internal.R.dimen.config_signalCutoutWidthFraction); + mCutoutHeightFraction = context.getResources().getFloat( + com.android.internal.R.dimen.config_signalCutoutHeightFraction); mDarkModeFillColor = Utils.getColorStateListDefaultColor(context, R.color.dark_mode_icon_color_single_tone); mLightModeFillColor = Utils.getColorStateListDefaultColor(context, @@ -106,6 +104,15 @@ public class SignalDrawable extends DrawableWrapper { setDarkIntensity(0); } + private void updateScaledXPath() { + if (getBounds().isEmpty()) { + mXScaleMatrix.setScale(1f, 1f); + } else { + mXScaleMatrix.setScale(getBounds().width() / VIEWPORT, getBounds().height() / VIEWPORT); + } + mXPath.transform(mXScaleMatrix, mScaledXPath); + } + @Override public int getIntrinsicWidth() { return mIntrinsicSize; @@ -170,6 +177,7 @@ public class SignalDrawable extends DrawableWrapper { @Override protected void onBoundsChange(Rect bounds) { super.onBoundsChange(bounds); + updateScaledXPath(); invalidateSelf(); } @@ -205,19 +213,15 @@ public class SignalDrawable extends DrawableWrapper { canvas.drawPath(mCutoutPath, mTransparentPaint); canvas.drawPath(mForegroundPath, mForegroundPaint); } else if (isInState(STATE_CUT)) { - float cut = (CUT_OUT * width); - mCutoutPath.moveTo(width - padding, height - padding); - mCutoutPath.rLineTo(-cut, 0); - mCutoutPath.rLineTo(0, -cut); - mCutoutPath.rLineTo(cut, 0); - mCutoutPath.rLineTo(0, cut); + float cutX = (mCutoutWidthFraction * width / VIEWPORT); + float cutY = (mCutoutHeightFraction * height / VIEWPORT); + mCutoutPath.moveTo(width, height); + mCutoutPath.rLineTo(-cutX, 0); + mCutoutPath.rLineTo(0, -cutY); + mCutoutPath.rLineTo(cutX, 0); + mCutoutPath.rLineTo(0, cutY); canvas.drawPath(mCutoutPath, mTransparentPaint); - mXPath.reset(); - mXPath.moveTo(X_PATH[0][0] * width, X_PATH[0][1] * height); - for (int i = 1; i < X_PATH.length; i++) { - mXPath.rLineTo(X_PATH[i][0] * width, X_PATH[i][1] * height); - } - canvas.drawPath(mXPath, mForegroundPaint); + canvas.drawPath(mScaledXPath, mForegroundPaint); } if (isRtl) { canvas.restore(); diff --git a/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java b/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java index 6fd874989c35..60c9984e5ed4 100644 --- a/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java +++ b/packages/SettingsLib/src/com/android/settingslib/location/RecentLocationApps.java @@ -90,12 +90,16 @@ public class RecentLocationApps { for (int i = 0; i < appOpsCount; ++i) { AppOpsManager.PackageOps ops = appOps.get(i); + // Don't show the Android System in the list - it's not actionable for the user. + // Also don't show apps belonging to background users except managed users. String packageName = ops.getPackageName(); int uid = ops.getUid(); final UserHandle user = UserHandle.getUserHandleForUid(uid); - // Don't show apps belonging to background users except managed users. - if (!profiles.contains(user)) { + boolean isAndroidOs = + (uid == android.os.Process.SYSTEM_UID) && ANDROID_SYSTEM_PACKAGE_NAME.equals( + packageName); + if (isAndroidOs || !profiles.contains(user)) { continue; } diff --git a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java index b15ea980ae15..23e2949372aa 100644 --- a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageUtils.java @@ -18,11 +18,11 @@ package com.android.settingslib.net; import android.content.Context; import android.net.NetworkTemplate; -import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.Log; +import com.android.internal.util.ArrayUtils; /** * Utils class for data usage */ @@ -34,19 +34,25 @@ public class DataUsageUtils { */ public static NetworkTemplate getMobileTemplate(Context context, int subId) { final TelephonyManager telephonyManager = context.getSystemService( - TelephonyManager.class).createForSubscriptionId(subId); + TelephonyManager.class); final SubscriptionManager subscriptionManager = context.getSystemService( SubscriptionManager.class); - final SubscriptionInfo info = subscriptionManager.getActiveSubscriptionInfo(subId); final NetworkTemplate mobileAll = NetworkTemplate.buildTemplateMobileAll( telephonyManager.getSubscriberId(subId)); - if (info == null) { + if (!subscriptionManager.isActiveSubId(subId)) { Log.i(TAG, "Subscription is not active: " + subId); return mobileAll; } - // Use old API to build networkTemplate - return NetworkTemplate.normalize(mobileAll, telephonyManager.getMergedSubscriberIds()); + final String[] mergedSubscriberIds = telephonyManager.createForSubscriptionId(subId) + .getMergedSubscriberIdsFromGroup(); + + if (ArrayUtils.isEmpty(mergedSubscriberIds)) { + Log.i(TAG, "mergedSubscriberIds is null."); + return mobileAll; + } + + return NetworkTemplate.normalize(mobileAll, mergedSubscriberIds); } } diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index f16fb1c91b7c..6b1ceae4bed8 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -1435,7 +1435,7 @@ public class AccessPoint implements Comparable<AccessPoint> { void update(@Nullable WifiConfiguration config) { mConfig = config; - if (mConfig != null) { + if (mConfig != null && !isPasspoint()) { ssid = removeDoubleQuotes(mConfig.SSID); } networkId = config != null ? config.networkId : WifiConfiguration.INVALID_NETWORK_ID; diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/SharedPreferenceLoggerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/SharedPreferenceLoggerTest.java index 8f51dece64e5..89de81fde889 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/SharedPreferenceLoggerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/SharedPreferenceLoggerTest.java @@ -162,4 +162,33 @@ public class SharedPreferenceLoggerTest { "tag/key:com.android.settings", 0); } + + @Test + public void putString_shouldNotLogInitialPut() { + mSharedPrefLogger.logValue(TEST_KEY, "1"); + mSharedPrefLogger.logValue(TEST_KEY, "2"); + mSharedPrefLogger.logValue(TEST_KEY, "62"); + mSharedPrefLogger.logValue(TEST_KEY, "0"); + + verify(mMetricsFeature, times(3)).action(eq(SettingsEnums.PAGE_UNKNOWN), + eq(SettingsEnums.ACTION_SETTINGS_PREFERENCE_CHANGE), + eq(SettingsEnums.PAGE_UNKNOWN), + eq(TEST_TAGGED_KEY), + anyInt()); + } + + @Test + public void putString_shouldNotLogAnyNonIntegers() { + mSharedPrefLogger.logValue(TEST_KEY, "string"); + mSharedPrefLogger.logValue(TEST_KEY, "not an int"); + mSharedPrefLogger.logValue(TEST_KEY, "1.234f"); + mSharedPrefLogger.logValue(TEST_KEY, "4.2"); + mSharedPrefLogger.logValue(TEST_KEY, "3.0"); + + verify(mMetricsFeature, times(0)).action(eq(SettingsEnums.PAGE_UNKNOWN), + eq(SettingsEnums.ACTION_SETTINGS_PREFERENCE_CHANGE), + eq(SettingsEnums.PAGE_UNKNOWN), + eq(TEST_TAGGED_KEY), + anyInt()); + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java index 821c0b3a23f7..5cae6116a59c 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageUtilsTest.java @@ -18,6 +18,7 @@ package com.android.settingslib.net; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -37,13 +38,13 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -import java.util.ArrayList; import java.util.List; @RunWith(RobolectricTestRunner.class) public class DataUsageUtilsTest { private static final int SUB_ID = 1; + private static final int SUB_ID_2 = 2; private static final String SUBSCRIBER_ID = "Test Subscriber"; private static final String SUBSCRIBER_ID_2 = "Test Subscriber 2"; @@ -66,21 +67,28 @@ public class DataUsageUtilsTest { mContext = spy(RuntimeEnvironment.application); when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); - when(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager); when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager); when(mTelephonyManager.getSubscriberId(SUB_ID)).thenReturn(SUBSCRIBER_ID); - when(mTelephonyManager.getMergedSubscriberIds()).thenReturn( - new String[]{SUBSCRIBER_ID, SUBSCRIBER_ID_2}); - - mInfos = new ArrayList<>(); - mInfos.add(mInfo1); - mInfos.add(mInfo2); - when(mSubscriptionManager.getSubscriptionsInGroup(mParcelUuid)).thenReturn(mInfos); + when(mTelephonyManager.getSubscriberId(SUB_ID_2)).thenReturn(SUBSCRIBER_ID_2); + when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager); + when(mSubscriptionManager.isActiveSubId(anyInt())).thenReturn(true); } @Test public void getMobileTemplate_infoNull_returnMobileAll() { - when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(null); + when(mSubscriptionManager.isActiveSubId(SUB_ID)).thenReturn(false); + + final NetworkTemplate networkTemplate = DataUsageUtils.getMobileTemplate(mContext, SUB_ID); + assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID)).isTrue(); + assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID_2)).isFalse(); + } + + @Test + public void getMobileTemplate_groupUuidNull_returnMobileAll() { + when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(mInfo1); + when(mInfo1.getGroupUuid()).thenReturn(null); + when(mTelephonyManager.getMergedSubscriberIdsFromGroup()) + .thenReturn(new String[] {SUBSCRIBER_ID}); final NetworkTemplate networkTemplate = DataUsageUtils.getMobileTemplate(mContext, SUB_ID); assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID)).isTrue(); @@ -88,9 +96,11 @@ public class DataUsageUtilsTest { } @Test - public void getMobileTemplate_infoExisted_returnMobileMerged() { + public void getMobileTemplate_groupUuidExist_returnMobileMerged() { when(mSubscriptionManager.getActiveSubscriptionInfo(SUB_ID)).thenReturn(mInfo1); when(mInfo1.getGroupUuid()).thenReturn(mParcelUuid); + when(mTelephonyManager.getMergedSubscriberIdsFromGroup()) + .thenReturn(new String[] {SUBSCRIBER_ID, SUBSCRIBER_ID_2}); final NetworkTemplate networkTemplate = DataUsageUtils.getMobileTemplate(mContext, SUB_ID); assertThat(networkTemplate.matchesSubscriberId(SUBSCRIBER_ID)).isTrue(); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java index 9d398b5b69a1..d884fab518ce 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java @@ -56,6 +56,7 @@ import java.time.DateTimeException; import java.util.Arrays; import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.zip.CRC32; /** @@ -241,6 +242,8 @@ public class SettingsBackupAgent extends BackupAgentHelper { HashSet<String> movedToGlobal = new HashSet<String>(); Settings.System.getMovedToGlobalSettings(movedToGlobal); Settings.Secure.getMovedToGlobalSettings(movedToGlobal); + Set<String> movedToSecure = getMovedToSecureSettings(); + byte[] restoredWifiSupplicantData = null; byte[] restoredWifiIpConfigData = null; @@ -259,16 +262,17 @@ public class SettingsBackupAgent extends BackupAgentHelper { switch (key) { case KEY_SYSTEM : - restoreSettings(data, Settings.System.CONTENT_URI, movedToGlobal); + restoreSettings(data, Settings.System.CONTENT_URI, movedToGlobal, + movedToSecure); mSettingsHelper.applyAudioSettings(); break; case KEY_SECURE : - restoreSettings(data, Settings.Secure.CONTENT_URI, movedToGlobal); + restoreSettings(data, Settings.Secure.CONTENT_URI, movedToGlobal, null); break; case KEY_GLOBAL : - restoreSettings(data, Settings.Global.CONTENT_URI, null); + restoreSettings(data, Settings.Global.CONTENT_URI, null, movedToSecure); break; case KEY_WIFI_SUPPLICANT : @@ -347,20 +351,22 @@ public class SettingsBackupAgent extends BackupAgentHelper { HashSet<String> movedToGlobal = new HashSet<String>(); Settings.System.getMovedToGlobalSettings(movedToGlobal); Settings.Secure.getMovedToGlobalSettings(movedToGlobal); + Set<String> movedToSecure = getMovedToSecureSettings(); // system settings data first int nBytes = in.readInt(); if (DEBUG_BACKUP) Log.d(TAG, nBytes + " bytes of settings data"); byte[] buffer = new byte[nBytes]; in.readFully(buffer, 0, nBytes); - restoreSettings(buffer, nBytes, Settings.System.CONTENT_URI, movedToGlobal); + restoreSettings(buffer, nBytes, Settings.System.CONTENT_URI, movedToGlobal, + movedToSecure); // secure settings nBytes = in.readInt(); if (DEBUG_BACKUP) Log.d(TAG, nBytes + " bytes of secure settings data"); if (nBytes > buffer.length) buffer = new byte[nBytes]; in.readFully(buffer, 0, nBytes); - restoreSettings(buffer, nBytes, Settings.Secure.CONTENT_URI, movedToGlobal); + restoreSettings(buffer, nBytes, Settings.Secure.CONTENT_URI, movedToGlobal, null); // Global only if sufficiently new if (version >= FULL_BACKUP_ADDED_GLOBAL) { @@ -369,7 +375,8 @@ public class SettingsBackupAgent extends BackupAgentHelper { if (nBytes > buffer.length) buffer = new byte[nBytes]; in.readFully(buffer, 0, nBytes); movedToGlobal.clear(); // no redirection; this *is* the global namespace - restoreSettings(buffer, nBytes, Settings.Global.CONTENT_URI, movedToGlobal); + restoreSettings(buffer, nBytes, Settings.Global.CONTENT_URI, movedToGlobal, + movedToSecure); } // locale @@ -440,6 +447,13 @@ public class SettingsBackupAgent extends BackupAgentHelper { } } + private Set<String> getMovedToSecureSettings() { + Set<String> movedToSecureSettings = new HashSet<>(); + Settings.Global.getMovedToSecureSettings(movedToSecureSettings); + Settings.System.getMovedToSecureSettings(movedToSecureSettings); + return movedToSecureSettings; + } + private long[] readOldChecksums(ParcelFileDescriptor oldState) throws IOException { long[] stateChecksums = new long[STATE_SIZE]; @@ -564,7 +578,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { } private void restoreSettings(BackupDataInput data, Uri contentUri, - HashSet<String> movedToGlobal) { + HashSet<String> movedToGlobal, Set<String> movedToSecure) { byte[] settings = new byte[data.getDataSize()]; try { data.readEntityData(settings, 0, settings.length); @@ -572,11 +586,11 @@ public class SettingsBackupAgent extends BackupAgentHelper { Log.e(TAG, "Couldn't read entity data"); return; } - restoreSettings(settings, settings.length, contentUri, movedToGlobal); + restoreSettings(settings, settings.length, contentUri, movedToGlobal, movedToSecure); } private void restoreSettings(byte[] settings, int bytes, Uri contentUri, - HashSet<String> movedToGlobal) { + HashSet<String> movedToGlobal, Set<String> movedToSecure) { if (DEBUG) { Log.i(TAG, "restoreSettings: " + contentUri); } @@ -651,9 +665,14 @@ public class SettingsBackupAgent extends BackupAgentHelper { continue; } - final Uri destination = (movedToGlobal != null && movedToGlobal.contains(key)) - ? Settings.Global.CONTENT_URI - : contentUri; + final Uri destination; + if (movedToGlobal != null && movedToGlobal.contains(key)) { + destination = Settings.Global.CONTENT_URI; + } else if (movedToSecure != null && movedToSecure.contains(key)) { + destination = Settings.Secure.CONTENT_URI; + } else { + destination = contentUri; + } settingsHelper.restoreValue(this, cr, contentValues, destination, key, value, mRestoredFromSdkInt); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index 3cd82dfca6b6..b2c10ec8ea7f 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -1944,9 +1944,6 @@ class SettingsProtoDumpUtil { Settings.Secure.SILENCE_GESTURE, SecureSettingsProto.Gesture.SILENCE_ENABLED); dumpSetting(s, p, - Settings.Secure.SILENCE_NOTIFICATION_GESTURE_COUNT, - SecureSettingsProto.Gesture.SILENCE_NOTIFICATION_COUNT); - dumpSetting(s, p, Settings.Secure.SILENCE_TIMER_GESTURE_COUNT, SecureSettingsProto.Gesture.SILENCE_TIMER_COUNT); @@ -1956,6 +1953,19 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Secure.SKIP_GESTURE, SecureSettingsProto.Gesture.SKIP_ENABLED); + + dumpSetting(s, p, + Settings.Secure.SILENCE_ALARMS_TOUCH_COUNT, + SecureSettingsProto.Gesture.SILENCE_ALARMS_TOUCH_COUNT); + dumpSetting(s, p, + Settings.Secure.SILENCE_CALL_TOUCH_COUNT, + SecureSettingsProto.Gesture.SILENCE_CALLS_TOUCH_COUNT); + dumpSetting(s, p, + Settings.Secure.SILENCE_TIMER_TOUCH_COUNT, + SecureSettingsProto.Gesture.SILENCE_TIMER_TOUCH_COUNT); + dumpSetting(s, p, + Settings.Secure.SKIP_TOUCH_COUNT, + SecureSettingsProto.Gesture.SKIP_TOUCH_COUNT); p.end(gestureToken); dumpSetting(s, p, diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index 91a8ab5f692f..4c52b1324781 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -75,6 +75,7 @@ android_library { "--extra-packages", "com.android.keyguard", ], + kotlincflags: ["-Xjvm-default=enable"], plugins: ["dagger2-compiler-2.19"], } @@ -128,6 +129,7 @@ android_library { "telephony-common", "android.test.base", ], + kotlincflags: ["-Xjvm-default=enable"], aaptflags: [ "--extra-packages", "com.android.keyguard:com.android.systemui", @@ -155,6 +157,8 @@ android_app { "telephony-common", ], + kotlincflags: ["-Xjvm-default=enable"], + dxflags: ["--multi-dex"], aaptflags: [ "--extra-packages", @@ -191,6 +195,8 @@ android_app { "telephony-common", ], + kotlincflags: ["-Xjvm-default=enable"], + srcs: [ "legacy/recents/src/**/*.java", "legacy/recents/src/**/I*.aidl", diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/OverlayPlugin.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/OverlayPlugin.java index 90fc86bc5b51..075df75f938a 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/OverlayPlugin.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/OverlayPlugin.java @@ -16,12 +16,13 @@ package com.android.systemui.plugins; import android.view.View; import com.android.systemui.plugins.annotations.ProvidesInterface; +import com.android.systemui.plugins.statusbar.DozeParameters; @ProvidesInterface(action = OverlayPlugin.ACTION, version = OverlayPlugin.VERSION) public interface OverlayPlugin extends Plugin { String ACTION = "com.android.systemui.action.PLUGIN_OVERLAY"; - int VERSION = 3; + int VERSION = 4; /** * Setup overlay plugin @@ -29,9 +30,10 @@ public interface OverlayPlugin extends Plugin { void setup(View statusBar, View navBar); /** - * Setup overlay plugin with callback + * Setup overlay plugin with callback and DozeParameters */ - default void setup(View statusBar, View navBar, Callback callback) { + default void setup(View statusBar, View navBar, Callback callback, + DozeParameters dozeParameters) { setup(statusBar, navBar); } diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/SensorManagerPlugin.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/SensorManagerPlugin.java index 2cbd788d0a30..60435d0dec35 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/SensorManagerPlugin.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/SensorManagerPlugin.java @@ -58,7 +58,7 @@ public interface SensorManagerPlugin extends Plugin { public static final int TYPE_WAKE_LOCK_SCREEN = 1; public static final int TYPE_WAKE_DISPLAY = 2; public static final int TYPE_SWIPE = 3; - public static final int TYPE_STATUS = 4; + public static final int TYPE_SKIP_STATUS = 4; private int mType; diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java index 30d1352c8a01..85a9fec859f3 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java @@ -34,7 +34,7 @@ public interface QS extends FragmentBase { String ACTION = "com.android.systemui.action.PLUGIN_QS"; - int VERSION = 6; + int VERSION = 7; String TAG = "QS"; @@ -51,7 +51,7 @@ public interface QS extends FragmentBase { void setListening(boolean listening); boolean isShowingDetail(); void closeDetail(); - void setKeyguardShowing(boolean keyguardShowing); + default void setShowCollapsedOnKeyguard(boolean showCollapsedOnKeyguard) {} void animateHeaderSlidingIn(long delay); void animateHeaderSlidingOut(); void setQsExpansion(float qsExpansionFraction, float headerTranslation); diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/DozeParameters.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/DozeParameters.java new file mode 100644 index 000000000000..678eb31304a1 --- /dev/null +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/DozeParameters.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2019 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.plugins.statusbar; + +import com.android.systemui.plugins.annotations.ProvidesInterface; + +/** + * Retrieve doze information + */ +@ProvidesInterface(version = DozeParameters.VERSION) +public interface DozeParameters { + int VERSION = 1; + + /** + * Whether to doze when the screen turns off + */ + boolean shouldControlScreenOff(); +} diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java index 3ee69b4c3224..fe547a0a16fa 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java @@ -18,7 +18,6 @@ package com.android.systemui.plugins.statusbar; import com.android.systemui.plugins.annotations.DependsOn; import com.android.systemui.plugins.annotations.ProvidesInterface; -import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; /** @@ -94,5 +93,15 @@ public interface StatusBarStateController { * performance regressions. */ default void onDozeAmountChanged(float linear, float eased) {} + + /** + * Callback to be notified when the sysui visibility changes + */ + default void onSystemUiVisibilityChanged(int visibility) {} + + /** + * Callback to be notified when the pulsing state changes + */ + default void onPulsingChanged(boolean pulsing) {} } } diff --git a/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml b/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml index 65f7a0e29843..8c611f61dc23 100644 --- a/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml +++ b/packages/SystemUI/res-keyguard/drawable/bubble_hour_hand.xml @@ -6,5 +6,5 @@ <path android:pathData="M170,40m-39,0a39,39 0,1 1,78 0a39,39 0,1 1,-78 0" android:strokeColor="#000000" - android:strokeWidth="2"/> + android:strokeWidth="3"/> </vector> diff --git a/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml b/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml index 95b4b1ad0b9b..27bc43638f06 100644 --- a/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml +++ b/packages/SystemUI/res-keyguard/drawable/bubble_minute_hand.xml @@ -6,5 +6,5 @@ <path android:pathData="M170,1L170,1A39,39 0,0 1,209 40L209,130A39,39 0,0 1,170 169L170,169A39,39 0,0 1,131 130L131,40A39,39 0,0 1,170 1z" android:strokeColor="#000000" - android:strokeWidth="2"/> + android:strokeWidth="3"/> </vector> diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_presentation.xml b/packages/SystemUI/res-keyguard/layout/keyguard_presentation.xml index a9ba19d2d393..f4d34f4ca141 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_presentation.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_presentation.xml @@ -41,7 +41,7 @@ <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/widget_vertical_padding" + android:layout_marginTop="24dp" android:layout_gravity="center_horizontal" android:src="@drawable/kg_security_lock_normal" /> </LinearLayout> diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml index 04d6afc1935f..847fba41f593 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml @@ -25,14 +25,13 @@ android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" - androidprv:layout_maxWidth="@dimen/keyguard_security_width" - androidprv:layout_maxHeight="@dimen/keyguard_security_height" android:gravity="center_horizontal|top"> <LinearLayout android:id="@+id/status_view_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/widget_vertical_padding" + android:clipChildren="false" + android:clipToPadding="false" android:orientation="vertical"> <TextView android:id="@+id/logout" @@ -71,5 +70,11 @@ android:letterSpacing="0.05" android:ellipsize="marquee" android:singleLine="true" /> + <com.android.systemui.statusbar.phone.NotificationIconContainer + android:id="@+id/clock_notification_icon_container" + android:layout_width="match_parent" + android:layout_height="@dimen/notification_shelf_height" + android:layout_marginTop="@dimen/widget_vertical_padding" + /> </LinearLayout> </com.android.keyguard.KeyguardStatusView> diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml index 882f6e2da9b2..11bcc8876b27 100644 --- a/packages/SystemUI/res-keyguard/values-af/strings.xml +++ b/packages/SystemUI/res-keyguard/values-af/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM is nou gedeaktiveer. Voer PUK-kode in om voort te gaan. Jy het <xliff:g id="_NUMBER_1">%d</xliff:g> pogings oor voordat die SIM permanent onbruikbaar word. Kontak die diensverskaffer vir besonderhede.</item> <item quantity="one">SIM is nou gedeaktiveer. Voer PUK-kode in om voort te gaan. Jy het <xliff:g id="_NUMBER_0">%d</xliff:g> poging oor voordat die SIM permanent onbruikbaar word. Kontak die diensverskaffer vir besonderhede.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Verstek"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Borrel"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analoog"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml index 8f85eb345e48..4feb9f1d2c13 100644 --- a/packages/SystemUI/res-keyguard/values-am/strings.xml +++ b/packages/SystemUI/res-keyguard/values-am/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">ሲም አሁን ተሰናክሏል። ለመቀጠል የPUK ኮድ ያስገቡ። ሲም እስከመጨረሻው መጠቀም የማይቻል ከመሆኑ በፊት <xliff:g id="_NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል። ዝርዝሮችን ለማግኘት የአገልግሎት አቅራቢን ያነጋግሩ።</item> <item quantity="other">ሲም አሁን ተሰናክሏል። ለመቀጠል የPUK ኮድ ያስገቡ። ሲም እስከመጨረሻው መጠቀም የማይቻል ከመሆኑ በፊት <xliff:g id="_NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል። ዝርዝሮችን ለማግኘት የአገልግሎት አቅራቢን ያነጋግሩ።</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"ነባሪ"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"አረፋ"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"አናሎግ"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml index 29f3570bb86b..4e163a2d331c 100644 --- a/packages/SystemUI/res-keyguard/values-ar/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml @@ -183,4 +183,7 @@ <item quantity="other">تم إيقاف شريحة SIM الآن. أدخل رمز PUK للمتابعة، وتتبقى لديك <xliff:g id="_NUMBER_1">%d</xliff:g> محاولة قبل أن تصبح شريحة SIM غير صالحة للاستخدام نهائيًا. ويمكنك الاتصال بمشغل شبكة الجوّال لمعرفة التفاصيل.</item> <item quantity="one">تم إيقاف شريحة SIM الآن. أدخل رمز PUK للمتابعة، وتتبقى لديك محاولة واحدة (<xliff:g id="_NUMBER_0">%d</xliff:g>) قبل أن تصبح شريحة SIM غير صالحة للاستخدام نهائيًا. ويمكنك الاتصال بمشغل شبكة الجوّال لمعرفة التفاصيل.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"تلقائي"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"فقاعة"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"ساعة تقليدية"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml index de21e4919dc2..e225675804d2 100644 --- a/packages/SystemUI/res-keyguard/values-as/strings.xml +++ b/packages/SystemUI/res-keyguard/values-as/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">ছিমখন অক্ষম হ’ল। অব্যাহত ৰাখিবলৈ PUK দিয়ক। ছিমখন স্থায়ীভাৱে ব্যৱহাৰৰ অনুপযোগী হোৱাৰ পূৰ্বে আপোনাৰ হাতত <xliff:g id="_NUMBER_1">%d</xliff:g>টা প্ৰয়াস বাকী আছে। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক।</item> <item quantity="other">ছিমখন অক্ষম হ’ল। অব্যাহত ৰাখিবলৈ PUK দিয়ক। ছিমখন স্থায়ীভাৱে ব্যৱহাৰৰ অনুপযোগী হোৱাৰ পূৰ্বে আপোনাৰ হাতত <xliff:g id="_NUMBER_1">%d</xliff:g>টা প্ৰয়াস বাকী আছে। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক।</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"ডিফ’ল্ট"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"বাবল"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"এনাল’গ"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml index d83706ea37b3..c0cf129a9408 100644 --- a/packages/SystemUI/res-keyguard/values-az/strings.xml +++ b/packages/SystemUI/res-keyguard/values-az/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM indi deaktivdir. Davam etmək üçün PUK kodunu daxil edin. SIM birdəfəlik yararsız olmadan öncə <xliff:g id="_NUMBER_1">%d</xliff:g> cəhdiniz qalır. Ətraflı məlumat üçün operatorla əlaqə saxlayın.</item> <item quantity="one">SIM indi deaktivdir. Davam etmək üçün PUK kodunu daxil edin. SIM birdəfəlik yararsız olmadan öncə <xliff:g id="_NUMBER_0">%d</xliff:g> cəhdiniz qalır. Ətraflı məlumat üçün operatorla əlaqə saxlayın.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Defolt"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Qabarcıq"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analoq"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml index c0dfbc8522fc..88ca77b4a977 100644 --- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml @@ -159,4 +159,7 @@ <item quantity="few">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja pre nego što SIM postane trajno neupotrebljiv. Detaljne informacije potražite od mobilnog operatera.</item> <item quantity="other">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja pre nego što SIM postane trajno neupotrebljiv. Detaljne informacije potražite od mobilnog operatera.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Podrazumevani"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Mehurići"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogni"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml index 6b5f3edeb464..a897fb2fbf92 100644 --- a/packages/SystemUI/res-keyguard/values-be/strings.xml +++ b/packages/SystemUI/res-keyguard/values-be/strings.xml @@ -167,4 +167,7 @@ <item quantity="many">SIM-карта заблакіравана. Каб працягнуць, увядзіце PUK-код. У вас ёсць яшчэ <xliff:g id="_NUMBER_1">%d</xliff:g> спроб, пасля чаго SIM-карта будзе заблакіравана назаўсёды. Звярніцеся да аператара, каб даведацца больш.</item> <item quantity="other">SIM-карта заблакіравана. Каб працягнуць, увядзіце PUK-код. У вас ёсць яшчэ <xliff:g id="_NUMBER_1">%d</xliff:g> спробы, пасля чаго SIM-карта будзе заблакіравана назаўсёды. Звярніцеся да аператара, каб даведацца больш.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Стандартны"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Бурбалкі"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Са стрэлкамі"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml index 296e77ae602d..eebdb9edc7f1 100644 --- a/packages/SystemUI/res-keyguard/values-bg/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Остават ви <xliff:g id="_NUMBER_1">%d</xliff:g> опита, преди SIM картата да стане неизползваема завинаги. Свържете се с оператора за подробности.</item> <item quantity="one">SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Остава ви <xliff:g id="_NUMBER_0">%d</xliff:g> опит, преди SIM картата да стане неизползваема завинаги. Свържете се с оператора за подробности.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Стандартен"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Балонен"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Аналогов"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml index b6aa65194a0f..b544c14fb0b0 100644 --- a/packages/SystemUI/res-keyguard/values-bn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">সিম অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোড লিখুন। আপনি আর <xliff:g id="_NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারবেন, তারপরে এই সিমটি আর একেবারেই ব্যবহার করা যাবে না। বিশদে জানতে পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।</item> <item quantity="other">সিম অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোড লিখুন। আপনি আর <xliff:g id="_NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারবেন, তারপরে এই সিমটি আর একেবারেই ব্যবহার করা যাবে না। বিশদে জানতে পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"ডিফল্ট"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"বাবল"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"অ্যানালগ"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml index 2a8871140f4f..8547bc87a5d3 100644 --- a/packages/SystemUI/res-keyguard/values-bs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml @@ -159,4 +159,7 @@ <item quantity="few">SIM kartica je onemogućena. Unesite PUK kôd da nastavite. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Za više informacija kontaktirajte mobilnog operatera.</item> <item quantity="other">SIM kartica je onemogućena. Unesite PUK kôd da nastavite. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Za više informacija kontaktirajte mobilnog operatera.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Zadano"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Mjehurići"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogni"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml index bb48226a8930..ccde138c10b6 100644 --- a/packages/SystemUI/res-keyguard/values-ca/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queden <xliff:g id="_NUMBER_1">%d</xliff:g> intents; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació.</item> <item quantity="one">La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queda <xliff:g id="_NUMBER_0">%d</xliff:g> intent; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Predeterminada"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bombolla"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analògica"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml index 536dd15583ee..0d88a2074efa 100644 --- a/packages/SystemUI/res-keyguard/values-cs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml @@ -167,4 +167,7 @@ <item quantity="other">SIM karta je teď zablokována. Chcete-li pokračovat, zadejte kód PUK. Máte ještě <xliff:g id="_NUMBER_1">%d</xliff:g> pokusů, poté bude SIM karta natrvalo zablokována. Podrobnosti vám poskytne operátor.</item> <item quantity="one">SIM karta je teď zablokována. Chcete-li pokračovat, zadejte kód PUK. Máte ještě <xliff:g id="_NUMBER_0">%d</xliff:g> pokus, poté bude SIM karta natrvalo zablokována. Podrobnosti vám poskytne operátor.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Výchozí"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bublina"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogové"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml index e60930d4d70b..0e6a1f349d93 100644 --- a/packages/SystemUI/res-keyguard/values-da/strings.xml +++ b/packages/SystemUI/res-keyguard/values-da/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">SIM-kortet er nu deaktiveret. Angiv PUK-koden for at fortsætte. Du har <xliff:g id="_NUMBER_1">%d</xliff:g> forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger.</item> <item quantity="other">SIM-kortet er nu deaktiveret. Angiv PUK-koden for at fortsætte. Du har <xliff:g id="_NUMBER_1">%d</xliff:g> forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Standard"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Boble"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analog"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml index d8bb0103f628..7f39a194202a 100644 --- a/packages/SystemUI/res-keyguard/values-de/strings.xml +++ b/packages/SystemUI/res-keyguard/values-de/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Du hast noch <xliff:g id="_NUMBER_1">%d</xliff:g> Versuche, bevor die SIM-Karte endgültig gesperrt wird. Weitere Informationen erhältst du von deinem Mobilfunkanbieter.</item> <item quantity="one">Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Du hast noch <xliff:g id="_NUMBER_0">%d</xliff:g> Versuch, bevor die SIM-Karte endgültig gesperrt wird. Weitere Informationen erhältst du von deinem Mobilfunkanbieter.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Standard"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Blase"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analog"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml index 47330058cdec..46b1d30b865c 100644 --- a/packages/SystemUI/res-keyguard/values-el/strings.xml +++ b/packages/SystemUI/res-keyguard/values-el/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">Η κάρτα SIM απενεργοποιήθηκε. Καταχωρίστε τον κωδικό PUK, για να συνεχίσετε. Απομένουν <xliff:g id="_NUMBER_1">%d</xliff:g> ακόμη προσπάθειες προτού να μην είναι πλέον δυνατή η χρήση της κάρτας SIM. Επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας για λεπτομέρειες.</item> <item quantity="one">Η κάρτα SIM απενεργοποιήθηκε. Καταχωρίστε τον κωδικό PUK, για να συνεχίσετε. Απομένει <xliff:g id="_NUMBER_0">%d</xliff:g> ακόμη προσπάθεια προτού να μην είναι πλέον δυνατή η χρήση της κάρτας SIM. Επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας για λεπτομέρειες.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Προεπιλογή"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Συννεφάκι"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Αναλογικό"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml index 8f1a94e767ee..5640b6d3050a 100644 --- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact operator for details.</item> <item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact operator for details.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Default"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bubble"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogue"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml index b7d0722ac14b..5836b72a0cda 100644 --- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact operator for details.</item> <item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact operator for details.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Default"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bubble"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogue"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml index 8f1a94e767ee..5640b6d3050a 100644 --- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact operator for details.</item> <item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact operator for details.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Default"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bubble"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogue"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml index 8f1a94e767ee..5640b6d3050a 100644 --- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact operator for details.</item> <item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact operator for details.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Default"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bubble"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogue"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml index 13e87fa5269a..fb968b76e24b 100644 --- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact carrier for details.</item> <item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact carrier for details.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Default"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bubble"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analog"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml index 90ee83d9ef55..727cbad82ad2 100644 --- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te quedan <xliff:g id="_NUMBER_1">%d</xliff:g> intentos más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles.</item> <item quantity="one">Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te queda <xliff:g id="_NUMBER_0">%d</xliff:g> intento más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Predeterminado"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Burbuja"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analógico"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml index 5970c82d7218..870741ea0202 100644 --- a/packages/SystemUI/res-keyguard/values-es/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te quedan <xliff:g id="_NUMBER_1">%d</xliff:g> intentos para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información.</item> <item quantity="one">La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te queda <xliff:g id="_NUMBER_0">%d</xliff:g> intento para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Predeterminado"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Burbuja"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analógico"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml index a95a3d3e9a0d..7e03a5cff371 100644 --- a/packages/SystemUI/res-keyguard/values-et/strings.xml +++ b/packages/SystemUI/res-keyguard/values-et/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Teil on jäänud veel <xliff:g id="_NUMBER_1">%d</xliff:g> katset enne, kui SIM-kaart püsivalt lukustatakse. Lisateavet küsige operaatorilt.</item> <item quantity="one">SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Teil on jäänud veel <xliff:g id="_NUMBER_0">%d</xliff:g> katse enne, kui SIM-kaart püsivalt lukustatakse. Lisateavet küsige operaatorilt.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Vaikenumbrilaud"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Mull"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analoog"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml index 64601ca50645..8ad942b5c8ce 100644 --- a/packages/SystemUI/res-keyguard/values-eu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">Desgaitu egin da SIM txartela. Aurrera egiteko, idatzi PUK kodea. <xliff:g id="_NUMBER_1">%d</xliff:g> saiakera geratzen zaizkizu SIM txartela betiko erabilgaitz geratu aurretik. Xehetasunak lortzeko, jarri operadorearekin harremanetan.</item> <item quantity="one">Desgaitu egin da SIM txartela. Aurrera egiteko, idatzi PUK kodea. <xliff:g id="_NUMBER_0">%d</xliff:g> saiakera geratzen zaizu SIM txartela betiko erabilgaitz geratu aurretik. Xehetasunak lortzeko, jarri operadorearekin harremanetan.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Lehenetsia"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Puxikak"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogikoa"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml index 1c4387e97a84..22c4c48a7e37 100644 --- a/packages/SystemUI/res-keyguard/values-fa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">سیمکارت اکنون غیرفعال است. برای ادامه دادن کد PUK را وارد کنید. <xliff:g id="_NUMBER_1">%d</xliff:g> تلاش دیگر باقی مانده است و پس از آن سیمکارت برای همیشه غیرقابلاستفاده میشود. برای اطلاع از جزئیات با شرکت مخابراتی تماس بگیرید.</item> <item quantity="other">سیمکارت اکنون غیرفعال است. برای ادامه دادن کد PUK را وارد کنید. <xliff:g id="_NUMBER_1">%d</xliff:g> تلاش دیگر باقی مانده است و پس از آن سیمکارت برای همیشه غیرقابلاستفاده میشود. برای اطلاع از جزئیات با شرکت مخابراتی تماس بگیرید.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"پیشفرض"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"حباب"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"آنالوگ"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml index a49b0c4dd14e..66f1de5b292d 100644 --- a/packages/SystemUI/res-keyguard/values-fi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM-kortti on nyt lukittu. Anna PUK-koodi, niin voit jatkaa. Sinulla on <xliff:g id="_NUMBER_1">%d</xliff:g> yritystä jäljellä, ennen kuin SIM-kortti poistuu pysyvästi käytöstä. Pyydä lisätietoja operaattoriltasi.</item> <item quantity="one">SIM-kortti on nyt lukittu. Anna PUK-koodi, niin voit jatkaa. Sinulla on <xliff:g id="_NUMBER_0">%d</xliff:g> yritys jäljellä, ennen kuin SIM-kortti poistuu pysyvästi käytöstä. Pyydä lisätietoja operaattoriltasi.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Oletus"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Kupla"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analoginen"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml index 77b1b2edcd0c..66c7c86f363e 100644 --- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services.</item> <item quantity="other">La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Par défaut"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bulle"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogique"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml index b1f9e0dcd06a..d6aa5d262821 100644 --- a/packages/SystemUI/res-keyguard/values-fr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur.</item> <item quantity="other">La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Par défaut"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bulle"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogique"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml index 55f84f805964..e6b10a00ba72 100644 --- a/packages/SystemUI/res-keyguard/values-gl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">A SIM está desactivada. Introduce o código PUK para continuar. Quédanche <xliff:g id="_NUMBER_1">%d</xliff:g> intentos antes de que a SIM quede inutilizable para sempre. Contacta co operador para obter información.</item> <item quantity="one">A SIM está desactivada. Introduce o código PUK para continuar. Quédache <xliff:g id="_NUMBER_0">%d</xliff:g> intento antes de que a SIM quede inutilizable para sempre. Contacta co operador para obter información.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Predeterminado"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Burbulla"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analóxico"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml index aa4ebdfb529c..025462e37813 100644 --- a/packages/SystemUI/res-keyguard/values-gu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">સિમ હવે બંધ કરેલ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. સિમ કાયમીરૂપે બિનઉપયોગી બની જાય એ પહેલાં તમારી પાસે <xliff:g id="_NUMBER_1">%d</xliff:g> પ્રયાસ બાકી છે. વિગતો માટે કૅરિઅરનો સંપર્ક કરો.</item> <item quantity="other">સિમ હવે બંધ કરેલ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. સિમ કાયમીરૂપે બિનઉપયોગી બની જાય એ પહેલાં તમારી પાસે <xliff:g id="_NUMBER_1">%d</xliff:g> પ્રયાસો બાકી છે. વિગતો માટે કૅરિઅરનો સંપર્ક કરો.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"ડિફૉલ્ટ"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"બબલ"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"એનાલોગ"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml index 86e14dc8b107..2de75e479334 100644 --- a/packages/SystemUI/res-keyguard/values-hi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">सिम बंद कर दिया गया है. जारी रखने के लिए PUK कोड डालें. आपके पास <xliff:g id="_NUMBER_1">%d</xliff:g> मौके बचे हैं, उसके बाद, सिम हमेशा के लिए काम करना बंद कर देगा. जानकारी के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें.</item> <item quantity="other">सिम बंद कर दिया गया है. जारी रखने के लिए PUK कोड डालें. आपके पास <xliff:g id="_NUMBER_1">%d</xliff:g> मौके बचे हैं, उसके बाद, सिम हमेशा के लिए काम करना बंद कर देगा. जानकारी के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"डिफ़ॉल्ट"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"बबल"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"एनालॉग"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml index c7f4daf3c4ea..c4f7bba86002 100644 --- a/packages/SystemUI/res-keyguard/values-hr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml @@ -159,4 +159,7 @@ <item quantity="few">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Više informacija zatražite od mobilnog operatera.</item> <item quantity="other">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Više informacija zatražite od mobilnog operatera.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Zadano"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Mjehurić"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogni"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml index 62c97996716e..06142bc738b0 100644 --- a/packages/SystemUI/res-keyguard/values-hu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. Még <xliff:g id="_NUMBER_1">%d</xliff:g> próbálkozása van, mielőtt végleg használhatatlanná válik a SIM-kártya. További információért forduljon a szolgáltatóhoz.</item> <item quantity="one">A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. Még <xliff:g id="_NUMBER_0">%d</xliff:g> próbálkozása van, mielőtt végleg használhatatlanná válik a SIM-kártya. További információért forduljon a szolgáltatóhoz.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Alapértelmezett"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Buborék"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analóg"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml index fc9f7f253b1c..f501fcc7c347 100644 --- a/packages/SystemUI/res-keyguard/values-hy/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">SIM քարտն անջատված է: Շարունակելու համար մուտքագրեք PUK կոդը: Մնացել է <xliff:g id="_NUMBER_1">%d</xliff:g> փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել: Մանրամասների համար դիմեք օպերատորին:</item> <item quantity="other">SIM քարտն անջատված է: Շարունակելու համար մուտքագրեք PUK կոդը: Մնացել է <xliff:g id="_NUMBER_1">%d</xliff:g> փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել: Մանրամասների համար դիմեք օպերատորին:</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Կանխադրված"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Պղպջակ"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Անալոգային"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml index ea9a15ff9bd2..64f396edfef8 100644 --- a/packages/SystemUI/res-keyguard/values-in/strings.xml +++ b/packages/SystemUI/res-keyguard/values-in/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM kini dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Tersisa <xliff:g id="_NUMBER_1">%d</xliff:g> percobaan sebelum SIM tidak dapat digunakan secara permanen. Hubungi operator untuk mengetahui detailnya.</item> <item quantity="one">SIM kini dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Tersisa <xliff:g id="_NUMBER_0">%d</xliff:g> percobaan sebelum SIM tidak dapat digunakan secara permanen. Hubungi operator untuk mengetahui detailnya.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Default"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Balon"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analog"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml index 132e4eb5d1f5..aa33215fc124 100644 --- a/packages/SystemUI/res-keyguard/values-is/strings.xml +++ b/packages/SystemUI/res-keyguard/values-is/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">SIM-kortið er nú óvirkt. Sláðu inn PUK-númer til að halda áfram. Það er <xliff:g id="_NUMBER_1">%d</xliff:g> tilraun eftir þar til SIM-kortið verður ónothæft til frambúðar. Hafðu samband við símafyrirtækið til að fá upplýsingar.</item> <item quantity="other">SIM-kortið er nú óvirkt. Sláðu inn PUK-númer til að halda áfram. Það eru <xliff:g id="_NUMBER_1">%d</xliff:g> tilraunir eftir þar til SIM-kortið verður ónothæft til frambúðar. Hafðu samband við símafyrirtækið til að fá upplýsingar.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Sjálfgefið"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Blaðra"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Með vísum"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml index 468435f52e01..761640c72010 100644 --- a/packages/SystemUI/res-keyguard/values-it/strings.xml +++ b/packages/SystemUI/res-keyguard/values-it/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora <xliff:g id="_NUMBER_1">%d</xliff:g> tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore.</item> <item quantity="one">La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora <xliff:g id="_NUMBER_0">%d</xliff:g> tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Predefinito"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bolla"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogico"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml index 2b137932f869..e72c8081873a 100644 --- a/packages/SystemUI/res-keyguard/values-iw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml @@ -167,4 +167,7 @@ <item quantity="other">כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך <xliff:g id="_NUMBER_1">%d</xliff:g> ניסיונות נוספים לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך.</item> <item quantity="one">כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותר לך <xliff:g id="_NUMBER_0">%d</xliff:g> ניסיון נוסף לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"ברירת מחדל"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"בועה"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"אנלוגי"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml index 97f5b83301fa..27adb8c165eb 100644 --- a/packages/SystemUI/res-keyguard/values-ja/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM が無効になりました。続行するには PUK コードを入力してください。入力できるのはあと <xliff:g id="_NUMBER_1">%d</xliff:g> 回です。この回数を超えると SIM は完全に使用できなくなります。詳しくは携帯通信会社にお問い合わせください。</item> <item quantity="one">SIM が無効になりました。続行するには PUK コードを入力してください。入力できるのはあと <xliff:g id="_NUMBER_0">%d</xliff:g> 回です。この回数を超えると SIM は完全に使用できなくなります。詳しくは携帯通信会社にお問い合わせください。</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"デフォルト"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"バブル"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"アナログ"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml index 24daf4b893b1..d165230613c1 100644 --- a/packages/SystemUI/res-keyguard/values-ka/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. თქვენ დაგრჩათ <xliff:g id="_NUMBER_1">%d</xliff:g> მცდელობა, სანამ SIM სამუდამოდ გამოუსადეგარი გახდება. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს.</item> <item quantity="one">SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. თქვენ დაგრჩათ <xliff:g id="_NUMBER_0">%d</xliff:g> მცდელობა, სანამ SIM სამუდამოდ გამოუსადეგარი გახდება. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"ნაგულისხმევი"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"ბუშტი"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"ანალოგური"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml index 330bf53234c1..85223468a0c2 100644 --- a/packages/SystemUI/res-keyguard/values-kk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM картасы өшірілді. Жалғастыру үшін PUK кодын енгізіңіз. <xliff:g id="_NUMBER_1">%d</xliff:g> мүмкіндік қалды, одан кейін SIM картасы біржола құлыпталады. Толығырақ мәліметті оператордан алыңыз.</item> <item quantity="one">SIM картасы өшірілді. Жалғастыру үшін PUK кодын енгізіңіз. <xliff:g id="_NUMBER_0">%d</xliff:g> мүмкіндік қалды, одан кейін SIM картасы біржола құлыпталады. Толығырақ мәліметті оператордан алыңыз.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Әдепкі"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Көпіршік"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Аналогтық"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml index 9fd949ab6e38..7b4266a1b816 100644 --- a/packages/SystemUI/res-keyguard/values-km/strings.xml +++ b/packages/SystemUI/res-keyguard/values-km/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">ឥឡូវនេះស៊ីមត្រូវបានបិទ។ សូមបញ្ចូលកូដ PUK ដើម្បីបន្ត។ អ្នកនៅសល់ការព្យាយាម <xliff:g id="_NUMBER_1">%d</xliff:g> ដងទៀតមុនពេលស៊ីមមិនអាចប្រើបានជាអចិន្ត្រៃយ៍។ ទាក់ទងទៅក្រុមហ៊ុនសេវាទូរសព្ទសម្រាប់ព័ត៌មានលម្អិត។</item> <item quantity="one">ឥឡូវនេះស៊ីមត្រូវបានបិទ។ សូមបញ្ចូលកូដ PUK ដើម្បីបន្ត។ អ្នកនៅសល់ការព្យាយាម <xliff:g id="_NUMBER_0">%d</xliff:g> ដងទៀតមុនពេលស៊ីមមិនអាចប្រើបានជាអចិន្ត្រៃយ៍។ ទាក់ទងទៅក្រុមហ៊ុនសេវាទូរសព្ទសម្រាប់ព័ត៌មានលម្អិត។</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"លំនាំដើម"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"ពពុះ"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"អាណាឡូក"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml index bbda27c13501..eaaa8298c8c6 100644 --- a/packages/SystemUI/res-keyguard/values-kn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">ಸಿಮ್ ಅನ್ನು ಈಗ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಸಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ಸಿಮ್ ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಪ್ರಯೋಜಕವಾಗುವ ಮುನ್ನ ನಿಮ್ಮಲ್ಲಿ <xliff:g id="_NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ.</item> <item quantity="other">ಸಿಮ್ ಅನ್ನು ಈಗ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಸಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ಸಿಮ್ ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಪ್ರಯೋಜಕವಾಗುವ ಮುನ್ನ ನಿಮ್ಮಲ್ಲಿ <xliff:g id="_NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"ಡೀಫಾಲ್ಟ್"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"ಬಬಲ್"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"ಅನಲಾಗ್"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml index 8d8e5f85bbfc..ca849372f202 100644 --- a/packages/SystemUI/res-keyguard/values-ko/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. <xliff:g id="_NUMBER_1">%d</xliff:g>번 더 실패하면 SIM을 완전히 사용할 수 없게 됩니다. 자세한 내용은 이동통신사에 문의하세요.</item> <item quantity="one">SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. <xliff:g id="_NUMBER_0">%d</xliff:g>번 더 실패하면 SIM을 완전히 사용할 수 없게 됩니다. 자세한 내용은 이동통신사에 문의하세요.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"기본"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"버블"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"아날로그"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml index fd02abbab849..805a567c7639 100644 --- a/packages/SystemUI/res-keyguard/values-ky/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. SIM-картанын биротоло жарактан чыгарына <xliff:g id="_NUMBER_1">%d</xliff:g> аракет калды. Чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз.</item> <item quantity="one">SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. SIM-картанын биротоло жарактан чыгаарына <xliff:g id="_NUMBER_0">%d</xliff:g> аракет калды. Чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Демейки"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Көбүк"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Аналог"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml index f7483767f522..1418d2750e83 100644 --- a/packages/SystemUI/res-keyguard/values-lo/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">ຕອນນີ້ປິດການນຳໃຊ້ SIM ແລ້ວ. ໃສ່ລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="_NUMBER_1">%d</xliff:g> ເທື່ອກ່ອນທີ່ SIM ຈະບໍ່ສາມາດໃຊ້ໄດ້ຖາວອນ. ກະລຸນາຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ.</item> <item quantity="one">ຕອນນີ້ປິດການນຳໃຊ້ SIM ແລ້ວ. ໃສ່ລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="_NUMBER_0">%d</xliff:g> ເທື່ອກ່ອນທີ່ SIM ຈະບໍ່ສາມາດໃຊ້ໄດ້ຖາວອນ. ກະລຸນາຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"ຄ່າເລີ່ມຕົ້ນ"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"ຟອງ"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"ໂມງເຂັມ"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml index c987b6afa821..bbd25b2a6f9e 100644 --- a/packages/SystemUI/res-keyguard/values-lt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml @@ -167,4 +167,7 @@ <item quantity="many">SIM kortelė dabar yra išjungta. Jei norite tęsti, įveskite PUK kodą. Jums liko <xliff:g id="_NUMBER_1">%d</xliff:g> bandymo. Paskui visiškai nebegalėsite naudoti SIM kortelės. Jei reikia išsamios informacijos, susisiekite su operatoriumi.</item> <item quantity="other">SIM kortelė dabar yra išjungta. Jei norite tęsti, įveskite PUK kodą. Jums liko <xliff:g id="_NUMBER_1">%d</xliff:g> bandymų. Paskui visiškai nebegalėsite naudoti SIM kortelės. Jei reikia išsamios informacijos, susisiekite su operatoriumi.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Numatytasis"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Debesėlis"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analoginis"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml index 2ad607ec8cd3..58ca8ce3fd11 100644 --- a/packages/SystemUI/res-keyguard/values-lv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml @@ -159,4 +159,7 @@ <item quantity="one">SIM karte tagad ir atspējota. Ievadiet PUK kodu, lai turpinātu. Varat mēģināt vēl <xliff:g id="_NUMBER_1">%d</xliff:g> reizi. Kļūdas gadījumā SIM karti vairs nevarēs izmantot. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru.</item> <item quantity="other">SIM karte tagad ir atspējota. Ievadiet PUK kodu, lai turpinātu. Varat mēģināt vēl <xliff:g id="_NUMBER_1">%d</xliff:g> reizes. Kļūdas gadījumā SIM karti vairs nevarēs izmantot. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Noklusējums"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Burbuļi"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogais"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml index 1a3c799b0876..1ffd8a4ecec9 100644 --- a/packages/SystemUI/res-keyguard/values-mk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">SIM-картичката сега е оневозможена. Внесете PUK-код за да продолжите. Ви преостанува уште <xliff:g id="_NUMBER_1">%d</xliff:g> обид пред SIM-картичката да стане трајно неупотреблива. Контактирајте го операторот за детали.</item> <item quantity="other">SIM-картичката сега е оневозможена. Внесете PUK-код за да продолжите. Ви преостануваат уште <xliff:g id="_NUMBER_1">%d</xliff:g> обиди пред SIM-картичката да стане трајно неупотреблива. Контактирајте го операторот за детали.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Стандарден"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Балонче"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Аналоген"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml index 685685e61bcf..1f60c7365c31 100644 --- a/packages/SystemUI/res-keyguard/values-ml/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. സിം ശാശ്വതമായി ഉപയോഗശൂന്യമാകുന്നതിന് മുമ്പായി <xliff:g id="_NUMBER_1">%d</xliff:g> ശ്രമങ്ങൾ കൂടി ശേഷിക്കുന്നു. വിശദാംശങ്ങൾക്ക് കാരിയറുമായി ബന്ധപ്പെടുക.</item> <item quantity="one">സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. സിം ശാശ്വതമായി ഉപയോഗശൂന്യമാകുന്നതിന് മുമ്പായി <xliff:g id="_NUMBER_0">%d</xliff:g> ശ്രമം കൂടി ശേഷിക്കുന്നു. വിശദാംശങ്ങൾക്ക് കാരിയറുമായി ബന്ധപ്പെടുക.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"ഡിഫോൾട്ട്"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"ബബ്ൾ"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"അനലോഗ്"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml index acdacdc15972..55dd70c35b66 100644 --- a/packages/SystemUI/res-keyguard/values-mn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM-г идэвхгүй болголоо. Үргэлжлүүлэхийн тулд PUK кодыг оруулна уу. Таны SIM бүрмөсөн хүчингүй болох хүртэл <xliff:g id="_NUMBER_1">%d</xliff:g> оролдлого үлдлээ. Дэлгэрэнгүй мэдээлэл авахын тулд оператор компанитайгаа холбогдоно уу.</item> <item quantity="one">SIM-г идэвхгүй болголоо. Үргэлжлүүлэхийн тулд PUK кодыг оруулна уу. Таны SIM бүрмөсөн хүчингүй болох хүртэл <xliff:g id="_NUMBER_0">%d</xliff:g> оролдлого үлдлээ. Дэлгэрэнгүй мэдээлэл авахын тулд оператор компанитайгаа холбогдоно уу.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Өгөгдмөл"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Бөмбөлөг"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Aналог"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml index 4ff6862a0621..0ba82e0d3d90 100644 --- a/packages/SystemUI/res-keyguard/values-mr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">सिम आता बंद केलेले आहे. सुरू ठेवण्यासाठी PUK कोड टाका. सिम कायमचे बंद होण्याआधी तुमच्याकडे <xliff:g id="_NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहेत. तपशीलांसाठी वाहकाशी संपर्क साधा.</item> <item quantity="one">सिम आता बंद केलेले आहे. सुरू ठेवण्यासाठी PUK कोड टाका. सिम कायमचे बंद होण्याआधी तुमच्याकडे <xliff:g id="_NUMBER_0">%d</xliff:g> प्रयत्न शिल्लक आहे. तपशीलांसाठी वाहकाशी संपर्क साधा.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"डीफॉल्ट"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"बबल"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"अॅनालॉग"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml index 5c9e7c9c6f4d..17e105619f96 100644 --- a/packages/SystemUI/res-keyguard/values-ms/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">Kini SIM dilumpuhkan. Masukkan kod PUK untuk meneruskan. Tinggal <xliff:g id="_NUMBER_1">%d</xliff:g> percubaan sebelum SIM tidak boleh digunakan secara kekal. Hubungi pembawa untuk mendapatkan butiran.</item> <item quantity="one">Kini SIM dilumpuhkan. Masukkan kod PUK untuk meneruskan. Tinggal <xliff:g id="_NUMBER_0">%d</xliff:g> percubaan sebelum SIM tidak boleh digunakan secara kekal. Hubungi pembawa untuk mendapatkan butiran.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Lalai"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Gelembung"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analog"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml index c816159e7714..28fe2b210cea 100644 --- a/packages/SystemUI/res-keyguard/values-my/strings.xml +++ b/packages/SystemUI/res-keyguard/values-my/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">ဆင်းမ်ကဒ်သည် ယခု ပိတ်သွားပါပြီ။ ရှေ့ဆက်ရန် PUK ကုဒ်ကို ထည့်ပါ။ ဆင်းမ်ကဒ် အပြီးပိတ်မသွားမီ သင့်တွင် <xliff:g id="_NUMBER_1">%d</xliff:g> ကြိမ် စမ်းသပ်ခွင့် ကျန်ပါသေးသည်။ အသေးစိတ်အချက်များအတွက် ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။</item> <item quantity="one">ဆင်းမ်ကဒ်သည် ယခု ပိတ်သွားပါပြီ။ ရှေ့ဆက်ရန် PUK ကုဒ်ကို ထည့်ပါ။ ဆင်းမ်ကဒ် အပြီးပိတ်မသွားမီ သင့်တွင် <xliff:g id="_NUMBER_0">%d</xliff:g> ကြိမ် စမ်းသပ်ခွင့် ကျန်ပါသေးသည်။ အသေးစိတ်အချက်များအတွက် ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"မူလ"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"ပူဖောင်းကွက်"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"လက်တံနာရီ"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml index 60a5d3626428..692dcad14e6e 100644 --- a/packages/SystemUI/res-keyguard/values-nb/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM-kortet er deaktivert nå. Skriv inn PUK-koden for å fortsette. Du har <xliff:g id="_NUMBER_1">%d</xliff:g> forsøk igjen før SIM-kortet blir permanent ubrukelig. Kontakt operatøren for å få vite mer.</item> <item quantity="one">SIM-kortet er deaktivert nå. Skriv inn PUK-koden for å fortsette. Du har <xliff:g id="_NUMBER_0">%d</xliff:g> forsøk igjen før SIM-kortet blir permanent ubrukelig. Kontakt operatøren for å få vite mer.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Standard"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Boble"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analog"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml index 5dcacdfeb747..8102021247b3 100644 --- a/packages/SystemUI/res-keyguard/values-ne/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM लाई असक्षम पारिएको छ। जारी राख्न PUK कोड प्रविष्टि गर्नुहोस्। तपाईंसँग <xliff:g id="_NUMBER_1">%d</xliff:g> प्रयासहरू बाँकी छन्, त्यसपछि SIM सदाका लागि प्रयोग गर्न नमिल्ने हुन्छ। विवरणहरूका लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्।</item> <item quantity="one">SIM लाई असक्षम पारिएको छ। जारी राख्न PUK कोड प्रविष्टि गर्नुहोस्। तपाईंसँग <xliff:g id="_NUMBER_0">%d</xliff:g> प्रयास बाँकी छ, त्यसपछि SIM सदाका लागि प्रयोग गर्न नमिल्ने हुन्छ। विवरणहरूका लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्।</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"पूर्वनिर्धारित"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"बबल"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"एनालग"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml index 7f18008abdb8..c79f2f7a536b 100644 --- a/packages/SystemUI/res-keyguard/values-nl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Je hebt nog <xliff:g id="_NUMBER_1">%d</xliff:g> pogingen over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie.</item> <item quantity="one">De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Je hebt nog <xliff:g id="_NUMBER_0">%d</xliff:g> poging over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Standaard"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bel"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analoog"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml index e1f512380c68..c28561a07fe7 100644 --- a/packages/SystemUI/res-keyguard/values-or/strings.xml +++ b/packages/SystemUI/res-keyguard/values-or/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM କାର୍ଡକୁ ବର୍ତ୍ତମାନ ଅକ୍ଷମ କରିଦିଆଯାଇଛି। ଜାରି ରଖିବାକୁ PUK କୋଡ୍ ଲେଖନ୍ତୁ। ଆଉ <xliff:g id="_NUMBER_1">%d</xliff:g> ଥର ଭୁଲ କୋଡ୍ ଲେଖିବା ପରେ SIM କାର୍ଡ ସ୍ଥାୟୀ ଭାବେ ଅନୁପଯୋଗୀ ହୋଇଯିବ। ବିବରଣୀ ପାଇଁ କେରିଅର୍ର ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।</item> <item quantity="one">SIM କାର୍ଡକୁ ବର୍ତ୍ତମାନ ଅକ୍ଷମ କରିଦିଆଯାଇଛି। ଜାରି ରଖିବାକୁ PUK କୋଡ୍ ଲେଖନ୍ତୁ। ଆଉ <xliff:g id="_NUMBER_0">%d</xliff:g> ଥର ଭୁଲ କୋଡ୍ ଲେଖିବା ପରେ SIM କାର୍ଡ ସ୍ଥାୟୀ ଭାବେ ଅନୁପଯୋଗୀ ହୋଇଯିବ। ବିବରଣୀ ପାଇଁ କେରିଅର୍ର ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"ଡିଫଲ୍ଟ"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"ବବଲ୍"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"ଆନାଲଗ୍"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml index d15936da1eac..01b5d8ef4ba6 100644 --- a/packages/SystemUI/res-keyguard/values-pa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">ਸਿਮ ਹੁਣ ਬੰਦ ਹੋ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਸਿਮ ਦੇ ਪੱਕੇ ਤੌਰ \'ਤੇ ਬੇਕਾਰ ਹੋ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="_NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ ਬਾਕੀ ਹੈ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।</item> <item quantity="other">ਸਿਮ ਹੁਣ ਬੰਦ ਹੋ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਸਿਮ ਦੇ ਪੱਕੇ ਤੌਰ \'ਤੇ ਬੇਕਾਰ ਹੋ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="_NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਕੀ ਹਨ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"ਪੂਰਵ-ਨਿਰਧਾਰਤ"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"ਬੁਲਬੁਲਾ"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"ਐਨਾਲੌਗ"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml index 796e3b46ff71..f86a0824b8aa 100644 --- a/packages/SystemUI/res-keyguard/values-pl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml @@ -167,4 +167,7 @@ <item quantity="other">Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Masz jeszcze <xliff:g id="_NUMBER_1">%d</xliff:g> próby, zanim karta SIM zostanie trwale zablokowana. Aby uzyskać szczegółowe informacje, skontaktuj się z operatorem.</item> <item quantity="one">Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Masz jeszcze <xliff:g id="_NUMBER_0">%d</xliff:g> próbę, zanim karta SIM zostanie trwale zablokowana. Aby uzyskać szczegółowe informacje, skontaktuj się z operatorem.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Domyślna"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bąbelkowy"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogowy"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml index bfd046e1b10b..436dd551df7e 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">O chip agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativa restante antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item> <item quantity="other">O chip agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativas restantes antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Padrão"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bolha"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analógico"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml index ba2b5bcf4853..2ba4268168c0 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais <xliff:g id="_NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes.</item> <item quantity="one">O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais <xliff:g id="_NUMBER_0">%d</xliff:g> tentativa antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Predefinido"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Balão"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analógico"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml index bfd046e1b10b..436dd551df7e 100644 --- a/packages/SystemUI/res-keyguard/values-pt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">O chip agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativa restante antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item> <item quantity="other">O chip agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativas restantes antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Padrão"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bolha"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analógico"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml index bde405c75ef0..6fdc95804129 100644 --- a/packages/SystemUI/res-keyguard/values-ro/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml @@ -159,4 +159,7 @@ <item quantity="other">Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-au mai rămas <xliff:g id="_NUMBER_1">%d</xliff:g> de încercări până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii.</item> <item quantity="one">Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-a mai rămas <xliff:g id="_NUMBER_0">%d</xliff:g> încercare până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Prestabilit"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Balon"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogic"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml index 07718c9eab0a..f9bd05bb3e21 100644 --- a/packages/SystemUI/res-keyguard/values-ru/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml @@ -167,4 +167,7 @@ <item quantity="many">SIM-карта отключена. Чтобы продолжить, введите PUK-код. Осталось <xliff:g id="_NUMBER_1">%d</xliff:g> попыток. После этого SIM-карта будет заблокирована навсегда. За подробной информацией обратитесь к оператору связи.</item> <item quantity="other">SIM-карта отключена. Чтобы продолжить, введите PUK-код. Осталось <xliff:g id="_NUMBER_1">%d</xliff:g> попытки. После этого SIM-карта будет заблокирована навсегда. За подробной информацией обратитесь к оператору связи.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"По умолчанию"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Пузырь"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Стрелки"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml index 253cf61dbd29..e40be057dca6 100644 --- a/packages/SystemUI/res-keyguard/values-si/strings.xml +++ b/packages/SystemUI/res-keyguard/values-si/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">SIM දැන් අබල කර ඇත. දිගටම කරගෙන යාමට PUK කේතය ඇතුළු කරන්න. SIM ස්ථිරවම භාවිත කළ නොහැකි බවට පත් වීමට පෙර ඔබ සතුව උත්සාහයන් <xliff:g id="_NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත. විස්තර සඳහා වාහක සම්බන්ධ කර ගන්න.</item> <item quantity="other">SIM දැන් අබල කර ඇත. දිගටම කරගෙන යාමට PUK කේතය ඇතුළු කරන්න. SIM ස්ථිරවම භාවිත කළ නොහැකි බවට පත් වීමට පෙර ඔබ සතුව උත්සාහයන් <xliff:g id="_NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත. විස්තර සඳහා වාහක සම්බන්ධ කර ගන්න.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"පෙරනිමි"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"බුබුළ"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"ප්රතිසමය"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml index 4a70cbc64079..e7800e955d08 100644 --- a/packages/SystemUI/res-keyguard/values-sk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml @@ -167,4 +167,7 @@ <item quantity="other">SIM karta je deaktivovaná. Pokračujte zadaním kódu PUK. Zostáva vám <xliff:g id="_NUMBER_1">%d</xliff:g> pokusov, potom sa SIM karta natrvalo zablokuje. Podrobnosti vám poskytne operátor.</item> <item quantity="one">SIM karta je deaktivovaná. Pokračujte zadaním kódu PUK. Zostáva vám <xliff:g id="_NUMBER_0">%d</xliff:g> pokus, potom sa SIM karta natrvalo zablokuje. Podrobnosti vám poskytne operátor.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Predvolený"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bublina"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analógový"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml index 0fbcbfca5d87..cce3a3132477 100644 --- a/packages/SystemUI/res-keyguard/values-sl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml @@ -167,4 +167,7 @@ <item quantity="few">Kartica SIM je zdaj onemogočena. Če želite nadaljevati, vnesite kodo PUK. Na voljo imate še <xliff:g id="_NUMBER_1">%d</xliff:g> poskuse. Potem bo kartica SIM postala trajno neuporabna. Za podrobnosti se obrnite na operaterja.</item> <item quantity="other">Kartica SIM je zdaj onemogočena. Če želite nadaljevati, vnesite kodo PUK. Na voljo imate še <xliff:g id="_NUMBER_1">%d</xliff:g> poskusov. Potem bo kartica SIM postala trajno neuporabna. Za podrobnosti se obrnite na operaterja.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Privzeto"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Mehurček"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogno"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml index 80e68bc934e7..e4b37d0f1119 100644 --- a/packages/SystemUI/res-keyguard/values-sq/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">Karta SIM tani është çaktivizuar. Fut kodin PUK për të vazhduar. Të kanë mbetur edhe <xliff:g id="_NUMBER_1">%d</xliff:g> përpjekje përpara se karta SIM të bëhet përgjithmonë e papërdorshme. Kontakto me operatorin për detaje.</item> <item quantity="one">Karta SIM tani është çaktivizuar. Fut kodin PUK për të vazhduar. Të ka mbetur edhe <xliff:g id="_NUMBER_0">%d</xliff:g> përpjekje përpara se karta SIM të bëhet përgjithmonë e papërdorshme. Kontakto me operatorin për detaje.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"E parazgjedhur"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Flluskë"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analoge"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml index 23a30c8d2d31..1e6de94125dd 100644 --- a/packages/SystemUI/res-keyguard/values-sr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml @@ -159,4 +159,7 @@ <item quantity="few">SIM је сада онемогућен. Унесите PUK кôд да бисте наставили. Имате још <xliff:g id="_NUMBER_1">%d</xliff:g> покушаја пре него што SIM постане трајно неупотребљив. Детаљне информације потражите од мобилног оператера.</item> <item quantity="other">SIM је сада онемогућен. Унесите PUK кôд да бисте наставили. Имате још <xliff:g id="_NUMBER_1">%d</xliff:g> покушаја пре него што SIM постане трајно неупотребљив. Детаљне информације потражите од мобилног оператера.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Подразумевани"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Мехурићи"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Аналогни"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml index a9521bc7ab83..4cca1767a89d 100644 --- a/packages/SystemUI/res-keyguard/values-sv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM-kortet är inaktiverat. Ange PUK-koden om du vill fortsätta. <xliff:g id="_NUMBER_1">%d</xliff:g> försök återstår innan SIM-kortet blir obrukbart. Kontakta operatören för mer information.</item> <item quantity="one">SIM-kortet är inaktiverat. Ange PUK-koden om du vill fortsätta. <xliff:g id="_NUMBER_0">%d</xliff:g> försök återstår innan SIM-kortet blir obrukbart. Kontakta operatören för mer information.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Standard"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bubbla"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analog"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml index 5a195351da35..df518596ebfa 100644 --- a/packages/SystemUI/res-keyguard/values-sw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">Sasa SIM imefungwa. Weka msimbo wa PUK ili uendelee. Umesalia na majaribio <xliff:g id="_NUMBER_1">%d</xliff:g> kabla ya SIM kuacha kufanya kazi kabisa. Wasiliana na mtoa huduma kwa maelezo.</item> <item quantity="one">Sasa SIM imefungwa. Weka msimbo wa PUK ili uendelee. Umesalia na jaribio <xliff:g id="_NUMBER_0">%d</xliff:g> kabla ya SIM kuacha kufanya kazi kabisa. Wasiliana na mtoa huduma kwa maelezo.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Chaguomsingi"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Kiputo"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analogi"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml index db23ccced316..9aa1972c9954 100644 --- a/packages/SystemUI/res-keyguard/values-ta/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர்வதற்கு, PUK குறியீட்டை உள்ளிடவும். நீங்கள் <xliff:g id="_NUMBER_1">%d</xliff:g> முறை மட்டுமே முயற்சிக்க முடியும். அதன்பிறகு சிம் நிரந்தரமாக முடக்கப்படும். விவரங்களுக்கு, மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும்.</item> <item quantity="one">சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர்வதற்கு, PUK குறியீட்டை உள்ளிடவும். நீங்கள் <xliff:g id="_NUMBER_0">%d</xliff:g> முறை மட்டுமே முயற்சிக்க முடியும். அதன்பிறகு சிம் நிரந்தரமாக முடக்கப்படும். விவரங்களுக்கு, மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும்.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"இயல்பு"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"பபிள்"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"அனலாக்"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml index 4cc70560db32..925d67302b86 100644 --- a/packages/SystemUI/res-keyguard/values-te/strings.xml +++ b/packages/SystemUI/res-keyguard/values-te/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM ఇప్పుడు నిలిపివేయబడింది. PUK కోడ్ను నమోదు చేయండి. SIM శాశ్వతంగా నిరుపయోగం కాకుండా ఉండటానికి మీకు <xliff:g id="_NUMBER_1">%d</xliff:g> ప్రయత్నాలు మిగిలి ఉన్నాయి. వివరాల కోసం కారియర్ను సంప్రదించండి.</item> <item quantity="one">SIM ఇప్పుడు నిలిపివేయబడింది. PUK కోడ్ను నమోదు చేయండి. SIM శాశ్వతంగా నిరుపయోగం కాకుండా ఉండటానికి మీకు <xliff:g id="_NUMBER_0">%d</xliff:g> ప్రయత్నం మిగిలి ఉంది వివరాల కోసం కారియర్ను సంప్రదించండి.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"డిఫాల్ట్"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"బబుల్"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"ఎనలాగ్"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml index 9ba096a7f646..c439c3279e93 100644 --- a/packages/SystemUI/res-keyguard/values-th/strings.xml +++ b/packages/SystemUI/res-keyguard/values-th/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">ซิมถูกปิดใช้งานในขณะนี้ โปรดป้อนรหัส PUK เพื่อทำต่อ คุณพยายามได้อีก <xliff:g id="_NUMBER_1">%d</xliff:g> ครั้งก่อนที่ซิมจะไม่สามารถใช้งานได้อย่างถาวร โปรดติดต่อสอบถามรายละเอียดจากผู้ให้บริการ</item> <item quantity="one">ซิมถูกปิดใช้งานในขณะนี้ โปรดป้อนรหัส PUK เพื่อทำต่อ คุณพยายามได้อีก <xliff:g id="_NUMBER_0">%d</xliff:g> ครั้งก่อนที่ซิมจะไม่สามารถใช้งานได้อย่างถาวร โปรดติดต่อสอบถามรายละเอียดจากผู้ให้บริการ</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"ค่าเริ่มต้น"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"ลูกโป่ง"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"แอนะล็อก"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml index 4f247c3a361d..a9ca1b627019 100644 --- a/packages/SystemUI/res-keyguard/values-tl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">Naka-disable na ang SIM. Ilagay ang PUK code upang magpatuloy. Mayroon kang <xliff:g id="_NUMBER_1">%d</xliff:g> natitirang pagsubok bago tuluyang hindi magamit ang SIM. Makipag-ugnayan sa carrier para sa mga detalye.</item> <item quantity="other">Naka-disable na ang SIM. Ilagay ang PUK code upang magpatuloy. Mayroon kang <xliff:g id="_NUMBER_1">%d</xliff:g> na natitirang pagsubok bago tuluyang hindi magamit ang SIM. Makipag-ugnayan sa carrier para sa mga detalye.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Default"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bubble"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analog"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml index fc4fa408429c..4e8150501ff0 100644 --- a/packages/SystemUI/res-keyguard/values-tr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM artık devre dışı. Devam etmek için PUK kodunu girin. SIM kalıcı olarak kullanım dışı kalmadan önce <xliff:g id="_NUMBER_1">%d</xliff:g> deneme hakkınız kaldı. Ayrıntılı bilgi için operatörünüzle iletişim kurun.</item> <item quantity="one">SIM artık devre dışı. Devam etmek için PUK kodunu girin. SIM kalıcı olarak kullanım dışı kalmadan önce <xliff:g id="_NUMBER_0">%d</xliff:g> deneme hakkınız kaldı. Ayrıntılı bilgi için operatörünüzle iletişim kurun.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Varsayılan"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Baloncuk"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analog"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml index e3b5256b767c..c683e329f17b 100644 --- a/packages/SystemUI/res-keyguard/values-uk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml @@ -167,4 +167,7 @@ <item quantity="many">SIM-карту заблоковано. Щоб продовжити, введіть PUK-код. Залишилося <xliff:g id="_NUMBER_1">%d</xliff:g> спроб. Після цього SIM-карту буде назавжди заблоковано. Щоб дізнатися більше, зверніться до свого оператора.</item> <item quantity="other">SIM-карту заблоковано. Щоб продовжити, введіть PUK-код. Залишилося <xliff:g id="_NUMBER_1">%d</xliff:g> спроби. Після цього SIM-карту буде назавжди заблоковано. Щоб дізнатися більше, зверніться до свого оператора.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"За умовчанням"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Бульбашковий"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Аналоговий"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml index ed44c0321c8e..96b949bccc3d 100644 --- a/packages/SystemUI/res-keyguard/values-ur/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM اب غیر فعال ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ SIM کے مستقل طور پر ناقابل استعمال ہونے سے پہلے آپ کے پاس <xliff:g id="_NUMBER_1">%d</xliff:g> کوششیں بچی ہیں۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔</item> <item quantity="one">SIM اب غیر فعال ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ SIM کے مستقل طور پر ناقابل استعمال ہونے سے پہلے آپ کے پاس <xliff:g id="_NUMBER_0">%d</xliff:g> کوشش بچی ہے۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"ڈیفالٹ"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"بلبلہ"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"اینالاگ"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml index b78e5bff65c4..80509ac2fab2 100644 --- a/packages/SystemUI/res-keyguard/values-uz/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml @@ -153,4 +153,7 @@ <item quantity="other">SIM karta faolsizlantirildi. Davom etish uchun PUK kodni kiriting. Yana <xliff:g id="_NUMBER_1">%d</xliff:g> marta xato qilsangiz, SIM kartangiz butunlay qulflanadi. Batafsil axborot olish uchun tarmoq operatoriga murojaat qiling.</item> <item quantity="one">SIM karta faolsizlantirildi. Davom etish uchun PUK kodni kiriting. Yana <xliff:g id="_NUMBER_0">%d</xliff:g> marta xato qilsangiz, SIM kartangiz butunlay qulflanadi. Batafsil axborot olish uchun tarmoq operatoriga murojaat qiling.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Odatiy"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Pufaklar"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Analog"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml index 7f51ace8cdd8..b8c199897daa 100644 --- a/packages/SystemUI/res-keyguard/values-vi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM hiện đã bị tắt. Hãy nhập mã PUK để tiếp tục. Bạn còn <xliff:g id="_NUMBER_1">%d</xliff:g> lần thử trước khi SIM vĩnh viễn không sử dụng được. Hãy liên hệ với nhà cung cấp dịch vụ để biết chi tiết.</item> <item quantity="one">SIM hiện đã bị tắt. Hãy nhập mã PUK để tiếp tục. Bạn còn <xliff:g id="_NUMBER_0">%d</xliff:g> lần thử trước khi SIM vĩnh viễn không thể sử dụng được. Hãy liên hệ với nhà cung cấp dịch vụ để biết chi tiết.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Mặc định"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Bong bóng"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"Đồng hồ kim"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml index 7e508240e485..88fc36335f1e 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM 卡现已停用,请输入 PUK 码继续使用。您还可以尝试 <xliff:g id="_NUMBER_1">%d</xliff:g> 次。如果仍不正确,该 SIM 卡将永远无法使用。有关详情,请联系您的运营商。</item> <item quantity="one">SIM 卡现已停用,请输入 PUK 码继续使用。您还可以尝试 <xliff:g id="_NUMBER_0">%d</xliff:g> 次。如果仍不正确,该 SIM 卡将永远无法使用。有关详情,请联系您的运营商。</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"默认"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"泡泡"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"指针"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml index f416cee31572..2d84106f9ba2 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM 卡已停用。請輸入 PUK 碼以繼續進行。您還可以再試 <xliff:g id="_NUMBER_1">%d</xliff:g> 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請與流動網絡供應商聯絡。</item> <item quantity="one">SIM 卡已停用。請輸入 PUK 碼以繼續進行。您還可以再試 <xliff:g id="_NUMBER_0">%d</xliff:g> 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請與流動網絡供應商聯絡。</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"預設"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"泡泡"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"指針"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml index c224e22b66e7..18b94795eee4 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml @@ -151,4 +151,7 @@ <item quantity="other">SIM 卡現在已遭停用。請輸入 PUK 碼以繼續進行。你還可以再試 <xliff:g id="_NUMBER_1">%d</xliff:g> 次,如果仍然失敗,SIM 卡將永久無法使用。詳情請與電信業者聯絡。</item> <item quantity="one">SIM 卡現在已遭停用。請輸入 PUK 碼以繼續進行。你還可以再試 <xliff:g id="_NUMBER_0">%d</xliff:g> 次,如果仍然失敗,SIM 卡將永久無法使用。詳情請與電信業者聯絡。</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"預設"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"泡泡"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"類比"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml index b4351a728289..6a7f6475809e 100644 --- a/packages/SystemUI/res-keyguard/values-zu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml @@ -151,4 +151,7 @@ <item quantity="one">I-SIM manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Unemizamo engu-<xliff:g id="_NUMBER_1">%d</xliff:g> esele ngaphambi kokuthi i-SIM ingasebenziseki unaphakade. Xhumana nenkampani yenethiwekhi ngemininingwane.</item> <item quantity="other">I-SIM manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Unemizamo engu-<xliff:g id="_NUMBER_1">%d</xliff:g> esele ngaphambi kokuthi i-SIM ingasebenziseki unaphakade. Xhumana nenkampani yenethiwekhi ngemininingwane.</item> </plurals> + <string name="clock_title_default" msgid="6645600990069154049">"Okuzenzekelayo"</string> + <string name="clock_title_bubble" msgid="1286365278681892114">"Ibhamuza"</string> + <string name="clock_title_analog" msgid="4047401488577315053">"I-Analog"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml index 8e00efeed62c..f9389ce24d96 100644 --- a/packages/SystemUI/res-keyguard/values/dimens.xml +++ b/packages/SystemUI/res-keyguard/values/dimens.xml @@ -53,8 +53,8 @@ <dimen name="title_clock_padding">4dp</dimen> <!-- Clock with header --> <dimen name="widget_small_font_size">@dimen/widget_title_font_size</dimen> - <dimen name="widget_vertical_padding">24dp</dimen> - <dimen name="widget_vertical_padding_with_header">32dp</dimen> + <dimen name="widget_vertical_padding">17dp</dimen> + <dimen name="widget_vertical_padding_with_header">25dp</dimen> <dimen name="widget_vertical_padding_clock">12dp</dimen> <!-- Subtitle paddings --> <dimen name="widget_horizontal_padding">8dp</dimen> diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml index 9b47e1436ede..0fe7084bb145 100644 --- a/packages/SystemUI/res-keyguard/values/strings.xml +++ b/packages/SystemUI/res-keyguard/values/strings.xml @@ -407,14 +407,11 @@ number">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. number">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact carrier for details.</item> </plurals> - <!-- Title for default clock face that will appear in the picker app next to a preview image of - the clock face. [CHAR LIMIT=8] --> - <string name="clock_title_default" translatable="false">Default</string> - <!-- Title for Bubble clock face that will appear in the picker app next to a preview image of - the clock face. [CHAR LIMIT=8] --> - <string name="clock_title_bubble" translatable="false">Bubble</string> - <!-- Title for Stretch clock face that will appear in the picker app next to a preview image of - the clock face. [CHAR LIMIT=8] --> - <string name="clock_title_analog" translatable="false">Analog</string> + <!-- Name of the "Default" clock face, which is the clock face that will be shown by default. [CHAR LIMIT=15]--> + <string name="clock_title_default">Default</string> + <!-- Name of the "Bubble" clock face, which is an analog clock with hands shaped like large bubbles [CHAR LIMIT=15]--> + <string name="clock_title_bubble">Bubble</string> + <!-- Name of the "Analog" clock face [CHAR LIMIT=15]--> + <string name="clock_title_analog">Analog</string> </resources> diff --git a/core/res/res/anim/lock_lock.xml b/packages/SystemUI/res/anim/lock_lock.xml index 3b8c4855fc8f..3167e7cd616d 100644 --- a/core/res/res/anim/lock_lock.xml +++ b/packages/SystemUI/res/anim/lock_lock.xml @@ -1,17 +1,18 @@ -<!-- Copyright (C) 2019 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. ---> +<!-- + ~ Copyright (C) 2019 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"> <aapt:attr name="android:drawable"> diff --git a/packages/SystemUI/res/anim/lock_lock_circular.xml b/packages/SystemUI/res/anim/lock_lock_circular.xml new file mode 100644 index 000000000000..81694407b640 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_lock_circular.xml @@ -0,0 +1,320 @@ +<?xml version="1.0" encoding="utf-8"?> +<animated-vector xmlns:aapt="http://schemas.android.com/aapt" + xmlns:android="http://schemas.android.com/apk/res/android" > + + <aapt:attr name="android:drawable" > + <vector + android:height="42dp" + android:viewportHeight="42" + android:viewportWidth="32" + android:width="32dp" > + <group android:name="_R_G" > + <group + android:name="_R_G_L_2_G_T_1" + android:translateX="15.999" + android:translateY="24.333" > + <group + android:name="_R_G_L_2_G" + android:translateX="-9.583" + android:translateY="-8.916" > + <path + android:name="_R_G_L_2_G_D_0_P_0" + android:fillAlpha="1" + android:fillColor="#ffffff" + android:fillType="nonZero" + android:pathData=" M17.42 1.75 C17.42,1.75 17.42,14.58 17.42,14.58 C17.42,15.41 16.74,16.08 15.92,16.08 C15.92,16.08 3.25,16.08 3.25,16.08 C2.42,16.08 1.75,15.41 1.75,14.58 C1.75,14.58 1.75,1.75 1.75,1.75 C1.75,1.75 17.42,1.75 17.42,1.75c M18.92 0.25 C18.92,0.25 0.25,0.25 0.25,0.25 C0.25,0.25 0.25,14.58 0.25,14.58 C0.25,16.24 1.59,17.58 3.25,17.58 C3.25,17.58 15.92,17.58 15.92,17.58 C17.57,17.58 18.92,16.24 18.92,14.58 C18.92,14.58 18.92,0.25 18.92,0.25c " /> + </group> + </group> + <group + android:name="_R_G_L_1_G_N_4_T_1" + android:translateX="15.999" + android:translateY="24.333" > + <group + android:name="_R_G_L_1_G_N_4_T_0" + android:translateX="-9.583" + android:translateY="-8.916" > + <group + android:name="_R_G_L_1_G" + android:pivotX="2.25" + android:pivotY="3.334" + android:scaleX="1" + android:scaleY="1" + android:translateX="7.334" + android:translateY="5.333" > + <path + android:name="_R_G_L_1_G_D_0_P_0" + android:fillAlpha="1" + android:fillColor="#ffffff" + android:fillType="nonZero" + android:pathData=" M4.25 2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25 C3.35,0.25 4.25,1.15 4.25,2.25c " /> + <path + android:name="_R_G_L_1_G_D_1_P_0" + android:pathData=" M2.25 2.25 C2.25,2.25 2.25,5.92 2.25,5.92 " + android:strokeAlpha="1" + android:strokeColor="#ffffff" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="1.5" /> + </group> + </group> + </group> + <group + android:name="_R_G_L_0_G_N_4_T_1" + android:translateX="15.999" + android:translateY="24.333" > + <group + android:name="_R_G_L_0_G_N_4_T_0" + android:translateX="-9.583" + android:translateY="-8.916" > + <group + android:name="_R_G_L_0_G" + android:translateX="1.5" + android:translateY="-11.835" > + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:pathData=" M12.42 12.6 C12.42,12.6 12.41,8.16 12.41,8.16 C12.41,5.81 14.36,3.75 16.75,3.77 C19.15,3.78 21.07,5.71 21.07,8.05 C21.07,8.05 21.08,8.22 21.08,8.22 " + android:strokeAlpha="1" + android:strokeColor="#ffffff" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="1.5" /> + </group> + </group> + </group> + </group> + <group android:name="time_group" /> + </vector> + </aapt:attr> + + <target android:name="_R_G_L_2_G_T_1" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="400" + android:propertyName="translateY" + android:startOffset="0" + android:valueFrom="24.333" + android:valueTo="24.333" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:propertyName="translateY" + android:startOffset="400" + android:valueFrom="24.333" + android:valueTo="25.833" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:propertyName="translateY" + android:startOffset="517" + android:valueFrom="25.833" + android:valueTo="24.333" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="450" + android:propertyName="scaleX" + 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.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="450" + android:propertyName="scaleY" + 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.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + android:startOffset="450" + android:valueFrom="1" + android:valueTo="1.05" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + android:startOffset="450" + android:valueFrom="1" + android:valueTo="1.05" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="scaleX" + android:startOffset="533" + android:valueFrom="1.05" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="scaleY" + android:startOffset="533" + android:valueFrom="1.05" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G_N_4_T_1" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="400" + android:propertyName="translateY" + android:startOffset="0" + android:valueFrom="24.333" + android:valueTo="24.333" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:propertyName="translateY" + android:startOffset="400" + android:valueFrom="24.333" + android:valueTo="25.833" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:propertyName="translateY" + android:startOffset="517" + android:valueFrom="25.833" + android:valueTo="24.333" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 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:duration="333" + android:propertyName="pathData" + android:startOffset="0" + android:valueFrom="M12.42 12.6 C12.42,12.6 12.41,8.16 12.41,8.16 C12.41,5.81 14.36,3.75 16.75,3.77 C19.15,3.78 21.07,5.71 21.07,8.05 C21.07,8.05 21.08,8.22 21.08,8.22 " + android:valueTo="M12.42 12.6 C12.42,12.6 12.4,5.86 12.4,5.86 C12.4,3.52 10.46,1.44 8.06,1.44 C5.67,1.44 3.73,3.52 3.73,5.86 C3.73,5.86 3.75,7.41 3.75,7.41 " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.635,0 0.43,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="67" + android:propertyName="pathData" + android:startOffset="333" + android:valueFrom="M12.42 12.6 C12.42,12.6 12.4,5.86 12.4,5.86 C12.4,3.52 10.46,1.44 8.06,1.44 C5.67,1.44 3.73,3.52 3.73,5.86 C3.73,5.86 3.75,7.41 3.75,7.41 " + android:valueTo="M12.42 12.6 C12.42,12.6 12.42,8.17 12.42,8.17 C12.42,5.83 10.48,3.75 8.08,3.75 C5.69,3.75 3.75,5.83 3.75,8.17 C3.75,8.17 3.75,12.6 3.75,12.6 " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.512,0 0.41,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_N_4_T_1" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="400" + android:propertyName="translateY" + android:startOffset="0" + android:valueFrom="24.333" + android:valueTo="24.333" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:propertyName="translateY" + android:startOffset="400" + android:valueFrom="24.333" + android:valueTo="25.833" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:propertyName="translateY" + android:startOffset="517" + android:valueFrom="25.833" + android:valueTo="24.333" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,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:duration="717" + android:propertyName="translateX" + 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/anim/lock_lock_filled.xml b/packages/SystemUI/res/anim/lock_lock_filled.xml new file mode 100644 index 000000000000..017c3299c3b2 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_lock_filled.xml @@ -0,0 +1,215 @@ +<?xml version="1.0" encoding="utf-8"?> +<animated-vector xmlns:aapt="http://schemas.android.com/aapt" + xmlns:android="http://schemas.android.com/apk/res/android" > + + <aapt:attr name="android:drawable" > + <vector + android:height="42dp" + android:viewportHeight="42" + android:viewportWidth="32" + android:width="32dp" > + <group android:name="_R_G" > + <group + android:name="_R_G_L_1_G_T_1" + android:translateX="16" + android:translateY="25" > + <group + android:name="_R_G_L_1_G" + android:translateX="-10.917" + android:translateY="-9.583" > + <path + android:name="_R_G_L_1_G_D_0_P_0" + android:fillAlpha="1" + android:fillColor="#ffffff" + android:fillType="nonZero" + android:pathData=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c " /> + </group> + </group> + <group + android:name="_R_G_L_0_G_N_3_T_1" + android:translateX="16" + android:translateY="25" > + <group + android:name="_R_G_L_0_G_N_3_T_0" + android:translateX="-10.917" + android:translateY="-9.583" > + <group + android:name="_R_G_L_0_G" + android:translateX="9.917000000000002" + android:translateY="-12.75" > + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:pathData=" M13 9 C13,7.9 12.55,6.9 11.83,6.17 C11.1,5.45 10.11,5 9,5 C6.79,5 5,6.79 5,9 C5,9 5,13 5,13 " + android:strokeAlpha="1" + android:strokeColor="#ffffff" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="2" /> + </group> + </group> + </group> + </group> + <group android:name="time_group" /> + </vector> + </aapt:attr> + + <target android:name="_R_G_L_1_G_D_0_P_0" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="450" + android:propertyName="pathData" + android:startOffset="0" + android:valueFrom=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c " + android:valueTo=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="pathData" + android:startOffset="450" + android:valueFrom=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c " + android:valueTo=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.58 C9.27,12.58 7.92,11.23 7.92,9.58 C7.92,7.93 9.27,6.58 10.92,6.58 C12.57,6.58 13.92,7.93 13.92,9.58 C13.92,11.23 12.57,12.58 10.92,12.58c " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="pathData" + android:startOffset="533" + android:valueFrom=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.58 C9.27,12.58 7.92,11.23 7.92,9.58 C7.92,7.93 9.27,6.58 10.92,6.58 C12.57,6.58 13.92,7.93 13.92,9.58 C13.92,11.23 12.57,12.58 10.92,12.58c " + android:valueTo=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G_T_1" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="400" + android:pathData="M 16,25C 16,25.27083334326744 16,25 16,25" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="0" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:pathData="M 16,25C 16,25.27083334326744 16,26.625 16,26.625" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="400" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:pathData="M 16,26.625C 16,26.625 16,25.27083334326744 16,25" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="517" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 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:duration="317" + android:propertyName="pathData" + android:startOffset="0" + android:valueFrom="M13 9 C13,7.9 12.55,6.9 11.83,6.17 C11.1,5.45 10.11,5 9,5 C6.79,5 5,6.79 5,9 C5,9 5,13 5,13 " + android:valueTo="M-3 6.73 C-3,5.62 -2.56,4.67 -1.84,4 C-1.11,3.32 -0.09,2.93 1.06,2.94 C3.27,2.96 5,4.54 5,6.75 C5,6.75 5,13 5,13 " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.637,0 0.437,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="133" + android:propertyName="pathData" + android:startOffset="317" + android:valueFrom="M-3 6.73 C-3,5.62 -2.56,4.67 -1.84,4 C-1.11,3.32 -0.09,2.93 1.06,2.94 C3.27,2.96 5,4.54 5,6.75 C5,6.75 5,13 5,13 " + android:valueTo="M-3 13.04 C-3,13.04 -3,9.04 -3,9.04 C-3,6.83 -1.25,5.05 0.69,5.01 C2.9,4.97 5,6.79 5,9 C5,9 5,13 5,13 " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.497,0 0.408,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_N_3_T_1" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="400" + android:pathData="M 16,25C 16,25.27083334326744 16,25 16,25" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="0" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:pathData="M 16,25C 16,25.27083334326744 16,26.625 16,26.625" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="400" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:pathData="M 16,26.625C 16,26.625 16,25.27083334326744 16,25" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="517" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,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:duration="717" + android:propertyName="translateX" + 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/anim/lock_lock_rounded.xml b/packages/SystemUI/res/anim/lock_lock_rounded.xml new file mode 100644 index 000000000000..fc4545c4323d --- /dev/null +++ b/packages/SystemUI/res/anim/lock_lock_rounded.xml @@ -0,0 +1,314 @@ +<?xml version="1.0" encoding="utf-8"?> +<animated-vector xmlns:aapt="http://schemas.android.com/aapt" + xmlns:android="http://schemas.android.com/apk/res/android" > + + <aapt:attr name="android:drawable" > + <vector + android:height="42dp" + android:viewportHeight="42" + android:viewportWidth="32" + android:width="32dp" > + <group android:name="_R_G" > + <group + android:name="_R_G_L_2_G_T_1" + android:translateX="16" + android:translateY="25" > + <group + android:name="_R_G_L_2_G" + android:translateX="-14.667" + android:translateY="-12.667" > + <path + android:name="_R_G_L_2_G_D_0_P_0" + android:pathData=" M22.09 5 C22.09,5 6,5 6,5 C5.45,5 5,5.45 5,6 C5,6 5,19.33 5,19.33 C5,19.89 5.45,20.33 6,20.33 C6,20.33 23.33,20.33 23.33,20.33 C23.89,20.33 24.33,19.89 24.33,19.33 C24.33,19.33 24.33,6 24.33,6 C24.33,5.45 23.89,5 23.33,5 C23.33,5 22.09,5 22.09,5c " + android:strokeAlpha="1" + android:strokeColor="#ffffff" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="1.5" /> + </group> + </group> + <group + android:name="_R_G_L_1_G_N_5_T_1" + android:translateX="16" + android:translateY="25" > + <group + android:name="_R_G_L_1_G_N_5_T_0" + android:translateX="-14.667" + android:translateY="-12.667" > + <group + android:name="_R_G_L_1_G" + android:pivotX="2.25" + android:pivotY="2.25" + android:scaleX="1" + android:scaleY="1" + android:translateX="12.416" + android:translateY="10.417" > + <path + android:name="_R_G_L_1_G_D_0_P_0" + android:fillAlpha="1" + android:fillColor="#ffffff" + android:fillType="nonZero" + android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c " /> + </group> + </group> + </group> + <group + android:name="_R_G_L_0_G_N_5_T_1" + android:translateX="16" + android:translateY="25" > + <group + android:name="_R_G_L_0_G_N_5_T_0" + android:translateX="-14.667" + android:translateY="-12.667" > + <group + android:name="_R_G_L_0_G" + android:translateX="5.333" + android:translateY="-9.425999999999998" > + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:pathData=" M13.67 13.8 C13.67,13.8 13.67,8.94 13.67,8.94 C13.68,6.62 15.69,5.03 18.01,5.04 C20.46,5.04 22.32,6.89 22.34,8.85 C22.34,8.85 22.33,8.89 22.33,8.89 " + android:strokeAlpha="1" + android:strokeColor="#ffffff" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="1.5" /> + </group> + </group> + </group> + </group> + <group android:name="time_group" /> + </vector> + </aapt:attr> + + <target android:name="_R_G_L_2_G_T_1" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="400" + android:pathData="M 16,25C 16,25.35416665673256 16,25 16,25" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="0" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:pathData="M 16,25C 16,25.35416665673256 16,27.125 16,27.125" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="400" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:pathData="M 16,27.125C 16,27.125 16,25.35416665673256 16,25" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="517" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="450" + android:propertyName="scaleX" + 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.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="450" + android:propertyName="scaleY" + 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.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + android:startOffset="450" + android:valueFrom="1" + android:valueTo="1.12" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + android:startOffset="450" + android:valueFrom="1" + android:valueTo="1.12" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="scaleX" + android:startOffset="533" + android:valueFrom="1.12" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="scaleY" + android:startOffset="533" + android:valueFrom="1.12" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G_N_5_T_1" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="400" + android:pathData="M 16,25C 16,25.35416665673256 16,25 16,25" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="0" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:pathData="M 16,25C 16,25.35416665673256 16,27.125 16,27.125" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="400" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:pathData="M 16,27.125C 16,27.125 16,25.35416665673256 16,25" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="517" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 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:duration="317" + android:propertyName="pathData" + android:startOffset="0" + android:valueFrom="M13.67 13.8 C13.67,13.8 13.67,8.94 13.67,8.94 C13.68,6.62 15.69,5.03 18.01,5.04 C20.46,5.04 22.32,6.89 22.34,8.85 C22.34,8.85 22.33,8.89 22.33,8.89 " + android:valueTo="M13.67 13.8 C13.67,13.8 13.69,5.06 13.69,5.06 C13.65,2.87 11.71,1.13 9.35,1.16 C7,1.13 5.06,2.87 5.02,5.06 C5.02,5.06 5,7.93 5,7.93 " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.825,0 0.321,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="133" + android:propertyName="pathData" + android:startOffset="317" + android:valueFrom="M13.67 13.8 C13.67,13.8 13.69,5.06 13.69,5.06 C13.65,2.87 11.71,1.13 9.35,1.16 C7,1.13 5.06,2.87 5.02,5.06 C5.02,5.06 5,7.93 5,7.93 " + android:valueTo="M13.67 13.8 C13.67,13.8 13.67,8.94 13.67,8.94 C13.63,6.75 11.69,5 9.33,5.04 C6.98,5 5.04,6.75 5,8.94 C5,8.94 5,13.8 5,13.8 " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.683,0 0.342,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_N_5_T_1" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="400" + android:pathData="M 16,25C 16,25.35416665673256 16,25 16,25" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="0" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:pathData="M 16,25C 16,25.35416665673256 16,27.125 16,27.125" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="400" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:pathData="M 16,27.125C 16,27.125 16,25.35416665673256 16,25" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="517" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,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:duration="717" + android:propertyName="translateX" + 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/core/res/res/anim/lock_scanning.xml b/packages/SystemUI/res/anim/lock_scanning.xml index db7972f542b3..db7972f542b3 100644 --- a/core/res/res/anim/lock_scanning.xml +++ b/packages/SystemUI/res/anim/lock_scanning.xml diff --git a/packages/SystemUI/res/anim/lock_scanning_circular.xml b/packages/SystemUI/res/anim/lock_scanning_circular.xml new file mode 100644 index 000000000000..9468213562f4 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_scanning_circular.xml @@ -0,0 +1,537 @@ +<?xml version="1.0" encoding="utf-8"?> +<animated-vector xmlns:aapt="http://schemas.android.com/aapt" + xmlns:android="http://schemas.android.com/apk/res/android" > + + <aapt:attr name="android:drawable" > + <vector + android:height="42dp" + android:viewportHeight="42" + android:viewportWidth="32" + android:width="32dp" > + <group android:name="_R_G" > + <group + android:name="_R_G_L_2_G" + android:pivotX="9.583" + android:pivotY="8.916" + android:scaleX="1" + android:scaleY="1" + android:translateX="6.416" + android:translateY="15.416999999999998" > + <path + android:name="_R_G_L_2_G_D_0_P_0" + android:fillAlpha="1" + android:fillColor="#ffffff" + android:fillType="nonZero" + android:pathData=" M17.42 1.75 C17.42,1.75 17.42,14.58 17.42,14.58 C17.42,15.41 16.74,16.08 15.92,16.08 C15.92,16.08 3.25,16.08 3.25,16.08 C2.42,16.08 1.75,15.41 1.75,14.58 C1.75,14.58 1.75,1.75 1.75,1.75 C1.75,1.75 17.42,1.75 17.42,1.75c M18.92 0.25 C18.92,0.25 0.25,0.25 0.25,0.25 C0.25,0.25 0.25,14.58 0.25,14.58 C0.25,16.24 1.59,17.58 3.25,17.58 C3.25,17.58 15.92,17.58 15.92,17.58 C17.57,17.58 18.92,16.24 18.92,14.58 C18.92,14.58 18.92,0.25 18.92,0.25c " /> + </group> + <group + android:name="_R_G_L_1_G_N_3_T_0" + android:pivotX="9.583" + android:pivotY="8.916" + android:scaleX="1" + android:scaleY="1" + android:translateX="6.416" + android:translateY="15.416999999999998" > + <group + android:name="_R_G_L_1_G" + android:pivotX="2.25" + android:pivotY="3.334" + android:scaleX="1" + android:scaleY="1" + android:translateX="7.334" + android:translateY="5.333" > + <path + android:name="_R_G_L_1_G_D_0_P_0" + android:fillAlpha="1" + android:fillColor="#ffffff" + android:fillType="nonZero" + android:pathData=" M4.25 2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25 C3.35,0.25 4.25,1.15 4.25,2.25c " /> + <path + android:name="_R_G_L_1_G_D_1_P_0" + android:pathData=" M2.25 2.25 C2.25,2.25 2.25,5.92 2.25,5.92 " + android:strokeAlpha="1" + android:strokeColor="#ffffff" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="1.5" /> + </group> + </group> + <group + android:name="_R_G_L_0_G_N_3_T_0" + android:pivotX="9.583" + android:pivotY="8.916" + android:scaleX="1" + android:scaleY="1" + android:translateX="6.416" + android:translateY="15.416999999999998" > + <group + android:name="_R_G_L_0_G_T_1" + android:translateX="9.583" + android:translateY="-3.662" > + <group + android:name="_R_G_L_0_G" + android:translateX="-8.083" + android:translateY="-8.173" > + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:pathData=" M12.42 12.6 C12.42,12.6 12.42,8.17 12.42,8.17 C12.42,5.83 10.48,3.75 8.08,3.75 C5.69,3.75 3.75,5.83 3.75,8.17 C3.75,8.17 3.75,12.6 3.75,12.6 " + android:strokeAlpha="1" + android:strokeColor="#ffffff" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="1.5" /> + </group> + </group> + </group> + </group> + <group android:name="time_group" /> + </vector> + </aapt:attr> + + <target android:name="_R_G_L_2_G" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + 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.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + 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.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + android:startOffset="83" + android:valueFrom="1" + android:valueTo="0.9500000000000001" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + android:startOffset="83" + android:valueFrom="1" + android:valueTo="0.9500000000000001" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="183" + android:propertyName="scaleX" + android:startOffset="167" + android:valueFrom="0.9500000000000001" + android:valueTo="1.2" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.461,0 0.526,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="183" + android:propertyName="scaleY" + android:startOffset="167" + android:valueFrom="0.9500000000000001" + android:valueTo="1.2" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.461,0 0.526,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="scaleX" + android:startOffset="350" + android:valueFrom="1.2" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.428,0 0.532,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="scaleY" + android:startOffset="350" + android:valueFrom="1.2" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.428,0 0.532,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="150" + android:propertyName="scaleX" + 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.613,0 0.396,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="150" + android:propertyName="scaleY" + 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.613,0 0.396,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:propertyName="scaleX" + android:startOffset="150" + android:valueFrom="1" + android:valueTo="0.6" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.613,0 0.396,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:propertyName="scaleY" + android:startOffset="150" + android:valueFrom="1" + android:valueTo="0.6" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.613,0 0.396,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="317" + android:propertyName="scaleX" + android:startOffset="267" + android:valueFrom="0.6" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.429,0 0.613,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="317" + android:propertyName="scaleY" + android:startOffset="267" + android:valueFrom="0.6" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.429,0 0.613,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G_N_3_T_0" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + 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.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + 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.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + android:startOffset="83" + android:valueFrom="1" + android:valueTo="0.9500000000000001" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + android:startOffset="83" + android:valueFrom="1" + android:valueTo="0.9500000000000001" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="183" + android:propertyName="scaleX" + android:startOffset="167" + android:valueFrom="0.9500000000000001" + android:valueTo="1.2" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.461,0 0.526,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="183" + android:propertyName="scaleY" + android:startOffset="167" + android:valueFrom="0.9500000000000001" + android:valueTo="1.2" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.461,0 0.526,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="scaleX" + android:startOffset="350" + android:valueFrom="1.2" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.428,0 0.532,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="scaleY" + android:startOffset="350" + android:valueFrom="1.2" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.428,0 0.532,1 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:duration="83" + android:propertyName="pathData" + android:startOffset="0" + android:valueFrom="M12.42 12.6 C12.42,12.6 12.42,8.17 12.42,8.17 C12.42,5.83 10.48,3.75 8.08,3.75 C5.69,3.75 3.75,5.83 3.75,8.17 C3.75,8.17 3.75,12.6 3.75,12.6 " + android:valueTo="M12.42 12.6 C12.42,12.6 12.42,8.17 12.42,8.17 C12.42,5.83 10.48,3.75 8.08,3.75 C5.69,3.75 3.75,5.83 3.75,8.17 C3.75,8.17 3.75,12.6 3.75,12.6 " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="pathData" + android:startOffset="83" + android:valueFrom="M12.42 12.6 C12.42,12.6 12.42,8.17 12.42,8.17 C12.42,5.83 10.48,3.75 8.08,3.75 C5.69,3.75 3.75,5.83 3.75,8.17 C3.75,8.17 3.75,12.6 3.75,12.6 " + android:valueTo="M12.39 9.16 C12.39,9.16 12.42,8.17 12.42,8.17 C12.42,5.83 10.48,3.75 8.08,3.75 C5.69,3.75 3.75,5.83 3.75,8.17 C3.75,8.17 3.73,9.16 3.73,9.16 " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="pathData" + android:startOffset="250" + android:valueFrom="M12.39 9.16 C12.39,9.16 12.42,8.17 12.42,8.17 C12.42,5.83 10.48,3.75 8.08,3.75 C5.69,3.75 3.75,5.83 3.75,8.17 C3.75,8.17 3.73,9.16 3.73,9.16 " + android:valueTo="M12.42 12.6 C12.42,12.6 12.42,8.17 12.42,8.17 C12.42,5.83 10.48,3.75 8.08,3.75 C5.69,3.75 3.75,5.83 3.75,8.17 C3.75,8.17 3.75,12.6 3.75,12.6 " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_T_1" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="83" + android:pathData="M 9.583,-3.662C 9.583,-3.03073584985733 9.583,-3.662 9.583,-3.662" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="0" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:pathData="M 9.583,-3.662C 9.583,-3.03073584985733 9.583,0.126 9.583,0.126" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="83" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:pathData="M 9.583,0.126C 9.583,0.126 9.583,-3.03073584985733 9.583,-3.662" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="250" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_N_3_T_0" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + 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.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + 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.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + android:startOffset="83" + android:valueFrom="1" + android:valueTo="0.9500000000000001" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + android:startOffset="83" + android:valueFrom="1" + android:valueTo="0.9500000000000001" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="183" + android:propertyName="scaleX" + android:startOffset="167" + android:valueFrom="0.9500000000000001" + android:valueTo="1.2" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.461,0 0.526,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="183" + android:propertyName="scaleY" + android:startOffset="167" + android:valueFrom="0.9500000000000001" + android:valueTo="1.2" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.461,0 0.526,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="scaleX" + android:startOffset="350" + android:valueFrom="1.2" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.428,0 0.532,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="scaleY" + android:startOffset="350" + android:valueFrom="1.2" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.428,0 0.532,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:duration="717" + android:propertyName="translateX" + 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/anim/lock_scanning_filled.xml b/packages/SystemUI/res/anim/lock_scanning_filled.xml new file mode 100644 index 000000000000..83ac8ad205f7 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_scanning_filled.xml @@ -0,0 +1,339 @@ +<?xml version="1.0" encoding="utf-8"?> +<animated-vector xmlns:aapt="http://schemas.android.com/aapt" + xmlns:android="http://schemas.android.com/apk/res/android" > + + <aapt:attr name="android:drawable" > + <vector + android:height="42dp" + android:viewportHeight="42" + android:viewportWidth="32" + android:width="32dp" > + <group android:name="_R_G" > + <group + android:name="_R_G_L_1_G" + android:pivotX="10.917" + android:pivotY="9.583" + android:scaleX="1" + android:scaleY="1" + android:translateX="5.083" + android:translateY="15.417" > + <path + android:name="_R_G_L_1_G_D_0_P_0" + android:fillAlpha="1" + android:fillColor="#ffffff" + android:fillType="nonZero" + android:pathData=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c " /> + </group> + <group + android:name="_R_G_L_0_G_N_2_T_0" + android:pivotX="10.917" + android:pivotY="9.583" + android:scaleX="1" + android:scaleY="1" + android:translateX="5.083" + android:translateY="15.417" > + <group + android:name="_R_G_L_0_G_T_1" + android:translateX="10.917" + android:translateY="-3.75" > + <group + android:name="_R_G_L_0_G" + android:translateX="-9" + android:translateY="-9" > + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:pathData=" M13 13 C13,13 13,9 13,9 C13,6.79 11.21,5 9,5 C6.79,5 5,6.79 5,9 C5,9 5,13 5,13 " + android:strokeAlpha="1" + android:strokeColor="#ffffff" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="2" /> + </group> + </group> + </group> + </group> + <group android:name="time_group" /> + </vector> + </aapt:attr> + + <target android:name="_R_G_L_1_G_D_0_P_0" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="150" + android:propertyName="pathData" + android:startOffset="0" + android:valueFrom=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c " + android:valueTo=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:propertyName="pathData" + android:startOffset="150" + android:valueFrom=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c " + android:valueTo=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 11.4 C9.91,11.4 9.1,10.59 9.1,9.58 C9.1,8.58 9.91,7.76 10.92,7.76 C11.92,7.76 12.74,8.58 12.74,9.58 C12.74,10.59 11.92,11.4 10.92,11.4c " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="317" + android:propertyName="pathData" + android:startOffset="267" + android:valueFrom=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 11.4 C9.91,11.4 9.1,10.59 9.1,9.58 C9.1,8.58 9.91,7.76 10.92,7.76 C11.92,7.76 12.74,8.58 12.74,9.58 C12.74,10.59 11.92,11.4 10.92,11.4c " + android:valueTo=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + 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.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + 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.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + android:startOffset="83" + android:valueFrom="1" + android:valueTo="0.9500000000000001" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + android:startOffset="83" + android:valueFrom="1" + android:valueTo="0.9500000000000001" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="183" + android:propertyName="scaleX" + android:startOffset="167" + android:valueFrom="0.9500000000000001" + android:valueTo="1.2" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.461,0 0.526,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="183" + android:propertyName="scaleY" + android:startOffset="167" + android:valueFrom="0.9500000000000001" + android:valueTo="1.2" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.461,0 0.526,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="scaleX" + android:startOffset="350" + android:valueFrom="1.2" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.428,0 0.532,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="scaleY" + android:startOffset="350" + android:valueFrom="1.2" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.428,0 0.532,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_T_1" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="83" + android:pathData="M 10.917,-3.75C 10.917,-3.13846284151077 10.917,-3.75 10.917,-3.75" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="0" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:pathData="M 10.917,-3.75C 10.917,-3.13846284151077 10.917,-0.081 10.917,-0.081" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="83" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:pathData="M 10.917,-0.081C 10.917,-0.081 10.917,-3.13846284151077 10.917,-3.75" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="250" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_N_2_T_0" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + 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.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + 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.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + android:startOffset="83" + android:valueFrom="1" + android:valueTo="0.9500000000000001" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + android:startOffset="83" + android:valueFrom="1" + android:valueTo="0.9500000000000001" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="183" + android:propertyName="scaleX" + android:startOffset="167" + android:valueFrom="0.9500000000000001" + android:valueTo="1.2" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.461,0 0.526,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="183" + android:propertyName="scaleY" + android:startOffset="167" + android:valueFrom="0.9500000000000001" + android:valueTo="1.2" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.461,0 0.526,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="scaleX" + android:startOffset="350" + android:valueFrom="1.2" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.428,0 0.532,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="scaleY" + android:startOffset="350" + android:valueFrom="1.2" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.428,0 0.532,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:duration="717" + android:propertyName="translateX" + 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/anim/lock_scanning_rounded.xml b/packages/SystemUI/res/anim/lock_scanning_rounded.xml new file mode 100644 index 000000000000..983549230b54 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_scanning_rounded.xml @@ -0,0 +1,531 @@ +<?xml version="1.0" encoding="utf-8"?> +<animated-vector xmlns:aapt="http://schemas.android.com/aapt" + xmlns:android="http://schemas.android.com/apk/res/android" > + + <aapt:attr name="android:drawable" > + <vector + android:height="38dp" + android:viewportHeight="38" + android:viewportWidth="32" + android:width="32dp" > + <group android:name="_R_G" > + <group + android:name="_R_G_L_2_G" + android:pivotX="14.667" + android:pivotY="12.667" + android:scaleX="1" + android:scaleY="1" + android:translateX="1.3330000000000002" + android:translateY="10.333" > + <path + android:name="_R_G_L_2_G_D_0_P_0" + android:pathData=" M22.09 5 C22.09,5 6,5 6,5 C5.45,5 5,5.45 5,6 C5,6 5,19.33 5,19.33 C5,19.89 5.45,20.33 6,20.33 C6,20.33 23.33,20.33 23.33,20.33 C23.89,20.33 24.33,19.89 24.33,19.33 C24.33,19.33 24.33,6 24.33,6 C24.33,5.45 23.89,5 23.33,5 C23.33,5 22.09,5 22.09,5c " + android:strokeAlpha="1" + android:strokeColor="#ffffff" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="1.5" /> + </group> + <group + android:name="_R_G_L_1_G_N_4_T_0" + android:pivotX="14.667" + android:pivotY="12.667" + android:scaleX="1" + android:scaleY="1" + android:translateX="1.3330000000000002" + android:translateY="10.333" > + <group + android:name="_R_G_L_1_G" + android:pivotX="2.25" + android:pivotY="2.25" + android:scaleX="1" + android:scaleY="1" + android:translateX="12.416" + android:translateY="10.417" > + <path + android:name="_R_G_L_1_G_D_0_P_0" + android:fillAlpha="1" + android:fillColor="#ffffff" + android:fillType="nonZero" + android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c " /> + </group> + </group> + <group + android:name="_R_G_L_0_G_N_4_T_0" + android:pivotX="14.667" + android:pivotY="12.667" + android:scaleX="1" + android:scaleY="1" + android:translateX="1.3330000000000002" + android:translateY="10.333" > + <group + android:name="_R_G_L_0_G_T_1" + android:translateX="14.666" + android:translateY="0.287" > + <group + android:name="_R_G_L_0_G" + android:translateX="-9.333" + android:translateY="-9.713" > + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:pathData=" M13.67 13.8 C13.67,13.8 13.67,8.94 13.67,8.94 C13.63,6.75 11.69,5 9.33,5.04 C6.98,5 5.04,6.75 5,8.94 C5,8.94 5,13.8 5,13.8 " + android:strokeAlpha="1" + android:strokeColor="#ffffff" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="1.5" /> + </group> + </group> + </group> + </group> + <group android:name="time_group" /> + </vector> + </aapt:attr> + + <target android:name="_R_G_L_2_G" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + 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.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + 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.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + android:startOffset="83" + android:valueFrom="1" + android:valueTo="0.9500000000000001" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + android:startOffset="83" + android:valueFrom="1" + android:valueTo="0.9500000000000001" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="183" + android:propertyName="scaleX" + android:startOffset="167" + android:valueFrom="0.9500000000000001" + android:valueTo="1.2" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.461,0 0.526,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="183" + android:propertyName="scaleY" + android:startOffset="167" + android:valueFrom="0.9500000000000001" + android:valueTo="1.2" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.461,0 0.526,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="scaleX" + android:startOffset="350" + android:valueFrom="1.2" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.428,0 0.397,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="scaleY" + android:startOffset="350" + android:valueFrom="1.2" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.428,0 0.397,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="150" + android:propertyName="scaleX" + 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.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="150" + android:propertyName="scaleY" + 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.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:propertyName="scaleX" + android:startOffset="150" + android:valueFrom="1" + android:valueTo="0.8" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="117" + android:propertyName="scaleY" + android:startOffset="150" + android:valueFrom="1" + android:valueTo="0.8" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="317" + android:propertyName="scaleX" + android:startOffset="267" + android:valueFrom="0.8" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="317" + android:propertyName="scaleY" + android:startOffset="267" + android:valueFrom="0.8" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G_N_4_T_0" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + 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.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + 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.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + android:startOffset="83" + android:valueFrom="1" + android:valueTo="0.9500000000000001" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + android:startOffset="83" + android:valueFrom="1" + android:valueTo="0.9500000000000001" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="183" + android:propertyName="scaleX" + android:startOffset="167" + android:valueFrom="0.9500000000000001" + android:valueTo="1.2" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.461,0 0.526,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="183" + android:propertyName="scaleY" + android:startOffset="167" + android:valueFrom="0.9500000000000001" + android:valueTo="1.2" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.461,0 0.526,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="scaleX" + android:startOffset="350" + android:valueFrom="1.2" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.428,0 0.397,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="scaleY" + android:startOffset="350" + android:valueFrom="1.2" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.428,0 0.397,1 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:duration="83" + android:propertyName="pathData" + android:startOffset="0" + android:valueFrom="M13.67 13.8 C13.67,13.8 13.67,8.94 13.67,8.94 C13.63,6.75 11.69,5 9.33,5.04 C6.98,5 5.04,6.75 5,8.94 C5,8.94 5,13.8 5,13.8 " + android:valueTo="M13.67 13.8 C13.67,13.8 13.67,8.94 13.67,8.94 C13.63,6.75 11.69,5 9.33,5.04 C6.98,5 5.04,6.75 5,8.94 C5,8.94 5,13.8 5,13.8 " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="pathData" + android:startOffset="83" + android:valueFrom="M13.67 13.8 C13.67,13.8 13.67,8.94 13.67,8.94 C13.63,6.75 11.69,5 9.33,5.04 C6.98,5 5.04,6.75 5,8.94 C5,8.94 5,13.8 5,13.8 " + android:valueTo="M13.7 10.21 C13.7,10.21 13.67,8.94 13.67,8.94 C13.63,6.75 11.69,5 9.33,5.04 C6.98,5 5.04,6.75 5,8.94 C5,8.94 5.03,10.21 5.03,10.21 " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="pathData" + android:startOffset="250" + android:valueFrom="M13.7 10.21 C13.7,10.21 13.67,8.94 13.67,8.94 C13.63,6.75 11.69,5 9.33,5.04 C6.98,5 5.04,6.75 5,8.94 C5,8.94 5.03,10.21 5.03,10.21 " + android:valueTo="M13.67 13.8 C13.67,13.8 13.67,8.94 13.67,8.94 C13.63,6.75 11.69,5 9.33,5.04 C6.98,5 5.04,6.75 5,8.94 C5,8.94 5,13.8 5,13.8 " + android:valueType="pathType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_T_1" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="83" + android:pathData="M 14.666,0.287C 14.666,0.8689466710090599 14.666,0.287 14.666,0.287" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="0" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:pathData="M 14.666,0.287C 14.666,0.8689466710090599 14.666,3.779 14.666,3.779" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="83" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:pathData="M 14.666,3.779C 14.666,3.779 14.666,0.8689466710090599 14.666,0.287" + android:propertyName="translateXY" + android:propertyXName="translateX" + android:propertyYName="translateY" + android:startOffset="250" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_N_4_T_0" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + 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.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + 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.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleX" + android:startOffset="83" + android:valueFrom="1" + android:valueTo="0.9500000000000001" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="83" + android:propertyName="scaleY" + android:startOffset="83" + android:valueFrom="1" + android:valueTo="0.9500000000000001" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.36,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="183" + android:propertyName="scaleX" + android:startOffset="167" + android:valueFrom="0.9500000000000001" + android:valueTo="1.2" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.461,0 0.526,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="183" + android:propertyName="scaleY" + android:startOffset="167" + android:valueFrom="0.9500000000000001" + android:valueTo="1.2" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.461,0 0.526,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="scaleX" + android:startOffset="350" + android:valueFrom="1.2" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.428,0 0.397,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="233" + android:propertyName="scaleY" + android:startOffset="350" + android:valueFrom="1.2" + android:valueTo="1" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.428,0 0.397,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:duration="717" + android:propertyName="translateX" + 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/core/res/res/anim/lock_to_error.xml b/packages/SystemUI/res/anim/lock_to_error.xml index e356f26dde59..e356f26dde59 100644 --- a/core/res/res/anim/lock_to_error.xml +++ b/packages/SystemUI/res/anim/lock_to_error.xml diff --git a/packages/SystemUI/res/anim/lock_to_error_circular.xml b/packages/SystemUI/res/anim/lock_to_error_circular.xml new file mode 100644 index 000000000000..9a847232d80b --- /dev/null +++ b/packages/SystemUI/res/anim/lock_to_error_circular.xml @@ -0,0 +1,276 @@ +<?xml version="1.0" encoding="utf-8"?> +<animated-vector xmlns:aapt="http://schemas.android.com/aapt" + xmlns:android="http://schemas.android.com/apk/res/android" > + + <aapt:attr name="android:drawable" > + <vector + android:height="32dp" + android:viewportHeight="32" + android:viewportWidth="32" + android:width="32dp" > + <group android:name="_R_G" > + <group + android:name="_R_G_L_2_G" + android:pivotX="9.583" + android:pivotY="8.916" + android:rotation="0" + android:translateX="6.416" + android:translateY="10.416999999999998" > + <path + android:name="_R_G_L_2_G_D_0_P_0" + android:fillAlpha="1" + android:fillColor="#ffffff" + android:fillType="nonZero" + android:pathData=" M17.42 1.75 C17.42,1.75 17.42,14.58 17.42,14.58 C17.42,15.41 16.74,16.08 15.92,16.08 C15.92,16.08 3.25,16.08 3.25,16.08 C2.42,16.08 1.75,15.41 1.75,14.58 C1.75,14.58 1.75,1.75 1.75,1.75 C1.75,1.75 17.42,1.75 17.42,1.75c M18.92 0.25 C18.92,0.25 0.25,0.25 0.25,0.25 C0.25,0.25 0.25,14.58 0.25,14.58 C0.25,16.24 1.59,17.58 3.25,17.58 C3.25,17.58 15.92,17.58 15.92,17.58 C17.57,17.58 18.92,16.24 18.92,14.58 C18.92,14.58 18.92,0.25 18.92,0.25c " /> + </group> + <group + android:name="_R_G_L_1_G_N_3_T_0" + android:pivotX="9.583" + android:pivotY="8.916" + android:rotation="0" + android:translateX="6.416" + android:translateY="10.416999999999998" > + <group + android:name="_R_G_L_1_G" + android:translateX="7.334" + android:translateY="5.333" > + <path + android:name="_R_G_L_1_G_D_0_P_0" + android:fillAlpha="1" + android:fillColor="#ffffff" + android:fillType="nonZero" + android:pathData=" M4.25 2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25 C3.35,0.25 4.25,1.15 4.25,2.25c " /> + <path + android:name="_R_G_L_1_G_D_1_P_0" + android:pathData=" M2.25 2.25 C2.25,2.25 2.25,5.92 2.25,5.92 " + android:strokeAlpha="1" + android:strokeColor="#ffffff" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="1.5" /> + </group> + </group> + <group + android:name="_R_G_L_0_G_N_3_T_0" + android:pivotX="9.583" + android:pivotY="8.916" + android:rotation="0" + android:translateX="6.416" + android:translateY="10.416999999999998" > + <group + android:name="_R_G_L_0_G" + android:translateX="1.5" + android:translateY="-11.835" > + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:pathData=" M12.42 12.6 C12.42,12.6 12.42,8.17 12.42,8.17 C12.42,5.83 10.48,3.75 8.08,3.75 C5.69,3.75 3.75,5.83 3.75,8.17 C3.75,8.17 3.75,12.6 3.75,12.6 " + android:strokeAlpha="1" + android:strokeColor="#ffffff" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="1.5" /> + </group> + </group> + </group> + <group android:name="time_group" /> + </vector> + </aapt:attr> + + <target android:name="_R_G_L_2_G" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="133" + android:propertyName="rotation" + 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.44,0 0.601,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="120" + android:propertyName="rotation" + android:startOffset="133" + android:valueFrom="0" + android:valueTo="-10" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.44,0 0.601,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="97" + android:propertyName="rotation" + android:startOffset="253" + android:valueFrom="-10" + android:valueTo="10" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.531,0 0.389,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="rotation" + android:startOffset="350" + android:valueFrom="10" + android:valueTo="-5" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.499,0 0.489,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="rotation" + android:startOffset="450" + android:valueFrom="-5" + android:valueTo="0" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.293,0 0.689,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G_N_3_T_0" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="133" + android:propertyName="rotation" + 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.44,0 0.601,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="120" + android:propertyName="rotation" + android:startOffset="133" + android:valueFrom="0" + android:valueTo="-10" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.44,0 0.601,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="97" + android:propertyName="rotation" + android:startOffset="253" + android:valueFrom="-10" + android:valueTo="10" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.531,0 0.389,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="rotation" + android:startOffset="350" + android:valueFrom="10" + android:valueTo="-5" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.499,0 0.489,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="rotation" + android:startOffset="450" + android:valueFrom="-5" + android:valueTo="0" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.293,0 0.689,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_N_3_T_0" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="133" + android:propertyName="rotation" + 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.44,0 0.601,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="120" + android:propertyName="rotation" + android:startOffset="133" + android:valueFrom="0" + android:valueTo="-10" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.44,0 0.601,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="97" + android:propertyName="rotation" + android:startOffset="253" + android:valueFrom="-10" + android:valueTo="10" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.531,0 0.389,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="rotation" + android:startOffset="350" + android:valueFrom="10" + android:valueTo="-5" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.499,0 0.489,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="rotation" + android:startOffset="450" + android:valueFrom="-5" + android:valueTo="0" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.293,0 0.689,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:duration="717" + android:propertyName="translateX" + 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/anim/lock_to_error_filled.xml b/packages/SystemUI/res/anim/lock_to_error_filled.xml new file mode 100644 index 000000000000..6eb7425d9002 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_to_error_filled.xml @@ -0,0 +1,188 @@ +<?xml version="1.0" encoding="utf-8"?> +<animated-vector xmlns:aapt="http://schemas.android.com/aapt" + xmlns:android="http://schemas.android.com/apk/res/android" > + + <aapt:attr name="android:drawable" > + <vector + android:height="32dp" + android:viewportHeight="32" + android:viewportWidth="32" + android:width="32dp" > + <group android:name="_R_G" > + <group + android:name="_R_G_L_1_G" + android:pivotX="10.917" + android:pivotY="9.583" + android:rotation="0" + android:translateX="5.083" + android:translateY="10.417" > + <path + android:name="_R_G_L_1_G_D_0_P_0" + android:fillAlpha="1" + android:fillColor="#ffffff" + android:fillType="nonZero" + android:pathData=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c " /> + </group> + <group + android:name="_R_G_L_0_G_N_2_T_0" + android:pivotX="10.917" + android:pivotY="9.583" + android:rotation="0" + android:translateX="5.083" + android:translateY="10.417" > + <group + android:name="_R_G_L_0_G" + android:translateX="1.9169999999999998" + android:translateY="-12.75" > + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:pathData=" M13 13 C13,13 13,9 13,9 C13,6.79 11.21,5 9,5 C6.79,5 5,6.79 5,9 C5,9 5,13 5,13 " + android:strokeAlpha="1" + android:strokeColor="#ffffff" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="2" /> + </group> + </group> + </group> + <group android:name="time_group" /> + </vector> + </aapt:attr> + + <target android:name="_R_G_L_1_G" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="133" + android:propertyName="rotation" + 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.44,0 0.601,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="120" + android:propertyName="rotation" + android:startOffset="133" + android:valueFrom="0" + android:valueTo="-10" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.44,0 0.601,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="97" + android:propertyName="rotation" + android:startOffset="253" + android:valueFrom="-10" + android:valueTo="10" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.531,0 0.389,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="rotation" + android:startOffset="350" + android:valueFrom="10" + android:valueTo="-5" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.499,0 0.489,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="rotation" + android:startOffset="450" + android:valueFrom="-5" + android:valueTo="0" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.293,0 0.689,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_N_2_T_0" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="133" + android:propertyName="rotation" + 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.44,0 0.601,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="120" + android:propertyName="rotation" + android:startOffset="133" + android:valueFrom="0" + android:valueTo="-10" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.44,0 0.601,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="97" + android:propertyName="rotation" + android:startOffset="253" + android:valueFrom="-10" + android:valueTo="10" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.531,0 0.389,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="rotation" + android:startOffset="350" + android:valueFrom="10" + android:valueTo="-5" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.499,0 0.489,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="rotation" + android:startOffset="450" + android:valueFrom="-5" + android:valueTo="0" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.293,0 0.689,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:duration="717" + android:propertyName="translateX" + 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/anim/lock_to_error_rounded.xml b/packages/SystemUI/res/anim/lock_to_error_rounded.xml new file mode 100644 index 000000000000..46043caf8862 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_to_error_rounded.xml @@ -0,0 +1,270 @@ +<?xml version="1.0" encoding="utf-8"?> +<animated-vector xmlns:aapt="http://schemas.android.com/aapt" + xmlns:android="http://schemas.android.com/apk/res/android" > + + <aapt:attr name="android:drawable" > + <vector + android:height="32dp" + android:viewportHeight="32" + android:viewportWidth="32" + android:width="32dp" > + <group android:name="_R_G" > + <group + android:name="_R_G_L_2_G" + android:pivotX="14.667" + android:pivotY="12.667" + android:rotation="0" + android:translateX="1.3330000000000002" + android:translateY="7.333" > + <path + android:name="_R_G_L_2_G_D_0_P_0" + android:pathData=" M22.09 5 C22.09,5 6,5 6,5 C5.45,5 5,5.45 5,6 C5,6 5,19.33 5,19.33 C5,19.89 5.45,20.33 6,20.33 C6,20.33 23.33,20.33 23.33,20.33 C23.89,20.33 24.33,19.89 24.33,19.33 C24.33,19.33 24.33,6 24.33,6 C24.33,5.45 23.89,5 23.33,5 C23.33,5 22.09,5 22.09,5c " + android:strokeAlpha="1" + android:strokeColor="#ffffff" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="1.5" /> + </group> + <group + android:name="_R_G_L_1_G_N_4_T_0" + android:pivotX="14.667" + android:pivotY="12.667" + android:rotation="0" + android:translateX="1.3330000000000002" + android:translateY="7.333" > + <group + android:name="_R_G_L_1_G" + android:translateX="12.416" + android:translateY="10.417" > + <path + android:name="_R_G_L_1_G_D_0_P_0" + android:fillAlpha="1" + android:fillColor="#ffffff" + android:fillType="nonZero" + android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c " /> + </group> + </group> + <group + android:name="_R_G_L_0_G_N_4_T_0" + android:pivotX="14.667" + android:pivotY="12.667" + android:rotation="0" + android:translateX="1.3330000000000002" + android:translateY="7.333" > + <group + android:name="_R_G_L_0_G" + android:translateX="5.333" + android:translateY="-9.425999999999998" > + <path + android:name="_R_G_L_0_G_D_0_P_0" + android:pathData=" M13.67 13.8 C13.67,13.8 13.67,8.94 13.67,8.94 C13.63,6.75 11.69,5 9.33,5.04 C6.98,5 5.04,6.75 5,8.94 C5,8.94 5,13.8 5,13.8 " + android:strokeAlpha="1" + android:strokeColor="#ffffff" + android:strokeLineCap="round" + android:strokeLineJoin="round" + android:strokeWidth="1.5" /> + </group> + </group> + </group> + <group android:name="time_group" /> + </vector> + </aapt:attr> + + <target android:name="_R_G_L_2_G" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="133" + android:propertyName="rotation" + 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.44,0 0.601,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="120" + android:propertyName="rotation" + android:startOffset="133" + android:valueFrom="0" + android:valueTo="-10" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.44,0 0.601,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="97" + android:propertyName="rotation" + android:startOffset="253" + android:valueFrom="-10" + android:valueTo="10" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.531,0 0.389,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="rotation" + android:startOffset="350" + android:valueFrom="10" + android:valueTo="-5" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.499,0 0.489,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="rotation" + android:startOffset="450" + android:valueFrom="-5" + android:valueTo="0" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.293,0 0.689,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G_N_4_T_0" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="133" + android:propertyName="rotation" + 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.44,0 0.601,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="120" + android:propertyName="rotation" + android:startOffset="133" + android:valueFrom="0" + android:valueTo="-10" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.44,0 0.601,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="97" + android:propertyName="rotation" + android:startOffset="253" + android:valueFrom="-10" + android:valueTo="10" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.531,0 0.389,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="rotation" + android:startOffset="350" + android:valueFrom="10" + android:valueTo="-5" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.499,0 0.489,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="rotation" + android:startOffset="450" + android:valueFrom="-5" + android:valueTo="0" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.293,0 0.689,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_N_4_T_0" > + <aapt:attr name="android:animation" > + <set android:ordering="together" > + <objectAnimator + android:duration="133" + android:propertyName="rotation" + 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.44,0 0.601,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="120" + android:propertyName="rotation" + android:startOffset="133" + android:valueFrom="0" + android:valueTo="-10" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.44,0 0.601,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="97" + android:propertyName="rotation" + android:startOffset="253" + android:valueFrom="-10" + android:valueTo="10" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.531,0 0.389,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="100" + android:propertyName="rotation" + android:startOffset="350" + android:valueFrom="10" + android:valueTo="-5" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.499,0 0.489,1 1.0,1.0" /> + </aapt:attr> + </objectAnimator> + <objectAnimator + android:duration="167" + android:propertyName="rotation" + android:startOffset="450" + android:valueFrom="-5" + android:valueTo="0" + android:valueType="floatType" > + <aapt:attr name="android:interpolator" > + <pathInterpolator android:pathData="M 0.0,0.0 c0.293,0 0.689,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:duration="717" + android:propertyName="translateX" + 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/core/res/res/anim/lock_unlock.xml b/packages/SystemUI/res/anim/lock_unlock.xml index 91d44320d8c2..64456ce47eaa 100644 --- a/core/res/res/anim/lock_unlock.xml +++ b/packages/SystemUI/res/anim/lock_unlock.xml @@ -34,7 +34,7 @@ android:pathData=" M22.33 21 C22.33,21 6.33,21 6.33,21 C5.6,21 5,20.4 5,19.67 C5,19.67 5,6.33 5,6.33 C5,5.6 5.6,5 6.33,5 C6.33,5 22.33,5 22.33,5 C23.07,5 23.67,5.6 23.67,6.33 C23.67,6.33 23.67,19.67 23.67,19.67 C23.67,20.4 23.07,21 22.33,21c " android:strokeWidth="2" android:strokeAlpha="1" - android:strokeColor="#ffffff" /> + android:strokeColor="#ffffff"/> </group> </group> <group @@ -79,7 +79,7 @@ android:pathData=" M14.33 14.33 C14.33,14.33 14.33,9.67 14.33,9.67 C14.33,7.09 12.24,5 9.67,5 C7.09,5 5,7.09 5,9.67 C5,9.67 5,14.33 5,14.33 " android:strokeWidth="2" android:strokeAlpha="1" - android:strokeColor="#ffffff" /> + android:strokeColor="#ffffff"/> </group> </group> </group> @@ -230,7 +230,7 @@ </aapt:attr> </objectAnimator> <objectAnimator - android:duration="333" + android:duration="183" android:propertyName="pathData" android:startOffset="67" android:valueFrom="M14.33 14.33 C14.33,14.33 14.29,6.17 14.29,6.17 C14.29,3.59 12.2,1.5 9.63,1.5 C7.05,1.5 4.96,3.59 4.96,6.17 C4.96,6.17 4.96,7.33 4.96,7.33 " @@ -286,7 +286,7 @@ <aapt:attr name="android:animation"> <set android:ordering="together"> <objectAnimator - android:duration="717" + android:duration="983" android:propertyName="translateX" android:startOffset="0" android:valueFrom="0" diff --git a/packages/SystemUI/res/anim/lock_unlock_circular.xml b/packages/SystemUI/res/anim/lock_unlock_circular.xml new file mode 100644 index 000000000000..c3968ac8a624 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_unlock_circular.xml @@ -0,0 +1,212 @@ +<!-- Copyright (C) 2019 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"> + <aapt:attr name="android:drawable"> + <vector android:height="42dp" android:width="32dp" android:viewportHeight="42" + android:viewportWidth="32"> + <group android:name="_R_G"> + <group android:name="_R_G_L_2_G_T_1" android:translateX="15.999" + android:translateY="24.333"> + <group android:name="_R_G_L_2_G" android:translateX="-9.583" + android:translateY="-8.916"> + <path android:name="_R_G_L_2_G_D_0_P_0" android:fillColor="#ffffff" + android:fillAlpha="1" android:fillType="nonZero" + android:pathData=" M17.42 1.75 C17.42,1.75 17.42,14.58 17.42,14.58 C17.42,15.41 16.74,16.08 15.92,16.08 C15.92,16.08 3.25,16.08 3.25,16.08 C2.42,16.08 1.75,15.41 1.75,14.58 C1.75,14.58 1.75,1.75 1.75,1.75 C1.75,1.75 17.42,1.75 17.42,1.75c M18.92 0.25 C18.92,0.25 0.25,0.25 0.25,0.25 C0.25,0.25 0.25,14.58 0.25,14.58 C0.25,16.24 1.59,17.58 3.25,17.58 C3.25,17.58 15.92,17.58 15.92,17.58 C17.57,17.58 18.92,16.24 18.92,14.58 C18.92,14.58 18.92,0.25 18.92,0.25c "/> + </group> + </group> + <group android:name="_R_G_L_1_G_N_3_T_1" android:translateX="15.999" + android:translateY="24.333"> + <group android:name="_R_G_L_1_G_N_3_T_0" android:translateX="-9.583" + android:translateY="-8.916"> + <group android:name="_R_G_L_1_G" android:translateX="7.334" + android:translateY="5.333" android:pivotX="2.25" + android:pivotY="3.334" android:scaleX="1" android:scaleY="1"> + <path android:name="_R_G_L_1_G_D_0_P_0" android:fillColor="#ffffff" + android:fillAlpha="1" android:fillType="nonZero" + android:pathData=" M4.25 2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25 C3.35,0.25 4.25,1.15 4.25,2.25c "/> + <path android:name="_R_G_L_1_G_D_1_P_0" android:strokeColor="#ffffff" + android:strokeLineCap="round" android:strokeLineJoin="round" + android:strokeWidth="1.5" android:strokeAlpha="1" + android:pathData=" M2.25 2.25 C2.25,2.25 2.25,5.92 2.25,5.92 "/> + </group> + </group> + </group> + <group android:name="_R_G_L_0_G_N_3_T_1" android:translateX="15.999" + android:translateY="24.333"> + <group android:name="_R_G_L_0_G_N_3_T_0" android:translateX="-9.583" + android:translateY="-8.916"> + <group android:name="_R_G_L_0_G" android:translateX="1.5" + android:translateY="-11.835"> + <path android:name="_R_G_L_0_G_D_0_P_0" android:strokeColor="#ffffff" + android:strokeLineCap="round" android:strokeLineJoin="round" + android:strokeWidth="1.5" android:strokeAlpha="1" + android:pathData=" M12.42 12.6 C12.42,12.6 12.42,8.17 12.42,8.17 C12.42,5.83 10.48,3.75 8.08,3.75 C5.69,3.75 3.75,5.83 3.75,8.17 C3.75,8.17 3.75,12.6 3.75,12.6 "/> + </group> + </group> + </group> + </group> + <group android:name="time_group"/> + </vector> + </aapt:attr> + <target android:name="_R_G_L_2_G_T_1"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="0" android:valueFrom="24.333" + android:valueTo="22.458" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.705,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="133" android:valueFrom="22.458" + android:valueTo="25.333" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.289,0 0.724,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateY" android:duration="100" + android:startOffset="267" android:valueFrom="25.333" + android:valueTo="24.333" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.624,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="scaleX" android:duration="100" + android:startOffset="0" android:valueFrom="1" android:valueTo="0.9" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="100" + android:startOffset="0" android:valueFrom="1" android:valueTo="0.9" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="283" + android:startOffset="100" android:valueFrom="0.9" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="283" + android:startOffset="100" android:valueFrom="0.9" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G_N_3_T_1"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="0" android:valueFrom="24.333" + android:valueTo="22.458" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.705,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="133" android:valueFrom="22.458" + android:valueTo="25.333" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.289,0 0.724,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateY" android:duration="100" + android:startOffset="267" android:valueFrom="25.333" + android:valueTo="24.333" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.624,1 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="M12.42 12.6 C12.42,12.6 12.42,8.17 12.42,8.17 C12.42,5.83 10.48,3.75 8.08,3.75 C5.69,3.75 3.75,5.83 3.75,8.17 C3.75,8.17 3.75,12.6 3.75,12.6 " + android:valueTo="M12.42 12.6 C12.42,12.6 12.4,5.86 12.4,5.86 C12.4,3.52 10.46,1.44 8.06,1.44 C5.67,1.44 3.73,3.52 3.73,5.86 C3.73,5.86 3.75,7.41 3.75,7.41 " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.59,0 0.488,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="183" + android:startOffset="67" + android:valueFrom="M12.42 12.6 C12.42,12.6 12.4,5.86 12.4,5.86 C12.4,3.52 10.46,1.44 8.06,1.44 C5.67,1.44 3.73,3.52 3.73,5.86 C3.73,5.86 3.75,7.41 3.75,7.41 " + android:valueTo="M12.42 12.6 C12.42,12.6 12.41,8.16 12.41,8.16 C12.41,5.81 14.36,3.75 16.75,3.77 C19.15,3.78 21.07,5.71 21.07,8.05 C21.07,8.05 21.08,8.22 21.08,8.22 " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.57,0 0.365,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_N_3_T_1"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="0" android:valueFrom="24.333" + android:valueTo="22.458" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.705,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="133" android:valueFrom="22.458" + android:valueTo="25.333" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.289,0 0.724,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateY" android:duration="100" + android:startOffset="267" android:valueFrom="25.333" + android:valueTo="24.333" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.624,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="717" + 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/anim/lock_unlock_filled.xml b/packages/SystemUI/res/anim/lock_unlock_filled.xml new file mode 100644 index 000000000000..b2238ada3851 --- /dev/null +++ b/packages/SystemUI/res/anim/lock_unlock_filled.xml @@ -0,0 +1,158 @@ +<!-- Copyright (C) 2019 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"> + <aapt:attr name="android:drawable"> + <vector android:height="42dp" android:width="32dp" android:viewportHeight="42" + android:viewportWidth="32"> + <group android:name="_R_G"> + <group android:name="_R_G_L_1_G_T_1" android:translateX="16" + android:translateY="25"> + <group android:name="_R_G_L_1_G" android:translateX="-10.917" + android:translateY="-9.583"> + <path android:name="_R_G_L_1_G_D_0_P_0" android:fillColor="#ffffff" + android:fillAlpha="1" android:fillType="nonZero" + android:pathData=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c "/> + </group> + </group> + <group android:name="_R_G_L_0_G_N_3_T_1" android:translateX="16" + android:translateY="25"> + <group android:name="_R_G_L_0_G_N_3_T_0" android:translateX="-10.917" + android:translateY="-9.583"> + <group android:name="_R_G_L_0_G" android:translateX="9.917000000000002" + android:translateY="-12.75"> + <path android:name="_R_G_L_0_G_D_0_P_0" android:strokeColor="#ffffff" + android:strokeLineCap="round" android:strokeLineJoin="round" + android:strokeWidth="2" android:strokeAlpha="1" + android:pathData=" M-3 13.04 C-3,13.04 -3,9.04 -3,9.04 C-3,6.83 -1.03,5.04 0.91,5 C3.12,4.96 5,6.79 5,9 C5,9 5,13 5,13 "/> + </group> + </group> + </group> + </group> + <group android:name="time_group"/> + </vector> + </aapt:attr> + <target android:name="_R_G_L_1_G_D_0_P_0"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="pathData" android:duration="100" + android:startOffset="0" + android:valueFrom=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c " + android:valueTo=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 11.78 C9.71,11.78 8.72,10.79 8.72,9.58 C8.72,8.37 9.71,7.38 10.92,7.38 C12.13,7.38 13.12,8.37 13.12,9.58 C13.12,10.79 12.13,11.78 10.92,11.78c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="283" + android:startOffset="100" + android:valueFrom=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 11.78 C9.71,11.78 8.72,10.79 8.72,9.58 C8.72,8.37 9.71,7.38 10.92,7.38 C12.13,7.38 13.12,8.37 13.12,9.58 C13.12,10.79 12.13,11.78 10.92,11.78c " + android:valueTo=" M18.92 0.25 C18.92,0.25 2.92,0.25 2.92,0.25 C1.45,0.25 0.25,1.45 0.25,2.92 C0.25,2.92 0.25,16.25 0.25,16.25 C0.25,17.72 1.45,18.92 2.92,18.92 C2.92,18.92 18.92,18.92 18.92,18.92 C20.38,18.92 21.58,17.72 21.58,16.25 C21.58,16.25 21.58,2.92 21.58,2.92 C21.58,1.45 20.38,0.25 18.92,0.25c M10.92 12.25 C9.45,12.25 8.25,11.05 8.25,9.58 C8.25,8.12 9.45,6.92 10.92,6.92 C12.38,6.92 13.58,8.12 13.58,9.58 C13.58,11.05 12.38,12.25 10.92,12.25c " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G_T_1"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="0" android:valueFrom="25" android:valueTo="23" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.32,0 0.803,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="133" android:valueFrom="23" + android:valueTo="26.5" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.223,0 0.761,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateY" android:duration="100" + android:startOffset="267" android:valueFrom="26.5" + android:valueTo="25" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.311,0 0.633,1 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="M-3 13.04 C-3,13.04 -3,9.04 -3,9.04 C-3,6.83 -1.03,5.04 0.91,5 C3.12,4.96 5,6.79 5,9 C5,9 5,13 5,13 " + android:valueTo="M-3 6.73 C-3,5.62 -2.56,4.67 -1.84,4 C-1.11,3.32 -0.09,2.93 1.06,2.94 C3.27,2.96 5,4.54 5,6.75 C5,6.75 5,13 5,13 " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.592,0 0.503,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="183" + android:startOffset="67" + android:valueFrom="M-3 6.73 C-3,5.62 -2.56,4.67 -1.84,4 C-1.11,3.32 -0.09,2.93 1.06,2.94 C3.27,2.96 5,4.54 5,6.75 C5,6.75 5,13 5,13 " + android:valueTo="M13 9 C13,7.9 12.55,6.9 11.83,6.17 C11.1,5.45 10.11,5 9,5 C6.79,5 5,6.79 5,9 C5,9 5,13 5,13 " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.563,0 0.363,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_N_3_T_1"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="0" android:valueFrom="25" android:valueTo="23" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.32,0 0.803,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="133" android:valueFrom="23" + android:valueTo="26.5" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.223,0 0.761,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateY" android:duration="100" + android:startOffset="267" android:valueFrom="26.5" + android:valueTo="25" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.311,0 0.633,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="717" + 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/anim/lock_unlock_rounded.xml b/packages/SystemUI/res/anim/lock_unlock_rounded.xml new file mode 100644 index 000000000000..14a88a4aa77a --- /dev/null +++ b/packages/SystemUI/res/anim/lock_unlock_rounded.xml @@ -0,0 +1,209 @@ +<!-- Copyright (C) 2019 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"> + <aapt:attr name="android:drawable"> + <vector android:height="42dp" android:width="32dp" android:viewportHeight="42" + android:viewportWidth="32"> + <group android:name="_R_G"> + <group android:name="_R_G_L_2_G_T_1" android:translateX="16" + android:translateY="25"> + <group android:name="_R_G_L_2_G" android:translateX="-14.667" + android:translateY="-12.667"> + <path android:name="_R_G_L_2_G_D_0_P_0" android:strokeColor="#ffffff" + android:strokeLineCap="round" android:strokeLineJoin="round" + android:strokeWidth="1.5" android:strokeAlpha="1" + android:pathData=" M22.09 5 C22.09,5 6,5 6,5 C5.45,5 5,5.45 5,6 C5,6 5,19.33 5,19.33 C5,19.89 5.45,20.33 6,20.33 C6,20.33 23.33,20.33 23.33,20.33 C23.89,20.33 24.33,19.89 24.33,19.33 C24.33,19.33 24.33,6 24.33,6 C24.33,5.45 23.89,5 23.33,5 C23.33,5 22.09,5 22.09,5c "/> + </group> + </group> + <group android:name="_R_G_L_1_G_N_4_T_1" android:translateX="16" + android:translateY="25"> + <group android:name="_R_G_L_1_G_N_4_T_0" android:translateX="-14.667" + android:translateY="-12.667"> + <group android:name="_R_G_L_1_G" android:translateX="12.416" + android:translateY="10.417" android:pivotX="2.25" + android:pivotY="2.25" android:scaleX="1" android:scaleY="1"> + <path android:name="_R_G_L_1_G_D_0_P_0" android:fillColor="#ffffff" + android:fillAlpha="1" android:fillType="nonZero" + android:pathData=" M2.25 0.25 C3.35,0.25 4.25,1.15 4.25,2.25 C4.25,3.35 3.35,4.25 2.25,4.25 C1.15,4.25 0.25,3.35 0.25,2.25 C0.25,1.15 1.15,0.25 2.25,0.25c "/> + </group> + </group> + </group> + <group android:name="_R_G_L_0_G_N_4_T_1" android:translateX="16" + android:translateY="25"> + <group android:name="_R_G_L_0_G_N_4_T_0" android:translateX="-14.667" + android:translateY="-12.667"> + <group android:name="_R_G_L_0_G" android:translateX="5.333" + android:translateY="-9.425999999999998"> + <path android:name="_R_G_L_0_G_D_0_P_0" android:strokeColor="#ffffff" + android:strokeLineCap="round" android:strokeLineJoin="round" + android:strokeWidth="1.5" android:strokeAlpha="1" + android:pathData=" M13.67 13.8 C13.67,13.8 13.67,8.94 13.67,8.94 C13.63,6.75 11.69,5 9.33,5.04 C6.98,5 5.04,6.75 5,8.94 C5,8.94 5,13.8 5,13.8 "/> + </group> + </group> + </group> + </group> + <group android:name="time_group"/> + </vector> + </aapt:attr> + <target android:name="_R_G_L_2_G_T_1"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="0" android:valueFrom="25" + android:valueTo="23.5" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="133" android:valueFrom="23.5" + android:valueTo="26" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateY" android:duration="100" + android:startOffset="267" android:valueFrom="26" + android:valueTo="25" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="scaleX" android:duration="100" + android:startOffset="0" android:valueFrom="1" android:valueTo="0.85" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.346,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="100" + android:startOffset="0" android:valueFrom="1" android:valueTo="0.85" + android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.346,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleX" android:duration="283" + android:startOffset="100" android:valueFrom="0.85" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.423,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="scaleY" android:duration="283" + android:startOffset="100" android:valueFrom="0.85" + android:valueTo="1" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.423,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_1_G_N_4_T_1"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="0" android:valueFrom="25" + android:valueTo="23.5" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="133" android:valueFrom="23.5" + android:valueTo="26" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateY" android:duration="100" + android:startOffset="267" android:valueFrom="26" + android:valueTo="25" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 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="M13.67 13.8 C13.67,13.8 13.67,8.94 13.67,8.94 C13.63,6.75 11.69,5 9.33,5.04 C6.98,5 5.04,6.75 5,8.94 C5,8.94 5,13.8 5,13.8 " + android:valueTo="M13.67 13.8 C13.67,13.8 13.69,5.06 13.69,5.06 C13.65,2.87 11.71,1.13 9.35,1.16 C7,1.13 5.06,2.87 5.02,5.06 C5.02,5.06 5,7.93 5,7.93 " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.658,0 0.317,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="pathData" android:duration="183" + android:startOffset="67" + android:valueFrom="M13.67 13.8 C13.67,13.8 13.69,5.06 13.69,5.06 C13.65,2.87 11.71,1.13 9.35,1.16 C7,1.13 5.06,2.87 5.02,5.06 C5.02,5.06 5,7.93 5,7.93 " + android:valueTo="M13.67 13.8 C13.67,13.8 13.67,8.94 13.67,8.94 C13.68,6.62 15.69,5.03 18.01,5.04 C20.46,5.04 22.32,6.89 22.34,8.85 C22.34,8.85 22.33,8.89 22.33,8.89 " + android:valueType="pathType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.679,0 0.175,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + </set> + </aapt:attr> + </target> + <target android:name="_R_G_L_0_G_N_4_T_1"> + <aapt:attr name="android:animation"> + <set android:ordering="together"> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="0" android:valueFrom="25" + android:valueTo="23.5" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateY" android:duration="133" + android:startOffset="133" android:valueFrom="23.5" + android:valueTo="26" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,1 1.0,1.0"/> + </aapt:attr> + </objectAnimator> + <objectAnimator android:propertyName="translateY" android:duration="100" + android:startOffset="267" android:valueFrom="26" + android:valueTo="25" android:valueType="floatType"> + <aapt:attr name="android:interpolator"> + <pathInterpolator android:pathData="M 0.0,0.0 c0.333,0 0.667,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="717" + 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/ic_info_outline.xml b/packages/SystemUI/res/drawable/ic_info_outline.xml index a4a3e9aab239..44e09f6faa51 100644 --- a/packages/SystemUI/res/drawable/ic_info_outline.xml +++ b/packages/SystemUI/res/drawable/ic_info_outline.xml @@ -15,8 +15,8 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="32dp" - android:height="32dp" + android:width="24dp" + android:height="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path diff --git a/packages/SystemUI/res/drawable/ic_invert_colors.xml b/packages/SystemUI/res/drawable/ic_invert_colors.xml index 77d491810ccc..37ea0800a51e 100644 --- a/packages/SystemUI/res/drawable/ic_invert_colors.xml +++ b/packages/SystemUI/res/drawable/ic_invert_colors.xml @@ -15,8 +15,8 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="48dp" - android:height="48dp" + android:width="24dp" + android:height="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path diff --git a/packages/SystemUI/res/drawable/ic_qs_bluetooth_connecting.xml b/packages/SystemUI/res/drawable/ic_qs_bluetooth_connecting.xml index fbd92dead675..d2ee2839d701 100644 --- a/packages/SystemUI/res/drawable/ic_qs_bluetooth_connecting.xml +++ b/packages/SystemUI/res/drawable/ic_qs_bluetooth_connecting.xml @@ -14,8 +14,8 @@ Copyright (C) 2017 The Android Open Source Project limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="64dp" - android:height="64dp" + android:width="24dp" + android:height="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0" android:tint="?android:attr/colorControlNormal" > diff --git a/packages/SystemUI/res/drawable/ic_qs_no_sim.xml b/packages/SystemUI/res/drawable/ic_qs_no_sim.xml index 22e12cc10405..6cabcaf4bcb4 100644 --- a/packages/SystemUI/res/drawable/ic_qs_no_sim.xml +++ b/packages/SystemUI/res/drawable/ic_qs_no_sim.xml @@ -14,8 +14,8 @@ Copyright (C) 2017 The Android Open Source Project limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="32dp" - android:height="32dp" + android:width="24dp" + android:height="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path diff --git a/packages/SystemUI/res/drawable/ic_screenshot_delete.xml b/packages/SystemUI/res/drawable/ic_screenshot_delete.xml index d60ee414888d..4cf578a92826 100644 --- a/packages/SystemUI/res/drawable/ic_screenshot_delete.xml +++ b/packages/SystemUI/res/drawable/ic_screenshot_delete.xml @@ -14,8 +14,8 @@ Copyright (C) 2015 The Android Open Source Project limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="32dp" - android:height="32dp" + android:width="24dp" + android:height="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path diff --git a/packages/SystemUI/res/layout/keyguard_bottom_area.xml b/packages/SystemUI/res/layout/keyguard_bottom_area.xml index 7fc2066c7176..21c2c6b879f8 100644 --- a/packages/SystemUI/res/layout/keyguard_bottom_area.xml +++ b/packages/SystemUI/res/layout/keyguard_bottom_area.xml @@ -46,6 +46,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" + android:paddingStart="@dimen/keyguard_indication_text_padding" + android:paddingEnd="@dimen/keyguard_indication_text_padding" android:textAppearance="@style/TextAppearance.Keyguard.BottomArea" android:visibility="gone" /> @@ -54,6 +56,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" + android:paddingStart="@dimen/keyguard_indication_text_padding" + android:paddingEnd="@dimen/keyguard_indication_text_padding" android:textAppearance="@style/TextAppearance.Keyguard.BottomArea" android:accessibilityLiveRegion="polite" /> diff --git a/packages/SystemUI/res/values-af/config.xml b/packages/SystemUI/res/values-af/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-af/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index d3dccfda2244..e0907aee49f6 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Soek tans jou gesig"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Gesig is gestaaf"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Bevestig"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Tik op Bevestig om te voltooi"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Raak die vingerafdruksensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Vingerafdrukikoon"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Soek tans vir jou …"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Minder dringende kennisgewings hieronder"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Tik weer om oop te maak"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Swiep op om te ontsluit"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Swiep op om oop te maak"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Jou organisasie bestuur hierdie toestel"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Hierdie toestel word deur <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> bestuur"</string> <string name="phone_hint" msgid="4872890986869209950">"Swiep vanaf ikoon vir foon"</string> diff --git a/packages/SystemUI/res/values-am/config.xml b/packages/SystemUI/res/values-am/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-am/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 362dc2433226..f16193a96863 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"መልክዎን በመፈለግ ላይ"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"መልክ ተረጋግጧል"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"ተረጋግጧል"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"ለማጠናቀቅ አረጋግጥን መታ ያድርጉ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"የጣት አሻራ ዳሳሹን ይንኩ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"የጣት አሻራ አዶ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"እርስዎን በመፈለግ ላይ…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"በጣም አስቸካይ ያልሆኑ ማሳወቂያዎች ከታች"</string> <string name="notification_tap_again" msgid="7590196980943943842">"ለመክፈት ዳግም መታ ያድርጉ"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"ለማስከፈት ወደ ላይ ያንሸራትቱ"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"ለመክፈት በጣት ወደ ላይ ጠረግ ያድርጉ"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"ይህ መሣሪያ በእርስዎ ድርጅት የሚተዳደር ነው"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"ይህ መሣሪያ በ<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> የሚተዳደር ነው"</string> <string name="phone_hint" msgid="4872890986869209950">"ለስልክ ከአዶ ላይ ጠረግ ያድርጉ"</string> diff --git a/packages/SystemUI/res/values-ar/config.xml b/packages/SystemUI/res/values-ar/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ar/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 916137ee0527..3d297aee1cc2 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"جارٍ البحث عن وجهك"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"تمّت مصادقة الوجه."</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"تمّ التأكيد."</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"يمكنك النقر على \"تأكيد\" لإكمال المهمة."</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"المس زر استشعار بصمة الإصبع"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"رمز بصمة الإصبع"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"جارٍ البحث عن وجهك…"</string> @@ -407,7 +408,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"الإشعارات الأقل إلحاحًا أدناه"</string> <string name="notification_tap_again" msgid="7590196980943943842">"انقر مرة أخرى للفتح"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"مرر سريعًا لأعلى لإلغاء القفل"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"يمكنك الفتح بالتمرير سريعًا لأعلى."</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"تتولى مؤسستك إدارة هذا الجهاز."</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"تتم إدارة هذا الجهاز بواسطة <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"يمكنك التمرير سريعًا من الرمز لتشغيل الهاتف"</string> diff --git a/packages/SystemUI/res/values-as/config.xml b/packages/SystemUI/res/values-as/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-as/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 085db3441068..c7b5f0893711 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"আপোনাৰ মুখমণ্ডল বিচাৰি থকা হৈছে"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"মুখমণ্ডলৰ বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ কৰা হ’ল"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"নিশ্চিত কৰিলে"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"সম্পূৰ্ণ কৰিবলৈ নিশ্চিত কৰক-ত টিপক"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো স্পৰ্শ কৰক"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ফিংগাৰপ্ৰিণ্ট আইকন"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"আপোনাৰ মুখমণ্ডল বিচাৰি আছে…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"কম জৰুৰী জাননীসমূহ তলত"</string> <string name="notification_tap_again" msgid="7590196980943943842">"খুলিবলৈ পুনৰাই টিপক"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"আনলক কৰিবলৈ ওপৰলৈ ছোৱাইপ কৰক"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"খুলিবলৈ ওপৰলৈ ছোৱাইপ কৰক"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"আপোনাৰ প্ৰতিষ্ঠানে এই ডিভাইচটো পৰিচালনা কৰে"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"এই ডিভাইচটো <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>ৰ দ্বাৰা পৰিচালিত।"</string> <string name="phone_hint" msgid="4872890986869209950">"ফ\'নৰ বাবে আইকনৰপৰা ছোৱাইপ কৰক"</string> diff --git a/packages/SystemUI/res/values-az/config.xml b/packages/SystemUI/res/values-az/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-az/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 0fc16c413e55..847d10d20861 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Üzünüz axtarılır"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Üz doğrulandı"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Təsdiqləndi"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Tamamlamaq üçün \"Təsdiq edin\" seçiminə toxunun"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Barmaq izi sensoruna klikləyin"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmaq izi ikonası"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Siz axtarılırsınız…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Daha az təcili bildirişlər aşağıdadır"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Açmaq üçün yenidən tıklayın"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Kiliddən çıxarmaq üçün yuxarı çəkin"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Açmaq üçün yuxarı sürüşdürün"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Bu cihaz təşkilatınız tərəfindən idarə olunur"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Bu cihaz <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> tərəfindən idarə olunur"</string> <string name="phone_hint" msgid="4872890986869209950">"Telefon üçün ikonadan sürüşdürün"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/config.xml b/packages/SystemUI/res/values-b+sr+Latn/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-b+sr+Latn/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 7c9562510e54..78e9d0463361 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Traži se vaše lice"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Lice je potvrđeno"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Potvrđeno"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Dodirnite Potvrdi da biste završili"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dodirnite senzor za otisak prsta"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otiska prsta"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Tražimo vas…"</string> @@ -401,7 +402,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Manje hitna obaveštenja su u nastavku"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Dodirnite ponovo da biste otvorili"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Prevucite nagore da biste otključali"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Prevucite nagore da biste otvorili"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Ovim uređajem upravlja organizacija"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Ovim uređajem upravlja <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Prevucite od ikone za telefon"</string> diff --git a/packages/SystemUI/res/values-be/config.xml b/packages/SystemUI/res/values-be/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-be/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 2924bdeb7657..26e34d318567 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Ідзе пошук твару"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Твар распазнаны"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Пацверджана"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Націсніце \"Пацвердзіць\", каб завяршыць"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Дакраніцеся да сканера адбіткаў пальцаў"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок адбіткаў пальцаў"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ідзе пошук вашага твару…"</string> @@ -405,7 +406,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Менш тэрміновыя апавяшчэнні ніжэй"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Дакраніцеся яшчэ раз, каб адкрыць"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Правядзіце пальцам уверх, каб разблакіраваць"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Каб адкрыць, прагарніце ўверх"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Гэта прылада знаходзіцца пад кіраваннем вашай арганізацыі"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Гэта прылада знаходзіцца пад кіраваннем <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Тэлефон: правядзіце пальцам ад значка"</string> diff --git a/packages/SystemUI/res/values-bg/config.xml b/packages/SystemUI/res/values-bg/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-bg/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index c2fdf92ce9ba..a0128ebf74b3 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Лицето ви се търси"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Лицето е удостоверено"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Потвърдено"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Докоснете „Потвърждаване“ за завършване"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Докоснете сензора за отпечатъци"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона за отпечатък"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Търсим ви…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Ппоказване на по-малко спешните известия по-долу"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Докоснете отново, за да отворите"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Плъзнете нагоре, за да отключите"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Прекарайте пръст нагоре, за да отключите"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Това устройство се управлява от организацията ви"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Това устройство се управлява от <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Плъзнете с пръст от иконата, за да използвате телефона"</string> diff --git a/packages/SystemUI/res/values-bn/config.xml b/packages/SystemUI/res/values-bn/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-bn/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 5a690d47bbad..bf7dd0bc1676 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"আপনার ফেস খোঁজা হচ্ছে"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"ফেস যাচাই করা হয়েছে"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"কনফার্ম করা হয়েছে"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"সম্পূর্ণ করতে \'কনফার্ম করুন\' বোতামে ট্যাপ করুন"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"আঙ্গুলের ছাপের সেন্সর স্পর্শ করুন"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"আঙ্গুলের ছাপের আইকন"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"আপনার জন্য খোঁজা হচ্ছে…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"নিচে অপেক্ষাকৃত কম জরুরী বিজ্ঞপ্তিগুলি"</string> <string name="notification_tap_again" msgid="7590196980943943842">"খোলার জন্য আবার আলতো চাপুন"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"আনলক করতে উপরের দিকে সোয়াইপ করুন"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"খোলার জন্য উপরে সোয়াইপ করুন"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"আপনার সংস্থা এই ডিভাইসটি পরিচালনা করছে"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"এই ডিভাইসটি <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> এর দ্বারা পরিচালিত"</string> <string name="phone_hint" msgid="4872890986869209950">"ফোনের জন্য আইকন থেকে সোয়াইপ করুন"</string> diff --git a/packages/SystemUI/res/values-bs/config.xml b/packages/SystemUI/res/values-bs/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-bs/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 61c8c8ab2c16..d7e5c230e833 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Traženje vašeg lica"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Lice je provjereno"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Potvrđeno"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Dodirnite Potvrdi da završite"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dodirnite senzor za otisak prsta"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona za otisak prsta"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Tražimo vas…"</string> @@ -401,7 +402,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Prikaži manje važna obavještenja ispod"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Dodirnite ponovo da otvorite"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Prevucite prema gore da otključate"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Prevucite da otvorite"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Ovim uređajem upravlja vaša organizacija"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Ovim uređajem upravlja <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Prevucite preko ikone da otvorite telefon"</string> diff --git a/packages/SystemUI/res/values-ca/config.xml b/packages/SystemUI/res/values-ca/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ca/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 381c70b29808..23d5d5c15c2f 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"S\'està cercant la teva cara"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Cara autenticada"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmat"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Toca Confirma per completar"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor d\'empremtes digitals"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona d\'empremta digital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"S\'està cercant la teva cara…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificacions menys urgents a continuació"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Torna a tocar per obrir-la."</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Llisca cap amunt per desbloquejar el teclat"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Llisca cap amunt per obrir"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"La teva organització gestiona aquest dispositiu"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> gestiona aquest dispositiu"</string> <string name="phone_hint" msgid="4872890986869209950">"Llisca des de la icona per obrir el telèfon"</string> diff --git a/packages/SystemUI/res/values-cs/config.xml b/packages/SystemUI/res/values-cs/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-cs/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 9cee77836218..80c617989b95 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Vyhledávání obličeje"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Obličej byl ověřen"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Potvrzeno"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Ověření dokončíte klepnutím na Potvrdit"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotkněte se snímače otisků prstů"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otisku prstu"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hledáme vás…"</string> @@ -403,7 +404,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Méně urgentní oznámení níže"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Oznámení otevřete opětovným klepnutím"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Zařízení odemknete přejetím prstem nahoru"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Otevřete přejetím prstem nahoru"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Toto zařízení spravuje vaše organizace"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Toto zařízení je spravováno organizací <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Telefon otevřete přejetím prstem od ikony"</string> diff --git a/packages/SystemUI/res/values-da/config.xml b/packages/SystemUI/res/values-da/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-da/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 7ced76852607..90ead3514b1d 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Søger efter dit ansigt"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Ansigtet er godkendt"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Bekræftet"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Tryk på Bekræft for at udføre"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sæt fingeren på fingeraftrykslæseren"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon for fingeraftryk"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Forsøger at finde dig…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Mindre presserende notifikationer nedenfor"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Tryk igen for at åbne"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Stryg opad for at låse op"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Stryg opad for at åbne"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Denne enhed administreres af din organisation"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Denne enhed administreres af <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Stryg fra telefonikonet"</string> diff --git a/packages/SystemUI/res/values-de/config.xml b/packages/SystemUI/res/values-de/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-de/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 5d659c6ff636..408254f7c9e6 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Nach deinem Gesicht wird gesucht"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Gesicht authentifiziert"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Bestätigt"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Zum Abschließen auf \"Bestätigen\" tippen"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Berühre den Fingerabdrucksensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerabdruck-Symbol"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Wir suchen nach dir…"</string> @@ -403,7 +404,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Weniger dringende Benachrichtigungen unten"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Erneut tippen, um Benachrichtigung zu öffnen"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Zum Entsperren nach oben wischen"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Zum Öffnen nach oben wischen"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Dieses Gerät wird von deiner Organisation verwaltet"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Dieses Gerät wird von <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> verwaltet"</string> <string name="phone_hint" msgid="4872890986869209950">"Zum Öffnen des Telefons vom Symbol wegwischen"</string> diff --git a/packages/SystemUI/res/values-el/config.xml b/packages/SystemUI/res/values-el/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-el/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index c232ad648a2f..0ceef42a9dc3 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Αναζήτηση για το πρόσωπό σας"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Έγινε έλεγχος ταυτότητας προσώπου"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Επιβεβαιώθηκε"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Πατήστε Επιβεβαίωση για ολοκλήρωση"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Αγγίξτε τον αισθητήρα δακτυλικών αποτυπωμάτων"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Αναζήτηση για εσάς…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Λιγότερο επείγουσες ειδοποιήσεις παρακάτω"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Πατήστε ξανά για να ανοίξετε"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Σύρετε για να ξεκλειδώσετε"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Σύρετε προς τα επάνω για άνοιγμα"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Αυτή η συσκευή είναι διαχειριζόμενη από τον οργανισμό σας"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Τη συσκευή διαχειρίζεται ο οργανισμός <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Σύρετε προς τα έξω για τηλέφωνο"</string> diff --git a/packages/SystemUI/res/values-en-rAU/config.xml b/packages/SystemUI/res/values-en-rAU/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-en-rAU/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index d184a33a5fa6..dc661dd14a4e 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Looking for your face"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Face authenticated"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmed"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Tap Confirm to complete"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Less urgent notifications below"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Tap again to open"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Swipe up to unlock"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Swipe up to open"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"This device is managed by your organisation"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"This device is managed by <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Swipe from icon for phone"</string> diff --git a/packages/SystemUI/res/values-en-rCA/config.xml b/packages/SystemUI/res/values-en-rCA/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-en-rCA/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 3bfca58f7ef0..9903cc04e97a 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Looking for your face"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Face authenticated"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmed"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Tap Confirm to complete"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Less urgent notifications below"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Tap again to open"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Swipe up to unlock"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Swipe up to open"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"This device is managed by your organisation"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"This device is managed by <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Swipe from icon for phone"</string> diff --git a/packages/SystemUI/res/values-en-rGB/config.xml b/packages/SystemUI/res/values-en-rGB/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-en-rGB/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index d184a33a5fa6..dc661dd14a4e 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Looking for your face"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Face authenticated"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmed"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Tap Confirm to complete"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Less urgent notifications below"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Tap again to open"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Swipe up to unlock"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Swipe up to open"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"This device is managed by your organisation"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"This device is managed by <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Swipe from icon for phone"</string> diff --git a/packages/SystemUI/res/values-en-rIN/config.xml b/packages/SystemUI/res/values-en-rIN/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-en-rIN/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index d184a33a5fa6..dc661dd14a4e 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Looking for your face"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Face authenticated"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmed"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Tap Confirm to complete"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Less urgent notifications below"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Tap again to open"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Swipe up to unlock"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Swipe up to open"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"This device is managed by your organisation"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"This device is managed by <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Swipe from icon for phone"</string> diff --git a/packages/SystemUI/res/values-en-rXC/config.xml b/packages/SystemUI/res/values-en-rXC/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-en-rXC/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index d12e881081c8..d8c862affe08 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Looking for your face"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Face authenticated"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmed"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Tap Confirm to complete"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Less urgent notifications below"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Tap again to open"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Swipe up to unlock"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Swipe up to open"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"This device is managed by your organization"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"This device is managed by <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Swipe from icon for phone"</string> diff --git a/packages/SystemUI/res/values-es-rUS/config.xml b/packages/SystemUI/res/values-es-rUS/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-es-rUS/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index c4cf829363ee..37aae55d2b8b 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Buscando tu rostro"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Se autenticó el rostro"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmado"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Presiona Confirmar para completarla"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor de huellas digitales"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícono de huella digital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Autenticando tu rostro…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificaciones menos urgentes abajo"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Presionar de nuevo para abrir"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Desliza el dedo hacia arriba para desbloquear el teléfono"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Desliza el dedo hacia arriba para abrir"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Tu organización administra este dispositivo"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> administra este dispositivo"</string> <string name="phone_hint" msgid="4872890986869209950">"Desliza el dedo para desbloquear el teléfono."</string> diff --git a/packages/SystemUI/res/values-es/config.xml b/packages/SystemUI/res/values-es/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-es/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 685f449b19ae..bcb25f5e905f 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Buscando tu cara"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Cara autenticada"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmada"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Toca Confirmar para completar la acción"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor de huellas digitales"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icono de huella digital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Buscando tu cara…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificaciones menos urgente abajo"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Toca de nuevo para abrir"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Desliza el dedo hacia arriba para desbloquear"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Desliza el dedo hacia arriba para abrir"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Este dispositivo está administrado por tu organización"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Este dispositivo está administrado por <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Desliza desde el icono para abrir el teléfono"</string> diff --git a/packages/SystemUI/res/values-et/config.xml b/packages/SystemUI/res/values-et/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-et/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 039100d2ef90..729bba4872bb 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Teie näo vaatamine"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Nägu on autenditud"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Kinnitatud"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Lõpuleviimiseks puudutage nuppu Kinnita"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Puudutage sõrmejäljeandurit"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Sõrmejälje ikoon"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Otsitakse teid …"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Vähem kiireloomulised märguanded on allpool"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Avamiseks puudutage uuesti"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Lukustuse tühistamiseks pühkige üles"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Pühkige avamiseks üles"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Seda seadet haldab teie organisatsioon"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Seda seadet haldab <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Telefoni kasutamiseks pühkige ikoonilt eemale"</string> diff --git a/packages/SystemUI/res/values-eu/config.xml b/packages/SystemUI/res/values-eu/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-eu/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 31a7d52cb583..7b2d7936d5ef 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Aurpegia bilatzen"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Autentifikatu da aurpegia"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Berretsita"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Amaitzeko, sakatu \"Berretsi\""</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sakatu hatz-marken sentsorea"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Hatz-markaren ikonoa"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Zure bila…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Horren premiazkoak ez diren jakinarazpenak daude behean"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Irekitzeko, ukitu berriro"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Desblokeatzeko, pasatu hatza gora"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Pasatu hatza gora irekitzeko"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Zure erakundeak kudeatzen du gailua"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> erakundeak kudeatzen du gailu hau"</string> <string name="phone_hint" msgid="4872890986869209950">"Pasatu hatza ikonotik, telefonoa irekitzeko"</string> diff --git a/packages/SystemUI/res/values-fa/config.xml b/packages/SystemUI/res/values-fa/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-fa/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 4ccf8ed28f7c..bbbfe0ac8dc2 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"درحال جستجوی چهره"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"چهره احراز هویت شد"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"تأیید شد"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"برای تکمیل، روی تأیید ضربه بزنید"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"حسگر اثر انگشت را لمس کنید"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"نماد اثر انگشت"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"درحال جستجوی شما…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"اعلانهای کمتر فوری در زیر"</string> <string name="notification_tap_again" msgid="7590196980943943842">"دوباره ضربه بزنید تا باز شود"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"برای باز کردن قفل سریع به بالا بکشید"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"برای باز کردن، انگشتتان را تند به بالا بکشید"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"سازمان شما این دستگاه را مدیریت میکند"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"این دستگاه توسط <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> مدیریت میشود"</string> <string name="phone_hint" msgid="4872890986869209950">"انگشتتان را از نماد تلفن تند بکشید"</string> diff --git a/packages/SystemUI/res/values-fi/config.xml b/packages/SystemUI/res/values-fi/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-fi/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 0424e31903c1..2a4f70eef78a 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Kasvojasi katsotaan"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Kasvot tunnistettu"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Vahvistettu"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Valitse lopuksi Vahvista"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Kosketa sormenjälkitunnistinta"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Sormenjälkikuvake"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Etsitään kasvoja…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Vähemmän kiireelliset ilmoitukset ovat alla"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Avaa napauttamalla uudelleen"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Avaa lukitus pyyhkäisemällä ylös"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Avaa pyyhkäisemällä ylös"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Organisaatiosi hallinnoi laitetta"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Tätä laitetta hallinnoi <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>."</string> <string name="phone_hint" msgid="4872890986869209950">"Avaa puhelu pyyhkäisemällä."</string> diff --git a/packages/SystemUI/res/values-fr-rCA/config.xml b/packages/SystemUI/res/values-fr-rCA/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-fr-rCA/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 119eb59c4137..552d12ee6390 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"L\'appareil recherche votre visage…"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Visage authentifié"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmé"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Touchez Confirmer pour terminer"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touchez le capteur d\'empreintes digitales"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Recherche de votre visage…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notifications moins urgentes affichées ci-dessous"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Touchez à nouveau pour ouvrir"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Glissez vers le haut pour déverrouiller"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Balayez l\'écran vers le haut pour ouvrir"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Cet appareil est géré par votre organisation"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Cet appareil est géré par <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Balayez à partir de l\'icône pour accéder au téléphone"</string> @@ -885,7 +886,7 @@ <string name="qs_dnd_prompt_app" msgid="7978037419334156034">"Le mode Ne pas déranger a été activé par une application (<xliff:g id="ID_1">%s</xliff:g>)."</string> <string name="qs_dnd_prompt_auto_rule_app" msgid="2599343675391111951">"Le mode Ne pas déranger a été activé par une règle automatique ou une application."</string> <string name="qs_dnd_until" msgid="3469471136280079874">"Jusqu\'à <xliff:g id="ID_1">%s</xliff:g>"</string> - <string name="qs_dnd_keep" msgid="1825009164681928736">"Garder"</string> + <string name="qs_dnd_keep" msgid="1825009164681928736">"Conserver"</string> <string name="qs_dnd_replace" msgid="8019520786644276623">"Remplacer"</string> <string name="running_foreground_services_title" msgid="381024150898615683">"Applications qui fonctionnent en arrière-plan"</string> <string name="running_foreground_services_msg" msgid="6326247670075574355">"Touchez pour afficher des détails sur l\'utilisation de la pile et des données"</string> diff --git a/packages/SystemUI/res/values-fr/config.xml b/packages/SystemUI/res/values-fr/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-fr/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 60ff38f9cf6e..75a76ae66093 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Recherche de votre visage…"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Visage authentifié"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmé"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Appuyez sur \"Confirmer\" pour terminer"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Appuyez sur le lecteur d\'empreinte digitale"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Recherche de votre visage…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notifications moins urgentes ci-dessous"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Appuyer à nouveau pour ouvrir"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Faire glisser pour déverrouiller"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Balayer vers le haut pour ouvrir"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Cet appareil est géré par votre entreprise"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Cet appareil est géré par <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Balayer pour téléphoner"</string> diff --git a/packages/SystemUI/res/values-gl/config.xml b/packages/SystemUI/res/values-gl/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-gl/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index b3e0fa5d746b..3268ed06ff56 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Buscando a túa cara"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Autenticouse a cara"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmada"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Toca Confirmar para completar o proceso"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca o sensor de impresión dixital"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona de impresión dixital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Buscándote…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificacións menos urxentes abaixo"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Toca de novo para abrir"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Pasa o dedo cara arriba para desbloquear"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Pasa o dedo cara arriba para abrir"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Este dispositivo está xestionado pola túa organización"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Este dispositivo está xestionado por <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Pasa o dedo desde a icona para acceder ao teléfono"</string> diff --git a/packages/SystemUI/res/values-gu/config.xml b/packages/SystemUI/res/values-gu/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-gu/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 00308a3140d3..7a1994aac22d 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"તમારો ચહેરો શોધી રહ્યાં છીએ"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"ચહેરાનું પ્રમાણીકરણ થયું"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"પુષ્ટિ કરી"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"પરીક્ષણ પૂર્ણ કરવા કન્ફર્મ કરોને ટૅપ કરો"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ફિંગરપ્રિન્ટના સેન્સરને સ્પર્શ કરો"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ફિંગરપ્રિન્ટનું આઇકન"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"તમારા માટે શોધી રહ્યાં છે..."</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"નીચે ઓછી તાકીદની સૂચનાઓ"</string> <string name="notification_tap_again" msgid="7590196980943943842">"ખોલવા માટે ફરીથી ટૅપ કરો"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"અનલૉક કરવા માટે ઉપર સ્વાઇપ કરો"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"ખોલવા માટે ઉપરની તરફ સ્વાઇપ કરો"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"આ ઉપકરણ તમારી સંસ્થા દ્વારા સંચાલિત છે"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"આ ઉપકરણ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> દ્વારા સંચાલિત થાય છે"</string> <string name="phone_hint" msgid="4872890986869209950">"ફોન માટે આયકનમાંથી સ્વાઇપ કરો"</string> diff --git a/packages/SystemUI/res/values-hi/config.xml b/packages/SystemUI/res/values-hi/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-hi/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 566731cbacf9..3fa2a48188c9 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -46,8 +46,8 @@ <string name="bluetooth_tethered" msgid="7094101612161133267">"ब्लूटूथ टीदर किया गया"</string> <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"इनपुट का तरीका सेट करें"</string> <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"सामान्य कीबोर्ड"</string> - <string name="usb_device_permission_prompt" msgid="1825685909587559679">"<xliff:g id="APPLICATION">%1$s</xliff:g> को <xliff:g id="USB_DEVICE">%2$s</xliff:g> के एक्सेस की अनुमति दें?"</string> - <string name="usb_accessory_permission_prompt" msgid="2465531696941369047">"<xliff:g id="APPLICATION">%1$s</xliff:g> को <xliff:g id="USB_ACCESSORY">%2$s</xliff:g> के एक्सेस की अनुमति दें?"</string> + <string name="usb_device_permission_prompt" msgid="1825685909587559679">"<xliff:g id="APPLICATION">%1$s</xliff:g> को <xliff:g id="USB_DEVICE">%2$s</xliff:g> के ऐक्सेस की अनुमति दें?"</string> + <string name="usb_accessory_permission_prompt" msgid="2465531696941369047">"<xliff:g id="APPLICATION">%1$s</xliff:g> को <xliff:g id="USB_ACCESSORY">%2$s</xliff:g> के ऐक्सेस की अनुमति दें?"</string> <string name="usb_device_confirm_prompt" msgid="7440562274256843905">"<xliff:g id="USB_DEVICE">%2$s</xliff:g> के लिए <xliff:g id="APPLICATION">%1$s</xliff:g> खोलें?"</string> <string name="usb_accessory_confirm_prompt" msgid="4333670517539993561">"<xliff:g id="USB_ACCESSORY">%2$s</xliff:g> के लिए <xliff:g id="APPLICATION">%1$s</xliff:g> खोलें?"</string> <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"इस USB सहायक डिवाइस के साथ कोई भी इंस्टॉल ऐप्स काम नहीं करता. इस सहायक डिवाइस के बारे में यहां ज़्यादा जानें: <xliff:g id="URL">%1$s</xliff:g>"</string> @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"आपके चेहरे की पुष्टि की जा रही है"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"चेहरे की पुष्टि हो गई"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"पुष्टि हो गई"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"\'पुष्टि करें\' पर टैप करके पूरा करें"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फ़िंगरप्रिंट सेंसर को छुएं"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फ़िंगरप्रिंट आइकॉन"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"आपको पहचान रहा है…"</string> @@ -204,7 +205,7 @@ <string name="accessibility_overflow_action" msgid="5681882033274783311">"पूरी सूचनाएं देखें"</string> <string name="accessibility_remove_notification" msgid="3603099514902182350">"सूचना साफ़ करें"</string> <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS सक्षम."</string> - <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS प्राप्त करना."</string> + <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS पाना."</string> <string name="accessibility_tty_enabled" msgid="4613200365379426561">"टेलीटाइपराइटर सक्षम."</string> <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"रिंगर कंपन (वाइब्रेशन)."</string> <string name="accessibility_ringer_silent" msgid="9061243307939135383">"रिंगर मौन."</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"कम अत्यावश्यक सूचनाएं नीचे दी गई हैं"</string> <string name="notification_tap_again" msgid="7590196980943943842">"खोलने के लिए फिर से टैप करें"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"अनलॉक करने के लिए ऊपर स्वाइप करें"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"खोलने के लिए ऊपर स्वाइप करें"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"इस डिवाइस का प्रबंधन आपका संगठन करता है"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"इस डिवाइस के प्रबंधक <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> हैं"</string> <string name="phone_hint" msgid="4872890986869209950">"फ़ोन के लिए आइकॉन से स्वाइप करें"</string> @@ -451,8 +452,8 @@ <string name="battery_saver_notification_title" msgid="8614079794522291840">"बैटरी सेवर चालू है"</string> <string name="battery_saver_notification_text" msgid="820318788126672692">"निष्पादन और पृष्ठभूमि डेटा को कम करता है"</string> <string name="battery_saver_notification_action_text" msgid="132118784269455533">"बैटरी सेवर बंद करें"</string> - <string name="media_projection_dialog_text" msgid="8585357687598538511">"रिकॉर्ड या कास्ट करते समय, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> आपकी स्क्रीन पर दिखाई जा रही या आपके डिवाइस पर चलाई जा रही संवेदनशील जानकारी एक्सेस कर सकता है. इस जानकारी में ऑडियो, पासवर्ड, भुगतान की जानकारी, फ़ोटो और मैसेज शामिल हैं."</string> - <string name="media_projection_dialog_service_text" msgid="3075544489835858258">"रिकॉर्ड या कास्ट करते समय, यह सेवा देने वाला ऐप्लिकेशन आपकी स्क्रीन पर दिखाई जा रही या आपके डिवाइस पर चलाई जा रही संवेदनशील जानकारी एक्सेस कर सकता है. इस जानकारी में ऑडियो, पासवर्ड, भुगतान की जानकारी, फ़ोटो और मैसेज शामिल हैं."</string> + <string name="media_projection_dialog_text" msgid="8585357687598538511">"रिकॉर्ड या कास्ट करते समय, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> आपकी स्क्रीन पर दिखाई जा रही या आपके डिवाइस पर चलाई जा रही संवेदनशील जानकारी ऐक्सेस कर सकता है. इस जानकारी में ऑडियो, पासवर्ड, भुगतान की जानकारी, फ़ोटो और मैसेज शामिल हैं."</string> + <string name="media_projection_dialog_service_text" msgid="3075544489835858258">"रिकॉर्ड या कास्ट करते समय, यह सेवा देने वाला ऐप्लिकेशन आपकी स्क्रीन पर दिखाई जा रही या आपके डिवाइस पर चलाई जा रही संवेदनशील जानकारी ऐक्सेस कर सकता है. इस जानकारी में ऑडियो, पासवर्ड, भुगतान की जानकारी, फ़ोटो और मैसेज शामिल हैं."</string> <string name="media_projection_dialog_title" msgid="8124184308671641248">"कास्ट करने/रिकॉर्ड करने के दौरान संवेदनशील जानकारी का सबके सामने आ जाना"</string> <string name="media_projection_remember_text" msgid="3103510882172746752">"फिर से न दिखाएं"</string> <string name="clear_all_notifications_text" msgid="814192889771462828">"सभी को हटाएं"</string> diff --git a/packages/SystemUI/res/values-hr/config.xml b/packages/SystemUI/res/values-hr/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-hr/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 4e0be9d5db11..2954de21b334 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Traženje lica"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Lice je autentificirano"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Potvrđeno"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Dodirnite Potvrdi za dovršetak"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dodirnite senzor otiska prsta"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otiska prsta"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Tražimo vas…"</string> @@ -401,7 +402,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Manje hitne obavijesti pri dnu"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Dodirnite opet za otvaranje"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Prijeđite prstom prema gore za otključavanje"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Prijeđite prstom prema gore da biste otvorili"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Ovim uređajem upravlja vaša organizacija"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Ovim uređajem upravlja <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Prijeđite prstom od ikone za telefon"</string> diff --git a/packages/SystemUI/res/values-hu/config.xml b/packages/SystemUI/res/values-hu/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-hu/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 2297f1eb8d5d..e7e039e930cb 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Arc keresése"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Arc hitelesítve"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Megerősítve"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Koppintson a Megerősítés lehetőségre"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Érintse meg az ujjlenyomat-érzékelőt"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ujjlenyomat ikonja"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Keresem az Ön arcát…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"A kevésbé sürgős értesítések lentebb vannak"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Koppintson ismét a megnyitáshoz"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Húzza felfelé az ujját a feloldáshoz"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Csúsztasson felfelé a megnyitáshoz"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Az eszközt az Ön szervezete kezeli"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Az eszközt a(z) <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> felügyeli."</string> <string name="phone_hint" msgid="4872890986869209950">"A telefonhoz csúsztasson az ikonról"</string> diff --git a/packages/SystemUI/res/values-hy/config.xml b/packages/SystemUI/res/values-hy/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-hy/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 54ba5b0619ea..3156a6f6fda2 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Դեմքի նույնականացում"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Դեմքը ճանաչվեց"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Հաստատվեց"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Ավարտելու համար հպեք «Հաստատել»"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Հպեք մատնահետքի սկաներին"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Մատնահետքի պատկերակ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Դեմքի ճանաչում…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Պակաս հրատապ ծանուցումները ստորև"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Կրկին հպեք՝ բացելու համար"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Սահեցրեք վերև` ապակողպելու համար"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Բացելու համար սահեցրեք վերև"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Այս սարքը կառավարում է ձեր կազմակերպությունը"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Այս սարքը կառավարվում է <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>-ի կողմից"</string> <string name="phone_hint" msgid="4872890986869209950">"Սահահարվածեք հեռախոսի պատկերակից"</string> diff --git a/packages/SystemUI/res/values-in/config.xml b/packages/SystemUI/res/values-in/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-in/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 98af02a6f976..19b2b99344a6 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Mencari wajah Anda"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Wajah diautentikasi"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Dikonfirmasi"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Ketuk Konfirmasi untuk menyelesaikan"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sentuh sensor sidik jari"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon sidik jari"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Mencari wajah Anda…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notifikasi kurang darurat di bawah"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Ketuk lagi untuk membuka"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Geser ke atas untuk membuka kunci"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Geser ke atas untuk membuka"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Perangkat ini dikelola oleh organisasi"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Perangkat ini dikelola oleh <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Geser dari ikon untuk telepon"</string> diff --git a/packages/SystemUI/res/values-is/config.xml b/packages/SystemUI/res/values-is/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-is/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 6067547fcfce..0076add53045 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Leitar að andliti þínu"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Andlit staðfest"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Staðfest"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Ýttu á „Staðfesta“ til að ljúka"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Snertu fingrafaralesarann"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingrafaratákn"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Leitar að þér ..."</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Minna áríðandi tilkynningar fyrir neðan"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Ýttu aftur til að opna"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Strjúktu upp til að opna"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Strjúktu upp til að opna"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Þessu tæki er stýrt af fyrirtækinu þínu"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Þessu tæki er stýrt af <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Strjúktu frá tákninu fyrir síma"</string> diff --git a/packages/SystemUI/res/values-it/config.xml b/packages/SystemUI/res/values-it/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-it/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index ccff49450d00..78d3d8a0aaa6 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Ricerca del tuo volto"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Volto autenticato"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confermato"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Tocca Conferma per completare"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Tocca il sensore di impronte digitali"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona dell\'impronta digitale"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"In attesa del volto…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notifiche meno urgenti in basso"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Tocca ancora per aprire"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Scorri verso l\'alto per sbloccare"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Scorri verso l\'alto per aprire"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Questo dispositivo è gestito dalla tua organizzazione"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Questo dispositivo è gestito da <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Scorri per accedere al telefono"</string> diff --git a/packages/SystemUI/res/values-iw/config.xml b/packages/SystemUI/res/values-iw/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-iw/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index df8dac4a5476..3a1525ccc981 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"המערכת מחפשת את הפנים שלך"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"זיהוי הפנים בוצע"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"מאושר"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"יש להקיש על \'אישור\' לסיום"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"יש לגעת בחיישן טביעות האצבע"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"סמל טביעת אצבע"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"מחפש אותך…"</string> @@ -403,7 +404,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"התראות בדחיפות נמוכה יותר בהמשך"</string> <string name="notification_tap_again" msgid="7590196980943943842">"הקש שוב כדי לפתוח"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"החלק מעלה כדי לבטל את הנעילה"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"צריך להחליק כדי לפתוח"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"מכשיר זה מנוהל על ידי הארגון שלך"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"המכשיר הזה מנוהל על ידי <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"החלק מהסמל כדי להפעיל את הטלפון"</string> diff --git a/packages/SystemUI/res/values-ja/config.xml b/packages/SystemUI/res/values-ja/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ja/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 534fad7fe501..51e19a2955b2 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"顔を認証中です"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"顔を認証しました"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"確認しました"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"完了するには [確認] をタップしてください"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"指紋認証センサーをタップしてください"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋アイコン"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"顔を認証しています…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"緊急度の低い通知を下に表示"</string> <string name="notification_tap_again" msgid="7590196980943943842">"開くにはもう一度タップしてください"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"ロック解除するには上にスワイプしてください"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"開くには上にスワイプします"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"このデバイスは組織によって管理されています"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"このデバイスは <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> が管理しています"</string> <string name="phone_hint" msgid="4872890986869209950">"右にスワイプして通話"</string> diff --git a/packages/SystemUI/res/values-ka/config.xml b/packages/SystemUI/res/values-ka/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ka/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 0bb4d829d075..058f23351bd8 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"მიმდინარეობს თქვენი სახის ძებნა"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"სახის ამოცნობილია"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"დადასტურებული"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"დასასრულებლად შეეხეთ „დადასტურებას“"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"შეეხეთ თითის ანაბეჭდის სენსორს"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"თითის ანაბეჭდის ხატულა"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"მიმდინარეობს თქვენი ძიება…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"ქვემოთ მითითებულია ნაკლებად სასწრაფო შეტყობინებები"</string> <string name="notification_tap_again" msgid="7590196980943943842">"შეეხეთ ისევ გასახსნელად"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"გაასრიალეთ ზევით განსაბლოკად"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"გასახსნელად გადაფურცლეთ ზემოთ"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"ამ მოწყობილობას მართავს თქვენი ორგანიზაცია"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"ამ მოწყობილობას მართავს <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"ტელეფონისთვის გადაფურცლეთ ხატულადან"</string> diff --git a/packages/SystemUI/res/values-kk/config.xml b/packages/SystemUI/res/values-kk/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-kk/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index e891fc044ba7..1b201ddf37dc 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Құрылғы бетіңізді талдап жатыр."</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Бет танылды."</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Расталды"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Аяқтау үшін \"Растау\" түймесін түртіңіз."</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Саусақ ізін оқу сканерін түртіңіз"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Саусақ ізі белгішесі"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Бет ізделуде…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Шұғылдығы азырақ хабарландырулар төменде"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Ашу үшін қайта түртіңіз"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Құлыпты ашу үшін жоғары сырғытыңыз"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Ашу үшін жоғары қарай сырғытыңыз."</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Бұл құрылғыны ұйым басқарады"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Бұл құрылғыны <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> басқарады"</string> <string name="phone_hint" msgid="4872890986869209950">"Телефонды ашу үшін белгішеден әрі қарай сырғытыңыз"</string> diff --git a/packages/SystemUI/res/values-km/config.xml b/packages/SystemUI/res/values-km/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-km/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 173db1898efd..a9ff164e5cd3 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"កំពុងផ្ទៀងផ្ទាត់មុខរបស់អ្នក"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"បានផ្ទៀងផ្ទាត់មុខ"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"បានបញ្ជាក់"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"ចុច \"បញ្ជាក់\" ដើម្បីបញ្ចប់"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ប៉ះឧបករណ៍ចាប់ស្នាមម្រាមដៃ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"រូបតំណាងស្នាមម្រាមដៃ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"កំពុងស្វែងរកអ្នក…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"ការជូនដំណឹងមិនសូវបន្ទាន់ខាងក្រោម"</string> <string name="notification_tap_again" msgid="7590196980943943842">"ប៉ះម្ដងទៀត ដើម្បីបើក"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"អូសឡើងលើ ដើម្បីដោះសោ"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"អូសឡើងលើដើម្បីបើក"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"ឧបករណ៍នេះស្ថិតក្រោមការគ្រប់គ្រងរបស់ស្ថាប័នអ្នក"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"ឧបករណ៍នេះស្ថិតក្រោមការគ្រប់គ្រងរបស់ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"អូសចេញពីរូបតំណាងដើម្បីប្រើទូរស័ព្ទ"</string> diff --git a/packages/SystemUI/res/values-kn/config.xml b/packages/SystemUI/res/values-kn/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-kn/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index b8f2324129f0..e3f387992976 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"ನಿಮ್ಮ ಮುಖದ ದೃಢೀಕರಣಕ್ಕಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"ಮುಖವನ್ನು ದೃಢೀಕರಿಸಲಾಗಿದೆ"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"ದೃಢೀಕರಿಸಲಾಗಿದೆ"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"ಪೂರ್ಣಗೊಳಿಸಲು ದೃಢೀಕರಿಸಿ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಐಕಾನ್"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ನಿಮಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"ಕೆಳಗೆ ಕಡಿಮೆ ಅವಸರದ ಅಧಿಸೂಚನೆಗಳು"</string> <string name="notification_tap_again" msgid="7590196980943943842">"ತೆರೆಯಲು ಮತ್ತೆ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಸ್ವೈಪ್ ಮಾಡಿ"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"ತೆರೆಯಲು ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"ಈ ಸಾಧನವನ್ನು ನಿಮ್ಮ ಸಂಸ್ಥೆ ನಿರ್ವಹಿಸುತ್ತಿದೆ"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"ಈ ಸಾಧನವನ್ನು <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ರಿಂದ ನಿರ್ವಹಿಸಲಾಗಿದೆ"</string> <string name="phone_hint" msgid="4872890986869209950">"ಫೋನ್ಗಾಗಿ ಐಕಾನ್ನಿಂದ ಸ್ವೈಪ್ ಮಾಡಿ"</string> diff --git a/packages/SystemUI/res/values-ko/config.xml b/packages/SystemUI/res/values-ko/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ko/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 4a1b947141c1..75af4f142ae9 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"얼굴을 찾는 중"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"얼굴이 인증되었습니다."</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"확인함"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"완료하려면 확인을 탭하세요."</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"지문 센서를 터치하세요."</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"지문 아이콘"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"찾는 중..."</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"아래에 덜 급한 알림 표시"</string> <string name="notification_tap_again" msgid="7590196980943943842">"다시 탭하여 열기"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"위로 스와이프하여 잠금 해제"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"위로 스와이프하여 열기"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"조직에서 관리하는 기기입니다."</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>에서 관리하는 기기입니다."</string> <string name="phone_hint" msgid="4872890986869209950">"전화 기능을 사용하려면 아이콘에서 스와이프하세요."</string> diff --git a/packages/SystemUI/res/values-ky/config.xml b/packages/SystemUI/res/values-ky/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ky/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index ce6b64cbfbbf..b094746730bf 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Жүзүңүз изделүүдө"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Жүздүн аныктыгы текшерилди"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Ырасталды"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Бүтүрүү үчүн \"Ырастоо\" баскычын басыңыз"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Манжа изинин сенсорун басыңыз"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Манжа изинин сүрөтчөсү"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Жүзүңүз изделүүдө…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Анчейин шашылыш эмес эскертмелер төмөндө"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Ачуу үчүн кайра таптап коюңуз"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Кулпуну ачуу үчүн серпип коюңуз"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Ачуу үчүн өйдө сүрүңүз"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Бул түзмөк уюмуңуз тарабынан башкарылат"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Бул түзмөк <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> тарабынан башкарылат"</string> <string name="phone_hint" msgid="4872890986869209950">"Сүрөтчөнү серпип телефонго өтүңүз"</string> diff --git a/packages/SystemUI/res/values-lo/config.xml b/packages/SystemUI/res/values-lo/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-lo/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index beaf98b2c67f..7bf95b19b748 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"ກຳລັງເບິ່ງໃບໜ້າຂອງທ່ານ"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"ພິສູດຢືນຢັນໃບໜ້າແລ້ວ"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"ຢືນຢັນແລ້ວ"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"ແຕະຢືນຢັນເພື່ອສຳເລັດ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ແຕະໃສ່ເຊັນເຊີລາຍນິ້ວມື"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ໄອຄອນລາຍນິ້ວມື"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ກຳລັງຊອກຫາທ່ານ…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"ການແຈ້ງເຕືອນທີ່ສຳຄັນໜ້ອຍກວ່າຢູ່ດ້ານລຸ່ມ"</string> <string name="notification_tap_again" msgid="7590196980943943842">"ແຕະອີກຄັ້ງເພື່ອເປີດ"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"ເລື່ອນຂຶ້ນເພື່ອປົດລັອກ"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"ປັດຂຶ້ນເພື່ອເປີດ"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"ອຸປະກອນນີ້ແມ່ນຈັດການໂດຍອົງກອນຂອງທ່ານ"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"ອຸປະກອນນີ້ຖືກຈັດການໂດຍ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"ປັດຈາກໄອຄອນສຳລັບໂທລະສັບ"</string> diff --git a/packages/SystemUI/res/values-lt/config.xml b/packages/SystemUI/res/values-lt/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-lt/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 8897bcbceb57..fb5ec206ca7d 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Ieškoma veido"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Veidas autentifikuotas"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Patvirtinta"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Paliesk. „Patvirtinti“, kad užbaigtumėte"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Palieskite piršto antspaudo jutiklį"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Piršto antspaudo piktograma"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ieškoma jūsų…"</string> @@ -403,7 +404,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Mažiau skubūs pranešimai toliau"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Palieskite dar kartą, kad atidarytumėte"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Perbraukite aukštyn, kad atrakintumėte"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Perbraukite aukštyn, kad atidarytumėte"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Šį įrenginį tvarko jūsų organizacija"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Šį įrenginį tvarko <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Perbraukite iš telefono piktogramos"</string> diff --git a/packages/SystemUI/res/values-lv/config.xml b/packages/SystemUI/res/values-lv/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-lv/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 89be039862b7..581b68a02c64 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Tiek meklēta jūsu seja"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Seja autentificēta"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Apstiprināts"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Lai pabeigtu, pieskarieties Apstiprināt"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Pieskarieties pirksta nospieduma sensoram"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pirksta nospieduma ikona"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Notiek jūsu sejas meklēšana…"</string> @@ -401,7 +402,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Mazāk steidzami paziņojumi tiek rādīti tālāk"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Pieskarieties vēlreiz, lai atvērtu"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Velciet uz augšu, lai atbloķētu"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Velciet augšup, lai atvērtu"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Šo ierīci pārvalda jūsu organizācija"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Šo ierīci pārvalda <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Lai lietotu tālruni, velciet no ikonas"</string> diff --git a/packages/SystemUI/res/values-mk/config.xml b/packages/SystemUI/res/values-mk/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-mk/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 1ecb83308349..d745f8a021e8 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Го бараме вашето лице"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Лицето е проверено"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Потврдено"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Допрете „Потврди“ за да се заврши"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Допрете го сензорот за отпечатоци"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона за отпечатоци"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ве бараме вас…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Долу се помалку итни известувања"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Допрете повторно за да се отвори"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Повлечете за да се отклучи"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Повлечете за да отворите"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Вашата организација управува со уредов"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Уредов го управува <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Повлечете од иконата за телефонот"</string> diff --git a/packages/SystemUI/res/values-ml/config.xml b/packages/SystemUI/res/values-ml/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ml/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index c038b84b1ba8..eeaf0f9d3367 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"നിങ്ങളുടെ മുഖത്തിന് വേണ്ടി തിരയുന്നു"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"മുഖം പരിശോധിച്ചുറപ്പിച്ചു"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"സ്ഥിരീകരിച്ചു"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"പൂർത്തിയാക്കാൻ സ്ഥിരീകരിക്കുക ടാപ്പ് ചെയ്യൂ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"വിരലടയാള സെൻസർ സ്പർശിക്കുക"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"വിരലടയാള ഐക്കൺ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"നിങ്ങൾക്കായി തിരയുന്നു…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"ആവശ്യം കുറഞ്ഞ അറിയിപ്പുകൾ ചുവടെ നൽകിയിരിക്കുന്നു"</string> <string name="notification_tap_again" msgid="7590196980943943842">"തുറക്കുന്നതിന് വീണ്ടും ടാപ്പുചെയ്യുക"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"അൺലോക്കുചെയ്യുന്നതിന് മുകളിലേക്ക് സ്വൈപ്പുചെയ്യുക"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"തുറക്കാൻ മുകളിലോട്ട് സ്വൈപ്പ് ചെയ്യുക"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"ഈ ഉപകരണം മാനേജുചെയ്യുന്നത് നിങ്ങളുടെ സ്ഥാപനമാണ്"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g> മാനേജുചെയ്യുന്ന ഉപകരണമാണിത്"</string> <string name="phone_hint" msgid="4872890986869209950">"ഫോൺ ഐക്കണിൽ നിന്ന് സ്വൈപ്പുചെയ്യുക"</string> diff --git a/packages/SystemUI/res/values-mn/config.xml b/packages/SystemUI/res/values-mn/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-mn/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 0803dcb7a373..bd733ff048a0 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Таны царайг хайж байна"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Царайг баталгаажууллаа"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Баталгаажсан"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Дуусгахын тулд баталгаажуулахыг товших"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Хурууны хээ мэдрэгчид хүрэх"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Хурууны хээний дүрс тэмдэг"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Таныг хайж байна…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Яаралтай биш мэдэгдлүүдийг доор"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Нээхийн тулд дахин товшино уу"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Түгжээг тайлах бол шудрана уу"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Нээхийн тулд дээш шударна уу"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Энэ төхөөрөмжийг таны байгууллага удирдаж байна"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Энэ төхөөрөмжийг <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> удирддаг"</string> <string name="phone_hint" msgid="4872890986869209950">"Утсыг гаргахын тулд дүрс тэмдгээс шудрах"</string> diff --git a/packages/SystemUI/res/values-mr/config.xml b/packages/SystemUI/res/values-mr/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-mr/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index e40f5aa57554..676208bb02f7 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"तुमचा चेहरा शोधत आहे"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"चेहरा ऑथेंटिकेशन केलेला आहे"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"निश्चित केले"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"पूर्ण करण्यासाठी खात्री करा वर टॅप करा"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फिंगरप्रिंट सेन्सरला स्पर्श करा"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिंट आयकन"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"तुमच्यासाठी शोधत आहे…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"खाली कमी तातडीच्या सूचना"</string> <string name="notification_tap_again" msgid="7590196980943943842">"उघडण्यासाठी पुन्हा टॅप करा"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"अनलॉक करण्यासाठी स्वाइप करा"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"उघडण्यासाठी वर स्वाइप करा"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"हे डिव्हाइस तुमची संस्था व्यवस्थापित करते"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"हे डिव्हाइस <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ने व्यवस्थापित केले आहे"</string> <string name="phone_hint" msgid="4872890986869209950">"फोनसाठी चिन्हावरून स्वाइप करा"</string> @@ -746,7 +747,7 @@ <string name="data_saver" msgid="5037565123367048522">"डेटा सेव्हर"</string> <string name="accessibility_data_saver_on" msgid="8454111686783887148">"डेटा सेव्हर चालू आहे"</string> <string name="accessibility_data_saver_off" msgid="8841582529453005337">"डेटा सेव्हर बंद आहे"</string> - <string name="switch_bar_on" msgid="1142437840752794229">"चालू"</string> + <string name="switch_bar_on" msgid="1142437840752794229">"सुरू"</string> <string name="switch_bar_off" msgid="8803270596930432874">"बंद"</string> <string name="nav_bar" msgid="1993221402773877607">"नॅव्हिगेशन बार"</string> <string name="nav_bar_layout" msgid="3664072994198772020">"लेआउट"</string> diff --git a/packages/SystemUI/res/values-ms/config.xml b/packages/SystemUI/res/values-ms/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ms/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 871be05e444b..f58ea18619e1 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Mencari wajah anda"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Wajah disahkan"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Disahkan"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Ketik Sahkan untuk menyelesaikan"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sentuh penderia cap jari"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon cap jari"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Mencari anda…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Pemberitahuan kurang penting di bawah"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Ketik lagi untuk membuka"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Leret ke atas untuk membuka kunci"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Leret ke atas untuk buka"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Peranti ini diurus oleh organisasi anda"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Peranti ini diurus oleh <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Leret dari ikon untuk telefon"</string> diff --git a/packages/SystemUI/res/values-my/config.xml b/packages/SystemUI/res/values-my/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-my/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index d8a9a64ba5c0..19a9d1c96c2b 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"သင့်မျက်နှာကို ရှာနေသည်"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"မျက်နှာ အထောက်အထားစိစစ်ပြီးပြီ"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"အတည်ပြုပြီးပြီ"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"အပြီးသတ်ရန်အတွက် \'အတည်ပြုရန်\' ကို တို့ပါ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"လက်ဗွေအာရုံခံကိရိယာကို တို့ပါ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"လက်ဗွေ သင်္ကေတ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"သင့်ကို ရှာဖွေနေသည်…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"အရေးပါမှု နည်းသည့် အကြောင်းကြားချက်များ အောက်မှာ"</string> <string name="notification_tap_again" msgid="7590196980943943842">"ဖွင့်ရန် ထပ်ပြီး ပုတ်ပါ"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"သော့ဖွင့်ရန် အပေါ်သို့ ပွတ်ဆွဲပါ"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"ဖွင့်ရန် အပေါ်သို့ပွတ်ဆွဲပါ"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"ဤစက်ပစ္စည်းကို သင်၏အဖွဲ့အစည်းက စီမံခန့်ခွဲထားပါသည်"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"ဤစက်ပစ္စည်းကို <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> က စီမံခန့်ခွဲထားပါသည်"</string> <string name="phone_hint" msgid="4872890986869209950">"ဖုန်းအတွက် သင်္ကေတပုံအား ပွတ်ဆွဲပါ"</string> diff --git a/packages/SystemUI/res/values-nb/config.xml b/packages/SystemUI/res/values-nb/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-nb/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 3d00633d13dd..4288f3489891 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Ser etter ansiktet ditt"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Ansiktet er autentisert"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Bekreftet"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Trykk på Bekreft for å fullføre"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Trykk på fingeravtrykkssensoren"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon for fingeravtrykk"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ser etter deg …"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Mindre presserende varsler nedenfor"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Trykk på nytt for å åpne"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Sveip oppover for å låse opp"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Sveip opp for å åpne"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Denne enheten administreres av organisasjonen din"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Denne enheten administreres av <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Sveip ikonet for å åpne telefon"</string> diff --git a/packages/SystemUI/res/values-ne/config.xml b/packages/SystemUI/res/values-ne/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ne/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index ccf5037d62f5..70ebfd8ee60c 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"तपाईंको अनुहार खोज्दै"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"अनुहार प्रमाणीकरण गरियो"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"पुष्टि भयो"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"पूरा गर्नका लागि पुष्टि गर्नुहोस् नामक विकल्पमा ट्याप गर्नुहोस्"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फिंगरप्रिन्ट सेन्सरमा छुनुहोस्"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिन्ट जनाउने आइकन"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"तपाईंलाई खोज्दै…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"तल कम जरुरी सूचनाहरू"</string> <string name="notification_tap_again" msgid="7590196980943943842">"खोल्न पुनः ट्याप गर्नुहोस्"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"अनलक गर्न स्वाप गर्नुहोस्"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"खोल्न माथितिर स्वाइप गर्नुहोस्"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"तपाईंको संगठनले यस यन्त्रलाई व्यवस्थापन गर्दछ"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"यो यन्त्र <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> द्वारा व्यवस्थापन गरिएको छ"</string> <string name="phone_hint" msgid="4872890986869209950">"फोनको लागि आइकनबाट स्वाइप गर्नुहोस्"</string> diff --git a/packages/SystemUI/res/values-nl/config.xml b/packages/SystemUI/res/values-nl/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-nl/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index ae0149205bfd..88f5bd4e87bf 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Er wordt naar je gezicht gezocht"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Gezicht geverifieerd"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Bevestigd"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Tik op Bevestigen om te voltooien"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Raak de vingerafdruksensor aan"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Vingerafdrukpictogram"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Jouw gezicht zoeken…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Minder urgente meldingen onderaan"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Tik nog eens om te openen"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Veeg omhoog om te ontgrendelen"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Veeg omhoog om te openen"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Dit apparaat wordt beheerd door je organisatie"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Dit apparaat wordt beheerd door <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Vegen voor telefoon"</string> diff --git a/packages/SystemUI/res/values-or/config.xml b/packages/SystemUI/res/values-or/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-or/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 6646b8d30e10..7bc49ce1c57e 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"ଆପଣଙ୍କର ମୁହଁକୁ ପ୍ରମାଣ କରୁଛି"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"ମୁହଁ ପ୍ରାମାଣିକତା ହୋଇଛି"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"ସୁନିଶ୍ଚିତ କରାଯାଇଛି"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"ସମ୍ପୂର୍ଣ୍ଣ କରିବାକୁ ସୁନିଶ୍ଚିତ କରନ୍ତୁରେ ଟାପ୍ କରନ୍ତୁ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ଟିପଚିହ୍ନ ସେନସର୍କୁ ଛୁଅଁନ୍ତୁ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ଆଇକନ୍"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ଆପଣଙ୍କୁ ଚିହ୍ନଟ କରୁଛି…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"ନିମ୍ନରେ କମ୍ ଜରୁରୀ ବିଜ୍ଞପ୍ତି"</string> <string name="notification_tap_again" msgid="7590196980943943842">"ଖୋଲିବା ପାଇଁ ପୁଣି ଟାପ୍ କରନ୍ତୁ"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"ଅନଲକ୍ କରିବା ପାଇଁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"ଖୋଲିବା ପାଇଁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"ଏହି ଡିଭାଇସ୍ ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ପରିଚାଳିତ।"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"ଏହି ଡିଭାଇସ୍ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି"</string> <string name="phone_hint" msgid="4872890986869209950">"ଫୋନ୍ ପାଇଁ ଆଇକନରୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string> diff --git a/packages/SystemUI/res/values-pa/config.xml b/packages/SystemUI/res/values-pa/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-pa/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 393469ee0d9e..64e2d098c598 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"ਤੁਹਾਡਾ ਚਿਹਰਾ ਲੱਭਿਆ ਜਾ ਰਿਹਾ ਹੈ"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"ਚਿਹਰਾ ਪ੍ਰਮਾਣੀਕਿਰਤ ਹੋਇਆ"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"ਪੁਸ਼ਟੀ ਕੀਤੀ ਗਈ"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"ਪੂਰਾ ਕਰਨ ਲਈ ਪੁਸ਼ਟੀ ਕਰੋ \'ਤੇ ਟੈਪ ਕਰੋ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਪ੍ਰਤੀਕ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ਤੁਹਾਡੀ ਪਛਾਣ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"ਹੇਠਾਂ ਘੱਟ ਲਾਜ਼ਮੀ ਸੂਚਨਾਵਾਂ"</string> <string name="notification_tap_again" msgid="7590196980943943842">"ਖੋਲ੍ਹਣ ਲਈ ਦੁਬਾਰਾ ਟੈਪ ਕਰੋ"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"ਅਣਲਾਕ ਕਰਨ ਲਈ ਉੱਪਰ ਸਵਾਈਪ ਕਰੋ।"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"ਖੋਲ੍ਹਣ ਲਈ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"ਇਸ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਤੁਹਾਡੇ ਸੰਗਠਨ ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"ਇਹ ਡੀਵਾਈਸ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤਾ ਗਿਆ ਹੈ"</string> <string name="phone_hint" msgid="4872890986869209950">"ਫ਼ੋਨ ਲਈ ਪ੍ਰਤੀਕ ਤੋਂ ਸਵਾਈਪ ਕਰੋ"</string> diff --git a/packages/SystemUI/res/values-pl/config.xml b/packages/SystemUI/res/values-pl/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-pl/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 51c76a518de4..8463773316a1 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Szukam Twojej twarzy"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Twarz rozpoznana"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Potwierdzono"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Aby zakończyć, kliknij Potwierdź"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotknij czytnika linii papilarnych"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona odcisku palca"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Szukam Cię…"</string> @@ -405,7 +406,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Poniżej widać mniej pilne powiadomienia"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Kliknij ponownie, by otworzyć"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Przesuń w górę, by odblokować"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Przesuń w górę, by otworzyć"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Tym urządzeniem zarządza Twoja organizacja"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Tym urządzeniem zarządza <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Aby włączyć telefon, przesuń palcem od ikony"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/config.xml b/packages/SystemUI/res/values-pt-rBR/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-pt-rBR/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 2e74881ff847..c7e526371573 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Procurando seu rosto"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Rosto autenticado"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmada"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Toque em \"Confirmar\" para concluir"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toque no sensor de impressão digital"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Procurando você…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificações menos urgentes abaixo"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Toque novamente para abrir"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Deslize para cima para desbloquear"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Deslize para cima para abrir"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Este dispositivo é gerenciado pela sua organização"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Este dispositivo é gerenciado por <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Deslize a partir do ícone do telefone"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/config.xml b/packages/SystemUI/res/values-pt-rPT/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-pt-rPT/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index f6ee81ec932a..f60dcac34b53 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"A procurar o seu rosto…"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Rosto autenticado"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmado"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Toque em Confirmar para concluir."</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toque no sensor de impressões digitais."</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"À sua procura…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificações menos urgentes abaixo"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Toque novamente para abrir"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Deslizar rapidamente com o dedo para cima para desbloquear"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Deslize rapidamente para cima para abrir"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Este dispositivo é gerido pela sua entidade"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Este dispositivo é gerido por <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Deslize rapid. a partir do ícone para aceder ao telemóvel"</string> diff --git a/packages/SystemUI/res/values-pt/config.xml b/packages/SystemUI/res/values-pt/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-pt/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 2e74881ff847..c7e526371573 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Procurando seu rosto"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Rosto autenticado"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmada"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Toque em \"Confirmar\" para concluir"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toque no sensor de impressão digital"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Procurando você…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificações menos urgentes abaixo"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Toque novamente para abrir"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Deslize para cima para desbloquear"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Deslize para cima para abrir"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Este dispositivo é gerenciado pela sua organização"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Este dispositivo é gerenciado por <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Deslize a partir do ícone do telefone"</string> diff --git a/packages/SystemUI/res/values-ro/config.xml b/packages/SystemUI/res/values-ro/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ro/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 78c8ed2ff6a1..e070fd4fa75f 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Se caută chipul"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Chip autentificat"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Confirmat"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Atingeți Confirmați pentru a finaliza"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Atingeți senzorul de amprente"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pictograma amprentă"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Vă căutăm…"</string> @@ -401,7 +402,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificările mai puțin urgente mai jos"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Atingeți din nou pentru a deschide"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Glisați în sus pentru a debloca"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Glisați în sus pentru a deschide"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Acest dispozitiv este gestionat de organizația dvs."</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Acest dispozitiv este gestionat de <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Glisați dinspre telefon"</string> diff --git a/packages/SystemUI/res/values-ru/config.xml b/packages/SystemUI/res/values-ru/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ru/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index bcb6837bdb46..f895c02a7f53 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Распознавание лица"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Лицо распознано"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Подтверждено"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Нажмите \"Подтвердить\""</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Прикоснитесь к сканеру отпечатков пальцев."</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок отпечатка пальца"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Поиск лица…"</string> @@ -403,7 +404,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Показать менее важные уведомления"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Нажмите ещё раз, чтобы открыть"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Проведите вверх, чтобы разблокировать"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Проведите вверх, чтобы открыть"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Этим устройством управляет ваша организация"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Этим устройством управляет компания \"<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>\""</string> <string name="phone_hint" msgid="4872890986869209950">"Телефон: проведите от значка"</string> diff --git a/packages/SystemUI/res/values-si/config.xml b/packages/SystemUI/res/values-si/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-si/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 7bfa250f80d0..9e002152383e 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"ඔබේ මුහුණ සොයනු ලැබේ"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"මුහුණ සත්යාපන කළා"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"තහවුරු කළා"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"සම්පූර්ණ කිරීමට තහවුරු කරන්න තට්ටු කර."</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ඇඟිලි සලකුණු සංවේදකය ස්පර්ශ කරන්න"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ඇඟිලි සලකුණු නිරූපකය"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ඔබව සොයමින්…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"හදිසිය අඩු දැනුම් දීම් පහත"</string> <string name="notification_tap_again" msgid="7590196980943943842">"විවෘත කිරීමට නැවත තට්ටු කරන්න"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"අගුළු ඇරීමට ස්වයිප් කරන්න."</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"විවෘත කිරීමට ස්වයිප් කරන්න"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"මෙම උපාංගය ඔබගේ සංවිධානය විසින් කළමනාකරණය කරනු ලැබේ"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"මෙම උපාංගය <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> මගින් කළමනාකරණය කෙරේ"</string> <string name="phone_hint" msgid="4872890986869209950">"දුරකථනය සඳහා නිරූපකය වෙතින් ස්වයිප් කරන්න"</string> diff --git a/packages/SystemUI/res/values-sk/config.xml b/packages/SystemUI/res/values-sk/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-sk/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index cff792cb9316..dabe3308235f 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Hľadá sa vaša tvár"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Tvár bola overená"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Potvrdené"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Overenie dokončíte klepnutím na Potvrdiť"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotknite sa senzora odtlačkov prstov"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona odtlačku prsta"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hľadáme vás…"</string> @@ -403,7 +404,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Menej naliehavé upozornenia sa nachádzajú nižšie"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Upozornenie otvoríte opätovným klepnutím"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Odomknete prejdením prstom nahor"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Otvorte potiahnutím prstom nahor"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Toto zariadenie spravuje vaša organizácia"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Toto zariadenie spravuje organizácia <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Telefón otvoríte prejdením prstom od ikony"</string> diff --git a/packages/SystemUI/res/values-sl/config.xml b/packages/SystemUI/res/values-sl/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-sl/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index dd3b1c544188..2958dc870feb 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Iskanje obraza"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Pristnost obraza je potrjena"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Potrjeno"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Za dokončanje se dotaknite »Potrdite«"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotaknite se tipala prstnih odtisov"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona prstnih odtisov"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Preverjanje vašega obraza …"</string> @@ -403,7 +404,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Manj nujna obvestila spodaj"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Znova se dotaknite, da odprete"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Povlecite, da odklenete"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Povlecite navzgor, da odprete"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"To napravo upravlja vaša organizacija"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"To napravo upravlja <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Povlecite z ikone za telefon"</string> diff --git a/packages/SystemUI/res/values-sq/config.xml b/packages/SystemUI/res/values-sq/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-sq/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 928644ccdbb1..83a7aaa684c3 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Po kërkon për fytyrën tënde"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Fytyra u vërtetua"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Konfirmuar"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Trokit \"Konfirmo\" për ta përfunduar"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Prek sensorin e gjurmës së gishtit"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona e gjurmës së gishtit"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Po të kërkojmë…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Njoftimet më pak urgjente, më poshtë!"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Trokit përsëri për ta hapur"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Rrëshqit për të shkyçur"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Rrëshqit lart për ta hapur"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Kjo pajisje menaxhohet nga organizata jote"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Kjo pajisje menaxhohet nga <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Rrëshqit për të hapur telefonin"</string> diff --git a/packages/SystemUI/res/values-sr/config.xml b/packages/SystemUI/res/values-sr/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-sr/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index fe9109150050..f1bf3c9e356d 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Тражи се ваше лице"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Лице је потврђено"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Потврђено"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Додирните Потврди да бисте завршили"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Додирните сензор за отисак прста"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона отиска прста"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Тражимо вас…"</string> @@ -401,7 +402,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Мање хитна обавештења су у наставку"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Додирните поново да бисте отворили"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Превуците нагоре да бисте откључали"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Превуците нагоре да бисте отворили"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Овим уређајем управља организација"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Овим уређајем управља <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Превуците од иконе за телефон"</string> diff --git a/packages/SystemUI/res/values-sv/config.xml b/packages/SystemUI/res/values-sv/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-sv/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index b848c6c0bc81..764ad50b69db 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Söker efter ditt ansikte"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Ansiktet har autentiserats"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Bekräftat"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Slutför genom att trycka på Bekräfta"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Tryck på fingeravtryckssensorn"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon för fingeravtryck"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Håller utkik efter dig …"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Mindre brådskande aviseringar nedan"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Tryck igen för att öppna"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Svep uppåt för att låsa upp"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Öppna genom att svepa uppåt"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Den här enheten hanteras av organisationen"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Den här enheten hanteras av <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Svep från ikonen och öppna telefonen"</string> diff --git a/packages/SystemUI/res/values-sw/config.xml b/packages/SystemUI/res/values-sw/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-sw/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 328b6eaaf46a..182caa4c09de 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Inatafuta uso wako"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Uso umethibitishwa"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Imethibitishwa"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Gusa Thibitisha ili ukamilishe"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Gusa kitambua alama ya kidole"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Aikoni ya alama ya kidole"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Inakutafuta…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>+"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Arifa zisizo za dharura sana ziko hapo chini"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Gusa tena ili ufungue"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Telezesha kidole ili ufungue"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Telezesha kidole juu ili ufungue"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Kifaa hiki kinasimamiwa na shirika lako"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Kifaa hiki kinadhibitiwa na <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Telezesha kidole kutoka kwa aikoni ili ufikie simu"</string> diff --git a/packages/SystemUI/res/values-ta/config.xml b/packages/SystemUI/res/values-ta/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ta/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index fbf851e9895d..9f8f45e44ebf 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"உங்கள் முகத்தை அங்கீகரிக்கிறது"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"முகம் அங்கீகரிக்கப்பட்டது"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"உறுதிப்படுத்தப்பட்டது"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"முடிக்க \'உறுதிப்படுத்து\' என்பதை தட்டவும்"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"கைரேகை சென்சாரைத் தொடவும்"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"கைரேகை ஐகான்"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"உங்கள் முகத்தைத் தேடுகிறது…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"அவசர நிலைக் குறைவான அறிவிப்புகள் கீழே உள்ளன"</string> <string name="notification_tap_again" msgid="7590196980943943842">"திறக்க, மீண்டும் தட்டவும்"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"திறக்க, மேலே ஸ்வைப் செய்யவும்"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"திறப்பதற்கு மேல் நோக்கி ஸ்வைப் செய்யவும்"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"இந்தச் சாதனத்தை உங்கள் நிறுவனம் நிர்வகிக்கிறது"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"இந்தச் சாதனத்தை நிர்வகிப்பது: <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"ஃபோனிற்கு ஐகானிலிருந்து ஸ்வைப் செய்யவும்"</string> diff --git a/packages/SystemUI/res/values-te/config.xml b/packages/SystemUI/res/values-te/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-te/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 0b92b7822cac..5717e02f0877 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"మీ ముఖాన్ని క్యాప్చర్ చేస్తోంది"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"ముఖం ప్రామాణీకరించబడింది"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"నిర్ధారించబడింది"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"పూర్తి చేయడానికి \"నిర్ధారించు\" నొక్కండి"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"వేలిముద్ర సెన్సార్ను తాకండి"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"వేలిముద్ర చిహ్నం"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"మీ కోసం చూస్తోంది…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"తక్కువ అత్యవసర నోటిఫికేషన్లు దిగువన"</string> <string name="notification_tap_again" msgid="7590196980943943842">"తెరవడానికి మళ్లీ నొక్కండి"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"అన్లాక్ చేయడానికి ఎగువకు స్వైప్ చేయండి"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"తెరవడానికి, పైకి స్వైప్ చేయండి"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"ఈ పరికరాన్ని మీ సంస్థ నిర్వహిస్తోంది"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"ఈ పరికరం <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> నిర్వహణలో ఉంది"</string> <string name="phone_hint" msgid="4872890986869209950">"ఫోన్ కోసం చిహ్నాన్ని స్వైప్ చేయండి"</string> diff --git a/packages/SystemUI/res/values-th/config.xml b/packages/SystemUI/res/values-th/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-th/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index fcaf280c0495..ce123a5d9736 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"กำลังมองหาใบหน้าของคุณ"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"ตรวจสอบสิทธิ์ใบหน้าแล้ว"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"ยืนยันแล้ว"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"แตะยืนยันเพื่อดำเนินการให้เสร็จสมบูรณ์"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"แตะเซ็นเซอร์ลายนิ้วมือ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ไอคอนลายนิ้วมือ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"กำลังหาใบหน้าคุณ…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"การแจ้งเตือนที่เร่งด่วนน้อยด้านล่าง"</string> <string name="notification_tap_again" msgid="7590196980943943842">"แตะอีกครั้งเพื่อเปิด"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"เลื่อนเพื่อปลดล็อก"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"เลื่อนขึ้นเพื่อเปิด"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"อุปกรณ์นี้จัดการโดยองค์กรของคุณ"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"อุปกรณ์เครื่องนี้จัดการโดย <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"เลื่อนไอคอนโทรศัพท์"</string> diff --git a/packages/SystemUI/res/values-tl/config.xml b/packages/SystemUI/res/values-tl/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-tl/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index f209a6896f74..0ab01d8858e1 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Hinahanap ang iyong mukha"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Na-authenticate ang mukha"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Nakumpirma"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"I-tap ang Kumpirmahin para kumpletuhin"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Pindutin ang fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icon ng fingerprint"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hinahanap ka…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Nasa ibaba ang mga notification na hindi masyadong mahalaga"</string> <string name="notification_tap_again" msgid="7590196980943943842">"I-tap ulit upang buksan"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"I-swipe pataas upang i-unlock"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Mag-swipe pataas para buksan"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Ang device na ito ay pinamamahalaan ng iyong organisasyon"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Pinamamahalaan ng <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> ang device na ito"</string> <string name="phone_hint" msgid="4872890986869209950">"Mag-swipe mula sa icon para sa telepono"</string> diff --git a/packages/SystemUI/res/values-tr/config.xml b/packages/SystemUI/res/values-tr/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-tr/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 3e2ccae4c901..4e2a8913d307 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Yüzünüz aranıyor"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Yüz kimliği doğrulandı"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Onaylandı"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Tamamlamak için Onayla\'ya dokunun"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Parmak izi sensörüne dokunun"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Parmak izi simgesi"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Yüzünüz tanınmaya çalışılıyor…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Daha az acil bildirimler aşağıdadır"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Açmak için tekrar dokunun"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Kilidi açmak için hızlıca yukarı kaydırın"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Açmak için yukarı kaydırın"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Bu cihaz kuruluşunuz tarafından yönetiliyor"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Bu cihaz <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> tarafından yönetilmektedir."</string> <string name="phone_hint" msgid="4872890986869209950">"Telefon için, simgeden hızlıca kaydırın"</string> diff --git a/packages/SystemUI/res/values-uk/config.xml b/packages/SystemUI/res/values-uk/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-uk/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 28eec2b17ce6..56521f6eb1aa 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Триває розпізнавання обличчя"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Обличчя автентифіковано"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Підтверджено"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Щоб завершити, натисніть \"Підтвердити\""</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Торкніться сканера відбитків пальців"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок відбитка пальця"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Пошук обличчя…"</string> @@ -403,7 +404,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Менше термінових сповіщень нижче"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Торкніться знову, щоб відкрити"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Проведіть пальцем угору, щоб розблокувати"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Проведіть пальцем угору, щоб відкрити"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Цим пристроєм керує адміністратор вашої організації"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Цим пристроєм керує організація <xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Телефон: проведіть пальцем від значка"</string> diff --git a/packages/SystemUI/res/values-ur/config.xml b/packages/SystemUI/res/values-ur/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-ur/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 669982e857a0..b698fe468673 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"آپ کا چہرہ تلاش کیا جا رہا ہے"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"چہرے کی تصدیق ہو گئی"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"تصدیق شدہ"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"مکمل کرنے کیلئے \'تصدیق کریں\' تھپتھپائیں"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"فنگر پرنٹ سینسر پر ٹچ کریں"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"فنگر پرنٹ آئیکن"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"آپ کے لیے تلاش کیا جا رہا ہے…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"کم اہم اطلاعات ذیل میں ہیں"</string> <string name="notification_tap_again" msgid="7590196980943943842">"کھولنے کیلئے دوبارہ تھپتھپائیں"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"غیر مقفل کرنے کیلئے اوپر سوائپ کریں"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"کھولنے کے لیے اوپر سوائپ کريں"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"یہ آلہ آپ کی تنظیم کے زیر انتظام ہے"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"یہ آلہ <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> کے زیر انتظام ہے"</string> <string name="phone_hint" msgid="4872890986869209950">"فون کیلئے آئیکن سے سوائپ کریں"</string> diff --git a/packages/SystemUI/res/values-uz/config.xml b/packages/SystemUI/res/values-uz/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-uz/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index a1b88bddc66a..c732d4c460e4 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Yuz tekshirilmoqda"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Yuzingiz aniqlandi"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Tasdiqlangan"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Tasdiqlash uchun tegining"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Barmoq izi skaneriga tegining"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmoq izi belgisi"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Yuzingiz tekshirilmoqda…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Kam ahamiyatli bildirishnomalarni pastda ko‘rsatish"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Ochish uchun yana bosing"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Qulfdan chiqarish uchun tepaga suring"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Ochish uchun tepaga suring"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Bu – tashkilotingiz tomonidan boshqariladigan qurilma"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Bu – <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> tomonidan boshqariladigan qurilma"</string> <string name="phone_hint" msgid="4872890986869209950">"Telefonni ochish uchun suring"</string> diff --git a/packages/SystemUI/res/values-vi/config.xml b/packages/SystemUI/res/values-vi/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-vi/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 395af14b6e40..affca3d05f05 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Đang tìm khuôn mặt của bạn"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Đã xác thực khuôn mặt"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Ðã xác nhận"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Nhấn vào Xác nhận để hoàn tất"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Chạm vào cảm biến vân tay"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Biểu tượng vân tay"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Đang tìm kiếm bạn…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Thông báo ít khẩn cấp hơn bên dưới"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Nhấn lại để mở"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Vuốt lên để mở khóa"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Vuốt lên để mở"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Thiết bị này do tổ chức của bạn quản lý"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Thiết bị này được <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> quản lý"</string> <string name="phone_hint" msgid="4872890986869209950">"Vuốt từ biểu tượng để mở điện thoại"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/config.xml b/packages/SystemUI/res/values-zh-rCN/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-zh-rCN/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index d5801b978dbd..b3bf97366c15 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"正在查找您的面孔"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"面孔身份验证成功"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"已确认"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"点按“确认”即可完成"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"请触摸指纹传感器"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指纹图标"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在查找您的面孔…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"不太紧急的通知会显示在下方"</string> <string name="notification_tap_again" msgid="7590196980943943842">"再次点按即可打开"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"向上滑动即可解锁"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"向上滑动即可打开"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"此设备由您所属单位管理"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"此设备是由<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>托管"</string> <string name="phone_hint" msgid="4872890986869209950">"滑动图标即可拨打电话"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/config.xml b/packages/SystemUI/res/values-zh-rHK/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-zh-rHK/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 6da44adb7017..59480a9d99ee 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"正在尋找您的臉孔"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"臉孔已經驗證"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"已確認"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"輕按 [確定] 以完成"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"請輕觸指紋感應器"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在搜尋您的臉孔…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"還有 <xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g> 則通知"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"不太緊急的通知會在下方顯示"</string> <string name="notification_tap_again" msgid="7590196980943943842">"再次輕按即可開啟"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"向上滑動即可解鎖"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"向上滑動即可開啟"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"此裝置由您的機構管理"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"此裝置由<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>管理"</string> <string name="phone_hint" msgid="4872890986869209950">"從圖示滑動即可使用手機功能"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/config.xml b/packages/SystemUI/res/values-zh-rTW/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-zh-rTW/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 596e27fbb7f8..76377fec2e2c 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"正在尋找你的臉孔"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"臉孔驗證成功"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"確認完畢"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"輕觸 [確認] 完成驗證設定"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"請輕觸指紋感應器"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在尋找你的臉孔…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"還有 <xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g> 則通知"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"較不緊急的通知會顯示在下方"</string> <string name="notification_tap_again" msgid="7590196980943943842">"再次輕觸即可開啟"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"向上滑動即可解鎖"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"向上滑動即可開啟"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"這個裝置是由貴機構所管理"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"這個裝置是由 <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> 所管理"</string> <string name="phone_hint" msgid="4872890986869209950">"滑動手機圖示即可啟用"</string> diff --git a/packages/SystemUI/res/values-zu/config.xml b/packages/SystemUI/res/values-zu/config.xml deleted file mode 100644 index 5309563e3986..000000000000 --- a/packages/SystemUI/res/values-zu/config.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -/* -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - --> - -<!-- These resources are around just to allow their values to be customized - for different hardware and product builds. --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> -</resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index f930b7d4a1b6..74b9143bbcce 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -124,6 +124,7 @@ <string name="biometric_dialog_face_icon_description_authenticating" msgid="4512727754496228488">"Ifuna ubuso bakho"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="595380451325425259">"Ubuso bufakazelwe ubuqiniso"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="2003141400387093967">"Kuqinisekisiwe"</string> + <string name="biometric_dialog_tap_confirm" msgid="4540715260292022404">"Thepha okuthi Qinisekisa ukuze uqedele"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Thinta inzwa yesigxivizo somunwe"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Isithonjana sezigxivizo zeminwe"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Kufunwa wena…"</string> @@ -399,7 +400,7 @@ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Izaziso ezingasheshi kakhulu ezingezansi"</string> <string name="notification_tap_again" msgid="7590196980943943842">"Thepha futhi ukuze uvule"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Swayiphela phezulu ukuze uvule"</string> + <string name="keyguard_unlock" msgid="6035822649218712063">"Swayiphela phezulu ukuze uvule"</string> <string name="do_disclosure_generic" msgid="5615898451805157556">"Le divayisi iphethwe inhlangano yakho"</string> <string name="do_disclosure_with_name" msgid="5640615509915445501">"Le divayisi iphethwe yi-<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>"</string> <string name="phone_hint" msgid="4872890986869209950">"Swayiphela ifoni kusukela kusithonjana"</string> diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml index f124d89070bf..6becd21984b9 100644 --- a/packages/SystemUI/res/values/attrs.xml +++ b/packages/SystemUI/res/values/attrs.xml @@ -75,14 +75,15 @@ <attr name="horizontalSpacing" format="dimension" /> </declare-styleable> - <!-- Theme for icons in the status bar (light/dark). background/fillColor is used for dual tone - icons like wifi and signal, and singleToneColor is used for icons with only one tone. + <!-- Theme for icons in the status/nav bar (light/dark). background/fillColor is used for dual + tone icons like wifi and signal, and singleToneColor is used for icons with only one tone. Contract: Pixel with fillColor blended over backgroundColor blended over translucent should equal to singleToneColor blended over translucent. --> <declare-styleable name="TonedIcon"> <attr name="backgroundColor" format="integer" /> <attr name="fillColor" format="integer" /> <attr name="singleToneColor" format="integer" /> + <attr name="homeHandleColor" format="integer" /> </declare-styleable> <declare-styleable name="StatusBarWindowView_Layout"> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index e7a1a660abc2..61816f60d0ba 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -116,6 +116,9 @@ <!-- The color of the navigation bar icons. Need to be in sync with ic_sysbar_* --> <color name="navigation_bar_icon_color">#E5FFFFFF</color> + <color name="navigation_bar_home_handle_light_color">#EBffffff</color> + <color name="navigation_bar_home_handle_dark_color">#99000000</color> + <!-- The shadow color for light navigation bar icons. --> <color name="nav_key_button_shadow_color">#30000000</color> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 6e6c009dd18c..340cb3ad7358 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -40,8 +40,8 @@ <!-- Whether or not we show the number in the bar. --> <bool name="config_statusBarShowNumber">false</bool> - <!-- If the lock screen should be dismissed after biometric auth. --> - <bool name="config_faceAuthDismissesKeyguard">false</bool> + <!-- For how long the lock screen can be on before the display turns off. --> + <integer name="config_lockScreenDisplayTimeout">10000</integer> <!-- Vibrator pattern for camera gesture launch. --> <integer-array translatable="false" name="config_cameraLaunchGestureVibePattern"> @@ -141,6 +141,9 @@ <!-- The number of milliseconds before the heads up notification auto-dismisses. --> <integer name="heads_up_notification_decay">5000</integer> + <!-- The number of milliseconds before the heads up notification sent automatically by the system auto-dismisses. --> + <integer name="auto_heads_up_notification_decay">3000</integer> + <!-- The number of milliseconds after a heads up notification is pushed back before the app can interrupt again. --> <integer name="heads_up_default_snooze_length_ms">60000</integer> @@ -151,15 +154,8 @@ <!-- The number of milliseconds before the heads up notification accepts touches. --> <integer name="touch_acceptance_delay">700</integer> - <!-- The number of milliseconds before the ambient notification auto-dismisses. This will - override the default pulse length. --> - <integer name="ambient_notification_decay">10000</integer> - - <!-- Minimum display time for a heads up notification, in milliseconds. --> - <integer name="ambient_notification_minimum_time">2000</integer> - <!-- The number of milliseconds to extend ambient pulse by when prompted (e.g. on touch) --> - <integer name="ambient_notification_extension_time">6000</integer> + <integer name="ambient_notification_extension_time">10000</integer> <!-- In multi-window, determines whether the stack where recents lives should grow from the smallest position when being launched. --> @@ -200,25 +196,9 @@ <!-- Doze: duration to avoid false pickup gestures triggered by notification vibrations --> <integer name="doze_pickup_vibration_threshold">2000</integer> - <!-- Doze: can we assume the pickup sensor includes a proximity check? - This is ignored if doze_pickup_subtype_performs_proximity_check is not empty. - @deprecated: use doze_pickup_subtype_performs_proximity_check instead.--> + <!-- Doze: can we assume the pickup sensor includes a proximity check? --> <bool name="doze_pickup_performs_proximity_check">false</bool> - <!-- Doze: a list of pickup sensor subtypes that perform a proximity check before they trigger. - If not empty, either * or !* must appear to specify the default. - If empty, falls back to doze_pickup_performs_proximity_check. - - Examples: 1,2,3,!* -> subtypes 1,2 and 3 perform the check, all others don't. - !1,!2,* -> subtypes 1 and 2 don't perform the check, all others do. - !8,* -> subtype 8 does not perform the check, all others do - 1,1,* -> illegal, every item may only appear once - 1,!1,* -> illegal, no contradictions allowed - 1,2 -> illegal, need either * or !* - 1,,4a3 -> illegal, no empty or non-numeric terms allowed - --> - <string name="doze_pickup_subtype_performs_proximity_check"></string> - <!-- Type of a sensor that provides a low-power estimate of the desired display brightness, suitable to listen to while the device is asleep (e.g. during always-on display) --> @@ -496,4 +476,13 @@ <!-- ThemePicker package name for overlaying icons. --> <string name="themepicker_overlayable_package" translatable="false">com.android.wallpaper</string> + <!-- Default rounded corner curve (a Bezier). Must match (the curved path in) rounded.xml. + Note that while rounded.xml includes the entire path (including the horizontal and vertical + corner edges), this pulls out just the curve. + --> + <string name="config_rounded_mask" translatable="false">"M8,0C3.6,0,0,3.6,0,8"</string> + + <!-- Preferred refresh rate at keyguard, if supported by the display --> + <integer name="config_keyguardRefreshRate">-1</integer> + </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index c5e4662f6d45..bef1fc2f271c 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -112,7 +112,7 @@ <dimen name="status_bar_connected_device_bt_indicator_size">17dp</dimen> <!-- Height of a small notification in the status bar--> - <dimen name="notification_min_height">106dp</dimen> + <dimen name="notification_min_height">@*android:dimen/notification_min_height</dimen> <!-- Increased height of a small notification in the status bar --> <dimen name="notification_min_height_increased">146dp</dimen> @@ -183,6 +183,9 @@ <!-- The padding on the bottom of the notifications on the keyguard --> <dimen name="keyguard_indication_bottom_padding">12sp</dimen> + <!-- The padding at start and end of indication text shown on AOD --> + <dimen name="keyguard_indication_text_padding">16dp</dimen> + <!-- Shadows under the clock, date and other keyguard text fields --> <dimen name="keyguard_shadow_radius">5</dimen> @@ -258,8 +261,8 @@ <!-- size at which Notification icons will be drawn on Ambient Display --> <dimen name="status_bar_icon_drawing_size_dark">@*android:dimen/notification_header_icon_size_ambient</dimen> - <!-- size of notification icons on AOD --> - <dimen name="dark_shelf_icon_size">16dp</dimen> + <!-- size of notification icons when the notifications are hidden --> + <dimen name="hidden_shelf_icon_size">16dp</dimen> <!-- opacity at which Notification icons will be drawn in the status bar --> <item type="dimen" name="status_bar_icon_drawing_alpha">90%</item> diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index e97055f08e32..66f19495dfa6 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -94,6 +94,16 @@ <item type="id" name="top_roundess_animator_start_tag"/> <item type="id" name="top_roundess_animator_end_tag"/> + <item type="id" name="keyguard_hun_animator_tag"/> + <item type="id" name="keyguard_hun_animator_start_tag"/> + <item type="id" name="keyguard_hun_animator_end_tag"/> + + <item type="id" name="view_group_fade_helper_modified_views"/> + <item type="id" name="view_group_fade_helper_animator"/> + <item type="id" name="view_group_fade_helper_previous_value_tag"/> + <item type="id" name="view_group_fade_helper_restore_tag"/> + <item type="id" name="view_group_fade_helper_hardware_layer"/> + <!-- Accessibility actions for the notification menu --> <item type="id" name="action_snooze_undo"/> <item type="id" name="action_snooze_shorter"/> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 591af82ecb4e..7feacb469f81 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -303,6 +303,8 @@ <string name="biometric_dialog_face_icon_description_authenticated">Face authenticated</string> <!-- Content description for the face icon when the user has been authenticated and the confirm button has been pressed [CHAR LIMIT=NONE] --> <string name="biometric_dialog_face_icon_description_confirmed">Confirmed</string> + <!-- Message shown when a biometric is authenticated, waiting for the user to confirm authentication [CHAR LIMIT=40]--> + <string name="biometric_dialog_tap_confirm">Tap Confirm to complete</string> <!-- Message shown when the system-provided fingerprint dialog is shown, asking for authentication --> <string name="fingerprint_dialog_touch_sensor">Touch the fingerprint sensor</string> @@ -953,8 +955,8 @@ <!-- Shows to explain the double tap interaction with notifications: After tapping a notification on Keyguard, this will explain users to tap again to launch a notification. [CHAR LIMIT=60] --> <string name="notification_tap_again">Tap again to open</string> - <!-- Shows when people have pressed the unlock icon to explain how to unlock. [CHAR LIMIT=60] --> - <string name="keyguard_unlock">Swipe up to unlock</string> + <!-- Message shown when lock screen is tapped or face authentication fails. [CHAR LIMIT=60] --> + <string name="keyguard_unlock">Swipe up to open</string> <!-- Text on keyguard screen and in Quick Settings footer indicating that the device is enterprise-managed by a Device Owner [CHAR LIMIT=60] --> <string name="do_disclosure_generic">This device is managed by your organization</string> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 2f1770a39f02..6374191c4d7b 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -366,11 +366,13 @@ <item name="backgroundColor">@color/light_mode_icon_color_dual_tone_background</item> <item name="fillColor">@color/light_mode_icon_color_dual_tone_fill</item> <item name="singleToneColor">@color/light_mode_icon_color_single_tone</item> + <item name="homeHandleColor">@color/navigation_bar_home_handle_light_color</item> </style> <style name="DualToneDarkTheme"> <item name="backgroundColor">@color/dark_mode_icon_color_dual_tone_background</item> <item name="fillColor">@color/dark_mode_icon_color_dual_tone_fill</item> <item name="singleToneColor">@color/dark_mode_icon_color_single_tone</item> + <item name="homeHandleColor">@color/navigation_bar_home_handle_dark_color</item> </style> <style name="QSHeaderDarkTheme"> <item name="backgroundColor">@color/dark_mode_qs_icon_color_dual_tone_background</item> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java index 5b9ee1c47e87..dcb134ec933e 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/Task.java @@ -20,6 +20,7 @@ import static android.view.Display.DEFAULT_DISPLAY; import android.app.ActivityManager; import android.app.ActivityManager.TaskDescription; +import android.app.TaskInfo; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ActivityInfo; @@ -75,7 +76,7 @@ public class Task { private int mHashCode; - public TaskKey(ActivityManager.RecentTaskInfo t) { + public TaskKey(TaskInfo t) { ComponentName sourceComponent = t.origActivity != null // Activity alias if there is one ? t.origActivity @@ -226,6 +227,17 @@ public class Task { // Do nothing } + /** + * Creates a task object from the provided task info + */ + public static Task from(TaskKey taskKey, TaskInfo taskInfo, boolean isLocked) { + ActivityManager.TaskDescription td = taskInfo.taskDescription; + return new Task(taskKey, + td != null ? td.getPrimaryColor() : 0, + td != null ? td.getBackgroundColor() : 0, + taskInfo.supportsSplitScreenMultiWindow, isLocked, td, taskInfo.topActivity); + } + public Task(TaskKey key) { this.key = key; this.taskDescription = new TaskDescription(); diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/TaskKeyLruCache.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/TaskKeyLruCache.java index b2c79a4c0a32..e106c657109d 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/TaskKeyLruCache.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/TaskKeyLruCache.java @@ -52,7 +52,11 @@ public class TaskKeyLruCache<V> extends TaskKeyCache<V> { if (mEvictionCallback != null) { mEvictionCallback.onEntryEvicted(mKeys.get(taskId)); } - mKeys.remove(taskId); + + // Only remove from mKeys on cache remove, not a cache update. + if (newV == null) { + mKeys.remove(taskId); + } } }; } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java index a2abb4b1695c..328116dc3c1b 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java @@ -30,10 +30,12 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import android.annotation.NonNull; import android.app.ActivityManager; import android.app.ActivityManager.RecentTaskInfo; +import android.app.ActivityManager.RunningTaskInfo; import android.app.ActivityOptions; import android.app.ActivityTaskManager; import android.app.AppGlobals; import android.app.IAssistDataReceiver; +import android.app.WindowConfiguration; import android.app.WindowConfiguration.ActivityType; import android.content.ContentResolver; import android.content.Context; @@ -307,28 +309,22 @@ public class ActivityManagerWrapper { } final ActivityOptions finalOptions = options; - // Execute this from another thread such that we can do other things (like caching the - // bitmap for the thumbnail) while AM is busy starting our activity. - mBackgroundExecutor.submit(new Runnable() { - @Override - public void run() { - boolean result = false; - try { - result = startActivityFromRecents(taskKey.id, finalOptions); - } catch (Exception e) { - // Fall through - } - final boolean finalResult = result; - if (resultCallback != null) { - resultCallbackHandler.post(new Runnable() { - @Override - public void run() { - resultCallback.accept(finalResult); - } - }); + + boolean result = false; + try { + result = startActivityFromRecents(taskKey.id, finalOptions); + } catch (Exception e) { + // Fall through + } + final boolean finalResult = result; + if (resultCallback != null) { + resultCallbackHandler.post(new Runnable() { + @Override + public void run() { + resultCallback.accept(finalResult); } - } - }); + }); + } } /** @@ -506,4 +502,12 @@ public class ActivityManagerWrapper { PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT) || freeformDevOption); } + + /** + * Returns true if the running task represents the home task + */ + public static boolean isHomeTask(RunningTaskInfo info) { + return info.configuration.windowConfiguration.getActivityType() + == WindowConfiguration.ACTIVITY_TYPE_HOME; + } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java index 7fbe5db99569..c732584eddfc 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java @@ -49,6 +49,15 @@ public class QuickStepContract { public static final String NAV_BAR_MODE_GESTURAL_OVERLAY = WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY; + // Action sent by a system app to switch to gesture nav + public static final String ACTION_ENABLE_GESTURE_NAV = + "com.android.systemui.ENABLE_GESTURE_NAV"; + // Action for the intent to receive the result + public static final String ACTION_ENABLE_GESTURE_NAV_RESULT = + "com.android.systemui.action.ENABLE_GESTURE_NAV_RESULT"; + // Extra containing the pending intent to receive the result + public static final String EXTRA_RESULT_INTENT = "com.android.systemui.EXTRA_RESULT_INTENT"; + // Overview is disabled, either because the device is in lock task mode, or because the device // policy has disabled the feature public static final int SYSUI_STATE_SCREEN_PINNING = 1 << 0; @@ -71,18 +80,25 @@ public class QuickStepContract { public static final int SYSUI_STATE_HOME_DISABLED = 1 << 8; // The keyguard is showing, but occluded public static final int SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED = 1 << 9; + // The search feature is disabled (either by SUW/SysUI/device policy) + public static final int SYSUI_STATE_SEARCH_DISABLED = 1 << 10; + // The notification panel is expanded and interactive (either locked or unlocked), and the + // quick settings is not expanded + public static final int SYSUI_STATE_QUICK_SETTINGS_EXPANDED = 1 << 11; @Retention(RetentionPolicy.SOURCE) @IntDef({SYSUI_STATE_SCREEN_PINNING, SYSUI_STATE_NAV_BAR_HIDDEN, SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED, + SYSUI_STATE_QUICK_SETTINGS_EXPANDED, SYSUI_STATE_BOUNCER_SHOWING, SYSUI_STATE_A11Y_BUTTON_CLICKABLE, SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE, SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING, SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED, SYSUI_STATE_OVERVIEW_DISABLED, - SYSUI_STATE_HOME_DISABLED + SYSUI_STATE_HOME_DISABLED, + SYSUI_STATE_SEARCH_DISABLED }) public @interface SystemUiStateFlags {} @@ -91,8 +107,10 @@ public class QuickStepContract { str.add((flags & SYSUI_STATE_SCREEN_PINNING) != 0 ? "screen_pinned" : ""); str.add((flags & SYSUI_STATE_OVERVIEW_DISABLED) != 0 ? "overview_disabled" : ""); str.add((flags & SYSUI_STATE_HOME_DISABLED) != 0 ? "home_disabled" : ""); + str.add((flags & SYSUI_STATE_SEARCH_DISABLED) != 0 ? "search_disabled" : ""); str.add((flags & SYSUI_STATE_NAV_BAR_HIDDEN) != 0 ? "navbar_hidden" : ""); str.add((flags & SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED) != 0 ? "notif_visible" : ""); + str.add((flags & SYSUI_STATE_QUICK_SETTINGS_EXPANDED) != 0 ? "qs_visible" : ""); str.add((flags & SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING) != 0 ? "keygrd_visible" : ""); str.add((flags & SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED) != 0 ? "keygrd_occluded" : ""); @@ -141,10 +159,13 @@ public class QuickStepContract { * disabled. */ public static boolean isAssistantGestureDisabled(int sysuiStateFlags) { - // Disable when in screen pinning, immersive, the bouncer is showing + // Disable when in quick settings, screen pinning, immersive, the bouncer is showing, + // or search is disabled int disableFlags = SYSUI_STATE_SCREEN_PINNING | SYSUI_STATE_NAV_BAR_HIDDEN - | SYSUI_STATE_BOUNCER_SHOWING; + | SYSUI_STATE_BOUNCER_SHOWING + | SYSUI_STATE_SEARCH_DISABLED + | SYSUI_STATE_QUICK_SETTINGS_EXPANDED; if ((sysuiStateFlags & disableFlags) != 0) { return true; } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java index d2fe5cd9ef64..2ef042210e67 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentsAnimationControllerCompat.java @@ -91,6 +91,7 @@ public class RecentsAnimationControllerCompat { } } + @Deprecated public void setCancelWithDeferredScreenshot(boolean screenshot) { try { mAnimationController.setCancelWithDeferredScreenshot(screenshot); @@ -99,6 +100,14 @@ public class RecentsAnimationControllerCompat { } } + public void setDeferCancelUntilNextTransition(boolean defer, boolean screenshot) { + try { + mAnimationController.setDeferCancelUntilNextTransition(defer, screenshot); + } catch (RemoteException e) { + Log.e(TAG, "Failed to set deferred cancel with screenshot", e); + } + } + public void cleanupScreenshot() { try { mAnimationController.cleanupScreenshot(); diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentTaskInfoCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskInfoCompat.java index a5299038d3a9..326c2aa37175 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RecentTaskInfoCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskInfoCompat.java @@ -17,29 +17,32 @@ package com.android.systemui.shared.system; import android.app.ActivityManager; +import android.app.TaskInfo; import android.content.ComponentName; -public class RecentTaskInfoCompat { +public class TaskInfoCompat { - private ActivityManager.RecentTaskInfo mInfo; + public static int getUserId(TaskInfo info) { + return info.userId; + } - public RecentTaskInfoCompat(ActivityManager.RecentTaskInfo info) { - mInfo = info; + public static int getActivityType(TaskInfo info) { + return info.configuration.windowConfiguration.getActivityType(); } - public int getUserId() { - return mInfo.userId; + public static int getWindowingMode(TaskInfo info) { + return info.configuration.windowConfiguration.getWindowingMode(); } - public boolean supportsSplitScreenMultiWindow() { - return mInfo.supportsSplitScreenMultiWindow; + public static boolean supportsSplitScreenMultiWindow(TaskInfo info) { + return info.supportsSplitScreenMultiWindow; } - public ComponentName getTopActivity() { - return mInfo.topActivity; + public static ComponentName getTopActivity(TaskInfo info) { + return info.topActivity; } - public ActivityManager.TaskDescription getTaskDescription() { - return mInfo.taskDescription; + public static ActivityManager.TaskDescription getTaskDescription(TaskInfo info) { + return info.taskDescription; } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java index 3d9abafa0d73..c215d0fc13d6 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListener.java @@ -64,6 +64,14 @@ public abstract class TaskStackChangeListener { onActivityLaunchOnSecondaryDisplayRerouted(); } + /** + * Called when contents are drawn for the first time on a display which can only contain one + * task. + * + * @param displayId the id of the display on which contents are drawn. + */ + public void onSingleTaskDisplayDrawn(int displayId) { } + public void onTaskProfileLocked(int taskId, int userId) { } public void onTaskCreated(int taskId, ComponentName componentName) { } public void onTaskRemoved(int taskId) { } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java index beb4f05d814c..d570a586f961 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/TaskStackChangeListeners.java @@ -196,12 +196,19 @@ public class TaskStackChangeListeners extends TaskStackListener { } @Override - public void onSizeCompatModeActivityChanged(int displayId, IBinder activityToken) { + public void onSizeCompatModeActivityChanged(int displayId, IBinder activityToken) + throws RemoteException { mHandler.obtainMessage(H.ON_SIZE_COMPAT_MODE_ACTIVITY_CHANGED, displayId, 0 /* unused */, activityToken).sendToTarget(); } @Override + public void onSingleTaskDisplayDrawn(int displayId) throws RemoteException { + mHandler.obtainMessage(H.ON_SINGLE_TASK_DISPLAY_DRAWN, displayId, + 0 /* unused */).sendToTarget(); + } + + @Override public void onTaskDisplayChanged(int taskId, int newDisplayId) throws RemoteException { mHandler.obtainMessage(H.ON_TASK_DISPLAY_CHANGED, taskId, newDisplayId).sendToTarget(); } @@ -225,7 +232,8 @@ public class TaskStackChangeListeners extends TaskStackListener { private static final int ON_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED = 16; private static final int ON_SIZE_COMPAT_MODE_ACTIVITY_CHANGED = 17; private static final int ON_BACK_PRESSED_ON_TASK_ROOT = 18; - private static final int ON_TASK_DISPLAY_CHANGED = 19; + private static final int ON_SINGLE_TASK_DISPLAY_DRAWN = 19; + private static final int ON_TASK_DISPLAY_CHANGED = 20; public H(Looper looper) { @@ -362,6 +370,12 @@ public class TaskStackChangeListeners extends TaskStackListener { } break; } + case ON_SINGLE_TASK_DISPLAY_DRAWN: { + for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) { + mTaskStackListeners.get(i).onSingleTaskDisplayDrawn(msg.arg1); + } + break; + } case ON_TASK_DISPLAY_CHANGED: { for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) { mTaskStackListeners.get(i).onTaskDisplayChanged(msg.arg1, msg.arg2); diff --git a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java index 209074812d7a..10d132ad2763 100644 --- a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java +++ b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java @@ -303,6 +303,11 @@ public class CarrierTextController { } } else { subs = mKeyguardUpdateMonitor.getSubscriptionInfo(false); + if (subs == null) { + subs = new ArrayList<>(); + } else { + filterMobileSubscriptionInSameGroup(subs); + } } return subs; } @@ -395,8 +400,11 @@ public class CarrierTextController { } } + if (TextUtils.isEmpty(displayText)) displayText = joinNotEmpty(mSeparator, carrierNames); + displayText = updateCarrierTextWithSimIoError(displayText, carrierNames, subOrderBySlot, allSimsMissing); + boolean airplaneMode = false; // APM (airplane mode) != no carrier state. There are carrier services // (e.g. WFC = Wi-Fi calling) which may operate in APM. @@ -405,9 +413,6 @@ public class CarrierTextController { airplaneMode = true; } - if (TextUtils.isEmpty(displayText) && !airplaneMode) { - displayText = joinNotEmpty(mSeparator, carrierNames); - } final CarrierTextCallbackInfo info = new CarrierTextCallbackInfo( displayText, carrierNames, diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java index 2ff7266baecf..a4b6958498c8 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardAbsKeyInputView.java @@ -310,7 +310,9 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout @Override public void showMessage(CharSequence message, ColorStateList colorState) { - mSecurityMessageDisplay.setNextMessageColor(colorState); + if (colorState != null) { + mSecurityMessageDisplay.setNextMessageColor(colorState); + } mSecurityMessageDisplay.setMessage(message); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index fee2c9b2505a..5097216a7405 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -3,13 +3,13 @@ package com.android.keyguard; import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT; import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.app.WallpaperManager; import android.content.Context; import android.graphics.Paint; import android.graphics.Paint.Style; import android.os.Build; +import android.transition.Fade; import android.transition.Transition; import android.transition.TransitionListenerAdapter; import android.transition.TransitionManager; @@ -34,6 +34,7 @@ import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.util.wakelock.KeepAwakeAnimationListener; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -117,6 +118,11 @@ public class KeyguardClockSwitch extends RelativeLayout { private float mDarkAmount; /** + * Boolean value indicating if notifications are visible on lock screen. + */ + private boolean mHasVisibleNotifications; + + /** * If the Keyguard Slice has a header (big center-aligned text.) */ private boolean mShowingHeader; @@ -227,8 +233,13 @@ public class KeyguardClockSwitch extends RelativeLayout { mClockPlugin = null; } if (plugin == null) { - mClockView.setVisibility(View.VISIBLE); - mClockViewBold.setVisibility(View.INVISIBLE); + if (mShowingHeader) { + mClockView.setVisibility(View.GONE); + mClockViewBold.setVisibility(View.VISIBLE); + } else { + mClockView.setVisibility(View.VISIBLE); + mClockViewBold.setVisibility(View.INVISIBLE); + } mKeyguardStatusArea.setVisibility(View.VISIBLE); return; } @@ -325,6 +336,24 @@ public class KeyguardClockSwitch extends RelativeLayout { if (mClockPlugin != null) { mClockPlugin.setDarkAmount(darkAmount); } + updateBigClockAlpha(); + } + + /** + * Set whether or not the lock screen is showing notifications. + */ + void setHasVisibleNotifications(boolean hasVisibleNotifications) { + if (hasVisibleNotifications == mHasVisibleNotifications) { + return; + } + mHasVisibleNotifications = hasVisibleNotifications; + if (mDarkAmount == 0f && mBigClockContainer != null) { + // Starting a fade transition since the visibility of the big clock will change. + TransitionManager.beginDelayedTransition(mBigClockContainer, + new Fade().setDuration(KeyguardSliceView.DEFAULT_ANIM_DURATION / 2).addTarget( + mBigClockContainer)); + } + updateBigClockAlpha(); } public Paint getPaint() { @@ -401,15 +430,30 @@ public class KeyguardClockSwitch extends RelativeLayout { } } + private void updateBigClockAlpha() { + if (mBigClockContainer != null) { + final float alpha = mHasVisibleNotifications ? mDarkAmount : 1f; + mBigClockContainer.setAlpha(alpha); + if (alpha == 0f) { + mBigClockContainer.setVisibility(INVISIBLE); + } else if (mBigClockContainer.getVisibility() == INVISIBLE) { + mBigClockContainer.setVisibility(VISIBLE); + } + } + } + /** * Sets if the keyguard slice is showing a center-aligned header. We need a smaller clock in * these cases. */ void setKeyguardShowingHeader(boolean hasHeader) { - if (mShowingHeader == hasHeader || hasCustomClock()) { + if (mShowingHeader == hasHeader) { return; } mShowingHeader = hasHeader; + if (hasCustomClock()) { + return; + } float smallFontSize = mContext.getResources().getDimensionPixelSize( R.dimen.widget_small_font_size); @@ -580,11 +624,16 @@ public class KeyguardClockSwitch extends RelativeLayout { view.setScaleX(scale); view.setScaleY(scale); }); - animator.addListener(new AnimatorListenerAdapter() { + animator.addListener(new KeepAwakeAnimationListener(getContext()) { @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); view.setVisibility(startVisibility); + } + + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); animation.removeListener(this); } }); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java index d8086da277f2..55ddfc30d774 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java @@ -248,7 +248,8 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit @Override public boolean disallowInterceptTouch(MotionEvent event) { - return mLockPatternScreenBounds.contains((int) event.getRawX(), (int) event.getRawY()); + return !mLockPatternView.isEmpty() + || mLockPatternScreenBounds.contains((int) event.getRawX(), (int) event.getRawY()); } /** TODO: hook this up */ @@ -442,7 +443,9 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit @Override public void showMessage(CharSequence message, ColorStateList colorState) { - mSecurityMessageDisplay.setNextMessageColor(colorState); + if (colorState != null) { + mSecurityMessageDisplay.setNextMessageColor(colorState); + } mSecurityMessageDisplay.setMessage(message); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 6cd971d25610..8059dcf33df7 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -46,6 +46,7 @@ import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.systemui.Dependency; import com.android.systemui.SystemUIFactory; +import com.android.systemui.statusbar.phone.UnlockMethodCache; import com.android.systemui.util.InjectionInflationController; public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSecurityView { @@ -90,6 +91,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe private final SpringAnimation mSpringAnimation; private final VelocityTracker mVelocityTracker = VelocityTracker.obtain(); private final KeyguardUpdateMonitor mUpdateMonitor; + private final UnlockMethodCache mUnlockMethodCache; private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class); private float mLastTouchY = -1; @@ -129,6 +131,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe mSpringAnimation = new SpringAnimation(this, DynamicAnimation.Y); mInjectionInflationController = new InjectionInflationController( SystemUIFactory.getInstance().getRootComponent()); + mUnlockMethodCache = UnlockMethodCache.getInstance(context); mViewConfiguration = ViewConfiguration.get(context); } @@ -231,8 +234,11 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe } if (action == MotionEvent.ACTION_UP) { if (-getTranslationY() > TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, - MIN_DRAG_SIZE, getResources().getDisplayMetrics())) { + MIN_DRAG_SIZE, getResources().getDisplayMetrics()) + && !mUpdateMonitor.isFaceDetectionRunning()) { mUpdateMonitor.requestFaceAuth(); + mCallback.userActivity(); + showMessage(null, null); } } return true; @@ -263,8 +269,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe */ private void updateBiometricRetry() { SecurityMode securityMode = getSecurityMode(); - int userId = KeyguardUpdateMonitor.getCurrentUser(); - mSwipeUpToRetry = mUpdateMonitor.isUnlockWithFacePossible(userId) + mSwipeUpToRetry = mUnlockMethodCache.isFaceAuthEnabled() && securityMode != SecurityMode.SimPin && securityMode != SecurityMode.SimPuk && securityMode != SecurityMode.None; @@ -508,7 +513,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe case SimPuk: // Shortcut for SIM PIN/PUK to go to directly to user's security screen or home SecurityMode securityMode = mSecurityModel.getSecurityMode(targetUserId); - if (securityMode == SecurityMode.None || mLockPatternUtils.isLockScreenDisabled( + if (securityMode == SecurityMode.None && mLockPatternUtils.isLockScreenDisabled( KeyguardUpdateMonitor.getCurrentUser())) { finish = true; eventSubtype = BOUNCER_DISMISS_SIM; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java index fb3a586677aa..69da990a0a73 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java @@ -123,7 +123,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { msg = rez.getString(R.string.kg_sim_lock_esim_instructions, msg); } - if (mSecurityMessageDisplay != null) { + if (mSecurityMessageDisplay != null && getVisibility() == VISIBLE) { mSecurityMessageDisplay.setMessage(msg); } mSimImageView.setImageTintList(ColorStateList.valueOf(color)); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java index a7fe607b0e87..37e89c095575 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java @@ -61,6 +61,7 @@ public class KeyguardStatusView extends GridLayout implements private KeyguardClockSwitch mClockView; private TextView mOwnerInfo; private KeyguardSliceView mKeyguardSlice; + private View mNotificationIcons; private Runnable mPendingMarqueeStart; private Handler mHandler; @@ -72,8 +73,8 @@ public class KeyguardStatusView extends GridLayout implements * Bottom margin that defines the margin between bottom of smart space and top of notification * icons on AOD. */ - private int mBottomMargin; - private int mBottomMarginWithHeader; + private int mIconTopMargin; + private int mIconTopMarginWithHeader; private boolean mShowingHeader; private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { @@ -144,6 +145,13 @@ public class KeyguardStatusView extends GridLayout implements return mClockView.hasCustomClock(); } + /** + * Set whether or not the lock screen is showing notifications. + */ + public void setHasVisibleNotifications(boolean hasVisibleNotifications) { + mClockView.setHasVisibleNotifications(hasVisibleNotifications); + } + private void setEnableMarquee(boolean enabled) { if (DEBUG) Log.v(TAG, "Schedule setEnableMarquee: " + (enabled ? "Enable" : "Disable")); if (enabled) { @@ -173,6 +181,7 @@ public class KeyguardStatusView extends GridLayout implements super.onFinishInflate(); mStatusViewContainer = findViewById(R.id.status_view_container); mLogoutView = findViewById(R.id.logout); + mNotificationIcons = findViewById(R.id.clock_notification_icon_container); if (mLogoutView != null) { mLogoutView.setOnClickListener(this::onLogoutClicked); } @@ -207,12 +216,14 @@ public class KeyguardStatusView extends GridLayout implements return; } mShowingHeader = hasHeader; - // Update bottom margin since header has appeared/disappeared. - if (mStatusViewContainer != null) { - MarginLayoutParams params = (MarginLayoutParams) mStatusViewContainer.getLayoutParams(); - params.setMargins(params.leftMargin, params.topMargin, params.rightMargin, - hasHeader ? mBottomMarginWithHeader : mBottomMargin); - mStatusViewContainer.setLayoutParams(params); + if (mNotificationIcons != null) { + // Update top margin since header has appeared/disappeared. + MarginLayoutParams params = (MarginLayoutParams) mNotificationIcons.getLayoutParams(); + params.setMargins(params.leftMargin, + hasHeader ? mIconTopMarginWithHeader : mIconTopMargin, + params.rightMargin, + params.bottomMargin); + mNotificationIcons.setLayoutParams(params); } } @@ -338,8 +349,8 @@ public class KeyguardStatusView extends GridLayout implements } private void loadBottomMargin() { - mBottomMargin = getResources().getDimensionPixelSize(R.dimen.widget_vertical_padding); - mBottomMarginWithHeader = getResources().getDimensionPixelSize( + mIconTopMargin = getResources().getDimensionPixelSize(R.dimen.widget_vertical_padding); + mIconTopMarginWithHeader = getResources().getDimensionPixelSize( R.dimen.widget_vertical_padding_with_header); } @@ -412,6 +423,13 @@ public class KeyguardStatusView extends GridLayout implements int expanded = mOwnerInfo.getBottom() + mOwnerInfo.getPaddingBottom(); int toRemove = (int) ((expanded - collapsed) * ratio); setBottom(getMeasuredHeight() - toRemove); + if (mNotificationIcons != null) { + // We're using scrolling in order not to overload the translation which is used + // when appearing the icons + mNotificationIcons.setScrollY(toRemove); + } + } else if (mNotificationIcons != null){ + mNotificationIcons.setScrollY(0); } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 6a4dbc8d7228..109f270063d6 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -28,6 +28,13 @@ import static android.os.BatteryManager.EXTRA_MAX_CHARGING_CURRENT; import static android.os.BatteryManager.EXTRA_MAX_CHARGING_VOLTAGE; import static android.os.BatteryManager.EXTRA_PLUGGED; import static android.os.BatteryManager.EXTRA_STATUS; +import static android.telephony.PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE; + +import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT; +import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW; +import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT; +import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_TIMEOUT; +import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN; import android.annotation.AnyThread; import android.annotation.MainThread; @@ -70,6 +77,7 @@ import android.os.UserManager; import android.provider.Settings; import android.service.dreams.DreamService; import android.service.dreams.IDreamManager; +import android.telephony.PhoneStateListener; import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; @@ -88,6 +96,7 @@ import com.android.internal.widget.LockPatternUtils; import com.android.settingslib.WirelessUtils; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.TaskStackChangeListener; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.google.android.collect.Lists; @@ -111,6 +120,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final String TAG = "KeyguardUpdateMonitor"; private static final boolean DEBUG = KeyguardConstants.DEBUG; private static final boolean DEBUG_SIM_STATES = KeyguardConstants.DEBUG_SIM_STATES; + private static final boolean DEBUG_FACE = true; private static final int LOW_BATTERY_THRESHOLD = 20; private static final String ACTION_FACE_UNLOCK_STARTED @@ -168,6 +178,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { */ private static final int BIOMETRIC_STATE_CANCELLING_RESTARTING = 3; + private static final int BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED = -1; + public static final int BIOMETRIC_HELP_FACE_NOT_RECOGNIZED = -2; + private static final int DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT = 5000000; private static final ComponentName FALLBACK_HOME_COMPONENT = new ComponentName( @@ -179,6 +192,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { * Prudently disable lockscreen. */ public static final boolean CORE_APPS_ONLY; + static { try { CORE_APPS_ONLY = IPackageManager.Stub.asInterface( @@ -207,6 +221,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private boolean mHasLockscreenWallpaper; private boolean mAssistantVisible; private boolean mKeyguardOccluded; + private boolean mSecureCameraLaunched; @VisibleForTesting protected boolean mTelephonyCapable; @@ -231,6 +246,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private List<SubscriptionInfo> mSubscriptionInfo; private TrustManager mTrustManager; private UserManager mUserManager; + private KeyguardBypassController mKeyguardBypassController; private int mFingerprintRunningState = BIOMETRIC_STATE_STOPPED; private int mFaceRunningState = BIOMETRIC_STATE_STOPPED; private LockPatternUtils mLockPatternUtils; @@ -248,11 +264,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { */ private static final int BIOMETRIC_CONTINUE_DELAY_MS = 500; - // If FP daemon dies, keyguard should retry after a short delay + // If the HAL dies or is unable to authenticate, keyguard should retry after a short delay private int mHardwareFingerprintUnavailableRetryCount = 0; private int mHardwareFaceUnavailableRetryCount = 0; - private static final int HW_UNAVAILABLE_TIMEOUT = 3000; // ms - private static final int HW_UNAVAILABLE_RETRY_MAX = 3; + private static final int HAL_ERROR_RETRY_TIMEOUT = 500; // ms + private static final int HAL_ERROR_RETRY_MAX = 10; private final Handler mHandler = new Handler(Looper.getMainLooper()) { @Override @@ -361,19 +377,27 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } }; - private boolean mFaceSettingEnabledForUser; + private SparseBooleanArray mFaceSettingEnabledForUser = new SparseBooleanArray(); private BiometricManager mBiometricManager; private IBiometricEnabledOnKeyguardCallback mBiometricEnabledCallback = new IBiometricEnabledOnKeyguardCallback.Stub() { @Override - public void onChanged(BiometricSourceType type, boolean enabled) throws RemoteException { + public void onChanged(BiometricSourceType type, boolean enabled, int userId) + throws RemoteException { if (type == BiometricSourceType.FACE) { - mFaceSettingEnabledForUser = enabled; + mFaceSettingEnabledForUser.put(userId, enabled); updateFaceListeningState(); } } }; + private PhoneStateListener mPhoneStateListener = new PhoneStateListener() { + @Override + public void onActiveDataSubscriptionIdChanged(int subId) { + mHandler.sendEmptyMessage(MSG_SIM_SUBSCRIPTION_INFO_CHANGED); + } + }; + private OnSubscriptionsChangedListener mSubscriptionListener = new OnSubscriptionsChangedListener() { @Override @@ -423,7 +447,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private void handleSimSubscriptionInfoChanged() { if (DEBUG_SIM_STATES) { Log.v(TAG, "onSubscriptionInfoChanged()"); - List<SubscriptionInfo> sil = mSubscriptionManager.getActiveSubscriptionInfoList(); + List<SubscriptionInfo> sil = mSubscriptionManager.getActiveSubscriptionInfoList(false); if (sil != null) { for (SubscriptionInfo subInfo : sil) { Log.v(TAG, "SubInfo:" + subInfo); @@ -475,7 +499,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { public List<SubscriptionInfo> getSubscriptionInfo(boolean forceReload) { List<SubscriptionInfo> sil = mSubscriptionInfo; if (sil == null || forceReload) { - sil = mSubscriptionManager.getActiveSubscriptionInfoList(); + sil = mSubscriptionManager.getActiveSubscriptionInfoList(false); } if (sil == null) { // getActiveSubscriptionInfoList was null callers expect an empty list. @@ -518,6 +542,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } /** + * Invoked when the secure camera is launched. + */ + public void onCameraLaunched() { + mSecureCameraLaunched = true; + updateBiometricListeningState(); + } + + /** * @return a cached version of DreamManager.isDreaming() */ public boolean isDreaming() { @@ -570,7 +602,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { cb.onBiometricAuthFailed(BiometricSourceType.FINGERPRINT); } } - handleFingerprintHelp(-1, mContext.getString(R.string.kg_fingerprint_not_recognized)); + handleFingerprintHelp(BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED, + mContext.getString(R.string.kg_fingerprint_not_recognized)); } private void handleFingerprintAcquired(int acquireInfo) { @@ -638,16 +671,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } if (msgId == FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE) { - if (mHardwareFingerprintUnavailableRetryCount < HW_UNAVAILABLE_RETRY_MAX) { + if (mHardwareFingerprintUnavailableRetryCount < HAL_ERROR_RETRY_MAX) { mHardwareFingerprintUnavailableRetryCount++; mHandler.removeCallbacks(mRetryFingerprintAuthentication); - mHandler.postDelayed(mRetryFingerprintAuthentication, HW_UNAVAILABLE_TIMEOUT); + mHandler.postDelayed(mRetryFingerprintAuthentication, HAL_ERROR_RETRY_TIMEOUT); } } if (msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT) { - mLockPatternUtils.requireStrongAuth( - LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT, + mLockPatternUtils.requireStrongAuth(STRONG_AUTH_REQUIRED_AFTER_LOCKOUT, getCurrentUser()); } @@ -722,13 +754,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { cb.onBiometricAuthFailed(BiometricSourceType.FACE); } } - handleFaceHelp(-1, mContext.getString(R.string.kg_face_not_recognized)); + handleFaceHelp(BIOMETRIC_HELP_FACE_NOT_RECOGNIZED, + mContext.getString(R.string.kg_face_not_recognized)); } private void handleFaceAcquired(int acquireInfo) { if (acquireInfo != FaceManager.FACE_ACQUIRED_GOOD) { return; } + if (DEBUG_FACE) Log.d(TAG, "Face acquired"); for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -740,6 +774,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private void handleFaceAuthenticated(int authUserId) { Trace.beginSection("KeyGuardUpdateMonitor#handlerFaceAuthenticated"); try { + if (mGoingToSleep) { + Log.d(TAG, "Aborted successful auth because device is going to sleep."); + return; + } final int userId; try { userId = ActivityManager.getService().getCurrentUser().id; @@ -755,6 +793,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { Log.d(TAG, "Face authentication disabled by DPM for userId: " + userId); return; } + if (DEBUG_FACE) Log.d(TAG, "Face auth succeeded for user " + userId); onFaceAuthenticated(userId); } finally { setFaceRunningState(BIOMETRIC_STATE_STOPPED); @@ -763,6 +802,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } private void handleFaceHelp(int msgId, String helpString) { + if (DEBUG_FACE) Log.d(TAG, "Face help received: " + helpString); for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -781,6 +821,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { }; private void handleFaceError(int msgId, String errString) { + if (DEBUG_FACE) Log.d(TAG, "Face error received: " + errString); if (msgId == FaceManager.FACE_ERROR_CANCELED && mFaceRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) { setFaceRunningState(BIOMETRIC_STATE_STOPPED); @@ -789,20 +830,25 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { setFaceRunningState(BIOMETRIC_STATE_STOPPED); } - if (msgId == FaceManager.FACE_ERROR_HW_UNAVAILABLE) { - if (mHardwareFaceUnavailableRetryCount < HW_UNAVAILABLE_RETRY_MAX) { + if (msgId == FaceManager.FACE_ERROR_HW_UNAVAILABLE + || msgId == FaceManager.FACE_ERROR_UNABLE_TO_PROCESS) { + if (mHardwareFaceUnavailableRetryCount < HAL_ERROR_RETRY_MAX) { mHardwareFaceUnavailableRetryCount++; mHandler.removeCallbacks(mRetryFaceAuthentication); - mHandler.postDelayed(mRetryFaceAuthentication, HW_UNAVAILABLE_TIMEOUT); + mHandler.postDelayed(mRetryFaceAuthentication, HAL_ERROR_RETRY_TIMEOUT); } } if (msgId == FaceManager.FACE_ERROR_LOCKOUT_PERMANENT) { - mLockPatternUtils.requireStrongAuth( - LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT, + mLockPatternUtils.requireStrongAuth(STRONG_AUTH_REQUIRED_AFTER_LOCKOUT, getCurrentUser()); } + // The face timeout message is not very actionable, let's ask the user to + // manually retry. + if (msgId == FaceManager.FACE_ERROR_TIMEOUT) { + errString = mContext.getString(R.string.keyguard_unlock); + } for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -913,8 +959,17 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } public boolean isUserInLockdown(int userId) { - return mStrongAuthTracker.getStrongAuthForUser(userId) - == LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN; + return containsFlag(mStrongAuthTracker.getStrongAuthForUser(userId), + STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); + } + + public boolean userNeedsStrongAuth() { + return mStrongAuthTracker.getStrongAuthForUser(getCurrentUser()) + != LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED; + } + + private boolean containsFlag(int haystack, int needle) { + return (haystack & needle) != 0; } public boolean needsSlowUnlockTransition() { @@ -1044,6 +1099,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } mHandler.sendMessage( mHandler.obtainMessage(MSG_SERVICE_STATE_CHANGE, subId, 0, serviceState)); + } else if (TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED.equals(action)) { + mHandler.sendEmptyMessage(MSG_SIM_SUBSCRIPTION_INFO_CHANGED); } else if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED.equals( action)) { mHandler.sendEmptyMessage(MSG_DEVICE_POLICY_MANAGER_STATE_CHANGED); @@ -1454,6 +1511,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); filter.addAction(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED); + filter.addAction(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED); filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); @@ -1527,6 +1585,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class); mLogoutEnabled = mDevicePolicyManager.isLogoutEnabled(); updateAirplaneModeState(); + + TelephonyManager telephony = + (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + if (telephony != null) { + telephony.listen(mPhoneStateListener, LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE); + } } private void updateAirplaneModeState() { @@ -1624,12 +1688,34 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private boolean shouldListenForFace() { final boolean awakeKeyguard = mKeyguardIsVisible && mDeviceInteractive && !mGoingToSleep; final int user = getCurrentUser(); + final int strongAuth = mStrongAuthTracker.getStrongAuthForUser(user); + final boolean isLockOutOrLockDown = + containsFlag(strongAuth, STRONG_AUTH_REQUIRED_AFTER_LOCKOUT) + || containsFlag(strongAuth, STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW) + || containsFlag(strongAuth, STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); + final boolean isEncryptedOrTimedOut = + containsFlag(strongAuth, STRONG_AUTH_REQUIRED_AFTER_BOOT) + || containsFlag(strongAuth, STRONG_AUTH_REQUIRED_AFTER_TIMEOUT); + + boolean canBypass = mKeyguardBypassController != null + && mKeyguardBypassController.canBypass(); + // There's no reason to ask the HAL for authentication when the user can dismiss the + // bouncer, unless we're bypassing and need to auto-dismiss the lock screen even when + // TrustAgents or biometrics are keeping the device unlocked. + boolean becauseCannotSkipBouncer = !getUserCanSkipBouncer(user) || canBypass; + + // Scan even when encrypted or timeout to show a preemptive bouncer when bypassing. + // Lockout/lockdown modes shouldn't scan, since they are more explicit. + boolean strongAuthAllowsScanning = (!isEncryptedOrTimedOut || canBypass && !mBouncer) + && !isLockOutOrLockDown; + // Only listen if this KeyguardUpdateMonitor belongs to the primary user. There is an // instance of KeyguardUpdateMonitor for each user but KeyguardUpdateMonitor is user-aware. return (mBouncer || mAuthInterruptActive || awakeKeyguard || shouldListenForFaceAssistant()) - && !mSwitchingUser && !getUserCanSkipBouncer(user) && !isFaceDisabled(user) - && !mKeyguardGoingAway && mFaceSettingEnabledForUser && !mLockIconPressed - && mUserManager.isUserUnlocked(user) && mIsPrimaryUser; + && !mSwitchingUser && !isFaceDisabled(user) && becauseCannotSkipBouncer + && !mKeyguardGoingAway && mFaceSettingEnabledForUser.get(user) && !mLockIconPressed + && strongAuthAllowsScanning && mIsPrimaryUser + && !mSecureCameraLaunched; } /** @@ -1698,14 +1784,17 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { && mFpm.getEnrolledFingerprints(userId).size() > 0; } + private boolean isUnlockWithFacePossible(int userId) { + return isFaceAuthEnabledForUser(userId) && !isFaceDisabled(userId); + } + /** - * If face hardware is available and user has enrolled. Not considering encryption or - * lockdown state. + * If face hardware is available, user has enrolled and enabled auth via setting. */ - public boolean isUnlockWithFacePossible(int userId) { + public boolean isFaceAuthEnabledForUser(int userId) { return mFaceManager != null && mFaceManager.isHardwareDetected() - && !isFaceDisabled(userId) - && mFaceManager.hasEnrolledTemplates(userId); + && mFaceManager.hasEnrolledTemplates(userId) + && mFaceSettingEnabledForUser.get(userId); } private void stopListeningForFingerprint() { @@ -2077,6 +2166,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { checkIsHandlerThread(); Log.d(TAG, "onKeyguardVisibilityChanged(" + showing + ")"); mKeyguardIsVisible = showing; + + if (showing) { + mSecureCameraLaunched = false; + } + for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -2114,6 +2208,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { if (DEBUG) Log.d(TAG, "handleKeyguardBouncerChanged(" + bouncer + ")"); boolean isBouncer = (bouncer == 1); mBouncer = isBouncer; + + if (isBouncer) { + // If the bouncer is shown, always clear this flag. This can happen in the following + // situations: 1) Default camera with SHOW_WHEN_LOCKED is not chosen yet. 2) Secure + // camera requests dismiss keyguard (tapping on photos for example). When these happen, + // face auth should resume. + mSecureCameraLaunched = false; + } + for (int i = 0; i < mCallbacks.size(); i++) { KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); if (cb != null) { @@ -2195,6 +2298,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { sendUpdates(callback); } + public void setKeyguardBypassController(KeyguardBypassController keyguardBypassController) { + mKeyguardBypassController = keyguardBypassController; + } + public boolean isSwitchingUser() { return mSwitchingUser; } @@ -2285,6 +2392,13 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { mUserFaceAuthenticated.clear(); mTrustManager.clearAllBiometricRecognized(BiometricSourceType.FINGERPRINT); mTrustManager.clearAllBiometricRecognized(BiometricSourceType.FACE); + + for (int i = 0; i < mCallbacks.size(); i++) { + KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); + if (cb != null) { + cb.onBiometricsCleared(); + } + } } public boolean isSimPinVoiceSecure() { @@ -2548,7 +2662,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { pw.println(" possible=" + isUnlockWithFacePossible(userId)); pw.println(" strongAuthFlags=" + Integer.toHexString(strongAuthFlags)); pw.println(" trustManaged=" + getUserTrustIsManaged(userId)); - pw.println(" enabledByUser=" + mFaceSettingEnabledForUser); + pw.println(" enabledByUser=" + mFaceSettingEnabledForUser.get(userId)); + pw.println(" mSecureCameraLaunched=" + mSecureCameraLaunched); } } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java index 8696bb769bbd..0fef755b5aba 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java @@ -314,4 +314,9 @@ public class KeyguardUpdateMonitorCallback { */ public void onLogoutEnabledChanged() { } + /** + * Called when authenticated biometrics are cleared. + */ + public void onBiometricsCleared() { } + } diff --git a/packages/SystemUI/src/com/android/keyguard/clock/AnalogClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/AnalogClockController.java index 558ac4b564d1..9c5242ce1a3e 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/AnalogClockController.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/AnalogClockController.java @@ -75,6 +75,11 @@ public class AnalogClockController implements ClockPlugin { private TextClock mLockClock; /** + * Helper to extract colors from wallpaper palette for clock face. + */ + private final ClockPalette mPalette = new ClockPalette(); + + /** * Create a BubbleClockController instance. * * @param res Resources contains title and thumbnail. @@ -162,17 +167,21 @@ public class AnalogClockController implements ClockPlugin { public void setStyle(Style style) {} @Override - public void setTextColor(int color) { } + public void setTextColor(int color) { + updateColor(); + } @Override public void setColorPalette(boolean supportsDarkText, int[] colorPalette) { - if (colorPalette == null || colorPalette.length == 0) { - return; - } - final int length = colorPalette.length; - mLockClock.setTextColor(colorPalette[Math.max(0, length - 2)]); - mAnalogClock.setClockColors(colorPalette[Math.max(0, length - 5)], - colorPalette[Math.max(0, length - 2)]); + mPalette.setColorPalette(supportsDarkText, colorPalette); + updateColor(); + } + + private void updateColor() { + final int primary = mPalette.getPrimaryColor(); + final int secondary = mPalette.getSecondaryColor(); + mLockClock.setTextColor(secondary); + mAnalogClock.setClockColors(primary, secondary); } @Override @@ -184,6 +193,7 @@ public class AnalogClockController implements ClockPlugin { @Override public void setDarkAmount(float darkAmount) { + mPalette.setDarkAmount(darkAmount); mClockPosition.setDarkAmount(darkAmount); mBigClockView.setDarkAmount(darkAmount); } diff --git a/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java b/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java index bdf9dc4865b2..8e81327a9325 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/BubbleClockController.java @@ -75,6 +75,11 @@ public class BubbleClockController implements ClockPlugin { private TextClock mLockClock; /** + * Helper to extract colors from wallpaper palette for clock face. + */ + private final ClockPalette mPalette = new ClockPalette(); + + /** * Create a BubbleClockController instance. * * @param res Resources contains title and thumbnail. @@ -162,21 +167,26 @@ public class BubbleClockController implements ClockPlugin { public void setStyle(Style style) {} @Override - public void setTextColor(int color) { } + public void setTextColor(int color) { + updateColor(); + } @Override public void setColorPalette(boolean supportsDarkText, int[] colorPalette) { - if (colorPalette == null || colorPalette.length == 0) { - return; - } - final int length = colorPalette.length; - final int color = colorPalette[Math.max(0, length - 3)]; - mLockClock.setTextColor(color); - mAnalogClock.setClockColors(color, color); + mPalette.setColorPalette(supportsDarkText, colorPalette); + updateColor(); + } + + private void updateColor() { + final int primary = mPalette.getPrimaryColor(); + final int secondary = mPalette.getSecondaryColor(); + mLockClock.setTextColor(secondary); + mAnalogClock.setClockColors(primary, secondary); } @Override public void setDarkAmount(float darkAmount) { + mPalette.setDarkAmount(darkAmount); mClockPosition.setDarkAmount(darkAmount); mView.setDarkAmount(darkAmount); } diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockLayout.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockLayout.java index 19083459a87c..7485d336174c 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/ClockLayout.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockLayout.java @@ -94,7 +94,8 @@ public class ClockLayout extends FrameLayout { getBurnInOffset(mBurnInPreventionOffsetX * 2, true) - mBurnInPreventionOffsetX, mDarkAmount); final float offsetY = MathUtils.lerp(0f, - getBurnInOffset(mBurnInPreventionOffsetY * 2, false) - mBurnInPreventionOffsetY, + getBurnInOffset(mBurnInPreventionOffsetY * 2, false) + - 0.5f * mBurnInPreventionOffsetY, mDarkAmount); // Put the analog clock in the middle of the screen. diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java index 9f4c403ed787..9e2464ea4fbb 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java @@ -240,9 +240,9 @@ public final class ClockManager { } private void reload() { - mPreviewClocks.reload(); + mPreviewClocks.reloadCurrentClock(); mListeners.forEach((listener, clocks) -> { - clocks.reload(); + clocks.reloadCurrentClock(); ClockPlugin clock = clocks.getCurrentClock(); if (clock instanceof DefaultClockController) { listener.onClockChanged(null); @@ -287,20 +287,13 @@ public final class ClockManager { @Override public void onPluginConnected(ClockPlugin plugin, Context pluginContext) { addClockPlugin(plugin); - reload(); - if (plugin == mCurrentClock) { - ClockManager.this.reload(); - } + reloadIfNeeded(plugin); } @Override public void onPluginDisconnected(ClockPlugin plugin) { - boolean isCurrentClock = plugin == mCurrentClock; removeClockPlugin(plugin); - reload(); - if (isCurrentClock) { - ClockManager.this.reload(); - } + reloadIfNeeded(plugin); } /** @@ -347,10 +340,19 @@ public final class ClockManager { } } + private void reloadIfNeeded(ClockPlugin plugin) { + final boolean wasCurrentClock = plugin == mCurrentClock; + reloadCurrentClock(); + final boolean isCurrentClock = plugin == mCurrentClock; + if (wasCurrentClock || isCurrentClock) { + ClockManager.this.reload(); + } + } + /** * Update the current clock. */ - void reload() { + void reloadCurrentClock() { mCurrentClock = getClockPlugin(); } diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockPalette.kt b/packages/SystemUI/src/com/android/keyguard/clock/ClockPalette.kt new file mode 100644 index 000000000000..5c5493a0c200 --- /dev/null +++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockPalette.kt @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2019 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.clock + +import android.graphics.Color +import android.util.MathUtils + +private const val PRIMARY_INDEX = 5 +private const val SECONDARY_DARK_INDEX = 8 +private const val SECONDARY_LIGHT_INDEX = 2 + +/** + * A helper class to extract colors from a clock face. + */ +class ClockPalette { + + private var darkAmount: Float = 0f + private var accentPrimary: Int = Color.WHITE + private var accentSecondaryLight: Int = Color.WHITE + private var accentSecondaryDark: Int = Color.BLACK + private val lightHSV: FloatArray = FloatArray(3) + private val darkHSV: FloatArray = FloatArray(3) + private val hsv: FloatArray = FloatArray(3) + + /** Returns a color from the palette as an RGB packed int. */ + fun getPrimaryColor(): Int { + return accentPrimary + } + + /** Returns either a light or dark color from the palette as an RGB packed int. */ + fun getSecondaryColor(): Int { + Color.colorToHSV(accentSecondaryLight, lightHSV) + Color.colorToHSV(accentSecondaryDark, darkHSV) + for (i in 0..2) { + hsv[i] = MathUtils.lerp(darkHSV[i], lightHSV[i], darkAmount) + } + return Color.HSVToColor(hsv) + } + + /** See {@link ClockPlugin#setColorPalette}. */ + fun setColorPalette(supportsDarkText: Boolean, colorPalette: IntArray?) { + if (colorPalette == null || colorPalette.isEmpty()) { + accentPrimary = Color.WHITE + accentSecondaryLight = Color.WHITE + accentSecondaryDark = if (supportsDarkText) Color.BLACK else Color.WHITE + return + } + val length = colorPalette.size + accentPrimary = colorPalette[Math.max(0, length - PRIMARY_INDEX)] + accentSecondaryLight = colorPalette[Math.max(0, length - SECONDARY_LIGHT_INDEX)] + accentSecondaryDark = colorPalette[Math.max(0, + length - if (supportsDarkText) SECONDARY_DARK_INDEX else SECONDARY_LIGHT_INDEX)] + } + + /** See {@link ClockPlugin#setDarkAmount}. */ + fun setDarkAmount(darkAmount: Float) { + this.darkAmount = darkAmount + } +} diff --git a/packages/SystemUI/src/com/android/keyguard/clock/SettingsWrapper.java b/packages/SystemUI/src/com/android/keyguard/clock/SettingsWrapper.java index e1c658be4c26..096e94348429 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/SettingsWrapper.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/SettingsWrapper.java @@ -15,21 +15,37 @@ */ package com.android.keyguard.clock; +import android.annotation.Nullable; import android.content.ContentResolver; import android.provider.Settings; +import android.util.Log; + +import com.android.internal.annotations.VisibleForTesting; + +import org.json.JSONException; +import org.json.JSONObject; /** * Wrapper around Settings used for testing. */ public class SettingsWrapper { + private static final String TAG = "ClockFaceSettings"; private static final String CUSTOM_CLOCK_FACE = Settings.Secure.LOCK_SCREEN_CUSTOM_CLOCK_FACE; private static final String DOCKED_CLOCK_FACE = Settings.Secure.DOCKED_CLOCK_FACE; + private static final String CLOCK_FIELD = "clock"; - private ContentResolver mContentResolver; + private final ContentResolver mContentResolver; + private final Migration mMigration; - public SettingsWrapper(ContentResolver contentResolver) { + SettingsWrapper(ContentResolver contentResolver) { + this(contentResolver, new Migrator(contentResolver)); + } + + @VisibleForTesting + SettingsWrapper(ContentResolver contentResolver, Migration migration) { mContentResolver = contentResolver; + mMigration = migration; } /** @@ -37,8 +53,10 @@ public class SettingsWrapper { * * @param userId ID of the user. */ - public String getLockScreenCustomClockFace(int userId) { - return Settings.Secure.getStringForUser(mContentResolver, CUSTOM_CLOCK_FACE, userId); + String getLockScreenCustomClockFace(int userId) { + return decode( + Settings.Secure.getStringForUser(mContentResolver, CUSTOM_CLOCK_FACE, userId), + userId); } /** @@ -46,7 +64,74 @@ public class SettingsWrapper { * * @param userId ID of the user. */ - public String getDockedClockFace(int userId) { + String getDockedClockFace(int userId) { return Settings.Secure.getStringForUser(mContentResolver, DOCKED_CLOCK_FACE, userId); } + + /** + * Decodes the string stored in settings, which should be formatted as JSON. + * @param value String stored in settings. If value is not JSON, then the settings is + * overwritten with JSON containing the prior value. + * @return ID of the clock face to show on AOD and lock screen. If value is not JSON, the value + * is returned. + */ + @VisibleForTesting + String decode(@Nullable String value, int userId) { + if (value == null) { + return value; + } + JSONObject json; + try { + json = new JSONObject(value); + } catch (JSONException ex) { + Log.e(TAG, "Settings value is not valid JSON", ex); + // The settings value isn't JSON since it didn't parse so migrate the value to JSON. + // TODO(b/135674383): Remove this migration path in the following release. + mMigration.migrate(value, userId); + return value; + } + try { + return json.getString(CLOCK_FIELD); + } catch (JSONException ex) { + Log.e(TAG, "JSON object does not contain clock field.", ex); + return null; + } + } + + interface Migration { + void migrate(String value, int userId); + } + + /** + * Implementation of {@link Migration} that writes valid JSON back to Settings. + */ + private static final class Migrator implements Migration { + + private final ContentResolver mContentResolver; + + Migrator(ContentResolver contentResolver) { + mContentResolver = contentResolver; + } + + /** + * Migrate settings values that don't parse by converting to JSON format. + * + * Values in settings must be JSON to be backed up and restored. To help users maintain + * their current settings, convert existing values into the JSON format. + * + * TODO(b/135674383): Remove this migration code in the following release. + */ + @Override + public void migrate(String value, int userId) { + try { + JSONObject json = new JSONObject(); + json.put(CLOCK_FIELD, value); + Settings.Secure.putStringForUser(mContentResolver, CUSTOM_CLOCK_FACE, + json.toString(), + userId); + } catch (JSONException ex) { + Log.e(TAG, "Failed migrating settings value to JSON format", ex); + } + } + } } diff --git a/packages/SystemUI/src/com/android/keyguard/clock/SmallClockPosition.java b/packages/SystemUI/src/com/android/keyguard/clock/SmallClockPosition.java index 9b15dc6d5063..60ca945278f6 100644 --- a/packages/SystemUI/src/com/android/keyguard/clock/SmallClockPosition.java +++ b/packages/SystemUI/src/com/android/keyguard/clock/SmallClockPosition.java @@ -67,7 +67,8 @@ class SmallClockPosition { */ int getPreferredY() { // On AOD, clock needs to appear below the status bar with enough room for pixel shifting - int aodY = mStatusBarHeight + mKeyguardLockPadding + mBurnInOffsetY; + int aodY = mStatusBarHeight + mKeyguardLockHeight + 2 * mKeyguardLockPadding + + mBurnInOffsetY; // On lock screen, clock needs to appear below the lock icon int lockY = mStatusBarHeight + mKeyguardLockHeight + 2 * mKeyguardLockPadding; return (int) MathUtils.lerp(lockY, aodY, mDarkAmount); diff --git a/packages/SystemUI/src/com/android/systemui/CornerHandleView.java b/packages/SystemUI/src/com/android/systemui/CornerHandleView.java index 54a36355decb..a94952c5bc19 100644 --- a/packages/SystemUI/src/com/android/systemui/CornerHandleView.java +++ b/packages/SystemUI/src/com/android/systemui/CornerHandleView.java @@ -107,7 +107,9 @@ public class CornerHandleView extends View { mPaint.setColor((int) ArgbEvaluator.getInstance().evaluate(darkIntensity, mLightColor, mDarkColor)); - invalidate(); + if (getVisibility() == VISIBLE) { + invalidate(); + } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index 9f4a4e08bbfd..6c36bc98996b 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -53,7 +53,6 @@ import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.DevicePolicyManagerWrapper; import com.android.systemui.shared.system.PackageManagerWrapper; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.NavigationBarController; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationLockscreenUserManager; @@ -267,7 +266,6 @@ public class Dependency extends SystemUI { @Inject Lazy<VisualStabilityManager> mVisualStabilityManager; @Inject Lazy<NotificationGutsManager> mNotificationGutsManager; @Inject Lazy<NotificationMediaManager> mNotificationMediaManager; - @Inject Lazy<AmbientPulseManager> mAmbientPulseManager; @Inject Lazy<NotificationBlockingHelperManager> mNotificationBlockingHelperManager; @Inject Lazy<NotificationRemoteInputManager> mNotificationRemoteInputManager; @Inject Lazy<SmartReplyConstants> mSmartReplyConstants; @@ -447,7 +445,6 @@ public class Dependency extends SystemUI { mNotificationGroupAlertTransferHelper::get); mProviders.put(NotificationMediaManager.class, mNotificationMediaManager::get); mProviders.put(NotificationGutsManager.class, mNotificationGutsManager::get); - mProviders.put(AmbientPulseManager.class, mAmbientPulseManager::get); mProviders.put(NotificationBlockingHelperManager.class, mNotificationBlockingHelperManager::get); mProviders.put(NotificationRemoteInputManager.class, diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index 73e57de3f915..f38b4f259c88 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -305,7 +305,7 @@ public class ScreenDecorations extends SystemUI implements Tunable, mAssistHintBlocked = blocked; if (mAssistHintVisible && mAssistHintBlocked) { - setAssistHintVisible(false); + hideAssistHandles(); } } diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java index 61a0f72315ea..e89e6cb269f8 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java @@ -37,6 +37,7 @@ import android.util.TimingsTraceLog; import com.android.systemui.plugins.OverlayPlugin; import com.android.systemui.plugins.PluginListener; import com.android.systemui.shared.plugins.PluginManager; +import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarWindowController; import com.android.systemui.util.NotificationChannels; @@ -215,7 +216,8 @@ public class SystemUIApplication extends Application implements SysUiServiceProv StatusBar statusBar = getComponent(StatusBar.class); if (statusBar != null) { plugin.setup(statusBar.getStatusBarWindow(), - statusBar.getNavigationBarView(), new Callback(plugin)); + statusBar.getNavigationBarView(), new Callback(plugin), + DozeParameters.getInstance(getBaseContext())); } } }); diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index d815d95f23d5..e87da3cbc170 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -22,6 +22,7 @@ import static com.android.systemui.Dependency.LEAK_REPORT_EMAIL_NAME; import android.annotation.Nullable; import android.app.AlarmManager; import android.content.Context; +import android.content.pm.PackageManager; import android.os.Handler; import android.os.Looper; import android.util.Log; @@ -48,10 +49,13 @@ import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.ScrimView; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider; +import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.notification.collection.NotificationData; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.KeyguardBouncer; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardEnvironmentImpl; +import com.android.systemui.statusbar.phone.KeyguardLiftController; import com.android.systemui.statusbar.phone.LockIcon; import com.android.systemui.statusbar.phone.LockscreenWallpaper; import com.android.systemui.statusbar.phone.NotificationIconAreaController; @@ -60,7 +64,9 @@ import com.android.systemui.statusbar.phone.ScrimState; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; +import com.android.systemui.statusbar.phone.UnlockMethodCache; import com.android.systemui.statusbar.policy.DeviceProvisionedController; +import com.android.systemui.util.AsyncSensorManager; import com.android.systemui.util.InjectionInflationController; import com.android.systemui.util.leak.GarbageMonitor; import com.android.systemui.volume.VolumeDialogComponent; @@ -130,8 +136,8 @@ public class SystemUIFactory { KeyguardBouncer.BouncerExpansionCallback expansionCallback) { return new KeyguardBouncer(context, callback, lockPatternUtils, container, dismissCallbackRegistry, FalsingManagerFactory.getInstance(context), - expansionCallback, KeyguardUpdateMonitor.getInstance(context), - new Handler(Looper.getMainLooper())); + expansionCallback, UnlockMethodCache.getInstance(context), + KeyguardUpdateMonitor.getInstance(context), new Handler(Looper.getMainLooper())); } public ScrimController createScrimController(ScrimView scrimBehind, ScrimView scrimInFront, @@ -144,8 +150,12 @@ public class SystemUIFactory { } public NotificationIconAreaController createNotificationIconAreaController(Context context, - StatusBar statusBar, StatusBarStateController statusBarStateController) { + StatusBar statusBar, + NotificationWakeUpCoordinator wakeUpCoordinator, + KeyguardBypassController keyguardBypassController, + StatusBarStateController statusBarStateController) { return new NotificationIconAreaController(context, statusBar, statusBarStateController, + wakeUpCoordinator, keyguardBypassController, Dependency.get(NotificationMediaManager.class)); } @@ -207,6 +217,18 @@ public class SystemUIFactory { @Singleton @Provides + @Nullable + public KeyguardLiftController provideKeyguardLiftController(Context context, + StatusBarStateController statusBarStateController, + AsyncSensorManager asyncSensorManager) { + if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) { + return null; + } + return new KeyguardLiftController(context, statusBarStateController, asyncSensorManager); + } + + @Singleton + @Provides public NotificationListener provideNotificationListener(Context context) { return new NotificationListener(context); } diff --git a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java index afb8e7421412..7a74dba27dce 100644 --- a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java @@ -61,6 +61,7 @@ public class AppOpsControllerImpl implements AppOpsController, private H mBGHandler; private final List<AppOpsController.Callback> mCallbacks = new ArrayList<>(); private final ArrayMap<Integer, Set<Callback>> mCallbacksByCode = new ArrayMap<>(); + private boolean mListening; @GuardedBy("mActiveItems") private final List<AppOpItem> mActiveItems = new ArrayList<>(); @@ -93,6 +94,7 @@ public class AppOpsControllerImpl implements AppOpsController, @VisibleForTesting protected void setListening(boolean listening) { + mListening = listening; if (listening) { mAppOps.startWatchingActive(OPS, this); mAppOps.startWatchingNoted(OPS, this); @@ -279,6 +281,7 @@ public class AppOpsControllerImpl implements AppOpsController, @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("AppOpsController state:"); + pw.println(" Listening: " + mListening); pw.println(" Active Items:"); for (int i = 0; i < mActiveItems.size(); i++) { final AppOpItem item = mActiveItems.get(i); diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehaviorController.java b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehaviorController.java index 002d4f34be11..6da3818c5d05 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehaviorController.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehaviorController.java @@ -74,6 +74,7 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac private boolean mHandlesShowing = false; private long mHandlesLastHiddenAt; + private long mShowAndGoEndsAt; /** * This should always be initialized as {@link AssistHandleBehavior#OFF} to ensure proper * behavior lifecycle. @@ -144,7 +145,9 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac private void showAndGoInternal() { maybeShowHandles(/* ignoreThreshold = */ false); - mHandler.postDelayed(mHideHandles, getShowAndGoDuration()); + long showAndGoDuration = getShowAndGoDuration(); + mShowAndGoEndsAt = SystemClock.elapsedRealtime() + showAndGoDuration; + mHandler.postDelayed(mHideHandles, showAndGoDuration); } @Override // AssistHandleCallbacks @@ -162,6 +165,10 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac mHandler.post(() -> maybeShowHandles(/* ignoreThreshold = */ true)); } + public long getShowAndGoRemainingTimeMs() { + return Long.max(mShowAndGoEndsAt - SystemClock.elapsedRealtime(), 0); + } + boolean areHandlesShowing() { return mHandlesShowing; } @@ -271,6 +278,7 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac private void clearPendingCommands() { mHandler.removeCallbacks(mHideHandles); mHandler.removeCallbacks(mShowAndGo); + mShowAndGoEndsAt = 0; } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java index 67fcd68339e2..4a4feada3c65 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java @@ -82,7 +82,7 @@ public class AssistManager implements ConfigurationChangedReceiver { void processBundle(Bundle hints); /** - * Hides the UI. + * Hides any SysUI for the assistant, but _does not_ close the assistant itself. */ void hide(); } @@ -258,12 +258,8 @@ public class AssistManager implements ConfigurationChangedReceiver { } int phoneState = mPhoneStateMonitor.getPhoneState(); args.putInt(INVOCATION_PHONE_STATE_KEY, phoneState); - args.putLong(INVOCATION_TIME_MS_KEY, SystemClock.uptimeMillis()); - // Logs assistant start with invocation type. - MetricsLogger.action( - new LogMaker(MetricsEvent.ASSISTANT) - .setType(MetricsEvent.TYPE_OPEN) - .setSubtype(toLoggingSubType(invocationType, phoneState))); + args.putLong(INVOCATION_TIME_MS_KEY, SystemClock.elapsedRealtime()); + logStartAssist(invocationType, phoneState); startAssistInternal(args, assistComponent, isService); } @@ -444,12 +440,23 @@ public class AssistManager implements ConfigurationChangedReceiver { mAssistUtils.onLockscreenShown(); } + public long getAssistHandleShowAndGoRemainingDurationMs() { + return mHandleController.getShowAndGoRemainingTimeMs(); + } + /** Returns the logging flags for the given Assistant invocation type. */ public int toLoggingSubType(int invocationType) { return toLoggingSubType(invocationType, mPhoneStateMonitor.getPhoneState()); } - private int toLoggingSubType(int invocationType, int phoneState) { + protected void logStartAssist(int invocationType, int phoneState) { + MetricsLogger.action( + new LogMaker(MetricsEvent.ASSISTANT) + .setType(MetricsEvent.TYPE_OPEN) + .setSubtype(toLoggingSubType(invocationType, phoneState))); + } + + protected final int toLoggingSubType(int invocationType, int phoneState) { // Note that this logic will break if the number of Assistant invocation types exceeds 7. // There are currently 5 invocation types, but we will be migrating to the new logging // framework in the next update. diff --git a/packages/SystemUI/src/com/android/systemui/assist/PhenotypeHelper.java b/packages/SystemUI/src/com/android/systemui/assist/PhenotypeHelper.java index 61395f158aea..b3f57afc0753 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/PhenotypeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/assist/PhenotypeHelper.java @@ -22,28 +22,28 @@ import androidx.annotation.Nullable; import java.util.concurrent.Executor; -class PhenotypeHelper { +public class PhenotypeHelper { - PhenotypeHelper() {} + public PhenotypeHelper() {} - long getLong(String name, long defaultValue) { + public long getLong(String name, long defaultValue) { return DeviceConfig.getLong(DeviceConfig.NAMESPACE_SYSTEMUI, name, defaultValue); } - int getInt(String name, int defaultValue) { + public int getInt(String name, int defaultValue) { return DeviceConfig.getInt(DeviceConfig.NAMESPACE_SYSTEMUI, name, defaultValue); } @Nullable - String getString(String name, @Nullable String defaultValue) { + public String getString(String name, @Nullable String defaultValue) { return DeviceConfig.getString(DeviceConfig.NAMESPACE_SYSTEMUI, name, defaultValue); } - boolean getBoolean(String name, boolean defaultValue) { + public boolean getBoolean(String name, boolean defaultValue) { return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI, name, defaultValue); } - void addOnPropertiesChangedListener( + public void addOnPropertiesChangedListener( Executor executor, DeviceConfig.OnPropertiesChangedListener listener) { DeviceConfig.addOnPropertiesChangedListener( DeviceConfig.NAMESPACE_SYSTEMUI, executor, listener); diff --git a/packages/SystemUI/src/com/android/systemui/assist/ui/CircularCornerPathRenderer.java b/packages/SystemUI/src/com/android/systemui/assist/ui/CircularCornerPathRenderer.java index 00346a36d3f1..e61e47a2201f 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/ui/CircularCornerPathRenderer.java +++ b/packages/SystemUI/src/com/android/systemui/assist/ui/CircularCornerPathRenderer.java @@ -16,6 +16,7 @@ package com.android.systemui.assist.ui; +import android.content.Context; import android.graphics.Path; /** @@ -29,12 +30,11 @@ public final class CircularCornerPathRenderer extends CornerPathRenderer { private final int mWidth; private final Path mPath = new Path(); - public CircularCornerPathRenderer(int cornerRadiusBottom, int cornerRadiusTop, - int width, int height) { - mCornerRadiusBottom = cornerRadiusBottom; - mCornerRadiusTop = cornerRadiusTop; - mHeight = height; - mWidth = width; + public CircularCornerPathRenderer(Context context) { + mCornerRadiusBottom = DisplayUtils.getCornerRadiusBottom(context); + mCornerRadiusTop = DisplayUtils.getCornerRadiusTop(context); + mHeight = DisplayUtils.getHeight(context); + mWidth = DisplayUtils.getWidth(context); } @Override // CornerPathRenderer diff --git a/packages/SystemUI/src/com/android/systemui/assist/ui/DefaultUiController.java b/packages/SystemUI/src/com/android/systemui/assist/ui/DefaultUiController.java index 662de3a5b5f5..0c4f05123c79 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/ui/DefaultUiController.java +++ b/packages/SystemUI/src/com/android/systemui/assist/ui/DefaultUiController.java @@ -118,7 +118,6 @@ public class DefaultUiController implements AssistManager.UiController { @Override // AssistManager.UiController public void hide() { - Dependency.get(AssistManager.class).hideAssist(); detach(); if (mInvocationAnimator.isRunning()) { mInvocationAnimator.cancel(); diff --git a/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java b/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java index 8ef7b6c564e9..bc782a7d62eb 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java +++ b/packages/SystemUI/src/com/android/systemui/assist/ui/InvocationLightsView.java @@ -129,7 +129,7 @@ public class InvocationLightsView extends View float arcLengthNormalized = cornerLengthNormalized * MINIMUM_CORNER_RATIO; float arcOffsetNormalized = (cornerLengthNormalized - arcLengthNormalized) / 2f; - float minLightLength = arcLengthNormalized / 2; + float minLightLength = 0; float maxLightLength = mGuide.getRegionWidth(PerimeterPathGuide.Region.BOTTOM) / 4f; float lightLength = MathUtils.lerp(minLightLength, maxLightLength, progress); @@ -247,13 +247,9 @@ public class InvocationLightsView extends View * To render corners that aren't circular, override this method in a subclass. */ protected CornerPathRenderer createCornerPathRenderer(Context context) { - int displayWidth = DisplayUtils.getWidth(context); - int displayHeight = DisplayUtils.getHeight(context); - int cornerRadiusBottom = DisplayUtils.getCornerRadiusBottom(context); - int cornerRadiusTop = DisplayUtils.getCornerRadiusTop(context); - return new CircularCornerPathRenderer( - cornerRadiusBottom, cornerRadiusTop, displayWidth, displayHeight); + return new CircularCornerPathRenderer(context); } + /** * Receives an intensity from 0 (lightest) to 1 (darkest) and sets the handle color * appropriately. Intention is to match the home handle color. diff --git a/packages/SystemUI/src/com/android/systemui/assist/ui/PathSpecCornerPathRenderer.java b/packages/SystemUI/src/com/android/systemui/assist/ui/PathSpecCornerPathRenderer.java new file mode 100644 index 000000000000..2bad7fc9583a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/assist/ui/PathSpecCornerPathRenderer.java @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2019 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.assist.ui; + +import android.content.Context; +import android.graphics.Matrix; +import android.graphics.Path; +import android.graphics.RectF; +import android.util.Log; +import android.util.PathParser; + +import com.android.systemui.R; + +/** + * Parses a path describing rounded corners from a string. + */ +public final class PathSpecCornerPathRenderer extends CornerPathRenderer { + private static final String TAG = "PathSpecCornerPathRenderer"; + + private final int mHeight; + private final int mWidth; + private final float mPathScale; + private final int mBottomCornerRadius; + private final int mTopCornerRadius; + + private final Path mPath = new Path(); + private final Path mRoundedPath; + private final Matrix mMatrix = new Matrix(); + + public PathSpecCornerPathRenderer(Context context) { + mWidth = DisplayUtils.getWidth(context); + mHeight = DisplayUtils.getHeight(context); + + mBottomCornerRadius = DisplayUtils.getCornerRadiusBottom(context); + mTopCornerRadius = DisplayUtils.getCornerRadiusTop(context); + + String pathData = context.getResources().getString(R.string.config_rounded_mask); + Path path = PathParser.createPathFromPathData(pathData); + if (path == null) { + Log.e(TAG, "No rounded corner path found!"); + mRoundedPath = new Path(); + } else { + mRoundedPath = path; + + } + + RectF bounds = new RectF(); + mRoundedPath.computeBounds(bounds, true); + + // we use this to scale the path such that the larger of its [width, height] is scaled to + // the corner radius (to account for asymmetric paths) + mPathScale = Math.min( + Math.abs(bounds.right - bounds.left), + Math.abs(bounds.top - bounds.bottom)); + } + + /** + * Scales and rotates each corner from the path specification to its correct position. + * + * Note: the rounded corners are passed in as the full shape (a curved triangle), but we only + * want the actual corner curve. Therefore we call getSegment to jump past the horizontal and + * vertical lines. + */ + @Override + public Path getCornerPath(Corner corner) { + if (mRoundedPath.isEmpty()) { + return mRoundedPath; + } + int cornerRadius; + int rotateDegrees; + int translateX; + int translateY; + switch (corner) { + case TOP_LEFT: + cornerRadius = mTopCornerRadius; + rotateDegrees = 0; + translateX = 0; + translateY = 0; + break; + case TOP_RIGHT: + cornerRadius = mTopCornerRadius; + rotateDegrees = 90; + translateX = mWidth; + translateY = 0; + break; + case BOTTOM_RIGHT: + cornerRadius = mBottomCornerRadius; + rotateDegrees = 180; + translateX = mWidth; + translateY = mHeight; + break; + case BOTTOM_LEFT: + default: + cornerRadius = mBottomCornerRadius; + rotateDegrees = 270; + translateX = 0; + translateY = mHeight; + break; + } + mPath.reset(); + mMatrix.reset(); + mPath.addPath(mRoundedPath); + + mMatrix.preScale(cornerRadius / mPathScale, cornerRadius / mPathScale); + mMatrix.postRotate(rotateDegrees); + mMatrix.postTranslate(translateX, translateY); + mPath.transform(mMatrix); + return mPath; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/assist/ui/PerimeterPathGuide.java b/packages/SystemUI/src/com/android/systemui/assist/ui/PerimeterPathGuide.java index 8eea36892aa7..fb41b1c4715f 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/ui/PerimeterPathGuide.java +++ b/packages/SystemUI/src/com/android/systemui/assist/ui/PerimeterPathGuide.java @@ -102,7 +102,7 @@ public class PerimeterPathGuide { * Sets the rotation. * * @param rotation one of Surface.ROTATION_0, Surface.ROTATION_90, Surface.ROTATION_180, - * Surface.ROTATION_270 + * Surface.ROTATION_270 */ public void setRotation(int rotation) { if (rotation != mRotation) { @@ -229,14 +229,14 @@ public class PerimeterPathGuide { - mDeviceWidthPx) / 2, (mDeviceWidthPx - mDeviceHeightPx) / 2); } - CircularCornerPathRenderer.Corner screenBottomLeft = getRotatedCorner( - CircularCornerPathRenderer.Corner.BOTTOM_LEFT); - CircularCornerPathRenderer.Corner screenBottomRight = getRotatedCorner( - CircularCornerPathRenderer.Corner.BOTTOM_RIGHT); - CircularCornerPathRenderer.Corner screenTopLeft = getRotatedCorner( - CircularCornerPathRenderer.Corner.TOP_LEFT); - CircularCornerPathRenderer.Corner screenTopRight = getRotatedCorner( - CircularCornerPathRenderer.Corner.TOP_RIGHT); + CornerPathRenderer.Corner screenBottomLeft = getRotatedCorner( + CornerPathRenderer.Corner.BOTTOM_LEFT); + CornerPathRenderer.Corner screenBottomRight = getRotatedCorner( + CornerPathRenderer.Corner.BOTTOM_RIGHT); + CornerPathRenderer.Corner screenTopLeft = getRotatedCorner( + CornerPathRenderer.Corner.TOP_LEFT); + CornerPathRenderer.Corner screenTopRight = getRotatedCorner( + CornerPathRenderer.Corner.TOP_RIGHT); mRegions[Region.BOTTOM_LEFT.ordinal()].path = mCornerPathRenderer.getInsetPath(screenBottomLeft, mEdgeInset); @@ -287,9 +287,12 @@ public class PerimeterPathGuide { float accum = 0; for (int i = 0; i < mRegions.length; i++) { mRegions[i].normalizedLength = mRegions[i].absoluteLength / perimeterLength; - accum += mRegions[i].normalizedLength; - mRegions[i].endCoordinate = accum; + accum += mRegions[i].absoluteLength; + mRegions[i].endCoordinate = accum / perimeterLength; } + // Ensure that the last coordinate is 1. Setting it explicitly to avoid floating point + // error. + mRegions[mRegions.length - 1].endCoordinate = 1f; } private CircularCornerPathRenderer.Corner getRotatedCorner( diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java index 18b8a9c859b1..ce67577ea483 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/BiometricDialogView.java @@ -16,6 +16,8 @@ package com.android.systemui.biometrics; +import static android.view.accessibility.AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE; + import android.app.admin.DevicePolicyManager; import android.content.Context; import android.graphics.PixelFormat; @@ -36,6 +38,8 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityManager; import android.view.animation.Interpolator; import android.widget.Button; import android.widget.ImageView; @@ -55,6 +59,7 @@ public abstract class BiometricDialogView extends LinearLayout { private static final String KEY_TRY_AGAIN_VISIBILITY = "key_try_again_visibility"; private static final String KEY_CONFIRM_VISIBILITY = "key_confirm_visibility"; + private static final String KEY_CONFIRM_ENABLED = "key_confirm_enabled"; private static final String KEY_STATE = "key_state"; private static final String KEY_ERROR_TEXT_VISIBILITY = "key_error_text_visibility"; private static final String KEY_ERROR_TEXT_STRING = "key_error_text_string"; @@ -72,6 +77,7 @@ public abstract class BiometricDialogView extends LinearLayout { protected static final int STATE_PENDING_CONFIRMATION = 3; protected static final int STATE_AUTHENTICATED = 4; + private final AccessibilityManager mAccessibilityManager; private final IBinder mWindowToken = new Binder(); private final Interpolator mLinearOutSlowIn; private final WindowManager mWindowManager; @@ -105,6 +111,9 @@ public abstract class BiometricDialogView extends LinearLayout { protected boolean mRequireConfirmation; private int mUserId; // used to determine if we should show work background + private boolean mCompletedAnimatingIn; + private boolean mPendingDismissDialog; + protected abstract int getHintStringResourceId(); protected abstract int getAuthenticatedAccessibilityResourceId(); protected abstract int getIconDescriptionResourceId(); @@ -150,6 +159,7 @@ public abstract class BiometricDialogView extends LinearLayout { super(context); mCallback = callback; mLinearOutSlowIn = Interpolators.LINEAR_OUT_SLOW_IN; + mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class); mWindowManager = mContext.getSystemService(WindowManager.class); mUserManager = mContext.getSystemService(UserManager.class); mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class); @@ -226,6 +236,10 @@ public abstract class BiometricDialogView extends LinearLayout { handleResetMessage(); updateState(STATE_AUTHENTICATING); showTryAgainButton(false /* show */); + + mPositiveButton.setVisibility(View.VISIBLE); + mPositiveButton.setEnabled(false); + mCallback.onTryAgainPressed(); }); @@ -237,6 +251,7 @@ public abstract class BiometricDialogView extends LinearLayout { public void onSaveState(Bundle bundle) { bundle.putInt(KEY_TRY_AGAIN_VISIBILITY, mTryAgainButton.getVisibility()); bundle.putInt(KEY_CONFIRM_VISIBILITY, mPositiveButton.getVisibility()); + bundle.putBoolean(KEY_CONFIRM_ENABLED, mPositiveButton.isEnabled()); bundle.putInt(KEY_STATE, mState); bundle.putInt(KEY_ERROR_TEXT_VISIBILITY, mErrorText.getVisibility()); bundle.putCharSequence(KEY_ERROR_TEXT_STRING, mErrorText.getText()); @@ -255,6 +270,7 @@ public abstract class BiometricDialogView extends LinearLayout { mContext.getTheme()); image.setColorFilter(mDevicePolicyManager.getOrganizationColorForUser(mUserId), PorterDuff.Mode.DARKEN); + backgroundView.setScaleType(ImageView.ScaleType.CENTER_CROP); backgroundView.setImageDrawable(image); } else { backgroundView.setImageDrawable(null); @@ -269,9 +285,16 @@ public abstract class BiometricDialogView extends LinearLayout { if (mRestoredState == null) { updateState(STATE_AUTHENTICATING); - mErrorText.setText(getHintStringResourceId()); - mErrorText.setContentDescription(mContext.getString(getHintStringResourceId())); - mErrorText.setVisibility(View.VISIBLE); + mNegativeButton.setText(mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT)); + final int hint = getHintStringResourceId(); + if (hint != 0) { + mErrorText.setText(hint); + mErrorText.setContentDescription(mContext.getString(hint)); + mErrorText.setVisibility(View.VISIBLE); + } else { + mErrorText.setVisibility(View.INVISIBLE); + } + announceAccessibilityEvent(); } else { updateState(mState); } @@ -284,6 +307,7 @@ public abstract class BiometricDialogView extends LinearLayout { final CharSequence subtitleText = mBundle.getCharSequence(BiometricPrompt.KEY_SUBTITLE); if (TextUtils.isEmpty(subtitleText)) { mSubtitleText.setVisibility(View.GONE); + announceAccessibilityEvent(); } else { mSubtitleText.setVisibility(View.VISIBLE); mSubtitleText.setText(subtitleText); @@ -293,13 +317,12 @@ public abstract class BiometricDialogView extends LinearLayout { mBundle.getCharSequence(BiometricPrompt.KEY_DESCRIPTION); if (TextUtils.isEmpty(descriptionText)) { mDescriptionText.setVisibility(View.GONE); + announceAccessibilityEvent(); } else { mDescriptionText.setVisibility(View.VISIBLE); mDescriptionText.setText(descriptionText); } - mNegativeButton.setText(mBundle.getCharSequence(BiometricPrompt.KEY_NEGATIVE_TEXT)); - if (requiresConfirmation() && mRestoredState == null) { mPositiveButton.setVisibility(View.VISIBLE); mPositiveButton.setEnabled(false); @@ -312,6 +335,7 @@ public abstract class BiometricDialogView extends LinearLayout { mDialog.setAlpha(1.0f); mDialog.setTranslationY(0); mLayout.setAlpha(1.0f); + mCompletedAnimatingIn = true; } else { // Dim the background and slide the dialog up mDialog.setTranslationY(mAnimationTranslationOffset); @@ -332,6 +356,12 @@ public abstract class BiometricDialogView extends LinearLayout { } public void startDismiss() { + if (!mCompletedAnimatingIn) { + Log.w(TAG, "startDismiss(): waiting for onDialogAnimatedIn"); + mPendingDismissDialog = true; + return; + } + mAnimatingAway = true; // This is where final cleanup should occur. @@ -417,6 +447,7 @@ public abstract class BiometricDialogView extends LinearLayout { mErrorText.setText(message); mErrorText.setTextColor(mErrorColor); mErrorText.setContentDescription(message); + mErrorText.setVisibility(View.VISIBLE); mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_RESET_MESSAGE), BiometricPrompt.HIDE_DIALOG_DELAY); } @@ -450,17 +481,24 @@ public abstract class BiometricDialogView extends LinearLayout { public void updateState(int newState) { if (newState == STATE_PENDING_CONFIRMATION) { mHandler.removeMessages(MSG_RESET_MESSAGE); - mErrorText.setVisibility(View.INVISIBLE); + mErrorText.setTextColor(mTextColor); + mErrorText.setText(R.string.biometric_dialog_tap_confirm); + mErrorText.setContentDescription( + getResources().getString(R.string.biometric_dialog_tap_confirm)); + mErrorText.setVisibility(View.VISIBLE); + announceAccessibilityEvent(); mPositiveButton.setVisibility(View.VISIBLE); mPositiveButton.setEnabled(true); } else if (newState == STATE_AUTHENTICATED) { mPositiveButton.setVisibility(View.GONE); mNegativeButton.setVisibility(View.GONE); mErrorText.setVisibility(View.INVISIBLE); + announceAccessibilityEvent(); } if (newState == STATE_PENDING_CONFIRMATION || newState == STATE_AUTHENTICATED) { mNegativeButton.setText(R.string.cancel); + mNegativeButton.setContentDescription(getResources().getString(R.string.cancel)); } updateIcon(mState, newState); @@ -471,18 +509,33 @@ public abstract class BiometricDialogView extends LinearLayout { } public void onDialogAnimatedIn() { + mCompletedAnimatingIn = true; + + if (mPendingDismissDialog) { + Log.d(TAG, "onDialogAnimatedIn(): mPendingDismissDialog=true, dismissing now"); + startDismiss(); + mPendingDismissDialog = false; + } } public void restoreState(Bundle bundle) { mRestoredState = bundle; - mTryAgainButton.setVisibility(bundle.getInt(KEY_TRY_AGAIN_VISIBILITY)); - mPositiveButton.setVisibility(bundle.getInt(KEY_CONFIRM_VISIBILITY)); + final int tryAgainVisibility = bundle.getInt(KEY_TRY_AGAIN_VISIBILITY); + mTryAgainButton.setVisibility(tryAgainVisibility); + final int confirmVisibility = bundle.getInt(KEY_CONFIRM_VISIBILITY); + mPositiveButton.setVisibility(confirmVisibility); + final boolean confirmEnabled = bundle.getBoolean(KEY_CONFIRM_ENABLED); + mPositiveButton.setEnabled(confirmEnabled); mState = bundle.getInt(KEY_STATE); mErrorText.setText(bundle.getCharSequence(KEY_ERROR_TEXT_STRING)); mErrorText.setContentDescription(bundle.getCharSequence(KEY_ERROR_TEXT_STRING)); - mErrorText.setVisibility(bundle.getInt(KEY_ERROR_TEXT_VISIBILITY)); + final int errorTextVisibility = bundle.getInt(KEY_ERROR_TEXT_VISIBILITY); + mErrorText.setVisibility(errorTextVisibility); + if (errorTextVisibility == View.INVISIBLE || tryAgainVisibility == View.INVISIBLE + || confirmVisibility == View.INVISIBLE) { + announceAccessibilityEvent(); + } mErrorText.setTextColor(bundle.getInt(KEY_ERROR_TEXT_COLOR)); - if (bundle.getBoolean(KEY_ERROR_TEXT_IS_TEMPORARY)) { mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_RESET_MESSAGE), BiometricPrompt.HIDE_DIALOG_DELAY); @@ -505,4 +558,18 @@ public abstract class BiometricDialogView extends LinearLayout { lp.token = mWindowToken; return lp; } + + // Every time a view becomes invisible we need to announce an accessibility event. + // This is due to an issue in the framework, b/132298701 recommended this workaround. + protected void announceAccessibilityEvent() { + if (!mAccessibilityManager.isEnabled()) { + return; + } + AccessibilityEvent event = AccessibilityEvent.obtain(); + event.setEventType(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); + event.setContentChangeTypes(CONTENT_CHANGE_TYPE_SUBTREE); + mDialog.sendAccessibilityEventUnchecked(event); + mDialog.notifySubtreeAccessibilityStateChanged(mDialog, mDialog, + CONTENT_CHANGE_TYPE_SUBTREE); + } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java b/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java index 8f26f1847779..ae6cb5ce23d3 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/FaceDialogView.java @@ -149,6 +149,7 @@ public class FaceDialogView extends BiometricDialogView { private final Runnable mErrorToIdleAnimationRunnable = () -> { updateState(STATE_IDLE); mErrorText.setVisibility(View.INVISIBLE); + announceAccessibilityEvent(); }; public FaceDialogView(Context context, @@ -188,6 +189,7 @@ public class FaceDialogView extends BiometricDialogView { mDialog.invalidateOutline(); mSize = newSize; + announceAccessibilityEvent(); } else if (mSize == SIZE_SMALL && newSize == SIZE_BIG) { mSize = SIZE_GROWING; @@ -287,14 +289,9 @@ public class FaceDialogView extends BiometricDialogView { @Override protected void handleResetMessage() { - mErrorText.setText(getHintStringResourceId()); - mErrorText.setContentDescription(mContext.getString(getHintStringResourceId())); mErrorText.setTextColor(mTextColor); - if (getState() == STATE_AUTHENTICATING) { - mErrorText.setVisibility(View.VISIBLE); - } else { - mErrorText.setVisibility(View.INVISIBLE); - } + mErrorText.setVisibility(View.INVISIBLE); + announceAccessibilityEvent(); } @Override @@ -368,17 +365,19 @@ public class FaceDialogView extends BiometricDialogView { mTryAgainButton.setVisibility(View.VISIBLE); } else { mTryAgainButton.setVisibility(View.GONE); + announceAccessibilityEvent(); } } if (show) { mPositiveButton.setVisibility(View.GONE); + announceAccessibilityEvent(); } } @Override protected int getHintStringResourceId() { - return R.string.face_dialog_looking_for_face; + return 0; } @Override @@ -403,7 +402,6 @@ public class FaceDialogView extends BiometricDialogView { mHandler.removeCallbacks(mErrorToIdleAnimationRunnable); if (mDialogAnimatedIn) { mIconController.startPulsing(); - mErrorText.setVisibility(View.VISIBLE); } else { mIconController.showIcon(R.drawable.face_dialog_pulse_dark_to_light); } @@ -462,6 +460,7 @@ public class FaceDialogView extends BiometricDialogView { @Override public void onDialogAnimatedIn() { + super.onDialogAnimatedIn(); mDialogAnimatedIn = true; mIconController.startPulsing(); } diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java index f60e95e32600..5c6c39722900 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/Bubble.java @@ -16,6 +16,8 @@ package com.android.systemui.bubbles; +import static android.view.Display.INVALID_DISPLAY; + import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE; import android.content.Context; @@ -129,6 +131,20 @@ class Bubble { mInflated = true; } + /** + * Set visibility of bubble in the expanded state. + * + * @param visibility {@code true} if the expanded bubble should be visible on the screen. + * + * Note that this contents visibility doesn't affect visibility at {@link android.view.View}, + * and setting {@code false} actually means rendering the expanded view in transparent. + */ + void setContentVisibility(boolean visibility) { + if (expandedView != null) { + expandedView.setContentVisibility(visibility); + } + } + void setDismissed() { entry.setBubbleDismissed(true); // TODO: move this somewhere where it can be guaranteed not to run until safe from flicker @@ -168,6 +184,13 @@ class Bubble { } /** + * @return the display id of the virtual display on which bubble contents is drawn. + */ + int getDisplayId() { + return expandedView != null ? expandedView.getVirtualDisplayId() : INVALID_DISPLAY; + } + + /** * Should be invoked whenever a Bubble is accessed (selected while expanded). */ void markAsAccessedAt(long lastAccessedMillis) { diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java index 392183b554a9..a23c99ef01fe 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java @@ -672,17 +672,23 @@ public class BubbleController implements ConfigurationController.ConfigurationLi * status bar, otherwise returns {@link Display#INVALID_DISPLAY}. */ public int getExpandedDisplayId(Context context) { + final Bubble bubble = getExpandedBubble(context); + return bubble != null ? bubble.getDisplayId() : INVALID_DISPLAY; + } + + @Nullable + private Bubble getExpandedBubble(Context context) { if (mStackView == null) { - return INVALID_DISPLAY; + return null; } - boolean defaultDisplay = context.getDisplay() != null + final boolean defaultDisplay = context.getDisplay() != null && context.getDisplay().getDisplayId() == DEFAULT_DISPLAY; - Bubble b = mStackView.getExpandedBubble(); - if (defaultDisplay && b != null && isStackExpanded() + final Bubble expandedBubble = mStackView.getExpandedBubble(); + if (defaultDisplay && expandedBubble != null && isStackExpanded() && !mStatusBarWindowController.getPanelExpanded()) { - return b.expandedView.getVirtualDisplayId(); + return expandedBubble; } - return INVALID_DISPLAY; + return null; } @VisibleForTesting @@ -793,6 +799,14 @@ public class BubbleController implements ConfigurationController.ConfigurationLi mBubbleData.setExpanded(false); } } + + @Override + public void onSingleTaskDisplayDrawn(int displayId) { + final Bubble expandedBubble = getExpandedBubble(mContext); + if (expandedBubble != null && expandedBubble.getDisplayId() == displayId) { + expandedBubble.setContentVisibility(true); + } + } } private static boolean shouldAutoBubbleMessages(Context context) { diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java index cbe6c99bfb0b..923ca20b3925 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java @@ -182,6 +182,8 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList mActivityView = new ActivityView(mContext, null /* attrs */, 0 /* defStyle */, true /* singleTaskInstance */); + + setContentVisibility(false); addView(mActivityView); // Expanded stack layout, top to bottom: @@ -236,6 +238,22 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList } /** + * Set visibility of contents in the expanded state. + * + * @param visibility {@code true} if the contents should be visible on the screen. + * + * Note that this contents visibility doesn't affect visibility at {@link android.view.View}, + * and setting {@code false} actually means rendering the contents in transparent. + */ + void setContentVisibility(boolean visibility) { + final float alpha = visibility ? 1f : 0f; + mPointerView.setAlpha(alpha); + if (mActivityView != null) { + mActivityView.setAlpha(alpha); + } + } + + /** * Called by {@link BubbleStackView} when the insets for the expanded state should be updated. * This should be done post-move and post-animation. */ @@ -307,6 +325,7 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList parent.removeView(mNotifRow); } addView(mNotifRow, 1 /* index */); + mPointerView.setAlpha(1f); } } @@ -333,6 +352,7 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList removeView(mNotifRow); mNotifRow = null; } + setContentVisibility(false); mActivityView.setVisibility(VISIBLE); } else if (DEBUG_ENABLE_AUTO_BUBBLE) { // Hide activity view if we had it previously @@ -428,6 +448,7 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList mActivityView.onLocationChanged(); } else if (mNotifRow != null) { applyRowState(mNotifRow); + mPointerView.setAlpha(1f); } updateHeight(); } @@ -478,7 +499,6 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList view.setHeadsUp(false); view.resetTranslation(); view.setOnKeyguard(false); - view.setOnAmbient(false); view.setClipBottomAmount(0); view.setClipTopAmount(0); view.setContentTransformationAmount(0, false); @@ -494,7 +514,6 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList viewState.gone = false; viewState.hidden = false; viewState.dimmed = false; - viewState.dark = false; viewState.alpha = 1f; viewState.notGoneIndex = -1; viewState.xTranslation = 0; diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index 771df2d86110..f87bcef5fde2 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -745,12 +745,16 @@ public class BubbleStackView extends FrameLayout { } final Bubble previouslySelected = mExpandedBubble; mExpandedBubble = bubbleToSelect; + if (mIsExpanded) { // Make the container of the expanded view transparent before removing the expanded view // from it. Otherwise a punch hole created by {@link android.view.SurfaceView} in the // expanded view becomes visible on the screen. See b/126856255 mExpandedViewContainer.setAlpha(0.0f); mSurfaceSynchronizer.syncSurfaceAndRun(() -> { + if (previouslySelected != null) { + previouslySelected.setContentVisibility(false); + } updateExpandedBubble(); updatePointerPosition(); requestUpdate(); @@ -779,6 +783,14 @@ public class BubbleStackView extends FrameLayout { } if (wasExpanded) { // Collapse the stack + mExpandedViewContainer.setAlpha(0.0f); + // TODO: In order to prevent flicker, code below should be executed after the alpha + // value set on the mExpandedViewContainer is reflected on the screen. However, we + // cannot just postpone the execution like #setSelectedBubble(), since some of member + // variables referred by the code are overridden before the execution. + if (mExpandedBubble != null) { + mExpandedBubble.setContentVisibility(false); + } animateExpansion(false /* expand */); logBubbleEvent(mExpandedBubble, StatsLog.BUBBLE_UICHANGED__ACTION__COLLAPSED); } else { @@ -934,14 +946,10 @@ public class BubbleStackView extends FrameLayout { if (shouldExpand) { mExpandedViewContainer.setTranslationX(xStart); mExpandedViewContainer.setTranslationY(yStart); - mExpandedViewContainer.setAlpha(0f); } mExpandedViewXAnim.animateToFinalPosition(shouldExpand ? 0f : xStart); mExpandedViewYAnim.animateToFinalPosition(shouldExpand ? yDest : yStart); - mExpandedViewContainer.animate() - .setDuration(100) - .alpha(shouldExpand ? 1f : 0f); } } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java index 382c5d5c5954..fba0d5005db4 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerImpl.java @@ -67,8 +67,8 @@ public class FalsingManagerImpl implements FalsingManager { Sensor.TYPE_LIGHT, Sensor.TYPE_ROTATION_VECTOR, }; - private static final String FALSING_REMAIN_LOCKED = "falsing_failure_after_attempts"; - private static final String FALSING_SUCCESS = "falsing_success_after_attempts"; + public static final String FALSING_REMAIN_LOCKED = "falsing_failure_after_attempts"; + public static final String FALSING_SUCCESS = "falsing_success_after_attempts"; private final Handler mHandler = new Handler(Looper.getMainLooper()); private final Context mContext; diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java index eb4edcc45c80..128cc614fd08 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java @@ -93,6 +93,7 @@ public class FalsingManagerProxy implements FalsingManager { public void setupFalsingManager(Context context) { boolean brightlineEnabled = DeviceConfig.getBoolean( DeviceConfig.NAMESPACE_SYSTEMUI, BRIGHTLINE_FALSING_MANAGER_ENABLED, true); + if (mInternalFalsingManager != null) { mInternalFalsingManager.cleanup(); } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java index fbbba57381c6..ce82bbfb1512 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java @@ -16,6 +16,9 @@ package com.android.systemui.classifier.brightline; +import static com.android.systemui.classifier.FalsingManagerImpl.FALSING_REMAIN_LOCKED; +import static com.android.systemui.classifier.FalsingManagerImpl.FALSING_SUCCESS; + import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; @@ -24,6 +27,7 @@ import android.net.Uri; import android.util.Log; import android.view.MotionEvent; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.classifier.Classifier; import com.android.systemui.plugins.FalsingManager; @@ -44,6 +48,8 @@ public class BrightLineFalsingManager implements FalsingManager { private final SensorManager mSensorManager; private final FalsingDataProvider mDataProvider; private boolean mSessionStarted; + private MetricsLogger mMetricsLogger; + private int mIsFalseTouchCalls; private boolean mShowingAod; private boolean mScreenOn; @@ -66,6 +72,7 @@ public class BrightLineFalsingManager implements FalsingManager { SensorManager sensorManager) { mDataProvider = falsingDataProvider; mSensorManager = sensorManager; + mMetricsLogger = new MetricsLogger(); mClassifiers = new ArrayList<>(); DistanceClassifier distanceClassifier = new DistanceClassifier(mDataProvider); ProximityClassifier proximityClassifier = new ProximityClassifier(distanceClassifier, @@ -115,6 +122,10 @@ public class BrightLineFalsingManager implements FalsingManager { unregisterSensors(); mDataProvider.onSessionEnd(); mClassifiers.forEach(FalsingClassifier::onSessionEnded); + if (mIsFalseTouchCalls != 0) { + mMetricsLogger.histogram(FALSING_REMAIN_LOCKED, mIsFalseTouchCalls); + mIsFalseTouchCalls = 0; + } } } @@ -161,6 +172,10 @@ public class BrightLineFalsingManager implements FalsingManager { @Override public void onSucccessfulUnlock() { + if (mIsFalseTouchCalls != 0) { + mMetricsLogger.histogram(FALSING_SUCCESS, mIsFalseTouchCalls); + mIsFalseTouchCalls = 0; + } sessionEnd(); } diff --git a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java index 6f56a53c1c49..d3e8b3d3236e 100644 --- a/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java +++ b/packages/SystemUI/src/com/android/systemui/colorextraction/SysuiColorExtractor.java @@ -67,19 +67,17 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable, mBackdropColors = new GradientColors(); mBackdropColors.setMainColor(Color.BLACK); - if (wallpaperManager != null) { - // Listen to all users instead of only the current one. - wallpaperManager.removeOnColorsChangedListener(this); - wallpaperManager.addOnColorsChangedListener(this, null /* handler */, - UserHandle.USER_ALL); - } + // Listen to all users instead of only the current one. + wallpaperManager.removeOnColorsChangedListener(this); + wallpaperManager.addOnColorsChangedListener(this, null /* handler */, + UserHandle.USER_ALL); } @Override protected void extractWallpaperColors() { super.extractWallpaperColors(); // mTonal is final but this method will be invoked by the base class during its ctor. - if (mTonal == null) { + if (mTonal == null || mNeutralColorsLock == null) { return; } mTonal.applyFallback(mLockColors == null ? mSystemColors : mLockColors, mNeutralColorsLock); diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeAuthRemover.java b/packages/SystemUI/src/com/android/systemui/doze/DozeAuthRemover.java new file mode 100644 index 000000000000..e6a9e47be71c --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeAuthRemover.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2019 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.doze; + +import android.content.Context; + +import com.android.keyguard.KeyguardUpdateMonitor; + +/** + * Controls removing Keyguard authorization when the phone goes to sleep. + */ +public class DozeAuthRemover implements DozeMachine.Part { + + KeyguardUpdateMonitor mKeyguardUpdateMonitor; + + public DozeAuthRemover(Context context) { + mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(context); + } + + @Override + public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState) { + if (newState == DozeMachine.State.DOZE || newState == DozeMachine.State.DOZE_AOD) { + int currentUser = KeyguardUpdateMonitor.getCurrentUser(); + if (mKeyguardUpdateMonitor.getUserUnlockedWithBiometric(currentUser)) { + mKeyguardUpdateMonitor.clearBiometricRecognized(); + } + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeDockHandler.java b/packages/SystemUI/src/com/android/systemui/doze/DozeDockHandler.java index 3c6dc7317357..1d7e9eacbd2e 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeDockHandler.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeDockHandler.java @@ -43,6 +43,7 @@ public class DozeDockHandler implements DozeMachine.Part { private final DockManager mDockManager; private int mDockState = DockManager.STATE_NONE; + private boolean mPulsePending; public DozeDockHandler(Context context, DozeMachine machine, DozeHost dozeHost, AmbientDisplayConfiguration config, Handler handler, DockManager dockManager) { @@ -66,7 +67,8 @@ public class DozeDockHandler implements DozeMachine.Part { } // continue below case DOZE: - if (mDockState == DockManager.STATE_DOCKED) { + if (mDockState == DockManager.STATE_DOCKED && !mPulsePending) { + mPulsePending = true; mHandler.post(() -> requestPulse(newState)); } break; @@ -79,11 +81,10 @@ public class DozeDockHandler implements DozeMachine.Part { } private void requestPulse(State dozeState) { - if (mDozeHost.isPulsingBlocked() || !dozeState.canPulse()) { - return; + if (!mDozeHost.isPulsingBlocked() && dozeState.canPulse()) { + mMachine.requestPulse(DozeLog.PULSE_REASON_DOCKING); } - - mMachine.requestPulse(DozeLog.PULSE_REASON_DOCKING); + mPulsePending = false; } private void requestPulseOutNow(State dozeState) { diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java index 9c2adb36e1ae..d22d2c3fd47f 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java @@ -72,7 +72,8 @@ public class DozeFactory { createDozeScreenBrightness(context, wrappedService, sensorManager, host, params, handler), new DozeWallpaperState(context, getBiometricUnlockController(dozeService)), - new DozeDockHandler(context, machine, host, config, handler, dockManager) + new DozeDockHandler(context, machine, host, config, handler, dockManager), + new DozeAuthRemover(dozeService) }); return machine; diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java index 3c9d4a9704a0..07dd2cd77043 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java @@ -50,9 +50,23 @@ public interface DozeHost { */ void onSlpiTap(float x, float y); + /** + * Artificially dim down the the display by changing scrim opacities. + * @param scrimOpacity opacity from 0 to 1. + */ default void setAodDimmingScrim(float scrimOpacity) {} + + /** + * Sets the actual display brightness. + * @param value from 0 to 255. + */ void setDozeScreenBrightness(int value); + /** + * Makes scrims black and changes animation durations. + */ + default void prepareForGentleWakeUp() {} + void onIgnoreTouchWhilePulsing(boolean ignore); /** @@ -63,8 +77,10 @@ public interface DozeHost { interface Callback { /** * Called when a high priority notification is added. + * @param onPulseSuppressedListener A listener that is invoked if the pulse is being + * supressed. */ - default void onNotificationAlerted() {} + default void onNotificationAlerted(Runnable onPulseSuppressedListener) {} /** * Called when battery state or power save mode changes. diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java index 9bca3c7382ca..c09e28426072 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java @@ -261,6 +261,12 @@ public class DozeLog { + state + " blocked=" + blocked); } + public static void tracePulseDropped(Context context, String why) { + if (!ENABLED) return; + init(context); + log("pulseDropped why=" + why); + } + public static void tracePulseTouchDisabledByProx(Context context, boolean disabled) { if (!ENABLED) return; init(context); diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java index 368451ad379d..38ee2fed136d 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java @@ -36,13 +36,13 @@ public class DozeScreenState implements DozeMachine.Part { * Delay entering low power mode when animating to make sure that we'll have * time to move all elements into their final positions while still at 60 fps. */ - private static final int ENTER_DOZE_DELAY = 6000; + private static final int ENTER_DOZE_DELAY = 4000; /** * Hide wallpaper earlier when entering low power mode. The gap between * hiding the wallpaper and changing the display mode is necessary to hide * the black frame that's inherent to hardware specs. */ - public static final int ENTER_DOZE_HIDE_WALLPAPER_DELAY = 4500; + public static final int ENTER_DOZE_HIDE_WALLPAPER_DELAY = 2500; private final DozeMachine.Service mDozeService; private final Handler mHandler; @@ -82,7 +82,10 @@ public class DozeScreenState implements DozeMachine.Part { boolean messagePending = mHandler.hasCallbacks(mApplyPendingScreenState); boolean pulseEnding = oldState == DozeMachine.State.DOZE_PULSE_DONE && newState == DozeMachine.State.DOZE_AOD; - if (messagePending || oldState == DozeMachine.State.INITIALIZED || pulseEnding) { + boolean turningOn = (oldState == DozeMachine.State.DOZE_AOD_PAUSED + || oldState == DozeMachine.State.DOZE) && newState == DozeMachine.State.DOZE_AOD; + boolean justInitialized = oldState == DozeMachine.State.INITIALIZED; + if (messagePending || justInitialized || pulseEnding || turningOn) { // During initialization, we hide the navigation bar. That is however only applied after // a traversal; setting the screen state here is immediate however, so it can happen // that the screen turns on again before the navigation bar is hidden. To work around @@ -91,7 +94,7 @@ public class DozeScreenState implements DozeMachine.Part { // Delay screen state transitions even longer while animations are running. boolean shouldDelayTransition = newState == DozeMachine.State.DOZE_AOD - && mParameters.shouldControlScreenOff(); + && mParameters.shouldControlScreenOff() && !turningOn; if (shouldDelayTransition) { mWakeLock.setAcquired(true); diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index a882309c06d4..f6a921d6d127 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -77,6 +77,8 @@ public class DozeSensors { private final ProxSensor mProxSensor; private long mDebounceFrom; private boolean mSettingRegistered; + private boolean mListening; + private boolean mPaused; public DozeSensors(Context context, AlarmManager alarmManager, SensorManager sensorManager, DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock, @@ -101,9 +103,12 @@ public class DozeSensors { mPickupSensor = new TriggerSensor( mSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE), Settings.Secure.DOZE_PICK_UP_GESTURE, + true /* settingDef */, config.dozePickupSensorAvailable(), DozeLog.REASON_SENSOR_PICKUP, false /* touchCoords */, - false /* touchscreen */), + false /* touchscreen */, + false /* ignoresSetting */, + mDozeParameters.getPickupPerformsProxCheck()), new TriggerSensor( findSensorWithType(config.doubleTapSensorType()), Settings.Secure.DOZE_DOUBLE_TAP_GESTURE, @@ -128,15 +133,15 @@ public class DozeSensors { true /* touchscreen */), new PluginSensor( new SensorManagerPlugin.Sensor(TYPE_WAKE_DISPLAY), - Settings.Secure.DOZE_WAKE_SCREEN_GESTURE, + Settings.Secure.DOZE_WAKE_DISPLAY_GESTURE, mConfig.wakeScreenGestureAvailable() && alwaysOn, DozeLog.REASON_SENSOR_WAKE_UP, false /* reports touch coordinates */, false /* touchscreen */), new PluginSensor( new SensorManagerPlugin.Sensor(TYPE_WAKE_LOCK_SCREEN), - Settings.Secure.DOZE_WAKE_SCREEN_GESTURE, - mConfig.wakeScreenGestureAvailable() && alwaysOn, + Settings.Secure.DOZE_WAKE_LOCK_SCREEN_GESTURE, + mConfig.wakeScreenGestureAvailable(), DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN, false /* reports touch coordinates */, false /* touchscreen */, mConfig.getWakeLockScreenDebounce()), @@ -171,11 +176,52 @@ public class DozeSensors { return null; } + /** + * If sensors should be registered and sending signals. + */ public void setListening(boolean listen) { + if (mListening == listen) { + return; + } + mListening = listen; + updateListening(); + } + + /** + * Unregister sensors, when listening, unless they are prox gated. + * @see #setListening(boolean) + */ + public void setPaused(boolean paused) { + if (mPaused == paused) { + return; + } + mPaused = paused; + updateListening(); + } + + /** + * Registers/unregisters sensors based on internal state. + */ + public void updateListening() { + boolean anyListening = false; for (TriggerSensor s : mSensors) { + // We don't want to be listening while we're PAUSED (prox sensor is covered) + // except when the sensor is already gated by prox. + boolean listen = mListening && (!mPaused || s.performsProxCheck()); s.setListening(listen); + if (listen) { + anyListening = true; + } + } + + if (!anyListening) { + mResolver.unregisterContentObserver(mSettingsObserver); + } else if (!mSettingRegistered) { + for (TriggerSensor s : mSensors) { + s.registerSettingsObserver(mSettingsObserver); + } } - registerSettingsObserverIfNeeded(listen); + mSettingRegistered = anyListening; } /** Set the listening state of only the sensors that require the touchscreen. */ @@ -189,7 +235,7 @@ public class DozeSensors { public void onUserSwitched() { for (TriggerSensor s : mSensors) { - s.updateListener(); + s.updateListening(); } } @@ -204,7 +250,7 @@ public class DozeSensors { return; } for (TriggerSensor s : mSensors) { - s.updateListener(); + s.updateListening(); } } }; @@ -237,17 +283,6 @@ public class DozeSensors { return mProxSensor.mCurrentlyFar; } - private void registerSettingsObserverIfNeeded(boolean register) { - if (!register) { - mResolver.unregisterContentObserver(mSettingsObserver); - } else if (!mSettingRegistered) { - for (TriggerSensor s : mSensors) { - s.registerSettingsObserver(mSettingsObserver); - } - } - mSettingRegistered = register; - } - private class ProxSensor implements SensorEventListener { boolean mRequested; @@ -345,10 +380,11 @@ public class DozeSensors { final Sensor mSensor; final boolean mConfigured; final int mPulseReason; - final String mSetting; - final boolean mReportsTouchCoordinates; - final boolean mSettingDefault; - final boolean mRequiresTouchscreen; + private final String mSetting; + private final boolean mReportsTouchCoordinates; + private final boolean mSettingDefault; + private final boolean mRequiresTouchscreen; + private final boolean mSensorPerformsProxCheck; protected boolean mRequested; protected boolean mRegistered; @@ -365,12 +401,14 @@ public class DozeSensors { boolean configured, int pulseReason, boolean reportsTouchCoordinates, boolean requiresTouchscreen) { this(sensor, setting, settingDef, configured, pulseReason, reportsTouchCoordinates, - requiresTouchscreen, false /* ignoresSetting */); + requiresTouchscreen, false /* ignoresSetting */, + false /* sensorPerformsProxCheck */); } private TriggerSensor(Sensor sensor, String setting, boolean settingDef, boolean configured, int pulseReason, boolean reportsTouchCoordinates, - boolean requiresTouchscreen, boolean ignoresSetting) { + boolean requiresTouchscreen, boolean ignoresSetting, + boolean sensorPerformsProxCheck) { mSensor = sensor; mSetting = setting; mSettingDefault = settingDef; @@ -379,27 +417,28 @@ public class DozeSensors { mReportsTouchCoordinates = reportsTouchCoordinates; mRequiresTouchscreen = requiresTouchscreen; mIgnoresSetting = ignoresSetting; + mSensorPerformsProxCheck = sensorPerformsProxCheck; } public void setListening(boolean listen) { if (mRequested == listen) return; mRequested = listen; - updateListener(); + updateListening(); } public void setDisabled(boolean disabled) { if (mDisabled == disabled) return; mDisabled = disabled; - updateListener(); + updateListening(); } public void ignoreSetting(boolean ignored) { if (mIgnoresSetting == ignored) return; mIgnoresSetting = ignored; - updateListener(); + updateListening(); } - public void updateListener() { + public void updateListening() { if (!mConfigured || mSensor == null) return; if (mRequested && !mDisabled && (enabledBySetting() || mIgnoresSetting) && !mRegistered) { @@ -438,14 +477,11 @@ public class DozeSensors { DozeLog.traceSensor(mContext, mPulseReason); mHandler.post(mWakeLock.wrap(() -> { if (DEBUG) Log.d(TAG, "onTrigger: " + triggerEventToString(event)); - boolean sensorPerformsProxCheck = false; if (mSensor != null && mSensor.getType() == Sensor.TYPE_PICK_UP_GESTURE) { int subType = (int) event.values[0]; MetricsLogger.action( mContext, MetricsProto.MetricsEvent.ACTION_AMBIENT_GESTURE, subType); - sensorPerformsProxCheck = - mDozeParameters.getPickupSubtypePerformsProxCheck(subType); } mRegistered = false; @@ -455,14 +491,23 @@ public class DozeSensors { screenX = event.values[0]; screenY = event.values[1]; } - mCallback.onSensorPulse(mPulseReason, sensorPerformsProxCheck, screenX, screenY, + mCallback.onSensorPulse(mPulseReason, mSensorPerformsProxCheck, screenX, screenY, event.values); if (!mRegistered) { - updateListener(); // reregister, this sensor only fires once + updateListening(); // reregister, this sensor only fires once } })); } + /** + * If the sensor itself performs proximity checks, to avoid pocket dialing. + * Gated sensors don't need to be stopped when the {@link DozeMachine} is + * {@link DozeMachine.State#DOZE_AOD_PAUSED}. + */ + public boolean performsProxCheck() { + return mSensorPerformsProxCheck; + } + public void registerSettingsObserver(ContentObserver settingsObserver) { if (mConfigured && !TextUtils.isEmpty(mSetting)) { mResolver.registerContentObserver( @@ -510,7 +555,7 @@ public class DozeSensors { } @Override - public void updateListener() { + public void updateListening() { if (!mConfigured) return; AsyncSensorManager asyncSensorManager = (AsyncSensorManager) mSensorManager; if (mRequested && !mDisabled && (enabledBySetting() || mIgnoresSetting) @@ -554,7 +599,7 @@ public class DozeSensors { mHandler.post(mWakeLock.wrap(() -> { final long now = SystemClock.uptimeMillis(); if (now < mDebounceFrom + mDebounce) { - if (DEBUG) Log.d(TAG, "onSensorEvent dropped: " + triggerEventToString(event)); + Log.d(TAG, "onSensorEvent dropped: " + triggerEventToString(event)); return; } if (DEBUG) Log.d(TAG, "onSensorEvent: " + triggerEventToString(event)); diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index a381e7b60f0a..310f04abc36c 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -106,14 +106,33 @@ public class DozeTriggers implements DozeMachine.Part { mDockManager = dockManager; } - private void onNotification() { - if (DozeMachine.DEBUG) Log.d(TAG, "requestNotificationPulse"); + private void onNotification(Runnable onPulseSuppressedListener) { + if (DozeMachine.DEBUG) { + Log.d(TAG, "requestNotificationPulse"); + } + if (!sWakeDisplaySensorState) { + Log.d(TAG, "Wake display false. Pulse denied."); + runIfNotNull(onPulseSuppressedListener); + DozeLog.tracePulseDropped(mContext, "wakeDisplaySensor"); + return; + } mNotificationPulseTime = SystemClock.elapsedRealtime(); - if (!mConfig.pulseOnNotificationEnabled(UserHandle.USER_CURRENT)) return; - requestPulse(DozeLog.PULSE_REASON_NOTIFICATION, false /* performedProxCheck */); + if (!mConfig.pulseOnNotificationEnabled(UserHandle.USER_CURRENT)) { + runIfNotNull(onPulseSuppressedListener); + DozeLog.tracePulseDropped(mContext, "pulseOnNotificationsDisabled"); + return; + } + requestPulse(DozeLog.PULSE_REASON_NOTIFICATION, false /* performedProxCheck */, + onPulseSuppressedListener); DozeLog.traceNotificationPulse(mContext); } + private static void runIfNotNull(Runnable runnable) { + if (runnable != null) { + runnable.run(); + } + } + private void proximityCheckThenCall(IntConsumer callback, boolean alreadyPerformedProxCheck, int reason) { @@ -150,10 +169,11 @@ public class DozeTriggers implements DozeMachine.Part { if (isWakeDisplay) { onWakeScreen(wakeEvent, mMachine.isExecutingTransition() ? null : mMachine.getState()); } else if (isLongPress) { - requestPulse(pulseReason, sensorPerformedProxCheck); + requestPulse(pulseReason, sensorPerformedProxCheck, null /* onPulseSupressedListener */); } else if (isWakeLockScreen) { if (wakeEvent) { - requestPulse(pulseReason, sensorPerformedProxCheck); + requestPulse(pulseReason, sensorPerformedProxCheck, + null /* onPulseSupressedListener */); } } else { proximityCheckThenCall((result) -> { @@ -193,7 +213,7 @@ public class DozeTriggers implements DozeMachine.Part { // Let's prepare the display to wake-up by drawing black. // This will cover the hardware wake-up sequence, where the display // becomes black for a few frames. - mDozeHost.setAodDimmingScrim(255f); + mDozeHost.setAodDimmingScrim(1f); } mMachine.wakeUp(); } @@ -216,15 +236,21 @@ public class DozeTriggers implements DozeMachine.Part { if (state == DozeMachine.State.DOZE_PULSING || state == DozeMachine.State.DOZE_PULSING_BRIGHT) { boolean ignoreTouch = near; - if (DEBUG) Log.i(TAG, "Prox changed, ignore touch = " + ignoreTouch); + if (DEBUG) { + Log.i(TAG, "Prox changed, ignore touch = " + ignoreTouch); + } mDozeHost.onIgnoreTouchWhilePulsing(ignoreTouch); } if (far && (paused || pausing)) { - if (DEBUG) Log.i(TAG, "Prox FAR, unpausing AOD"); + if (DEBUG) { + Log.i(TAG, "Prox FAR, unpausing AOD"); + } mMachine.requestState(DozeMachine.State.DOZE_AOD); } else if (near && aod) { - if (DEBUG) Log.i(TAG, "Prox NEAR, pausing AOD"); + if (DEBUG) { + Log.i(TAG, "Prox NEAR, pausing AOD"); + } mMachine.requestState(DozeMachine.State.DOZE_AOD_PAUSING); } } @@ -282,6 +308,7 @@ public class DozeTriggers implements DozeMachine.Part { case DOZE_AOD: mDozeSensors.setProxListening(newState != DozeMachine.State.DOZE); mDozeSensors.setListening(true); + mDozeSensors.setPaused(false); if (newState == DozeMachine.State.DOZE_AOD && !sWakeDisplaySensorState) { onWakeScreen(false, newState); } @@ -289,15 +316,19 @@ public class DozeTriggers implements DozeMachine.Part { case DOZE_AOD_PAUSED: case DOZE_AOD_PAUSING: mDozeSensors.setProxListening(true); - mDozeSensors.setListening(false); + mDozeSensors.setPaused(true); break; case DOZE_PULSING: case DOZE_PULSING_BRIGHT: mDozeSensors.setTouchscreenSensorsListening(false); mDozeSensors.setProxListening(true); + mDozeSensors.setPaused(false); break; case DOZE_PULSE_DONE: mDozeSensors.requestTemporaryDisable(); + // A pulse will temporarily disable sensors that require a touch screen. + // Let's make sure that they are re-enabled when the pulse is over. + mDozeSensors.updateListening(); break; case FINISH: mBroadcastReceiver.unregister(mContext); @@ -321,7 +352,8 @@ public class DozeTriggers implements DozeMachine.Part { } } - private void requestPulse(final int reason, boolean performedProxCheck) { + private void requestPulse(final int reason, boolean performedProxCheck, + Runnable onPulseSuppressedListener) { Assert.isMainThread(); mDozeHost.extendPulse(reason); @@ -338,6 +370,7 @@ public class DozeTriggers implements DozeMachine.Part { DozeLog.tracePulseDropped(mContext, mPulsePending, mMachine.getState(), mDozeHost.isPulsingBlocked()); } + runIfNotNull(onPulseSuppressedListener); return; } @@ -345,7 +378,9 @@ public class DozeTriggers implements DozeMachine.Part { proximityCheckThenCall((result) -> { if (result == ProximityCheck.RESULT_NEAR) { // in pocket, abort pulse + DozeLog.tracePulseDropped(mContext, "inPocket"); mPulsePending = false; + runIfNotNull(onPulseSuppressedListener); } else { // not in pocket, continue pulsing continuePulseRequest(reason); @@ -463,7 +498,8 @@ public class DozeTriggers implements DozeMachine.Part { public void onReceive(Context context, Intent intent) { if (PULSE_ACTION.equals(intent.getAction())) { if (DozeMachine.DEBUG) Log.d(TAG, "Received pulse intent"); - requestPulse(DozeLog.PULSE_REASON_INTENT, false /* performedProxCheck */); + requestPulse(DozeLog.PULSE_REASON_INTENT, false, /* performedProxCheck */ + null /* onPulseSupressedListener */); } if (UiModeManager.ACTION_ENTER_CAR_MODE.equals(intent.getAction())) { mMachine.requestState(DozeMachine.State.FINISH); @@ -513,8 +549,8 @@ public class DozeTriggers implements DozeMachine.Part { private DozeHost.Callback mHostCallback = new DozeHost.Callback() { @Override - public void onNotificationAlerted() { - onNotification(); + public void onNotificationAlerted(Runnable onPulseSuppressedListener) { + onNotification(onPulseSuppressedListener); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java index 51e96d2eecad..1f33af8c3f55 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java @@ -16,6 +16,7 @@ package com.android.systemui.doze; +import static com.android.systemui.doze.DozeMachine.State.DOZE; import static com.android.systemui.doze.DozeMachine.State.DOZE_AOD_PAUSED; import android.app.AlarmManager; @@ -116,7 +117,7 @@ public class DozeUi implements DozeMachine.Part { public void transitionTo(DozeMachine.State oldState, DozeMachine.State newState) { switch (newState) { case DOZE_AOD: - if (oldState == DOZE_AOD_PAUSED) { + if (oldState == DOZE_AOD_PAUSED || oldState == DOZE) { // Whenever turning on the display, it's necessary to push a new frame. // The display buffers will be empty and need to be filled. mHost.dozeTimeTick(); @@ -130,6 +131,7 @@ public class DozeUi implements DozeMachine.Part { break; case DOZE: case DOZE_AOD_PAUSED: + mHost.prepareForGentleWakeUp(); unscheduleTimeTick(); break; case DOZE_REQUEST_PULSE: diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index dc977547b024..0e4c15576957 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -95,6 +95,7 @@ import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.GlobalActions.GlobalActionsManager; import com.android.systemui.plugins.GlobalActionsPanelPlugin; import com.android.systemui.statusbar.phone.ScrimController; +import com.android.systemui.statusbar.phone.StatusBarWindowController; import com.android.systemui.statusbar.phone.UnlockMethodCache; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.util.EmergencyDialerConstants; @@ -1515,6 +1516,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, private boolean mShowing; private float mScrimAlpha; private ResetOrientationData mResetOrientationData; + private boolean mHadTopUi; + private final StatusBarWindowController mStatusBarWindowController; ActionsDialog(Context context, MyAdapter adapter, GlobalActionsPanelPlugin.PanelViewController plugin) { @@ -1523,6 +1526,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, mAdapter = adapter; mColorExtractor = Dependency.get(SysuiColorExtractor.class); mStatusBarService = Dependency.get(IStatusBarService.class); + mStatusBarWindowController = Dependency.get(StatusBarWindowController.class); // Window initialization Window window = getWindow(); @@ -1698,6 +1702,8 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, public void show() { super.show(); mShowing = true; + mHadTopUi = mStatusBarWindowController.getForceHasTopUi(); + mStatusBarWindowController.setForceHasTopUi(true); mBackgroundDrawable.setAlpha(0); mGlobalActionsLayout.setTranslationX(mGlobalActionsLayout.getAnimationOffsetX()); mGlobalActionsLayout.setTranslationY(mGlobalActionsLayout.getAnimationOffsetY()); @@ -1730,7 +1736,7 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, .translationX(mGlobalActionsLayout.getAnimationOffsetX()) .translationY(mGlobalActionsLayout.getAnimationOffsetY()) .setDuration(300) - .withEndAction(super::dismiss) + .withEndAction(this::completeDismiss) .setInterpolator(new LogAccelerateInterpolator()) .setUpdateListener(animation -> { int alpha = (int) ((1f - (Float) animation.getAnimatedValue()) @@ -1743,10 +1749,15 @@ public class GlobalActionsDialog implements DialogInterface.OnDismissListener, } void dismissImmediately() { - super.dismiss(); mShowing = false; dismissPanel(); resetOrientation(); + completeDismiss(); + } + + private void completeDismiss() { + mStatusBarWindowController.setForceHasTopUi(mHadTopUi); + super.dismiss(); } private void dismissPanel() { diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java index 4065d5b5dd8d..1f3403b054c1 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java @@ -30,6 +30,7 @@ import android.widget.TextView; import com.android.internal.R; import com.android.internal.colorextraction.ColorExtractor.GradientColors; import com.android.internal.colorextraction.drawable.ScrimDrawable; +import com.android.keyguard.KeyguardUpdateMonitor; import com.android.settingslib.Utils; import com.android.systemui.Dependency; import com.android.systemui.SysUiServiceProvider; @@ -81,6 +82,7 @@ public class GlobalActionsImpl implements GlobalActions, CommandQueue.Callbacks mGlobalActions.showDialog(mKeyguardMonitor.isShowing(), mDeviceProvisionedController.isDeviceProvisioned(), mPanelExtension.get()); + KeyguardUpdateMonitor.getInstance(mContext).requestFaceAuth(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java index 0687b7d8efce..48f32cf04fb2 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java @@ -53,6 +53,8 @@ import com.android.systemui.R; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.phone.DozeParameters; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.NextAlarmControllerImpl; import com.android.systemui.statusbar.policy.ZenModeController; @@ -61,7 +63,6 @@ import com.android.systemui.util.wakelock.SettableWakeLock; import com.android.systemui.util.wakelock.WakeLock; import java.util.Date; -import java.util.HashSet; import java.util.Locale; import java.util.TimeZone; import java.util.concurrent.TimeUnit; @@ -103,8 +104,8 @@ public class KeyguardSliceProvider extends SliceProvider implements private final Date mCurrentTime = new Date(); private final Handler mHandler; private final AlarmManager.OnAlarmListener mUpdateNextAlarm = this::updateNextAlarm; - private final HashSet<Integer> mMediaInvisibleStates; private final Object mMediaToken = new Object(); + private DozeParameters mDozeParameters; @VisibleForTesting protected SettableWakeLock mMediaWakeLock; @VisibleForTesting @@ -123,6 +124,7 @@ public class KeyguardSliceProvider extends SliceProvider implements private PendingIntent mPendingIntent; protected NotificationMediaManager mMediaManager; private StatusBarStateController mStatusBarStateController; + private KeyguardBypassController mKeyguardBypassController; private CharSequence mMediaTitle; private CharSequence mMediaArtist; protected boolean mDozing; @@ -184,11 +186,6 @@ public class KeyguardSliceProvider extends SliceProvider implements mAlarmUri = Uri.parse(KEYGUARD_NEXT_ALARM_URI); mDndUri = Uri.parse(KEYGUARD_DND_URI); mMediaUri = Uri.parse(KEYGUARD_MEDIA_URI); - - mMediaInvisibleStates = new HashSet<>(); - mMediaInvisibleStates.add(PlaybackState.STATE_NONE); - mMediaInvisibleStates.add(PlaybackState.STATE_STOPPED); - mMediaInvisibleStates.add(PlaybackState.STATE_PAUSED); } /** @@ -200,11 +197,15 @@ public class KeyguardSliceProvider extends SliceProvider implements */ public void initDependencies( NotificationMediaManager mediaManager, - StatusBarStateController statusBarStateController) { + StatusBarStateController statusBarStateController, + KeyguardBypassController keyguardBypassController, + DozeParameters dozeParameters) { mMediaManager = mediaManager; mMediaManager.addCallback(this); mStatusBarStateController = statusBarStateController; mStatusBarStateController.addCallback(this); + mKeyguardBypassController = keyguardBypassController; + mDozeParameters = dozeParameters; } @AnyThread @@ -229,10 +230,13 @@ public class KeyguardSliceProvider extends SliceProvider implements } protected boolean needsMediaLocked() { + boolean keepWhenAwake = mKeyguardBypassController != null + && mKeyguardBypassController.getBypassEnabled() && mDozeParameters.getAlwaysOn(); // Show header if music is playing and the status bar is in the shade state. This way, an // animation isn't necessary when pressing power and transitioning to AOD. boolean keepWhenShade = mStatusBarState == StatusBarState.SHADE && mMediaIsVisible; - return !TextUtils.isEmpty(mMediaTitle) && mMediaIsVisible && (mDozing || keepWhenShade); + return !TextUtils.isEmpty(mMediaTitle) && mMediaIsVisible && (mDozing || keepWhenAwake + || keepWhenShade); } protected void addMediaLocked(ListBuilder listBuilder) { @@ -457,7 +461,7 @@ public class KeyguardSliceProvider extends SliceProvider implements @Override public void onMetadataOrStateChanged(MediaMetadata metadata, @PlaybackState.State int state) { synchronized (this) { - boolean nextVisible = !mMediaInvisibleStates.contains(state); + boolean nextVisible = NotificationMediaManager.isPlayingState(state); mHandler.removeCallbacksAndMessages(mMediaToken); if (mMediaIsVisible && !nextVisible && mStatusBarState != StatusBarState.SHADE) { // We need to delay this event for a few millis when stopping to avoid jank in the @@ -476,7 +480,7 @@ public class KeyguardSliceProvider extends SliceProvider implements } private void updateMediaStateLocked(MediaMetadata metadata, @PlaybackState.State int state) { - boolean nextVisible = !mMediaInvisibleStates.contains(state); + boolean nextVisible = NotificationMediaManager.isPlayingState(state); CharSequence title = null; if (metadata != null) { title = metadata.getText(MediaMetadata.METADATA_KEY_TITLE); diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 9616f0a29021..e9f99acd8d46 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -61,6 +61,7 @@ import android.util.EventLog; import android.util.Log; import android.util.Slog; import android.util.SparseArray; +import android.view.View; import android.view.ViewGroup; import android.view.WindowManagerPolicyConstants; import android.view.animation.Animation; @@ -85,9 +86,11 @@ import com.android.systemui.SystemUIFactory; import com.android.systemui.UiOffloadThread; import com.android.systemui.classifier.FalsingManagerFactory; import com.android.systemui.statusbar.phone.BiometricUnlockController; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationPanelView; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; +import com.android.systemui.statusbar.phone.StatusBarWindowController; import com.android.systemui.util.InjectionInflationController; import java.io.FileDescriptor; @@ -174,7 +177,7 @@ public class KeyguardViewMediator extends SystemUI { /** * The default amount of time we stay awake (used for all key input) */ - public static final int AWAKE_INTERVAL_DEFAULT_MS = 10000; + public static final int AWAKE_INTERVAL_BOUNCER_MS = 10000; /** * How long to wait after the screen turns off due to timeout before @@ -202,12 +205,15 @@ public class KeyguardViewMediator extends SystemUI { private AlarmManager mAlarmManager; private AudioManager mAudioManager; private StatusBarManager mStatusBarManager; + private final StatusBarWindowController mStatusBarWindowController = + Dependency.get(StatusBarWindowController.class); private final UiOffloadThread mUiOffloadThread = Dependency.get(UiOffloadThread.class); private boolean mSystemReady; private boolean mBootCompleted; private boolean mBootSendUserPresent; private boolean mShuttingDown; + private boolean mDozing; /** High level access to the power manager for WakeLocks */ private PowerManager mPM; @@ -711,11 +717,10 @@ public class KeyguardViewMediator extends SystemUI { com.android.keyguard.R.bool.config_enableKeyguardService)) { setShowingLocked(!shouldWaitForProvisioning() && !mLockPatternUtils.isLockScreenDisabled( - KeyguardUpdateMonitor.getCurrentUser()), - mAodShowing, true /* forceCallbacks */); + KeyguardUpdateMonitor.getCurrentUser()), true /* forceCallbacks */); } else { // The system's keyguard is disabled or missing. - setShowingLocked(false, mAodShowing, true); + setShowingLocked(false /* showing */, true /* forceCallbacks */); } mStatusBarKeyguardViewManager = @@ -1324,7 +1329,7 @@ public class KeyguardViewMediator extends SystemUI { if (mLockPatternUtils.checkVoldPassword(KeyguardUpdateMonitor.getCurrentUser())) { if (DEBUG) Log.d(TAG, "Not showing lock screen since just decrypted"); // Without this, settings is not enabled until the lock screen first appears - setShowingLocked(false, mAodShowing); + setShowingLocked(false); hideLocked(); return; } @@ -1740,6 +1745,9 @@ public class KeyguardViewMediator extends SystemUI { private void updateActivityLockScreenState(boolean showing, boolean aodShowing) { mUiOffloadThread.submit(() -> { + if (DEBUG) { + Log.d(TAG, "updateActivityLockScreenState(" + showing + ", " + aodShowing + ")"); + } try { ActivityTaskManager.getService().setLockScreenShown(showing, aodShowing); } catch (RemoteException e) { @@ -1765,15 +1773,16 @@ public class KeyguardViewMediator extends SystemUI { if (DEBUG) Log.d(TAG, "handleShow"); } - setShowingLocked(true, mAodShowing); - mStatusBarKeyguardViewManager.show(options); mHiding = false; mWakeAndUnlocking = false; + setShowingLocked(true); + mStatusBarKeyguardViewManager.show(options); resetKeyguardDonePendingLocked(); mHideAnimationRun = false; adjustStatusBarLocked(); userActivity(); mUpdateMonitor.setKeyguardGoingAway(false /* away */); + mStatusBarWindowController.setKeyguardGoingAway(false /* goingAway */); mShowKeyguardWakeLock.release(); } mKeyguardDisplayManager.show(); @@ -1800,8 +1809,13 @@ public class KeyguardViewMediator extends SystemUI { if (mStatusBarKeyguardViewManager.isUnlockWithWallpaper()) { flags |= WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER; } + if (mStatusBarKeyguardViewManager.shouldSubtleWindowAnimationsForUnlock()) { + flags |= WindowManagerPolicyConstants + .KEYGUARD_GOING_AWAY_FLAG_SUBTLE_WINDOW_ANIMATIONS; + } mUpdateMonitor.setKeyguardGoingAway(true /* goingAway */); + mStatusBarWindowController.setKeyguardGoingAway(true /* goingAway */); // Don't actually hide the Keyguard at the moment, wait for window // manager until it tells us it's safe to do so with @@ -1871,7 +1885,7 @@ public class KeyguardViewMediator extends SystemUI { if (!mHiding) { // Tell ActivityManager that we canceled the keyguardExitAnimation. - setShowingLocked(mShowing, mAodShowing, true /* force */); + setShowingLocked(mShowing, true /* force */); return; } mHiding = false; @@ -1892,8 +1906,8 @@ public class KeyguardViewMediator extends SystemUI { playSounds(false); } + setShowingLocked(false); mWakeAndUnlocking = false; - setShowingLocked(false, mAodShowing); mDismissCallbackRegistry.notifyDismissSucceeded(); mStatusBarKeyguardViewManager.hide(startTime, fadeoutDuration); resetKeyguardDonePendingLocked(); @@ -1953,7 +1967,7 @@ public class KeyguardViewMediator extends SystemUI { Trace.beginSection("KeyguardViewMediator#handleVerifyUnlock"); synchronized (KeyguardViewMediator.this) { if (DEBUG) Log.d(TAG, "handleVerifyUnlock"); - setShowingLocked(true, mAodShowing); + setShowingLocked(true); mStatusBarKeyguardViewManager.dismissAndCollapse(); } Trace.endSection(); @@ -2056,9 +2070,11 @@ public class KeyguardViewMediator extends SystemUI { public StatusBarKeyguardViewManager registerStatusBar(StatusBar statusBar, ViewGroup container, NotificationPanelView panelView, - BiometricUnlockController biometricUnlockController, ViewGroup lockIconContainer) { + BiometricUnlockController biometricUnlockController, ViewGroup lockIconContainer, + View notificationContainer, KeyguardBypassController bypassController) { mStatusBarKeyguardViewManager.registerStatusBar(statusBar, container, panelView, - biometricUnlockController, mDismissCallbackRegistry, lockIconContainer); + biometricUnlockController, mDismissCallbackRegistry, lockIconContainer, + notificationContainer, bypassController); return mStatusBarKeyguardViewManager; } @@ -2098,6 +2114,8 @@ public class KeyguardViewMediator extends SystemUI { pw.print(" mDeviceInteractive: "); pw.println(mDeviceInteractive); pw.print(" mGoingToSleep: "); pw.println(mGoingToSleep); pw.print(" mHiding: "); pw.println(mHiding); + pw.print(" mDozing: "); pw.println(mDozing); + pw.print(" mAodShowing: "); pw.println(mAodShowing); pw.print(" mWaitingUntilKeyguardVisible: "); pw.println(mWaitingUntilKeyguardVisible); pw.print(" mKeyguardDonePending: "); pw.println(mKeyguardDonePending); pw.print(" mHideAnimationRun: "); pw.println(mHideAnimationRun); @@ -2108,10 +2126,14 @@ public class KeyguardViewMediator extends SystemUI { } /** - * @param aodShowing true when AOD - or ambient mode - is showing. + * @param dozing true when AOD - or ambient mode - is showing. */ - public void setAodShowing(boolean aodShowing) { - setShowingLocked(mShowing, aodShowing); + public void setDozing(boolean dozing) { + if (dozing == mDozing) { + return; + } + mDozing = dozing; + setShowingLocked(mShowing); } /** @@ -2132,19 +2154,18 @@ public class KeyguardViewMediator extends SystemUI { } } - private void setShowingLocked(boolean showing, boolean aodShowing) { - setShowingLocked(showing, aodShowing, false /* forceCallbacks */); + private void setShowingLocked(boolean showing) { + setShowingLocked(showing, false /* forceCallbacks */); } - private void setShowingLocked(boolean showing, boolean aodShowing, boolean forceCallbacks) { + private void setShowingLocked(boolean showing, boolean forceCallbacks) { + final boolean aodShowing = mDozing && !mWakeAndUnlocking; final boolean notifyDefaultDisplayCallbacks = showing != mShowing || aodShowing != mAodShowing || forceCallbacks; + mShowing = showing; + mAodShowing = aodShowing; if (notifyDefaultDisplayCallbacks) { - mShowing = showing; - mAodShowing = aodShowing; - if (notifyDefaultDisplayCallbacks) { - notifyDefaultDisplayCallbacks(showing); - } + notifyDefaultDisplayCallbacks(showing); updateActivityLockScreenState(showing, aodShowing); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java index ec2feba8291b..41f66f7e2021 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java @@ -73,6 +73,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha private int mNumQuickTiles; private float mLastPosition; private QSTileHost mHost; + private boolean mShowCollapsedOnKeyguard; public QSAnimator(QS qs, QuickQSPanel quickPanel, QSPanel panel) { mQs = qs; @@ -98,12 +99,32 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha public void setOnKeyguard(boolean onKeyguard) { mOnKeyguard = onKeyguard; - mQuickQsPanel.setVisibility(mOnKeyguard ? View.INVISIBLE : View.VISIBLE); + updateQQSVisibility(); if (mOnKeyguard) { clearAnimationState(); } } + + /** + * Sets whether or not the keyguard is currently being shown with a collapsed header. + */ + void setShowCollapsedOnKeyguard(boolean showCollapsedOnKeyguard) { + mShowCollapsedOnKeyguard = showCollapsedOnKeyguard; + updateQQSVisibility(); + setCurrentPosition(); + } + + + private void setCurrentPosition() { + setPosition(mLastPosition); + } + + private void updateQQSVisibility() { + mQuickQsPanel.setVisibility(mOnKeyguard + && !mShowCollapsedOnKeyguard ? View.INVISIBLE : View.VISIBLE); + } + public void setHost(QSTileHost qsh) { mHost = qsh; qsh.addCallback(this); @@ -322,7 +343,11 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha public void setPosition(float position) { if (mFirstPageAnimator == null) return; if (mOnKeyguard) { - return; + if (mShowCollapsedOnKeyguard) { + position = 0; + } else { + position = 1; + } } mLastPosition = position; if (mOnFirstPage && mAllowFancy) { @@ -356,7 +381,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha @Override public void onAnimationStarted() { - mQuickQsPanel.setVisibility(mOnKeyguard ? View.INVISIBLE : View.VISIBLE); + updateQQSVisibility(); if (mOnFirstPage) { final int N = mQuickQsViews.size(); for (int i = 0; i < N; i++) { @@ -410,7 +435,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha @Override public void run() { updateAnimators(); - setPosition(mLastPosition); + setCurrentPosition(); } }; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index 087a826844e2..0a3b43a78f13 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -40,8 +40,10 @@ import com.android.systemui.R; import com.android.systemui.R.id; import com.android.systemui.SysUiServiceProvider; import com.android.systemui.plugins.qs.QS; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.customize.QSCustomizer; import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer; import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler; @@ -50,16 +52,17 @@ import com.android.systemui.util.LifecycleFragment; import javax.inject.Inject; -public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Callbacks { +public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Callbacks, + StatusBarStateController.StateListener { private static final String TAG = "QS"; private static final boolean DEBUG = false; private static final String EXTRA_EXPANDED = "expanded"; private static final String EXTRA_LISTENING = "listening"; private final Rect mQsBounds = new Rect(); + private final StatusBarStateController mStatusBarStateController; private boolean mQsExpanded; private boolean mHeaderAnimating; - private boolean mKeyguardShowing; private boolean mStackScrollerOverscrolling; private long mDelay; @@ -80,17 +83,27 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca private final RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler; private final InjectionInflationController mInjectionInflater; private final QSTileHost mHost; + private boolean mShowCollapsedOnKeyguard; + private boolean mLastKeyguardAndExpanded; + /** + * The last received state from the controller. This should not be used directly to check if + * we're on keyguard but use {@link #isKeyguardShowing()} instead since that is more accurate + * during state transitions which often call into us. + */ + private int mState; @Inject public QSFragment(RemoteInputQuickSettingsDisabler remoteInputQsDisabler, InjectionInflationController injectionInflater, Context context, - QSTileHost qsTileHost) { + QSTileHost qsTileHost, + StatusBarStateController statusBarStateController) { mRemoteInputQuickSettingsDisabler = remoteInputQsDisabler; mInjectionInflater = injectionInflater; SysUiServiceProvider.getComponent(context, CommandQueue.class) .observe(getLifecycle(), this); mHost = qsTileHost; + mStatusBarStateController = statusBarStateController; } @Override @@ -126,11 +139,14 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca } } setHost(mHost); + mStatusBarStateController.addCallback(this); + onStateChanged(mStatusBarStateController.getState()); } @Override public void onDestroy() { super.onDestroy(); + mStatusBarStateController.removeCallback(this); if (mListening) { setListening(false); } @@ -235,20 +251,43 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca || mHeaderAnimating; mQSPanel.setExpanded(mQsExpanded); mQSDetail.setExpanded(mQsExpanded); - mHeader.setVisibility((mQsExpanded || !mKeyguardShowing || mHeaderAnimating) + boolean keyguardShowing = isKeyguardShowing(); + mHeader.setVisibility((mQsExpanded || !keyguardShowing || mHeaderAnimating + || mShowCollapsedOnKeyguard) ? View.VISIBLE : View.INVISIBLE); - mHeader.setExpanded((mKeyguardShowing && !mHeaderAnimating) + mHeader.setExpanded((keyguardShowing && !mHeaderAnimating && !mShowCollapsedOnKeyguard) || (mQsExpanded && !mStackScrollerOverscrolling)); mFooter.setVisibility( - !mQsDisabled && (mQsExpanded || !mKeyguardShowing || mHeaderAnimating) + !mQsDisabled && (mQsExpanded || !keyguardShowing || mHeaderAnimating + || mShowCollapsedOnKeyguard) ? View.VISIBLE : View.INVISIBLE); - mFooter.setExpanded((mKeyguardShowing && !mHeaderAnimating) + mFooter.setExpanded((keyguardShowing && !mHeaderAnimating && !mShowCollapsedOnKeyguard) || (mQsExpanded && !mStackScrollerOverscrolling)); mQSPanel.setVisibility(!mQsDisabled && expandVisually ? View.VISIBLE : View.INVISIBLE); } + private boolean isKeyguardShowing() { + // We want the freshest state here since otherwise we'll have some weirdness if earlier + // listeners trigger updates + return mStatusBarStateController.getState() == StatusBarState.KEYGUARD; + } + + @Override + public void setShowCollapsedOnKeyguard(boolean showCollapsedOnKeyguard) { + if (showCollapsedOnKeyguard != mShowCollapsedOnKeyguard) { + mShowCollapsedOnKeyguard = showCollapsedOnKeyguard; + updateQsState(); + if (mQSAnimator != null) { + mQSAnimator.setShowCollapsedOnKeyguard(showCollapsedOnKeyguard); + } + if (!showCollapsedOnKeyguard && isKeyguardShowing()) { + setQsExpansion(mLastQSExpansion, 0); + } + } + } + public QSPanel getQsPanel() { return mQSPanel; } @@ -280,10 +319,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca updateQsState(); } - @Override - public void setKeyguardShowing(boolean keyguardShowing) { + private void setKeyguardShowing(boolean keyguardShowing) { if (DEBUG) Log.d(TAG, "setKeyguardShowing " + keyguardShowing); - mKeyguardShowing = keyguardShowing; mLastQSExpansion = -1; if (mQSAnimator != null) { @@ -321,16 +358,18 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca if (DEBUG) Log.d(TAG, "setQSExpansion " + expansion + " " + headerTranslation); mContainer.setExpansion(expansion); final float translationScaleY = expansion - 1; - if (!mHeaderAnimating) { + boolean onKeyguardAndExpanded = isKeyguardShowing() && !mShowCollapsedOnKeyguard; + if (!mHeaderAnimating && !headerWillBeAnimating()) { getView().setTranslationY( - mKeyguardShowing + onKeyguardAndExpanded ? translationScaleY * mHeader.getHeight() : headerTranslation); } - if (expansion == mLastQSExpansion) { + if (expansion == mLastQSExpansion && mLastKeyguardAndExpanded == onKeyguardAndExpanded) { return; } mLastQSExpansion = expansion; + mLastKeyguardAndExpanded = onKeyguardAndExpanded; boolean fullyExpanded = expansion == 1; int heightDiff = mQSPanel.getBottom() - mHeader.getBottom() + mHeader.getPaddingBottom() @@ -338,8 +377,9 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca float panelTranslationY = translationScaleY * heightDiff; // Let the views animate their contents correctly by giving them the necessary context. - mHeader.setExpansion(mKeyguardShowing, expansion, panelTranslationY); - mFooter.setExpansion(mKeyguardShowing ? 1 : expansion); + mHeader.setExpansion(onKeyguardAndExpanded, expansion, + panelTranslationY); + mFooter.setExpansion(onKeyguardAndExpanded ? 1 : expansion); mQSPanel.getQsTileRevealController().setExpansion(expansion); mQSPanel.getTileLayout().setExpansion(expansion); mQSPanel.setTranslationY(translationScaleY * heightDiff); @@ -361,12 +401,17 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca } } + private boolean headerWillBeAnimating() { + return mState == StatusBarState.KEYGUARD && mShowCollapsedOnKeyguard + && !isKeyguardShowing(); + } + @Override public void animateHeaderSlidingIn(long delay) { if (DEBUG) Log.d(TAG, "animateHeaderSlidingIn"); // If the QS is already expanded we don't need to slide in the header as it's already // visible. - if (!mQsExpanded) { + if (!mQsExpanded && getView().getTranslationY() != 0) { mHeaderAnimating = true; mDelay = delay; getView().getViewTreeObserver().addOnPreDrawListener(mStartHeaderSlidingIn); @@ -376,6 +421,9 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca @Override public void animateHeaderSlidingOut() { if (DEBUG) Log.d(TAG, "animateHeaderSlidingOut"); + if (getView().getY() == -mHeader.getHeight()) { + return; + } mHeaderAnimating = true; getView().animate().y(-mHeader.getHeight()) .setStartDelay(0) @@ -463,7 +511,6 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) .setListener(mAnimateHeaderSlidingInListener) .start(); - getView().setY(-mHeader.getHeight()); return true; } }; @@ -476,4 +523,10 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca updateQsState(); } }; + + @Override + public void onStateChanged(int newState) { + mState = newState; + setKeyguardShowing(newState == StatusBarState.KEYGUARD); + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index d59e251563c7..a28b60dbe13c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -348,19 +348,19 @@ public class QuickStatusBarHeader extends RelativeLayout implements /** * Animates the inner contents based on the given expansion details. * - * @param isKeyguardShowing whether or not we're showing the keyguard (a.k.a. lockscreen) + * @param forceExpanded whether we should show the state expanded forcibly * @param expansionFraction how much the QS panel is expanded/pulled out (up to 1f) * @param panelTranslationY how much the panel has physically moved down vertically (required * for keyguard animations only) */ - public void setExpansion(boolean isKeyguardShowing, float expansionFraction, + public void setExpansion(boolean forceExpanded, float expansionFraction, float panelTranslationY) { - final float keyguardExpansionFraction = isKeyguardShowing ? 1f : expansionFraction; + final float keyguardExpansionFraction = forceExpanded ? 1f : expansionFraction; if (mStatusIconsAlphaAnimator != null) { mStatusIconsAlphaAnimator.setPosition(keyguardExpansionFraction); } - if (isKeyguardShowing) { + if (forceExpanded) { // If the keyguard is showing, we want to offset the text so that it comes in at the // same time as the panel as it slides down. mHeaderTextContainerView.setTranslationY(panelTranslationY); diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index e5caf68c416e..16f0b15be24c 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -119,7 +119,9 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis private boolean mIsEnabled; private int mCurrentBoundedUserId = -1; private float mNavBarButtonAlpha; - private MotionEvent mStatusBarGestureDownEvent; + private boolean mInputFocusTransferStarted; + private float mInputFocusTransferStartY; + private long mInputFocusTransferStartMillis; private float mWindowCornerRadius; private boolean mSupportsRoundedCornersOnWindows; private int mNavBarMode = NAV_BAR_MODE_3BUTTON; @@ -164,6 +166,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis } } + // TODO: change the method signature to use (boolean inputFocusTransferStarted) @Override public void onStatusBarMotionEvent(MotionEvent event) { if (!verifyCaller("onStatusBarMotionEvent")) { @@ -175,15 +178,19 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis mHandler.post(()->{ StatusBar bar = SysUiServiceProvider.getComponent(mContext, StatusBar.class); if (bar != null) { - bar.dispatchNotificationsPanelTouchEvent(event); int action = event.getActionMasked(); if (action == ACTION_DOWN) { - mStatusBarGestureDownEvent = MotionEvent.obtain(event); + mInputFocusTransferStarted = true; + mInputFocusTransferStartY = event.getY(); + mInputFocusTransferStartMillis = event.getEventTime(); + bar.onInputFocusTransfer(mInputFocusTransferStarted, 0 /* velocity */); } if (action == ACTION_UP || action == ACTION_CANCEL) { - mStatusBarGestureDownEvent.recycle(); - mStatusBarGestureDownEvent = null; + mInputFocusTransferStarted = false; + bar.onInputFocusTransfer(mInputFocusTransferStarted, + (event.getY() - mInputFocusTransferStartY) + / (event.getEventTime() - mInputFocusTransferStartMillis)); } event.recycle(); } @@ -539,7 +546,8 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis navBarFragment.updateSystemUiStateFlags(-1); } if (navBarView != null) { - navBarView.updateSystemUiStateFlags(); + navBarView.updatePanelSystemUiStateFlags(); + navBarView.updateDisabledSystemUiStateFlags(); } if (mStatusBarWinController != null) { mStatusBarWinController.notifyStateChangedCallbacks(); @@ -590,14 +598,12 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis } public void cleanupAfterDeath() { - if (mStatusBarGestureDownEvent != null) { + if (mInputFocusTransferStarted) { mHandler.post(()-> { StatusBar bar = SysUiServiceProvider.getComponent(mContext, StatusBar.class); if (bar != null) { - mStatusBarGestureDownEvent.setAction(MotionEvent.ACTION_CANCEL); - bar.dispatchNotificationsPanelTouchEvent(mStatusBarGestureDownEvent); - mStatusBarGestureDownEvent.recycle(); - mStatusBarGestureDownEvent = null; + mInputFocusTransferStarted = false; + bar.onInputFocusTransfer(false, 0 /* velocity */); } }); } @@ -746,6 +752,8 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis try { if (mOverviewProxy != null) { mOverviewProxy.onAssistantVisibilityChanged(visibility); + } else { + Log.e(TAG_OPS, "Failed to get overview proxy for assistant visibility."); } } catch (RemoteException e) { Log.e(TAG_OPS, "Failed to call onAssistantVisibilityChanged()", e); @@ -780,6 +788,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis pw.println(QuickStepContract.isBackGestureDisabled(mSysUiStateFlags)); pw.print(" assistantGestureDisabled="); pw.println(QuickStepContract.isAssistantGestureDisabled(mSysUiStateFlags)); + pw.print(" mInputFocusTransferStarted="); pw.println(mInputFocusTransferStarted); } public interface OverviewProxyListener { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java deleted file mode 100644 index 5f878cee12d6..000000000000 --- a/packages/SystemUI/src/com/android/systemui/statusbar/AmbientPulseManager.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.statusbar; - -import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_AMBIENT; - -import android.annotation.NonNull; -import android.content.Context; -import android.content.res.Resources; -import android.util.ArraySet; - -import com.android.internal.annotations.VisibleForTesting; -import com.android.systemui.R; -import com.android.systemui.statusbar.notification.collection.NotificationEntry; -import com.android.systemui.statusbar.notification.row.NotificationContentInflater.InflationFlag; - -import javax.inject.Inject; -import javax.inject.Singleton; - -/** - * Manager which handles high priority notifications that should "pulse" in when the device is - * dozing and/or in AOD. The pulse uses the notification's ambient view and pops in briefly - * before automatically dismissing the alert. - */ -@Singleton -public class AmbientPulseManager extends AlertingNotificationManager { - - protected final ArraySet<OnAmbientChangedListener> mListeners = new ArraySet<>(); - @VisibleForTesting - protected long mExtensionTime; - - @Inject - public AmbientPulseManager(@NonNull final Context context) { - Resources resources = context.getResources(); - mAutoDismissNotificationDecay = resources.getInteger(R.integer.ambient_notification_decay); - mMinimumDisplayTime = resources.getInteger(R.integer.ambient_notification_minimum_time); - mExtensionTime = resources.getInteger(R.integer.ambient_notification_extension_time); - } - - /** - * Adds an OnAmbientChangedListener to observe events. - */ - public void addListener(@NonNull OnAmbientChangedListener listener) { - mListeners.add(listener); - } - - /** - * Removes the OnAmbientChangedListener from the observer list. - */ - public void removeListener(@NonNull OnAmbientChangedListener listener) { - mListeners.remove(listener); - } - - /** - * Extends the lifetime of the currently showing pulsing notification so that the pulse lasts - * longer. - */ - public void extendPulse() { - AmbientEntry topEntry = getTopEntry(); - if (topEntry == null) { - return; - } - topEntry.extendPulse(); - } - - public @InflationFlag int getContentFlag() { - return FLAG_CONTENT_VIEW_AMBIENT; - } - - @Override - protected void onAlertEntryAdded(AlertEntry alertEntry) { - NotificationEntry entry = alertEntry.mEntry; - entry.setAmbientPulsing(true); - for (OnAmbientChangedListener listener : mListeners) { - listener.onAmbientStateChanged(entry, true); - } - } - - @Override - protected void onAlertEntryRemoved(AlertEntry alertEntry) { - NotificationEntry entry = alertEntry.mEntry; - entry.setAmbientPulsing(false); - for (OnAmbientChangedListener listener : mListeners) { - listener.onAmbientStateChanged(entry, false); - } - entry.freeContentViewWhenSafe(FLAG_CONTENT_VIEW_AMBIENT); - } - - @Override - protected AlertEntry createAlertEntry() { - return new AmbientEntry(); - } - - /** - * Get the top pulsing entry. This should be the currently showing one if there are multiple. - * @return the currently showing entry - */ - private AmbientEntry getTopEntry() { - if (mAlertEntries.isEmpty()) { - return null; - } - AlertEntry topEntry = null; - for (AlertEntry entry : mAlertEntries.values()) { - if (topEntry == null || entry.compareTo(topEntry) < 0) { - topEntry = entry; - } - } - return (AmbientEntry) topEntry; - } - - /** - * Observer interface for any changes in the ambient entries. - */ - public interface OnAmbientChangedListener { - /** - * Called when an entry starts or stops pulsing. - * @param entry the entry that changed - * @param isPulsing true if the entry is now pulsing, false otherwise - */ - void onAmbientStateChanged(@NonNull NotificationEntry entry, boolean isPulsing); - } - - private final class AmbientEntry extends AlertEntry { - private boolean extended; - - /** - * Extend the lifetime of the alertEntry so that it auto-removes later. Can only be - * extended once. - */ - private void extendPulse() { - if (!extended) { - extended = true; - updateEntry(false); - } - } - - @Override - public void reset() { - super.reset(); - extended = false; - } - - @Override - protected long calculateFinishTime() { - return super.calculateFinishTime() + (extended ? mExtensionTime : 0); - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java index 04534ba06d7e..164215befe79 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java @@ -28,6 +28,10 @@ import com.android.systemui.statusbar.notification.stack.StackStateAnimator; public class CrossFadeHelper { public static final long ANIMATION_DURATION_LENGTH = 210; + public static void fadeOut(final View view) { + fadeOut(view, null); + } + public static void fadeOut(final View view, final Runnable endRunnable) { fadeOut(view, ANIMATION_DURATION_LENGTH, 0, endRunnable); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java index 514a2ae7a74e..8385c8e00392 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java @@ -92,7 +92,7 @@ public class DragDownHelper implements Gefingerpoken { mInitialTouchY = y; mInitialTouchX = x; mDragDownCallback.onTouchSlopExceeded(); - return true; + return mStartingChild != null || mDragDownCallback.isDragDownAnywhereEnabled(); } break; } @@ -162,7 +162,11 @@ public class DragDownHelper implements Gefingerpoken { if (mStartingChild == null) { mStartingChild = findView(x, y); if (mStartingChild != null) { - mCallback.setUserLockedChild(mStartingChild, true); + if (mDragDownCallback.isDragDownEnabledForView(mStartingChild)) { + mCallback.setUserLockedChild(mStartingChild, true); + } else { + mStartingChild = null; + } } } } @@ -237,6 +241,10 @@ public class DragDownHelper implements Gefingerpoken { return mDraggingDown; } + public boolean isDragDownEnabled() { + return mDragDownCallback.isDragDownEnabledForView(null); + } + public interface DragDownCallback { /** @@ -253,5 +261,16 @@ public class DragDownHelper implements Gefingerpoken { void onTouchSlopExceeded(); void setEmptyDragAmount(float amount); boolean isFalsingCheckNeeded(); + + /** + * Is dragging down enabled on a given view + * @param view The view to check or {@code null} to check if it's enabled at all + */ + boolean isDragDownEnabledForView(ExpandableView view); + + /** + * @return if drag down is enabled anywhere, not just on selected views. + */ + boolean isDragDownAnywhereEnabled(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java index 3f1ff33437b9..4597b1656884 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java @@ -43,7 +43,6 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { private static final String HEADS_UP_STATUS_BAR_VIEW_SUPER_PARCELABLE = "heads_up_status_bar_view_super_parcelable"; private static final String FIRST_LAYOUT = "first_layout"; - private static final String PUBLIC_MODE = "public_mode"; private static final String VISIBILITY = "visibility"; private static final String ALPHA = "alpha"; private int mAbsoluteStartPadding; @@ -54,7 +53,6 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { private Rect mLayoutedIconRect = new Rect(); private int[] mTmpPosition = new int[2]; private boolean mFirstLayout = true; - private boolean mPublicMode; private int mMaxWidth; private View mRootView; private int mSysWinInset; @@ -121,7 +119,6 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { bundle.putParcelable(HEADS_UP_STATUS_BAR_VIEW_SUPER_PARCELABLE, super.onSaveInstanceState()); bundle.putBoolean(FIRST_LAYOUT, mFirstLayout); - bundle.putBoolean(PUBLIC_MODE, mPublicMode); bundle.putInt(VISIBILITY, getVisibility()); bundle.putFloat(ALPHA, getAlpha()); @@ -139,7 +136,6 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { Parcelable superState = bundle.getParcelable(HEADS_UP_STATUS_BAR_VIEW_SUPER_PARCELABLE); super.onRestoreInstanceState(superState); mFirstLayout = bundle.getBoolean(FIRST_LAYOUT, true); - mPublicMode = bundle.getBoolean(PUBLIC_MODE, false); if (bundle.containsKey(VISIBILITY)) { setVisibility(bundle.getInt(VISIBILITY)); } @@ -166,11 +162,13 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { if (entry != null) { mShowingEntry = entry; CharSequence text = entry.headsUpStatusBarText; - if (mPublicMode) { + if (entry.isSensitive()) { text = entry.headsUpStatusBarTextPublic; } mTextView.setText(text); - } else { + mShowingEntry.setOnSensitiveChangedListener(() -> setEntry(entry)); + } else if (mShowingEntry != null){ + mShowingEntry.setOnSensitiveChangedListener(null); mShowingEntry = null; } } @@ -273,10 +271,6 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { mTextView.setTextColor(DarkIconDispatcher.getTint(area, this, tint)); } - public void setPublicMode(boolean publicMode) { - mPublicMode = publicMode; - } - public void setOnDrawingRectChangedListener(Runnable onDrawingRectChangedListener) { mOnDrawingRectChangedListener = onDrawingRectChangedListener; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index ca12deb3904e..4be93df0e81a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -79,7 +79,9 @@ public class KeyguardIndicationController implements StateListener, private static final int MSG_HIDE_TRANSIENT = 1; private static final int MSG_CLEAR_BIOMETRIC_MSG = 2; + private static final int MSG_SWIPE_UP_TO_UNLOCK = 3; private static final long TRANSIENT_BIOMETRIC_ERROR_TIMEOUT = 1300; + private static final float BOUNCE_ANIMATION_FINAL_Y = 0f; private final Context mContext; private final ShadeController mShadeController; @@ -326,6 +328,7 @@ public class KeyguardIndicationController implements StateListener, mTransientIndication = transientIndication; mTransientTextColorState = textColorState; mHandler.removeMessages(MSG_HIDE_TRANSIENT); + mHandler.removeMessages(MSG_SWIPE_UP_TO_UNLOCK); if (mDozing && !TextUtils.isEmpty(mTransientIndication)) { // Make sure this doesn't get stuck and burns in. Acquire wakelock until its cleared. mWakeLock.setAcquired(true); @@ -420,7 +423,6 @@ public class KeyguardIndicationController implements StateListener, int animateDownDuration = mContext.getResources().getInteger( R.integer.wired_charging_keyguard_text_animation_duration_down); textView.animate().cancel(); - float translation = textView.getTranslationY(); ViewClippingUtil.setClippingDeactivated(textView, true, mClippingParams); textView.animate() .translationYBy(yTranslation) @@ -436,7 +438,7 @@ public class KeyguardIndicationController implements StateListener, @Override public void onAnimationCancel(Animator animation) { - textView.setTranslationY(translation); + textView.setTranslationY(BOUNCE_ANIMATION_FINAL_Y); mCancelled = true; } @@ -450,15 +452,11 @@ public class KeyguardIndicationController implements StateListener, textView.animate() .setDuration(animateDownDuration) .setInterpolator(Interpolators.BOUNCE) - .translationY(translation) + .translationY(BOUNCE_ANIMATION_FINAL_Y) .setListener(new AnimatorListenerAdapter() { @Override - public void onAnimationCancel(Animator animation) { - textView.setTranslationY(translation); - } - - @Override public void onAnimationEnd(Animator animation) { + textView.setTranslationY(BOUNCE_ANIMATION_FINAL_Y); ViewClippingUtil.setClippingDeactivated(textView, false, mClippingParams); } @@ -553,10 +551,26 @@ public class KeyguardIndicationController implements StateListener, hideTransientIndication(); } else if (msg.what == MSG_CLEAR_BIOMETRIC_MSG) { mLockIcon.setTransientBiometricsError(false); + } else if (msg.what == MSG_SWIPE_UP_TO_UNLOCK) { + showSwipeUpToUnlock(); } } }; + private void showSwipeUpToUnlock() { + if (mDozing) { + return; + } + + String message = mContext.getString(R.string.keyguard_unlock); + if (mStatusBarKeyguardViewManager.isBouncerShowing()) { + mStatusBarKeyguardViewManager.showBouncerMessage(message, mInitialTextColorState); + } else if (mKeyguardUpdateMonitor.isScreenOn()) { + showTransientIndication(message); + hideTransientIndicationDelayed(BaseKeyguardCallback.HIDE_DELAY_MS); + } + } + public void setDozing(boolean dozing) { if (mDozing == dozing) { return; @@ -637,12 +651,20 @@ public class KeyguardIndicationController implements StateListener, return; } animatePadlockError(); + boolean showSwipeToUnlock = + msgId == KeyguardUpdateMonitor.BIOMETRIC_HELP_FACE_NOT_RECOGNIZED; if (mStatusBarKeyguardViewManager.isBouncerShowing()) { mStatusBarKeyguardViewManager.showBouncerMessage(helpString, mInitialTextColorState); } else if (updateMonitor.isScreenOn()) { showTransientIndication(helpString); - hideTransientIndicationDelayed(TRANSIENT_BIOMETRIC_ERROR_TIMEOUT); + if (!showSwipeToUnlock) { + hideTransientIndicationDelayed(TRANSIENT_BIOMETRIC_ERROR_TIMEOUT); + } + } + if (showSwipeToUnlock) { + mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SWIPE_UP_TO_UNLOCK), + TRANSIENT_BIOMETRIC_ERROR_TIMEOUT); } } @@ -732,13 +754,5 @@ public class KeyguardIndicationController implements StateListener, updateIndication(false); } } - - @Override - public void onKeyguardBouncerChanged(boolean bouncer) { - if (mLockIcon == null) { - return; - } - mLockIcon.setBouncerVisible(bouncer); - } - }; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/MediaArtworkProcessor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/MediaArtworkProcessor.kt index 4b2d13121f6b..aaf48490d7b0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/MediaArtworkProcessor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/MediaArtworkProcessor.kt @@ -25,6 +25,7 @@ import android.renderscript.Allocation import android.renderscript.Element import android.renderscript.RenderScript import android.renderscript.ScriptIntrinsicBlur +import android.util.Log import android.util.MathUtils import com.android.internal.graphics.ColorUtils import com.android.systemui.statusbar.notification.MediaNotificationProcessor @@ -32,6 +33,7 @@ import com.android.systemui.statusbar.notification.MediaNotificationProcessor import javax.inject.Inject import javax.inject.Singleton +private const val TAG = "MediaArtworkProcessor" private const val COLOR_ALPHA = (255 * 0.7f).toInt() private const val BLUR_RADIUS = 25f private const val DOWNSAMPLE = 6 @@ -42,45 +44,54 @@ class MediaArtworkProcessor @Inject constructor() { private val mTmpSize = Point() private var mArtworkCache: Bitmap? = null - fun processArtwork(context: Context, artwork: Bitmap): Bitmap { + fun processArtwork(context: Context, artwork: Bitmap): Bitmap? { if (mArtworkCache != null) { - return mArtworkCache!! + return mArtworkCache } - - context.display.getSize(mTmpSize) val renderScript = RenderScript.create(context) - val rect = Rect(0, 0, artwork.width, artwork.height) - MathUtils.fitRect(rect, Math.max(mTmpSize.x / DOWNSAMPLE, mTmpSize.y / DOWNSAMPLE)) - var inBitmap = Bitmap.createScaledBitmap(artwork, rect.width(), rect.height(), - true /* filter */) - // Render script blurs only support ARGB_8888, we need a conversion if we got a - // different bitmap config. - if (inBitmap.config != Bitmap.Config.ARGB_8888) { - val oldIn = inBitmap - inBitmap = oldIn.copy(Bitmap.Config.ARGB_8888, false /* isMutable */) - oldIn.recycle() - } - val input = Allocation.createFromBitmap(renderScript, inBitmap, - Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_GRAPHICS_TEXTURE) - val outBitmap = Bitmap.createBitmap(inBitmap.width, inBitmap.height, - Bitmap.Config.ARGB_8888) - val output = Allocation.createFromBitmap(renderScript, outBitmap) val blur = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript)) - blur.setRadius(BLUR_RADIUS) - blur.setInput(input) - blur.forEach(output) - output.copyTo(outBitmap) + var input: Allocation? = null + var output: Allocation? = null + var inBitmap: Bitmap? = null + try { + context.display.getSize(mTmpSize) + val rect = Rect(0, 0, artwork.width, artwork.height) + MathUtils.fitRect(rect, Math.max(mTmpSize.x / DOWNSAMPLE, mTmpSize.y / DOWNSAMPLE)) + inBitmap = Bitmap.createScaledBitmap(artwork, rect.width(), rect.height(), + true /* filter */) + // Render script blurs only support ARGB_8888, we need a conversion if we got a + // different bitmap config. + if (inBitmap.config != Bitmap.Config.ARGB_8888) { + val oldIn = inBitmap + inBitmap = oldIn.copy(Bitmap.Config.ARGB_8888, false /* isMutable */) + oldIn.recycle() + } + val outBitmap = Bitmap.createBitmap(inBitmap.width, inBitmap.height, + Bitmap.Config.ARGB_8888) - val swatch = MediaNotificationProcessor.findBackgroundSwatch(artwork) + input = Allocation.createFromBitmap(renderScript, inBitmap, + Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_GRAPHICS_TEXTURE) + output = Allocation.createFromBitmap(renderScript, outBitmap) - input.destroy() - output.destroy() - inBitmap.recycle() - blur.destroy() + blur.setRadius(BLUR_RADIUS) + blur.setInput(input) + blur.forEach(output) + output.copyTo(outBitmap) - val canvas = Canvas(outBitmap) - canvas.drawColor(ColorUtils.setAlphaComponent(swatch.rgb, COLOR_ALPHA)) - return outBitmap + val swatch = MediaNotificationProcessor.findBackgroundSwatch(artwork) + + val canvas = Canvas(outBitmap) + canvas.drawColor(ColorUtils.setAlphaComponent(swatch.rgb, COLOR_ALPHA)) + return outBitmap + } catch (ex: IllegalArgumentException) { + Log.e(TAG, "error while processing artwork", ex) + return null + } finally { + input?.destroy() + output?.destroy() + blur.destroy() + inBitmap?.recycle() + } } fun clearCache() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java index 6c36ab95f923..00a12a9e4409 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java @@ -17,6 +17,10 @@ package com.android.systemui.statusbar; import static com.android.systemui.Dependency.MAIN_HANDLER; import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; +import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_UNLOCK_FADING; +import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK; +import static com.android.systemui.statusbar.phone.BiometricUnlockController + .MODE_WAKE_AND_UNLOCK_PULSING; import static com.android.systemui.statusbar.phone.StatusBar.DEBUG_MEDIA_FAKE_ARTWORK; import static com.android.systemui.statusbar.phone.StatusBar.ENABLE_LOCKSCREEN_WALLPAPER; import static com.android.systemui.statusbar.phone.StatusBar.SHOW_LOCKSCREEN_MEDIA_ARTWORK; @@ -57,6 +61,7 @@ import com.android.systemui.statusbar.notification.NotificationEntryListener; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.phone.BiometricUnlockController; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.LockscreenWallpaper; import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.ScrimState; @@ -68,6 +73,7 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -89,6 +95,15 @@ public class NotificationMediaManager implements Dumpable { = Dependency.get(StatusBarStateController.class); private final SysuiColorExtractor mColorExtractor = Dependency.get(SysuiColorExtractor.class); private final KeyguardMonitor mKeyguardMonitor = Dependency.get(KeyguardMonitor.class); + private final KeyguardBypassController mKeyguardBypassController; + private static final HashSet<Integer> PAUSED_MEDIA_STATES = new HashSet<>(); + static { + PAUSED_MEDIA_STATES.add(PlaybackState.STATE_NONE); + PAUSED_MEDIA_STATES.add(PlaybackState.STATE_STOPPED); + PAUSED_MEDIA_STATES.add(PlaybackState.STATE_PAUSED); + PAUSED_MEDIA_STATES.add(PlaybackState.STATE_ERROR); + } + // Late binding private NotificationEntryManager mEntryManager; @@ -173,9 +188,11 @@ public class NotificationMediaManager implements Dumpable { Lazy<ShadeController> shadeController, Lazy<StatusBarWindowController> statusBarWindowController, NotificationEntryManager notificationEntryManager, - MediaArtworkProcessor mediaArtworkProcessor) { + MediaArtworkProcessor mediaArtworkProcessor, + KeyguardBypassController keyguardBypassController) { mContext = context; mMediaArtworkProcessor = mediaArtworkProcessor; + mKeyguardBypassController = keyguardBypassController; mMediaListeners = new ArrayList<>(); mMediaSessionManager = (MediaSessionManager) mContext.getSystemService(Context.MEDIA_SESSION_SERVICE); @@ -203,6 +220,10 @@ public class NotificationMediaManager implements Dumpable { mPropertiesChangedListener); } + public static boolean isPlayingState(int state) { + return !PAUSED_MEDIA_STATES.contains(state); + } + public void setUpWithPresenter(NotificationPresenter presenter) { mPresenter = presenter; } @@ -457,7 +478,7 @@ public class NotificationMediaManager implements Dumpable { } Bitmap artworkBitmap = null; - if (mediaMetadata != null) { + if (mediaMetadata != null && !mKeyguardBypassController.getBypassEnabled()) { artworkBitmap = mediaMetadata.getBitmap(MediaMetadata.METADATA_KEY_ART); if (artworkBitmap == null) { artworkBitmap = mediaMetadata.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART); @@ -578,9 +599,11 @@ public class NotificationMediaManager implements Dumpable { boolean cannotAnimateDoze = shadeController != null && shadeController.isDozing() && !ScrimState.AOD.getAnimateChange(); - if (mBiometricUnlockController != null && mBiometricUnlockController.getMode() + boolean needsBypassFading = mKeyguardMonitor.isBypassFadingAnimation(); + if (((mBiometricUnlockController != null && mBiometricUnlockController.getMode() == BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING - || hideBecauseOccluded || cannotAnimateDoze) { + || cannotAnimateDoze) && !needsBypassFading) + || hideBecauseOccluded) { // We are unlocking directly - no animation! mBackdrop.setVisibility(View.GONE); @@ -605,9 +628,7 @@ public class NotificationMediaManager implements Dumpable { }); if (mKeyguardMonitor.isKeyguardFadingAway()) { mBackdrop.animate() - // Make it disappear faster, as the focus should be on the activity - // behind. - .setDuration(mKeyguardMonitor.getKeyguardFadingAwayDuration() / 2) + .setDuration(mKeyguardMonitor.getShortenedFadingAwayDuration()) .setStartDelay(mKeyguardMonitor.getKeyguardFadingAwayDelay()) .setInterpolator(Interpolators.LINEAR) .start(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationPresenter.java index f34b912a255c..3cb2a2aaeec7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationPresenter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationPresenter.java @@ -63,11 +63,6 @@ public interface NotificationPresenter extends ExpandableNotificationRow.OnExpan int getMaxNotificationsWhileLocked(boolean recompute); /** - * True if the presenter is currently locked. - */ - boolean isPresenterLocked(); - - /** * Called when the row states are updated by {@link NotificationViewHierarchyManager}. */ void onUpdateRowStates(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java index 1440803f1524..c9050d492191 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationRemoteInputManager.java @@ -52,6 +52,7 @@ import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.NotificationVisibility; import com.android.systemui.Dumpable; import com.android.systemui.R; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.notification.NotificationEntryListener; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -121,6 +122,7 @@ public class NotificationRemoteInputManager implements Dumpable { protected final Context mContext; private final UserManager mUserManager; private final KeyguardManager mKeyguardManager; + private final StatusBarStateController mStatusBarStateController; protected RemoteInputController mRemoteInputController; protected NotificationLifetimeExtender.NotificationSafeToRemoveCallback @@ -259,6 +261,7 @@ public class NotificationRemoteInputManager implements Dumpable { SmartReplyController smartReplyController, NotificationEntryManager notificationEntryManager, Lazy<ShadeController> shadeController, + StatusBarStateController statusBarStateController, @Named(MAIN_HANDLER_NAME) Handler mainHandler) { mContext = context; mLockscreenUserManager = lockscreenUserManager; @@ -271,6 +274,7 @@ public class NotificationRemoteInputManager implements Dumpable { mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); addLifetimeExtenders(); mKeyguardManager = context.getSystemService(KeyguardManager.class); + mStatusBarStateController = statusBarStateController; notificationEntryManager.addNotificationEntryListener(new NotificationEntryListener() { @Override @@ -380,7 +384,10 @@ public class NotificationRemoteInputManager implements Dumpable { if (!mLockscreenUserManager.shouldAllowLockscreenRemoteInput()) { final int userId = pendingIntent.getCreatorUserHandle().getIdentifier(); - if (mLockscreenUserManager.isLockscreenPublicMode(userId)) { + if (mLockscreenUserManager.isLockscreenPublicMode(userId) + || mStatusBarStateController.getState() == StatusBarState.KEYGUARD) { + // Even if we don't have security we should go through this flow, otherwise we won't + // go to the shade mCallback.onLockedRemoteInput(row, view); return true; } @@ -391,6 +398,11 @@ public class NotificationRemoteInputManager implements Dumpable { } } + if (riv != null && !riv.isAttachedToWindow()) { + // the remoteInput isn't attached to the window anymore :/ Let's focus on the expanded + // one instead if it's available + riv = null; + } if (riv == null) { riv = findRemoteInputView(row.getPrivateLayout().getExpandedChild()); if (riv == null) { @@ -405,6 +417,10 @@ public class NotificationRemoteInputManager implements Dumpable { return true; } + if (!riv.isAttachedToWindow()) { + // if we still didn't find a view that is attached, let's abort. + return false; + } int width = view.getWidth(); if (view instanceof TextView) { // Center the reveal on the text which might be off-center from the TextView diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 165c64e7a6a4..99682fcfccbf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar; import static com.android.systemui.Interpolators.FAST_OUT_SLOW_IN_REVERSE; import static com.android.systemui.statusbar.phone.NotificationIconContainer.IconState.NO_VALUE; +import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT; import android.content.Context; import android.content.res.Configuration; @@ -48,8 +49,12 @@ import com.android.systemui.statusbar.notification.stack.AnimationProperties; import com.android.systemui.statusbar.notification.stack.ExpandableViewState; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.notification.stack.ViewState; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationIconContainer; +import javax.inject.Inject; +import javax.inject.Named; + /** * A notification shelf view that is placed inside the notification scroller. It manages the * overflow icons that don't fit into the regular list anymore. @@ -63,15 +68,13 @@ public class NotificationShelf extends ActivatableNotificationView implements = SystemProperties.getBoolean("debug.icon_scroll_animations", true); private static final int TAG_CONTINUOUS_CLIPPING = R.id.continuous_clipping_tag; private static final String TAG = "NotificationShelf"; - private static final long SHELF_IN_TRANSLATION_DURATION = 200; + private final KeyguardBypassController mBypassController; private NotificationIconContainer mShelfIcons; private int[] mTmp = new int[2]; private boolean mHideBackground; private int mIconAppearTopPadding; - private int mShelfAppearTranslation; - private float mDarkShelfPadding; - private float mDarkShelfIconSize; + private float mHiddenShelfIconSize; private int mStatusBarHeight; private int mStatusBarPaddingStart; private AmbientState mAmbientState; @@ -96,8 +99,12 @@ public class NotificationShelf extends ActivatableNotificationView implements private int mCutoutHeight; private int mGapHeight; - public NotificationShelf(Context context, AttributeSet attrs) { + @Inject + public NotificationShelf(@Named(VIEW_CONTEXT) Context context, + AttributeSet attrs, + KeyguardBypassController keyguardBypassController) { super(context, attrs); + mBypassController = keyguardBypassController; } @Override @@ -140,8 +147,6 @@ public class NotificationShelf extends ActivatableNotificationView implements mStatusBarHeight = res.getDimensionPixelOffset(R.dimen.status_bar_height); mStatusBarPaddingStart = res.getDimensionPixelOffset(R.dimen.status_bar_padding_start); mPaddingBetweenElements = res.getDimensionPixelSize(R.dimen.notification_divider_height); - mShelfAppearTranslation = res.getDimensionPixelSize(R.dimen.shelf_appear_translation); - mDarkShelfPadding = res.getDimensionPixelSize(R.dimen.widget_bottom_separator_padding); ViewGroup.LayoutParams layoutParams = getLayoutParams(); layoutParams.height = res.getDimensionPixelOffset(R.dimen.notification_shelf_height); @@ -152,7 +157,7 @@ public class NotificationShelf extends ActivatableNotificationView implements mScrollFastThreshold = res.getDimensionPixelOffset(R.dimen.scroll_fast_threshold); mShowNotificationShelf = res.getBoolean(R.bool.config_showNotificationShelf); mIconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_icon_size); - mDarkShelfIconSize = res.getDimensionPixelOffset(R.dimen.dark_shelf_icon_size); + mHiddenShelfIconSize = res.getDimensionPixelOffset(R.dimen.hidden_shelf_icon_size); mGapHeight = res.getDimensionPixelSize(R.dimen.qs_notification_padding); if (!mShowNotificationShelf) { @@ -167,33 +172,6 @@ public class NotificationShelf extends ActivatableNotificationView implements } @Override - public void setDark(boolean dark, boolean fade, long delay) { - if (mDark == dark) return; - super.setDark(dark, fade, delay); - mShelfIcons.setDark(dark, fade, delay); - updateInteractiveness(); - updateOutline(); - } - - /** - * Alpha animation with translation played when this view is visible on AOD. - */ - public void fadeInTranslating() { - mShelfIcons.setTranslationY(-mShelfAppearTranslation); - mShelfIcons.setAlpha(0); - mShelfIcons.animate() - .setInterpolator(Interpolators.DECELERATE_QUINT) - .translationY(0) - .setDuration(SHELF_IN_TRANSLATION_DURATION) - .start(); - mShelfIcons.animate() - .alpha(1) - .setInterpolator(Interpolators.LINEAR) - .setDuration(SHELF_IN_TRANSLATION_DURATION) - .start(); - } - - @Override protected View getContentView() { return mShelfIcons; } @@ -219,11 +197,8 @@ public class NotificationShelf extends ActivatableNotificationView implements viewState.copyFrom(lastViewState); viewState.height = getIntrinsicHeight(); - float awakenTranslation = Math.max(Math.min(viewEnd, maxShelfEnd) - viewState.height, + viewState.yTranslation = Math.max(Math.min(viewEnd, maxShelfEnd) - viewState.height, getFullyClosedTranslation()); - float yRatio = mAmbientState.hasPulsingNotifications() ? - 0 : mAmbientState.getDarkAmount(); - viewState.yTranslation = awakenTranslation + mDarkShelfPadding * yRatio; viewState.zTranslation = ambientState.getBaseZHeight(); // For the small display size, it's not enough to make the icon not covered by // the top cutout so the denominator add the height of cutout. @@ -344,7 +319,10 @@ public class NotificationShelf extends ActivatableNotificationView implements colorTwoBefore = previousColor; transitionAmount = inShelfAmount; } - if (isLastChild) { + // We don't want to modify the color if the notification is hun'd + boolean canModifyColor = mAmbientState.isShadeExpanded() + && !(mAmbientState.isOnKeyguard() && mBypassController.getBypassEnabled()); + if (isLastChild && canModifyColor) { if (colorOfViewBeforeLast == NO_COLOR) { colorOfViewBeforeLast = ownColorUntinted; } @@ -396,6 +374,10 @@ public class NotificationShelf extends ActivatableNotificationView implements clipTransientViews(); setClipTopAmount(clipTopAmount); + boolean isHidden = getViewState().hidden || clipTopAmount >= getIntrinsicHeight(); + if (mShowNotificationShelf) { + setVisibility(isHidden ? View.INVISIBLE : View.VISIBLE); + } setBackgroundTop(backgroundTop); setFirstElementRoundness(firstElementRoundness); mShelfIcons.setSpeedBumpIndex(mAmbientState.getSpeedBumpIndex()); @@ -452,7 +434,7 @@ public class NotificationShelf extends ActivatableNotificationView implements } StatusBarIconView icon = row.getEntry().expandedIcon; float shelfIconPosition = getTranslationY() + icon.getTop() + icon.getTranslationY(); - if (shelfIconPosition < maxTop && !mAmbientState.isFullyDark()) { + if (shelfIconPosition < maxTop && !mAmbientState.isFullyHidden()) { int top = (int) (maxTop - shelfIconPosition); Rect clipRect = new Rect(0, top, icon.getWidth(), Math.max(top, icon.getHeight())); icon.setClipBounds(clipRect); @@ -463,7 +445,7 @@ public class NotificationShelf extends ActivatableNotificationView implements private void updateContinuousClipping(final ExpandableNotificationRow row) { StatusBarIconView icon = row.getEntry().expandedIcon; - boolean needsContinuousClipping = ViewState.isAnimatingY(icon) && !mAmbientState.isDark(); + boolean needsContinuousClipping = ViewState.isAnimatingY(icon) && !mAmbientState.isDozing(); boolean isContinuousClipping = icon.getTag(TAG_CONTINUOUS_CLIPPING) != null; if (needsContinuousClipping && !isContinuousClipping) { final ViewTreeObserver observer = icon.getViewTreeObserver(); @@ -512,8 +494,12 @@ public class NotificationShelf extends ActivatableNotificationView implements float viewEnd = row.getTranslationY() + row.getActualHeight(); boolean isPinned = (row.isPinned() || row.isHeadsUpAnimatingAway()) && !mAmbientState.isDozingAndNotPulsing(row); - boolean shouldClipOwnTop = row.showingAmbientPulsing() && !mAmbientState.isFullyDark() - || (mAmbientState.isPulseExpanding() && childIndex == 0); + boolean shouldClipOwnTop; + if (mAmbientState.isPulseExpanding()) { + shouldClipOwnTop = childIndex == 0; + } else { + shouldClipOwnTop = row.showingPulsing(); + } if (viewEnd > notificationClipEnd && !shouldClipOwnTop && (mAmbientState.isShadeExpanded() || !isPinned)) { int clipBottomAmount = (int) (viewEnd - notificationClipEnd); @@ -666,8 +652,8 @@ public class NotificationShelf extends ActivatableNotificationView implements iconState.translateContent = false; } float transitionAmount; - if (mAmbientState.isDarkAtAll() && !row.isInShelf()) { - transitionAmount = mAmbientState.isFullyDark() ? 1 : 0; + if (mAmbientState.isHiddenAtAll() && !row.isInShelf()) { + transitionAmount = mAmbientState.isFullyHidden() ? 1 : 0; } else if (isLastChild || !USE_ANIMATIONS_WHEN_OPENING || iconState.useFullTransitionAmount || iconState.useLinearTransitionAmount) { transitionAmount = iconTransitionAmount; @@ -682,7 +668,7 @@ public class NotificationShelf extends ActivatableNotificationView implements ? fullTransitionAmount : transitionAmount; iconState.clampedAppearAmount = clampedAmount; - float contentTransformationAmount = !row.isAboveShelf() + float contentTransformationAmount = !row.isAboveShelf() && !row.showingPulsing() && (isLastChild || iconState.translateContent) ? iconTransitionAmount : 0.0f; @@ -717,7 +703,7 @@ public class NotificationShelf extends ActivatableNotificationView implements } notificationIconPosition += iconTopPadding; float shelfIconPosition = getTranslationY() + icon.getTop(); - float iconSize = mDark ? mDarkShelfIconSize : mIconSize; + float iconSize = mAmbientState.isFullyHidden() ? mHiddenShelfIconSize : mIconSize; shelfIconPosition += (icon.getHeight() - icon.getIconScale() * iconSize) / 2.0f; float iconYTranslation = NotificationUtils.interpolate( notificationIconPosition - shelfIconPosition, @@ -752,9 +738,10 @@ public class NotificationShelf extends ActivatableNotificationView implements iconState.scaleY = 1.0f; iconState.hidden = false; } - if ((row.isAboveShelf() || (!row.isInShelf() && (isLastChild && row.areGutsExposed() - || row.getTranslationZ() > mAmbientState.getBaseZHeight()))) - && !mAmbientState.isFullyDark()) { + if (row.isAboveShelf() + || row.showingPulsing() + || (!row.isInShelf() && (isLastChild && row.areGutsExposed() + || row.getTranslationZ() > mAmbientState.getBaseZHeight()))) { iconState.hidden = true; } int backgroundColor = getBackgroundColorWithoutTint(); @@ -795,12 +782,12 @@ public class NotificationShelf extends ActivatableNotificationView implements @Override protected boolean needsOutline() { - return !mHideBackground && !mDark && super.needsOutline(); + return !mHideBackground && super.needsOutline(); } @Override protected boolean shouldHideBackground() { - return super.shouldHideBackground() || mHideBackground || mDark; + return super.shouldHideBackground() || mHideBackground; } @Override @@ -840,7 +827,7 @@ public class NotificationShelf extends ActivatableNotificationView implements private void setOpenedAmount(float openedAmount) { mNoAnimationsInThisFrame = openedAmount == 1.0f && mOpenedAmount == 0.0f; mOpenedAmount = openedAmount; - if (!mAmbientState.isPanelFullWidth() || mAmbientState.isDark()) { + if (!mAmbientState.isPanelFullWidth() || mAmbientState.isDozing()) { // We don't do a transformation at all, lets just assume we are fully opened openedAmount = 1.0f; } @@ -911,8 +898,7 @@ public class NotificationShelf extends ActivatableNotificationView implements } private void updateInteractiveness() { - mInteractive = mStatusBarState == StatusBarState.KEYGUARD && mHasItemsInStableShelf - && !mDark; + mInteractive = mStatusBarState == StatusBarState.KEYGUARD && mHasItemsInStableShelf; setClickable(mInteractive); setFocusable(mInteractive); setImportantForAccessibility(mInteractive ? View.IMPORTANT_FOR_ACCESSIBILITY_YES diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java index 9c3ee96fe25b..6e75c0375afc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java @@ -36,6 +36,7 @@ import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.stack.NotificationListContainer; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.util.Assert; @@ -86,6 +87,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle private final boolean mAlwaysExpandNonGroupedNotification; private final BubbleData mBubbleData; private final DynamicPrivacyController mDynamicPrivacyController; + private final KeyguardBypassController mBypassController; private NotificationPresenter mPresenter; private NotificationListContainer mListContainer; @@ -106,9 +108,11 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle NotificationEntryManager notificationEntryManager, Lazy<ShadeController> shadeController, BubbleData bubbleData, + KeyguardBypassController bypassController, DynamicPrivacyController privacyController) { mHandler = mainHandler; mLockscreenUserManager = notificationLockscreenUserManager; + mBypassController = bypassController; mGroupManager = groupManager; mVisualStabilityManager = visualStabilityManager; mStatusBarStateController = (SysuiStatusBarStateController) statusBarStateController; @@ -168,7 +172,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle boolean deviceSensitive = devicePublic && !mLockscreenUserManager.userAllowsPrivateNotificationsInPublic( currentUserId); - ent.getRow().setSensitive(sensitive, deviceSensitive); + ent.setSensitive(sensitive, deviceSensitive); ent.getRow().setNeedsRedaction(needsRedaction); if (mGroupManager.isChildInGroupWithSummary(ent.notification)) { NotificationEntry summary = mGroupManager.getGroupSummary(ent.notification); @@ -362,7 +366,7 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle int visibleNotifications = 0; boolean onKeyguard = mStatusBarStateController.getState() == StatusBarState.KEYGUARD; int maxNotifications = -1; - if (onKeyguard) { + if (onKeyguard && !mBypassController.getBypassEnabled()) { maxNotifications = mPresenter.getMaxNotificationsWhileLocked(true /* recompute */); } mListContainer.setMaxDisplayedNotifications(maxNotifications); @@ -390,7 +394,6 @@ public class NotificationViewHierarchyManager implements DynamicPrivacyControlle && !row.isLowPriority())); } - entry.getRow().setOnAmbient(mShadeController.get().isDozing()); int userId = entry.notification.getUserId(); boolean suppressedSummary = mGroupManager.isSummaryOfSuppressedGroup( entry.notification) && !entry.isRowRemoved(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt index a9d4fdeae397..986486ac14d4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt @@ -25,6 +25,7 @@ import android.os.PowerManager import android.os.PowerManager.WAKE_REASON_GESTURE import android.os.SystemClock import android.view.MotionEvent +import android.view.VelocityTracker import android.view.ViewConfiguration import com.android.systemui.Gefingerpoken @@ -35,8 +36,12 @@ import com.android.systemui.plugins.FalsingManager import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableView +import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout +import com.android.systemui.statusbar.phone.HeadsUpManagerPhone +import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.phone.ShadeController +import com.android.systemui.statusbar.policy.HeadsUpManager import javax.inject.Inject import javax.inject.Singleton @@ -48,22 +53,46 @@ import kotlin.math.max @Singleton class PulseExpansionHandler @Inject constructor(context: Context, - private val mWakeUpCoordinator: NotificationWakeUpCoordinator) : Gefingerpoken { + private val wakeUpCoordinator: NotificationWakeUpCoordinator, + private val bypassController: KeyguardBypassController, + private val headsUpManager: HeadsUpManagerPhone, + private val roundnessManager: NotificationRoundnessManager) : Gefingerpoken { companion object { private val RUBBERBAND_FACTOR_STATIC = 0.25f private val SPRING_BACK_ANIMATION_LENGTH_MS = 375 } private val mPowerManager: PowerManager? - private var mShadeController: ShadeController? = null + private lateinit var shadeController: ShadeController private val mMinDragDistance: Int private var mInitialTouchX: Float = 0.0f private var mInitialTouchY: Float = 0.0f var isExpanding: Boolean = false + private set(value) { + val changed = field != value + field = value + bypassController.isPulseExpanding = value + if (changed) { + if (value) { + val topEntry = headsUpManager.topEntry + topEntry?.let { + roundnessManager.setTrackingHeadsUp(it.row) + } + } else { + roundnessManager.setTrackingHeadsUp(null) + if (!leavingLockscreen) { + bypassController.maybePerformPendingUnlock() + pulseExpandAbortListener?.run() + } + } + headsUpManager.unpinAll(true /* userUnPinned */) + } + } + var leavingLockscreen: Boolean = false private set private val mTouchSlop: Float - private var mExpansionCallback: ExpansionCallback? = null - private lateinit var mStackScroller: NotificationStackScrollLayout + private lateinit var expansionCallback: ExpansionCallback + private lateinit var stackScroller: NotificationStackScrollLayout private val mTemp2 = IntArray(2) private var mDraggedFarEnough: Boolean = false private var mStartingChild: ExpandableView? = null @@ -74,9 +103,13 @@ constructor(context: Context, private var mEmptyDragAmount: Float = 0.0f private var mWakeUpHeight: Float = 0.0f private var mReachedWakeUpHeight: Boolean = false + private var velocityTracker: VelocityTracker? = null private val isFalseTouch: Boolean get() = mFalsingManager.isFalseTouch + var qsExpanded: Boolean = false + var pulseExpandAbortListener: Runnable? = null + var bouncerShowing: Boolean = false init { mMinDragDistance = context.resources.getDimensionPixelSize( @@ -91,9 +124,14 @@ constructor(context: Context, } private fun maybeStartExpansion(event: MotionEvent): Boolean { - if (!mPulsing) { + if (!wakeUpCoordinator.canShowPulsingHuns || qsExpanded + || bouncerShowing) { return false } + if (velocityTracker == null) { + velocityTracker = VelocityTracker.obtain() + } + velocityTracker!!.addMovement(event) val x = event.x val y = event.y @@ -101,6 +139,7 @@ constructor(context: Context, MotionEvent.ACTION_DOWN -> { mDraggedFarEnough = false isExpanding = false + leavingLockscreen = false mStartingChild = null mInitialTouchY = y mInitialTouchX = x @@ -114,29 +153,52 @@ constructor(context: Context, captureStartingChild(mInitialTouchX, mInitialTouchY) mInitialTouchY = y mInitialTouchX = x - mWakeUpHeight = mWakeUpCoordinator.getWakeUpHeight() + mWakeUpHeight = wakeUpCoordinator.getWakeUpHeight() mReachedWakeUpHeight = false return true } } + + MotionEvent.ACTION_UP -> { + recycleVelocityTracker(); + } + + MotionEvent.ACTION_CANCEL -> { + recycleVelocityTracker(); + } } return false } + private fun recycleVelocityTracker() { + velocityTracker?.recycle(); + velocityTracker = null + } + override fun onTouchEvent(event: MotionEvent): Boolean { if (!isExpanding) { return maybeStartExpansion(event) } + velocityTracker!!.addMovement(event) val y = event.y + val moveDistance = y - mInitialTouchY when (event.actionMasked) { - MotionEvent.ACTION_MOVE -> updateExpansionHeight(y - mInitialTouchY) - MotionEvent.ACTION_UP -> if (!mFalsingManager.isUnlockingDisabled && !isFalseTouch) { - finishExpansion() - } else { + MotionEvent.ACTION_MOVE -> updateExpansionHeight(moveDistance) + MotionEvent.ACTION_UP -> { + velocityTracker!!.computeCurrentVelocity(1000 /* units */) + val canExpand = moveDistance > 0 && velocityTracker!!.getYVelocity() > -1000 + if (!mFalsingManager.isUnlockingDisabled && !isFalseTouch && canExpand) { + finishExpansion() + } else { + cancelExpansion() + } + recycleVelocityTracker() + } + MotionEvent.ACTION_CANCEL -> { cancelExpansion() + recycleVelocityTracker() } - MotionEvent.ACTION_CANCEL -> cancelExpansion() } return isExpanding } @@ -147,12 +209,15 @@ constructor(context: Context, setUserLocked(mStartingChild!!, false) mStartingChild = null } + if (shadeController.isDozing) { + isWakingToShadeLocked = true + wakeUpCoordinator.willWakeUp = true + mPowerManager!!.wakeUp(SystemClock.uptimeMillis(), WAKE_REASON_GESTURE, + "com.android.systemui:PULSEDRAG") + } + shadeController.goToLockedShade(mStartingChild) + leavingLockscreen = true; isExpanding = false - isWakingToShadeLocked = true - mWakeUpCoordinator.willWakeUp = true - mPowerManager!!.wakeUp(SystemClock.uptimeMillis(), WAKE_REASON_GESTURE, - "com.android.systemui:PULSEDRAG") - mShadeController!!.goToLockedShade(mStartingChild) if (mStartingChild is ExpandableNotificationRow) { val row = mStartingChild as ExpandableNotificationRow? row!!.onExpandedByGesture(true /* userExpanded */) @@ -172,17 +237,17 @@ constructor(context: Context, expansionHeight = max(newHeight.toFloat(), expansionHeight) } else { val target = if (mReachedWakeUpHeight) mWakeUpHeight else 0.0f - mWakeUpCoordinator.setNotificationsVisibleForExpansion(height > target, + wakeUpCoordinator.setNotificationsVisibleForExpansion(height > target, true /* animate */, true /* increaseSpeed */) expansionHeight = max(mWakeUpHeight, expansionHeight) } - val emptyDragAmount = mWakeUpCoordinator.setPulseHeight(expansionHeight) + val emptyDragAmount = wakeUpCoordinator.setPulseHeight(expansionHeight) setEmptyDragAmount(emptyDragAmount * RUBBERBAND_FACTOR_STATIC) } private fun captureStartingChild(x: Float, y: Float) { - if (mStartingChild == null) { + if (mStartingChild == null && !bypassController.bypassEnabled) { mStartingChild = findView(x, y) if (mStartingChild != null) { setUserLocked(mStartingChild!!, true) @@ -192,7 +257,7 @@ constructor(context: Context, private fun setEmptyDragAmount(amount: Float) { mEmptyDragAmount = amount - mExpansionCallback!!.setEmptyDragAmount(amount) + expansionCallback.setEmptyDragAmount(amount) } private fun reset(child: ExpandableView) { @@ -227,6 +292,7 @@ constructor(context: Context, } private fun cancelExpansion() { + isExpanding = false mFalsingManager.onExpansionFromPulseStopped() if (mStartingChild != null) { reset(mStartingChild!!) @@ -234,30 +300,29 @@ constructor(context: Context, } else { resetClock() } - mWakeUpCoordinator.setNotificationsVisibleForExpansion(false /* visible */, + wakeUpCoordinator.setNotificationsVisibleForExpansion(false /* visible */, true /* animate */, false /* increaseSpeed */) - isExpanding = false } private fun findView(x: Float, y: Float): ExpandableView? { var totalX = x var totalY = y - mStackScroller.getLocationOnScreen(mTemp2) + stackScroller.getLocationOnScreen(mTemp2) totalX += mTemp2[0].toFloat() totalY += mTemp2[1].toFloat() - val childAtRawPosition = mStackScroller.getChildAtRawPosition(totalX, totalY) + val childAtRawPosition = stackScroller.getChildAtRawPosition(totalX, totalY) return if (childAtRawPosition != null && childAtRawPosition.isContentExpandable) { childAtRawPosition } else null } - fun setUp(notificationStackScroller: NotificationStackScrollLayout, - expansionCallback: ExpansionCallback, - shadeController: ShadeController) { - mExpansionCallback = expansionCallback - mShadeController = shadeController - mStackScroller = notificationStackScroller + fun setUp(stackScroller: NotificationStackScrollLayout, + expansionCallback: ExpansionCallback, + shadeController: ShadeController) { + this.expansionCallback = expansionCallback + this.shadeController = shadeController + this.stackScroller = stackScroller } fun setPulsing(pulsing: Boolean) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 6552fe671794..f4af9ae21b75 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -112,7 +112,7 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi }; private boolean mAlwaysScaleIcon; - private int mStatusBarIconDrawingSizeDark = 1; + private int mStatusBarIconDrawingSizeIncreased = 1; private int mStatusBarIconDrawingSize = 1; private int mStatusBarIconSize = 1; private StatusBarIcon mIcon; @@ -139,7 +139,7 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi private int mDrawableColor; private int mIconColor; private int mDecorColor; - private float mDarkAmount; + private float mDozeAmount; private ValueAnimator mColorAnimator; private int mCurrentSetColor = NO_COLOR; private int mAnimationStartColor = NO_COLOR; @@ -158,6 +158,7 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi private Runnable mLayoutRunnable; private boolean mDismissed; private Runnable mOnDismissListener; + private boolean mIncreasedSize; public StatusBarIconView(Context context, String slot, StatusBarNotification sbn) { this(context, slot, sbn, false); @@ -196,12 +197,10 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi } private void updateIconScaleForNotifications() { - final float imageBounds = NotificationUtils.interpolate( - mStatusBarIconDrawingSize, - mStatusBarIconDrawingSizeDark, - mDarkAmount); + final float imageBounds = mIncreasedSize ? + mStatusBarIconDrawingSizeIncreased : mStatusBarIconDrawingSize; final int outerBounds = mStatusBarIconSize; - mIconScale = (float)imageBounds / (float)outerBounds; + mIconScale = imageBounds / (float)outerBounds; updatePivot(); } @@ -225,8 +224,8 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi } } - public float getIconScaleFullyDark() { - return (float) mStatusBarIconDrawingSizeDark / mStatusBarIconDrawingSize; + public float getIconScaleIncreased() { + return (float) mStatusBarIconDrawingSizeIncreased / mStatusBarIconDrawingSize; } public float getIconScale() { @@ -256,7 +255,7 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi Resources res = getResources(); mStaticDotRadius = res.getDimensionPixelSize(R.dimen.overflow_dot_radius); mStatusBarIconSize = res.getDimensionPixelSize(R.dimen.status_bar_icon_size); - mStatusBarIconDrawingSizeDark = + mStatusBarIconDrawingSizeIncreased = res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size_dark); mStatusBarIconDrawingSize = res.getDimensionPixelSize(R.dimen.status_bar_icon_drawing_size); @@ -584,7 +583,7 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi } private void updateDecorColor() { - int color = NotificationUtils.interpolateColors(mDecorColor, Color.WHITE, mDarkAmount); + int color = NotificationUtils.interpolateColors(mDecorColor, Color.WHITE, mDozeAmount); if (mDotPaint.getColor() != color) { mDotPaint.setColor(color); @@ -618,13 +617,13 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi mMatrixColorFilter = new ColorMatrixColorFilter(mMatrix); } int color = NotificationUtils.interpolateColors( - mCurrentSetColor, Color.WHITE, mDarkAmount); - updateTintMatrix(mMatrix, color, DARK_ALPHA_BOOST * mDarkAmount); + mCurrentSetColor, Color.WHITE, mDozeAmount); + updateTintMatrix(mMatrix, color, DARK_ALPHA_BOOST * mDozeAmount); mMatrixColorFilter.setColorMatrixArray(mMatrix); setColorFilter(null); // setColorFilter only invalidates if the instance changed. setColorFilter(mMatrixColorFilter); } else { - mDozer.updateGrayscale(this, mDarkAmount); + mDozer.updateGrayscale(this, mDozeAmount); } } @@ -855,19 +854,18 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi mOnVisibilityChangedListener = listener; } - public void setDark(boolean dark, boolean fade, long delay) { - mDozer.setIntensityDark(f -> { - mDarkAmount = f; - maybeUpdateIconScaleDimens(); + public void setDozing(boolean dozing, boolean fade, long delay) { + mDozer.setDozing(f -> { + mDozeAmount = f; updateDecorColor(); updateIconColor(); updateAllowAnimation(); - }, dark, fade, delay, this); + }, dozing, fade, delay, this); } private void updateAllowAnimation() { - if (mDarkAmount == 0 || mDarkAmount == 1) { - setAllowAnimation(mDarkAmount == 0); + if (mDozeAmount == 0 || mDozeAmount == 1) { + setAllowAnimation(mDozeAmount == 0); } } @@ -949,6 +947,11 @@ public class StatusBarIconView extends AnimatedImageView implements StatusIconDi return mBlocked; } + public void setIncreasedSize(boolean increasedSize) { + mIncreasedSize = increasedSize; + maybeUpdateIconScaleDimens(); + } + public interface OnVisibilityChangedListener { void onVisibilityChanged(int newVisibility); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java index eb386dcdbf46..f0eeb046bc44 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java @@ -20,6 +20,7 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.text.format.DateFormat; import android.util.FloatProperty; +import android.view.View; import android.view.animation.Interpolator; import com.android.internal.annotations.GuardedBy; @@ -77,6 +78,16 @@ public class StatusBarStateControllerImpl implements SysuiStatusBarStateControll private HistoricalState[] mHistoricalRecords = new HistoricalState[HISTORY_SIZE]; /** + * Current SystemUiVisibility + */ + private int mSystemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE; + + /** + * If the device is currently pulsing (AOD2). + */ + private boolean mPulsing; + + /** * If the device is currently dozing or not. */ private boolean mIsDozing; @@ -292,6 +303,30 @@ public class StatusBarStateControllerImpl implements SysuiStatusBarStateControll return mKeyguardRequested; } + @Override + public void setSystemUiVisibility(int visibility) { + if (mSystemUiVisibility != visibility) { + mSystemUiVisibility = visibility; + synchronized (mListeners) { + for (RankedListener rl : new ArrayList<>(mListeners)) { + rl.mListener.onSystemUiVisibilityChanged(mSystemUiVisibility); + } + } + } + } + + @Override + public void setPulsing(boolean pulsing) { + if (mPulsing != pulsing) { + mPulsing = pulsing; + synchronized (mListeners) { + for (RankedListener rl : new ArrayList<>(mListeners)) { + rl.mListener.onPulsingChanged(pulsing); + } + } + } + } + /** * Returns String readable state of status bar from {@link StatusBarState} */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java index dc5e1e913b4c..2ad979ab64e3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java @@ -111,6 +111,16 @@ public interface SysuiStatusBarStateController extends StatusBarStateController boolean isKeyguardRequested(); /** + * Set systemui visibility + */ + void setSystemUiVisibility(int visibility); + + /** + * Set pulsing + */ + void setPulsing(boolean visibility); + + /** * Listener with rankings SbStateListenerRank that have dependencies so must be updated * in a certain order */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/BypassHeadsUpNotifier.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/BypassHeadsUpNotifier.kt new file mode 100644 index 000000000000..314dc04e574f --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/BypassHeadsUpNotifier.kt @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.notification + +import android.content.Context +import android.media.MediaMetadata +import android.provider.Settings +import com.android.keyguard.KeyguardUpdateMonitor +import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.statusbar.NotificationLockscreenUserManager +import com.android.systemui.statusbar.NotificationMediaManager +import com.android.systemui.statusbar.StatusBarState +import com.android.systemui.statusbar.notification.collection.NotificationEntry +import com.android.systemui.statusbar.phone.HeadsUpManagerPhone +import com.android.systemui.statusbar.phone.KeyguardBypassController +import com.android.systemui.tuner.TunerService +import javax.inject.Inject +import javax.inject.Singleton + +/** + * A class that automatically creates heads up for important notification when bypassing the + * lockscreen + */ +@Singleton +class BypassHeadsUpNotifier @Inject constructor( + private val context: Context, + private val bypassController: KeyguardBypassController, + private val statusBarStateController: StatusBarStateController, + private val headsUpManager: HeadsUpManagerPhone, + private val notificationLockscreenUserManager: NotificationLockscreenUserManager, + private val mediaManager: NotificationMediaManager, + tunerService: TunerService) : StatusBarStateController.StateListener, + NotificationMediaManager.MediaListener { + + private lateinit var entryManager: NotificationEntryManager + private var currentMediaEntry: NotificationEntry? = null + private var enabled = true + + var fullyAwake = false + set(value) { + field = value + if (value) { + updateAutoHeadsUp(currentMediaEntry) + } + } + + init { + statusBarStateController.addCallback(this) + tunerService.addTunable( + TunerService.Tunable { _, _ -> + enabled = Settings.Secure.getIntForUser( + context.contentResolver, + Settings.Secure.SHOW_MEDIA_WHEN_BYPASSING, + 0 /* default */, + KeyguardUpdateMonitor.getCurrentUser()) != 0 + }, Settings.Secure.SHOW_MEDIA_WHEN_BYPASSING) + } + + fun setUp(entryManager: NotificationEntryManager) { + this.entryManager = entryManager + mediaManager.addCallback(this) + } + + override fun onMetadataOrStateChanged(metadata: MediaMetadata?, state: Int) { + val previous = currentMediaEntry + var newEntry = entryManager.notificationData.get(mediaManager.mediaNotificationKey) + if (!NotificationMediaManager.isPlayingState(state)) { + newEntry = null + } + currentMediaEntry = newEntry + updateAutoHeadsUp(previous) + updateAutoHeadsUp(currentMediaEntry) + } + + private fun updateAutoHeadsUp(entry: NotificationEntry?) { + entry?.let { + val autoHeadsUp = it == currentMediaEntry && canAutoHeadsUp(it) + it.isAutoHeadsUp = autoHeadsUp + if (autoHeadsUp) { + headsUpManager.showNotification(it) + } + } + } + + /** + * @return {@code true} if this entry be autoHeadsUpped right now. + */ + private fun canAutoHeadsUp(entry: NotificationEntry): Boolean { + if (!isAutoHeadsUpAllowed()) { + return false; + } + if (entry.isSensitive) { + // filter sensitive notifications + return false + } + if (!notificationLockscreenUserManager.shouldShowOnKeyguard(entry)) { + // filter notifications invisible on Keyguard + return false + } + if (!entryManager.notificationData.activeNotifications.contains(entry)) { + // filter notifications not the active list currently + return false + } + return true + } + + override fun onStatePostChange() { + updateAutoHeadsUp(currentMediaEntry) + } + + /** + * @return {@code true} if autoHeadsUp is possible right now. + */ + private fun isAutoHeadsUpAllowed() : Boolean { + if (!enabled) { + return false + } + if (!bypassController.bypassEnabled) { + return false + } + if (statusBarStateController.state != StatusBarState.KEYGUARD) { + return false + } + if (!fullyAwake) { + return false + } + return true + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/DynamicPrivacyController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/DynamicPrivacyController.java index 16bd884fcc58..d9328fa3affd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/DynamicPrivacyController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/DynamicPrivacyController.java @@ -20,8 +20,12 @@ import android.content.Context; import android.util.ArraySet; import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationLockscreenUserManager; +import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.UnlockMethodCache; +import com.android.systemui.statusbar.policy.KeyguardMonitor; import javax.inject.Inject; import javax.inject.Singleton; @@ -34,22 +38,33 @@ public class DynamicPrivacyController implements UnlockMethodCache.OnUnlockMetho private final UnlockMethodCache mUnlockMethodCache; private final NotificationLockscreenUserManager mLockscreenUserManager; + private final StatusBarStateController mStateController; + private final KeyguardMonitor mKeyguardMonitor; private ArraySet<Listener> mListeners = new ArraySet<>(); private boolean mLastDynamicUnlocked; private boolean mCacheInvalid; + private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; @Inject DynamicPrivacyController(Context context, - NotificationLockscreenUserManager notificationLockscreenUserManager) { - this(notificationLockscreenUserManager, UnlockMethodCache.getInstance(context)); + KeyguardMonitor keyguardMonitor, + NotificationLockscreenUserManager notificationLockscreenUserManager, + StatusBarStateController stateController) { + this(notificationLockscreenUserManager, keyguardMonitor, + UnlockMethodCache.getInstance(context), + stateController); } @VisibleForTesting DynamicPrivacyController(NotificationLockscreenUserManager notificationLockscreenUserManager, - UnlockMethodCache unlockMethodCache) { + KeyguardMonitor keyguardMonitor, + UnlockMethodCache unlockMethodCache, + StatusBarStateController stateController) { mLockscreenUserManager = notificationLockscreenUserManager; + mStateController = stateController; mUnlockMethodCache = unlockMethodCache; + mKeyguardMonitor = keyguardMonitor; mUnlockMethodCache.addListener(this); mLastDynamicUnlocked = isDynamicallyUnlocked(); } @@ -77,13 +92,39 @@ public class DynamicPrivacyController implements UnlockMethodCache.OnUnlockMetho } public boolean isDynamicallyUnlocked() { - return mUnlockMethodCache.canSkipBouncer() && isDynamicPrivacyEnabled(); + return (mUnlockMethodCache.canSkipBouncer() || mKeyguardMonitor.isKeyguardGoingAway() + || mKeyguardMonitor.isKeyguardFadingAway()) + && isDynamicPrivacyEnabled(); } public void addListener(Listener listener) { mListeners.add(listener); } + /** + * Is the notification shade currently in a locked down mode where it's fully showing but the + * contents aren't revealed yet? + */ + public boolean isInLockedDownShade() { + if (!mStatusBarKeyguardViewManager.isShowing() + || !mStatusBarKeyguardViewManager.isSecure()) { + return false; + } + int state = mStateController.getState(); + if (state != StatusBarState.SHADE && state != StatusBarState.SHADE_LOCKED) { + return false; + } + if (!isDynamicPrivacyEnabled() || isDynamicallyUnlocked()) { + return false; + } + return true; + } + + public void setStatusBarKeyguardViewManager( + StatusBarKeyguardViewManager statusBarKeyguardViewManager) { + mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; + } + public interface Listener { void onDynamicPrivacyChanged(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java index f6d3cdfddb31..d71d40781f2e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationAlertingManager.java @@ -17,7 +17,6 @@ package com.android.systemui.statusbar.notification; import static com.android.systemui.statusbar.NotificationRemoteInputManager.FORCE_REMOTE_INPUT_HISTORY; -import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_AMBIENT; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_HEADS_UP; import android.app.Notification; @@ -25,8 +24,6 @@ import android.service.notification.StatusBarNotification; import android.util.Log; import com.android.internal.statusbar.NotificationVisibility; -import com.android.systemui.statusbar.AlertingNotificationManager; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -45,7 +42,6 @@ public class NotificationAlertingManager { private static final String TAG = "NotifAlertManager"; - private final AmbientPulseManager mAmbientPulseManager; private final NotificationRemoteInputManager mRemoteInputManager; private final VisualStabilityManager mVisualStabilityManager; private final Lazy<ShadeController> mShadeController; @@ -57,13 +53,11 @@ public class NotificationAlertingManager { @Inject public NotificationAlertingManager( NotificationEntryManager notificationEntryManager, - AmbientPulseManager ambientPulseManager, NotificationRemoteInputManager remoteInputManager, VisualStabilityManager visualStabilityManager, Lazy<ShadeController> shadeController, NotificationInterruptionStateProvider notificationInterruptionStateProvider, NotificationListener notificationListener) { - mAmbientPulseManager = ambientPulseManager; mRemoteInputManager = remoteInputManager; mVisualStabilityManager = visualStabilityManager; mShadeController = shadeController; @@ -108,44 +102,31 @@ public class NotificationAlertingManager { // If it does and we no longer need to heads up, we should free the view. if (mNotificationInterruptionStateProvider.shouldHeadsUp(entry)) { mHeadsUpManager.showNotification(entry); - // Mark as seen immediately - setNotificationShown(entry.notification); + if (!mShadeController.get().isDozing()) { + // Mark as seen immediately + setNotificationShown(entry.notification); + } } else { entry.freeContentViewWhenSafe(FLAG_CONTENT_VIEW_HEADS_UP); } } - if ((inflatedFlags & FLAG_CONTENT_VIEW_AMBIENT) != 0) { - if (mNotificationInterruptionStateProvider.shouldPulse(entry)) { - mAmbientPulseManager.showNotification(entry); - } else { - entry.freeContentViewWhenSafe(FLAG_CONTENT_VIEW_AMBIENT); - } - } } private void updateAlertState(NotificationEntry entry) { boolean alertAgain = alertAgain(entry, entry.notification.getNotification()); - AlertingNotificationManager alertManager; boolean shouldAlert; - if (mShadeController.get().isDozing()) { - alertManager = mAmbientPulseManager; - shouldAlert = mNotificationInterruptionStateProvider.shouldPulse(entry); - } else { - alertManager = mHeadsUpManager; - shouldAlert = mNotificationInterruptionStateProvider.shouldHeadsUp(entry); - } - final boolean wasAlerting = alertManager.isAlerting(entry.key); + shouldAlert = mNotificationInterruptionStateProvider.shouldHeadsUp(entry); + final boolean wasAlerting = mHeadsUpManager.isAlerting(entry.key); if (wasAlerting) { - if (!shouldAlert) { + if (shouldAlert) { + mHeadsUpManager.updateNotification(entry.key, alertAgain); + } else if (!mHeadsUpManager.isEntryAutoHeadsUpped(entry.key)) { // We don't want this to be interrupting anymore, let's remove it - alertManager.removeNotification(entry.key, - false /* ignoreEarliestRemovalTime */); - } else { - alertManager.updateNotification(entry.key, alertAgain); + mHeadsUpManager.removeNotification(entry.key, false /* removeImmediately */); } } else if (shouldAlert && alertAgain) { // This notification was updated to be alerting, show it! - alertManager.showNotification(entry); + mHeadsUpManager.showNotification(entry); } } @@ -171,7 +152,7 @@ public class NotificationAlertingManager { } private void stopAlerting(final String key) { - // Attempt to remove notifications from their alert managers (heads up, ambient pulse). + // Attempt to remove notifications from their alert manager. // Though the remove itself may fail, it lets the manager know to remove as soon as // possible. if (mHeadsUpManager.isAlerting(key)) { @@ -185,8 +166,5 @@ public class NotificationAlertingManager { || !mVisualStabilityManager.isReorderingAllowed(); mHeadsUpManager.removeNotification(key, ignoreEarliestRemovalTime); } - if (mAmbientPulseManager.isAlerting(key)) { - mAmbientPulseManager.removeNotification(key, false /* ignoreEarliestRemovalTime */); - } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java index ef042bab7625..63bb73ab7f13 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java @@ -79,10 +79,11 @@ public class NotificationDozeHelper { animator.start(); } - public void setIntensityDark(Consumer<Float> listener, boolean dark, + public void setDozing(Consumer<Float> listener, boolean dozing, boolean animate, long delay, View view) { if (animate) { - startIntensityAnimation(a -> listener.accept((Float) a.getAnimatedValue()), dark, delay, + startIntensityAnimation(a -> listener.accept((Float) a.getAnimatedValue()), dozing, + delay, new AnimatorListenerAdapter() { @Override @@ -100,7 +101,7 @@ public class NotificationDozeHelper { if (animator != null) { animator.cancel(); } - listener.accept(dark ? 1f : 0f); + listener.accept(dozing ? 1f : 0f); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java index 1aa6bc9ae5f9..dfc64508cadf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryListener.java @@ -24,6 +24,8 @@ import com.android.internal.statusbar.NotificationVisibility; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.NotificationContentInflater.InflationFlag; +import androidx.annotation.NonNull; + /** * Listener interface for changes sent by NotificationEntryManager. */ @@ -45,7 +47,7 @@ public interface NotificationEntryListener { /** * Called when a new entry is created. */ - default void onNotificationAdded(NotificationEntry entry) { + default void onNotificationAdded(@NonNull NotificationEntry entry) { } /** @@ -61,7 +63,7 @@ public interface NotificationEntryListener { /** * Called when a notification was updated, after any filtering of notifications have occurred. */ - default void onPostEntryUpdated(NotificationEntry entry) { + default void onPostEntryUpdated(@NonNull NotificationEntry entry) { } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java index 926d4b6a79b3..4fc646119261 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java @@ -23,7 +23,6 @@ import android.app.NotificationManager; import android.content.Context; import android.database.ContentObserver; import android.hardware.display.AmbientDisplayConfiguration; -import android.os.Bundle; import android.os.PowerManager; import android.os.RemoteException; import android.os.ServiceManager; @@ -32,13 +31,13 @@ import android.provider.Settings; import android.service.dreams.DreamService; import android.service.dreams.IDreamManager; import android.service.notification.StatusBarNotification; -import android.text.TextUtils; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Dependency; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationPresenter; +import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.policy.HeadsUpManager; @@ -50,6 +49,7 @@ public class NotificationInterruptionStateProvider { private static final String TAG = "InterruptionStateProvider"; private static final boolean DEBUG = false; + private static final boolean DEBUG_HEADS_UP = true; private static final boolean ENABLE_HEADS_UP = true; private static final String SETTING_HEADS_UP_TICKER = "ticker_gets_heads_up"; @@ -186,18 +186,19 @@ public class NotificationInterruptionStateProvider { * @return true if the entry should heads up, false otherwise */ public boolean shouldHeadsUp(NotificationEntry entry) { - StatusBarNotification sbn = entry.notification; - - if (getShadeController().isDozing()) { - if (DEBUG) { - Log.d(TAG, "No heads up: device is dozing: " + sbn.getKey()); - } - return false; + if (mStatusBarStateController.isDozing()) { + return shouldHeadsUpWhenDozing(entry); + } else { + return shouldHeadsUpWhenAwake(entry); } + } + + private boolean shouldHeadsUpWhenAwake(NotificationEntry entry) { + StatusBarNotification sbn = entry.notification; boolean inShade = mStatusBarStateController.getState() == SHADE; if (entry.isBubble() && inShade) { - if (DEBUG) { + if (DEBUG_HEADS_UP) { Log.d(TAG, "No heads up: in unlocked shade where notification is shown as a " + "bubble: " + sbn.getKey()); } @@ -205,7 +206,7 @@ public class NotificationInterruptionStateProvider { } if (!canAlertCommon(entry)) { - if (DEBUG) { + if (DEBUG_HEADS_UP) { Log.d(TAG, "No heads up: notification shouldn't alert: " + sbn.getKey()); } return false; @@ -216,7 +217,7 @@ public class NotificationInterruptionStateProvider { } if (entry.importance < NotificationManager.IMPORTANCE_HIGH) { - if (DEBUG) { + if (DEBUG_HEADS_UP) { Log.d(TAG, "No heads up: unimportant notification: " + sbn.getKey()); } return false; @@ -231,13 +232,16 @@ public class NotificationInterruptionStateProvider { boolean inUse = mPowerManager.isScreenOn() && !isDreaming; if (!inUse) { - if (DEBUG) { + if (DEBUG_HEADS_UP) { Log.d(TAG, "No heads up: not in use: " + sbn.getKey()); } return false; } if (!mHeadsUpSuppressor.canHeadsUp(entry, sbn)) { + if (DEBUG_HEADS_UP) { + Log.d(TAG, "No heads up: aborted by suppressor: " + sbn.getKey()); + } return false; } @@ -251,61 +255,44 @@ public class NotificationInterruptionStateProvider { * @param entry the entry to check * @return true if the entry should ambient pulse, false otherwise */ - public boolean shouldPulse(NotificationEntry entry) { + private boolean shouldHeadsUpWhenDozing(NotificationEntry entry) { StatusBarNotification sbn = entry.notification; if (!mAmbientDisplayConfiguration.pulseOnNotificationEnabled(UserHandle.USER_CURRENT)) { - if (DEBUG) { + if (DEBUG_HEADS_UP) { Log.d(TAG, "No pulsing: disabled by setting: " + sbn.getKey()); } return false; } - if (!getShadeController().isDozing()) { - if (DEBUG) { - Log.d(TAG, "No pulsing: not dozing: " + sbn.getKey()); - } - return false; - } - if (!canAlertCommon(entry)) { - if (DEBUG) { + if (DEBUG_HEADS_UP) { Log.d(TAG, "No pulsing: notification shouldn't alert: " + sbn.getKey()); } return false; } if (entry.shouldSuppressAmbient()) { - if (DEBUG) { + if (DEBUG_HEADS_UP) { Log.d(TAG, "No pulsing: ambient effect suppressed: " + sbn.getKey()); } return false; } if (entry.importance < NotificationManager.IMPORTANCE_DEFAULT) { - if (DEBUG) { + if (DEBUG_HEADS_UP) { Log.d(TAG, "No pulsing: not important enough: " + sbn.getKey()); } return false; } - - Bundle extras = sbn.getNotification().extras; - CharSequence title = extras.getCharSequence(Notification.EXTRA_TITLE); - CharSequence text = extras.getCharSequence(Notification.EXTRA_TEXT); - if (TextUtils.isEmpty(title) && TextUtils.isEmpty(text)) { - if (DEBUG) { - Log.d(TAG, "No pulsing: title and text are empty: " + sbn.getKey()); - } - return false; - } - - return true; + return true; } /** - * Common checks between heads up alerting and ambient pulse alerting. See + * Common checks between regular heads up and when pulsing. See * {@link #shouldHeadsUp(NotificationEntry)} and - * {@link #shouldPulse(NotificationEntry)}. Notifications that fail any of these checks + * {@link #shouldHeadsUpWhenDozing(NotificationEntry)}. Notifications that fail any of these + * checks * should not alert at all. * * @param entry the entry to check @@ -315,7 +302,7 @@ public class NotificationInterruptionStateProvider { StatusBarNotification sbn = entry.notification; if (mNotificationFilter.shouldFilterOut(entry)) { - if (DEBUG) { + if (DEBUG || DEBUG_HEADS_UP) { Log.d(TAG, "No alerting: filtered notification: " + sbn.getKey()); } return false; @@ -323,7 +310,7 @@ public class NotificationInterruptionStateProvider { // Don't alert notifications that are suppressed due to group alert behavior if (sbn.isGroup() && sbn.getNotification().suppressAlertingDueToGrouping()) { - if (DEBUG) { + if (DEBUG || DEBUG_HEADS_UP) { Log.d(TAG, "No alerting: suppressed due to group alert behavior"); } return false; @@ -345,28 +332,28 @@ public class NotificationInterruptionStateProvider { StatusBarNotification sbn = entry.notification; if (!mUseHeadsUp || mPresenter.isDeviceInVrMode()) { - if (DEBUG) { + if (DEBUG_HEADS_UP) { Log.d(TAG, "No heads up: no huns or vr mode"); } return false; } if (entry.shouldSuppressPeek()) { - if (DEBUG) { + if (DEBUG_HEADS_UP) { Log.d(TAG, "No heads up: suppressed by DND: " + sbn.getKey()); } return false; } if (isSnoozedPackage(sbn)) { - if (DEBUG) { + if (DEBUG_HEADS_UP) { Log.d(TAG, "No heads up: snoozed package: " + sbn.getKey()); } return false; } if (entry.hasJustLaunchedFullScreenIntent()) { - if (DEBUG) { + if (DEBUG_HEADS_UP) { Log.d(TAG, "No heads up: recent fullscreen: " + sbn.getKey()); } return false; @@ -389,6 +376,19 @@ public class NotificationInterruptionStateProvider { return mPresenter; } + /** + * When an entry was added, should we launch its fullscreen intent? Examples are Alarms or + * incoming calls. + * + * @param entry the entry that was added + * @return {@code true} if we should launch the full screen intent + */ + public boolean shouldLaunchFullScreenIntentWhenAdded(NotificationEntry entry) { + return entry.notification.getNotification().fullScreenIntent != null + && (!shouldHeadsUp(entry) + || mStatusBarStateController.getState() == StatusBarState.KEYGUARD); + } + /** A component which can suppress heads-up notifications due to the overall state of the UI. */ public interface HeadsUpSuppressor { /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt index 7c193b19654b..2f67f90a115e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt @@ -21,12 +21,16 @@ import android.content.Context import android.util.FloatProperty import com.android.systemui.Interpolators import com.android.systemui.plugins.statusbar.StatusBarStateController -import com.android.systemui.statusbar.AmbientPulseManager -import com.android.systemui.statusbar.SysuiStatusBarStateController +import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout import com.android.systemui.statusbar.notification.stack.StackStateAnimator import com.android.systemui.statusbar.phone.DozeParameters +import com.android.systemui.statusbar.phone.HeadsUpManagerPhone +import com.android.systemui.statusbar.phone.KeyguardBypassController +import com.android.systemui.statusbar.phone.NotificationIconAreaController +import com.android.systemui.statusbar.phone.PanelExpansionListener +import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener import javax.inject.Inject import javax.inject.Singleton @@ -34,9 +38,11 @@ import javax.inject.Singleton @Singleton class NotificationWakeUpCoordinator @Inject constructor( private val mContext: Context, - private val mAmbientPulseManager: AmbientPulseManager, - private val mStatusBarStateController: StatusBarStateController) - : AmbientPulseManager.OnAmbientChangedListener, StatusBarStateController.StateListener { + private val mHeadsUpManagerPhone: HeadsUpManagerPhone, + private val statusBarStateController: StatusBarStateController, + private val bypassController: KeyguardBypassController) + : OnHeadsUpChangedListener, StatusBarStateController.StateListener, + PanelExpansionListener { private val mNotificationVisibility = object : FloatProperty<NotificationWakeUpCoordinator>("notificationVisibility") { @@ -57,12 +63,36 @@ class NotificationWakeUpCoordinator @Inject constructor( private var mNotificationVisibleAmount = 0.0f private var mNotificationsVisible = false private var mNotificationsVisibleForExpansion = false - private var mDarkAnimator: ObjectAnimator? = null + private var mVisibilityAnimator: ObjectAnimator? = null private var mVisibilityAmount = 0.0f private var mLinearVisibilityAmount = 0.0f - private var mWakingUp = false private val mEntrySetToClearWhenFinished = mutableSetOf<NotificationEntry>() - private val mDozeParameters: DozeParameters; + private val mDozeParameters: DozeParameters + private var pulseExpanding: Boolean = false + private val wakeUpListeners = arrayListOf<WakeUpListener>() + private var state: Int = StatusBarState.KEYGUARD + + var fullyAwake: Boolean = false + + var wakingUp = false + set(value) { + field = value + willWakeUp = false + if (value) { + if (mNotificationsVisible && !mNotificationsVisibleForExpansion + && !bypassController.bypassEnabled) { + // We're waking up while pulsing, let's make sure the animation looks nice + mStackScroller.wakeUpFromPulse(); + } + if (bypassController.bypassEnabled && !mNotificationsVisible) { + // Let's make sure our huns become visible once we are waking up in case + // they were blocked by the proximity sensor + updateNotificationVisibility(animate = shouldAnimateVisibility(), + increaseSpeed = false) + } + } + } + var willWakeUp = false set(value) { if (!value || mDozeAmount != 0.0f) { @@ -70,6 +100,9 @@ class NotificationWakeUpCoordinator @Inject constructor( } } + private var collapsedEnoughToHide: Boolean = false + lateinit var iconAreaController : NotificationIconAreaController + var pulsing: Boolean = false set(value) { field = value @@ -82,17 +115,66 @@ class NotificationWakeUpCoordinator @Inject constructor( } } + var notificationsFullyHidden: Boolean = false + private set(value) { + if (field != value) { + field = value + for (listener in wakeUpListeners) { + listener.onFullyHiddenChanged(value) + } + } + } + /** + * True if we can show pulsing heads up notifications + */ + var canShowPulsingHuns: Boolean = false + private set + get() { + var canShow = pulsing + if (bypassController.bypassEnabled) { + // We also allow pulsing on the lock screen! + canShow = canShow || (wakingUp || willWakeUp || fullyAwake) + && statusBarStateController.state == StatusBarState.KEYGUARD + // We want to hide the notifications when collapsed too much + if (collapsedEnoughToHide) { + canShow = false + } + } + return canShow + } init { - mAmbientPulseManager.addListener(this) - mStatusBarStateController.addCallback(this) + mHeadsUpManagerPhone.addListener(this) + statusBarStateController.addCallback(this) mDozeParameters = DozeParameters.getInstance(mContext) + addListener(object : WakeUpListener { + override fun onFullyHiddenChanged(isFullyHidden: Boolean) { + if (isFullyHidden && mNotificationsVisibleForExpansion) { + // When the notification becomes fully invisible, let's make sure our expansion + // flag also changes. This can happen if the bouncer shows when dragging down + // and then the screen turning off, where we don't reset this state. + setNotificationsVisibleForExpansion(visible = false, animate = false, + increaseSpeed = false) + } + } + }); } fun setStackScroller(stackScroller: NotificationStackScrollLayout) { mStackScroller = stackScroller + pulseExpanding = stackScroller.isPulseExpanding + stackScroller.setOnPulseHeightChangedListener { + val nowExpanding = isPulseExpanding() + val changed = nowExpanding != pulseExpanding + pulseExpanding = nowExpanding + for (listener in wakeUpListeners) { + listener.onPulseExpansionChanged(changed) + } + } } + fun isPulseExpanding(): Boolean = mStackScroller.isPulseExpanding + /** * @param visible should notifications be visible * @param animate should this change be animated @@ -106,14 +188,24 @@ class NotificationWakeUpCoordinator @Inject constructor( // If we stopped expanding and we're still visible because we had a pulse that hasn't // times out, let's release them all to make sure were not stuck in a state where // notifications are visible - mAmbientPulseManager.releaseAllImmediately() + mHeadsUpManagerPhone.releaseAllImmediately() } } + fun addListener(listener: WakeUpListener) { + wakeUpListeners.add(listener); + } + + fun removeListener(listener: WakeUpListener) { + wakeUpListeners.remove(listener); + } + private fun updateNotificationVisibility(animate: Boolean, increaseSpeed: Boolean) { - var visible = (mNotificationsVisibleForExpansion || mAmbientPulseManager.hasNotifications()) - && pulsing; - if (!visible && mNotificationsVisible && (mWakingUp || willWakeUp) && mDozeAmount != 0.0f) { + // TODO: handle Lockscreen wakeup for bypass when we're not pulsing anymore + var visible = mNotificationsVisibleForExpansion || mHeadsUpManagerPhone.hasNotifications() + visible = visible && canShowPulsingHuns + + if (!visible && mNotificationsVisible && (wakingUp || willWakeUp) && mDozeAmount != 0.0f) { // let's not make notifications invisible while waking up, otherwise the animation // is strange return; @@ -127,7 +219,7 @@ class NotificationWakeUpCoordinator @Inject constructor( return } mNotificationsVisible = visible - mDarkAnimator?.cancel(); + mVisibilityAnimator?.cancel(); if (animate) { notifyAnimationStart(visible) startVisibilityAnimation(increaseSpeed) @@ -137,22 +229,67 @@ class NotificationWakeUpCoordinator @Inject constructor( } override fun onDozeAmountChanged(linear: Float, eased: Float) { + if (updateDozeAmountIfBypass()) { + return + } if (linear != 1.0f && linear != 0.0f && (mLinearDozeAmount == 0.0f || mLinearDozeAmount == 1.0f)) { // Let's notify the scroller that an animation started notifyAnimationStart(mLinearDozeAmount == 1.0f) } + setDozeAmount(linear, eased) + } + + fun setDozeAmount(linear: Float, eased: Float) { + val changed = linear != mLinearDozeAmount mLinearDozeAmount = linear mDozeAmount = eased mStackScroller.setDozeAmount(mDozeAmount) - updateDarkAmount() - if (linear == 0.0f) { + updateHideAmount() + if (changed && linear == 0.0f) { setNotificationsVisible(visible = false, animate = false, increaseSpeed = false); setNotificationsVisibleForExpansion(visible = false, animate = false, increaseSpeed = false) } } + override fun onStateChanged(newState: Int) { + updateDozeAmountIfBypass(); + if (bypassController.bypassEnabled && + newState == StatusBarState.KEYGUARD && state == StatusBarState.SHADE_LOCKED + && (!statusBarStateController.isDozing || shouldAnimateVisibility())) { + // We're leaving shade locked. Let's animate the notifications away + setNotificationsVisible(visible = true, increaseSpeed = false, animate = false) + setNotificationsVisible(visible = false, increaseSpeed = false, animate = true) + } + this.state = newState + } + + override fun onPanelExpansionChanged(expansion: Float, tracking: Boolean) { + val collapsedEnough = expansion <= 0.9f + if (collapsedEnough != this.collapsedEnoughToHide) { + val couldShowPulsingHuns = canShowPulsingHuns; + this.collapsedEnoughToHide = collapsedEnough + if (couldShowPulsingHuns && !canShowPulsingHuns) { + updateNotificationVisibility(animate = true, increaseSpeed = true) + mHeadsUpManagerPhone.releaseAllImmediately() + } + } + } + + private fun updateDozeAmountIfBypass(): Boolean { + if (bypassController.bypassEnabled) { + var amount = 1.0f; + if (statusBarStateController.state == StatusBarState.SHADE + || statusBarStateController.state == StatusBarState.SHADE_LOCKED) { + amount = 0.0f; + } + setDozeAmount(amount, amount) + return true + } + return false + } + private fun startVisibilityAnimation(increaseSpeed: Boolean) { if (mNotificationVisibleAmount == 0f || mNotificationVisibleAmount == 1f) { mVisibilityInterpolator = if (mNotificationsVisible) @@ -161,15 +298,15 @@ class NotificationWakeUpCoordinator @Inject constructor( Interpolators.FAST_OUT_SLOW_IN_REVERSE } val target = if (mNotificationsVisible) 1.0f else 0.0f - val darkAnimator = ObjectAnimator.ofFloat(this, mNotificationVisibility, target) - darkAnimator.setInterpolator(Interpolators.LINEAR) + val visibilityAnimator = ObjectAnimator.ofFloat(this, mNotificationVisibility, target) + visibilityAnimator.setInterpolator(Interpolators.LINEAR) var duration = StackStateAnimator.ANIMATION_DURATION_WAKEUP.toLong() if (increaseSpeed) { duration = (duration.toFloat() / 1.5F).toLong(); } - darkAnimator.setDuration(duration) - darkAnimator.start() - mDarkAnimator = darkAnimator + visibilityAnimator.setDuration(duration) + visibilityAnimator.start() + mVisibilityAnimator = visibilityAnimator } private fun setVisibilityAmount(visibilityAmount: Float) { @@ -177,28 +314,29 @@ class NotificationWakeUpCoordinator @Inject constructor( mVisibilityAmount = mVisibilityInterpolator.getInterpolation( visibilityAmount) handleAnimationFinished(); - updateDarkAmount() + updateHideAmount() } private fun handleAnimationFinished() { if (mLinearDozeAmount == 0.0f || mLinearVisibilityAmount == 0.0f) { - mEntrySetToClearWhenFinished.forEach { it.setAmbientGoingAway(false) } + mEntrySetToClearWhenFinished.forEach { it.setHeadsUpAnimatingAway(false) } mEntrySetToClearWhenFinished.clear() } } fun getWakeUpHeight() : Float { - return mStackScroller.pulseHeight + return mStackScroller.wakeUpHeight } - private fun updateDarkAmount() { + private fun updateHideAmount() { val linearAmount = Math.min(1.0f - mLinearVisibilityAmount, mLinearDozeAmount) val amount = Math.min(1.0f - mVisibilityAmount, mDozeAmount) - mStackScroller.setDarkAmount(linearAmount, amount) + mStackScroller.setHideAmount(linearAmount, amount) + notificationsFullyHidden = linearAmount == 1.0f; } private fun notifyAnimationStart(awake: Boolean) { - mStackScroller.notifyDarkAnimationStart(!awake) + mStackScroller.notifyHideAnimationStart(!awake) } override fun onDozingChanged(isDozing: Boolean) { @@ -207,39 +345,50 @@ class NotificationWakeUpCoordinator @Inject constructor( } } + /** + * Set the height how tall notifications are pulsing. This is only set whenever we are expanding + * from a pulse and determines how much the notifications are expanded. + */ fun setPulseHeight(height: Float): Float { - return mStackScroller.setPulseHeight(height) + val overflow = mStackScroller.setPulseHeight(height) + // no overflow for the bypass experience + return if (bypassController.bypassEnabled) 0.0f else overflow } - fun setWakingUp(wakingUp: Boolean) { - willWakeUp = false - mWakingUp = wakingUp - if (wakingUp && mNotificationsVisible && !mNotificationsVisibleForExpansion) { - // We're waking up while pulsing, let's make sure the animation looks nice - mStackScroller.wakeUpFromPulse(); - } - } - - override fun onAmbientStateChanged(entry: NotificationEntry, isPulsing: Boolean) { + override fun onHeadsUpStateChanged(entry: NotificationEntry, isHeadsUp: Boolean) { var animate = shouldAnimateVisibility() - if (!isPulsing) { + if (!isHeadsUp) { if (mLinearDozeAmount != 0.0f && mLinearVisibilityAmount != 0.0f) { if (entry.isRowDismissed) { // if we animate, we see the shelf briefly visible. Instead we fully animate // the notification and its background out animate = false - } else if (!mWakingUp && !willWakeUp){ - entry.setAmbientGoingAway(true) + } else if (!wakingUp && !willWakeUp){ + // TODO: look that this is done properly and not by anyone else + entry.setHeadsUpAnimatingAway(true) mEntrySetToClearWhenFinished.add(entry) } } } else if (mEntrySetToClearWhenFinished.contains(entry)) { mEntrySetToClearWhenFinished.remove(entry) - entry.setAmbientGoingAway(false) + entry.setHeadsUpAnimatingAway(false) } updateNotificationVisibility(animate, increaseSpeed = false) } private fun shouldAnimateVisibility() = mDozeParameters.getAlwaysOn() && !mDozeParameters.getDisplayNeedsBlanking() + + interface WakeUpListener { + /** + * Called whenever the notifications are fully hidden or shown + */ + @JvmDefault fun onFullyHiddenChanged(isFullyHidden: Boolean) {} + + /** + * Called whenever the pulseExpansion changes + * @param expandingChanged if the user has started or stopped expanding + */ + @JvmDefault fun onPulseExpansionChanged(expandingChanged: Boolean) {} + } }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/PropertyAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/PropertyAnimator.java index aacb22ddaa90..fe565529db32 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/PropertyAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/PropertyAnimator.java @@ -115,7 +115,20 @@ public class PropertyAnimator { view.setTag(animationEndTag, newEndValue); } - public static <T extends View> boolean isAnimating(T view, AnimatableProperty property) { - return view.getTag(property.getAnimatorTag()) != null; + public static <T extends View> void applyImmediately(T view, AnimatableProperty property, + float newValue) { + cancelAnimation(view, property); + property.getProperty().set(view, newValue); + } + + public static void cancelAnimation(View view, AnimatableProperty property) { + ValueAnimator animator = (ValueAnimator) view.getTag(property.getAnimatorTag()); + if (animator != null) { + animator.cancel(); + } + } + + public static boolean isAnimating(View view, AnimatableProperty property) { + return view.getTag(property.getAnimatorTag()) != null; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt new file mode 100644 index 000000000000..847d1ccddddf --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.notification + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.ValueAnimator +import android.view.View +import android.view.ViewGroup +import com.android.systemui.Interpolators +import com.android.systemui.R + +/** + * Class to help with fading of view groups without fading one subview + */ +class ViewGroupFadeHelper { + companion object { + private val visibilityIncluder = { + view: View -> view.visibility == View.VISIBLE + } + + /** + * Fade out all views of a root except a single child. This will iterate over all children + * of the view and make sure that the animation works smoothly. + * @param root the view root to fade the children away + * @param excludedView which view should remain + * @param duration the duration of the animation + */ + @JvmStatic + fun fadeOutAllChildrenExcept(root: ViewGroup, excludedView: View, duration: Long, + endRunnable: Runnable?) { + // starting from the view going up, we are adding the siblings of the child to the set + // of views that need to be faded. + val viewsToFadeOut = gatherViews(root, excludedView, visibilityIncluder) + + // Applying the right layertypes for the animation + for (viewToFade in viewsToFadeOut) { + if (viewToFade.hasOverlappingRendering + && viewToFade.layerType == View.LAYER_TYPE_NONE) { + viewToFade.setLayerType(View.LAYER_TYPE_HARDWARE, null) + viewToFade.setTag(R.id.view_group_fade_helper_hardware_layer, true) + } + } + + val animator = ValueAnimator.ofFloat(1.0f, 0.0f).apply { + this.duration = duration + interpolator = Interpolators.ALPHA_OUT + addUpdateListener { animation -> + val previousSetAlpha = root.getTag( + R.id.view_group_fade_helper_previous_value_tag) as Float? + val newAlpha = animation.animatedValue as Float + for (viewToFade in viewsToFadeOut) { + if (viewToFade.alpha != previousSetAlpha) { + // A value was set that wasn't set from our view, let's store it and restore + // it at the end + viewToFade.setTag(R.id.view_group_fade_helper_restore_tag, viewToFade.alpha) + } + viewToFade.alpha = newAlpha + } + root.setTag(R.id.view_group_fade_helper_previous_value_tag, newAlpha) + } + addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator?) { + endRunnable?.run() + } + }) + start() + } + root.setTag(R.id.view_group_fade_helper_modified_views, viewsToFadeOut) + root.setTag(R.id.view_group_fade_helper_animator, animator) + } + + private fun gatherViews(root: ViewGroup, excludedView: View, + shouldInclude: (View) -> Boolean): MutableSet<View> { + val viewsToFadeOut = mutableSetOf<View>() + var parent = excludedView.parent as ViewGroup? + var viewContainingExcludedView = excludedView; + while (parent != null) { + for (i in 0 until parent.childCount) { + val child = parent.getChildAt(i) + if (shouldInclude.invoke(child) && viewContainingExcludedView != child) { + viewsToFadeOut.add(child) + } + } + if (parent == root) { + break; + } + viewContainingExcludedView = parent + parent = parent.parent as ViewGroup? + } + return viewsToFadeOut + } + + /** + * Reset all view alphas for views previously transformed away. + */ + @JvmStatic + fun reset(root: ViewGroup) { + @Suppress("UNCHECKED_CAST") + val modifiedViews = root.getTag(R.id.view_group_fade_helper_modified_views) + as MutableSet<View>? + val animator = root.getTag(R.id.view_group_fade_helper_animator) as Animator? + if (modifiedViews == null || animator == null) { + // nothing to restore + return + } + animator.cancel() + val lastSetValue = root.getTag( + R.id.view_group_fade_helper_previous_value_tag) as Float? + for (viewToFade in modifiedViews) { + val restoreAlpha = viewToFade.getTag( + R.id.view_group_fade_helper_restore_tag) as Float? + if (restoreAlpha == null) { + continue + } + if (lastSetValue == viewToFade.alpha) { + // it was modified after the transition! + viewToFade.alpha = restoreAlpha + } + val needsLayerReset = viewToFade.getTag( + R.id.view_group_fade_helper_hardware_layer) as Boolean? + if (needsLayerReset == true) { + viewToFade.setLayerType(View.LAYER_TYPE_NONE, null) + viewToFade.setTag(R.id.view_group_fade_helper_hardware_layer, null) + } + viewToFade.setTag(R.id.view_group_fade_helper_restore_tag, null) + } + root.setTag(R.id.view_group_fade_helper_modified_views, null) + root.setTag(R.id.view_group_fade_helper_previous_value_tag, null) + root.setTag(R.id.view_group_fade_helper_animator, null) + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java index 13f8f1a6a548..1ce493444e25 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationData.java @@ -122,8 +122,6 @@ public class NotificationData { } else if (aHeadsUp) { // Provide consistent ranking with headsUpManager return mHeadsUpManager.compare(a, b); - } else if (a.getRow().showingAmbientPulsing() != b.getRow().showingAmbientPulsing()) { - return a.getRow().showingAmbientPulsing() ? -1 : 1; } else if (aMedia != bMedia) { // Upsort current media notification. return aMedia ? -1 : 1; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index d157f06c03e9..fe8854168288 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -96,6 +96,7 @@ public final class NotificationEntry { public StatusBarIconView icon; public StatusBarIconView expandedIcon; public StatusBarIconView centeredIcon; + public StatusBarIconView aodIcon; private boolean interruption; public boolean autoRedacted; // whether the redacted notification was generated by us public int targetSdk; @@ -175,6 +176,11 @@ public final class NotificationEntry { private boolean mIsTopBucket; + private boolean mSensitive = true; + private Runnable mOnSensitiveChangedListener; + private boolean mAutoHeadsUp; + private boolean mPulseSupressed; + public NotificationEntry(StatusBarNotification n) { this(n, null); } @@ -350,6 +356,12 @@ public final class NotificationEntry { sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId()), sbn); expandedIcon.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + // Construct the expanded icon. + aodIcon = new StatusBarIconView(context, + sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId()), sbn); + aodIcon.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + aodIcon.setIncreasedSize(true); + final StatusBarIcon ic = new StatusBarIcon( sbn.getUser(), sbn.getPackageName(), @@ -358,10 +370,11 @@ public final class NotificationEntry { n.number, StatusBarIconView.contentDescForNotification(context, n)); - if (!icon.set(ic) || !expandedIcon.set(ic)) { + if (!icon.set(ic) || !expandedIcon.set(ic) || !aodIcon.set(ic)) { icon = null; expandedIcon = null; centeredIcon = null; + aodIcon = null; throw new InflationException("Couldn't create icon: " + ic); } expandedIcon.setVisibility(View.INVISIBLE); @@ -394,6 +407,10 @@ public final class NotificationEntry { if (centeredIcon != null) { centeredIcon.setTag(key, tag); } + + if (aodIcon != null) { + aodIcon.setTag(key, tag); + } } /** @@ -417,7 +434,8 @@ public final class NotificationEntry { StatusBarIconView.contentDescForNotification(context, n)); icon.setNotification(sbn); expandedIcon.setNotification(sbn); - if (!icon.set(ic) || !expandedIcon.set(ic)) { + aodIcon.setNotification(sbn); + if (!icon.set(ic) || !expandedIcon.set(ic) || !aodIcon.set(ic)) { throw new InflationException("Couldn't update icon: " + ic); } @@ -629,10 +647,6 @@ public final class NotificationEntry { if (row != null) row.freeContentViewWhenSafe(inflationFlag); } - public void setAmbientPulsing(boolean pulsing) { - if (row != null) row.setAmbientPulsing(pulsing); - } - public boolean rowExists() { return row != null; } @@ -661,23 +675,37 @@ public final class NotificationEntry { if (row != null) row.setPinned(pinned); } - public boolean isRowAnimatingAway() { - return row != null && row.isHeadsUpAnimatingAway(); - } - public boolean isRowHeadsUp() { return row != null && row.isHeadsUp(); } + public boolean showingPulsing() { + return row != null && row.showingPulsing(); + } + public void setHeadsUp(boolean shouldHeadsUp) { if (row != null) row.setHeadsUp(shouldHeadsUp); } + public void setHeadsUpAnimatingAway(boolean animatingAway) { + if (row != null) row.setHeadsUpAnimatingAway(animatingAway); + } - public void setAmbientGoingAway(boolean goingAway) { - if (row != null) row.setAmbientGoingAway(goingAway); + /** + * Set that this notification was automatically heads upped. This happens for example when + * the user bypasses the lockscreen and media is playing. + */ + public void setAutoHeadsUp(boolean autoHeadsUp) { + mAutoHeadsUp = autoHeadsUp; } + /** + * @return if this notification was automatically heads upped. This happens for example when + * * the user bypasses the lockscreen and media is playing. + */ + public boolean isAutoHeadsUp() { + return mAutoHeadsUp; + } public boolean mustStayOnScreen() { return row != null && row.mustStayOnScreen(); @@ -864,6 +892,38 @@ public final class NotificationEntry { return Objects.equals(n.category, category); } + /** + * Set this notification to be sensitive. + * + * @param sensitive true if the content of this notification is sensitive right now + * @param deviceSensitive true if the device in general is sensitive right now + */ + public void setSensitive(boolean sensitive, boolean deviceSensitive) { + getRow().setSensitive(sensitive, deviceSensitive); + if (sensitive != mSensitive) { + mSensitive = sensitive; + if (mOnSensitiveChangedListener != null) { + mOnSensitiveChangedListener.run(); + } + } + } + + public boolean isSensitive() { + return mSensitive; + } + + public void setOnSensitiveChangedListener(Runnable listener) { + mOnSensitiveChangedListener = listener; + } + + public boolean isPulseSuppressed() { + return mPulseSupressed; + } + + public void setPulseSuppressed(boolean suppressed) { + mPulseSupressed = suppressed; + } + /** Information about a suggestion that is being edited. */ public static class EditedSuggestionInfo { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinderImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinderImpl.java index d3e5af8c729e..247c31fc80a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinderImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinderImpl.java @@ -18,7 +18,6 @@ package com.android.systemui.statusbar.notification.collection; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.systemui.statusbar.NotificationRemoteInputManager.ENABLE_REMOTE_INPUT; -import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_AMBIENT; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_HEADS_UP; import android.annotation.Nullable; @@ -34,6 +33,7 @@ import com.android.internal.util.NotificationMessagingUtil; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.UiOffloadThread; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationPresenter; import com.android.systemui.statusbar.NotificationRemoteInputManager; @@ -47,6 +47,7 @@ import com.android.systemui.statusbar.notification.row.NotificationContentInflat import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.row.RowInflaterTask; import com.android.systemui.statusbar.notification.stack.NotificationListContainer; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.HeadsUpManager; @@ -69,6 +70,8 @@ public class NotificationRowBinderImpl implements NotificationRowBinder { private final ExpandableNotificationRow.ExpansionLogger mExpansionLogger = this::logNotificationExpansion; private final boolean mAllowLongPress; + private final KeyguardBypassController mKeyguardBypassController; + private final StatusBarStateController mStatusBarStateController; private NotificationRemoteInputManager mRemoteInputManager; private NotificationPresenter mPresenter; @@ -80,10 +83,14 @@ public class NotificationRowBinderImpl implements NotificationRowBinder { private NotificationClicker mNotificationClicker; private final NotificationLogger mNotificationLogger = Dependency.get(NotificationLogger.class); - public NotificationRowBinderImpl(Context context, boolean allowLongPress) { + public NotificationRowBinderImpl(Context context, boolean allowLongPress, + KeyguardBypassController keyguardBypassController, + StatusBarStateController statusBarStateController) { mContext = context; mMessagingUtil = new NotificationMessagingUtil(context); mAllowLongPress = allowLongPress; + mKeyguardBypassController = keyguardBypassController; + mStatusBarStateController = statusBarStateController; } private NotificationRemoteInputManager getRemoteInputManager() { @@ -144,6 +151,8 @@ public class NotificationRowBinderImpl implements NotificationRowBinder { StatusBarNotification sbn, ExpandableNotificationRow row, Runnable onDismissRunnable) { row.setExpansionLogger(mExpansionLogger, entry.notification.getKey()); + row.setBypassController(mKeyguardBypassController); + row.setStatusBarStateController(mStatusBarStateController); row.setGroupManager(mGroupManager); row.setHeadsUpManager(mHeadsUpManager); row.setOnExpandClickListener(mPresenter); @@ -249,9 +258,6 @@ public class NotificationRowBinderImpl implements NotificationRowBinder { if (mNotificationInterruptionStateProvider.shouldHeadsUp(entry)) { row.updateInflationFlag(FLAG_CONTENT_VIEW_HEADS_UP, true /* shouldInflate */); } - if (mNotificationInterruptionStateProvider.shouldPulse(entry)) { - row.updateInflationFlag(FLAG_CONTENT_VIEW_AMBIENT, true /* shouldInflate */); - } row.setNeedsRedaction( Dependency.get(NotificationLockscreenUserManager.class).needsRedaction(entry)); row.inflateViews(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java index 94f7e651d73d..81275fda57e5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/logging/NotificationLogger.java @@ -101,7 +101,7 @@ public class NotificationLogger implements StateListener { // Tracks notifications currently visible in mNotificationStackScroller and // emits visibility events via NoMan on changes. - protected final Runnable mVisibilityReporter = new Runnable() { + protected Runnable mVisibilityReporter = new Runnable() { private final ArraySet<NotificationVisibility> mTmpNewlyVisibleNotifications = new ArraySet<>(); private final ArraySet<NotificationVisibility> mTmpCurrentlyVisibleNotifications = @@ -407,6 +407,11 @@ public class NotificationLogger implements StateListener { mExpansionStateLogger.onExpansionChanged(key, isUserAction, isExpanded, location); } + @VisibleForTesting + public void setVisibilityReporter(Runnable visibilityReporter) { + mVisibilityReporter = visibilityReporter; + } + /** * A listener that is notified when some child locations might have changed. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java index 94face2581b3..dca152fbe37a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java @@ -52,7 +52,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView private static final int BACKGROUND_ANIMATION_LENGTH_MS = 220; private static final int ACTIVATE_ANIMATION_LENGTH = 220; - private static final long DARK_ANIMATION_LENGTH = StackStateAnimator.ANIMATION_DURATION_WAKEUP; /** * The amount of width, which is kept in the end when performing a disappear animation (also @@ -85,11 +84,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView private static final float VERTICAL_ANIMATION_START = 1.0f; /** - * Scale for the background to animate from when exiting dark mode. - */ - private static final float DARK_EXIT_SCALE_START = 0.93f; - - /** * A sentinel value when no color should be used. Can be used with {@link #setTintColor(int)} * or {@link #setOverrideTintColor(int, float)}. */ @@ -105,7 +99,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView private final DoubleTapHelper mDoubleTapHelper; private boolean mDimmed; - protected boolean mDark; protected int mBgTint = NO_COLOR; private float mBgAlpha = 1f; @@ -440,16 +433,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView return true; } - public void setDark(boolean dark, boolean fade, long delay) { - super.setDark(dark, fade, delay); - if (mDark == dark) { - return; - } - mDark = dark; - updateBackground(); - updateBackgroundTint(false); - } - private void updateOutlineAlpha() { float alpha = NotificationStackScrollLayout.BACKGROUND_ALPHA_DIMMED; alpha = (alpha + (1.0f - alpha) * mNormalBackgroundVisibilityAmount); @@ -542,10 +525,6 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView * used and the background color not at all. */ public void setOverrideTintColor(int color, float overrideAmount) { - if (mDark) { - color = NO_COLOR; - overrideAmount = 0; - } mOverrideTint = color; mOverrideAmount = overrideAmount; int newColor = calculateBgColor(); @@ -1057,6 +1036,14 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView return false; } + public boolean isHeadsUp() { + return false; + } + + public int getHeadsUpHeightWithoutHeader() { + return getHeight(); + } + public interface OnActivatedListener { void onActivated(ActivatableNotificationView view); void onActivationReset(ActivatableNotificationView view); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt index 8e6822770694..782aad17345e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorDialogController.kt @@ -23,6 +23,7 @@ import android.app.NotificationChannel.DEFAULT_CHANNEL_ID import android.app.NotificationChannelGroup import android.app.NotificationManager.IMPORTANCE_NONE import android.content.Context +import android.content.DialogInterface import android.graphics.Color import android.graphics.PixelFormat import android.graphics.drawable.Drawable @@ -171,7 +172,6 @@ class ChannelEditorDialogController @Inject constructor( private fun done() { resetState() dialog.dismiss() - onFinishListener?.onChannelEditorDialogFinished() } private fun resetState() { @@ -261,6 +261,11 @@ class ChannelEditorDialogController @Inject constructor( dialog.apply { setContentView(R.layout.notif_half_shelf) setCanceledOnTouchOutside(true) + setOnDismissListener(object : DialogInterface.OnDismissListener { + override fun onDismiss(dialog: DialogInterface?) { + onFinishListener?.onChannelEditorDialogFinished() + } + }) findViewById<ChannelEditorListView>(R.id.half_shelf_container).apply { controller = this@ChannelEditorDialogController appIcon = this@ChannelEditorDialogController.appIcon 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 d625b318487d..a8327f63dcf7 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 @@ -17,11 +17,9 @@ package com.android.systemui.statusbar.notification.row; import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator.ExpandAnimationParameters; -import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_AMBIENT; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_HEADS_UP; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_PUBLIC; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.InflationCallback; -import static com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_AMBIENT; import static com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_CONTRACTED; import static com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_HEADSUP; @@ -81,6 +79,7 @@ import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.PluginListener; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.RemoteInputController; @@ -98,6 +97,7 @@ import com.android.systemui.statusbar.notification.stack.AnimationProperties; import com.android.systemui.statusbar.notification.stack.ExpandableViewState; import com.android.systemui.statusbar.notification.stack.NotificationChildrenContainer; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.HeadsUpManager; @@ -127,14 +127,16 @@ public class ExpandableNotificationRow extends ActivatableNotificationView private static final long RECENTLY_ALERTED_THRESHOLD_MS = TimeUnit.SECONDS.toMillis(30); private boolean mUpdateBackgroundOnUpdate; private boolean mNotificationTranslationFinished = false; - /** * Listener for when {@link ExpandableNotificationRow} is laid out. */ public interface LayoutListener { void onLayout(); + } + private StatusBarStateController mStatusbarStateController; + private KeyguardBypassController mBypassController; private LayoutListener mLayoutListener; private final NotificationContentInflater mNotificationInflater; private int mIconTransformContentShift; @@ -187,11 +189,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView */ private boolean mOnKeyguard; - /** - * Whether or not the row is currently on the doze screen. - */ - private boolean mOnAmbient; - private Animator mTranslateAnim; private ArrayList<View> mTranslateableViews; private NotificationContentView mPublicLayout; @@ -211,17 +208,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView private boolean mIsHeadsUp; /** - * Whether or not the notification is using the ambient display view and is pulsing. This - * occurs when a high priority notification alerts while the phone is dozing or is on AOD. - */ - private boolean mIsAmbientPulsing; - - /** - * Happens when the notification was pulsing before and goes away to ensure smooth animations. - */ - private boolean mAmbientGoingAway; - - /** * Whether or not the notification should be redacted on the lock screen, i.e has sensitive * content which should be redacted on the lock screen. */ @@ -341,7 +327,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView private SystemNotificationAsyncTask mSystemNotificationAsyncTask = new SystemNotificationAsyncTask(); - private int mStatusBarState = -1; /** * Returns whether the given {@code statusBarNotification} is a system notification. @@ -487,12 +472,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView getPrivateLayout().performWhenContentInactive(VISIBLE_TYPE_HEADSUP, freeViewRunnable); break; - case FLAG_CONTENT_VIEW_AMBIENT: - getPrivateLayout().performWhenContentInactive(VISIBLE_TYPE_AMBIENT, - freeViewRunnable); - getPublicLayout().performWhenContentInactive(VISIBLE_TYPE_AMBIENT, - freeViewRunnable); - break; case FLAG_CONTENT_VIEW_PUBLIC: getPublicLayout().performWhenContentInactive(VISIBLE_TYPE_CONTRACTED, freeViewRunnable); @@ -648,7 +627,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView if (!getShowingLayout().isDimmable()) { return false; } - if (showingAmbientPulsing()) { + if (showingPulsing()) { return false; } return super.isDimmable(); @@ -698,7 +677,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView if (headsUpWrapper != null) { headsUpHeight = Math.max(headsUpHeight, headsUpWrapper.getMinLayoutHeight()); } - layout.setHeights(minHeight, headsUpHeight, mNotificationMaxHeight, headsUpHeight); + layout.setHeights(minHeight, headsUpHeight, mNotificationMaxHeight); } public StatusBarNotification getStatusBarNotification() { @@ -709,6 +688,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView return mEntry; } + @Override public boolean isHeadsUp() { return mIsHeadsUp; } @@ -734,14 +714,18 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } @Override - public boolean showingAmbientPulsing() { - return mIsAmbientPulsing || mAmbientGoingAway; + public boolean showingPulsing() { + return isHeadsUpState() && (isDozing() || (mOnKeyguard && isBypassEnabled())); } - public void setAmbientPulsing(boolean isAmbientPulsing) { - mIsAmbientPulsing = isAmbientPulsing; + /** + * @return if the view is in heads up state, i.e either still heads upped or it's disappearing. + */ + public boolean isHeadsUpState() { + return mIsHeadsUp || mHeadsupDisappearRunning; } + public void setGroupManager(NotificationGroupManager groupManager) { mGroupManager = groupManager; mPrivateLayout.setGroupManager(groupManager); @@ -1660,6 +1644,14 @@ public class ExpandableNotificationRow extends ActivatableNotificationView initDimens(); } + public void setBypassController(KeyguardBypassController bypassController) { + mBypassController = bypassController; + } + + public void setStatusBarStateController(StatusBarStateController statusBarStateController) { + mStatusbarStateController = statusBarStateController; + } + private void initDimens() { mNotificationMinHeightBeforeN = NotificationUtils.getFontScaledHeight(mContext, R.dimen.notification_min_height_legacy); @@ -2050,23 +2042,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView return false; } - @Override - public void setDark(boolean dark, boolean fade, long delay) { - if (mDark == dark) { - return; - } - super.setDark(dark, fade, delay); - if (!mIsAmbientPulsing) { - // Only fade the showing view of the pulsing notification. - fade = false; - } - final NotificationContentView showing = getShowingLayout(); - if (showing != null) { - showing.setDark(dark, fade, delay); - } - updateShelfIconColor(); - } - public void applyExpandAnimationParams(ExpandAnimationParameters params) { if (params == null) { return; @@ -2180,7 +2155,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView */ @Override public boolean isSoundEffectsEnabled() { - final boolean mute = mDark && mSecureStateProvider != null && + final boolean mute = mStatusbarStateController != null + && mStatusbarStateController.isDozing() + && mSecureStateProvider != null && !mSecureStateProvider.getAsBoolean(); return !mute && super.isSoundEffectsEnabled(); } @@ -2345,9 +2322,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView return mPrivateLayout.getMinHeight(); } else if (mSensitive && mHideSensitiveForIntrinsicHeight) { return getMinHeight(); - } else if (mIsSummaryWithChildren && !mOnKeyguard) { + } else if (mIsSummaryWithChildren) { return mChildrenContainer.getIntrinsicHeight(); - } else if (isHeadsUpAllowed() && (mIsHeadsUp || mHeadsupDisappearRunning)) { + } else if (canShowHeadsUp() && isHeadsUpState()) { if (isPinned() || mHeadsupDisappearRunning) { return getPinnedHeadsUpHeight(true /* atLeastMinHeight */); } else if (isExpanded()) { @@ -2362,22 +2339,27 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } } - private boolean isHeadsUpAllowed() { - return !mOnKeyguard && !mOnAmbient; + /** + * @return {@code true} if the notification can show it's heads up layout. This is mostly true + * except for legacy use cases. + */ + public boolean canShowHeadsUp() { + if (mOnKeyguard && !isDozing() && !isBypassEnabled()) { + return false; + } + return true; } - private boolean isShownAsBubble() { - return mEntry.isBubble() && !mEntry.showInShadeWhenBubble() && !mEntry.isBubbleDismissed(); + private boolean isBypassEnabled() { + return mBypassController == null || mBypassController.getBypassEnabled(); } - /** - * Set the current status bar state. - * @param state should be from {@link com.android.systemui.statusbar.StatusBarState}. - */ - public void setStatusBarState(int state) { - if (mStatusBarState != state) { - mStatusBarState = state; - } + private boolean isDozing() { + return mStatusbarStateController != null && mStatusbarStateController.isDozing(); + } + + private boolean isShownAsBubble() { + return mEntry.isBubble() && !mEntry.showInShadeWhenBubble() && !mEntry.isBubbleDismissed(); } @Override @@ -2563,7 +2545,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView showingLayout.updateBackgroundColor(animated); mPrivateLayout.updateExpandButtons(isExpandable()); updateShelfIconColor(); - showingLayout.setDark(isDark(), false /* animate */, 0 /* delay */); mShowingPublicInitialized = true; } @@ -2656,7 +2637,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView private int getHeadsUpHeight() { - return getShowingLayout().getHeadsUpHeight(); + return getShowingLayout().getHeadsUpHeight(false /* forceNoHeader */); } public boolean areGutsExposed() { @@ -2717,6 +2698,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView l.setAlpha(1.0f); l.setLayerType(LAYER_TYPE_NONE, null); } + } else { + setHeadsUpAnimatingAway(false); } } @@ -2773,12 +2756,12 @@ public class ExpandableNotificationRow extends ActivatableNotificationView public int getMinHeight(boolean ignoreTemporaryStates) { if (!ignoreTemporaryStates && mGuts != null && mGuts.isExposed()) { return mGuts.getIntrinsicHeight(); - } else if (!ignoreTemporaryStates && isHeadsUpAllowed() && mIsHeadsUp + } else if (!ignoreTemporaryStates && canShowHeadsUp() && mIsHeadsUp && mHeadsUpManager.isTrackingHeadsUp()) { return getPinnedHeadsUpHeight(false /* atLeastMinHeight */); } else if (mIsSummaryWithChildren && !isGroupExpanded() && !shouldShowPublic()) { return mChildrenContainer.getMinHeight(); - } else if (!ignoreTemporaryStates && isHeadsUpAllowed() && mIsHeadsUp) { + } else if (!ignoreTemporaryStates && canShowHeadsUp() && mIsHeadsUp) { return getHeadsUpHeight(); } NotificationContentView showingLayout = getShowingLayout(); @@ -2794,6 +2777,17 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } @Override + public int getHeadsUpHeightWithoutHeader() { + if (!canShowHeadsUp() || !mIsHeadsUp) { + return getCollapsedHeight(); + } + if (mIsSummaryWithChildren && !shouldShowPublic()) { + return mChildrenContainer.getCollapsedHeightWithoutHeader(); + } + return getShowingLayout().getHeadsUpHeight(true /* forceNoHeader */); + } + + @Override public void setClipTopAmount(int clipTopAmount) { super.setClipTopAmount(clipTopAmount); for (NotificationContentView l : mLayouts) { @@ -3050,18 +3044,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView @Override public boolean isAboveShelf() { - return showingAmbientPulsing() || (!isOnKeyguard() + return (canShowHeadsUp() && (mIsPinned || mHeadsupDisappearRunning || (mIsHeadsUp && mAboveShelf) || mExpandAnimationRunning || mChildIsExpanding)); } - public void setOnAmbient(boolean onAmbient) { - if (onAmbient != mOnAmbient) { - mOnAmbient = onAmbient; - notifyHeightChanged(false /* needsAnimation */); - } - } - @Override public boolean topAmountNeedsClipping() { if (isGroupExpanded()) { @@ -3125,10 +3112,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView return getCurrentBottomRoundness() == 0.0f && getCurrentTopRoundness() == 0.0f; } - public boolean isOnAmbient() { - return mOnAmbient; - } - //TODO: this logic can't depend on layout if we are recycling! public boolean isMediaRow() { return getExpandedContentView() != null @@ -3206,10 +3189,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } } - public void setAmbientGoingAway(boolean goingAway) { - mAmbientGoingAway = goingAway; - } - /** * Returns the Smart Suggestions backing the smart suggestion buttons in the notification. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java index cac41da52120..a0fef0068b05 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java @@ -49,7 +49,6 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable { protected int mClipBottomAmount; protected int mMinimumHeightForClipping = 0; protected float mExtraWidthForClipping = 0; - private boolean mDark; private ArrayList<View> mMatchParentViews = new ArrayList<View>(); private static Rect mClipRect = new Rect(); private boolean mWillBeGone; @@ -212,21 +211,6 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable { public void setDimmed(boolean dimmed, boolean fade) { } - /** - * Sets the notification as dark. The default implementation does nothing. - * - * @param dark Whether the notification should be dark. - * @param fade Whether an animation should be played to change the state. - * @param delay If fading, the delay of the animation. - */ - public void setDark(boolean dark, boolean fade, long delay) { - mDark = dark; - } - - public boolean isDark() { - return mDark; - } - public boolean isRemoved() { return false; } @@ -527,7 +511,7 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable { public void setHeadsUpIsVisible() { } - public boolean showingAmbientPulsing() { + public boolean showingPulsing() { return false; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java index 396cd73f9a22..48a82957bf1e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.notification.row; -import static com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_AMBIENT; import static com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_CONTRACTED; import static com.android.systemui.statusbar.notification.row.NotificationContentView.VISIBLE_TYPE_HEADSUP; @@ -51,12 +50,6 @@ import com.android.systemui.util.Assert; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.HashMap; -import java.util.concurrent.Executor; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; /** * A utility that inflates the right kind of contentView based on the state @@ -72,7 +65,6 @@ public class NotificationContentInflater { FLAG_CONTENT_VIEW_CONTRACTED, FLAG_CONTENT_VIEW_EXPANDED, FLAG_CONTENT_VIEW_HEADS_UP, - FLAG_CONTENT_VIEW_AMBIENT, FLAG_CONTENT_VIEW_PUBLIC, FLAG_CONTENT_VIEW_ALL}) public @interface InflationFlag {} @@ -93,17 +85,11 @@ public class NotificationContentInflater { public static final int FLAG_CONTENT_VIEW_HEADS_UP = 1 << 2; /** - * The ambient view. Seen when a high priority notification is received and the phone - * is dozing. - */ - public static final int FLAG_CONTENT_VIEW_AMBIENT = 1 << 3; - - /** * The public view. This is a version of the contracted view that hides sensitive * information and is used on the lock screen if we determine that the notification's * content should be hidden. */ - public static final int FLAG_CONTENT_VIEW_PUBLIC = 1 << 4; + public static final int FLAG_CONTENT_VIEW_PUBLIC = 1 << 3; public static final int FLAG_CONTENT_VIEW_ALL = ~0; @@ -128,7 +114,6 @@ public class NotificationContentInflater { private RemoteViews.OnClickHandler mRemoteViewClickHandler; private boolean mIsChildInGroup; private InflationCallback mCallback; - private boolean mRedactAmbient; private boolean mInflateSynchronously = false; private final ArrayMap<Integer, RemoteViews> mCachedContentViews = new ArrayMap<>(); @@ -169,21 +154,18 @@ public class NotificationContentInflater { /** * Update whether or not the notification is redacted on the lock screen. If the notification - * is now redacted, we should inflate the public contracted view and public ambient view to - * now show on the lock screen. + * is now redacted, we should inflate the public contracted view to now show on the lock screen. * * @param needsRedaction true if the notification should now be redacted on the lock screen */ public void updateNeedsRedaction(boolean needsRedaction) { - mRedactAmbient = needsRedaction; if (mRow.getEntry() == null) { return; } - int flags = FLAG_CONTENT_VIEW_AMBIENT; if (needsRedaction) { - flags |= FLAG_CONTENT_VIEW_PUBLIC; + int flags = FLAG_CONTENT_VIEW_PUBLIC; + inflateNotificationViews(flags); } - inflateNotificationViews(flags); } /** @@ -263,7 +245,6 @@ public class NotificationContentInflater { mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, - mRedactAmbient, mCallback, mRemoteViewClickHandler); if (mInflateSynchronously) { @@ -281,7 +262,7 @@ public class NotificationContentInflater { Context packageContext) { InflationProgress result = createRemoteViews(reInflateFlags, builder, mIsLowPriority, mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, - mRedactAmbient, packageContext); + packageContext); result = inflateSmartReplyViews(result, reInflateFlags, mRow.getEntry(), mRow.getContext(), mRow.getHeadsUpManager(), mRow.getExistingSmartRepliesAndActions()); @@ -291,7 +272,6 @@ public class NotificationContentInflater { reInflateFlags, mCachedContentViews, mRow, - mRedactAmbient, mRemoteViewClickHandler, null); return result; @@ -316,21 +296,6 @@ public class NotificationContentInflater { mRow.getPrivateLayout().setHeadsUpInflatedSmartReplies(null); } break; - case FLAG_CONTENT_VIEW_AMBIENT: - boolean privateSafeToRemove = mRow.getPrivateLayout().isContentViewInactive( - VISIBLE_TYPE_AMBIENT); - boolean publicSafeToRemove = mRow.getPublicLayout().isContentViewInactive( - VISIBLE_TYPE_AMBIENT); - if (privateSafeToRemove) { - mRow.getPrivateLayout().setAmbientChild(null); - } - if (publicSafeToRemove) { - mRow.getPublicLayout().setAmbientChild(null); - } - if (privateSafeToRemove && publicSafeToRemove) { - mCachedContentViews.remove(FLAG_CONTENT_VIEW_AMBIENT); - } - break; case FLAG_CONTENT_VIEW_PUBLIC: if (mRow.getPublicLayout().isContentViewInactive(VISIBLE_TYPE_CONTRACTED)) { mRow.getPublicLayout().setContractedChild(null); @@ -366,7 +331,7 @@ public class NotificationContentInflater { private static InflationProgress createRemoteViews(@InflationFlag int reInflateFlags, Notification.Builder builder, boolean isLowPriority, boolean isChildInGroup, - boolean usesIncreasedHeight, boolean usesIncreasedHeadsUpHeight, boolean redactAmbient, + boolean usesIncreasedHeight, boolean usesIncreasedHeadsUpHeight, Context packageContext) { InflationProgress result = new InflationProgress(); isLowPriority = isLowPriority && !isChildInGroup; @@ -384,13 +349,9 @@ public class NotificationContentInflater { } if ((reInflateFlags & FLAG_CONTENT_VIEW_PUBLIC) != 0) { - result.newPublicView = builder.makePublicContentView(); + result.newPublicView = builder.makePublicContentView(isLowPriority); } - if ((reInflateFlags & FLAG_CONTENT_VIEW_AMBIENT) != 0) { - result.newAmbientView = redactAmbient ? builder.makePublicAmbientNotification() - : builder.makeAmbientNotification(); - } result.packageContext = packageContext; result.headsUpStatusBarText = builder.getHeadsUpStatusBarText(false /* showingPublic */); result.headsUpStatusBarTextPublic = builder.getHeadsUpStatusBarText( @@ -404,7 +365,6 @@ public class NotificationContentInflater { @InflationFlag int reInflateFlags, ArrayMap<Integer, RemoteViews> cachedContentViews, ExpandableNotificationRow row, - boolean redactAmbient, RemoteViews.OnClickHandler remoteViewClickHandler, @Nullable InflationCallback callback) { NotificationContentView privateLayout = row.getPrivateLayout(); @@ -428,7 +388,7 @@ public class NotificationContentInflater { } }; applyRemoteView(inflateSynchronously, result, reInflateFlags, flag, cachedContentViews, - row, redactAmbient, isNewView, remoteViewClickHandler, callback, privateLayout, + row, isNewView, remoteViewClickHandler, callback, privateLayout, privateLayout.getContractedChild(), privateLayout.getVisibleWrapper( NotificationContentView.VISIBLE_TYPE_CONTRACTED), runningInflations, applyCallback); @@ -452,7 +412,7 @@ public class NotificationContentInflater { } }; applyRemoteView(inflateSynchronously, result, reInflateFlags, flag, - cachedContentViews, row, redactAmbient, isNewView, remoteViewClickHandler, + cachedContentViews, row, isNewView, remoteViewClickHandler, callback, privateLayout, privateLayout.getExpandedChild(), privateLayout.getVisibleWrapper( NotificationContentView.VISIBLE_TYPE_EXPANDED), runningInflations, @@ -478,7 +438,7 @@ public class NotificationContentInflater { } }; applyRemoteView(inflateSynchronously, result, reInflateFlags, flag, - cachedContentViews, row, redactAmbient, isNewView, remoteViewClickHandler, + cachedContentViews, row, isNewView, remoteViewClickHandler, callback, privateLayout, privateLayout.getHeadsUpChild(), privateLayout.getVisibleWrapper( VISIBLE_TYPE_HEADSUP), runningInflations, @@ -503,39 +463,14 @@ public class NotificationContentInflater { } }; applyRemoteView(inflateSynchronously, result, reInflateFlags, flag, cachedContentViews, - row, redactAmbient, isNewView, remoteViewClickHandler, callback, + row, isNewView, remoteViewClickHandler, callback, publicLayout, publicLayout.getContractedChild(), publicLayout.getVisibleWrapper(NotificationContentView.VISIBLE_TYPE_CONTRACTED), runningInflations, applyCallback); } - flag = FLAG_CONTENT_VIEW_AMBIENT; - if ((reInflateFlags & flag) != 0) { - NotificationContentView newParent = redactAmbient ? publicLayout : privateLayout; - boolean isNewView = (!canReapplyAmbient(row, redactAmbient) - || !canReapplyRemoteView(result.newAmbientView, - cachedContentViews.get(FLAG_CONTENT_VIEW_AMBIENT))); - ApplyCallback applyCallback = new ApplyCallback() { - @Override - public void setResultView(View v) { - result.inflatedAmbientView = v; - } - - @Override - public RemoteViews getRemoteView() { - return result.newAmbientView; - } - }; - applyRemoteView(inflateSynchronously, result, reInflateFlags, flag, cachedContentViews, - row, redactAmbient, isNewView, remoteViewClickHandler, callback, - newParent, newParent.getAmbientChild(), newParent.getVisibleWrapper( - NotificationContentView.VISIBLE_TYPE_AMBIENT), runningInflations, - applyCallback); - } - // Let's try to finish, maybe nobody is even inflating anything - finishIfDone(result, reInflateFlags, cachedContentViews, runningInflations, callback, row, - redactAmbient); + finishIfDone(result, reInflateFlags, cachedContentViews, runningInflations, callback, row); CancellationSignal cancellationSignal = new CancellationSignal(); cancellationSignal.setOnCancelListener( () -> runningInflations.values().forEach(CancellationSignal::cancel)); @@ -550,7 +485,6 @@ public class NotificationContentInflater { @InflationFlag int inflationId, final ArrayMap<Integer, RemoteViews> cachedContentViews, final ExpandableNotificationRow row, - final boolean redactAmbient, boolean isNewView, RemoteViews.OnClickHandler remoteViewClickHandler, @Nullable final InflationCallback callback, @@ -603,7 +537,7 @@ public class NotificationContentInflater { } runningInflations.remove(inflationId); finishIfDone(result, reInflateFlags, cachedContentViews, runningInflations, - callback, row, redactAmbient); + callback, row); } @Override @@ -670,8 +604,7 @@ public class NotificationContentInflater { private static boolean finishIfDone(InflationProgress result, @InflationFlag int reInflateFlags, ArrayMap<Integer, RemoteViews> cachedContentViews, HashMap<Integer, CancellationSignal> runningInflations, - @Nullable InflationCallback endListener, ExpandableNotificationRow row, - boolean redactAmbient) { + @Nullable InflationCallback endListener, ExpandableNotificationRow row) { Assert.isMainThread(); NotificationEntry entry = row.getEntry(); NotificationContentView privateLayout = row.getPrivateLayout(); @@ -735,19 +668,6 @@ public class NotificationContentInflater { } } - if ((reInflateFlags & FLAG_CONTENT_VIEW_AMBIENT) != 0) { - if (result.inflatedAmbientView != null) { - NotificationContentView newParent = redactAmbient - ? publicLayout : privateLayout; - NotificationContentView otherParent = !redactAmbient - ? publicLayout : privateLayout; - newParent.setAmbientChild(result.inflatedAmbientView); - otherParent.setAmbientChild(null); - cachedContentViews.put(FLAG_CONTENT_VIEW_AMBIENT, result.newAmbientView); - } else if (cachedContentViews.get(FLAG_CONTENT_VIEW_AMBIENT) != null) { - cachedContentViews.put(FLAG_CONTENT_VIEW_AMBIENT, result.newAmbientView); - } - } entry.headsUpStatusBarText = result.headsUpStatusBarText; entry.headsUpStatusBarTextPublic = result.headsUpStatusBarTextPublic; if (endListener != null) { @@ -827,12 +747,6 @@ public class NotificationContentInflater { mInflateSynchronously = inflateSynchronously; } - private static boolean canReapplyAmbient(ExpandableNotificationRow row, boolean redactAmbient) { - NotificationContentView ambientView = redactAmbient ? row.getPublicLayout() - : row.getPrivateLayout(); - return ambientView.getAmbientChild() != null; - } - public static class AsyncInflationTask extends AsyncTask<Void, Void, InflationProgress> implements InflationCallback, InflationTask { @@ -844,7 +758,6 @@ public class NotificationContentInflater { private final boolean mUsesIncreasedHeight; private final InflationCallback mCallback; private final boolean mUsesIncreasedHeadsUpHeight; - private final boolean mRedactAmbient; private @InflationFlag int mReInflateFlags; private final ArrayMap<Integer, RemoteViews> mCachedContentViews; private ExpandableNotificationRow mRow; @@ -862,7 +775,6 @@ public class NotificationContentInflater { boolean isChildInGroup, boolean usesIncreasedHeight, boolean usesIncreasedHeadsUpHeight, - boolean redactAmbient, InflationCallback callback, RemoteViews.OnClickHandler remoteViewClickHandler) { mRow = row; @@ -875,7 +787,6 @@ public class NotificationContentInflater { mIsChildInGroup = isChildInGroup; mUsesIncreasedHeight = usesIncreasedHeight; mUsesIncreasedHeadsUpHeight = usesIncreasedHeadsUpHeight; - mRedactAmbient = redactAmbient; mRemoteViewClickHandler = remoteViewClickHandler; mCallback = callback; NotificationEntry entry = row.getEntry(); @@ -903,9 +814,8 @@ public class NotificationContentInflater { processor.processNotification(notification, recoveredBuilder); } InflationProgress inflationProgress = createRemoteViews(mReInflateFlags, - recoveredBuilder, mIsLowPriority, - mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, - mRedactAmbient, packageContext); + recoveredBuilder, mIsLowPriority, mIsChildInGroup, mUsesIncreasedHeight, + mUsesIncreasedHeadsUpHeight, packageContext); return inflateSmartReplyViews(inflationProgress, mReInflateFlags, mRow.getEntry(), mRow.getContext(), mRow.getHeadsUpManager(), mRow.getExistingSmartRepliesAndActions()); @@ -919,7 +829,7 @@ public class NotificationContentInflater { protected void onPostExecute(InflationProgress result) { if (mError == null) { mCancellationSignal = apply(mInflateSynchronously, result, mReInflateFlags, - mCachedContentViews, mRow, mRedactAmbient, mRemoteViewClickHandler, this); + mCachedContentViews, mRow, mRemoteViewClickHandler, this); } else { handleError(mError); } @@ -974,7 +884,6 @@ public class NotificationContentInflater { private RemoteViews newContentView; private RemoteViews newHeadsUpView; private RemoteViews newExpandedView; - private RemoteViews newAmbientView; private RemoteViews newPublicView; @VisibleForTesting @@ -983,7 +892,6 @@ public class NotificationContentInflater { private View inflatedContentView; private View inflatedHeadsUpView; private View inflatedExpandedView; - private View inflatedAmbientView; private View inflatedPublicView; private CharSequence headsUpStatusBarText; private CharSequence headsUpStatusBarTextPublic; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index 354ed2d00d32..90f63249846e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -71,7 +71,6 @@ public class NotificationContentView extends FrameLayout { public static final int VISIBLE_TYPE_EXPANDED = 1; public static final int VISIBLE_TYPE_HEADSUP = 2; private static final int VISIBLE_TYPE_SINGLELINE = 3; - public static final int VISIBLE_TYPE_AMBIENT = 4; public static final int UNDEFINED = -1; private final Rect mClipBounds = new Rect(); @@ -82,7 +81,6 @@ public class NotificationContentView extends FrameLayout { private View mExpandedChild; private View mHeadsUpChild; private HybridNotificationView mSingleLineView; - private View mAmbientChild; private RemoteInputView mExpandedRemoteInput; private RemoteInputView mHeadsUpRemoteInput; @@ -98,12 +96,10 @@ public class NotificationContentView extends FrameLayout { private NotificationViewWrapper mContractedWrapper; private NotificationViewWrapper mExpandedWrapper; private NotificationViewWrapper mHeadsUpWrapper; - private NotificationViewWrapper mAmbientWrapper; private HybridGroupManager mHybridGroupManager; private int mClipTopAmount; private int mContentHeight; private int mVisibleType = VISIBLE_TYPE_CONTRACTED; - private boolean mDark; private boolean mAnimate; private boolean mIsHeadsUp; private boolean mLegacy; @@ -111,7 +107,6 @@ public class NotificationContentView extends FrameLayout { private int mSmallHeight; private int mHeadsUpHeight; private int mNotificationMaxHeight; - private int mNotificationAmbientHeight; private StatusBarNotification mStatusBarNotification; private NotificationGroupManager mGroupManager; private RemoteInputController mRemoteInputController; @@ -166,7 +161,6 @@ public class NotificationContentView extends FrameLayout { private int mUnrestrictedContentHeight; private MediaTransferManager mMediaTransferManager; - public NotificationContentView(Context context, AttributeSet attrs) { super(context, attrs); mHybridGroupManager = new HybridGroupManager(getContext(), this); @@ -183,12 +177,10 @@ public class NotificationContentView extends FrameLayout { com.android.internal.R.dimen.notification_content_margin_end); } - public void setHeights(int smallHeight, int headsUpMaxHeight, int maxHeight, - int ambientHeight) { + public void setHeights(int smallHeight, int headsUpMaxHeight, int maxHeight) { mSmallHeight = smallHeight; mHeadsUpHeight = headsUpMaxHeight; mNotificationMaxHeight = maxHeight; - mNotificationAmbientHeight = ambientHeight; } @Override @@ -286,20 +278,6 @@ public class NotificationContentView extends FrameLayout { MeasureSpec.makeMeasureSpec(mNotificationMaxHeight, MeasureSpec.AT_MOST)); maxChildHeight = Math.max(maxChildHeight, mSingleLineView.getMeasuredHeight()); } - if (mAmbientChild != null) { - int size = mNotificationAmbientHeight; - ViewGroup.LayoutParams layoutParams = mAmbientChild.getLayoutParams(); - boolean useExactly = false; - if (layoutParams.height >= 0) { - // An actual height is set - size = Math.min(size, layoutParams.height); - useExactly = true; - } - mAmbientChild.measure(widthMeasureSpec, - MeasureSpec.makeMeasureSpec(size, useExactly ? MeasureSpec.EXACTLY - : MeasureSpec.AT_MOST)); - maxChildHeight = Math.max(maxChildHeight, mAmbientChild.getMeasuredHeight()); - } int ownHeight = Math.min(maxChildHeight, maxSize); setMeasuredDimension(width, ownHeight); } @@ -394,10 +372,6 @@ public class NotificationContentView extends FrameLayout { return mHeadsUpChild; } - public View getAmbientChild() { - return mAmbientChild; - } - /** * Sets the contracted view. Child may be null to remove the content view. * @@ -432,9 +406,6 @@ public class NotificationContentView extends FrameLayout { if (child == mHeadsUpChild) { return mHeadsUpWrapper; } - if (child == mAmbientChild) { - return mAmbientWrapper; - } return null; } @@ -514,33 +485,6 @@ public class NotificationContentView extends FrameLayout { mContainingNotification); } - /** - * Sets the ambient view. Child may be null to remove the content view. - * - * @param child ambient content view to set - */ - public void setAmbientChild(@Nullable View child) { - if (mAmbientChild != null) { - mAmbientChild.animate().cancel(); - removeView(mAmbientChild); - } - if (child == null) { - mAmbientChild = null; - mAmbientWrapper = null; - if (mTransformationStartVisibleType == VISIBLE_TYPE_AMBIENT) { - mTransformationStartVisibleType = UNDEFINED; - } - if (mVisibleType == VISIBLE_TYPE_AMBIENT) { - selectLayout(false /* animate */, true /* force */); - } - return; - } - addView(child); - mAmbientChild = child; - mAmbientWrapper = NotificationViewWrapper.wrap(getContext(), child, - mContainingNotification); - } - @Override public void onViewAdded(View child) { super.onViewAdded(child); @@ -645,7 +589,7 @@ public class NotificationContentView extends FrameLayout { isTransitioningFromTo(VISIBLE_TYPE_EXPANDED, VISIBLE_TYPE_HEADSUP); boolean pinned = !isVisibleOrTransitioning(VISIBLE_TYPE_CONTRACTED) && (mIsHeadsUp || mHeadsUpAnimatingAway) - && !mContainingNotification.isOnKeyguard(); + && mContainingNotification.canShowHeadsUp(); if (transitioningBetweenHunAndExpanded || pinned) { return Math.min(getViewHeight(VISIBLE_TYPE_HEADSUP), getViewHeight(VISIBLE_TYPE_EXPANDED)); @@ -659,9 +603,7 @@ public class NotificationContentView extends FrameLayout { } int hint; - if (mAmbientChild != null && isVisibleOrTransitioning(VISIBLE_TYPE_AMBIENT)) { - hint = mAmbientChild.getHeight(); - } else if (mHeadsUpChild != null && isVisibleOrTransitioning(VISIBLE_TYPE_HEADSUP)) { + if (mHeadsUpChild != null && isVisibleOrTransitioning(VISIBLE_TYPE_HEADSUP)) { hint = getViewHeight(VISIBLE_TYPE_HEADSUP); } else if (mExpandedChild != null) { hint = getViewHeight(VISIBLE_TYPE_EXPANDED); @@ -761,9 +703,7 @@ public class NotificationContentView extends FrameLayout { if (mExpandedChild != null) { return getViewHeight(VISIBLE_TYPE_EXPANDED) + getExtraRemoteInputHeight(mExpandedRemoteInput); - } else if (mContainingNotification.isOnAmbient() && getShowingAmbientView() != null) { - return getShowingAmbientView().getHeight(); - } else if (mIsHeadsUp && mHeadsUpChild != null && !mContainingNotification.isOnKeyguard()) { + } else if (mIsHeadsUp && mHeadsUpChild != null && mContainingNotification.canShowHeadsUp()) { return getViewHeight(VISIBLE_TYPE_HEADSUP) + getExtraRemoteInputHeight(mHeadsUpRemoteInput); } else if (mContractedChild != null) { @@ -773,11 +713,15 @@ public class NotificationContentView extends FrameLayout { } private int getViewHeight(int visibleType) { + return getViewHeight(visibleType, false /* forceNoHeader */); + } + + private int getViewHeight(int visibleType, boolean forceNoHeader) { View view = getViewForVisibleType(visibleType); int height = view.getHeight(); NotificationViewWrapper viewWrapper = getWrapperForView(view); if (viewWrapper != null) { - height += viewWrapper.getHeaderTranslation(); + height += viewWrapper.getHeaderTranslation(forceNoHeader); } return height; } @@ -787,9 +731,7 @@ public class NotificationContentView extends FrameLayout { } public int getMinHeight(boolean likeGroupExpanded) { - if (mContainingNotification.isOnAmbient() && getShowingAmbientView() != null) { - return getShowingAmbientView().getHeight(); - } else if (likeGroupExpanded || !mIsChildInGroup || isGroupExpanded()) { + if (likeGroupExpanded || !mIsChildInGroup || isGroupExpanded()) { return mContractedChild != null ? getViewHeight(VISIBLE_TYPE_CONTRACTED) : mMinContractedHeight; } else { @@ -797,15 +739,6 @@ public class NotificationContentView extends FrameLayout { } } - public View getShowingAmbientView() { - View v = mIsChildInGroup ? mSingleLineView : mAmbientChild; - if (v != null) { - return v; - } else { - return mContractedChild; - } - } - private boolean isGroupExpanded() { return mGroupManager.isGroupExpanded(mStatusBarNotification); } @@ -887,7 +820,6 @@ public class NotificationContentView extends FrameLayout { forceUpdateVisibility(VISIBLE_TYPE_EXPANDED, mExpandedChild, mExpandedWrapper); forceUpdateVisibility(VISIBLE_TYPE_HEADSUP, mHeadsUpChild, mHeadsUpWrapper); forceUpdateVisibility(VISIBLE_TYPE_SINGLELINE, mSingleLineView, mSingleLineView); - forceUpdateVisibility(VISIBLE_TYPE_AMBIENT, mAmbientChild, mAmbientWrapper); fireExpandedVisibleListenerIfVisible(); // forceUpdateVisibilities cancels outstanding animations without updating the // mAnimationStartVisibleType. Do so here instead. @@ -963,8 +895,6 @@ public class NotificationContentView extends FrameLayout { mHeadsUpChild, mHeadsUpWrapper); updateViewVisibility(visibleType, VISIBLE_TYPE_SINGLELINE, mSingleLineView, mSingleLineView); - updateViewVisibility(visibleType, VISIBLE_TYPE_AMBIENT, - mAmbientChild, mAmbientWrapper); fireExpandedVisibleListenerIfVisible(); // updateViewVisibilities cancels outstanding animations without updating the // mAnimationStartVisibleType. Do so here instead. @@ -1025,8 +955,6 @@ public class NotificationContentView extends FrameLayout { return mHeadsUpWrapper; case VISIBLE_TYPE_SINGLELINE: return mSingleLineView; - case VISIBLE_TYPE_AMBIENT: - return mAmbientWrapper; default: return mContractedWrapper; } @@ -1044,8 +972,6 @@ public class NotificationContentView extends FrameLayout { return mHeadsUpChild; case VISIBLE_TYPE_SINGLELINE: return mSingleLineView; - case VISIBLE_TYPE_AMBIENT: - return mAmbientChild; default: return mContractedChild; } @@ -1059,8 +985,6 @@ public class NotificationContentView extends FrameLayout { return mHeadsUpWrapper; case VISIBLE_TYPE_CONTRACTED: return mContractedWrapper; - case VISIBLE_TYPE_AMBIENT: - return mAmbientWrapper; default: return null; } @@ -1100,26 +1024,23 @@ public class NotificationContentView extends FrameLayout { if (!noExpandedChild && viewHeight == getViewHeight(VISIBLE_TYPE_EXPANDED)) { return VISIBLE_TYPE_EXPANDED; } - boolean onAmbient = mContainingNotification.isOnAmbient(); if (!mUserExpanding && mIsChildInGroup && !isGroupExpanded()) { return VISIBLE_TYPE_SINGLELINE; } if ((mIsHeadsUp || mHeadsUpAnimatingAway) && mHeadsUpChild != null - && !mContainingNotification.isOnKeyguard()) { + && mContainingNotification.canShowHeadsUp()) { if (viewHeight <= getViewHeight(VISIBLE_TYPE_HEADSUP) || noExpandedChild) { return VISIBLE_TYPE_HEADSUP; } else { return VISIBLE_TYPE_EXPANDED; } } else { - int collapsedType = onAmbient && mAmbientChild != null ? VISIBLE_TYPE_AMBIENT : - VISIBLE_TYPE_CONTRACTED; if (noExpandedChild || (mContractedChild != null - && viewHeight <= getViewHeight(collapsedType) + && viewHeight <= getViewHeight(VISIBLE_TYPE_CONTRACTED) && (!mIsChildInGroup || isGroupExpanded() || !mContainingNotification.isExpanded(true /* allowOnKeyguard */)))) { - return collapsedType; + return VISIBLE_TYPE_CONTRACTED; } else { return VISIBLE_TYPE_EXPANDED; } @@ -1130,14 +1051,6 @@ public class NotificationContentView extends FrameLayout { return mIsContentExpandable; } - public void setDark(boolean dark, boolean fade, long delay) { - if (mContractedChild == null) { - return; - } - mDark = dark; - selectLayout(!dark && fade /* animate */, false /* force */); - } - public void setHeadsUp(boolean headsUp) { mIsHeadsUp = headsUp; selectLayout(false /* animate */, true /* force */); @@ -1180,9 +1093,6 @@ public class NotificationContentView extends FrameLayout { if (mHeadsUpChild != null) { mHeadsUpWrapper.setIsChildInGroup(mIsChildInGroup); } - if (mAmbientChild != null) { - mAmbientWrapper.setIsChildInGroup(mIsChildInGroup); - } updateAllSingleLineViews(); } @@ -1201,14 +1111,10 @@ public class NotificationContentView extends FrameLayout { if (mHeadsUpChild != null) { mHeadsUpWrapper.onContentUpdated(row); } - if (mAmbientChild != null) { - mAmbientWrapper.onContentUpdated(row); - } applyRemoteInputAndSmartReply(entry); applyMediaTransfer(entry); updateLegacy(); mForceSelectNextLayout = true; - setDark(mDark, false /* animate */, 0 /* delay */); mPreviousExpandedRemoteInputIntent = null; mPreviousHeadsUpRemoteInputIntent = null; } @@ -1514,7 +1420,7 @@ public class NotificationContentView extends FrameLayout { // if the expanded child has the same height as the collapsed one we hide it. if (mExpandedChild != null && mExpandedChild.getHeight() != 0) { if ((!mIsHeadsUp && !mHeadsUpAnimatingAway) - || mHeadsUpChild == null || mContainingNotification.isOnKeyguard()) { + || mHeadsUpChild == null || !mContainingNotification.canShowHeadsUp()) { if (mExpandedChild.getHeight() <= mContractedChild.getHeight()) { expandable = false; } @@ -1545,9 +1451,6 @@ public class NotificationContentView extends FrameLayout { if (header == null && mHeadsUpChild != null) { header = mHeadsUpWrapper.getNotificationHeader(); } - if (header == null && mAmbientChild != null) { - header = mAmbientWrapper.getNotificationHeader(); - } return header; } @@ -1849,14 +1752,15 @@ public class NotificationContentView extends FrameLayout { return getViewHeight(viewType) + getExtraRemoteInputHeight(mExpandedRemoteInput); } - public int getHeadsUpHeight() { + public int getHeadsUpHeight(boolean forceNoHeader) { int viewType = VISIBLE_TYPE_HEADSUP; if (mHeadsUpChild == null) { viewType = VISIBLE_TYPE_CONTRACTED; } // The headsUp remote input quickly switches to the expanded one, so lets also include that // one - return getViewHeight(viewType) + getExtraRemoteInputHeight(mHeadsUpRemoteInput) + return getViewHeight(viewType, forceNoHeader) + + getExtraRemoteInputHeight(mHeadsUpRemoteInput) + getExtraRemoteInputHeight(mExpandedRemoteInput); } 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 b5a8aadf651f..8f7671a5dd96 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 @@ -419,9 +419,6 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx } final ExpandableNotificationRow row = (ExpandableNotificationRow) view; - if (row.isDark()) { - return false; - } view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); if (row.areGutsExposed()) { closeAndSaveGuts(false /* removeLeavebehind */, false /* force */, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java index d911e1a05029..b4ccb567504a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java @@ -346,8 +346,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl if (mShouldShowMenu && !NotificationStackScrollLayout.isPinnedHeadsUp(getParent()) && !mParent.areGutsExposed() - && !mParent.isDark() - && !mParent.showingAmbientPulsing() + && !mParent.showingPulsing() && (mCheckForDrag == null || !mHandler.hasCallbacks(mCheckForDrag))) { // Only show the menu if we're not a heads up view and guts aren't exposed. mCheckForDrag = new CheckForDrag(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java index 7ebdb93daf23..97d84433dafe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java @@ -51,7 +51,7 @@ import com.android.systemui.statusbar.notification.row.HybridNotificationView; */ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapper { - private final int mTranslationForHeader; + private final int mFullHeaderTranslation; protected ImageView mPicture; private ProgressBar mProgressBar; private TextView mTitle; @@ -135,7 +135,7 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp } }, TRANSFORMING_VIEW_TEXT); - mTranslationForHeader = ctx.getResources().getDimensionPixelSize( + mFullHeaderTranslation = ctx.getResources().getDimensionPixelSize( com.android.internal.R.dimen.notification_content_margin) - ctx.getResources().getDimensionPixelSize( com.android.internal.R.dimen.notification_content_margin_top); @@ -340,20 +340,20 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp // We also need to compensate for any header translation, since we're always at the end. mActionsContainer.setTranslationY(constrainedContentHeight - mView.getHeight() - - getHeaderTranslation()); + - getHeaderTranslation(false /* forceNoHeader */)); } } @Override - public int getHeaderTranslation() { - return (int) mHeaderTranslation; + public int getHeaderTranslation(boolean forceNoHeader) { + return forceNoHeader ? mFullHeaderTranslation : (int) mHeaderTranslation; } @Override public void setHeaderVisibleAmount(float headerVisibleAmount) { super.setHeaderVisibleAmount(headerVisibleAmount); mNotificationHeader.setAlpha(headerVisibleAmount); - mHeaderTranslation = (1.0f - headerVisibleAmount) * mTranslationForHeader; + mHeaderTranslation = (1.0f - headerVisibleAmount) * mFullHeaderTranslation; mView.setTranslationY(mHeaderTranslation); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java index 3808702176a9..47906a7058a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationViewWrapper.java @@ -224,7 +224,7 @@ public abstract class NotificationViewWrapper implements TransformableView { return null; } - public int getHeaderTranslation() { + public int getHeaderTranslation(boolean forceNoHeader) { return 0; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java index 78dc9a0a731c..f3d068a9d610 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AmbientState.java @@ -24,7 +24,6 @@ import android.view.View; import com.android.systemui.Dependency; import com.android.systemui.R; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -32,6 +31,7 @@ import com.android.systemui.statusbar.notification.row.ActivatableNotificationVi import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.ExpandableView; import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.SectionProvider; +import com.android.systemui.statusbar.policy.HeadsUpManager; import java.util.ArrayList; @@ -52,9 +52,8 @@ public class AmbientState { private float mOverScrollTopAmount; private float mOverScrollBottomAmount; private int mSpeedBumpIndex = -1; - private boolean mDark; + private boolean mDozing; private boolean mHideSensitive; - private AmbientPulseManager mAmbientPulseManager = Dependency.get(AmbientPulseManager.class); private float mStackTranslation; private int mLayoutHeight; private int mTopPadding; @@ -79,15 +78,19 @@ public class AmbientState { private int mIntrinsicPadding; private int mExpandAnimationTopChange; private ExpandableNotificationRow mExpandingNotification; - private float mDarkAmount; + private float mHideAmount; private boolean mAppearing; private float mPulseHeight = MAX_PULSE_HEIGHT; private float mDozeAmount = 0.0f; + private HeadsUpManager mHeadUpManager; + private Runnable mOnPulseHeightChangedListener; public AmbientState( Context context, - @NonNull SectionProvider sectionProvider) { + @NonNull SectionProvider sectionProvider, + HeadsUpManager headsUpManager) { mSectionProvider = sectionProvider; + mHeadUpManager = headsUpManager; reload(context); } @@ -180,23 +183,23 @@ public class AmbientState { mDimmed = dimmed; } - /** In dark mode, we draw as little as possible, assuming a black background */ - public void setDark(boolean dark) { - mDark = dark; + /** While dozing, we draw as little as possible, assuming a black background */ + public void setDozing(boolean dozing) { + mDozing = dozing; } - /** Dark ratio of the status bar **/ - public void setDarkAmount(float darkAmount) { - if (darkAmount == 1.0f && mDarkAmount != darkAmount) { - // Whenever we are fully dark, let's reset the pulseHeight again - mPulseHeight = MAX_PULSE_HEIGHT; + /** Hide ratio of the status bar **/ + public void setHideAmount(float hidemount) { + if (hidemount == 1.0f && mHideAmount != hidemount) { + // Whenever we are fully hidden, let's reset the pulseHeight again + setPulseHeight(MAX_PULSE_HEIGHT); } - mDarkAmount = darkAmount; + mHideAmount = hidemount; } - /** Returns the dark ratio of the status bar */ - public float getDarkAmount() { - return mDarkAmount; + /** Returns the hide ratio of the status bar */ + public float getHideAmount() { + return mHideAmount; } public void setHideSensitive(boolean hideSensitive) { @@ -217,8 +220,8 @@ public class AmbientState { return mDimmed && !(isPulseExpanding() && mDozeAmount == 1.0f); } - public boolean isDark() { - return mDark; + public boolean isDozing() { + return mDozing; } public boolean isHideSensitive() { @@ -295,7 +298,7 @@ public class AmbientState { } public boolean isPulseExpanding() { - return mPulseHeight != MAX_PULSE_HEIGHT && mDozeAmount != 0.0f && mDarkAmount != 1.0f; + return mPulseHeight != MAX_PULSE_HEIGHT && mDozeAmount != 0.0f && mHideAmount != 1.0f; } public boolean isShadeExpanded() { @@ -389,8 +392,7 @@ public class AmbientState { } public boolean hasPulsingNotifications() { - return mPulsing && mAmbientPulseManager != null - && mAmbientPulseManager.hasNotifications(); + return mPulsing && mHeadUpManager != null && mHeadUpManager.hasNotifications(); } public void setPulsing(boolean hasPulsing) { @@ -405,10 +407,10 @@ public class AmbientState { } public boolean isPulsing(NotificationEntry entry) { - if (!mPulsing || mAmbientPulseManager == null) { + if (!mPulsing || mHeadUpManager == null) { return false; } - return mAmbientPulseManager.isAlerting(entry.key); + return mHeadUpManager.isAlerting(entry.key); } public boolean isPanelTracking() { @@ -461,7 +463,7 @@ public class AmbientState { * @return whether a row is dozing and not pulsing right now */ public boolean isDozingAndNotPulsing(ExpandableNotificationRow row) { - return isDark() && !isPulsing(row.getEntry()); + return isDozing() && !isPulsing(row.getEntry()); } public void setExpandAnimationTopChange(int expandAnimationTopChange) { @@ -481,14 +483,15 @@ public class AmbientState { } /** - * @return {@code true } when shade is completely dark: in AOD or ambient display. + * @return {@code true } when shade is completely hidden: in AOD, ambient display or when + * bypassing. */ - public boolean isFullyDark() { - return mDarkAmount == 1; + public boolean isFullyHidden() { + return mHideAmount == 1; } - public boolean isDarkAtAll() { - return mDarkAmount != 0; + public boolean isHiddenAtAll() { + return mHideAmount != 0; } public void setAppearing(boolean appearing) { @@ -500,7 +503,20 @@ public class AmbientState { } public void setPulseHeight(float height) { - mPulseHeight = height; + if (height != mPulseHeight) { + mPulseHeight = height; + if (mOnPulseHeightChangedListener != null) { + mOnPulseHeightChangedListener.run(); + } + } + } + + public float getPulseHeight() { + if (mPulseHeight == MAX_PULSE_HEIGHT) { + // If we're not pulse expanding, the height should be 0 + return 0; + } + return mPulseHeight; } public void setDozeAmount(float dozeAmount) { @@ -508,7 +524,7 @@ public class AmbientState { mDozeAmount = dozeAmount; if (dozeAmount == 0.0f || dozeAmount == 1.0f) { // We woke all the way up, let's reset the pulse height - mPulseHeight = MAX_PULSE_HEIGHT; + setPulseHeight(MAX_PULSE_HEIGHT); } } } @@ -520,4 +536,12 @@ public class AmbientState { public boolean isFullyAwake() { return mDozeAmount == 0.0f; } + + public void setOnPulseHeightChangedListener(Runnable onPulseHeightChangedListener) { + mOnPulseHeightChangedListener = onPulseHeightChangedListener; + } + + public Runnable getOnPulseHeightChangedListener() { + return mOnPulseHeightChangedListener; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java index a471d8784c54..6cd229037462 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/AnimationFilter.java @@ -36,7 +36,6 @@ public class AnimationFilter { boolean animateHeight; boolean animateTopInset; boolean animateDimmed; - boolean animateDark; boolean animateHideSensitive; boolean hasDelays; boolean hasGoToFullShadeEvent; @@ -89,11 +88,6 @@ public class AnimationFilter { return this; } - public AnimationFilter animateDark() { - animateDark = true; - return this; - } - public AnimationFilter animateHideSensitive() { animateHideSensitive = true; return this; @@ -145,7 +139,6 @@ public class AnimationFilter { animateHeight |= filter.animateHeight; animateTopInset |= filter.animateTopInset; animateDimmed |= filter.animateDimmed; - animateDark |= filter.animateDark; animateHideSensitive |= filter.animateHideSensitive; hasDelays |= filter.hasDelays; mAnimatedProperties.addAll(filter.mAnimatedProperties); @@ -160,7 +153,6 @@ public class AnimationFilter { animateHeight = false; animateTopInset = false; animateDimmed = false; - animateDark = false; animateHideSensitive = false; hasDelays = false; hasGoToFullShadeEvent = false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java index f28e556229ce..72ef7f9572a4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java @@ -85,7 +85,6 @@ public class ExpandableViewState extends ViewState { public int height; public boolean dimmed; - public boolean dark; public boolean hideSensitive; public boolean belowSpeedBump; public boolean inShelf; @@ -121,7 +120,6 @@ public class ExpandableViewState extends ViewState { ExpandableViewState svs = (ExpandableViewState) viewState; height = svs.height; dimmed = svs.dimmed; - dark = svs.dark; hideSensitive = svs.hideSensitive; belowSpeedBump = svs.belowSpeedBump; clipTopAmount = svs.clipTopAmount; @@ -158,9 +156,6 @@ public class ExpandableViewState extends ViewState { // apply below shelf speed bump expandableView.setBelowSpeedBump(this.belowSpeedBump); - // apply dark - expandableView.setDark(this.dark, false /* animate */, 0 /* delay */); - // apply clipping float oldClipTopAmount = expandableView.getClipTopAmount(); if (oldClipTopAmount != this.clipTopAmount) { @@ -209,9 +204,6 @@ public class ExpandableViewState extends ViewState { expandableView.setHideSensitive(this.hideSensitive, animationFilter.animateHideSensitive, properties.delay, properties.duration); - // start dark animation - expandableView.setDark(this.dark, animationFilter.animateDark, properties.delay); - if (properties.wasAdded(child) && !hidden) { expandableView.performAddAnimation(properties.delay, properties.duration, false /* isHeadsUpAppear */); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java index 6632ae63d944..45f7b3a5bb2a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationChildrenContainer.java @@ -567,7 +567,6 @@ public class NotificationChildrenContainer extends ViewGroup { ? parentState.zTranslation : 0; childState.dimmed = parentState.dimmed; - childState.dark = parentState.dark; childState.hideSensitive = parentState.hideSensitive; childState.belowSpeedBump = parentState.belowSpeedBump; childState.clipTopAmount = 0; @@ -662,8 +661,10 @@ public class NotificationChildrenContainer extends ViewGroup { && !showingAsLowPriority()) { return NUMBER_OF_CHILDREN_WHEN_CHILDREN_EXPANDED; } - if (mIsLowPriority || !mContainingNotification.isOnKeyguard() - && (mContainingNotification.isExpanded() || mContainingNotification.isHeadsUp())) { + if (mIsLowPriority + || (!mContainingNotification.isOnKeyguard() && mContainingNotification.isExpanded()) + || (mContainingNotification.isHeadsUpState() + && mContainingNotification.canShowHeadsUp())) { return NUMBER_OF_CHILDREN_WHEN_SYSTEM_EXPANDED; } return NUMBER_OF_CHILDREN_WHEN_COLLAPSED; @@ -1066,6 +1067,11 @@ public class NotificationChildrenContainer extends ViewGroup { false /* likeHighPriority */); } + public int getCollapsedHeightWithoutHeader() { + return getMinHeight(getMaxAllowedVisibleChildren(true /* forceCollapsed */), + false /* likeHighPriority */, 0); + } + /** * Get the minimum Height for this group. * @@ -1073,10 +1079,22 @@ public class NotificationChildrenContainer extends ViewGroup { * @param likeHighPriority if the height should be calculated as if it were not low priority */ private int getMinHeight(int maxAllowedVisibleChildren, boolean likeHighPriority) { + return getMinHeight(maxAllowedVisibleChildren, likeHighPriority, mCurrentHeaderTranslation); + } + + /** + * Get the minimum Height for this group. + * + * @param maxAllowedVisibleChildren the number of children that should be visible + * @param likeHighPriority if the height should be calculated as if it were not low priority + * @param headerTranslation the translation amount of the header + */ + private int getMinHeight(int maxAllowedVisibleChildren, boolean likeHighPriority, + int headerTranslation) { if (!likeHighPriority && showingAsLowPriority()) { return mNotificationHeaderLowPriority.getHeight(); } - int minExpandHeight = mNotificationHeaderMargin + mCurrentHeaderTranslation; + int minExpandHeight = mNotificationHeaderMargin + headerTranslation; int visibleChildren = 0; boolean firstChild = true; int childCount = mChildren.size(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListContainer.java index 212808dae8e3..15cc72c2d7a1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationListContainer.java @@ -184,4 +184,6 @@ public interface NotificationListContainer extends ExpandableView.OnHeightChange default boolean containsView(View v) { return true; } + + default void setWillExpand(boolean willExpand) {}; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java index c5ab9f6049c6..422184699952 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManager.java @@ -18,11 +18,14 @@ package com.android.systemui.statusbar.notification.stack; import static com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.NUM_SECTIONS; -import com.android.systemui.statusbar.AmbientPulseManager; + +import android.util.MathUtils; + import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.ExpandableView; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import java.util.HashSet; @@ -34,27 +37,26 @@ import javax.inject.Singleton; * A class that manages the roundness for notification views */ @Singleton -class NotificationRoundnessManager implements OnHeadsUpChangedListener, - AmbientPulseManager.OnAmbientChangedListener { +public class NotificationRoundnessManager implements OnHeadsUpChangedListener { private final ActivatableNotificationView[] mFirstInSectionViews; private final ActivatableNotificationView[] mLastInSectionViews; private final ActivatableNotificationView[] mTmpFirstInSectionViews; private final ActivatableNotificationView[] mTmpLastInSectionViews; + private final KeyguardBypassController mBypassController; private boolean mExpanded; private HashSet<ExpandableView> mAnimatedChildren; private Runnable mRoundingChangedCallback; private ExpandableNotificationRow mTrackedHeadsUp; - private ActivatableNotificationView mTrackedAmbient; private float mAppearFraction; @Inject - NotificationRoundnessManager(AmbientPulseManager ambientPulseManager) { + NotificationRoundnessManager(KeyguardBypassController keyguardBypassController) { mFirstInSectionViews = new ActivatableNotificationView[NUM_SECTIONS]; mLastInSectionViews = new ActivatableNotificationView[NUM_SECTIONS]; mTmpFirstInSectionViews = new ActivatableNotificationView[NUM_SECTIONS]; mTmpLastInSectionViews = new ActivatableNotificationView[NUM_SECTIONS]; - ambientPulseManager.addListener(this); + mBypassController = keyguardBypassController; } @Override @@ -73,14 +75,8 @@ class NotificationRoundnessManager implements OnHeadsUpChangedListener, } @Override - public void onAmbientStateChanged(NotificationEntry entry, boolean isPulsing) { - ActivatableNotificationView row = entry.getRow(); - if (isPulsing) { - mTrackedAmbient = row; - } else if (mTrackedAmbient == row) { - mTrackedAmbient = null; - } - updateView(row, false /* animate */); + public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) { + updateView(entry.getRow(), false /* animate */); } private void updateView(ActivatableNotificationView view, boolean animate) { @@ -140,12 +136,12 @@ class NotificationRoundnessManager implements OnHeadsUpChangedListener, if (isLastInSection(view, true /* include last section */) && !top) { return 1.0f; } - if (view == mTrackedHeadsUp && mAppearFraction <= 0.0f) { + if (view == mTrackedHeadsUp) { // If we're pushing up on a headsup the appear fraction is < 0 and it needs to still be // rounded. - return 1.0f; + return MathUtils.saturate(1.0f - mAppearFraction); } - if (view == mTrackedAmbient) { + if (view.showingPulsing() && !mBypassController.getBypassEnabled()) { return 1.0f; } return 0.0f; @@ -242,6 +238,10 @@ class NotificationRoundnessManager implements OnHeadsUpChangedListener, } public void setTrackingHeadsUp(ExpandableNotificationRow row) { + ExpandableNotificationRow previous = mTrackedHeadsUp; mTrackedHeadsUp = row; + if (previous != null) { + updateView(previous, true /* animate */); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java index cbcfdd4b2ea7..f39ed2e89432 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java @@ -254,7 +254,7 @@ class NotificationSection { newTop = (int) Math.ceil(firstView.getTranslationY()); } top = Math.max(newTop, top); - if (firstView.showingAmbientPulsing()) { + if (firstView.showingPulsing()) { // If we're pulsing, the notification can actually go below! bottom = Math.max(bottom, finalTranslationY + ExpandableViewState.getFinalActualHeight(firstView)); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 237825e44b97..f50790f3013b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -96,7 +96,6 @@ import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.OnMenuEv import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.DragDownHelper.DragDownCallback; import com.android.systemui.statusbar.EmptyShadeView; @@ -125,10 +124,10 @@ import com.android.systemui.statusbar.notification.row.NotificationGuts; import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.row.NotificationSnooze; import com.android.systemui.statusbar.notification.row.StackScrollerDecorView; -import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.HeadsUpAppearanceController; import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; import com.android.systemui.statusbar.phone.HeadsUpTouchHelper; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.LockscreenGestureLogger; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.NotificationGroupManager.OnGroupChangeListener; @@ -180,7 +179,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd * gap is drawn between them). In this case we don't want to round their corners. */ private static final int DISTANCE_BETWEEN_ADJACENT_SECTIONS_PX = 1; - private final AmbientPulseManager mAmbientPulseManager; + private final KeyguardBypassController mKeyguardBypassController; + private final DynamicPrivacyController mDynamicPrivacyController; + private final SysuiStatusBarStateController mStatusbarStateController; private ExpandHelper mExpandHelper; private final NotificationSwipeHelper mSwipeHelper; @@ -267,8 +268,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private boolean mTopPaddingNeedsAnimation; private boolean mDimmedNeedsAnimation; private boolean mHideSensitiveNeedsAnimation; - private boolean mDarkNeedsAnimation; - private int mDarkAnimationOriginIndex; private boolean mActivateNeedsAnimation; private boolean mGoToFullShadeNeedsAnimation; private boolean mIsExpanded = true; @@ -409,12 +408,13 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private final ViewOutlineProvider mOutlineProvider = new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { - if (mAmbientState.isDarkAtAll()) { - float xProgress = mDarkXInterpolator.getInterpolation( - (1 - mLinearDarkAmount) * mBackgroundXFactor); + if (mAmbientState.isHiddenAtAll()) { + float xProgress = mHideXInterpolator.getInterpolation( + (1 - mLinearHideAmount) * mBackgroundXFactor); outline.setRoundRect(mBackgroundAnimationRect, MathUtils.lerp(mCornerRadius / 2.0f, mCornerRadius, xProgress)); + outline.setAlpha(1.0f - mAmbientState.getHideAmount()); } else { ViewOutlineProvider.BACKGROUND.getOutline(view, outline); } @@ -427,14 +427,14 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private View mForcedScroll; /** - * @see #setDarkAmount(float, float) + * @see #setHideAmount(float, float) */ - private float mInterpolatedDarkAmount = 0f; + private float mInterpolatedHideAmount = 0f; /** - * @see #setDarkAmount(float, float) + * @see #setHideAmount(float, float) */ - private float mLinearDarkAmount = 0f; + private float mLinearHideAmount = 0f; /** * How fast the background scales in the X direction as a factor of the Y expansion. @@ -469,12 +469,10 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private int mCornerRadius; private int mSidePaddings; private final Rect mBackgroundAnimationRect = new Rect(); - private int mAntiBurnInOffsetX; private ArrayList<BiConsumer<Float, Float>> mExpandedHeightListeners = new ArrayList<>(); private int mHeadsUpInset; private HeadsUpAppearanceController mHeadsUpAppearanceController; private NotificationIconAreaController mIconAreaController; - private float mHorizontalPanelTranslation; private final NotificationLockscreenUserManager mLockscreenUserManager = Dependency.get(NotificationLockscreenUserManager.class); private final Rect mTmpRect = new Rect(); @@ -495,17 +493,17 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd Dependency.get(VisualStabilityManager.class); protected boolean mClearAllEnabled; - private Interpolator mDarkXInterpolator = Interpolators.FAST_OUT_SLOW_IN; + private Interpolator mHideXInterpolator = Interpolators.FAST_OUT_SLOW_IN; private NotificationPanelView mNotificationPanel; private final ShadeController mShadeController = Dependency.get(ShadeController.class); private final NotificationGutsManager mNotificationGutsManager = Dependency.get(NotificationGutsManager.class); private final NotificationSectionsManager mSectionsManager; - /** - * If the {@link NotificationShelf} should be visible when dark. - */ private boolean mAnimateBottomOnLayout; + private float mLastSentAppear; + private float mLastSentExpandedHeight; + private boolean mWillExpand; @Inject public NotificationStackScrollLayout( @@ -513,11 +511,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd AttributeSet attrs, @Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) boolean allowLongPress, NotificationRoundnessManager notificationRoundnessManager, - AmbientPulseManager ambientPulseManager, DynamicPrivacyController dynamicPrivacyController, ConfigurationController configurationController, ActivityStarter activityStarter, - StatusBarStateController statusBarStateController) { + StatusBarStateController statusBarStateController, + HeadsUpManagerPhone headsUpManager, + KeyguardBypassController keyguardBypassController) { super(context, attrs, 0, 0); Resources res = getResources(); @@ -526,8 +525,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd for (int i = 0; i < NUM_SECTIONS; i++) { mSections[i] = new NotificationSection(this); } + mRoundnessManager = notificationRoundnessManager; - mAmbientPulseManager = ambientPulseManager; + mHeadsUpManager = headsUpManager; + mHeadsUpManager.addListener(mRoundnessManager); + mHeadsUpManager.setAnimationStateHandler(this::setHeadsUpGoingAwayAnimationsAllowed); + mKeyguardBypassController = keyguardBypassController; mSectionsManager = new NotificationSectionsManager( @@ -543,8 +546,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd clearNotifications(ROWS_GENTLE, closeShade); }); - mAmbientState = new AmbientState(context, mSectionsManager); - mRoundnessManager = notificationRoundnessManager; + mAmbientState = new AmbientState(context, mSectionsManager, mHeadsUpManager); mBgColor = context.getColor(R.color.notification_shade_background_color); int minHeight = res.getDimensionPixelSize(R.dimen.notification_min_height); int maxHeight = res.getDimensionPixelSize(R.dimen.notification_max_height); @@ -563,17 +565,18 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd res.getBoolean(R.bool.config_fadeNotificationsOnDismiss); mRoundnessManager.setAnimatedChildren(mChildrenToAddAnimated); mRoundnessManager.setOnRoundingChangedCallback(this::invalidate); - addOnExpandedHeightListener(mRoundnessManager::setExpanded); + addOnExpandedHeightChangedListener(mRoundnessManager::setExpanded); setOutlineProvider(mOutlineProvider); // Blocking helper manager wants to know the expanded state, update as well. NotificationBlockingHelperManager blockingHelperManager = Dependency.get(NotificationBlockingHelperManager.class); - addOnExpandedHeightListener((height, unused) -> { + addOnExpandedHeightChangedListener((height, unused) -> { blockingHelperManager.setNotificationShadeExpanded(height); }); - updateWillNotDraw(); + boolean willDraw = mShouldDrawNotificationBackground || DEBUG; + setWillNotDraw(!willDraw); mBackgroundPaint.setAntiAlias(true); if (DEBUG) { mDebugPaint = new Paint(); @@ -604,6 +607,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } }); dynamicPrivacyController.addListener(this); + mDynamicPrivacyController = dynamicPrivacyController; + mStatusbarStateController = (SysuiStatusBarStateController) statusBarStateController; } private void updateDismissRtlSetting(boolean dismissRtl) { @@ -632,10 +637,14 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd /** * @return the height at which we will wake up when pulsing */ - public float getPulseHeight() { + public float getWakeUpHeight() { ActivatableNotificationView firstChild = getFirstChildWithBackground(); if (firstChild != null) { - return firstChild.getCollapsedHeight(); + if (mKeyguardBypassController.getBypassEnabled()) { + return firstChild.getHeadsUpHeightWithoutHeader(); + } else { + return firstChild.getCollapsedHeight(); + } } return 0f; } @@ -690,6 +699,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd */ @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public boolean hasActiveClearableNotifications(@SelectedRows int selection) { + if (mDynamicPrivacyController.isInLockedDownShade()) { + return false; + } int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View child = getChildAt(i); @@ -762,7 +774,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd if (mShouldDrawNotificationBackground && (mSections[0].getCurrentBounds().top < mSections[NUM_SECTIONS - 1].getCurrentBounds().bottom - || mAmbientState.isDark())) { + || mAmbientState.isDozing())) { drawBackground(canvas); } else if (mInHeadsUpPinnedMode || mHeadsUpAnimatingAway) { drawHeadsUpBackground(canvas); @@ -796,7 +808,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd canvas.drawLine(0, y, getWidth(), y, mDebugPaint); } canvas.drawText(Integer.toString(getMaxNegativeScrollAmount()), getWidth() - 100, - getIntrinsicPadding() + 30, mDebugPaint); + getTopPadding() + 30, mDebugPaint); canvas.drawText(Integer.toString(getMaxPositiveScrollAmount()), getWidth() - 100, getHeight() - 30, mDebugPaint); } @@ -808,17 +820,17 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd int lockScreenRight = getWidth() - mSidePaddings; int lockScreenTop = mSections[0].getCurrentBounds().top; int lockScreenBottom = mSections[NUM_SECTIONS - 1].getCurrentBounds().bottom; - int darkLeft = getWidth() / 2; - int darkTop = mTopPadding; + int hiddenLeft = getWidth() / 2; + int hiddenTop = mTopPadding; - float yProgress = 1 - mInterpolatedDarkAmount; - float xProgress = mDarkXInterpolator.getInterpolation( - (1 - mLinearDarkAmount) * mBackgroundXFactor); + float yProgress = 1 - mInterpolatedHideAmount; + float xProgress = mHideXInterpolator.getInterpolation( + (1 - mLinearHideAmount) * mBackgroundXFactor); - int left = (int) MathUtils.lerp(darkLeft, lockScreenLeft, xProgress); - int right = (int) MathUtils.lerp(darkLeft, lockScreenRight, xProgress); - int top = (int) MathUtils.lerp(darkTop, lockScreenTop, yProgress); - int bottom = (int) MathUtils.lerp(darkTop, lockScreenBottom, yProgress); + int left = (int) MathUtils.lerp(hiddenLeft, lockScreenLeft, xProgress); + int right = (int) MathUtils.lerp(hiddenLeft, lockScreenRight, xProgress); + int top = (int) MathUtils.lerp(hiddenTop, lockScreenTop, yProgress); + int bottom = (int) MathUtils.lerp(hiddenTop, lockScreenBottom, yProgress); mBackgroundAnimationRect.set( left, top, @@ -834,7 +846,13 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd break; } } - if (!mAmbientState.isDark() || anySectionHasVisibleChild) { + boolean shouldDrawBackground; + if (mKeyguardBypassController.getBypassEnabled() && onKeyguard()) { + shouldDrawBackground = isPulseExpanding(); + } else { + shouldDrawBackground = !mAmbientState.isDozing() || anySectionHasVisibleChild; + } + if (shouldDrawBackground) { drawBackgroundRects(canvas, left, right, top, backgroundTopAnimationOffset); } @@ -934,7 +952,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd // Interpolate between semi-transparent notification panel background color // and white AOD separator. float colorInterpolation = MathUtils.smoothStep(0.4f /* start */, 1f /* end */, - mLinearDarkAmount); + mLinearHideAmount); int color = ColorUtils.blendARGB(mBgColor, Color.WHITE, colorInterpolation); if (mCachedBackgroundColor != color) { @@ -988,6 +1006,10 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } } + public boolean isPulseExpanding() { + return mAmbientState.isPulseExpanding(); + } + @Override @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { @@ -1030,6 +1052,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd requestChildrenUpdate(); updateFirstAndLastBackgroundViews(); updateAlgorithmLayoutMinHeight(); + updateOwnTranslationZ(); } @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) @@ -1303,7 +1326,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd stackHeight = (int) height; } } else { - appearFraction = getAppearFraction(height); + appearFraction = calculateAppearFraction(height); if (appearFraction >= 0) { translationY = NotificationUtils.interpolate(getExpandTranslationStart(), 0, appearFraction); @@ -1326,9 +1349,26 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd requestChildrenUpdate(); } setStackTranslation(translationY); - for (int i = 0; i < mExpandedHeightListeners.size(); i++) { - BiConsumer<Float, Float> listener = mExpandedHeightListeners.get(i); - listener.accept(mExpandedHeight, appearFraction); + notifyAppearChangedListeners(); + } + + private void notifyAppearChangedListeners() { + float appear; + float expandAmount; + if (mKeyguardBypassController.getBypassEnabled() && onKeyguard()) { + appear = calculateAppearFractionBypass(); + expandAmount = getPulseHeight(); + } else { + appear = MathUtils.saturate(calculateAppearFraction(mExpandedHeight)); + expandAmount = mExpandedHeight; + } + if (appear != mLastSentAppear || expandAmount != mLastSentExpandedHeight) { + mLastSentAppear = appear; + mLastSentExpandedHeight = expandAmount; + for (int i = 0; i < mExpandedHeightListeners.size(); i++) { + BiConsumer<Float, Float> listener = mExpandedHeightListeners.get(i); + listener.accept(expandAmount, appear); + } } } @@ -1355,11 +1395,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd mIsClipped = clipped; } - if (!mPulsing && mAmbientState.isFullyDark()) { - setClipBounds(null); - } else if (mAmbientState.isDarkAtAll()) { + if (mAmbientState.isHiddenAtAll()) { clipToOutline = true; invalidateOutline(); + if (isFullyHidden()) { + setClipBounds(null); + } } else if (clipped) { setClipBounds(mRequestedClipBounds); } else { @@ -1423,7 +1464,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd int notGoneChildCount = getNotGoneChildCount(); if (mEmptyShadeView.getVisibility() == GONE && notGoneChildCount != 0) { if (isHeadsUpTransition() - || (mHeadsUpManager.hasPinnedHeadsUp() && !mAmbientState.isDark())) { + || (mHeadsUpManager.hasPinnedHeadsUp() && !mAmbientState.isDozing())) { appearPosition = getTopHeadsUpPinnedHeight(); } else { appearPosition = 0; @@ -1449,7 +1490,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd * @return the fraction of the appear animation that has been performed */ @ShadeViewRefactor(RefactorComponent.COORDINATOR) - public float getAppearFraction(float height) { + public float calculateAppearFraction(float height) { float appearEndPosition = getAppearEndPosition(); float appearStartPosition = getAppearStartPosition(); return (height - appearStartPosition) @@ -2388,7 +2429,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } mIntrinsicContentHeight = height; - mContentHeight = height + mTopPadding + mBottomMargin; + // The topPadding can be bigger than the regular padding when qs is expanded, in that + // state the maxPanelHeight and the contentHeight should be bigger + mContentHeight = height + Math.max(mIntrinsicPadding, mTopPadding) + mBottomMargin; updateScrollability(); clampScrollPosition(); mAmbientState.setLayoutMaxHeight(mContentHeight); @@ -2426,7 +2469,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) private void updateBackground() { // No need to update the background color if it's not being drawn. - if (!mShouldDrawNotificationBackground || mAmbientState.isFullyDark()) { + if (!mShouldDrawNotificationBackground) { return; } @@ -2518,7 +2561,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } int minTopPosition; NotificationSection lastSection = getLastVisibleSection(); - if (mStatusBarState != StatusBarState.KEYGUARD) { + boolean onKeyguard = mStatusBarState == StatusBarState.KEYGUARD; + if (!onKeyguard) { minTopPosition = (int) (mTopPadding + mStackTranslation); } else if (lastSection == null) { minTopPosition = mTopPadding; @@ -2531,7 +2575,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd false /* shiftPulsingWithFirst */); minTopPosition = firstVisibleSection.getBounds().top; } - boolean shiftPulsingWithFirst = mAmbientPulseManager.getAllEntries().count() <= 1; + boolean shiftPulsingWithFirst = mHeadsUpManager.getAllEntries().count() <= 1 + && (mAmbientState.isDozing() + || (mKeyguardBypassController.getBypassEnabled() && onKeyguard)); for (NotificationSection section : mSections) { int minBottomPosition = minTopPosition; if (section == lastSection) { @@ -2776,12 +2822,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd * * @param qsHeight the top padding imposed by the quick settings panel * @param animate whether to animate the change - * @param ignoreIntrinsicPadding if true, {@link #getIntrinsicPadding()} is ignored and - * {@code qsHeight} is the final top padding */ @ShadeViewRefactor(RefactorComponent.COORDINATOR) - public void updateTopPadding(float qsHeight, boolean animate, - boolean ignoreIntrinsicPadding) { + public void updateTopPadding(float qsHeight, boolean animate) { int topPadding = (int) qsHeight; int minStackHeight = getLayoutMinHeight(); if (topPadding + minStackHeight > getHeight()) { @@ -2789,8 +2832,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } else { mTopPaddingOverflow = 0; } - setTopPadding(ignoreIntrinsicPadding ? topPadding : clampPadding(topPadding), - animate); + setTopPadding(topPadding, animate && !mKeyguardBypassController.getBypassEnabled()); setExpandedHeight(mExpandedHeight); } @@ -3226,7 +3268,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private void updateNotificationAnimationStates() { boolean running = mAnimationsEnabled || hasPulsingNotifications(); mShelf.setAnimationsEnabled(running); - mIconAreaController.setAnimationsEnabled(running); int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View child = getChildAt(i); @@ -3286,7 +3327,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd @Override @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) public void generateAddAnimation(ExpandableView child, boolean fromMoreCard) { - if (mIsExpanded && mAnimationsEnabled && !mChangePositionInProgress) { + if (mIsExpanded && mAnimationsEnabled && !mChangePositionInProgress && !isFullyHidden()) { // Generate Animations mChildrenToAddAnimated.add(child); if (fromMoreCard) { @@ -3294,7 +3335,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } mNeedsAnimation = true; } - if (isHeadsUp(child) && mAnimationsEnabled && !mChangePositionInProgress) { + if (isHeadsUp(child) && mAnimationsEnabled && !mChangePositionInProgress + && !isFullyHidden()) { mAddedHeadsUpChildren.add(child); mChildrenToAddAnimated.remove(child); } @@ -3367,7 +3409,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd generateActivateEvent(); generateDimmedEvent(); generateHideSensitiveEvent(); - generateDarkEvent(); generateGoToFullShadeEvent(); generateViewResizeEvent(); generateGroupExpansionEvent(); @@ -3379,10 +3420,20 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd for (Pair<ExpandableNotificationRow, Boolean> eventPair : mHeadsUpChangeAnimations) { ExpandableNotificationRow row = eventPair.first; boolean isHeadsUp = eventPair.second; + if (isHeadsUp != row.isHeadsUp()) { + // For cases where we have a heads up showing and appearing again we shouldn't + // do the animations at all. + continue; + } int type = AnimationEvent.ANIMATION_TYPE_HEADS_UP_OTHER; boolean onBottom = false; boolean pinnedAndClosed = row.isPinned() && !mIsExpanded; - if (!mIsExpanded && !isHeadsUp) { + boolean performDisappearAnimation = !mIsExpanded + // Only animate if we still have pinned heads up, otherwise we just have the + // regular collapse animation of the lock screen + || (mKeyguardBypassController.getBypassEnabled() && onKeyguard() + && mHeadsUpManager.hasPinnedHeadsUp()); + if (performDisappearAnimation && !isHeadsUp) { type = row.wasJustClicked() ? AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK : AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR; @@ -3532,7 +3583,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private void generateTopPaddingEvent() { if (mTopPaddingNeedsAnimation) { AnimationEvent event; - if (mAmbientState.isDark()) { + if (mAmbientState.isDozing()) { event = new AnimationEvent(null /* view */, AnimationEvent.ANIMATION_TYPE_TOP_PADDING_CHANGED, KeyguardSliceView.DEFAULT_ANIM_DURATION); @@ -3582,20 +3633,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) - private void generateDarkEvent() { - if (mDarkNeedsAnimation) { - AnimationEvent ev = new AnimationEvent(null, - AnimationEvent.ANIMATION_TYPE_DARK, - new AnimationFilter() - .animateDark() - .animateY(mShelf)); - ev.darkAnimationOriginIndex = mDarkAnimationOriginIndex; - mAnimationEvents.add(ev); - } - mDarkNeedsAnimation = false; - } - - @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) private void generateGoToFullShadeEvent() { if (mGoToFullShadeNeedsAnimation) { mAnimationEvents.add( @@ -4379,6 +4416,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd mStateAnimator.setShadeExpanded(isExpanded); mSwipeHelper.setIsExpanded(isExpanded); if (changed) { + mWillExpand = false; if (!mIsExpanded) { mGroupManager.collapseAllGroups(); mExpandHelper.cancelImmediately(); @@ -4697,14 +4735,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd return mIntrinsicPadding; } - /** - * @return the y position of the first notification - */ - @ShadeViewRefactor(RefactorComponent.COORDINATOR) - public float getNotificationsTopY() { - return mTopPadding + getStackTranslation(); - } - @Override @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public boolean shouldDelayChildPressedState() { @@ -4712,126 +4742,82 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } /** - * See {@link AmbientState#setDark}. + * See {@link AmbientState#setDozing}. */ @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public void setDark(boolean dark, boolean animate, @Nullable PointF touchWakeUpScreenLocation) { - if (mAmbientState.isDark() == dark) { + public void setDozing(boolean dozing, boolean animate, + @Nullable PointF touchWakeUpScreenLocation) { + if (mAmbientState.isDozing() == dozing) { return; } - mAmbientState.setDark(dark); - if (animate && mAnimationsEnabled) { - mDarkNeedsAnimation = true; - mDarkAnimationOriginIndex = findDarkAnimationOriginIndex(touchWakeUpScreenLocation); - mNeedsAnimation = true; - } else { - setDarkAmount(dark ? 1f : 0f); - updateBackground(); - } + mAmbientState.setDozing(dozing); requestChildrenUpdate(); - updateWillNotDraw(); notifyHeightChangeListener(mShelf); } - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - private void updatePanelTranslation() { - setTranslationX(mHorizontalPanelTranslation + mAntiBurnInOffsetX * mInterpolatedDarkAmount); - } - - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public void setHorizontalPanelTranslation(float verticalPanelTranslation) { - mHorizontalPanelTranslation = verticalPanelTranslation; - updatePanelTranslation(); - } - /** - * Updates whether or not this Layout will perform its own custom drawing (i.e. whether or - * not {@link #onDraw(Canvas)} is called). This method should be called whenever the - * {@link #mAmbientState}'s dark mode is toggled. - */ - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - private void updateWillNotDraw() { - boolean willDraw = mShouldDrawNotificationBackground || DEBUG; - setWillNotDraw(!willDraw); - } - - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - private void setDarkAmount(float darkAmount) { - setDarkAmount(darkAmount, darkAmount); - } - - /** - * Sets the current dark amount. + * Sets the current hide amount. * - * @param linearDarkAmount The dark amount that follows linear interpoloation in the + * @param linearHideAmount The hide amount that follows linear interpoloation in the * animation, * i.e. animates from 0 to 1 or vice-versa in a linear manner. - * @param interpolatedDarkAmount The dark amount that follows the actual interpolation of the + * @param interpolatedHideAmount The hide amount that follows the actual interpolation of the * animation curve. */ @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public void setDarkAmount(float linearDarkAmount, float interpolatedDarkAmount) { - mLinearDarkAmount = linearDarkAmount; - mInterpolatedDarkAmount = interpolatedDarkAmount; - boolean wasFullyDark = mAmbientState.isFullyDark(); - boolean wasDarkAtAll = mAmbientState.isDarkAtAll(); - mAmbientState.setDarkAmount(interpolatedDarkAmount); - boolean nowFullyDark = mAmbientState.isFullyDark(); - boolean nowDarkAtAll = mAmbientState.isDarkAtAll(); - if (nowFullyDark != wasFullyDark) { - updateContentHeight(); - if (nowFullyDark) { - updateDarkShelfVisibility(); - } - } - if (!wasDarkAtAll && nowDarkAtAll) { + public void setHideAmount(float linearHideAmount, float interpolatedHideAmount) { + mLinearHideAmount = linearHideAmount; + mInterpolatedHideAmount = interpolatedHideAmount; + boolean wasFullyHidden = mAmbientState.isFullyHidden(); + boolean wasHiddenAtAll = mAmbientState.isHiddenAtAll(); + mAmbientState.setHideAmount(interpolatedHideAmount); + boolean nowFullyHidden = mAmbientState.isFullyHidden(); + boolean nowHiddenAtAll = mAmbientState.isHiddenAtAll(); + if (nowFullyHidden != wasFullyHidden) { + updateVisibility(); + } + if (!wasHiddenAtAll && nowHiddenAtAll) { resetExposedMenuView(true /* animate */, true /* animate */); } - if (nowFullyDark != wasFullyDark || wasDarkAtAll != nowDarkAtAll) { + if (nowFullyHidden != wasFullyHidden || wasHiddenAtAll != nowHiddenAtAll) { invalidateOutline(); } updateAlgorithmHeightAndPadding(); updateBackgroundDimming(); - updatePanelTranslation(); requestChildrenUpdate(); + updateOwnTranslationZ(); } - private void updateDarkShelfVisibility() { - DozeParameters dozeParameters = DozeParameters.getInstance(mContext); - if (dozeParameters.shouldControlScreenOff()) { - mShelf.fadeInTranslating(); + private void updateOwnTranslationZ() { + // Since we are clipping to the outline we need to make sure that the shadows aren't + // clipped when pulsing + float ownTranslationZ = 0; + if (mKeyguardBypassController.getBypassEnabled() && mAmbientState.isHiddenAtAll()) { + ExpandableView firstChildNotGone = getFirstChildNotGone(); + if (firstChildNotGone != null && firstChildNotGone.showingPulsing()) { + ownTranslationZ = firstChildNotGone.getTranslationZ(); + } } - updateClipping(); + setTranslationZ(ownTranslationZ); + } + + private void updateVisibility() { + boolean shouldShow = !mAmbientState.isFullyHidden() || !onKeyguard(); + setVisibility(shouldShow ? View.VISIBLE : View.INVISIBLE); } @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) - public void notifyDarkAnimationStart(boolean dark) { - // We only swap the scaling factor if we're fully dark or fully awake to avoid + public void notifyHideAnimationStart(boolean hide) { + // We only swap the scaling factor if we're fully hidden or fully awake to avoid // interpolation issues when playing with the power button. - if (mInterpolatedDarkAmount == 0 || mInterpolatedDarkAmount == 1) { - mBackgroundXFactor = dark ? 1.8f : 1.5f; - mDarkXInterpolator = dark + if (mInterpolatedHideAmount == 0 || mInterpolatedHideAmount == 1) { + mBackgroundXFactor = hide ? 1.8f : 1.5f; + mHideXInterpolator = hide ? Interpolators.FAST_OUT_SLOW_IN_REVERSE : Interpolators.FAST_OUT_SLOW_IN; } } - @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) - private int findDarkAnimationOriginIndex(@Nullable PointF screenLocation) { - if (screenLocation == null || screenLocation.y < mTopPadding) { - return AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_ABOVE; - } - if (screenLocation.y > getBottomMostNotificationBottom()) { - return AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_BELOW; - } - View child = getClosestChildAtRawPosition(screenLocation.x, screenLocation.y); - if (child != null) { - return getNotGoneIndex(child); - } else { - return AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_ABOVE; - } - } - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) private int getNotGoneIndex(View child) { int count = getChildCount(); @@ -5084,13 +5070,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd mAnimationFinishedRunnables.add(runnable); } - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public void setHeadsUpManager(HeadsUpManagerPhone headsUpManager) { - mHeadsUpManager = headsUpManager; - mHeadsUpManager.addListener(mRoundnessManager); - mHeadsUpManager.setAnimationStateHandler(this::setHeadsUpGoingAwayAnimationsAllowed); - } - public void generateHeadsUpAnimation(NotificationEntry entry, boolean isHeadsUp) { ExpandableNotificationRow row = entry.getHeadsUpAnimationView(); generateHeadsUpAnimation(row, isHeadsUp); @@ -5101,7 +5080,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd if (mAnimationsEnabled && (isHeadsUp || mHeadsUpGoingAwayAnimationsAllowed)) { mHeadsUpChangeAnimations.add(new Pair<>(row, isHeadsUp)); mNeedsAnimation = true; - if (!mIsExpanded && !isHeadsUp) { + if (!mIsExpanded && !mWillExpand && !isHeadsUp) { row.setHeadsUpAnimatingAway(true); } requestChildrenUpdate(); @@ -5122,6 +5101,11 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd requestChildrenUpdate(); } + @Override + public void setWillExpand(boolean willExpand) { + mWillExpand = willExpand; + } + @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public void setTrackingHeadsUp(ExpandableNotificationRow row) { mTrackingHeadsUp = row != null; @@ -5169,7 +5153,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd return; } mPulsing = pulsing; - updateClipping(); mAmbientState.setPulsing(pulsing); mSwipeHelper.setPulsing(pulsing); updateNotificationAnimationStates(); @@ -5318,7 +5301,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd boolean publicMode = mLockscreenUserManager.isAnyProfilePublicMode(); if (mHeadsUpAppearanceController != null) { - mHeadsUpAppearanceController.setPublicMode(publicMode); + mHeadsUpAppearanceController.onStateChanged(); } SysuiStatusBarStateController state = (SysuiStatusBarStateController) @@ -5336,6 +5319,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd onUpdateRowStates(); mEntryManager.updateNotifications(); + updateVisibility(); } @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) @@ -5374,12 +5358,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public void setAntiBurnInOffsetX(int antiBurnInOffsetX) { - mAntiBurnInOffsetX = antiBurnInOffsetX; - updatePanelTranslation(); - } - - @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println(String.format("[%s: pulsing=%s qsCustomizerShowing=%s visibility=%s" + " alpha:%f scrollY:%d maxTopPadding:%d showShelfOnly=%s" @@ -5432,18 +5410,18 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public boolean isFullyDark() { - return mAmbientState.isFullyDark(); + public boolean isFullyHidden() { + return mAmbientState.isFullyHidden(); } /** - * Add a listener whenever the expanded height changes. The first value passed as an argument - * is the expanded height and the second one is the appearFraction. + * Add a listener whenever the expanded height changes. The first value passed as an + * argument is the expanded height and the second one is the appearFraction. * * @param listener the listener to notify. */ @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public void addOnExpandedHeightListener(BiConsumer<Float, Float> listener) { + public void addOnExpandedHeightChangedListener(BiConsumer<Float, Float> listener) { mExpandedHeightListeners.add(listener); } @@ -5451,7 +5429,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd * Stop a listener from listening to the expandedHeight. */ @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - public void removeOnExpandedHeightListener(BiConsumer<Float, Float> listener) { + public void removeOnExpandedHeightChangedListener(BiConsumer<Float, Float> listener) { mExpandedHeightListeners.remove(listener); } @@ -5672,12 +5650,19 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd */ public float setPulseHeight(float height) { mAmbientState.setPulseHeight(height); + if (mKeyguardBypassController.getBypassEnabled()) { + notifyAppearChangedListeners(); + } requestChildrenUpdate(); return Math.max(0, height - mAmbientState.getInnerHeight(true /* ignorePulseHeight */)); } + public float getPulseHeight() { + return mAmbientState.getPulseHeight(); + } + /** - * Set the amount how much we're dozing. This is different from how dark the shade is, when + * Set the amount how much we're dozing. This is different from how hidden the shade is, when * the notification is pulsing. */ public void setDozeAmount(float dozeAmount) { @@ -5687,7 +5672,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } public void wakeUpFromPulse() { - setPulseHeight(getPulseHeight()); + setPulseHeight(getWakeUpHeight()); // Let's place the hidden views at the end of the pulsing notification to make sure we have // a smooth animation boolean firstVisibleView = true; @@ -5721,6 +5706,25 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd // The bottom might change because we're using the final actual height of the view mAnimateBottomOnLayout = true; } + // Let's update the footer once the notifications have been updated (in the next frame) + post(() -> { + updateFooter(); + updateSectionBoundaries(); + }); + } + + public void setOnPulseHeightChangedListener(Runnable listener) { + mAmbientState.setOnPulseHeightChangedListener(listener); + } + + public float calculateAppearFractionBypass() { + float pulseHeight = getPulseHeight(); + float wakeUpHeight = getWakeUpHeight(); + float dragDownAmount = pulseHeight - wakeUpHeight; + + // The total distance required to fully reveal the header + float totalDistance = getIntrinsicPadding(); + return MathUtils.smoothStep(0, totalDistance, dragDownAmount); } /** @@ -5896,9 +5900,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd .animateY() .animateZ(), - // ANIMATION_TYPE_DARK - null, // Unused - // ANIMATION_TYPE_GO_TO_FULL_SHADE new AnimationFilter() .animateHeight() @@ -5960,7 +5961,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd // ANIMATION_TYPE_EVERYTHING new AnimationFilter() .animateAlpha() - .animateDark() .animateDimmed() .animateHideSensitive() .animateHeight() @@ -5992,9 +5992,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd // ANIMATION_TYPE_CHANGE_POSITION StackStateAnimator.ANIMATION_DURATION_STANDARD, - // ANIMATION_TYPE_DARK - StackStateAnimator.ANIMATION_DURATION_WAKEUP, - // ANIMATION_TYPE_GO_TO_FULL_SHADE StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE, @@ -6030,19 +6027,15 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd static final int ANIMATION_TYPE_ACTIVATED_CHILD = 4; static final int ANIMATION_TYPE_DIMMED = 5; static final int ANIMATION_TYPE_CHANGE_POSITION = 6; - static final int ANIMATION_TYPE_DARK = 7; - static final int ANIMATION_TYPE_GO_TO_FULL_SHADE = 8; - static final int ANIMATION_TYPE_HIDE_SENSITIVE = 9; - static final int ANIMATION_TYPE_VIEW_RESIZE = 10; - static final int ANIMATION_TYPE_GROUP_EXPANSION_CHANGED = 11; - static final int ANIMATION_TYPE_HEADS_UP_APPEAR = 12; - static final int ANIMATION_TYPE_HEADS_UP_DISAPPEAR = 13; - static final int ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK = 14; - static final int ANIMATION_TYPE_HEADS_UP_OTHER = 15; - static final int ANIMATION_TYPE_EVERYTHING = 16; - - static final int DARK_ANIMATION_ORIGIN_INDEX_ABOVE = -1; - static final int DARK_ANIMATION_ORIGIN_INDEX_BELOW = -2; + static final int ANIMATION_TYPE_GO_TO_FULL_SHADE = 7; + static final int ANIMATION_TYPE_HIDE_SENSITIVE = 8; + static final int ANIMATION_TYPE_VIEW_RESIZE = 9; + static final int ANIMATION_TYPE_GROUP_EXPANSION_CHANGED = 10; + static final int ANIMATION_TYPE_HEADS_UP_APPEAR = 11; + static final int ANIMATION_TYPE_HEADS_UP_DISAPPEAR = 12; + static final int ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK = 13; + static final int ANIMATION_TYPE_HEADS_UP_OTHER = 14; + static final int ANIMATION_TYPE_EVERYTHING = 15; final long eventStartTime; final ExpandableView mChangingView; @@ -6050,7 +6043,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd final AnimationFilter filter; final long length; View viewAfterChangingView; - int darkAnimationOriginIndex; boolean headsUpFromBottom; AnimationEvent(ExpandableView view, int type) { @@ -6305,6 +6297,15 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd mAmbientState.onDragFinished(animView); updateContinuousShadowDrawing(); updateContinuousBackgroundDrawing(); + if (animView instanceof ExpandableNotificationRow) { + ExpandableNotificationRow row = (ExpandableNotificationRow) animView; + if (row.isPinned() && !canChildBeDismissed(row) + && row.getStatusBarNotification().getNotification().fullScreenIntent + == null) { + mHeadsUpManager.removeNotification(row.getStatusBarNotification().getKey(), + true /* removeImmediately */); + } + } } @Override @@ -6355,7 +6356,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd (int) (dragLengthY / mDisplayMetrics.density), 0 /* velocityDp - N/A */); - if (!mAmbientState.isDark() || startingChild != null) { + if (!mAmbientState.isDozing() || startingChild != null) { // We have notifications, go to locked shade. mShadeController.goToLockedShade(startingChild); if (startingChild instanceof ExpandableNotificationRow) { @@ -6365,6 +6366,11 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } return true; + } else if (mDynamicPrivacyController.isInLockedDownShade()) { + mStatusbarStateController.setLeaveOpenOnKeyguardHide(true); + mStatusBar.dismissKeyguardThenExecute(() -> false /* dismissAction */, + null /* cancelRunnable */, false /* afterKeyguardGone */); + return true; } else { // abort gesture. return false; @@ -6398,6 +6404,30 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd public boolean isFalsingCheckNeeded() { return mStatusBarState == StatusBarState.KEYGUARD; } + + @Override + public boolean isDragDownEnabledForView(ExpandableView view) { + if (isDragDownAnywhereEnabled()) { + return true; + } + if (mDynamicPrivacyController.isInLockedDownShade()) { + if (view == null) { + // Dragging down is allowed in general + return true; + } + if (view instanceof ExpandableNotificationRow) { + // Only drag down on sensitive views, otherwise the ExpandHelper will take this + return ((ExpandableNotificationRow) view).getEntry().isSensitive(); + } + } + return false; + } + + @Override + public boolean isDragDownAnywhereEnabled() { + return mStatusbarStateController.getState() == StatusBarState.KEYGUARD + && !mKeyguardBypassController.getBypassEnabled(); + } }; public DragDownCallback getDragDownCallback() { return mDragDownCallback; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/SectionHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/SectionHeaderView.java index cc1170f7409b..b444fa50a253 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/SectionHeaderView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/SectionHeaderView.java @@ -83,6 +83,11 @@ public class SectionHeaderView extends ActivatableNotificationView { bindContents(); } + @Override + public boolean isTransparent() { + return true; + } + /** Must be called whenever the UI mode changes (i.e. when we enter night mode). */ void onUiModeChanged() { updateBackgroundColors(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index d9f8c88e0d13..ef8048487022 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -159,15 +159,14 @@ public class StackScrollAlgorithm { float drawStart = !ambientState.isOnKeyguard() ? ambientState.getTopPadding() + ambientState.getStackTranslation() + ambientState.getExpandAnimationTopChange() : 0; - float previousNotificationEnd = 0; - float previousNotificationStart = 0; + float clipStart = 0; int childCount = algorithmState.visibleChildren.size(); + boolean firstHeadsUp = true; for (int i = 0; i < childCount; i++) { ExpandableView child = algorithmState.visibleChildren.get(i); ExpandableViewState state = child.getViewState(); if (!child.mustStayOnScreen() || state.headsUpIsVisible) { - previousNotificationEnd = Math.max(drawStart, previousNotificationEnd); - previousNotificationStart = Math.max(drawStart, previousNotificationStart); + clipStart = Math.max(drawStart, clipStart); } float newYTranslation = state.yTranslation; float newHeight = state.height; @@ -175,20 +174,21 @@ public class StackScrollAlgorithm { boolean isHeadsUp = (child instanceof ExpandableNotificationRow) && ((ExpandableNotificationRow) child).isPinned(); if (mClipNotificationScrollToTop - && !state.inShelf && newYTranslation < previousNotificationEnd - && (!isHeadsUp || ambientState.isShadeExpanded())) { + && (!state.inShelf || (isHeadsUp && !firstHeadsUp)) + && newYTranslation < clipStart) { // The previous view is overlapping on top, clip! - float overlapAmount = previousNotificationEnd - newYTranslation; + float overlapAmount = clipStart - newYTranslation; state.clipTopAmount = (int) overlapAmount; } else { state.clipTopAmount = 0; } - + if (isHeadsUp) { + firstHeadsUp = false; + } if (!child.isTransparent()) { // Only update the previous values if we are not transparent, // otherwise we would clip to a transparent view. - previousNotificationEnd = newNotificationEnd; - previousNotificationStart = newYTranslation; + clipStart = Math.max(clipStart, isHeadsUp ? newYTranslation : newNotificationEnd); } } } @@ -213,7 +213,6 @@ public class StackScrollAlgorithm { private void updateDimmedActivatedHideSensitive(AmbientState ambientState, StackScrollAlgorithmState algorithmState) { boolean dimmed = ambientState.isDimmed(); - boolean dark = ambientState.isFullyDark(); boolean hideSensitive = ambientState.isHideSensitive(); View activatedChild = ambientState.getActivatedChild(); int childCount = algorithmState.visibleChildren.size(); @@ -221,7 +220,6 @@ public class StackScrollAlgorithm { ExpandableView child = algorithmState.visibleChildren.get(i); ExpandableViewState childViewState = child.getViewState(); childViewState.dimmed = dimmed; - childViewState.dark = dark; childViewState.hideSensitive = hideSensitive; boolean isActivatedChild = activatedChild == child; if (dimmed && isActivatedChild) { @@ -255,7 +253,7 @@ public class StackScrollAlgorithm { state.paddingMap.clear(); int notGoneIndex = 0; ExpandableView lastView = null; - int firstHiddenIndex = ambientState.isDark() + int firstHiddenIndex = ambientState.isDozing() ? (ambientState.hasPulsingNotifications() ? 1 : 0) : childCount; @@ -501,8 +499,7 @@ public class StackScrollAlgorithm { continue; } ExpandableNotificationRow row = (ExpandableNotificationRow) child; - if (!row.showingAmbientPulsing() || ambientState.isFullyDark() - || (i == 0 && ambientState.isPulseExpanding())) { + if (!row.showingPulsing() || (i == 0 && ambientState.isPulseExpanding())) { continue; } ExpandableViewState viewState = row.getViewState(); @@ -517,11 +514,11 @@ public class StackScrollAlgorithm { for (int i = 0; i < childCount; i++) { View child = algorithmState.visibleChildren.get(i); if (!(child instanceof ExpandableNotificationRow)) { - break; + continue; } ExpandableNotificationRow row = (ExpandableNotificationRow) child; if (!row.isHeadsUp()) { - break; + continue; } ExpandableViewState childState = row.getViewState(); if (topHeadsUpEntry == null && row.mustStayOnScreen() && !childState.headsUpIsVisible) { @@ -531,7 +528,8 @@ public class StackScrollAlgorithm { boolean isTopEntry = topHeadsUpEntry == row; float unmodifiedEndLocation = childState.yTranslation + childState.height; if (mIsExpanded) { - if (row.mustStayOnScreen() && !childState.headsUpIsVisible) { + if (row.mustStayOnScreen() && !childState.headsUpIsVisible + && !row.showingPulsing()) { // Ensure that the heads up is always visible even when scrolled off clampHunToTop(ambientState, row, childState); if (i == 0 && row.isAboveShelf()) { @@ -548,12 +546,12 @@ public class StackScrollAlgorithm { ExpandableViewState topState = topHeadsUpEntry == null ? null : topHeadsUpEntry.getViewState(); if (topState != null && !isTopEntry && (!mIsExpanded - || unmodifiedEndLocation < topState.yTranslation + topState.height)) { + || unmodifiedEndLocation > topState.yTranslation + topState.height)) { // Ensure that a headsUp doesn't vertically extend further than the heads-up at // the top most z-position childState.height = row.getIntrinsicHeight(); - childState.yTranslation = topState.yTranslation + topState.height - - childState.height; + childState.yTranslation = Math.min(topState.yTranslation + topState.height + - childState.height, childState.yTranslation); } // heads up notification show and this row is the top entry of heads up @@ -668,7 +666,7 @@ public class StackScrollAlgorithm { } childViewState.zTranslation = baseZ + childrenOnTop * zDistanceBetweenElements; - } else if (i == 0 && child.isAboveShelf()) { + } else if (i == 0 && (child.isAboveShelf() || child.showingPulsing())) { // In case this is a new view that has never been measured before, we don't want to // elevate if we are currently expanded more then the notification int shelfHeight = ambientState.getShelf() == null ? 0 : diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java index a6f4ca54ba91..0996ff27e9a3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java @@ -28,6 +28,7 @@ import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.StatusBarIconView; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.ExpandableView; @@ -174,8 +175,7 @@ public class StackStateAnimator { || viewState.zTranslation != child.getTranslationZ() || viewState.alpha != child.getAlpha() || viewState.height != child.getActualHeight() - || viewState.clipTopAmount != child.getClipTopAmount() - || viewState.dark != child.isDark())) { + || viewState.clipTopAmount != child.getClipTopAmount())) { mAnimationProperties.delay = mCurrentAdditionalDelay + calculateChildAnimationDelay(viewState, animationStaggerCount); } @@ -452,7 +452,11 @@ public class StackStateAnimator { if (row.isDismissed()) { needsAnimation = false; } - StatusBarIconView icon = row.getEntry().icon; + NotificationEntry entry = row.getEntry(); + StatusBarIconView icon = entry.icon; + if (entry.centeredIcon != null && entry.centeredIcon.getParent() != null) { + icon = entry.centeredIcon; + } if (icon.getParent() != null) { icon.getLocationOnScreen(mTmpLocation); float iconPosition = mTmpLocation[0] - icon.getTranslationX() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index eccd70b4a597..41c6a7ba7848 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.phone; +import android.annotation.IntDef; import android.content.Context; import android.hardware.biometrics.BiometricSourceType; import android.metrics.LogMaker; @@ -23,7 +24,6 @@ import android.os.Handler; import android.os.PowerManager; import android.os.SystemClock; import android.os.Trace; -import android.provider.Settings; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; @@ -34,14 +34,14 @@ import com.android.keyguard.KeyguardConstants; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.Dependency; -import com.android.systemui.R; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.statusbar.NotificationMediaManager; -import com.android.systemui.tuner.TunerService; import java.io.PrintWriter; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; /** * Controller which coordinates all the biometric unlocking actions with the UI. @@ -53,6 +53,20 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { private static final long BIOMETRIC_WAKELOCK_TIMEOUT_MS = 15 * 1000; private static final String BIOMETRIC_WAKE_LOCK_NAME = "wake-and-unlock wakelock"; + @IntDef(prefix = { "MODE_" }, value = { + MODE_NONE, + MODE_WAKE_AND_UNLOCK, + MODE_WAKE_AND_UNLOCK_PULSING, + MODE_SHOW_BOUNCER, + MODE_ONLY_WAKE, + MODE_UNLOCK_COLLAPSING, + MODE_UNLOCK_FADING, + MODE_DISMISS_BOUNCER, + MODE_WAKE_AND_UNLOCK_FROM_DREAM + }) + @Retention(RetentionPolicy.SOURCE) + public @interface WakeAndUnlockMode {} + /** * Mode in which we don't need to wake up the device when we authenticate. */ @@ -84,38 +98,33 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { /** * Mode in which fingerprint unlocks the device. */ - public static final int MODE_UNLOCK = 5; - - /** - * Mode in which fingerprint brings up the bouncer because fingerprint unlocking is currently - * not allowed. - */ - public static final int MODE_DISMISS_BOUNCER = 6; + public static final int MODE_UNLOCK_COLLAPSING = 5; /** * Mode in which fingerprint wakes and unlocks the device from a dream. */ - public static final int MODE_WAKE_AND_UNLOCK_FROM_DREAM = 7; + public static final int MODE_WAKE_AND_UNLOCK_FROM_DREAM = 6; /** - * How much faster we collapse the lockscreen when authenticating with biometric. + * Faster mode of dismissing the lock screen when we cross fade to an app + * (used for keyguard bypass.) */ - private static final float BIOMETRIC_COLLAPSE_SPEEDUP_FACTOR = 1.1f; + public static final int MODE_UNLOCK_FADING = 7; /** - * If face unlock dismisses the lock screen or keeps user on keyguard by default on this device. + * When bouncer is visible and will be dismissed. */ - private final boolean mFaceDismissesKeyguardByDefault; + public static final int MODE_DISMISS_BOUNCER = 8; /** - * If face unlock dismisses the lock screen or keeps user on keyguard for the current user. + * How much faster we collapse the lockscreen when authenticating with biometric. */ - @VisibleForTesting - protected boolean mFaceDismissesKeyguard; + private static final float BIOMETRIC_COLLAPSE_SPEEDUP_FACTOR = 1.1f; private final NotificationMediaManager mMediaManager; private final PowerManager mPowerManager; private final Handler mHandler; + private final KeyguardBypassController mKeyguardBypassController; private PowerManager.WakeLock mWakeLock; private final KeyguardUpdateMonitor mUpdateMonitor; private final UnlockMethodCache mUnlockMethodCache; @@ -134,16 +143,6 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { private boolean mHasScreenTurnedOnSinceAuthenticating; private boolean mFadedAwayAfterWakeAndUnlock; - private final TunerService.Tunable mFaceDismissedKeyguardTunable = new TunerService.Tunable() { - @Override - public void onTuningChanged(String key, String newValue) { - int defaultValue = mFaceDismissesKeyguardByDefault ? 1 : 0; - mFaceDismissesKeyguard = Settings.Secure.getIntForUser(mContext.getContentResolver(), - Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD, - defaultValue, KeyguardUpdateMonitor.getCurrentUser()) != 0; - } - }; - private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class); public BiometricUnlockController(Context context, @@ -153,12 +152,12 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { StatusBar statusBar, UnlockMethodCache unlockMethodCache, Handler handler, KeyguardUpdateMonitor keyguardUpdateMonitor, - TunerService tunerService) { + KeyguardBypassController keyguardBypassController) { this(context, dozeScrimController, keyguardViewMediator, scrimController, statusBar, - unlockMethodCache, handler, keyguardUpdateMonitor, tunerService, + unlockMethodCache, handler, keyguardUpdateMonitor, context.getResources() .getInteger(com.android.internal.R.integer.config_wakeUpDelayDoze), - context.getResources().getBoolean(R.bool.config_faceAuthDismissesKeyguard)); + keyguardBypassController); } @VisibleForTesting @@ -169,9 +168,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { StatusBar statusBar, UnlockMethodCache unlockMethodCache, Handler handler, KeyguardUpdateMonitor keyguardUpdateMonitor, - TunerService tunerService, int wakeUpDelay, - boolean faceDismissesKeyguard) { + KeyguardBypassController keyguardBypassController) { mContext = context; mPowerManager = context.getSystemService(PowerManager.class); mUpdateMonitor = keyguardUpdateMonitor; @@ -187,9 +185,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { mUnlockMethodCache = unlockMethodCache; mHandler = handler; mWakeUpDelay = wakeUpDelay; - mFaceDismissesKeyguardByDefault = faceDismissesKeyguard; - tunerService.addTunable(mFaceDismissedKeyguardTunable, - Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD); + mKeyguardBypassController = keyguardBypassController; + mKeyguardBypassController.setUnlockController(this); } public void setStatusBarKeyguardViewManager( @@ -261,11 +258,21 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { } mMetricsLogger.write(new LogMaker(MetricsEvent.BIOMETRIC_AUTH) .setType(MetricsEvent.TYPE_SUCCESS).setSubtype(toSubtype(biometricSourceType))); + boolean unlockAllowed = mKeyguardBypassController.onBiometricAuthenticated( + biometricSourceType); + if (unlockAllowed) { + mKeyguardViewMediator.userActivity(); + startWakeAndUnlock(biometricSourceType); + } else { + Log.d(TAG, "onBiometricAuthenticated aborted by bypass controller"); + } + } + + public void startWakeAndUnlock(BiometricSourceType biometricSourceType) { startWakeAndUnlock(calculateMode(biometricSourceType)); } - public void startWakeAndUnlock(int mode) { - // TODO(b/62444020): remove when this bug is fixed + public void startWakeAndUnlock(@WakeAndUnlockMode int mode) { Log.v(TAG, "startWakeAndUnlock(" + mode + ")"); boolean wasDeviceInteractive = mUpdateMonitor.isDeviceInteractive(); mMode = mode; @@ -297,19 +304,20 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { Trace.endSection(); }; - if (!delayWakeUp) { + if (!delayWakeUp && mMode != MODE_NONE) { wakeUp.run(); } switch (mMode) { case MODE_DISMISS_BOUNCER: - Trace.beginSection("MODE_DISMISS"); + case MODE_UNLOCK_FADING: + Trace.beginSection("MODE_DISMISS_BOUNCER or MODE_UNLOCK_FADING"); mStatusBarKeyguardViewManager.notifyKeyguardAuthenticated( false /* strongAuth */); Trace.endSection(); break; - case MODE_UNLOCK: + case MODE_UNLOCK_COLLAPSING: case MODE_SHOW_BOUNCER: - Trace.beginSection("MODE_UNLOCK or MODE_SHOW_BOUNCER"); + Trace.beginSection("MODE_UNLOCK_COLLAPSING or MODE_SHOW_BOUNCER"); if (!wasDeviceInteractive) { mPendingShowBouncer = true; } else { @@ -390,33 +398,38 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { return mMode; } - private int calculateMode(BiometricSourceType biometricSourceType) { + private @WakeAndUnlockMode int calculateMode(BiometricSourceType biometricSourceType) { + if (biometricSourceType == BiometricSourceType.FACE + || biometricSourceType == BiometricSourceType.IRIS) { + return calculateModeForPassiveAuth(); + } else { + return calculateModeForFingerprint(); + } + } + + private @WakeAndUnlockMode int calculateModeForFingerprint() { boolean unlockingAllowed = mUpdateMonitor.isUnlockingWithBiometricAllowed(); boolean deviceDreaming = mUpdateMonitor.isDreaming(); - boolean faceStayingOnKeyguard = biometricSourceType == BiometricSourceType.FACE - && !mFaceDismissesKeyguard; if (!mUpdateMonitor.isDeviceInteractive()) { if (!mStatusBarKeyguardViewManager.isShowing()) { return MODE_ONLY_WAKE; } else if (mDozeScrimController.isPulsing() && unlockingAllowed) { - return faceStayingOnKeyguard ? MODE_NONE : MODE_WAKE_AND_UNLOCK_PULSING; + return MODE_WAKE_AND_UNLOCK_PULSING; } else if (unlockingAllowed || !mUnlockMethodCache.isMethodSecure()) { return MODE_WAKE_AND_UNLOCK; } else { return MODE_SHOW_BOUNCER; } } - if (unlockingAllowed && deviceDreaming && !faceStayingOnKeyguard) { + if (unlockingAllowed && deviceDreaming) { return MODE_WAKE_AND_UNLOCK_FROM_DREAM; } if (mStatusBarKeyguardViewManager.isShowing()) { - if ((mStatusBarKeyguardViewManager.isBouncerShowing() - || mStatusBarKeyguardViewManager.isBouncerPartiallyVisible()) - && unlockingAllowed) { + if (mStatusBarKeyguardViewManager.bouncerIsOrWillBeShowing() && unlockingAllowed) { return MODE_DISMISS_BOUNCER; } else if (unlockingAllowed) { - return faceStayingOnKeyguard ? MODE_ONLY_WAKE : MODE_UNLOCK; + return MODE_UNLOCK_COLLAPSING; } else if (!mStatusBarKeyguardViewManager.isBouncerShowing()) { return MODE_SHOW_BOUNCER; } @@ -424,6 +437,51 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { return MODE_NONE; } + private @WakeAndUnlockMode int calculateModeForPassiveAuth() { + boolean unlockingAllowed = mUpdateMonitor.isUnlockingWithBiometricAllowed(); + boolean deviceDreaming = mUpdateMonitor.isDreaming(); + boolean bypass = mKeyguardBypassController.getBypassEnabled(); + + if (!mUpdateMonitor.isDeviceInteractive()) { + if (!mStatusBarKeyguardViewManager.isShowing()) { + return bypass ? MODE_WAKE_AND_UNLOCK : MODE_ONLY_WAKE; + } else if (!unlockingAllowed) { + return bypass ? MODE_SHOW_BOUNCER : MODE_NONE; + } else if (mDozeScrimController.isPulsing()) { + // Let's not wake-up to lock screen when not bypassing, otherwise the notification + // would move as the user tried to tap it. + return bypass ? MODE_WAKE_AND_UNLOCK_PULSING : MODE_NONE; + } else { + if (bypass) { + // Wake-up fading out nicely + return MODE_WAKE_AND_UNLOCK_PULSING; + } else { + // We could theoretically return MODE_NONE, but this means that the device + // would be not interactive, unlocked, and the user would not see the device + // state. + return MODE_ONLY_WAKE; + } + } + } + if (unlockingAllowed && deviceDreaming) { + return bypass ? MODE_WAKE_AND_UNLOCK_FROM_DREAM : MODE_ONLY_WAKE; + } + if (mStatusBarKeyguardViewManager.isShowing()) { + if (mStatusBarKeyguardViewManager.bouncerIsOrWillBeShowing() && unlockingAllowed) { + if (bypass && mKeyguardBypassController.canPlaySubtleWindowAnimations()) { + return MODE_UNLOCK_FADING; + } else { + return MODE_DISMISS_BOUNCER; + } + } else if (unlockingAllowed) { + return bypass ? MODE_UNLOCK_FADING : MODE_NONE; + } else { + return bypass ? MODE_SHOW_BOUNCER : MODE_NONE; + } + } + return MODE_NONE; + } + @Override public void onBiometricAuthFailed(BiometricSourceType biometricSourceType) { mMetricsLogger.write(new LogMaker(MetricsEvent.BIOMETRIC_AUTH) @@ -471,7 +529,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { mStatusBar.notifyBiometricAuthModeChanged(); } - private final WakefulnessLifecycle.Observer mWakefulnessObserver = + @VisibleForTesting + final WakefulnessLifecycle.Observer mWakefulnessObserver = new WakefulnessLifecycle.Observer() { @Override public void onFinishedWakingUp() { @@ -521,7 +580,14 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback { * on or off. */ public boolean isBiometricUnlock() { - return isWakeAndUnlock() || mMode == MODE_UNLOCK; + return isWakeAndUnlock() || mMode == MODE_UNLOCK_COLLAPSING || mMode == MODE_UNLOCK_FADING; + } + + /** + * Successful authentication with fingerprint, face, or iris when the lockscreen fades away + */ + public boolean isUnlockFading() { + return mMode == MODE_UNLOCK_FADING; } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java index 539bc7bcb3f6..fce1dcc998fe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java @@ -14,8 +14,7 @@ package com.android.systemui.statusbar.phone; -import static com.android.systemui.Interpolators.ALPHA_IN; -import static com.android.systemui.Interpolators.ALPHA_OUT; +import static com.android.systemui.Interpolators.LINEAR; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -23,6 +22,8 @@ import android.animation.ValueAnimator; import android.view.View; import android.view.View.AccessibilityDelegate; +import com.android.systemui.Dependency; +import com.android.systemui.assist.AssistManager; import com.android.systemui.statusbar.policy.KeyButtonDrawable; import java.util.ArrayList; @@ -32,12 +33,13 @@ import java.util.ArrayList; * multiples of the same nav bar icon appearing. */ public class ButtonDispatcher { - private final static int FADE_DURATION_IN = 150; - private final static int FADE_DURATION_OUT = 100; + private static final int FADE_DURATION_IN = 150; + private static final int FADE_DURATION_OUT = 250; private final ArrayList<View> mViews = new ArrayList<>(); private final int mId; + private final AssistManager mAssistManager; private View.OnClickListener mClickListener; private View.OnTouchListener mTouchListener; @@ -55,7 +57,10 @@ public class ButtonDispatcher { private AccessibilityDelegate mAccessibilityDelegate; private final ValueAnimator.AnimatorUpdateListener mAlphaListener = animation -> - setAlpha((float) animation.getAnimatedValue()); + setAlpha( + (float) animation.getAnimatedValue(), + false /* animate */, + false /* cancelAnimator */); private final AnimatorListenerAdapter mFadeListener = new AnimatorListenerAdapter() { @Override @@ -67,6 +72,7 @@ public class ButtonDispatcher { public ButtonDispatcher(int id) { mId = id; + mAssistManager = Dependency.get(AssistManager.class); } void clear() { @@ -167,18 +173,32 @@ public class ButtonDispatcher { } public void setAlpha(float alpha, boolean animate) { - setAlpha(alpha, animate, (getAlpha() < alpha) ? FADE_DURATION_IN : FADE_DURATION_OUT); + setAlpha(alpha, animate, true /* cancelAnimator */); } public void setAlpha(float alpha, boolean animate, long duration) { + setAlpha(alpha, animate, duration, true /* cancelAnimator */); + } + + public void setAlpha(float alpha, boolean animate, boolean cancelAnimator) { + setAlpha( + alpha, + animate, + (getAlpha() < alpha) ? FADE_DURATION_IN : FADE_DURATION_OUT, + cancelAnimator); + } + + public void setAlpha(float alpha, boolean animate, long duration, boolean cancelAnimator) { + if (mFadeAnimator != null && (cancelAnimator || animate)) { + mFadeAnimator.cancel(); + } if (animate) { - if (mFadeAnimator != null) { - mFadeAnimator.cancel(); - } setVisibility(View.VISIBLE); mFadeAnimator = ValueAnimator.ofFloat(getAlpha(), alpha); + mFadeAnimator.setStartDelay( + mAssistManager.getAssistHandleShowAndGoRemainingDurationMs()); mFadeAnimator.setDuration(duration); - mFadeAnimator.setInterpolator(getAlpha() < alpha ? ALPHA_IN : ALPHA_OUT); + mFadeAnimator.setInterpolator(LINEAR); mFadeAnimator.addListener(mFadeListener); mFadeAnimator.addUpdateListener(mAlphaListener); mFadeAnimator.start(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java index 58f457ed6e3a..d655b2fef411 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java @@ -35,6 +35,7 @@ import com.android.systemui.R; import com.android.systemui.SysUiServiceProvider; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager; import com.android.systemui.statusbar.policy.EncryptionHelper; import com.android.systemui.statusbar.policy.KeyguardMonitor; @@ -201,20 +202,21 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue } protected int adjustDisableFlags(int state) { + boolean headsUpVisible = mStatusBarComponent.headsUpShouldBeVisible(); + if (headsUpVisible) { + state |= DISABLE_CLOCK; + } + if (!mKeyguardMonitor.isLaunchTransitionFadingAway() && !mKeyguardMonitor.isKeyguardFadingAway() - && shouldHideNotificationIcons()) { + && shouldHideNotificationIcons() + && !(mStatusBarStateController.getState() == StatusBarState.KEYGUARD + && headsUpVisible)) { state |= DISABLE_NOTIFICATION_ICONS; state |= DISABLE_SYSTEM_INFO; state |= DISABLE_CLOCK; } - // In landscape, the heads up show but shouldHideNotificationIcons() return false - // because the visual icon is in notification icon area rather than heads up's space. - // whether the notification icon show or not, clock should hide when heads up show. - if (mStatusBarComponent.isHeadsUpShouldBeVisible()) { - state |= DISABLE_CLOCK; - } if (mNetworkController != null && EncryptionHelper.IS_DATA_ENCRYPTED) { if (mNetworkController.hasEmergencyCryptKeeperText()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java index a17e04259fe3..10b48e71005d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java @@ -22,9 +22,7 @@ import android.os.PowerManager; import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings; -import android.text.TextUtils; import android.util.MathUtils; -import android.util.SparseBooleanArray; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Dependency; @@ -35,15 +33,17 @@ import com.android.systemui.tuner.TunerService; import java.io.PrintWriter; -public class DozeParameters implements TunerService.Tunable { +/** + * Retrieve doze information + */ +public class DozeParameters implements TunerService.Tunable, + com.android.systemui.plugins.statusbar.DozeParameters { private static final int MAX_DURATION = 60 * 1000; - public static final String DOZE_SENSORS_WAKE_UP_FULLY = "doze_sensors_wake_up_fully"; public static final boolean FORCE_NO_BLANKING = SystemProperties.getBoolean("debug.force_no_blanking", false); public static final boolean FORCE_BLANKING = SystemProperties.getBoolean("debug.force_blanking", false); - private static IntInOutMatcher sPickupSubtypePerformsProxMatcher; private static DozeParameters sInstance; private final Context mContext; @@ -88,20 +88,6 @@ public class DozeParameters implements TunerService.Tunable { pw.print(" getVibrateOnPickup(): "); pw.println(getVibrateOnPickup()); pw.print(" getProxCheckBeforePulse(): "); pw.println(getProxCheckBeforePulse()); pw.print(" getPickupVibrationThreshold(): "); pw.println(getPickupVibrationThreshold()); - pw.print(" getPickupSubtypePerformsProxCheck(): ");pw.println( - dumpPickupSubtypePerformsProxCheck()); - } - - private String dumpPickupSubtypePerformsProxCheck() { - // Refresh sPickupSubtypePerformsProxMatcher - getPickupSubtypePerformsProxCheck(0); - - if (sPickupSubtypePerformsProxMatcher == null) { - return "fallback: " + mContext.getResources().getBoolean( - R.bool.doze_pickup_performs_proximity_check); - } else { - return "spec: " + sPickupSubtypePerformsProxMatcher.mSpec; - } } public boolean getDisplayStateSupported() { @@ -221,21 +207,8 @@ public class DozeParameters implements TunerService.Tunable { return SystemProperties.get(propName, mContext.getString(resId)); } - public boolean getPickupSubtypePerformsProxCheck(int subType) { - String spec = getString("doze.pickup.proxcheck", - R.string.doze_pickup_subtype_performs_proximity_check); - - if (TextUtils.isEmpty(spec)) { - // Fall back to non-subtype based property. - return mContext.getResources().getBoolean(R.bool.doze_pickup_performs_proximity_check); - } - - if (sPickupSubtypePerformsProxMatcher == null - || !TextUtils.equals(spec, sPickupSubtypePerformsProxMatcher.mSpec)) { - sPickupSubtypePerformsProxMatcher = new IntInOutMatcher(spec); - } - - return sPickupSubtypePerformsProxMatcher.isIn(subType); + public boolean getPickupPerformsProxCheck() { + return mContext.getResources().getBoolean(R.bool.doze_pickup_performs_proximity_check); } public int getPulseVisibleDurationExtended() { @@ -254,81 +227,4 @@ public class DozeParameters implements TunerService.Tunable { public AlwaysOnDisplayPolicy getPolicy() { return mAlwaysOnPolicy; } - - /** - * Parses a spec of the form `1,2,3,!5,*`. The resulting object will match numbers that are - * listed, will not match numbers that are listed with a ! prefix, and will match / not match - * unlisted numbers depending on whether * or !* is present. - * - * * -> match any numbers that are not explicitly listed - * !* -> don't match any numbers that are not explicitly listed - * 2 -> match 2 - * !3 -> don't match 3 - * - * It is illegal to specify: - * - an empty spec - * - a spec containing that are empty, or a lone ! - * - a spec for anything other than numbers or * - * - multiple terms for the same number / multiple *s - */ - public static class IntInOutMatcher { - private static final String WILDCARD = "*"; - private static final char OUT_PREFIX = '!'; - - private final SparseBooleanArray mIsIn; - private final boolean mDefaultIsIn; - final String mSpec; - - public IntInOutMatcher(String spec) { - if (TextUtils.isEmpty(spec)) { - throw new IllegalArgumentException("Spec must not be empty"); - } - - boolean defaultIsIn = false; - boolean foundWildcard = false; - - mSpec = spec; - mIsIn = new SparseBooleanArray(); - - for (String itemPrefixed : spec.split(",", -1)) { - if (itemPrefixed.length() == 0) { - throw new IllegalArgumentException( - "Illegal spec, must not have zero-length items: `" + spec + "`"); - } - boolean isIn = itemPrefixed.charAt(0) != OUT_PREFIX; - String item = isIn ? itemPrefixed : itemPrefixed.substring(1); - - if (itemPrefixed.length() == 0) { - throw new IllegalArgumentException( - "Illegal spec, must not have zero-length items: `" + spec + "`"); - } - - if (WILDCARD.equals(item)) { - if (foundWildcard) { - throw new IllegalArgumentException("Illegal spec, `" + WILDCARD + - "` must not appear multiple times in `" + spec + "`"); - } - defaultIsIn = isIn; - foundWildcard = true; - } else { - int key = Integer.parseInt(item); - if (mIsIn.indexOfKey(key) >= 0) { - throw new IllegalArgumentException("Illegal spec, `" + key + - "` must not appear multiple times in `" + spec + "`"); - } - mIsIn.put(key, isIn); - } - } - - if (!foundWildcard) { - throw new IllegalArgumentException("Illegal spec, must specify either * or !*"); - } - - mDefaultIsIn = defaultIsIn; - } - - public boolean isIn(int value) { - return (mIsIn.get(value, mDefaultIsIn)); - } - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java index a2438552e8af..60e381a776d2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java @@ -149,6 +149,14 @@ public class DozeScrimController implements StateListener { mHandler.removeCallbacks(mPulseOut); } + /** + * When pulsing, cancel any timeouts that would take you out of the pulsing state. + */ + public void cancelPendingPulseTimeout() { + mHandler.removeCallbacks(mPulseOut); + mHandler.removeCallbacks(mPulseOutExtended); + } + private void cancelPulsing() { if (mPulseCallback != null) { if (DEBUG) Log.d(TAG, "Cancel pulsing"); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java index 66903fa531e0..f53c4e8c818e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; +import static com.android.systemui.SysUiServiceProvider.getComponent; + import android.graphics.Point; import android.graphics.Rect; import android.view.DisplayCutout; @@ -27,11 +29,17 @@ import com.android.internal.widget.ViewClippingUtil; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.plugins.DarkIconDispatcher; +import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.statusbar.HeadsUpStatusBarView; +import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.SysuiStatusBarStateController; +import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; +import com.android.systemui.statusbar.policy.KeyguardMonitor; import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import java.util.function.BiConsumer; @@ -41,7 +49,7 @@ import java.util.function.Consumer; * Controls the appearance of heads up notifications in the icon area and the header itself. */ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, - DarkIconDispatcher.DarkReceiver { + DarkIconDispatcher.DarkReceiver, NotificationWakeUpCoordinator.WakeUpListener { public static final int CONTENT_FADE_DURATION = 110; public static final int CONTENT_FADE_DELAY = 100; private final NotificationIconAreaController mNotificationIconAreaController; @@ -56,13 +64,17 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, private final Consumer<ExpandableNotificationRow> mSetTrackingHeadsUp = this::setTrackingHeadsUp; private final Runnable mUpdatePanelTranslation = this::updatePanelTranslation; - private final BiConsumer<Float, Float> mSetExpandedHeight = this::setExpandedHeight; + private final BiConsumer<Float, Float> mSetExpandedHeight = this::setAppearFraction; + private final KeyguardBypassController mBypassController; + private final StatusBarStateController mStatusBarStateController; + private final CommandQueue mCommandQueue; + private final NotificationWakeUpCoordinator mWakeUpCoordinator; @VisibleForTesting float mExpandedHeight; @VisibleForTesting boolean mIsExpanded; @VisibleForTesting - float mExpandFraction; + float mAppearFraction; private ExpandableNotificationRow mTrackedChild; private boolean mShown; private final View.OnLayoutChangeListener mStackScrollLayoutChangeListener = @@ -77,13 +89,18 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, }; private boolean mAnimationsEnabled = true; Point mPoint; + private KeyguardMonitor mKeyguardMonitor; public HeadsUpAppearanceController( NotificationIconAreaController notificationIconAreaController, HeadsUpManagerPhone headsUpManager, - View statusbarView) { - this(notificationIconAreaController, headsUpManager, + View statusbarView, + SysuiStatusBarStateController statusBarStateController, + KeyguardBypassController keyguardBypassController, + NotificationWakeUpCoordinator wakeUpCoordinator) { + this(notificationIconAreaController, headsUpManager, statusBarStateController, + keyguardBypassController, wakeUpCoordinator, statusbarView.findViewById(R.id.heads_up_status_bar_view), statusbarView.findViewById(R.id.notification_stack_scroller), statusbarView.findViewById(R.id.notification_panel), @@ -96,6 +113,9 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, public HeadsUpAppearanceController( NotificationIconAreaController notificationIconAreaController, HeadsUpManagerPhone headsUpManager, + StatusBarStateController stateController, + KeyguardBypassController bypassController, + NotificationWakeUpCoordinator wakeUpCoordinator, HeadsUpStatusBarView headsUpStatusBarView, NotificationStackScrollLayout stackScroller, NotificationPanelView panelView, @@ -114,7 +134,7 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, panelView.addTrackingHeadsUpListener(mSetTrackingHeadsUp); panelView.addVerticalTranslationListener(mUpdatePanelTranslation); panelView.setHeadsUpAppearanceController(this); - mStackScroller.addOnExpandedHeightListener(mSetExpandedHeight); + mStackScroller.addOnExpandedHeightChangedListener(mSetExpandedHeight); mStackScroller.addOnLayoutChangeListener(mStackScrollLayoutChangeListener); mStackScroller.setHeadsUpAppearanceController(this); mClockView = clockView; @@ -135,16 +155,23 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, mHeadsUpStatusBarView.removeOnLayoutChangeListener(this); } }); + mBypassController = bypassController; + mStatusBarStateController = stateController; + mWakeUpCoordinator = wakeUpCoordinator; + wakeUpCoordinator.addListener(this); + mCommandQueue = getComponent(headsUpStatusBarView.getContext(), CommandQueue.class); + mKeyguardMonitor = Dependency.get(KeyguardMonitor.class); } public void destroy() { mHeadsUpManager.removeListener(this); mHeadsUpStatusBarView.setOnDrawingRectChangedListener(null); + mWakeUpCoordinator.removeListener(this); mPanelView.removeTrackingHeadsUpListener(mSetTrackingHeadsUp); mPanelView.removeVerticalTranslationListener(mUpdatePanelTranslation); mPanelView.setHeadsUpAppearanceController(null); - mStackScroller.removeOnExpandedHeightListener(mSetExpandedHeight); + mStackScroller.removeOnExpandedHeightChangedListener(mSetExpandedHeight); mStackScroller.removeOnLayoutChangeListener(mStackScrollLayoutChangeListener); mDarkIconDispatcher.removeDarkReceiver(this); } @@ -219,7 +246,7 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, private void updateTopEntry() { NotificationEntry newEntry = null; - if (!mIsExpanded && mHeadsUpManager.hasPinnedHeadsUp()) { + if (shouldBeVisible()) { newEntry = mHeadsUpManager.getTopEntry(); } NotificationEntry previousEntry = mHeadsUpStatusBarView.getShowingEntry(); @@ -269,6 +296,11 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, updateParentClipping(true /* shouldClip */); }); } + // Show the status bar icons when the view gets shown / hidden + if (mStatusBarStateController.getState() != StatusBarState.SHADE) { + mCommandQueue.recomputeDisableFlags( + mHeadsUpStatusBarView.getContext().getDisplayId(), false); + } } } @@ -342,7 +374,15 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, * @return if the heads up status bar view should be shown */ public boolean shouldBeVisible() { - return !mIsExpanded && mHeadsUpManager.hasPinnedHeadsUp(); + boolean notificationsShown = !mWakeUpCoordinator.getNotificationsFullyHidden(); + boolean canShow = !mIsExpanded && notificationsShown; + if (mBypassController.getBypassEnabled() && + (mStatusBarStateController.getState() == StatusBarState.KEYGUARD + || mKeyguardMonitor.isKeyguardGoingAway()) + && notificationsShown) { + canShow = true; + } + return canShow && mHeadsUpManager.hasPinnedHeadsUp(); } @Override @@ -351,12 +391,15 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, updateHeader(entry); } - public void setExpandedHeight(float expandedHeight, float appearFraction) { - boolean changedHeight = expandedHeight != mExpandedHeight; + public void setAppearFraction(float expandedHeight, float appearFraction) { + boolean changed = expandedHeight != mExpandedHeight; mExpandedHeight = expandedHeight; - mExpandFraction = appearFraction; + mAppearFraction = appearFraction; boolean isExpanded = expandedHeight > 0; - if (changedHeight) { + // We only notify if the expandedHeight changed and not on the appearFraction, since + // otherwise we may run into an infinite loop where the panel and this are constantly + // updating themselves over just a small fraction + if (changed) { updateHeadsUpHeaders(); } if (isExpanded != mIsExpanded) { @@ -389,8 +432,9 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, public void updateHeader(NotificationEntry entry) { ExpandableNotificationRow row = entry.getRow(); float headerVisibleAmount = 1.0f; - if (row.isPinned() || row.isHeadsUpAnimatingAway() || row == mTrackedChild) { - headerVisibleAmount = mExpandFraction; + if (row.isPinned() || row.isHeadsUpAnimatingAway() || row == mTrackedChild + || row.showingPulsing()) { + headerVisibleAmount = mAppearFraction; } row.setHeaderVisibleAmount(headerVisibleAmount); } @@ -400,8 +444,7 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, mHeadsUpStatusBarView.onDarkChanged(area, darkIntensity, tint); } - public void setPublicMode(boolean publicMode) { - mHeadsUpStatusBarView.setPublicMode(publicMode); + public void onStateChanged() { updateTopEntry(); } @@ -410,7 +453,12 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, mTrackedChild = oldController.mTrackedChild; mExpandedHeight = oldController.mExpandedHeight; mIsExpanded = oldController.mIsExpanded; - mExpandFraction = oldController.mExpandFraction; + mAppearFraction = oldController.mAppearFraction; } } + + @Override + public void onFullyHiddenChanged(boolean isFullyHidden) { + updateTopEntry(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java index 595c1acaf56d..a7e7f085ffd7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhone.java @@ -32,7 +32,7 @@ import android.view.ViewTreeObserver; import androidx.collection.ArraySet; -import com.android.systemui.Dependency; +import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Dumpable; import com.android.systemui.R; import com.android.systemui.ScreenDecorations; @@ -51,18 +51,27 @@ import java.io.PrintWriter; import java.util.HashSet; import java.util.Stack; +import javax.inject.Inject; +import javax.inject.Singleton; + /** * A implementation of HeadsUpManager for phone and car. */ +@Singleton public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, VisualStabilityManager.Callback, OnHeadsUpChangedListener, ConfigurationController.ConfigurationListener, StateListener { private static final String TAG = "HeadsUpManagerPhone"; - private final View mStatusBarWindowView; - private final NotificationGroupManager mGroupManager; - private final VisualStabilityManager mVisualStabilityManager; - private final StatusBarTouchableRegionManager mStatusBarTouchableRegionManager; + @VisibleForTesting + final int mExtensionTime; + private final StatusBarStateController mStatusBarStateController; + private final KeyguardBypassController mBypassController; + private final int mAutoHeadsUpNotificationDecay; + private View mStatusBarWindowView; + private NotificationGroupManager mGroupManager; + private VisualStabilityManager mVisualStabilityManager; + private StatusBarTouchableRegionManager mStatusBarTouchableRegionManager; private boolean mReleaseOnExpandFinish; private int mStatusBarHeight; @@ -71,6 +80,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, private boolean mTrackingHeadsUp; private HashSet<String> mSwipedOutKeys = new HashSet<>(); private HashSet<NotificationEntry> mEntriesToRemoveAfterExpand = new HashSet<>(); + private HashSet<String> mKeysToRemoveWhenLeavingKeyguard = new HashSet<>(); private ArraySet<NotificationEntry> mEntriesToRemoveWhenReorderingAllowed = new ArraySet<>(); private boolean mIsExpanded; @@ -102,21 +112,33 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, /////////////////////////////////////////////////////////////////////////////////////////////// // Constructor: + @Inject public HeadsUpManagerPhone(@NonNull final Context context, - @NonNull View statusBarWindowView, - @NonNull NotificationGroupManager groupManager, - @NonNull StatusBar bar, - @NonNull VisualStabilityManager visualStabilityManager) { + StatusBarStateController statusBarStateController, + KeyguardBypassController bypassController) { super(context); + Resources resources = mContext.getResources(); + mExtensionTime = resources.getInteger(R.integer.ambient_notification_extension_time); + mAutoHeadsUpNotificationDecay = resources.getInteger( + R.integer.auto_heads_up_notification_decay); + mStatusBarStateController = statusBarStateController; + mStatusBarStateController.addCallback(this); + mBypassController = bypassController; + initResources(); + } + + + public void setUp(@NonNull View statusBarWindowView, + @NonNull NotificationGroupManager groupManager, + @NonNull StatusBar bar, + @NonNull VisualStabilityManager visualStabilityManager) { mStatusBarWindowView = statusBarWindowView; - mStatusBarTouchableRegionManager = new StatusBarTouchableRegionManager(context, this, bar, + mStatusBarTouchableRegionManager = new StatusBarTouchableRegionManager(mContext, this, bar, statusBarWindowView); mGroupManager = groupManager; mVisualStabilityManager = visualStabilityManager; - initResources(); - addListener(new OnHeadsUpChangedListener() { @Override public void onHeadsUpPinnedModeChanged(boolean hasPinnedNotification) { @@ -126,7 +148,6 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, mStatusBarTouchableRegionManager.updateTouchableRegion(); } }); - Dependency.get(StatusBarStateController.class).addCallback(this); } public void setAnimationStateHandler(AnimationStateHandler handler) { @@ -210,7 +231,36 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, @Override public void onStateChanged(int newState) { + boolean wasKeyguard = mStatusBarState == StatusBarState.KEYGUARD; + boolean isKeyguard = newState == StatusBarState.KEYGUARD; mStatusBarState = newState; + if (wasKeyguard && !isKeyguard && mKeysToRemoveWhenLeavingKeyguard.size() != 0) { + String[] keys = mKeysToRemoveWhenLeavingKeyguard.toArray(new String[0]); + for (String key : keys) { + removeAlertEntry(key); + } + mKeysToRemoveWhenLeavingKeyguard.clear(); + } + } + + @Override + public void onDozingChanged(boolean isDozing) { + if (!isDozing) { + // Let's make sure all huns we got while dozing time out within the normal timeout + // duration. Otherwise they could get stuck for a very long time + for (AlertEntry entry : mAlertEntries.values()) { + entry.updateEntry(true /* updatePostTime */); + } + } + } + + @Override + public boolean isEntryAutoHeadsUpped(String key) { + HeadsUpEntryPhone headsUpEntryPhone = getHeadsUpEntryPhone(key); + if (headsUpEntryPhone == null) { + return false; + } + return headsUpEntryPhone.isAutoHeadsUp(); } /** @@ -262,6 +312,18 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, } } + /** + * Extends the lifetime of the currently showing pulsing notification so that the pulse lasts + * longer. + */ + public void extendHeadsUp() { + HeadsUpEntryPhone topEntry = getTopHeadsUpEntryPhone(); + if (topEntry == null) { + return; + } + topEntry.extendPulse(); + } + /////////////////////////////////////////////////////////////////////////////////////////////// // HeadsUpManager public methods overrides: @@ -380,14 +442,18 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, @Override protected void onAlertEntryRemoved(AlertEntry alertEntry) { + mKeysToRemoveWhenLeavingKeyguard.remove(alertEntry.mEntry.key); super.onAlertEntryRemoved(alertEntry); mEntryPool.release((HeadsUpEntryPhone) alertEntry); } @Override protected boolean shouldHeadsUpBecomePinned(NotificationEntry entry) { - return mStatusBarState != StatusBarState.KEYGUARD && !mIsExpanded - || super.shouldHeadsUpBecomePinned(entry); + boolean pin = mStatusBarState == StatusBarState.SHADE && !mIsExpanded; + if (mBypassController.getBypassEnabled()) { + pin |= mStatusBarState == StatusBarState.KEYGUARD; + } + return pin || super.shouldHeadsUpBecomePinned(entry); } @Override @@ -433,6 +499,17 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, private boolean mMenuShownPinned; + /** + * If the time this entry has been on was extended + */ + private boolean extended; + + /** + * Was this entry received while on keyguard + */ + private boolean mIsAutoHeadsUp; + + @Override protected boolean isSticky() { return super.isSticky() || mMenuShownPinned; @@ -440,14 +517,19 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, public void setEntry(@NonNull final NotificationEntry entry) { Runnable removeHeadsUpRunnable = () -> { - if (!mVisualStabilityManager.isReorderingAllowed()) { + if (!mVisualStabilityManager.isReorderingAllowed() + // We don't want to allow reordering while pulsing, but headsup need to + // time out anyway + && !entry.showingPulsing()) { mEntriesToRemoveWhenReorderingAllowed.add(entry); mVisualStabilityManager.addReorderingAllowedCallback( HeadsUpManagerPhone.this); - } else if (!mTrackingHeadsUp) { - removeAlertEntry(entry.key); - } else { + } else if (mTrackingHeadsUp) { mEntriesToRemoveAfterExpand.add(entry); + } else if (mIsAutoHeadsUp && mStatusBarState == StatusBarState.KEYGUARD) { + mKeysToRemoveWhenLeavingKeyguard.add(entry.key); + } else { + removeAlertEntry(entry.key); } }; @@ -456,6 +538,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, @Override public void updateEntry(boolean updatePostTime) { + mIsAutoHeadsUp = mEntry.isAutoHeadsUp(); super.updateEntry(updatePostTime); if (mEntriesToRemoveAfterExpand.contains(mEntry)) { @@ -464,6 +547,7 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, if (mEntriesToRemoveWhenReorderingAllowed.contains(mEntry)) { mEntriesToRemoveWhenReorderingAllowed.remove(mEntry); } + mKeysToRemoveWhenLeavingKeyguard.remove(mEntry.key); } @Override @@ -497,6 +581,45 @@ public class HeadsUpManagerPhone extends HeadsUpManager implements Dumpable, public void reset() { super.reset(); mMenuShownPinned = false; + extended = false; + mIsAutoHeadsUp = false; + } + + private void extendPulse() { + if (!extended) { + extended = true; + updateEntry(false); + } + } + + @Override + public int compareTo(AlertEntry alertEntry) { + HeadsUpEntryPhone headsUpEntry = (HeadsUpEntryPhone) alertEntry; + boolean autoShown = isAutoHeadsUp(); + boolean otherAutoShown = headsUpEntry.isAutoHeadsUp(); + if (autoShown && !otherAutoShown) { + return 1; + } else if (!autoShown && otherAutoShown) { + return -1; + } + return super.compareTo(alertEntry); + } + + @Override + protected long calculateFinishTime() { + return mPostTime + getDecayDuration() + (extended ? mExtensionTime : 0); + } + + private int getDecayDuration() { + if (isAutoHeadsUp()) { + return getRecommendedHeadsUpTimeoutMs(mAutoHeadsUpNotificationDecay); + } else { + return getRecommendedHeadsUpTimeoutMs(mAutoDismissNotificationDecay); + } + } + + private boolean isAutoHeadsUp() { + return mIsAutoHeadsUp; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index 0b994ff46f29..c4d346ccaefb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -54,7 +54,7 @@ import java.io.PrintWriter; public class KeyguardBouncer { private static final String TAG = "KeyguardBouncer"; - static final long BOUNCER_FACE_DELAY = 800; + static final long BOUNCER_FACE_DELAY = 1200; static final float ALPHA_EXPANSION_THRESHOLD = 0.95f; static final float EXPANSION_HIDDEN = 1f; static final float EXPANSION_VISIBLE = 0f; @@ -68,6 +68,7 @@ public class KeyguardBouncer { private final Handler mHandler; private final BouncerExpansionCallback mExpansionCallback; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; + private final UnlockMethodCache mUnlockMethodCache; private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { @Override @@ -95,7 +96,7 @@ public class KeyguardBouncer { public KeyguardBouncer(Context context, ViewMediatorCallback callback, LockPatternUtils lockPatternUtils, ViewGroup container, DismissCallbackRegistry dismissCallbackRegistry, FalsingManager falsingManager, - BouncerExpansionCallback expansionCallback, + BouncerExpansionCallback expansionCallback, UnlockMethodCache unlockMethodCache, KeyguardUpdateMonitor keyguardUpdateMonitor, Handler handler) { mContext = context; mCallback = callback; @@ -106,6 +107,7 @@ public class KeyguardBouncer { mDismissCallbackRegistry = dismissCallbackRegistry; mExpansionCallback = expansionCallback; mHandler = handler; + mUnlockMethodCache = unlockMethodCache; mKeyguardUpdateMonitor.registerCallback(mUpdateMonitorCallback); } @@ -168,7 +170,8 @@ public class KeyguardBouncer { // Split up the work over multiple frames. DejankUtils.removeCallbacks(mResetRunnable); - if (mKeyguardUpdateMonitor.isFaceDetectionRunning()) { + if (mUnlockMethodCache.isFaceAuthEnabled() && !needsFullscreenBouncer() + && !mKeyguardUpdateMonitor.userNeedsStrongAuth()) { mHandler.postDelayed(mShowRunnable, BOUNCER_FACE_DELAY); } else { DejankUtils.postAfterTraversal(mShowRunnable); @@ -204,14 +207,12 @@ public class KeyguardBouncer { * @see #onFullyShown() */ private void onFullyHidden() { - if (!mShowingSoon) { - cancelShowRunnable(); - if (mRoot != null) { - mRoot.setVisibility(View.INVISIBLE); - } - mFalsingManager.onBouncerHidden(); - DejankUtils.postAfterTraversal(mResetRunnable); + cancelShowRunnable(); + if (mRoot != null) { + mRoot.setVisibility(View.INVISIBLE); } + mFalsingManager.onBouncerHidden(); + DejankUtils.postAfterTraversal(mResetRunnable); } private final Runnable mShowRunnable = new Runnable() { @@ -342,9 +343,11 @@ public class KeyguardBouncer { && mExpansion == EXPANSION_VISIBLE && !isAnimatingAway(); } - public boolean isPartiallyVisible() { - return (mShowingSoon || (mRoot != null && mRoot.getVisibility() == View.VISIBLE)) - && mExpansion != EXPANSION_HIDDEN && !isAnimatingAway(); + /** + * {@link #show(boolean)} was called but we're not showing yet, or being dragged. + */ + public boolean inTransit() { + return mShowingSoon || mExpansion != EXPANSION_HIDDEN && mExpansion != EXPANSION_VISIBLE; } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt new file mode 100644 index 000000000000..832ea9e3d72e --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.phone + +import android.content.Context +import android.content.pm.PackageManager +import android.hardware.biometrics.BiometricSourceType +import android.provider.Settings +import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.statusbar.NotificationLockscreenUserManager +import com.android.systemui.statusbar.StatusBarState +import com.android.systemui.tuner.TunerService +import java.io.PrintWriter +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class KeyguardBypassController { + + private val unlockMethodCache: UnlockMethodCache + private val statusBarStateController: StatusBarStateController + private var hasFaceFeature: Boolean + + /** + * The pending unlock type which is set if the bypass was blocked when it happened. + */ + private var pendingUnlockType: BiometricSourceType? = null + + lateinit var unlockController: BiometricUnlockController + var isPulseExpanding = false + + /** + * If face unlock dismisses the lock screen or keeps user on keyguard for the current user. + */ + var bypassEnabled: Boolean = false + get() = field && unlockMethodCache.isFaceAuthEnabled + private set + + var bouncerShowing: Boolean = false + var launchingAffordance: Boolean = false + var qSExpanded = false + set(value) { + val changed = field != value + field = value + if (changed && !value) { + maybePerformPendingUnlock() + } + } + + @Inject + constructor( + context: Context, + tunerService: TunerService, + statusBarStateController: StatusBarStateController, + lockscreenUserManager: NotificationLockscreenUserManager + ) { + unlockMethodCache = UnlockMethodCache.getInstance(context) + this.statusBarStateController = statusBarStateController + + hasFaceFeature = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE) + if (!hasFaceFeature) { + return + } + + statusBarStateController.addCallback(object : StatusBarStateController.StateListener { + override fun onStateChanged(newState: Int) { + if (newState != StatusBarState.KEYGUARD) { + pendingUnlockType = null + } + } + }) + + val dismissByDefault = if (context.resources.getBoolean( + com.android.internal.R.bool.config_faceAuthDismissesKeyguard)) 1 else 0 + tunerService.addTunable(object : TunerService.Tunable { + override fun onTuningChanged(key: String?, newValue: String?) { + bypassEnabled = tunerService.getValue(key, dismissByDefault) != 0 + } + }, Settings.Secure.FACE_UNLOCK_DISMISSES_KEYGUARD) + lockscreenUserManager.addUserChangedListener { pendingUnlockType = null } + } + + /** + * Notify that the biometric unlock has happened. + * + * @return false if we can not wake and unlock right now + */ + fun onBiometricAuthenticated(biometricSourceType: BiometricSourceType): Boolean { + if (bypassEnabled) { + val can = canBypass() + if (!can && (isPulseExpanding || qSExpanded)) { + pendingUnlockType = biometricSourceType + } + return can + } + return true + } + + fun maybePerformPendingUnlock() { + if (pendingUnlockType != null) { + if (onBiometricAuthenticated(pendingUnlockType!!)) { + unlockController.startWakeAndUnlock(pendingUnlockType) + pendingUnlockType = null + } + } + } + + /** + * If keyguard can be dismissed because of bypass. + */ + fun canBypass(): Boolean { + if (bypassEnabled) { + return when { + bouncerShowing -> true + statusBarStateController.state != StatusBarState.KEYGUARD -> false + launchingAffordance -> false + isPulseExpanding || qSExpanded -> false + else -> true + } + } + return false + } + + /** + * If shorter animations should be played when unlocking. + */ + fun canPlaySubtleWindowAnimations(): Boolean { + if (bypassEnabled) { + return when { + statusBarStateController.state != StatusBarState.KEYGUARD -> false + qSExpanded -> false + else -> true + } + } + return false + } + + fun onStartedGoingToSleep() { + pendingUnlockType = null + } + + fun dump(pw: PrintWriter) { + pw.println("KeyguardBypassController:") + pw.print(" pendingUnlockType: "); pw.println(pendingUnlockType) + pw.print(" bypassEnabled: "); pw.println(bypassEnabled) + pw.print(" canBypass: "); pw.println(canBypass()) + pw.print(" bouncerShowing: "); pw.println(bouncerShowing) + pw.print(" isPulseExpanding: "); pw.println(isPulseExpanding) + pw.print(" launchingAffordance: "); pw.println(launchingAffordance) + pw.print(" qSExpanded: "); pw.println(qSExpanded) + pw.print(" hasFaceFeature: "); pw.println(hasFaceFeature) + } + + companion object { + const val BYPASS_PANEL_FADE_DURATION = 67 + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java index bc2d00f53186..179375e31dd3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java @@ -112,6 +112,17 @@ public class KeyguardClockPositionAlgorithm { private float mEmptyDragAmount; /** + * Setting if bypass is enabled. If true the clock should always be positioned like it's dark + * and other minor adjustments. + */ + private boolean mBypassEnabled; + + /** + * The stackscroller padding when unlocked + */ + private int mUnlockedStackScrollerPadding; + + /** * Refreshes the dimension values. */ public void loadDimens(Resources res) { @@ -132,7 +143,8 @@ public class KeyguardClockPositionAlgorithm { public void setup(int minTopMargin, int maxShadeBottom, int notificationStackHeight, float panelExpansion, int parentHeight, int keyguardStatusHeight, int clockPreferredY, - boolean hasCustomClock, boolean hasVisibleNotifs, float dark, float emptyDragAmount) { + boolean hasCustomClock, boolean hasVisibleNotifs, float dark, float emptyDragAmount, + boolean bypassEnabled, int unlockedStackScrollerPadding) { mMinTopMargin = minTopMargin + mContainerTopPadding; mMaxShadeBottom = maxShadeBottom; mNotificationStackHeight = notificationStackHeight; @@ -144,18 +156,24 @@ public class KeyguardClockPositionAlgorithm { mHasVisibleNotifs = hasVisibleNotifs; mDarkAmount = dark; mEmptyDragAmount = emptyDragAmount; + mBypassEnabled = bypassEnabled; + mUnlockedStackScrollerPadding = unlockedStackScrollerPadding; } public void run(Result result) { - final int y = getClockY(); + final int y = getClockY(mPanelExpansion); result.clockY = y; result.clockAlpha = getClockAlpha(y); - result.stackScrollerPadding = y + mKeyguardStatusHeight; + result.stackScrollerPadding = mBypassEnabled ? mUnlockedStackScrollerPadding + : y + mKeyguardStatusHeight; + result.stackScrollerPaddingExpanded = mBypassEnabled ? mUnlockedStackScrollerPadding + : getClockY(1.0f) + mKeyguardStatusHeight; result.clockX = (int) interpolate(0, burnInPreventionOffsetX(), mDarkAmount); } public float getMinStackScrollerPadding() { - return mMinTopMargin + mKeyguardStatusHeight + mClockNotificationsMargin; + return mBypassEnabled ? mUnlockedStackScrollerPadding + : mMinTopMargin + mKeyguardStatusHeight + mClockNotificationsMargin; } private int getMaxClockY() { @@ -167,7 +185,7 @@ public class KeyguardClockPositionAlgorithm { } private int getExpandedPreferredClockY() { - return (mHasCustomClock && !mHasVisibleNotifs) ? getPreferredClockY() + return (mHasCustomClock && (!mHasVisibleNotifs || mBypassEnabled)) ? getPreferredClockY() : getExpandedClockPosition(); } @@ -195,7 +213,7 @@ public class KeyguardClockPositionAlgorithm { return (int) y; } - private int getClockY() { + private int getClockY(float panelExpansion) { // Dark: Align the bottom edge of the clock at about half of the screen: float clockYDark = (mHasCustomClock ? getPreferredClockY() : getMaxClockY()) + burnInPreventionOffsetY(); @@ -205,11 +223,12 @@ public class KeyguardClockPositionAlgorithm { float clockYBouncer = -mKeyguardStatusHeight; // Move clock up while collapsing the shade - float shadeExpansion = Interpolators.FAST_OUT_LINEAR_IN.getInterpolation(mPanelExpansion); + float shadeExpansion = Interpolators.FAST_OUT_LINEAR_IN.getInterpolation(panelExpansion); float clockY = MathUtils.lerp(clockYBouncer, clockYRegular, shadeExpansion); clockYDark = MathUtils.lerp(clockYBouncer, clockYDark, shadeExpansion); - return (int) (MathUtils.lerp(clockY, clockYDark, mDarkAmount) + mEmptyDragAmount); + float darkAmount = mBypassEnabled && !mHasCustomClock ? 1.0f : mDarkAmount; + return (int) (MathUtils.lerp(clockY, clockYDark, darkAmount) + mEmptyDragAmount); } /** @@ -257,5 +276,10 @@ public class KeyguardClockPositionAlgorithm { * The top padding of the stack scroller, in pixels. */ public int stackScrollerPadding; + + /** + * The top padding of the stack scroller, in pixels when fully expanded. + */ + public int stackScrollerPaddingExpanded; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardDismissHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardDismissHandler.java index 6111178bbac9..b11329ad0135 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardDismissHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardDismissHandler.java @@ -24,6 +24,7 @@ public interface KeyguardDismissHandler { /** * Executes an action that requres the screen to be unlocked, showing the keyguard if * necessary. Does not close the notification shade (in case it was open). + * @param requiresShadeOpen does the shade need to be forced open when hiding the keyguard? */ - void executeWhenUnlocked(OnDismissAction action); + void executeWhenUnlocked(OnDismissAction action, boolean requiresShadeOpen); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardDismissUtil.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardDismissUtil.java index e541e14b3d91..834d2a5ae4a0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardDismissUtil.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardDismissUtil.java @@ -37,7 +37,7 @@ public class KeyguardDismissUtil implements KeyguardDismissHandler { public KeyguardDismissUtil() { } - /** Sets the actual {@link DismissHandler} implementation. */ + /** Sets the actual {@link KeyguardDismissHandler} implementation. */ public void setDismissHandler(KeyguardDismissHandler dismissHandler) { mDismissHandler = dismissHandler; } @@ -46,15 +46,17 @@ public class KeyguardDismissUtil implements KeyguardDismissHandler { * Executes an action that requires the screen to be unlocked. * * <p>Must be called after {@link #setDismissHandler}. + * + * @param requiresShadeOpen does the shade need to be forced open when hiding the keyguard? */ @Override - public void executeWhenUnlocked(OnDismissAction action) { + public void executeWhenUnlocked(OnDismissAction action, boolean requiresShadeOpen) { KeyguardDismissHandler dismissHandler = mDismissHandler; if (dismissHandler == null) { Log.wtf(TAG, "KeyguardDismissHandler not set."); action.onDismiss(); return; } - dismissHandler.executeWhenUnlocked(action); + dismissHandler.executeWhenUnlocked(action, requiresShadeOpen); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt new file mode 100644 index 000000000000..f4635d1270a8 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardLiftController.kt @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.phone + +import android.content.Context +import android.hardware.Sensor +import android.hardware.TriggerEvent +import android.hardware.TriggerEventListener +import com.android.keyguard.KeyguardUpdateMonitor +import com.android.keyguard.KeyguardUpdateMonitorCallback +import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.util.Assert +import com.android.systemui.util.AsyncSensorManager + +class KeyguardLiftController constructor( + context: Context, + private val statusBarStateController: StatusBarStateController, + private val asyncSensorManager: AsyncSensorManager +) : StatusBarStateController.StateListener, KeyguardUpdateMonitorCallback() { + + private val keyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(context) + private val pickupSensor = asyncSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE) + private var isListening = false + private var bouncerVisible = false + + init { + statusBarStateController.addCallback(this) + keyguardUpdateMonitor.registerCallback(this) + updateListeningState() + } + + private val listener: TriggerEventListener = object : TriggerEventListener() { + override fun onTrigger(event: TriggerEvent?) { + Assert.isMainThread() + // Not listening anymore since trigger events unregister themselves + isListening = false + updateListeningState() + keyguardUpdateMonitor.requestFaceAuth() + } + } + + override fun onDozingChanged(isDozing: Boolean) { + updateListeningState() + } + + override fun onKeyguardBouncerChanged(bouncer: Boolean) { + bouncerVisible = bouncer + updateListeningState() + } + + override fun onKeyguardVisibilityChanged(showing: Boolean) { + updateListeningState() + } + + private fun updateListeningState() { + val onKeyguard = keyguardUpdateMonitor.isKeyguardVisible && + !statusBarStateController.isDozing + + val shouldListen = onKeyguard || bouncerVisible + if (shouldListen != isListening) { + isListening = shouldListen + + if (shouldListen) { + asyncSensorManager.requestTriggerSensor(listener, pickupSensor) + } else { + asyncSensorManager.cancelTriggerSensor(listener, pickupSensor) + } + } + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index 3d0c9e88ac9e..06a2225ed0bf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -16,9 +16,9 @@ package com.android.systemui.statusbar.phone; -import static com.android.systemui.Dependency.MAIN_HANDLER_NAME; import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT; +import android.annotation.IntDef; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Configuration; @@ -28,10 +28,12 @@ import android.graphics.drawable.Animatable2; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.hardware.biometrics.BiometricSourceType; -import android.os.Handler; import android.os.Trace; +import android.provider.Settings; +import android.text.TextUtils; import android.util.AttributeSet; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityNodeInfo; import androidx.annotation.Nullable; @@ -40,16 +42,23 @@ import com.android.internal.graphics.ColorUtils; import com.android.internal.telephony.IccCardConstants; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; +import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.dock.DockManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.KeyguardAffordanceView; +import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.phone.ScrimController.ScrimVisibility; import com.android.systemui.statusbar.policy.AccessibilityController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardMonitor; +import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + import javax.inject.Inject; import javax.inject.Named; @@ -58,7 +67,9 @@ import javax.inject.Named; */ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChangedListener, StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener, - UnlockMethodCache.OnUnlockMethodChangedListener { + UnlockMethodCache.OnUnlockMethodChangedListener, + NotificationWakeUpCoordinator.WakeUpListener, ViewTreeObserver.OnPreDrawListener, + OnHeadsUpChangedListener { private static final int STATE_LOCKED = 0; private static final int STATE_LOCK_OPEN = 1; @@ -70,35 +81,53 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final AccessibilityController mAccessibilityController; private final DockManager mDockManager; - private final Handler mMainHandler; private final KeyguardMonitor mKeyguardMonitor; + private final KeyguardBypassController mBypassController; + private final NotificationWakeUpCoordinator mWakeUpCoordinator; + private final HeadsUpManagerPhone mHeadsUpManager; private int mLastState = 0; + private boolean mForceUpdate; private boolean mTransientBiometricsError; private boolean mIsFaceUnlockState; private boolean mSimLocked; private int mDensity; private boolean mPulsing; private boolean mDozing; - private boolean mBouncerVisible; private boolean mDocked; - private boolean mLastDozing; - private boolean mLastPulsing; - private boolean mLastBouncerVisible; + private boolean mBlockUpdates; private int mIconColor; private float mDozeAmount; - private int mIconRes; - private boolean mWasPulsingOnThisFrame; + private boolean mBouncerShowingScrimmed; private boolean mWakeAndUnlockRunning; private boolean mKeyguardShowing; private boolean mShowingLaunchAffordance; + private boolean mKeyguardJustShown; + private boolean mUpdatePending; private final KeyguardMonitor.Callback mKeyguardMonitorCallback = new KeyguardMonitor.Callback() { @Override public void onKeyguardShowingChanged() { + boolean force = false; + boolean wasShowing = mKeyguardShowing; mKeyguardShowing = mKeyguardMonitor.isShowing(); - update(false /* force */); + if (!wasShowing && mKeyguardShowing && mBlockUpdates) { + mBlockUpdates = false; + force = true; + } + if (!wasShowing && mKeyguardShowing) { + mKeyguardJustShown = true; + } + update(force); + } + + @Override + public void onKeyguardFadingAwayChanged() { + if (!mKeyguardMonitor.isKeyguardFadingAway() && mBlockUpdates) { + mBlockUpdates = false; + update(true /* force */); + } } }; private final DockManager.DockEventListener mDockEventListener = @@ -109,7 +138,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange || event == DockManager.STATE_DOCKED_HIDE; if (docked != mDocked) { mDocked = docked; - update(true /* force */); + update(); } } }; @@ -119,9 +148,8 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange @Override public void onSimStateChanged(int subId, int slotId, IccCardConstants.State simState) { - boolean oldSimLocked = mSimLocked; mSimLocked = mKeyguardUpdateMonitor.isSimPinSecure(); - update(oldSimLocked != mSimLocked); + update(); } @Override @@ -146,9 +174,11 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange StatusBarStateController statusBarStateController, ConfigurationController configurationController, AccessibilityController accessibilityController, + KeyguardBypassController bypassController, + NotificationWakeUpCoordinator wakeUpCoordinator, KeyguardMonitor keyguardMonitor, @Nullable DockManager dockManager, - @Named(MAIN_HANDLER_NAME) Handler mainHandler) { + HeadsUpManagerPhone headsUpManager) { super(context, attrs); mContext = context; mUnlockMethodCache = UnlockMethodCache.getInstance(context); @@ -156,9 +186,11 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange mAccessibilityController = accessibilityController; mConfigurationController = configurationController; mStatusBarStateController = statusBarStateController; + mBypassController = bypassController; + mWakeUpCoordinator = wakeUpCoordinator; mKeyguardMonitor = keyguardMonitor; mDockManager = dockManager; - mMainHandler = mainHandler; + mHeadsUpManager = headsUpManager; } @Override @@ -169,11 +201,13 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange mKeyguardMonitor.addCallback(mKeyguardMonitorCallback); mKeyguardUpdateMonitor.registerCallback(mUpdateMonitorCallback); mUnlockMethodCache.addListener(this); + mWakeUpCoordinator.addListener(this); mSimLocked = mKeyguardUpdateMonitor.isSimPinSecure(); if (mDockManager != null) { mDockManager.addListener(mDockEventListener); } onThemeChanged(); + update(); } @Override @@ -183,6 +217,7 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange mConfigurationController.removeCallback(this); mKeyguardUpdateMonitor.removeCallback(mUpdateMonitorCallback); mKeyguardMonitor.removeCallback(mKeyguardMonitorCallback); + mWakeUpCoordinator.removeListener(this); mUnlockMethodCache.removeListener(this); if (mDockManager != null) { mDockManager.removeListener(mDockEventListener); @@ -226,59 +261,111 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange } public void update(boolean force) { + if (force) { + mForceUpdate = true; + } + if (!mUpdatePending) { + mUpdatePending = true; + getViewTreeObserver().addOnPreDrawListener(this); + } + } + + @Override + public boolean onPreDraw() { + mUpdatePending = false; + getViewTreeObserver().removeOnPreDrawListener(this); + int state = getState(); + int lastState = mLastState; + boolean keyguardJustShown = mKeyguardJustShown; mIsFaceUnlockState = state == STATE_SCANNING_FACE; - if (state != mLastState || mLastDozing != mDozing || mLastPulsing != mPulsing - || mLastBouncerVisible != mBouncerVisible || force) { - int iconAnimRes = getAnimationResForTransition(mLastState, state, mLastPulsing, - mPulsing, mLastDozing, mDozing, mBouncerVisible); - boolean isAnim = iconAnimRes != -1; - - int iconRes = isAnim ? iconAnimRes : getIconForState(state); - if (iconRes != mIconRes) { - mIconRes = iconRes; - - Drawable icon = mContext.getDrawable(iconRes); - final AnimatedVectorDrawable animation = icon instanceof AnimatedVectorDrawable - ? (AnimatedVectorDrawable) icon - : null; - setImageDrawable(icon, false); - if (mIsFaceUnlockState) { - announceForAccessibility(getContext().getString( - R.string.accessibility_scanning_face)); - } + mLastState = state; + mKeyguardJustShown = false; - if (animation != null && isAnim) { - animation.forceAnimationOnUI(); - animation.clearAnimationCallbacks(); - animation.registerAnimationCallback(new Animatable2.AnimationCallback() { - @Override - public void onAnimationEnd(Drawable drawable) { - if (getDrawable() == animation && state == getState() - && doesAnimationLoop(iconAnimRes)) { - animation.start(); - } else { - Trace.endAsyncSection("LockIcon#Animation", state); - } - } - }); - Trace.beginAsyncSection("LockIcon#Animation", state); - animation.start(); - } + boolean shouldUpdate = lastState != state || mForceUpdate; + if (mBlockUpdates && canBlockUpdates()) { + shouldUpdate = false; + } + if (shouldUpdate) { + mForceUpdate = false; + @LockAnimIndex final int lockAnimIndex = getAnimationIndexForTransition(lastState, + state, mPulsing, mDozing, keyguardJustShown); + boolean isAnim = lockAnimIndex != -1; + int iconRes = isAnim ? getThemedAnimationResId(lockAnimIndex) : getIconForState(state); + + Drawable icon = mContext.getDrawable(iconRes); + final AnimatedVectorDrawable animation = icon instanceof AnimatedVectorDrawable + ? (AnimatedVectorDrawable) icon + : null; + setImageDrawable(icon, false); + if (mIsFaceUnlockState) { + announceForAccessibility(getContext().getString( + R.string.accessibility_scanning_face)); } - updateDarkTint(); - mLastState = state; - mLastDozing = mDozing; - mLastPulsing = mPulsing; - mLastBouncerVisible = mBouncerVisible; + if (animation != null && isAnim) { + animation.forceAnimationOnUI(); + animation.clearAnimationCallbacks(); + animation.registerAnimationCallback(new Animatable2.AnimationCallback() { + @Override + public void onAnimationEnd(Drawable drawable) { + if (getDrawable() == animation && state == getState() + && doesAnimationLoop(lockAnimIndex)) { + animation.start(); + } else { + Trace.endAsyncSection("LockIcon#Animation", state); + } + } + }); + Trace.beginAsyncSection("LockIcon#Animation", state); + animation.start(); + } } + updateDarkTint(); + + updateIconVisibility(); + updateClickability(); + + return true; + } + /** + * Update the icon visibility + * @return true if the visibility changed + */ + private boolean updateIconVisibility() { boolean onAodNotPulsingOrDocked = mDozing && (!mPulsing || mDocked); boolean invisible = onAodNotPulsingOrDocked || mWakeAndUnlockRunning || mShowingLaunchAffordance; - setVisibility(invisible ? INVISIBLE : VISIBLE); - updateClickability(); + if (mBypassController.getBypassEnabled() && !mBouncerShowingScrimmed) { + if ((mHeadsUpManager.isHeadsUpGoingAway() || mHeadsUpManager.hasPinnedHeadsUp() + || mStatusBarStateController.getState() == StatusBarState.KEYGUARD) + && !mWakeUpCoordinator.getNotificationsFullyHidden()) { + invisible = true; + } + } + boolean wasInvisible = getVisibility() == INVISIBLE; + if (invisible != wasInvisible) { + setVisibility(invisible ? INVISIBLE : VISIBLE); + animate().cancel(); + if (!invisible) { + setScaleX(0); + setScaleY(0); + animate() + .setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN) + .scaleX(1) + .scaleY(1) + .withLayer() + .setDuration(233) + .start(); + } + return true; + } + return false; + } + + private boolean canBlockUpdates() { + return mKeyguardShowing || mKeyguardMonitor.isKeyguardFadingAway(); } private void updateClickability() { @@ -335,46 +422,100 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange return iconRes; } - private boolean doesAnimationLoop(int resourceId) { - return resourceId == com.android.internal.R.anim.lock_scanning; + private boolean doesAnimationLoop(@LockAnimIndex int lockAnimIndex) { + return lockAnimIndex == SCANNING; } - private int getAnimationResForTransition(int oldState, int newState, - boolean wasPulsing, boolean pulsing, boolean wasDozing, boolean dozing, - boolean bouncerVisible) { + private static int getAnimationIndexForTransition(int oldState, int newState, boolean pulsing, + boolean dozing, boolean keyguardJustShown) { // Never animate when screen is off - if (dozing && !pulsing && !mWasPulsingOnThisFrame) { + if (dozing && !pulsing) { return -1; } - boolean isError = oldState != STATE_BIOMETRICS_ERROR && newState == STATE_BIOMETRICS_ERROR; - boolean justUnlocked = oldState != STATE_LOCK_OPEN && newState == STATE_LOCK_OPEN; - boolean justLocked = oldState == STATE_LOCK_OPEN && newState == STATE_LOCKED; - boolean nowPulsing = !wasPulsing && pulsing; - boolean turningOn = wasDozing && !dozing && !mWasPulsingOnThisFrame; - - if (isError) { - return com.android.internal.R.anim.lock_to_error; - } else if (justUnlocked) { - return com.android.internal.R.anim.lock_unlock; - } else if (justLocked) { - return com.android.internal.R.anim.lock_lock; - } else if (newState == STATE_SCANNING_FACE && bouncerVisible) { - return com.android.internal.R.anim.lock_scanning; - } else if ((nowPulsing || turningOn) && newState != STATE_LOCK_OPEN) { - return com.android.internal.R.anim.lock_in; + if (newState == STATE_BIOMETRICS_ERROR) { + return ERROR; + } else if (oldState != STATE_LOCK_OPEN && newState == STATE_LOCK_OPEN) { + return UNLOCK; + } else if (oldState == STATE_LOCK_OPEN && newState == STATE_LOCKED && !keyguardJustShown) { + return LOCK; + } else if (newState == STATE_SCANNING_FACE) { + return SCANNING; } return -1; } + @Override + public void onFullyHiddenChanged(boolean isFullyHidden) { + if (mBypassController.getBypassEnabled()) { + boolean changed = updateIconVisibility(); + if (changed) { + update(); + } + } + } + + public void setBouncerShowingScrimmed(boolean bouncerShowing) { + mBouncerShowingScrimmed = bouncerShowing; + if (mBypassController.getBypassEnabled()) { + update(); + } + } + + @Retention(RetentionPolicy.SOURCE) + @IntDef({ERROR, UNLOCK, LOCK, SCANNING}) + @interface LockAnimIndex {} + private static final int ERROR = 0, UNLOCK = 1, LOCK = 2, SCANNING = 3; + private static final int[][] LOCK_ANIM_RES_IDS = new int[][] { + { + R.anim.lock_to_error, + R.anim.lock_unlock, + R.anim.lock_lock, + R.anim.lock_scanning + }, + { + R.anim.lock_to_error_circular, + R.anim.lock_unlock_circular, + R.anim.lock_lock_circular, + R.anim.lock_scanning_circular + }, + { + R.anim.lock_to_error_filled, + R.anim.lock_unlock_filled, + R.anim.lock_lock_filled, + R.anim.lock_scanning_filled + }, + { + R.anim.lock_to_error_rounded, + R.anim.lock_unlock_rounded, + R.anim.lock_lock_rounded, + R.anim.lock_scanning_rounded + }, + }; + + private int getThemedAnimationResId(@LockAnimIndex int lockAnimIndex) { + final String setting = TextUtils.emptyIfNull( + Settings.Secure.getString(getContext().getContentResolver(), + Settings.Secure.THEME_CUSTOMIZATION_OVERLAY_PACKAGES)); + if (setting.contains("com.android.theme.icon_pack.circular.android")) { + return LOCK_ANIM_RES_IDS[1][lockAnimIndex]; + } else if (setting.contains("com.android.theme.icon_pack.filled.android")) { + return LOCK_ANIM_RES_IDS[2][lockAnimIndex]; + } else if (setting.contains("com.android.theme.icon_pack.rounded.android")) { + return LOCK_ANIM_RES_IDS[3][lockAnimIndex]; + } + return LOCK_ANIM_RES_IDS[0][lockAnimIndex]; + } + private int getState() { KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext); - if (mTransientBiometricsError) { - return STATE_BIOMETRICS_ERROR; - } else if ((mUnlockMethodCache.canSkipBouncer() || !mKeyguardShowing) && !mSimLocked) { + if ((mUnlockMethodCache.canSkipBouncer() || !mKeyguardShowing + || mKeyguardMonitor.isKeyguardGoingAway()) && !mSimLocked) { return STATE_LOCK_OPEN; - } else if (updateMonitor.isFaceDetectionRunning()) { + } else if (mTransientBiometricsError) { + return STATE_BIOMETRICS_ERROR; + } else if (updateMonitor.isFaceDetectionRunning() && !mPulsing) { return STATE_SCANNING_FACE; } else { return STATE_LOCKED; @@ -393,12 +534,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange */ public void setPulsing(boolean pulsing) { mPulsing = pulsing; - if (!mPulsing) { - mWasPulsingOnThisFrame = true; - mMainHandler.post(() -> { - mWasPulsingOnThisFrame = false; - }); - } update(); } @@ -416,17 +551,6 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange setImageTintList(ColorStateList.valueOf(color)); } - /** - * If bouncer is visible or not. - */ - public void setBouncerVisible(boolean bouncerVisible) { - if (mBouncerVisible == bouncerVisible) { - return; - } - mBouncerVisible = bouncerVisible; - update(); - } - @Override public void onDensityOrFontScaleChanged() { ViewGroup.LayoutParams lp = getLayoutParams(); @@ -453,11 +577,17 @@ public class LockIcon extends KeyguardAffordanceView implements OnUserInfoChange /** * We need to hide the lock whenever there's a fingerprint unlock, otherwise you'll see the * icon on top of the black front scrim. + * @param wakeAndUnlock are we wake and unlocking + * @param isUnlock are we currently unlocking */ - public void onBiometricAuthModeChanged(boolean wakeAndUnlock) { + public void onBiometricAuthModeChanged(boolean wakeAndUnlock, boolean isUnlock) { if (wakeAndUnlock) { mWakeAndUnlockRunning = true; } + if (isUnlock && mBypassController.getBypassEnabled() && canBlockUpdates()) { + // We don't want the icon to change while we are unlocking + mBlockUpdates = true; + } update(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java index c0a1b123fe77..1d4d0bd17f01 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/MultiUserSwitch.java @@ -103,10 +103,11 @@ public class MultiUserSwitch extends FrameLayout implements View.OnClickListener final boolean userSwitcherEnabled = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.USER_SWITCHER_ENABLED, 0) != 0; - if (!UserManager.supportsMultipleUsers() - || mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH) + // TODO(b/138661450) Move IPC calls to background + if (!userSwitcherEnabled + || !UserManager.supportsMultipleUsers() || UserManager.isDeviceInDemoMode(mContext) - || !userSwitcherEnabled) { + || mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH)) { return false; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index 776cd4d71c94..6bfa048eb63d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -21,7 +21,9 @@ import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SEARCH_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.isGesturalMode; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE; @@ -321,7 +323,7 @@ public class NavigationBarView extends FrameLayout implements public void setComponents(NotificationPanelView panel, AssistManager assistManager) { mPanelView = panel; - updateSystemUiStateFlags(); + updatePanelSystemUiStateFlags(); } @Override @@ -585,7 +587,7 @@ public class NavigationBarView extends FrameLayout implements updateNavButtonIcons(); updateSlippery(); setUpSwipeUpOnboarding(isQuickStepSwipeUpEnabled()); - updateSystemUiStateFlags(); + updateDisabledSystemUiStateFlags(); } public void updateNavButtonIcons() { @@ -627,7 +629,7 @@ public class NavigationBarView extends FrameLayout implements if (mOverviewProxyService.isEnabled()) { // Force disable recents when not in legacy mode disableRecent |= !QuickStepContract.isLegacyMode(mNavBarMode); - if (pinningActive) { + if (pinningActive && !QuickStepContract.isGesturalMode(mNavBarMode)) { disableBack = disableHome = false; } } else if (pinningActive) { @@ -706,12 +708,12 @@ public class NavigationBarView extends FrameLayout implements } } - public void onPanelExpandedChange() { + public void onStatusBarPanelStateChanged() { updateSlippery(); - updateSystemUiStateFlags(); + updatePanelSystemUiStateFlags(); } - public void updateSystemUiStateFlags() { + public void updateDisabledSystemUiStateFlags() { int displayId = mContext.getDisplayId(); mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_SCREEN_PINNING, ActivityManagerWrapper.getInstance().isScreenPinningActive(), displayId); @@ -719,9 +721,17 @@ public class NavigationBarView extends FrameLayout implements (mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0, displayId); mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_HOME_DISABLED, (mDisabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0, displayId); + mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_SEARCH_DISABLED, + (mDisabledFlags & View.STATUS_BAR_DISABLE_SEARCH) != 0, displayId); + } + + public void updatePanelSystemUiStateFlags() { + int displayId = mContext.getDisplayId(); if (mPanelView != null) { mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED, mPanelView.isFullyExpanded() && !mPanelView.isInSettings(), displayId); + mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_QUICK_SETTINGS_EXPANDED, + mPanelView.isInSettings(), displayId); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationHandle.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationHandle.java index 0fe12943614c..4f7af58094ec 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationHandle.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationHandle.java @@ -53,8 +53,8 @@ public class NavigationHandle extends View implements ButtonInterface { final int dualToneLightTheme = Utils.getThemeAttr(context, R.attr.lightIconTheme); Context lightContext = new ContextThemeWrapper(context, dualToneLightTheme); Context darkContext = new ContextThemeWrapper(context, dualToneDarkTheme); - mLightColor = Utils.getColorAttrDefaultColor(lightContext, R.attr.singleToneColor); - mDarkColor = Utils.getColorAttrDefaultColor(darkContext, R.attr.singleToneColor); + mLightColor = Utils.getColorAttrDefaultColor(lightContext, R.attr.homeHandleColor); + mDarkColor = Utils.getColorAttrDefaultColor(darkContext, R.attr.homeHandleColor); mPaint.setAntiAlias(true); setFocusable(false); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java index 4d7cf2715f9c..1df9411019d2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationModeController.java @@ -16,42 +16,46 @@ package com.android.systemui.statusbar.phone; +import static android.app.Activity.RESULT_CANCELED; +import static android.app.Activity.RESULT_OK; +import static android.app.admin.DevicePolicyManager.STATE_USER_UNMANAGED; import static android.content.Intent.ACTION_OVERLAY_CHANGED; import static android.content.Intent.ACTION_PREFERRED_ACTIVITY_CHANGED; +import static android.content.pm.PackageManager.FEATURE_DEVICE_ADMIN; import static android.os.UserHandle.USER_CURRENT; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVERLAY; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL_OVERLAY; -import android.app.Notification; -import android.app.NotificationManager; +import static com.android.systemui.shared.system.QuickStepContract.ACTION_ENABLE_GESTURE_NAV; +import static com.android.systemui.shared.system.QuickStepContract.ACTION_ENABLE_GESTURE_NAV_RESULT; +import static com.android.systemui.shared.system.QuickStepContract.EXTRA_RESULT_INTENT; + import android.app.PendingIntent; +import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.om.IOverlayManager; -import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.ApkAssets; import android.os.PatternMatcher; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; +import android.os.UserManager; import android.provider.Settings; import android.provider.Settings.Secure; -import android.text.TextUtils; import android.util.Log; import android.util.SparseBooleanArray; import com.android.systemui.Dumpable; -import com.android.systemui.R; import com.android.systemui.UiOffloadThread; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.statusbar.policy.DeviceProvisionedController; -import com.android.systemui.util.NotificationChannels; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -70,11 +74,6 @@ public class NavigationModeController implements Dumpable { private static final String TAG = NavigationModeController.class.getSimpleName(); private static final boolean DEBUG = false; - private static final int SYSTEM_APP_MASK = - ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; - static final String SHARED_PREFERENCES_NAME = "navigation_mode_controller_preferences"; - static final String PREFS_SWITCHED_FROM_GESTURE_NAV_KEY = "switched_from_gesture_nav"; - public interface ModeChangedListener { void onNavigationModeChanged(int mode); } @@ -90,8 +89,6 @@ public class NavigationModeController implements Dumpable { private int mMode = NAV_BAR_MODE_3BUTTON; private ArrayList<ModeChangedListener> mListeners = new ArrayList<>(); - private String mLastDefaultLauncher; - private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -102,18 +99,6 @@ public class NavigationModeController implements Dumpable { } updateCurrentInteractionMode(true /* notify */); break; - case ACTION_PREFERRED_ACTIVITY_CHANGED: - if (DEBUG) { - Log.d(TAG, "ACTION_PREFERRED_ACTIVITY_CHANGED"); - } - final String launcher = getDefaultLauncherPackageName(mCurrentUserContext); - // Check if it is a default launcher change - if (!TextUtils.equals(mLastDefaultLauncher, launcher)) { - switchFromGestureNavModeIfNotSupportedByDefaultLauncher(); - showNotificationIfDefaultLauncherSupportsGestureNav(); - mLastDefaultLauncher = launcher; - } - break; } } }; @@ -149,7 +134,6 @@ public class NavigationModeController implements Dumpable { // Update the nav mode for the current user updateCurrentInteractionMode(true /* notify */); - switchFromGestureNavModeIfNotSupportedByDefaultLauncher(); // When switching users, defer enabling the gestural nav overlay until the user // is all set up @@ -157,6 +141,8 @@ public class NavigationModeController implements Dumpable { } }; + private BroadcastReceiver mEnableGestureNavReceiver; + @Inject public NavigationModeController(Context context, DeviceProvisionedController deviceProvisionedController, @@ -177,16 +163,81 @@ public class NavigationModeController implements Dumpable { IntentFilter preferredActivityFilter = new IntentFilter(ACTION_PREFERRED_ACTIVITY_CHANGED); mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, preferredActivityFilter, null, null); - // We are only interested in launcher changes, so keeping track of the current default. - mLastDefaultLauncher = getDefaultLauncherPackageName(mContext); updateCurrentInteractionMode(false /* notify */); - switchFromGestureNavModeIfNotSupportedByDefaultLauncher(); // Check if we need to defer enabling gestural nav deferGesturalNavOverlayIfNecessary(); } + private void removeEnableGestureNavListener() { + if (mEnableGestureNavReceiver != null) { + if (DEBUG) { + Log.d(TAG, "mEnableGestureNavReceiver unregistered"); + } + mContext.unregisterReceiver(mEnableGestureNavReceiver); + mEnableGestureNavReceiver = null; + } + } + + private boolean setGestureModeOverlayForMainLauncher() { + removeEnableGestureNavListener(); + if (getCurrentInteractionMode(mCurrentUserContext) == NAV_BAR_MODE_GESTURAL) { + // Already in gesture mode + return true; + } + + Log.d(TAG, "Switching system navigation to full-gesture mode:" + + " contextUser=" + + mCurrentUserContext.getUserId()); + + setModeOverlay(NAV_BAR_MODE_GESTURAL_OVERLAY, USER_CURRENT); + return true; + } + + private boolean enableGestureNav(Intent intent) { + if (!(intent.getParcelableExtra(EXTRA_RESULT_INTENT) instanceof PendingIntent)) { + Log.e(TAG, "No callback pending intent was attached"); + return false; + } + + PendingIntent callback = intent.getParcelableExtra(EXTRA_RESULT_INTENT); + Intent callbackIntent = callback.getIntent(); + if (callbackIntent == null + || !ACTION_ENABLE_GESTURE_NAV_RESULT.equals(callbackIntent.getAction())) { + Log.e(TAG, "Invalid callback intent"); + return false; + } + String callerPackage = callback.getCreatorPackage(); + UserHandle callerUser = callback.getCreatorUserHandle(); + + DevicePolicyManager dpm = mCurrentUserContext.getSystemService(DevicePolicyManager.class); + ComponentName ownerComponent = dpm.getDeviceOwnerComponentOnCallingUser(); + + if (ownerComponent != null) { + // Verify that the caller is the owner component + if (!ownerComponent.getPackageName().equals(callerPackage) + || !mCurrentUserContext.getUser().equals(callerUser)) { + Log.e(TAG, "Callback must be from the device owner"); + return false; + } + } else { + UserHandle callerParent = mCurrentUserContext.getSystemService(UserManager.class) + .getProfileParent(callerUser); + if (callerParent == null || !callerParent.equals(mCurrentUserContext.getUser())) { + Log.e(TAG, "Callback must be from a managed user"); + return false; + } + ComponentName profileOwner = dpm.getProfileOwnerAsUser(callerUser); + if (profileOwner == null || !profileOwner.getPackageName().equals(callerPackage)) { + Log.e(TAG, "Callback must be from the profile owner"); + return false; + } + } + + return setGestureModeOverlayForMainLauncher(); + } + public void updateCurrentInteractionMode(boolean notify) { mCurrentUserContext = getCurrentUserContext(); int mode = getCurrentInteractionMode(mCurrentUserContext); @@ -245,6 +296,10 @@ public class NavigationModeController implements Dumpable { } } + private boolean supportsDeviceAdmin() { + return mContext.getPackageManager().hasSystemFeature(FEATURE_DEVICE_ADMIN); + } + private void deferGesturalNavOverlayIfNecessary() { final int userId = mDeviceProvisionedController.getCurrentUser(); mRestoreGesturalNavBarMode.put(userId, false); @@ -255,6 +310,7 @@ public class NavigationModeController implements Dumpable { Log.d(TAG, "deferGesturalNavOverlayIfNecessary: device is provisioned and user is " + "setup"); } + removeEnableGestureNavListener(); return; } @@ -270,6 +326,7 @@ public class NavigationModeController implements Dumpable { Log.d(TAG, "deferGesturalNavOverlayIfNecessary: no default gestural overlay, " + "default=" + defaultOverlays); } + removeEnableGestureNavListener(); return; } @@ -277,6 +334,24 @@ public class NavigationModeController implements Dumpable { // provisioned setModeOverlay(NAV_BAR_MODE_3BUTTON_OVERLAY, USER_CURRENT); mRestoreGesturalNavBarMode.put(userId, true); + + if (supportsDeviceAdmin() && mEnableGestureNavReceiver == null) { + mEnableGestureNavReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (DEBUG) { + Log.d(TAG, "ACTION_ENABLE_GESTURE_NAV"); + } + setResultCode(enableGestureNav(intent) ? RESULT_OK : RESULT_CANCELED); + } + }; + // Register for all users so that we can get managed users as well + mContext.registerReceiverAsUser(mEnableGestureNavReceiver, UserHandle.ALL, + new IntentFilter(ACTION_ENABLE_GESTURE_NAV), null, null); + if (DEBUG) { + Log.d(TAG, "mEnableGestureNavReceiver registered"); + } + } if (DEBUG) { Log.d(TAG, "deferGesturalNavOverlayIfNecessary: setting to 3 button mode"); } @@ -290,7 +365,15 @@ public class NavigationModeController implements Dumpable { final int userId = mDeviceProvisionedController.getCurrentUser(); if (mRestoreGesturalNavBarMode.get(userId)) { // Restore the gestural state if necessary - setModeOverlay(NAV_BAR_MODE_GESTURAL_OVERLAY, USER_CURRENT); + if (!supportsDeviceAdmin() + || mCurrentUserContext.getSystemService(DevicePolicyManager.class) + .getUserProvisioningState() == STATE_USER_UNMANAGED) { + setGestureModeOverlayForMainLauncher(); + } else { + if (DEBUG) { + Log.d(TAG, "Not restoring to gesture nav for managed user"); + } + } mRestoreGesturalNavBarMode.put(userId, false); } } @@ -309,100 +392,6 @@ public class NavigationModeController implements Dumpable { }); } - private void switchFromGestureNavModeIfNotSupportedByDefaultLauncher() { - if (getCurrentInteractionMode(mCurrentUserContext) != NAV_BAR_MODE_GESTURAL) { - return; - } - final Boolean supported = isGestureNavSupportedByDefaultLauncher(mCurrentUserContext); - if (supported == null || supported) { - return; - } - - Log.d(TAG, "Switching system navigation to 3-button mode:" - + " defaultLauncher=" + getDefaultLauncherPackageName(mCurrentUserContext) - + " contextUser=" + mCurrentUserContext.getUserId()); - - setModeOverlay(NAV_BAR_MODE_3BUTTON_OVERLAY, USER_CURRENT); - showNotification(mCurrentUserContext, R.string.notification_content_system_nav_changed); - mCurrentUserContext.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE) - .edit().putBoolean(PREFS_SWITCHED_FROM_GESTURE_NAV_KEY, true).apply(); - } - - private void showNotificationIfDefaultLauncherSupportsGestureNav() { - boolean previouslySwitchedFromGestureNav = mCurrentUserContext - .getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE) - .getBoolean(PREFS_SWITCHED_FROM_GESTURE_NAV_KEY, false); - if (!previouslySwitchedFromGestureNav) { - return; - } - if (getCurrentInteractionMode(mCurrentUserContext) == NAV_BAR_MODE_GESTURAL) { - return; - } - final Boolean supported = isGestureNavSupportedByDefaultLauncher(mCurrentUserContext); - if (supported == null || !supported) { - return; - } - - showNotification(mCurrentUserContext, R.string.notification_content_gesture_nav_available); - mCurrentUserContext.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE) - .edit().putBoolean(PREFS_SWITCHED_FROM_GESTURE_NAV_KEY, false).apply(); - } - - /** - * Returns null if there is no default launcher set for the current user. Returns true if the - * current default launcher supports Gesture Navigation. Returns false otherwise. - */ - private Boolean isGestureNavSupportedByDefaultLauncher(Context context) { - final String defaultLauncherPackageName = getDefaultLauncherPackageName(context); - if (DEBUG) { - Log.d(TAG, "isGestureNavSupportedByDefaultLauncher:" - + " defaultLauncher=" + defaultLauncherPackageName - + " contextUser=" + context.getUserId()); - } - if (defaultLauncherPackageName == null) { - return null; - } - if (isSystemApp(context, defaultLauncherPackageName)) { - return true; - } - return false; - } - - private String getDefaultLauncherPackageName(Context context) { - final ComponentName cn = context.getPackageManager().getHomeActivities(new ArrayList<>()); - if (cn == null) { - return null; - } - return cn.getPackageName(); - } - - /** Returns true if the app for the given package name is a system app for this device */ - private boolean isSystemApp(Context context, String packageName) { - try { - ApplicationInfo ai = context.getPackageManager().getApplicationInfo(packageName, - PackageManager.GET_META_DATA); - return ai != null && ((ai.flags & SYSTEM_APP_MASK) != 0); - } catch (PackageManager.NameNotFoundException e) { - return false; - } - } - - private void showNotification(Context context, int resId) { - final CharSequence message = context.getResources().getString(resId); - if (DEBUG) { - Log.d(TAG, "showNotification: message=" + message); - } - - final Notification.Builder builder = - new Notification.Builder(mContext, NotificationChannels.ALERTS) - .setContentText(message) - .setStyle(new Notification.BigTextStyle()) - .setSmallIcon(R.drawable.ic_info) - .setAutoCancel(true) - .setContentIntent(PendingIntent.getActivity(context, 0, new Intent(), 0)); - context.getSystemService(NotificationManager.class).notify(TAG, 0, builder.build()); - } - @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("NavigationModeController:"); @@ -415,12 +404,6 @@ public class NavigationModeController implements Dumpable { } pw.println(" defaultOverlays=" + defaultOverlays); dumpAssetPaths(mCurrentUserContext); - - pw.println(" defaultLauncher=" + mLastDefaultLauncher); - boolean previouslySwitchedFromGestureNav = mCurrentUserContext - .getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE) - .getBoolean(PREFS_SWITCHED_FROM_GESTURE_NAV_KEY, false); - pw.println(" previouslySwitchedFromGestureNav=" + previouslySwitchedFromGestureNav); } private void dumpAssetPaths(Context context) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java index 4dbd8545efb9..4d69f77e744d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelper.java @@ -28,8 +28,6 @@ import com.android.systemui.Dependency; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; import com.android.systemui.statusbar.AlertingNotificationManager; -import com.android.systemui.statusbar.AmbientPulseManager; -import com.android.systemui.statusbar.AmbientPulseManager.OnAmbientChangedListener; import com.android.systemui.statusbar.InflationTask; import com.android.systemui.statusbar.notification.NotificationEntryListener; import com.android.systemui.statusbar.notification.NotificationEntryManager; @@ -48,13 +46,13 @@ import javax.inject.Inject; import javax.inject.Singleton; /** - * A helper class dealing with the alert interactions between {@link NotificationGroupManager}, - * {@link HeadsUpManager}, {@link AmbientPulseManager}. In particular, this class deals with keeping + * A helper class dealing with the alert interactions between {@link NotificationGroupManager} and + * {@link HeadsUpManager}. In particular, this class deals with keeping * the correct notification in a group alerting based off the group suppression. */ @Singleton public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedListener, - OnAmbientChangedListener, StateListener { + StateListener { private static final long ALERT_TRANSFER_TIMEOUT = 300; @@ -70,8 +68,6 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis private final ArrayMap<String, PendingAlertInfo> mPendingAlerts = new ArrayMap<>(); private HeadsUpManager mHeadsUpManager; - private final AmbientPulseManager mAmbientPulseManager = - Dependency.get(AmbientPulseManager.class); private final NotificationGroupManager mGroupManager = Dependency.get(NotificationGroupManager.class); @@ -144,10 +140,9 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis @Override public void onGroupSuppressionChanged(NotificationGroup group, boolean suppressed) { - AlertingNotificationManager alertManager = getActiveAlertManager(); if (suppressed) { - if (alertManager.isAlerting(group.summary.key)) { - handleSuppressedSummaryAlerted(group.summary, alertManager); + if (mHeadsUpManager.isAlerting(group.summary.key)) { + handleSuppressedSummaryAlerted(group.summary, mHeadsUpManager); } } else { // Group summary can be null if we are no longer suppressed because the summary was @@ -160,8 +155,8 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis // Group is no longer suppressed. We should check if we need to transfer the alert // back to the summary now that it's no longer suppressed. if (groupAlertEntry.mAlertSummaryOnNextAddition) { - if (!alertManager.isAlerting(group.summary.key)) { - alertNotificationWhenPossible(group.summary, alertManager); + if (!mHeadsUpManager.isAlerting(group.summary.key)) { + alertNotificationWhenPossible(group.summary, mHeadsUpManager); } groupAlertEntry.mAlertSummaryOnNextAddition = false; } else { @@ -172,11 +167,6 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis }; @Override - public void onAmbientStateChanged(NotificationEntry entry, boolean isAmbient) { - onAlertStateChanged(entry, isAmbient, mAmbientPulseManager); - } - - @Override public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) { onAlertStateChanged(entry, isHeadsUp, mHeadsUpManager); } @@ -208,11 +198,10 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis PendingAlertInfo alertInfo = mPendingAlerts.remove(entry.key); if (alertInfo != null) { if (alertInfo.isStillValid()) { - alertNotificationWhenPossible(entry, getActiveAlertManager()); + alertNotificationWhenPossible(entry, mHeadsUpManager); } else { // The transfer is no longer valid. Free the content. - entry.getRow().freeContentViewWhenSafe( - alertInfo.mAlertManager.getContentFlag()); + entry.getRow().freeContentViewWhenSafe(mHeadsUpManager.getContentFlag()); } } } @@ -354,7 +343,6 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis if (SystemClock.elapsedRealtime() - groupAlertEntry.mLastAlertTransferTime < ALERT_TRANSFER_TIMEOUT) { NotificationEntry summary = groupAlertEntry.mGroup.summary; - AlertingNotificationManager alertManager = getActiveAlertManager(); if (!onlySummaryAlerts(summary)) { return; @@ -369,9 +357,9 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis boolean releasedChild = false; for (int i = 0; i < children.size(); i++) { NotificationEntry entry = children.get(i); - if (onlySummaryAlerts(entry) && alertManager.isAlerting(entry.key)) { + if (onlySummaryAlerts(entry) && mHeadsUpManager.isAlerting(entry.key)) { releasedChild = true; - alertManager.removeNotification(entry.key, true /* releaseImmediately */); + mHeadsUpManager.removeNotification(entry.key, true /* releaseImmediately */); } if (mPendingAlerts.containsKey(entry.key)) { // This is the child that would've been removed if it was inflated. @@ -379,10 +367,10 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis mPendingAlerts.get(entry.key).mAbortOnInflation = true; } } - if (releasedChild && !alertManager.isAlerting(summary.key)) { + if (releasedChild && !mHeadsUpManager.isAlerting(summary.key)) { boolean notifyImmediately = (numChildren - numPendingChildren) > 1; if (notifyImmediately) { - alertNotificationWhenPossible(summary, alertManager); + alertNotificationWhenPossible(summary, mHeadsUpManager); } else { // Should wait until the pending child inflates before alerting. groupAlertEntry.mAlertSummaryOnNextAddition = true; @@ -403,7 +391,7 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis @NonNull AlertingNotificationManager alertManager) { @InflationFlag int contentFlag = alertManager.getContentFlag(); if (!entry.getRow().isInflationFlagSet(contentFlag)) { - mPendingAlerts.put(entry.key, new PendingAlertInfo(entry, alertManager)); + mPendingAlerts.put(entry.key, new PendingAlertInfo(entry)); entry.getRow().updateInflationFlag(contentFlag, true /* shouldInflate */); entry.getRow().inflateViews(); return; @@ -415,10 +403,6 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis } } - private AlertingNotificationManager getActiveAlertManager() { - return mIsDozing ? mAmbientPulseManager : mHeadsUpManager; - } - private boolean onlySummaryAlerts(NotificationEntry entry) { return entry.notification.getNotification().getGroupAlertBehavior() == Notification.GROUP_ALERT_SUMMARY; @@ -429,10 +413,6 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis * inflation completes. */ private class PendingAlertInfo { - /** - * The alert manager when the transfer is initiated. - */ - final AlertingNotificationManager mAlertManager; /** * The original notification when the transfer is initiated. This is used to determine if @@ -450,10 +430,9 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis */ boolean mAbortOnInflation; - PendingAlertInfo(NotificationEntry entry, AlertingNotificationManager alertManager) { + PendingAlertInfo(NotificationEntry entry) { mOriginalNotification = entry.notification; mEntry = entry; - mAlertManager = alertManager; } /** @@ -466,10 +445,6 @@ public class NotificationGroupAlertTransferHelper implements OnHeadsUpChangedLis // Notification is aborted due to the transfer being explicitly cancelled return false; } - if (mAlertManager != getActiveAlertManager()) { - // Alert manager has changed - return false; - } if (mEntry.notification.getGroupKey() != mOriginalNotification.getGroupKey()) { // Groups have changed return false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java index cc8af3ba64fc..0bbfbefb7883 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationGroupManager.java @@ -24,8 +24,6 @@ import android.util.Log; import com.android.systemui.Dependency; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; -import com.android.systemui.statusbar.AmbientPulseManager; -import com.android.systemui.statusbar.AmbientPulseManager.OnAmbientChangedListener; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; @@ -46,8 +44,7 @@ import javax.inject.Singleton; * A class to handle notifications and their corresponding groups. */ @Singleton -public class NotificationGroupManager implements OnHeadsUpChangedListener, - OnAmbientChangedListener, StateListener { +public class NotificationGroupManager implements OnHeadsUpChangedListener, StateListener { private static final String TAG = "NotificationGroupManager"; private final HashMap<String, NotificationGroup> mGroupMap = new HashMap<>(); @@ -55,12 +52,11 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, private int mBarState = -1; private HashMap<String, StatusBarNotification> mIsolatedEntries = new HashMap<>(); private HeadsUpManager mHeadsUpManager; - private AmbientPulseManager mAmbientPulseManager = Dependency.get(AmbientPulseManager.class); private boolean mIsUpdatingUnchangedGroup; @Inject - public NotificationGroupManager() { - Dependency.get(StatusBarStateController.class).addCallback(this); + public NotificationGroupManager(StatusBarStateController statusBarStateController) { + statusBarStateController.addCallback(this); } /** @@ -439,23 +435,6 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, } @Override - public void onHeadsUpPinnedModeChanged(boolean inPinnedMode) { - } - - @Override - public void onHeadsUpPinned(NotificationEntry entry) { - } - - @Override - public void onHeadsUpUnPinned(NotificationEntry entry) { - } - - @Override - public void onAmbientStateChanged(NotificationEntry entry, boolean isAmbient) { - onAlertStateChanged(entry, isAmbient); - } - - @Override public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) { onAlertStateChanged(entry, isHeadsUp); } @@ -485,7 +464,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, if (!sbn.isGroup() || sbn.getNotification().isGroupSummary()) { return false; } - if (!mHeadsUpManager.isAlerting(entry.key) && !mAmbientPulseManager.isAlerting(entry.key)) { + if (!mHeadsUpManager.isAlerting(entry.key)) { return false; } return (sbn.getNotification().fullScreenIntent != null diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index f52becaf7b00..ba3406999388 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -12,21 +12,23 @@ import android.widget.FrameLayout; import androidx.annotation.NonNull; import androidx.collection.ArrayMap; -import com.android.internal.annotations.VisibleForTesting; import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.util.ContrastColorUtil; +import com.android.settingslib.Utils; import com.android.systemui.Dependency; +import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.statusbar.NotificationListener; +import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationUtils; +import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; @@ -39,15 +41,20 @@ import java.util.function.Function; * normally reserved for notifications. */ public class NotificationIconAreaController implements DarkReceiver, - StatusBarStateController.StateListener { + StatusBarStateController.StateListener, + NotificationWakeUpCoordinator.WakeUpListener { public static final String HIGH_PRIORITY = "high_priority"; + private static final long AOD_ICONS_APPEAR_DURATION = 200; private final ContrastColorUtil mContrastColorUtil; private final NotificationEntryManager mEntryManager; private final Runnable mUpdateStatusBarIcons = this::updateStatusBarIcons; private final StatusBarStateController mStatusBarStateController; private final NotificationMediaManager mMediaManager; + private final NotificationWakeUpCoordinator mWakeUpCoordinator; + private final KeyguardBypassController mBypassController; + private final DozeParameters mDozeParameters; private int mIconSize; private int mIconHPadding; @@ -60,20 +67,23 @@ public class NotificationIconAreaController implements DarkReceiver, private NotificationIconContainer mShelfIcons; protected View mCenteredIconArea; private NotificationIconContainer mCenteredIcon; + private NotificationIconContainer mAodIcons; private StatusBarIconView mCenteredIconView; private final Rect mTintArea = new Rect(); private ViewGroup mNotificationScrollLayout; private Context mContext; - private boolean mFullyDark; - private boolean mAnimationsEnabled; + private int mAodIconAppearTranslation; - /** - * Ratio representing being awake or in ambient mode, where 1 is dark and 0 awake. - */ - private float mDarkAmount; + private boolean mAnimationsEnabled; + private int mAodIconTint; + private boolean mFullyHidden; + private boolean mAodIconsVisible; + private boolean mIsPulsing; public NotificationIconAreaController(Context context, StatusBar statusBar, StatusBarStateController statusBarStateController, + NotificationWakeUpCoordinator wakeUpCoordinator, + KeyguardBypassController keyguardBypassController, NotificationMediaManager notificationMediaManager) { mStatusBar = statusBar; mContrastColorUtil = ContrastColorUtil.getInstance(context); @@ -82,8 +92,13 @@ public class NotificationIconAreaController implements DarkReceiver, mStatusBarStateController = statusBarStateController; mStatusBarStateController.addCallback(this); mMediaManager = notificationMediaManager; + mDozeParameters = DozeParameters.getInstance(mContext); + mWakeUpCoordinator = wakeUpCoordinator; + wakeUpCoordinator.addListener(this); + mBypassController = keyguardBypassController; initializeNotificationAreaViews(context); + reloadAodColor(); } protected View inflateIconArea(LayoutInflater inflater) { @@ -104,6 +119,24 @@ public class NotificationIconAreaController implements DarkReceiver, mCenteredIconArea = layoutInflater.inflate(R.layout.center_icon_area, null); mCenteredIcon = mCenteredIconArea.findViewById(R.id.centeredIcon); + + initAodIcons(); + } + + public void initAodIcons() { + boolean changed = mAodIcons != null; + if (changed) { + mAodIcons.setAnimationsEnabled(false); + mAodIcons.removeAllViews(); + } + mAodIcons = mStatusBar.getStatusBarWindow().findViewById( + R.id.clock_notification_icon_container); + mAodIcons.setOnLockScreen(true); + updateAodIconsVisibility(false /* animate */); + updateAnimations(); + if (changed) { + updateAodNotificationIcons(); + } } public void setupShelf(NotificationShelf shelf) { @@ -126,6 +159,10 @@ public class NotificationIconAreaController implements DarkReceiver, View child = mCenteredIcon.getChildAt(i); child.setLayoutParams(params); } + for (int i = 0; i < mAodIcons.getChildCount(); i++) { + View child = mAodIcons.getChildAt(i); + child.setLayoutParams(params); + } } @NonNull @@ -138,6 +175,8 @@ public class NotificationIconAreaController implements DarkReceiver, Resources res = context.getResources(); mIconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_icon_size); mIconHPadding = res.getDimensionPixelSize(R.dimen.status_bar_icon_padding); + mAodIconAppearTranslation = res.getDimensionPixelSize( + R.dimen.shelf_appear_translation); } /** @@ -192,12 +231,17 @@ public class NotificationIconAreaController implements DarkReceiver, } protected boolean shouldShowNotificationIcon(NotificationEntry entry, - boolean showAmbient, boolean showLowPriority, boolean hideDismissed, - boolean hideRepliedMessages, boolean hideCurrentMedia, boolean hideCenteredIcon) { + boolean showAmbient, boolean hideDismissed, + boolean hideRepliedMessages, boolean hideCurrentMedia, boolean hideCenteredIcon, + boolean hidePulsing, boolean onlyShowCenteredIcon) { - final boolean isCenteredNotificationIcon = entry.centeredIcon != null + final boolean isCenteredNotificationIcon = mCenteredIconView != null + && entry.centeredIcon != null && Objects.equals(entry.centeredIcon, mCenteredIconView); - if (hideCenteredIcon == isCenteredNotificationIcon) { + if (onlyShowCenteredIcon) { + return isCenteredNotificationIcon; + } + if (hideCenteredIcon && isCenteredNotificationIcon && !entry.isRowHeadsUp()) { return false; } if (mEntryManager.getNotificationData().isAmbient(entry.key) && !showAmbient) { @@ -206,9 +250,6 @@ public class NotificationIconAreaController implements DarkReceiver, if (hideCurrentMedia && entry.key.equals(mMediaManager.getMediaNotificationKey())) { return false; } - if (!showLowPriority && !entry.isHighPriority()) { - return false; - } if (!entry.isTopLevelChild()) { return false; } @@ -222,7 +263,12 @@ public class NotificationIconAreaController implements DarkReceiver, return false; } // showAmbient == show in shade but not shelf - if ((!showAmbient || mFullyDark) && entry.shouldSuppressStatusBar()) { + if (!showAmbient && entry.shouldSuppressStatusBar()) { + return false; + } + if (hidePulsing && entry.showingPulsing() + && (!mWakeUpCoordinator.getNotificationsFullyHidden() + || !entry.isPulseSuppressed())) { return false; } return true; @@ -235,6 +281,7 @@ public class NotificationIconAreaController implements DarkReceiver, updateStatusBarIcons(); updateShelfIcons(); updateCenterIcon(); + updateAodNotificationIcons(); applyNotificationIconsTint(); } @@ -242,50 +289,45 @@ public class NotificationIconAreaController implements DarkReceiver, private void updateShelfIcons() { updateIconsForLayout(entry -> entry.expandedIcon, mShelfIcons, true /* showAmbient */, - true /* showLowPriority */, false /* hideDismissed */, - mFullyDark /* hideRepliedMessages */, - mFullyDark /* hideCurrentMedia */, - true /* hide centered icon */); + false /* hideRepliedMessages */, + false /* hideCurrentMedia */, + false /* hide centered icon */, + false /* hidePulsing */, + false /* onlyShowCenteredIcon */); } public void updateStatusBarIcons() { updateIconsForLayout(entry -> entry.icon, mNotificationIcons, false /* showAmbient */, - true /* showLowPriority */, true /* hideDismissed */, true /* hideRepliedMessages */, false /* hideCurrentMedia */, - true /* hide centered icon */); + true /* hide centered icon */, + false /* hidePulsing */, + false /* onlyShowCenteredIcon */); } private void updateCenterIcon() { updateIconsForLayout(entry -> entry.centeredIcon, mCenteredIcon, false /* showAmbient */, - true /* showLowPriority */, false /* hideDismissed */, false /* hideRepliedMessages */, - mFullyDark /* hideCurrentMedia */, - false /* hide centered icon */); - } - - /** - * If icons of the status bar should animate when they are added or removed. - */ - public void setAnimationsEnabled(boolean enabled) { - mAnimationsEnabled = enabled; - updateAnimations(); - } - - @Override - public void onStateChanged(int newState) { - updateAnimations(); + false /* hideCurrentMedia */, + false /* hide centered icon */, + false /* hidePulsing */, + true/* onlyShowCenteredIcon */); } - private void updateAnimations() { - boolean inShade = mStatusBarStateController.getState() == StatusBarState.SHADE; - mCenteredIcon.setAnimationsEnabled(mAnimationsEnabled && inShade); - mNotificationIcons.setAnimationsEnabled(mAnimationsEnabled && inShade); + public void updateAodNotificationIcons() { + updateIconsForLayout(entry -> entry.aodIcon, mAodIcons, + false /* showAmbient */, + true /* hideDismissed */, + true /* hideRepliedMessages */, + true /* hideCurrentMedia */, + true /* hide centered icon */, + mBypassController.getBypassEnabled() /* hidePulsing */, + false /* onlyShowCenteredIcon */); } /** @@ -296,11 +338,12 @@ public class NotificationIconAreaController implements DarkReceiver, * @param showAmbient should ambient notification icons be shown * @param hideDismissed should dismissed icons be hidden * @param hideRepliedMessages should messages that have been replied to be hidden + * @param hidePulsing should pulsing notifications be hidden */ private void updateIconsForLayout(Function<NotificationEntry, StatusBarIconView> function, - NotificationIconContainer hostLayout, boolean showAmbient, boolean showLowPriority, + NotificationIconContainer hostLayout, boolean showAmbient, boolean hideDismissed, boolean hideRepliedMessages, boolean hideCurrentMedia, - boolean hideCenteredIcon) { + boolean hideCenteredIcon, boolean hidePulsing, boolean onlyShowCenteredIcon) { ArrayList<StatusBarIconView> toShow = new ArrayList<>( mNotificationScrollLayout.getChildCount()); @@ -309,8 +352,9 @@ public class NotificationIconAreaController implements DarkReceiver, View view = mNotificationScrollLayout.getChildAt(i); if (view instanceof ExpandableNotificationRow) { NotificationEntry ent = ((ExpandableNotificationRow) view).getEntry(); - if (shouldShowNotificationIcon(ent, showAmbient, showLowPriority, hideDismissed, - hideRepliedMessages, hideCurrentMedia, hideCenteredIcon)) { + if (shouldShowNotificationIcon(ent, showAmbient, hideDismissed, + hideRepliedMessages, hideCurrentMedia, hideCenteredIcon, hidePulsing, + onlyShowCenteredIcon)) { StatusBarIconView iconView = function.apply(ent); if (iconView != null) { toShow.add(iconView); @@ -424,6 +468,8 @@ public class NotificationIconAreaController implements DarkReceiver, iv.executeOnLayout(() -> updateTintForIcon(iv, mCenteredIconTint)); } } + + updateAodIconColors(); } private void updateTintForIcon(StatusBarIconView v, int tint) { @@ -437,12 +483,6 @@ public class NotificationIconAreaController implements DarkReceiver, v.setDecorColor(tint); } - public void setDark(boolean dark) { - mNotificationIcons.setDark(dark, false, 0); - mShelfIcons.setDark(dark, false, 0); - mCenteredIcon.setDark(dark, false, 0); - } - /** * Shows the icon view given in the center. */ @@ -463,12 +503,119 @@ public class NotificationIconAreaController implements DarkReceiver, } @Override - public void onDozeAmountChanged(float linear, float eased) { - mDarkAmount = linear; - boolean fullyDark = mDarkAmount == 1f; - if (mFullyDark != fullyDark) { - mFullyDark = fullyDark; - updateShelfIcons(); + public void onDozingChanged(boolean isDozing) { + boolean animate = mDozeParameters.getAlwaysOn() + && !mDozeParameters.getDisplayNeedsBlanking(); + mAodIcons.setDozing(isDozing, animate, 0); + } + + public void setAnimationsEnabled(boolean enabled) { + mAnimationsEnabled = enabled; + updateAnimations(); + } + + @Override + public void onStateChanged(int newState) { + updateAodIconsVisibility(false /* animate */); + updateAnimations(); + } + + private void updateAnimations() { + boolean inShade = mStatusBarStateController.getState() == StatusBarState.SHADE; + mAodIcons.setAnimationsEnabled(mAnimationsEnabled && !inShade); + mCenteredIcon.setAnimationsEnabled(mAnimationsEnabled && inShade); + mNotificationIcons.setAnimationsEnabled(mAnimationsEnabled && inShade); + } + + public void onThemeChanged() { + reloadAodColor(); + updateAodIconColors(); + } + + public void appearAodIcons() { + DozeParameters dozeParameters = DozeParameters.getInstance(mContext); + if (dozeParameters.shouldControlScreenOff()) { + mAodIcons.setTranslationY(-mAodIconAppearTranslation); + mAodIcons.setAlpha(0); + mAodIcons.animate() + .setInterpolator(Interpolators.DECELERATE_QUINT) + .translationY(0) + .setDuration(AOD_ICONS_APPEAR_DURATION) + .start(); + mAodIcons.animate() + .alpha(1) + .setInterpolator(Interpolators.LINEAR) + .setDuration(AOD_ICONS_APPEAR_DURATION) + .start(); + } + } + + private void reloadAodColor() { + mAodIconTint = Utils.getColorAttrDefaultColor(mContext, + R.attr.wallpaperTextColor); + } + private void updateAodIconColors() { + for (int i = 0; i < mAodIcons.getChildCount(); i++) { + final StatusBarIconView iv = (StatusBarIconView) mAodIcons.getChildAt(i); + if (iv.getWidth() != 0) { + updateTintForIcon(iv, mAodIconTint); + } else { + iv.executeOnLayout(() -> updateTintForIcon(iv, mAodIconTint)); + } + } + } + + @Override + public void onFullyHiddenChanged(boolean fullyHidden) { + boolean animate = true; + if (!mBypassController.getBypassEnabled()) { + animate = mDozeParameters.getAlwaysOn() && !mDozeParameters.getDisplayNeedsBlanking(); + // We only want the appear animations to happen when the notifications get fully hidden, + // since otherwise the unhide animation overlaps + animate &= fullyHidden; + } + updateAodIconsVisibility(animate); + updateAodNotificationIcons(); + } + + @Override + public void onPulseExpansionChanged(boolean expandingChanged) { + if (expandingChanged) { + updateAodIconsVisibility(true /* animate */); + } + } + + private void updateAodIconsVisibility(boolean animate) { + boolean visible = mBypassController.getBypassEnabled() + || mWakeUpCoordinator.getNotificationsFullyHidden(); + if (mStatusBarStateController.getState() != StatusBarState.KEYGUARD) { + visible = false; + } + if (visible && mWakeUpCoordinator.isPulseExpanding()) { + visible = false; + } + if (mAodIconsVisible != visible) { + mAodIconsVisible = visible; + mAodIcons.animate().cancel(); + if (animate) { + boolean wasFullyInvisible = mAodIcons.getVisibility() != View.VISIBLE; + if (mAodIconsVisible) { + if (wasFullyInvisible) { + // No fading here, let's just appear the icons instead! + mAodIcons.setVisibility(View.VISIBLE); + mAodIcons.setAlpha(1.0f); + appearAodIcons(); + } else { + // We were fading out, let's fade in instead + CrossFadeHelper.fadeIn(mAodIcons); + } + } else { + CrossFadeHelper.fadeOut(mAodIcons); + } + } else { + mAodIcons.setAlpha(1.0f); + mAodIcons.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); + } } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java index e20a23edc66d..a53ce9bb2014 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java @@ -128,7 +128,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } }.setDuration(CONTENT_FADE_DURATION); - private static final int MAX_VISIBLE_ICONS_WHEN_DARK = 5; + private static final int MAX_VISIBLE_ICONS_ON_LOCK = 5; public static final int MAX_STATIC_ICONS = 4; private static final int MAX_DOTS = 1; @@ -141,7 +141,8 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { private int mActualLayoutWidth = NO_VALUE; private float mActualPaddingEnd = NO_VALUE; private float mActualPaddingStart = NO_VALUE; - private boolean mDark; + private boolean mDozing; + private boolean mOnLockScreen; private boolean mChangingViewPositions; private int mAddAnimationStartIndex = -1; private int mCannedAnimationStartIndex = -1; @@ -288,7 +289,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } } if (child instanceof StatusBarIconView) { - ((StatusBarIconView) child).setDark(mDark, false, 0); + ((StatusBarIconView) child).setDozing(mDozing, false, 0); } } @@ -319,7 +320,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { if (child instanceof StatusBarIconView) { boolean isReplacingIcon = isReplacingIcon(child); final StatusBarIconView icon = (StatusBarIconView) child; - if (mAnimationsEnabled && icon.getVisibleState() != StatusBarIconView.STATE_HIDDEN + if (areAnimationsEnabled(icon) && icon.getVisibleState() != StatusBarIconView.STATE_HIDDEN && child.getVisibility() == VISIBLE && isReplacingIcon) { int animationStartIndex = findFirstViewIndexAfter(icon.getTranslationX()); if (mAddAnimationStartIndex < 0) { @@ -330,7 +331,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } if (!mChangingViewPositions) { mIconStates.remove(child); - if (mAnimationsEnabled && !isReplacingIcon) { + if (areAnimationsEnabled(icon) && !isReplacingIcon) { addTransientView(icon, 0); boolean isIsolatedIcon = child == mIsolatedIcon; icon.setVisibleState(StatusBarIconView.STATE_HIDDEN, true /* animate */, @@ -341,6 +342,10 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } } + private boolean areAnimationsEnabled(StatusBarIconView icon) { + return mAnimationsEnabled || icon == mIsolatedIcon; + } + /** * Finds the first view with a translation bigger then a given value */ @@ -373,7 +378,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { float translationX = getActualPaddingStart(); int firstOverflowIndex = -1; int childCount = getChildCount(); - int maxVisibleIcons = mDark ? MAX_VISIBLE_ICONS_WHEN_DARK : + int maxVisibleIcons = mOnLockScreen ? MAX_VISIBLE_ICONS_ON_LOCK : mIsStaticLayout ? MAX_STATIC_ICONS : childCount; float layoutEnd = getLayoutEnd(); float overflowStart = getMaxOverflowStart(); @@ -390,8 +395,8 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { boolean forceOverflow = mSpeedBumpIndex != -1 && i >= mSpeedBumpIndex && iconState.iconAppearAmount > 0.0f || i >= maxVisibleIcons; boolean noOverflowAfter = i == childCount - 1; - float drawingScale = mDark && view instanceof StatusBarIconView - ? ((StatusBarIconView) view).getIconScaleFullyDark() + float drawingScale = mOnLockScreen && view instanceof StatusBarIconView + ? ((StatusBarIconView) view).getIconScaleIncreased() : 1f; if (mOpenedAmount != 0.0f) { noOverflowAfter = noOverflowAfter && !hasAmbient && !forceOverflow; @@ -438,7 +443,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { mFirstVisibleIconState = mIconStates.get(getChildAt(0)); } - boolean center = mDark; + boolean center = mOnLockScreen; if (center && translationX < getLayoutEnd()) { float initialTranslation = mFirstVisibleIconState == null ? 0 : mFirstVisibleIconState.xTranslation; @@ -558,13 +563,13 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { mChangingViewPositions = changingViewPositions; } - public void setDark(boolean dark, boolean fade, long delay) { - mDark = dark; + public void setDozing(boolean dozing, boolean fade, long delay) { + mDozing = dozing; mDisallowNextAnimation |= !fade; for (int i = 0; i < getChildCount(); i++) { View view = getChildAt(i); if (view instanceof StatusBarIconView) { - ((StatusBarIconView) view).setDark(dark, fade, delay); + ((StatusBarIconView) view).setDozing(dozing, fade, delay); } } } @@ -668,6 +673,10 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } } + public void setOnLockScreen(boolean onLockScreen) { + mOnLockScreen = onLockScreen; + } + public class IconState extends ViewState { public static final int NO_VALUE = NotificationIconContainer.NO_VALUE; public float iconAppearAmount = 1.0f; @@ -690,7 +699,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { StatusBarIconView icon = (StatusBarIconView) view; boolean animate = false; AnimationProperties animationProperties = null; - boolean animationsAllowed = mAnimationsEnabled && !mDisallowNextAnimation + boolean animationsAllowed = areAnimationsEnabled(icon) && !mDisallowNextAnimation && !noAnimations; if (animationsAllowed) { if (justAdded || justReplaced) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index bc205d676914..a0847b62eddb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -40,6 +40,7 @@ import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.Region; import android.os.PowerManager; +import android.os.SystemClock; import android.util.AttributeSet; import android.util.Log; import android.util.MathUtils; @@ -57,6 +58,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.keyguard.KeyguardClockSwitch; import com.android.keyguard.KeyguardStatusView; +import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.DejankUtils; import com.android.systemui.Dependency; import com.android.systemui.Interpolators; @@ -114,7 +116,8 @@ public class NotificationPanelView extends PanelView implements KeyguardAffordanceHelper.Callback, NotificationStackScrollLayout.OnEmptySpaceClickListener, OnHeadsUpChangedListener, QS.HeightListener, ZenModeController.Callback, ConfigurationController.ConfigurationListener, StateListener, - PulseExpansionHandler.ExpansionCallback, DynamicPrivacyController.Listener { + PulseExpansionHandler.ExpansionCallback, DynamicPrivacyController.Listener, + NotificationWakeUpCoordinator.WakeUpListener { private static final boolean DEBUG = false; @@ -138,6 +141,12 @@ public class NotificationPanelView extends PanelView implements private static final int CAP_HEIGHT = 1456; private static final int FONT_HEIGHT = 2163; + /** + * Maximum time before which we will expand the panel even for slow motions when getting a + * touch passed over from launcher. + */ + private static final int MAX_TIME_TO_OPEN_WHEN_FLINGING_FROM_LAUNCHER = 300; + static final String COUNTER_PANEL_OPEN = "panel_open"; static final String COUNTER_PANEL_OPEN_QS = "panel_open_qs"; private static final String COUNTER_PANEL_OPEN_PEEK = "panel_open_peek"; @@ -147,12 +156,23 @@ public class NotificationPanelView extends PanelView implements private static final AnimationProperties CLOCK_ANIMATION_PROPERTIES = new AnimationProperties() .setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD); + private static final AnimatableProperty KEYGUARD_HEADS_UP_SHOWING_AMOUNT + = AnimatableProperty.from("KEYGUARD_HEADS_UP_SHOWING_AMOUNT", + NotificationPanelView::setKeyguardHeadsUpShowingAmount, + NotificationPanelView::getKeyguardHeadsUpShowingAmount, + R.id.keyguard_hun_animator_tag, + R.id.keyguard_hun_animator_end_tag, + R.id.keyguard_hun_animator_start_tag); + private static final AnimationProperties KEYGUARD_HUN_PROPERTIES = + new AnimationProperties().setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD); private final InjectionInflationController mInjectionInflationController; private final PowerManager mPowerManager; private final AccessibilityManager mAccessibilityManager; private final NotificationWakeUpCoordinator mWakeUpCoordinator; private final PulseExpansionHandler mPulseExpansionHandler; + private final KeyguardBypassController mKeyguardBypassController; + private final KeyguardUpdateMonitor mUpdateMonitor; @VisibleForTesting protected KeyguardAffordanceHelper mAffordanceHelper; @@ -213,6 +233,8 @@ public class NotificationPanelView extends PanelView implements private int mNotificationsHeaderCollideDistance; private int mUnlockMoveDistance; private float mEmptyDragAmount; + private float mDownX; + private float mDownY; private final KeyguardClockPositionAlgorithm mClockPositionAlgorithm = new KeyguardClockPositionAlgorithm(); @@ -277,6 +299,12 @@ public class NotificationPanelView extends PanelView implements private boolean mBlockingExpansionForCurrentTouch; /** + * Following variables maintain state of events when input focus transfer may occur. + */ + private boolean mExpectingSynthesizedDown; // expecting to see synthesized DOWN event + private boolean mLastEventSynthesizedDown; // last event was synthesized DOWN event + + /** * Current dark amount that follows regular interpolation curve of animation. */ private float mInterpolatedDarkAmount; @@ -347,13 +375,23 @@ public class NotificationPanelView extends PanelView implements private int mThemeResId; private KeyguardIndicationController mKeyguardIndicationController; private Consumer<Boolean> mAffordanceLaunchListener; + private int mShelfHeight; + private Runnable mOnReinflationListener; + private int mDarkIconSize; + private int mHeadsUpInset; + private boolean mHeadsUpPinnedMode; + private float mKeyguardHeadsUpShowingAmount = 0.0f; + private boolean mShowingKeyguardHeadsUp; + private boolean mAllowExpandForSmallExpansion; + private Runnable mExpandAfterLayoutRunnable; @Inject public NotificationPanelView(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, InjectionInflationController injectionInflationController, NotificationWakeUpCoordinator coordinator, PulseExpansionHandler pulseExpansionHandler, - DynamicPrivacyController dynamicPrivacyController) { + DynamicPrivacyController dynamicPrivacyController, + KeyguardBypassController bypassController) { super(context, attrs); setWillNotDraw(!DEBUG); mInjectionInflationController = injectionInflationController; @@ -367,7 +405,14 @@ public class NotificationPanelView extends PanelView implements mCommandQueue = getComponent(context, CommandQueue.class); mDisplayId = context.getDisplayId(); mPulseExpansionHandler = pulseExpansionHandler; + pulseExpansionHandler.setPulseExpandAbortListener(() -> { + if (mQs != null) { + mQs.animateHeaderSlidingOut(); + } + }); mThemeResId = context.getThemeResId(); + mKeyguardBypassController = bypassController; + mUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext); dynamicPrivacyController.addListener(this); mBottomAreaShadeAlphaAnimator = ValueAnimator.ofFloat(1f, 0); @@ -416,6 +461,21 @@ public class NotificationPanelView extends PanelView implements mWakeUpCoordinator.setStackScroller(mNotificationStackScroller); mQsFrame = findViewById(R.id.qs_frame); mPulseExpansionHandler.setUp(mNotificationStackScroller, this, mShadeController); + mWakeUpCoordinator.addListener(new NotificationWakeUpCoordinator.WakeUpListener() { + @Override + public void onFullyHiddenChanged(boolean isFullyHidden) { + updateKeyguardStatusBarForHeadsUp(); + } + + @Override + public void onPulseExpansionChanged(boolean expandingChanged) { + if (mKeyguardBypassController.getBypassEnabled()) { + // Position the notifications while dragging down while pulsing + requestScrollerTopPaddingUpdate(false /* animate */); + updateQSPulseExpansion(); + } + } + }); } @Override @@ -460,6 +520,13 @@ public class NotificationPanelView extends PanelView implements R.dimen.keyguard_indication_bottom_padding); mQsNotificationTopPadding = getResources().getDimensionPixelSize( R.dimen.qs_notification_padding); + mShelfHeight = getResources().getDimensionPixelSize(R.dimen.notification_shelf_height); + mDarkIconSize = getResources().getDimensionPixelSize( + R.dimen.status_bar_icon_drawing_size_dark); + int statusbarHeight = getResources().getDimensionPixelSize( + com.android.internal.R.dimen.status_bar_height); + mHeadsUpInset = statusbarHeight + getResources().getDimensionPixelSize( + R.dimen.heads_up_status_bar_padding); } /** @@ -552,6 +619,9 @@ public class NotificationPanelView extends PanelView implements setKeyguardStatusViewVisibility(mBarState, false, false); setKeyguardBottomAreaVisibility(mBarState, false); + if (mOnReinflationListener != null) { + mOnReinflationListener.run(); + } } private void initBottomArea() { @@ -610,6 +680,10 @@ public class NotificationPanelView extends PanelView implements } updateMaxHeadsUpTranslation(); updateGestureExclusionRect(); + if (mExpandAfterLayoutRunnable != null) { + mExpandAfterLayoutRunnable.run(); + mExpandAfterLayoutRunnable = null; + } } private void updateGestureExclusionRect() { @@ -671,24 +745,30 @@ public class NotificationPanelView extends PanelView implements boolean animateClock = animate || mAnimateNextPositionUpdate; int stackScrollerPadding; if (mBarState != StatusBarState.KEYGUARD) { - stackScrollerPadding = (mQs != null ? mQs.getHeader().getHeight() : 0) + mQsPeekHeight - + mQsNotificationTopPadding; + stackScrollerPadding = getUnlockedStackScrollerPadding(); } else { int totalHeight = getHeight(); int bottomPadding = Math.max(mIndicationBottomPadding, mAmbientIndicationBottomPadding); int clockPreferredY = mKeyguardStatusView.getClockPreferredY(totalHeight); + boolean bypassEnabled = mKeyguardBypassController.getBypassEnabled(); + final boolean hasVisibleNotifications = + !bypassEnabled && mNotificationStackScroller.getVisibleNotificationCount() != 0; + mKeyguardStatusView.setHasVisibleNotifications(hasVisibleNotifications); mClockPositionAlgorithm.setup( mStatusBarMinHeight, totalHeight - bottomPadding, mNotificationStackScroller.getIntrinsicContentHeight(), getExpandedFraction(), totalHeight, - mKeyguardStatusView.getHeight(), + (int) (mKeyguardStatusView.getHeight() + - mShelfHeight / 2.0f - mDarkIconSize / 2.0f), clockPreferredY, hasCustomClock(), - mNotificationStackScroller.getVisibleNotificationCount() != 0, + hasVisibleNotifications, mInterpolatedDarkAmount, - mEmptyDragAmount); + mEmptyDragAmount, + bypassEnabled, + getUnlockedStackScrollerPadding()); mClockPositionAlgorithm.run(mClockPositionResult); PropertyAnimator.setProperty(mKeyguardStatusView, AnimatableProperty.X, mClockPositionResult.clockX, CLOCK_ANIMATION_PROPERTIES, animateClock); @@ -696,10 +776,9 @@ public class NotificationPanelView extends PanelView implements mClockPositionResult.clockY, CLOCK_ANIMATION_PROPERTIES, animateClock); updateNotificationTranslucency(); updateClock(); - stackScrollerPadding = mClockPositionResult.stackScrollerPadding; + stackScrollerPadding = mClockPositionResult.stackScrollerPaddingExpanded; } mNotificationStackScroller.setIntrinsicPadding(stackScrollerPadding); - mNotificationStackScroller.setAntiBurnInOffsetX(mClockPositionResult.clockX); mKeyguardBottomArea.setAntiBurnInOffsetX(mClockPositionResult.clockX); mStackScrollerMeasuringPass++; @@ -709,6 +788,14 @@ public class NotificationPanelView extends PanelView implements } /** + * @return the padding of the stackscroller when unlocked + */ + private int getUnlockedStackScrollerPadding() { + return (mQs != null ? mQs.getHeader().getHeight() : 0) + mQsPeekHeight + + mQsNotificationTopPadding; + } + + /** * @param maximum the maximum to return at most * @return the maximum keyguard notifications that can fit on the screen */ @@ -868,7 +955,7 @@ public class NotificationPanelView extends PanelView implements protected void flingToHeight(float vel, boolean expand, float target, float collapseSpeedUpFactor, boolean expandBecauseOfFalsing) { mHeadsUpTouchHelper.notifyFling(!expand); - setClosingWithAlphaFadeout(!expand && getFadeoutAlpha() == 1.0f); + setClosingWithAlphaFadeout(!expand && !isOnKeyguard() && getFadeoutAlpha() == 1.0f); super.flingToHeight(vel, expand, target, collapseSpeedUpFactor, expandBecauseOfFalsing); } @@ -889,7 +976,8 @@ public class NotificationPanelView extends PanelView implements MetricsLogger.count(mContext, COUNTER_PANEL_OPEN_PEEK, 1); return true; } - if (mPulseExpansionHandler.onInterceptTouchEvent(event)) { + if (!shouldQuickSettingsIntercept(mDownX, mDownY, 0) + && mPulseExpansionHandler.onInterceptTouchEvent(event)) { return true; } @@ -990,8 +1078,21 @@ public class NotificationPanelView extends PanelView implements mOnlyAffordanceInThisMotion = false; mQsTouchAboveFalsingThreshold = mQsFullyExpanded; mDozingOnDown = isDozing(); + mDownX = event.getX(); + mDownY = event.getY(); mCollapsedOnDown = isFullyCollapsed(); mListenForHeadsUp = mCollapsedOnDown && mHeadsUpManager.hasPinnedHeadsUp(); + mAllowExpandForSmallExpansion = mExpectingSynthesizedDown; + mTouchSlopExceededBeforeDown = mExpectingSynthesizedDown; + if (mExpectingSynthesizedDown) { + mLastEventSynthesizedDown = true; + } else { + // down but not synthesized motion event. + mLastEventSynthesizedDown = false; + } + } else { + // not down event at all. + mLastEventSynthesizedDown = false; } } @@ -1041,6 +1142,20 @@ public class NotificationPanelView extends PanelView implements } @Override + protected boolean shouldExpandWhenNotFlinging() { + if (super.shouldExpandWhenNotFlinging()) { + return true; + } + if (mAllowExpandForSmallExpansion) { + // When we get a touch that came over from launcher, the velocity isn't always correct + // Let's err on expanding if the gesture has been reasonably slow + long timeSinceDown = SystemClock.uptimeMillis() - mDownTime; + return timeSinceDown <= MAX_TIME_TO_OPEN_WHEN_FLINGING_FROM_LAUNCHER; + } + return false; + } + + @Override protected float getOpeningHeight() { return mNotificationStackScroller.getOpeningHeight(); } @@ -1057,13 +1172,20 @@ public class NotificationPanelView extends PanelView implements return false; } - initDownStates(event); // Make sure the next touch won't the blocked after the current ends. if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { mBlockingExpansionForCurrentTouch = false; } - if (!mIsExpanding && mPulseExpansionHandler.onTouchEvent(event)) { + // When touch focus transfer happens, ACTION_DOWN->ACTION_UP may happen immediately + // without any ACTION_MOVE event. + // In such case, simply expand the panel instead of being stuck at the bottom bar. + if (mLastEventSynthesizedDown && event.getAction() == MotionEvent.ACTION_UP) { + expand(true /* animate */); + } + initDownStates(event); + if (!mIsExpanding && !shouldQuickSettingsIntercept(mDownX, mDownY, 0) + && mPulseExpansionHandler.onTouchEvent(event)) { // We're expanding all the other ones shouldn't get this anymore return true; } @@ -1180,6 +1302,49 @@ public class NotificationPanelView extends PanelView implements } } + /** + * Input focus transfer is about to happen. + */ + public void startWaitingForOpenPanelGesture() { + if (!isFullyCollapsed()) { + return; + } + mExpectingSynthesizedDown = true; + onTrackingStarted(); + updatePanelExpanded(); + } + + /** + * Called when this view is no longer waiting for input focus transfer. + * + * There are two scenarios behind this function call. First, input focus transfer + * has successfully happened and this view already received synthetic DOWN event. + * (mExpectingSynthesizedDown == false). Do nothing. + * + * Second, before input focus transfer finished, user may have lifted finger + * in previous window and this window never received synthetic DOWN event. + * (mExpectingSynthesizedDown == true). + * In this case, we use the velocity to trigger fling event. + * + * @param velocity unit is in px / millis + */ + public void stopWaitingForOpenPanelGesture(final float velocity) { + if (mExpectingSynthesizedDown) { + mExpectingSynthesizedDown = false; + maybeVibrateOnOpening(); + Runnable runnable = () -> fling(velocity > 1f ? 1000f * velocity : 0, + true /* expand */); + if (mStatusBar.getStatusBarWindow().getHeight() + != mStatusBar.getStatusBarHeight()) { + // The panel is already expanded to its full size, let's expand directly + runnable.run(); + } else { + mExpandAfterLayoutRunnable = runnable; + } + onTrackingStopped(false); + } + } + @Override protected boolean flingExpands(float vel, float vectorVel, float x, float y) { boolean expands = super.flingExpands(vel, vectorVel, x, y); @@ -1192,8 +1357,12 @@ public class NotificationPanelView extends PanelView implements } @Override - protected boolean hasConflictingGestures() { - return mBarState != StatusBarState.SHADE; + protected boolean shouldGestureWaitForTouchSlop() { + if (mExpectingSynthesizedDown) { + mExpectingSynthesizedDown = false; + return false; + } + return isFullyCollapsed() || mBarState != StatusBarState.SHADE; } @Override @@ -1334,6 +1503,8 @@ public class NotificationPanelView extends PanelView implements mFalsingManager.setQsExpanded(expanded); mStatusBar.setQsExpanded(expanded); mNotificationContainerParent.setQsExpanded(expanded); + mPulseExpansionHandler.setQsExpanded(expanded); + mKeyguardBypassController.setQSExpanded(expanded); } } @@ -1348,9 +1519,6 @@ public class NotificationPanelView extends PanelView implements mBarState = statusBarState; mKeyguardShowing = keyguardShowing; - if (mQs != null) { - mQs.setKeyguardShowing(mKeyguardShowing); - } if (oldState == StatusBarState.KEYGUARD && (goingToFullShade || statusBarState == StatusBarState.SHADE_LOCKED)) { @@ -1361,6 +1529,7 @@ public class NotificationPanelView extends PanelView implements } else if (oldState == StatusBarState.SHADE_LOCKED && statusBarState == StatusBarState.KEYGUARD) { animateKeyguardStatusBarIn(StackStateAnimator.ANIMATION_DURATION_STANDARD); + mNotificationStackScroller.resetScrollPosition(); // Only animate header if the header is visible. If not, it will partially animate out // the top of QS if (!mQsExpanded) { @@ -1375,10 +1544,13 @@ public class NotificationPanelView extends PanelView implements } } } + updateKeyguardStatusBarForHeadsUp(); if (keyguardShowing) { updateDozingVisibilities(false /* animate */); } - + // THe update needs to happen after the headerSlide in above, otherwise the translation + // would reset + updateQSPulseExpansion(); maybeAnimateBottomAreaAlpha(); resetHorizontalPanelPosition(); updateQsState(); @@ -1431,9 +1603,15 @@ public class NotificationPanelView extends PanelView implements anim.setStartDelay(mKeyguardMonitor.isKeyguardFadingAway() ? mKeyguardMonitor.getKeyguardFadingAwayDelay() : 0); - anim.setDuration(mKeyguardMonitor.isKeyguardFadingAway() - ? mKeyguardMonitor.getKeyguardFadingAwayDuration() / 2 - : StackStateAnimator.ANIMATION_DURATION_STANDARD); + + long duration; + if (mKeyguardMonitor.isKeyguardFadingAway()) { + duration = mKeyguardMonitor.getShortenedFadingAwayDuration(); + } else { + duration = StackStateAnimator.ANIMATION_DURATION_STANDARD; + } + anim.setDuration(duration); + anim.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN); anim.addListener(new AnimatorListenerAdapter() { @Override @@ -1476,7 +1654,7 @@ public class NotificationPanelView extends PanelView implements mKeyguardBottomArea.animate() .alpha(0f) .setStartDelay(mKeyguardMonitor.getKeyguardFadingAwayDelay()) - .setDuration(mKeyguardMonitor.getKeyguardFadingAwayDuration() / 2) + .setDuration(mKeyguardMonitor.getShortenedFadingAwayDuration()) .setInterpolator(Interpolators.ALPHA_OUT) .withEndAction(mAnimateKeyguardBottomAreaInvisibleEndRunnable) .start(); @@ -1505,7 +1683,7 @@ public class NotificationPanelView extends PanelView implements if (keyguardFadingAway) { mKeyguardStatusView.animate() .setStartDelay(mKeyguardMonitor.getKeyguardFadingAwayDelay()) - .setDuration(mKeyguardMonitor.getKeyguardFadingAwayDuration() / 2) + .setDuration(mKeyguardMonitor.getShortenedFadingAwayDuration()) .start(); } } else if (mBarState == StatusBarState.SHADE_LOCKED @@ -1588,8 +1766,8 @@ public class NotificationPanelView extends PanelView implements mStatusBar.executeRunnableDismissingKeyguard(null, null /* cancelAction */, false /* dismissShade */, true /* afterKeyguardGone */, false /* deferred */); } - if (mExpansionListener != null) { - mExpansionListener.onQsExpansionChanged(mQsMaxExpansionHeight != 0 + for (int i = 0; i < mExpansionListeners.size(); i++) { + mExpansionListeners.get(i).onQsExpansionChanged(mQsMaxExpansionHeight != 0 ? mQsExpansionHeight / mQsMaxExpansionHeight : 0); } if (DEBUG) { @@ -1627,7 +1805,7 @@ public class NotificationPanelView extends PanelView implements // padding on Keyguard, maxQsPadding denotes the top padding from the quick settings // panel. We need to take the maximum and linearly interpolate with the panel expansion // for a nice motion. - int maxNotificationPadding = mClockPositionResult.stackScrollerPadding; + int maxNotificationPadding = getKeyguardNotificationStaticPadding(); int maxQsPadding = mQsMaxExpansionHeight + mQsNotificationTopPadding; int max = mBarState == StatusBarState.KEYGUARD ? Math.max(maxNotificationPadding, maxQsPadding) @@ -1635,11 +1813,12 @@ public class NotificationPanelView extends PanelView implements return (int) MathUtils.lerp((float) mQsMinExpansionHeight, (float) max, getExpandedFraction()); } else if (mQsSizeChangeAnimator != null) { - return (int) mQsSizeChangeAnimator.getAnimatedValue(); + return Math.max((int) mQsSizeChangeAnimator.getAnimatedValue(), + getKeyguardNotificationStaticPadding()); } else if (mKeyguardShowing) { // We can only do the smoother transition on Keyguard when we also are not collapsing // from a scrolled quick settings. - return MathUtils.lerp((float) mNotificationStackScroller.getIntrinsicPadding(), + return MathUtils.lerp((float) getKeyguardNotificationStaticPadding(), (float) (mQsMaxExpansionHeight + mQsNotificationTopPadding), getQsExpansionFraction()); } else { @@ -1647,10 +1826,43 @@ public class NotificationPanelView extends PanelView implements } } + /** + * @return the topPadding of notifications when on keyguard not respecting quick settings + * expansion + */ + private int getKeyguardNotificationStaticPadding() { + if (!mKeyguardShowing) { + return 0; + } + if (!mKeyguardBypassController.getBypassEnabled()) { + return mClockPositionResult.stackScrollerPadding; + } + int collapsedPosition = mHeadsUpInset; + if (!mNotificationStackScroller.isPulseExpanding()) { + return collapsedPosition; + } else { + int expandedPosition = mClockPositionResult.stackScrollerPadding; + return (int) MathUtils.lerp(collapsedPosition, expandedPosition, + mNotificationStackScroller.calculateAppearFractionBypass()); + } + } + + protected void requestScrollerTopPaddingUpdate(boolean animate) { - mNotificationStackScroller.updateTopPadding(calculateQsTopPadding(), - animate, mKeyguardShowing - && (mQsExpandImmediate || mIsExpanding && mQsExpandedWhenExpandingStarted)); + mNotificationStackScroller.updateTopPadding(calculateQsTopPadding(), animate); + if (mKeyguardShowing && mKeyguardBypassController.getBypassEnabled()) { + // update the position of the header + updateQsExpansion(); + } + } + + + private void updateQSPulseExpansion() { + if (mQs != null) { + mQs.setShowCollapsedOnKeyguard(mKeyguardShowing + && mKeyguardBypassController.getBypassEnabled() + && mNotificationStackScroller.isPulseExpanding()); + } } private void trackMovement(MotionEvent event) { @@ -1755,7 +1967,8 @@ public class NotificationPanelView extends PanelView implements * @return Whether we should intercept a gesture to open Quick Settings. */ private boolean shouldQuickSettingsIntercept(float x, float y, float yDiff) { - if (!mQsExpansionEnabled || mCollapsedOnDown) { + if (!mQsExpansionEnabled || mCollapsedOnDown + || (mKeyguardShowing && mKeyguardBypassController.getBypassEnabled())) { return false; } View header = mKeyguardShowing || mQs == null ? mKeyguardStatusBar : mQs.getHeader(); @@ -1781,8 +1994,16 @@ public class NotificationPanelView extends PanelView implements @Override protected int getMaxPanelHeight() { + if (mKeyguardBypassController.getBypassEnabled() && mBarState == StatusBarState.KEYGUARD) { + return getMaxPanelHeightBypass(); + } else { + return getMaxPanelHeightNonBypass(); + } + } + + private int getMaxPanelHeightNonBypass() { int min = mStatusBarMinHeight; - if (mBarState != StatusBarState.KEYGUARD + if (!(mBarState == StatusBarState.KEYGUARD) && mNotificationStackScroller.getNotGoneChildCount() == 0) { int minHeight = (int) (mQsMinExpansionHeight + getOverExpansionAmount()); min = Math.max(min, minHeight); @@ -1798,6 +2019,15 @@ public class NotificationPanelView extends PanelView implements return maxHeight; } + private int getMaxPanelHeightBypass() { + int position = mClockPositionAlgorithm.getExpandedClockPosition() + + mKeyguardStatusView.getHeight(); + if (mNotificationStackScroller.getVisibleNotificationCount() != 0) { + position += mShelfHeight / 2.0f + mDarkIconSize / 2.0f; + } + return position; + } + public boolean isInSettings() { return mQsExpanded; } @@ -1849,7 +2079,7 @@ public class NotificationPanelView extends PanelView implements } private void updatePanelExpanded() { - boolean isExpanded = !isFullyCollapsed(); + boolean isExpanded = !isFullyCollapsed() || mExpectingSynthesizedDown; if (mPanelExpanded != isExpanded) { mHeadsUpManager.setIsPanelExpanded(isExpanded); mStatusBar.setPanelExpanded(isExpanded); @@ -1912,15 +2142,19 @@ public class NotificationPanelView extends PanelView implements !mHeadsUpManager.hasPinnedHeadsUp()) { alpha = getFadeoutAlpha(); } - if (mBarState == StatusBarState.KEYGUARD && !mHintAnimationRunning) { + if (mBarState == StatusBarState.KEYGUARD && !mHintAnimationRunning + && !mKeyguardBypassController.getBypassEnabled()) { alpha *= mClockPositionResult.clockAlpha; } mNotificationStackScroller.setAlpha(alpha); } private float getFadeoutAlpha() { - float alpha = (getNotificationsTopY() + mNotificationStackScroller.getFirstItemMinHeight()) - / mQsMinExpansionHeight; + float alpha; + if (mQsMinExpansionHeight == 0) { + return 1.0f; + } + alpha = getExpandedHeight() / mQsMinExpansionHeight; alpha = Math.max(0, Math.min(alpha, 1)); alpha = (float) Math.pow(alpha, 0.75); return alpha; @@ -1947,11 +2181,25 @@ public class NotificationPanelView extends PanelView implements } protected float getHeaderTranslation() { - if (mBarState == StatusBarState.KEYGUARD) { - return 0; + if (mBarState == StatusBarState.KEYGUARD && !mKeyguardBypassController.getBypassEnabled()) { + return -mQs.getQsMinExpansionHeight(); + } + float appearAmount = mNotificationStackScroller.calculateAppearFraction(mExpandedHeight); + float startHeight = -mQsExpansionHeight; + if (mKeyguardBypassController.getBypassEnabled() && isOnKeyguard() + && mNotificationStackScroller.isPulseExpanding()) { + if (!mPulseExpansionHandler.isExpanding() + && !mPulseExpansionHandler.getLeavingLockscreen()) { + // If we aborted the expansion we need to make sure the header doesn't reappear + // again after the header has animated away + appearAmount = 0; + } else { + appearAmount = mNotificationStackScroller.calculateAppearFractionBypass(); + } + startHeight = -mQs.getQsMinExpansionHeight(); } - float translation = MathUtils.lerp(-mQsMinExpansionHeight, 0, - Math.min(1.0f, mNotificationStackScroller.getAppearFraction(mExpandedHeight))) + float translation = MathUtils.lerp(startHeight, 0, + Math.min(1.0f, appearAmount)) + mExpandOffset; return Math.min(0, translation); } @@ -1964,18 +2212,18 @@ public class NotificationPanelView extends PanelView implements float alpha; if (mBarState == StatusBarState.KEYGUARD) { - // When on Keyguard, we hide the header as soon as the top card of the notification - // stack scroller is close enough (collision distance) to the bottom of the header. - alpha = getNotificationsTopY() + // When on Keyguard, we hide the header as soon as we expanded close enough to the + // header + alpha = getExpandedHeight() / (mKeyguardStatusBar.getHeight() + mNotificationsHeaderCollideDistance); } else { // In SHADE_LOCKED, the top card is already really close to the header. Hide it as // soon as we start translating the stack. - alpha = getNotificationsTopY() / mKeyguardStatusBar.getHeight(); + alpha = getExpandedHeight() / mKeyguardStatusBar.getHeight(); } - alpha = MathUtils.constrain(alpha, 0, 1); + alpha = MathUtils.saturate(alpha); alpha = (float) Math.pow(alpha, 0.75); return alpha; } @@ -1987,6 +2235,7 @@ public class NotificationPanelView extends PanelView implements float alphaQsExpansion = 1 - Math.min(1, getQsExpansionFraction() * 2); float newAlpha = Math.min(getKeyguardContentsAlpha(), alphaQsExpansion) * mKeyguardStatusBarAnimateAlpha; + newAlpha *= 1.0f - mKeyguardHeadsUpShowingAmount; mKeyguardStatusBar.setAlpha(newAlpha); mKeyguardStatusBar.setVisibility(newAlpha != 0f && !mDozing ? VISIBLE : INVISIBLE); } @@ -2026,13 +2275,6 @@ public class NotificationPanelView extends PanelView implements mBigClockContainer.setAlpha(alpha); } - private float getNotificationsTopY() { - if (mNotificationStackScroller.getNotGoneChildCount() == 0) { - return getExpandedHeight(); - } - return mNotificationStackScroller.getNotificationsTopY(); - } - @Override protected void onExpandingStarted() { super.onExpandingStarted(); @@ -2519,10 +2761,14 @@ public class NotificationPanelView extends PanelView implements switch (mBarState) { case StatusBarState.KEYGUARD: if (!mDozingOnDown) { - mLockscreenGestureLogger.write( - MetricsEvent.ACTION_LS_HINT, - 0 /* lengthDp - N/A */, 0 /* velocityDp - N/A */); - startUnlockHintAnimation(); + if (mKeyguardBypassController.getBypassEnabled()) { + mUpdateMonitor.requestFaceAuth(); + } else { + mLockscreenGestureLogger.write( + MetricsEvent.ACTION_LS_HINT, + 0 /* lengthDp - N/A */, 0 /* velocityDp - N/A */); + startUnlockHintAnimation(); + } } return true; case StatusBarState.SHADE_LOCKED: @@ -2615,16 +2861,51 @@ public class NotificationPanelView extends PanelView implements mHeadsUpExistenceChangedRunnable); } updateGestureExclusionRect(); + mHeadsUpPinnedMode = inPinnedMode; + updateHeadsUpVisibility(); + updateKeyguardStatusBarForHeadsUp(); + } + + private void updateKeyguardStatusBarForHeadsUp() { + boolean showingKeyguardHeadsUp = mKeyguardShowing + && mHeadsUpAppearanceController.shouldBeVisible(); + if (mShowingKeyguardHeadsUp != showingKeyguardHeadsUp) { + mShowingKeyguardHeadsUp = showingKeyguardHeadsUp; + if (mKeyguardShowing) { + PropertyAnimator.setProperty(this, KEYGUARD_HEADS_UP_SHOWING_AMOUNT, + showingKeyguardHeadsUp ? 1.0f : 0.0f, KEYGUARD_HUN_PROPERTIES, + true /* animate */); + } else { + PropertyAnimator.applyImmediately(this, KEYGUARD_HEADS_UP_SHOWING_AMOUNT, 0.0f); + } + } + } + + private void setKeyguardHeadsUpShowingAmount(float amount) { + mKeyguardHeadsUpShowingAmount = amount; + updateHeaderKeyguardAlpha(); + } + + private float getKeyguardHeadsUpShowingAmount() { + return mKeyguardHeadsUpShowingAmount; } public void setHeadsUpAnimatingAway(boolean headsUpAnimatingAway) { mHeadsUpAnimatingAway = headsUpAnimatingAway; mNotificationStackScroller.setHeadsUpAnimatingAway(headsUpAnimatingAway); + updateHeadsUpVisibility(); + } + + private void updateHeadsUpVisibility() { + ((PhoneStatusBarView) mBar).setHeadsUpVisible(mHeadsUpAnimatingAway || mHeadsUpPinnedMode); } @Override public void onHeadsUpPinned(NotificationEntry entry) { - mNotificationStackScroller.generateHeadsUpAnimation(entry.getHeadsUpAnimationView(), true); + if (!isOnKeyguard()) { + mNotificationStackScroller.generateHeadsUpAnimation(entry.getHeadsUpAnimationView(), + true); + } } @Override @@ -2633,7 +2914,7 @@ public class NotificationPanelView extends PanelView implements // When we're unpinning the notification via active edge they remain heads-upped, // we need to make sure that an animation happens in this case, otherwise the notification // will stick to the top without any interaction. - if (isFullyCollapsed() && entry.isRowHeadsUp()) { + if (isFullyCollapsed() && entry.isRowHeadsUp() && !isOnKeyguard()) { mNotificationStackScroller.generateHeadsUpAnimation( entry.getHeadsUpAnimationView(), false); entry.setHeadsUpIsVisible(); @@ -2700,7 +2981,7 @@ public class NotificationPanelView extends PanelView implements } protected void setHorizontalPanelTranslation(float translation) { - mNotificationStackScroller.setHorizontalPanelTranslation(translation); + mNotificationStackScroller.setTranslationX(translation); mQsFrame.setTranslationX(translation); int size = mVerticalTranslationListener.size(); for (int i = 0; i < size; i++) { @@ -2712,6 +2993,10 @@ public class NotificationPanelView extends PanelView implements if (mTracking) { mNotificationStackScroller.setExpandingVelocity(getCurrentExpandVelocity()); } + if (mKeyguardBypassController.getBypassEnabled() && isOnKeyguard()) { + // The expandedHeight is always the full panel Height when bypassing + expandedHeight = getMaxPanelHeightNonBypass(); + } mNotificationStackScroller.setExpandedHeight(expandedHeight); updateKeyguardBottomAreaAlpha(); updateBigClockAlpha(); @@ -2752,7 +3037,8 @@ public class NotificationPanelView extends PanelView implements @Override protected boolean isPanelVisibleBecauseOfHeadsUp() { - return mHeadsUpManager.hasPinnedHeadsUp() || mHeadsUpAnimatingAway; + return (mHeadsUpManager.hasPinnedHeadsUp() || mHeadsUpAnimatingAway) + && mBarState == StatusBarState.SHADE; } @Override @@ -2777,7 +3063,6 @@ public class NotificationPanelView extends PanelView implements // nor setting these flags, since the occluded state doesn't change anymore, hence it's // never reset. if (!isFullyCollapsed()) { - mLaunchingAffordance = true; setLaunchingAffordance(true); } else { animate = false; @@ -2787,7 +3072,6 @@ public class NotificationPanelView extends PanelView implements } public void onAffordanceLaunchEnded() { - mLaunchingAffordance = false; setLaunchingAffordance(false); } @@ -2796,8 +3080,10 @@ public class NotificationPanelView extends PanelView implements * launched via a camera gesture. */ private void setLaunchingAffordance(boolean launchingAffordance) { + mLaunchingAffordance = launchingAffordance; getLeftIcon().setLaunchingAffordance(launchingAffordance); getRightIcon().setLaunchingAffordance(launchingAffordance); + mKeyguardBypassController.setLaunchingAffordance(launchingAffordance); if (mAffordanceLaunchListener != null) { mAffordanceLaunchListener.accept(launchingAffordance); } @@ -2861,7 +3147,7 @@ public class NotificationPanelView extends PanelView implements mQs.setPanelView(NotificationPanelView.this); mQs.setExpandClickListener(NotificationPanelView.this); mQs.setHeaderClickable(mQsExpansionEnabled); - mQs.setKeyguardShowing(mKeyguardShowing); + updateQSPulseExpansion(); mQs.setOverscrolling(mStackScrollerOverscrolling); // recompute internal state when qspanel height changes @@ -2910,7 +3196,7 @@ public class NotificationPanelView extends PanelView implements public void setDozing(boolean dozing, boolean animate, PointF wakeUpTouchLocation) { if (dozing == mDozing) return; mDozing = dozing; - mNotificationStackScroller.setDark(mDozing, animate, wakeUpTouchLocation); + mNotificationStackScroller.setDozing(mDozing, animate, wakeUpTouchLocation); mKeyguardBottomArea.setDozing(mDozing, animate); if (dozing) { @@ -2922,8 +3208,8 @@ public class NotificationPanelView extends PanelView implements updateDozingVisibilities(animate); } - final float darkAmount = dozing ? 1 : 0; - mStatusBarStateController.setDozeAmount(darkAmount, animate); + final float dozeAmount = dozing ? 1 : 0; + mStatusBarStateController.setDozeAmount(dozeAmount, animate); } @Override @@ -3088,10 +3374,6 @@ public class NotificationPanelView extends PanelView implements return mNotificationStackScroller.hasPulsingNotifications(); } - public boolean isFullyDark() { - return mNotificationStackScroller.isFullyDark(); - } - public ActivatableNotificationView getActivatedChild() { return mNotificationStackScroller.getActivatedChild(); } @@ -3119,7 +3401,6 @@ public class NotificationPanelView extends PanelView implements mNotificationStackScroller.setIconAreaController(notificationIconAreaController); mNotificationStackScroller.setStatusBar(statusBar); mNotificationStackScroller.setGroupManager(groupManager); - mNotificationStackScroller.setHeadsUpManager(headsUpManager); mNotificationStackScroller.setShelf(notificationShelf); mNotificationStackScroller.setScrimController(scrimController); updateShowEmptyShadeView(); @@ -3131,27 +3412,16 @@ public class NotificationPanelView extends PanelView implements @Override public void onDynamicPrivacyChanged() { + // Do not request animation when pulsing or waking up, otherwise the clock wiill be out + // of sync with the notification panel. + if (mLinearDarkAmount != 0) { + return; + } mAnimateNextPositionUpdate = true; } - /** - * Panel and QS expansion callbacks. - */ - public interface PanelExpansionListener { - /** - * Invoked whenever the notification panel expansion changes, at every animation frame. - * This is the main expansion that happens when the user is swiping up to dismiss the - * lock screen. - * - * @param expansion 0 when collapsed, 1 when expanded. - * @param tracking {@code true} when the user is actively dragging the panel. - */ - void onPanelExpansionChanged(float expansion, boolean tracking); - - /** - * Invoked whenever the QS expansion changes, at every animation frame. - * @param expansion 0 when collapsed, 1 when expanded. - */ - void onQsExpansionChanged(float expansion); + public void setOnReinflationListener(Runnable onReinflationListener) { + mOnReinflationListener = onReinflationListener; } + } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java index ca762cdf07f3..27c94d277cc4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationsQuickSettingsContainer.java @@ -36,6 +36,9 @@ import com.android.systemui.plugins.qs.QS; import com.android.systemui.statusbar.notification.AboveShelfObserver; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; +import java.util.ArrayList; +import java.util.Comparator; + /** * The container with notification stack scroller and quick settings inside. */ @@ -54,6 +57,9 @@ public class NotificationsQuickSettingsContainer extends FrameLayout private int mBottomPadding; private int mStackScrollerMargin; private boolean mHasViewsAboveShelf; + private ArrayList<View> mDrawingOrderedChildren = new ArrayList<>(); + private ArrayList<View> mLayoutDrawingOrder = new ArrayList<>(); + private final Comparator<View> mIndexComparator = Comparator.comparingInt(this::indexOfChild); public NotificationsQuickSettingsContainer(Context context, AttributeSet attrs) { super(context, attrs); @@ -107,35 +113,44 @@ public class NotificationsQuickSettingsContainer extends FrameLayout } @Override - protected boolean drawChild(Canvas canvas, View child, long drawingTime) { - boolean userSwitcherVisible = mInflated && mUserSwitcher.getVisibility() == View.VISIBLE; - boolean statusBarVisible = mKeyguardStatusBar.getVisibility() == View.VISIBLE; - - final boolean qsBottom = mHasViewsAboveShelf; - View stackQsTop = qsBottom ? mStackScroller : mQsFrame; - View stackQsBottom = !qsBottom ? mStackScroller : mQsFrame; + protected void dispatchDraw(Canvas canvas) { // Invert the order of the scroll view and user switcher such that the notifications receive // touches first but the panel gets drawn above. - if (child == mQsFrame) { - return super.drawChild(canvas, userSwitcherVisible && statusBarVisible ? mUserSwitcher - : statusBarVisible ? mKeyguardStatusBar - : userSwitcherVisible ? mUserSwitcher - : stackQsBottom, drawingTime); - } else if (child == mStackScroller) { - return super.drawChild(canvas, - userSwitcherVisible && statusBarVisible ? mKeyguardStatusBar - : statusBarVisible || userSwitcherVisible ? stackQsBottom - : stackQsTop, - drawingTime); - } else if (child == mUserSwitcher) { - return super.drawChild(canvas, - userSwitcherVisible && statusBarVisible ? stackQsBottom - : stackQsTop, - drawingTime); - } else if (child == mKeyguardStatusBar) { - return super.drawChild(canvas, - stackQsTop, - drawingTime); + mDrawingOrderedChildren.clear(); + mLayoutDrawingOrder.clear(); + if (mInflated && mUserSwitcher.getVisibility() == View.VISIBLE) { + mDrawingOrderedChildren.add(mUserSwitcher); + mLayoutDrawingOrder.add(mUserSwitcher); + } + if (mKeyguardStatusBar.getVisibility() == View.VISIBLE) { + mDrawingOrderedChildren.add(mKeyguardStatusBar); + mLayoutDrawingOrder.add(mKeyguardStatusBar); + } + if (mStackScroller.getVisibility() == View.VISIBLE) { + mDrawingOrderedChildren.add(mStackScroller); + mLayoutDrawingOrder.add(mStackScroller); + } + if (mQsFrame.getVisibility() == View.VISIBLE) { + mDrawingOrderedChildren.add(mQsFrame); + mLayoutDrawingOrder.add(mQsFrame); + } + + if (mHasViewsAboveShelf) { + // StackScroller needs to be on top + mDrawingOrderedChildren.remove(mStackScroller); + mDrawingOrderedChildren.add(mStackScroller); + } + + // Let's now find the order that the view has when drawing regulary by sorting + mLayoutDrawingOrder.sort(mIndexComparator); + super.dispatchDraw(canvas); + } + + @Override + protected boolean drawChild(Canvas canvas, View child, long drawingTime) { + int layoutIndex = mLayoutDrawingOrder.indexOf(child); + if (layoutIndex >= 0) { + return super.drawChild(canvas, mDrawingOrderedChildren.get(layoutIndex), drawingTime); } else { return super.drawChild(canvas, child, drawingTime); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java index 65b0ecc00953..063d00b806c2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java @@ -107,8 +107,12 @@ public abstract class PanelBar extends FrameLayout { return mExpanded; } - private void updateVisibility() { - mPanel.setVisibility(mExpanded || mBouncerShowing ? VISIBLE : INVISIBLE); + protected void updateVisibility() { + mPanel.setVisibility(shouldPanelBeVisible() ? VISIBLE : INVISIBLE); + } + + protected boolean shouldPanelBeVisible() { + return mExpanded || mBouncerShowing; } public boolean panelEnabled() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelExpansionListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelExpansionListener.java new file mode 100644 index 000000000000..655a25d22337 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelExpansionListener.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar.phone; + +/** + * Panel and QS expansion callbacks. + */ +public interface PanelExpansionListener { + /** + * Invoked whenever the notification panel expansion changes, at every animation frame. + * This is the main expansion that happens when the user is swiping up to dismiss the + * lock screen. + * + * @param expansion 0 when collapsed, 1 when expanded. + * @param tracking {@code true} when the user is actively dragging the panel. + */ + void onPanelExpansionChanged(float expansion, boolean tracking); + + /** + * Invoked whenever the QS expansion changes, at every animation frame. + * @param expansion 0 when collapsed, 1 when expanded. + */ + default void onQsExpansionChanged(float expansion) {}; +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index a9a3b2d866e1..f8e1093e210b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -50,11 +50,11 @@ import com.android.systemui.statusbar.FlingAnimationUtils; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.VibratorHelper; -import com.android.systemui.statusbar.phone.NotificationPanelView.PanelExpansionListener; import com.android.systemui.statusbar.policy.KeyguardMonitor; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.ArrayList; public abstract class PanelView extends FrameLayout { public static final boolean DEBUG = PanelBar.DEBUG; @@ -62,14 +62,15 @@ public abstract class PanelView extends FrameLayout { private static final int INITIAL_OPENING_PEEK_DURATION = 200; private static final int PEEK_ANIMATION_DURATION = 360; private static final int NO_FIXED_DURATION = -1; - private long mDownTime; + protected long mDownTime; + protected boolean mTouchSlopExceededBeforeDown; private float mMinExpandHeight; private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger(); private boolean mPanelUpdateWhenAnimatorEnds; private boolean mVibrateOnOpening; protected boolean mLaunchingNotification; private int mFixedDuration = NO_FIXED_DURATION; - protected PanelExpansionListener mExpansionListener; + protected ArrayList<PanelExpansionListener> mExpansionListeners = new ArrayList<>(); private final void logf(String fmt, Object... args) { Log.v(TAG, (mViewName != null ? (mViewName + ": ") : "") + String.format(fmt, args)); @@ -301,7 +302,7 @@ public abstract class PanelView extends FrameLayout { final float y = event.getY(pointerIndex); if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { - mGestureWaitForTouchSlop = isFullyCollapsed() || hasConflictingGestures(); + mGestureWaitForTouchSlop = shouldGestureWaitForTouchSlop(); mIgnoreXTouchSlop = isFullyCollapsed() || shouldGestureIgnoreXTouchSlop(x, y); } @@ -323,7 +324,7 @@ public abstract class PanelView extends FrameLayout { if (!mGestureWaitForTouchSlop || (mHeightAnimator != null && !mHintAnimationRunning) || mPeekAnimator != null) { mTouchSlopExceeded = (mHeightAnimator != null && !mHintAnimationRunning) - || mPeekAnimator != null; + || mPeekAnimator != null || mTouchSlopExceededBeforeDown; cancelHeightAnimator(); cancelPeek(); onTrackingStarted(); @@ -409,9 +410,7 @@ public abstract class PanelView extends FrameLayout { runPeekAnimation(INITIAL_OPENING_PEEK_DURATION, getOpeningHeight(), false /* collapseWhenFinished */); notifyBarPanelExpansionChanged(); - if (mVibrateOnOpening) { - mVibratorHelper.vibrate(VibrationEffect.EFFECT_TICK); - } + maybeVibrateOnOpening(); //TODO: keyguard opens QS a different way; log that too? @@ -426,6 +425,12 @@ public abstract class PanelView extends FrameLayout { rot); } + protected void maybeVibrateOnOpening() { + if (mVibrateOnOpening) { + mVibratorHelper.vibrate(VibrationEffect.EFFECT_TICK); + } + } + protected abstract float getOpeningHeight(); /** @@ -519,7 +524,7 @@ public abstract class PanelView extends FrameLayout { return (int) (mUnlockFalsingThreshold * factor); } - protected abstract boolean hasConflictingGestures(); + protected abstract boolean shouldGestureWaitForTouchSlop(); protected abstract boolean shouldGestureIgnoreXTouchSlop(float x, float y); @@ -577,7 +582,7 @@ public abstract class PanelView extends FrameLayout { mInitialTouchY = y; mInitialTouchX = x; mTouchStartedInEmptyArea = !isInContentBounds(x, y); - mTouchSlopExceeded = false; + mTouchSlopExceeded = mTouchSlopExceededBeforeDown; mJustPeeked = false; mMotionAborted = false; mPanelClosedOnDown = isFullyCollapsed(); @@ -680,12 +685,16 @@ public abstract class PanelView extends FrameLayout { return true; } if (Math.abs(vectorVel) < mFlingAnimationUtils.getMinVelocityPxPerSecond()) { - return getExpandedFraction() > 0.5f; + return shouldExpandWhenNotFlinging(); } else { return vel > 0; } } + protected boolean shouldExpandWhenNotFlinging() { + return getExpandedFraction() > 0.5f; + } + /** * @param x the final x-coordinate when the finger was lifted * @param y the final y-coordinate when the finger was lifted @@ -1174,13 +1183,13 @@ public abstract class PanelView extends FrameLayout { || mPeekAnimator != null || mInstantExpanding || isPanelVisibleBecauseOfHeadsUp() || mTracking || mHeightAnimator != null); } - if (mExpansionListener != null) { - mExpansionListener.onPanelExpansionChanged(mExpandedFraction, mTracking); + for (int i = 0; i < mExpansionListeners.size(); i++) { + mExpansionListeners.get(i).onPanelExpansionChanged(mExpandedFraction, mTracking); } } - public void setExpansionListener(PanelExpansionListener panelExpansionListener) { - mExpansionListener = panelExpansionListener; + public void addExpansionListener(PanelExpansionListener panelExpansionListener) { + mExpansionListeners.add(panelExpansionListener); } protected abstract boolean isPanelVisibleBecauseOfHeadsUp(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index 68eba50984d6..8efd952e67c5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -82,6 +82,7 @@ public class PhoneStatusBarView extends PanelBar { * Draw this many pixels into the left/right side of the cutout to optimally use the space */ private int mCutoutSideNudge = 0; + private boolean mHeadsUpVisible; public PhoneStatusBarView(Context context, AttributeSet attrs) { super(context, attrs); @@ -277,7 +278,7 @@ public class PhoneStatusBarView extends PanelBar { super.panelExpansionChanged(frac, expanded); updateScrimFraction(); if ((frac == 0 || frac == 1) && mBar.getNavigationBarView() != null) { - mBar.getNavigationBarView().onPanelExpandedChange(); + mBar.getNavigationBarView().onStatusBarPanelStateChanged(); } } @@ -379,4 +380,14 @@ public class PhoneStatusBarView extends PanelBar { } return null; } + + public void setHeadsUpVisible(boolean headsUpVisible) { + mHeadsUpVisible = headsUpVisible; + updateVisibility(); + } + + @Override + protected boolean shouldPanelBeVisible() { + return mHeadsUpVisible || super.shouldPanelBeVisible(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 3f38c049a977..b12bf5c39970 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -487,6 +487,22 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo } /** + * Set front scrim to black, cancelling animations, in order to prepare to fade them + * away once the display turns on. + */ + public void prepareForGentleWakeUp() { + if (mState == ScrimState.AOD) { + mCurrentInFrontAlpha = 1f; + mCurrentInFrontTint = Color.BLACK; + mCurrentBehindTint = Color.BLACK; + mAnimateChange = false; + updateScrims(); + mAnimateChange = true; + mAnimationDuration = ANIMATION_DURATION_LONG; + } + } + + /** * If the lock screen sensor is active. */ public void setWakeLockScreenSensorActive(boolean active) { @@ -932,6 +948,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo } } + public void setUnlockIsFading(boolean unlockFading) { + for (ScrimState state : ScrimState.values()) { + state.setUnlockIsFading(unlockFading); + } + } + public void setLaunchingAffordanceWithPreview(boolean launchingAffordanceWithPreview) { for (ScrimState state : ScrimState.values()) { state.setLaunchingAffordanceWithPreview(launchingAffordanceWithPreview); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java index d152ecd8b930..c706062d3bb3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java @@ -129,7 +129,10 @@ public enum ScrimState { public void prepare(ScrimState previousState) { mCurrentInFrontAlpha = 0f; mCurrentBehindTint = Color.BLACK; + mCurrentInFrontTint = Color.BLACK; mBlankScreen = mDisplayRequiresBlanking; + mAnimationDuration = mWakeLockScreenSensorActive + ? ScrimController.ANIMATION_DURATION_LONG : ScrimController.ANIMATION_DURATION; } @Override @@ -147,7 +150,9 @@ public enum ScrimState { public void prepare(ScrimState previousState) { mCurrentBehindAlpha = 0; mCurrentInFrontAlpha = 0; - mAnimationDuration = StatusBar.FADE_KEYGUARD_DURATION; + mAnimationDuration = mUnlockIsFading + ? KeyguardBypassController.BYPASS_PANEL_FADE_DURATION + : StatusBar.FADE_KEYGUARD_DURATION; mAnimateChange = !mLaunchingAffordanceWithPreview; if (previousState == ScrimState.AOD) { @@ -198,6 +203,7 @@ public enum ScrimState { boolean mHasBackdrop; boolean mLaunchingAffordanceWithPreview; boolean mWakeLockScreenSensorActive; + boolean mUnlockIsFading; ScrimState(int index) { mIndex = index; @@ -285,4 +291,8 @@ public enum ScrimState { public void setWakeLockScreenSensorActive(boolean active) { mWakeLockScreenSensorActive = active; } + + public void setUnlockIsFading(boolean unlockIsFading) { + mUnlockIsFading = unlockIsFading; + } }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index c6de829e49be..c943a04c0f2a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -172,7 +172,6 @@ import com.android.systemui.recents.ScreenPinningRequest; import com.android.systemui.shared.system.WindowManagerWrapper; import com.android.systemui.stackdivider.Divider; import com.android.systemui.stackdivider.WindowManagerProxy; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.BackDropView; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CrossFadeHelper; @@ -194,6 +193,8 @@ import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.notification.ActivityLaunchAnimator; +import com.android.systemui.statusbar.notification.BypassHeadsUpNotifier; +import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.NotificationActivityStarter; import com.android.systemui.statusbar.notification.NotificationAlertingManager; import com.android.systemui.statusbar.notification.NotificationClicker; @@ -201,6 +202,7 @@ import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider; import com.android.systemui.statusbar.notification.NotificationListController; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; +import com.android.systemui.statusbar.notification.ViewGroupFadeHelper; import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationRowBinderImpl; @@ -227,7 +229,6 @@ import com.android.systemui.statusbar.policy.UserInfoController; import com.android.systemui.statusbar.policy.UserInfoControllerImpl; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.statusbar.policy.ZenModeController; -import com.android.systemui.tuner.TunerService; import com.android.systemui.util.InjectionInflationController; import com.android.systemui.volume.VolumeComponent; @@ -246,8 +247,7 @@ public class StatusBar extends SystemUI implements DemoMode, OnHeadsUpChangedListener, CommandQueue.Callbacks, ZenModeController.Callback, ColorExtractor.OnColorsChangedListener, ConfigurationListener, StatusBarStateController.StateListener, ShadeController, - ActivityLaunchAnimator.Callback, AmbientPulseManager.OnAmbientChangedListener, - AppOpsController.Callback { + ActivityLaunchAnimator.Callback, AppOpsController.Callback { public static final boolean MULTIUSER_DEBUG = false; public static final boolean ENABLE_CHILD_NOTIFICATIONS @@ -372,6 +372,17 @@ public class StatusBar extends SystemUI implements DemoMode, PulseExpansionHandler mPulseExpansionHandler; @Inject NotificationWakeUpCoordinator mWakeUpCoordinator; + @Inject + KeyguardBypassController mKeyguardBypassController; + @Inject + protected HeadsUpManagerPhone mHeadsUpManager; + @Inject + DynamicPrivacyController mDynamicPrivacyController; + @Inject + BypassHeadsUpNotifier mBypassHeadsUpNotifier; + @Nullable + @Inject + protected KeyguardLiftController mKeyguardLiftController; // expanded notifications protected NotificationPanelView mNotificationPanel; // the sliding/resizing panel within the notification window @@ -584,7 +595,7 @@ public class StatusBar extends SystemUI implements DemoMode, private boolean mVibrateOnOpening; private VibratorHelper mVibratorHelper; private ActivityLaunchAnimator mActivityLaunchAnimator; - protected NotificationPresenter mPresenter; + protected StatusBarNotificationPresenter mPresenter; private NotificationActivityStarter mNotificationActivityStarter; private boolean mPulsing; protected BubbleController mBubbleController; @@ -632,6 +643,7 @@ public class StatusBar extends SystemUI implements DemoMode, mGutsManager = Dependency.get(NotificationGutsManager.class); mMediaManager = Dependency.get(NotificationMediaManager.class); mEntryManager = Dependency.get(NotificationEntryManager.class); + mBypassHeadsUpNotifier.setUp(mEntryManager); mNotificationInterruptionStateProvider = Dependency.get(NotificationInterruptionStateProvider.class); mViewHierarchyManager = Dependency.get(NotificationViewHierarchyManager.class); @@ -647,7 +659,8 @@ public class StatusBar extends SystemUI implements DemoMode, mActivityIntentHelper = new ActivityIntentHelper(mContext); KeyguardSliceProvider sliceProvider = KeyguardSliceProvider.getAttachedInstance(); if (sliceProvider != null) { - sliceProvider.initDependencies(mMediaManager, mStatusBarStateController); + sliceProvider.initDependencies(mMediaManager, mStatusBarStateController, + mKeyguardBypassController, DozeParameters.getInstance(mContext)); } else { Log.w(TAG, "Cannot init KeyguardSliceProvider dependencies"); } @@ -681,6 +694,7 @@ public class StatusBar extends SystemUI implements DemoMode, mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext); + mKeyguardUpdateMonitor.setKeyguardBypassController(mKeyguardBypassController); mBarService = IStatusBarService.Stub.asInterface( ServiceManager.getService(Context.STATUS_BAR_SERVICE)); @@ -787,6 +801,7 @@ public class StatusBar extends SystemUI implements DemoMode, inflateStatusBarWindow(context); mStatusBarWindow.setService(this); + mStatusBarWindow.setBypassController(mKeyguardBypassController); mStatusBarWindow.setOnTouchListener(getStatusBarWindowTouchListener()); // TODO: Deal with the ugliness that comes from having some of the statusbar broken out @@ -798,9 +813,14 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationLogger.setUpWithContainer(notifListContainer); mNotificationIconAreaController = SystemUIFactory.getInstance() - .createNotificationIconAreaController(context, this, mStatusBarStateController); + .createNotificationIconAreaController(context, this, + mWakeUpCoordinator, mKeyguardBypassController, + mStatusBarStateController); + mWakeUpCoordinator.setIconAreaController(mNotificationIconAreaController); inflateShelf(); mNotificationIconAreaController.setupShelf(mNotificationShelf); + mNotificationPanel.setOnReinflationListener(mNotificationIconAreaController::initAodIcons); + mNotificationPanel.addExpansionListener(mWakeUpCoordinator); Dependency.get(DarkIconDispatcher.class).addDarkReceiver(mNotificationIconAreaController); // Allow plugins to reference DarkIconDispatcher and StatusBarStateController @@ -842,7 +862,9 @@ public class StatusBar extends SystemUI implements DemoMode, mHeadsUpAppearanceController.destroy(); } mHeadsUpAppearanceController = new HeadsUpAppearanceController( - mNotificationIconAreaController, mHeadsUpManager, mStatusBarWindow); + mNotificationIconAreaController, mHeadsUpManager, mStatusBarWindow, + mStatusBarStateController, mKeyguardBypassController, + mWakeUpCoordinator); mHeadsUpAppearanceController.readFrom(oldController); mStatusBarWindow.setStatusBarView(mStatusBarView); updateAreThereNotifications(); @@ -854,17 +876,13 @@ public class StatusBar extends SystemUI implements DemoMode, .commit(); mIconController = Dependency.get(StatusBarIconController.class); - mHeadsUpManager = new HeadsUpManagerPhone(context, mStatusBarWindow, mGroupManager, this, - mVisualStabilityManager); + mHeadsUpManager.setUp(mStatusBarWindow, mGroupManager, this, mVisualStabilityManager); Dependency.get(ConfigurationController.class).addCallback(mHeadsUpManager); mHeadsUpManager.addListener(this); mHeadsUpManager.addListener(mNotificationPanel); mHeadsUpManager.addListener(mGroupManager); mHeadsUpManager.addListener(mGroupAlertTransferHelper); mHeadsUpManager.addListener(mVisualStabilityManager); - mAmbientPulseManager.addListener(this); - mAmbientPulseManager.addListener(mGroupManager); - mAmbientPulseManager.addListener(mGroupAlertTransferHelper); mNotificationPanel.setHeadsUpManager(mHeadsUpManager); mGroupManager.setHeadsUpManager(mHeadsUpManager); mGroupAlertTransferHelper.setHeadsUpManager(mHeadsUpManager); @@ -1046,11 +1064,13 @@ public class StatusBar extends SystemUI implements DemoMode, final NotificationRowBinderImpl rowBinder = new NotificationRowBinderImpl( mContext, - SystemUIFactory.getInstance().provideAllowNotificationLongPress()); + SystemUIFactory.getInstance().provideAllowNotificationLongPress(), + mKeyguardBypassController, + mStatusBarStateController); mPresenter = new StatusBarNotificationPresenter(mContext, mNotificationPanel, mHeadsUpManager, mStatusBarWindow, mStackScroller, mDozeScrimController, - mScrimController, mActivityLaunchAnimator, mStatusBarKeyguardViewManager, + mScrimController, mActivityLaunchAnimator, mDynamicPrivacyController, mNotificationAlertingManager, rowBinder); mNotificationListController = @@ -1147,8 +1167,9 @@ public class StatusBar extends SystemUI implements DemoMode, private void inflateShelf() { mNotificationShelf = - (NotificationShelf) LayoutInflater.from(mContext).inflate( - R.layout.status_bar_notification_shelf, mStackScroller, false); + (NotificationShelf) mInjectionInflater.injectable( + LayoutInflater.from(mContext)).inflate( + R.layout.status_bar_notification_shelf, mStackScroller, false); mNotificationShelf.setOnClickListener(mGoToLockedShadeListener); } @@ -1177,6 +1198,7 @@ public class StatusBar extends SystemUI implements DemoMode, if (mAmbientIndicationContainer instanceof AutoReinflateContainer) { ((AutoReinflateContainer) mAmbientIndicationContainer).inflateLayout(); } + mNotificationIconAreaController.onThemeChanged(); } @Override @@ -1215,15 +1237,17 @@ public class StatusBar extends SystemUI implements DemoMode, mBiometricUnlockController = new BiometricUnlockController(mContext, mDozeScrimController, keyguardViewMediator, mScrimController, this, UnlockMethodCache.getInstance(mContext), - new Handler(), mKeyguardUpdateMonitor, Dependency.get(TunerService.class)); + new Handler(), mKeyguardUpdateMonitor, mKeyguardBypassController); putComponent(BiometricUnlockController.class, mBiometricUnlockController); mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this, getBouncerContainer(), mNotificationPanel, mBiometricUnlockController, - mStatusBarWindow.findViewById(R.id.lock_icon_container)); + mStatusBarWindow.findViewById(R.id.lock_icon_container), mStackScroller, + mKeyguardBypassController); mKeyguardIndicationController .setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); mRemoteInputManager.getController().addCallback(mStatusBarKeyguardViewManager); + mDynamicPrivacyController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); mKeyguardViewMediatorCallback = keyguardViewMediator.getViewMediatorCallback(); mLightBarController.setBiometricUnlockController(mBiometricUnlockController); @@ -1493,6 +1517,9 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationPanel.setStatusAccessibilityImportance(expanded ? View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS : View.IMPORTANT_FOR_ACCESSIBILITY_AUTO); + if (getNavigationBarView() != null) { + getNavigationBarView().onStatusBarPanelStateChanged(); + } } public boolean isWakeUpComingFromTouch() { @@ -1534,10 +1561,16 @@ public class StatusBar extends SystemUI implements DemoMode, }); } } else { - if (!mNotificationPanel.isFullyCollapsed() || mNotificationPanel.isTracking()) { + boolean bypassKeyguard = mKeyguardBypassController.getBypassEnabled() + && mState == StatusBarState.KEYGUARD; + if (!mNotificationPanel.isFullyCollapsed() || mNotificationPanel.isTracking() + || bypassKeyguard) { // We are currently tracking or is open and the shade doesn't need to be kept // open artificially. mStatusBarWindowController.setHeadsUpShowing(false); + if (bypassKeyguard) { + mStatusBarWindowController.setForceStatusBarVisible(false); + } } else { // we need to keep the panel open artificially, let's wait until the animation // is finished. @@ -1554,25 +1587,16 @@ public class StatusBar extends SystemUI implements DemoMode, } @Override - public void onHeadsUpPinned(NotificationEntry entry) { - dismissVolumeDialog(); - } - - @Override - public void onHeadsUpUnPinned(NotificationEntry entry) { - } - - @Override public void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) { mEntryManager.updateNotifications(); - } - - @Override - public void onAmbientStateChanged(NotificationEntry entry, boolean isAmbient) { - mEntryManager.updateNotifications(); - if (isAmbient) { - mDozeServiceHost.fireNotificationPulse(); - } else if (!mAmbientPulseManager.hasNotifications()) { + if (isDozing() && isHeadsUp) { + entry.setPulseSuppressed(false); + mDozeServiceHost.fireNotificationPulse(entry); + if (mPulsing) { + mDozeScrimController.cancelPendingPulseTimeout(); + } + } + if (!isHeadsUp && !mHeadsUpManager.hasNotifications()) { // There are no longer any notifications to show. We should end the pulse now. mDozeScrimController.pulseOutNow(); } @@ -1670,7 +1694,7 @@ public class StatusBar extends SystemUI implements DemoMode, } } - public boolean isHeadsUpShouldBeVisible() { + public boolean headsUpShouldBeVisible() { return mHeadsUpAppearanceController.shouldBeVisible(); } @@ -1791,6 +1815,8 @@ public class StatusBar extends SystemUI implements DemoMode, mVibratorHelper.vibrate(VibrationEffect.EFFECT_TICK); } mNotificationPanel.expand(true /* animate */); + ((NotificationListContainer) mStackScroller).setWillExpand(true); + mHeadsUpManager.unpinAll(true /* userUnpinned */); mMetricsLogger.count(NotificationPanelView.COUNTER_PANEL_OPEN, 1); } else if (!mNotificationPanel.isInSettings() && !mNotificationPanel.isExpanding()){ mNotificationPanel.flingSettings(0 /* velocity */, @@ -1918,19 +1944,18 @@ public class StatusBar extends SystemUI implements DemoMode, mStatusBarKeyguardViewManager.readyForKeyguardDone(); } - public void dispatchNotificationsPanelTouchEvent(MotionEvent ev) { + /** + * Called when another window is about to transfer it's input focus. + */ + public void onInputFocusTransfer(boolean start, float velocity) { if (!mCommandQueue.panelsEnabled()) { return; } - mNotificationPanel.dispatchTouchEvent(ev); - int action = ev.getAction(); - if (action == MotionEvent.ACTION_DOWN) { - // Start ignoring all touch events coming to status bar window. - // TODO: handle case where ACTION_UP is not sent over the binder - mStatusBarWindowController.setNotTouchable(true); - } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { - mStatusBarWindowController.setNotTouchable(false); + if (start) { + mNotificationPanel.startWaitingForOpenPanelGesture(); + } else { + mNotificationPanel.stopWaitingForOpenPanelGesture(velocity); } } @@ -2120,6 +2145,7 @@ public class StatusBar extends SystemUI implements DemoMode, checkBarModes(); mAutoHideController.touchAutoHide(); } + mStatusBarStateController.setSystemUiVisibility(mSystemUiVisibility); } mLightBarController.onSystemUiVisibilityChanged(fullscreenStackVis, dockedStackVis, mask, fullscreenStackBounds, dockedStackBounds, sbModeChanged, mStatusBarMode, @@ -2376,6 +2402,14 @@ public class StatusBar extends SystemUI implements DemoMode, mLightBarController.dump(fd, pw, args); } + if (mUnlockMethodCache != null) { + mUnlockMethodCache.dump(pw); + } + + if (mKeyguardBypassController != null) { + mKeyguardBypassController.dump(pw); + } + if (mKeyguardUpdateMonitor != null) { mKeyguardUpdateMonitor.dump(fd, pw, args); } @@ -2609,8 +2643,8 @@ public class StatusBar extends SystemUI implements DemoMode, } } - private void executeWhenUnlocked(OnDismissAction action) { - if (mStatusBarKeyguardViewManager.isShowing()) { + private void executeWhenUnlocked(OnDismissAction action, boolean requiresShadeOpen) { + if (mStatusBarKeyguardViewManager.isShowing() && requiresShadeOpen) { mStatusBarStateController.setLeaveOpenOnKeyguardHide(true); } dismissKeyguardThenExecute(action, null /* cancelAction */, false /* afterKeyguardGone */); @@ -3160,6 +3194,7 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationPanel.onAffordanceLaunchEnded(); mNotificationPanel.animate().cancel(); mNotificationPanel.setAlpha(1f); + ViewGroupFadeHelper.reset(mNotificationPanel); updateScrimController(); Trace.endSection(); return staying; @@ -3183,12 +3218,13 @@ public class StatusBar extends SystemUI implements DemoMode, /** * Notifies the status bar the Keyguard is fading away with the specified timings. - * - * @param startTime the start time of the animations in uptime millis + * @param startTime the start time of the animations in uptime millis * @param delay the precalculated animation delay in milliseconds * @param fadeoutDuration the duration of the exit animation, in milliseconds + * @param isBypassFading is this a fading away animation while bypassing */ - public void setKeyguardFadingAway(long startTime, long delay, long fadeoutDuration) { + public void setKeyguardFadingAway(long startTime, long delay, long fadeoutDuration, + boolean isBypassFading) { mCommandQueue.appTransitionStarting(mDisplayId, startTime + fadeoutDuration - LightBarTransitionsController.DEFAULT_TINT_ANIMATION_DURATION, LightBarTransitionsController.DEFAULT_TINT_ANIMATION_DURATION, true); @@ -3196,7 +3232,7 @@ public class StatusBar extends SystemUI implements DemoMode, mCommandQueue.appTransitionStarting(mDisplayId, startTime - LightBarTransitionsController.DEFAULT_TINT_ANIMATION_DURATION, LightBarTransitionsController.DEFAULT_TINT_ANIMATION_DURATION, true); - mKeyguardMonitor.notifyKeyguardFadingAway(delay, fadeoutDuration); + mKeyguardMonitor.notifyKeyguardFadingAway(delay, fadeoutDuration, isBypassFading); } /** @@ -3424,7 +3460,7 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationPanel.resetViews(dozingAnimated); updateQsExpansionEnabled(); - mKeyguardViewMediator.setAodShowing(mDozing); + mKeyguardViewMediator.setDozing(mDozing); mEntryManager.updateNotifications(); updateDozingState(); @@ -3546,6 +3582,9 @@ public class StatusBar extends SystemUI implements DemoMode, userAllowsPrivateNotificationsInPublic(mLockscreenUserManager.getCurrentUserId()) || !mLockscreenUserManager.shouldShowLockscreenNotifications() || mFalsingManager.shouldEnforceBouncer(); + if (mKeyguardBypassController.getBypassEnabled()) { + fullShadeNeedsBouncer = false; + } if (mLockscreenUserManager.isLockscreenPublicMode(userId) && fullShadeNeedsBouncer) { mStatusBarStateController.setLeaveOpenOnKeyguardHide(true); showBouncerIfKeyguard(); @@ -3571,6 +3610,9 @@ public class StatusBar extends SystemUI implements DemoMode, */ public void setBouncerShowing(boolean bouncerShowing) { mBouncerShowing = bouncerShowing; + mKeyguardBypassController.setBouncerShowing(bouncerShowing); + mPulseExpansionHandler.setBouncerShowing(bouncerShowing); + mStatusBarWindow.setBouncerShowingScrimmed(isBouncerShowingScrimmed()); if (mStatusBarView != null) mStatusBarView.setBouncerShowing(bouncerShowing); updateHideIconsForBouncer(true /* animate */); mCommandQueue.recomputeDisableFlags(mDisplayId, true /* animate */); @@ -3622,13 +3664,18 @@ public class StatusBar extends SystemUI implements DemoMode, updateNotificationPanelTouchState(); notifyHeadsUpGoingToSleep(); dismissVolumeDialog(); + mWakeUpCoordinator.setFullyAwake(false); + mBypassHeadsUpNotifier.setFullyAwake(false); + mKeyguardBypassController.onStartedGoingToSleep(); } @Override public void onStartedWakingUp() { mDeviceInteractive = true; mWakeUpCoordinator.setWakingUp(true); - mAmbientPulseManager.releaseAllImmediately(); + if (!mKeyguardBypassController.getBypassEnabled()) { + mHeadsUpManager.releaseAllImmediately(); + } mVisualStabilityManager.setScreenOn(true); updateVisibleToUser(); updateIsKeyguard(); @@ -3642,6 +3689,8 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void onFinishedWakingUp() { + mWakeUpCoordinator.setFullyAwake(true); + mBypassHeadsUpNotifier.setFullyAwake(true); mWakeUpCoordinator.setWakingUp(false); if (mLaunchCameraWhenFinishedWaking) { mNotificationPanel.launchCamera(false /* animate */, mLastCameraLaunchSource); @@ -3659,8 +3708,9 @@ public class StatusBar extends SystemUI implements DemoMode, private void updateNotificationPanelTouchState() { boolean goingToSleepWithoutAnimation = isGoingToSleep() && !DozeParameters.getInstance(mContext).shouldControlScreenOff(); - mNotificationPanel.setTouchAndAnimationDisabled((!mDeviceInteractive && !mPulsing) - || goingToSleepWithoutAnimation); + boolean disabled = (!mDeviceInteractive && !mPulsing) || goingToSleepWithoutAnimation; + mNotificationPanel.setTouchAndAnimationDisabled(disabled); + mNotificationIconAreaController.setAnimationsEnabled(!disabled); } final ScreenLifecycle.Observer mScreenObserver = new ScreenLifecycle.Observer() { @@ -3741,7 +3791,8 @@ public class StatusBar extends SystemUI implements DemoMode, return; } if (!mNotificationPanel.canCameraGestureBeLaunched( - mStatusBarKeyguardViewManager.isShowing() && mExpandedVisible)) { + mStatusBarKeyguardViewManager.isShowing() + && (mExpandedVisible || mBouncerShowing))) { if (DEBUG_CAMERA_LIFT) Slog.d(TAG, "Can't launch camera right now, mExpandedVisible: " + mExpandedVisible); return; @@ -3752,6 +3803,12 @@ public class StatusBar extends SystemUI implements DemoMode, "com.android.systemui:CAMERA_GESTURE"); } vibrateForCameraGesture(); + + if (source == StatusBarManager.CAMERA_LAUNCH_SOURCE_POWER_DOUBLE_TAP) { + Log.v(TAG, "Camera launch"); + mKeyguardUpdateMonitor.onCameraLaunched(); + } + if (!mStatusBarKeyguardViewManager.isShowing()) { startActivityDismissingKeyguard(KeyguardBottomAreaView.INSECURE_CAMERA_INTENT, false /* onlyProvisioned */, true /* dismissShade */, @@ -3807,8 +3864,10 @@ public class StatusBar extends SystemUI implements DemoMode, public void notifyBiometricAuthModeChanged() { updateDozing(); + mScrimController.setUnlockIsFading(mBiometricUnlockController.isUnlockFading()); updateScrimController(); - mStatusBarWindow.onBiometricAuthModeChanged(mBiometricUnlockController.isWakeAndUnlock()); + mStatusBarWindow.onBiometricAuthModeChanged(mBiometricUnlockController.isWakeAndUnlock(), + mBiometricUnlockController.isBiometricUnlock()); } @VisibleForTesting @@ -3817,7 +3876,8 @@ public class StatusBar extends SystemUI implements DemoMode, // We don't want to end up in KEYGUARD state when we're unlocking with // fingerprint from doze. We should cross fade directly from black. - boolean wakeAndUnlocking = mBiometricUnlockController.isWakeAndUnlock(); + boolean unlocking = mBiometricUnlockController.isWakeAndUnlock() + || mKeyguardMonitor.isKeyguardFadingAway(); // Do not animate the scrim expansion when triggered by the fingerprint sensor. mScrimController.setExpansionAffectsAlpha( @@ -3842,9 +3902,9 @@ public class StatusBar extends SystemUI implements DemoMode, } else if (isPulsing()) { mScrimController.transitionTo(ScrimState.PULSING, mDozeScrimController.getScrimCallback()); - } else if (mDozing && !wakeAndUnlocking) { + } else if (mDozing && !unlocking) { mScrimController.transitionTo(ScrimState.AOD); - } else if (mIsKeyguard && !wakeAndUnlocking) { + } else if (mIsKeyguard && !unlocking) { mScrimController.transitionTo(ScrimState.KEYGUARD); } else if (mBubbleController.isStackExpanded()) { mScrimController.transitionTo(ScrimState.BUBBLE_EXPANDED); @@ -3868,6 +3928,9 @@ public class StatusBar extends SystemUI implements DemoMode, private boolean mAnimateWakeup; private boolean mAnimateScreenOff; private boolean mIgnoreTouchWhilePulsing; + @VisibleForTesting + boolean mWakeLockScreenPerformsAuth = SystemProperties.getBoolean( + "persist.sysui.wake_performs_auth", true); @Override public String toString() { @@ -3880,9 +3943,13 @@ public class StatusBar extends SystemUI implements DemoMode, } } - public void fireNotificationPulse() { + public void fireNotificationPulse(NotificationEntry entry) { + Runnable pulseSupressedListener = () -> { + entry.setPulseSuppressed(true); + mNotificationIconAreaController.updateAodNotificationIcons(); + }; for (Callback callback : mCallbacks) { - callback.onNotificationAlerted(); + callback.onNotificationAlerted(pulseSupressedListener); } } @@ -3923,7 +3990,8 @@ public class StatusBar extends SystemUI implements DemoMode, mStatusBarWindow.suppressWakeUpGesture(true); } - boolean passiveAuthInterrupt = reason == DozeLog.PULSE_REASON_NOTIFICATION; + boolean passiveAuthInterrupt = reason == DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN + && mWakeLockScreenPerformsAuth; // Set the state to pulsing, so ScrimController will know what to do once we ask it to // execute the transition. The pulse callback will then be invoked when the scrims // are black, indicating that StatusBar is ready to present the rest of the UI. @@ -3949,6 +4017,7 @@ public class StatusBar extends SystemUI implements DemoMode, } private void setPulsing(boolean pulsing) { + mStatusBarStateController.setPulsing(pulsing); mStatusBarKeyguardViewManager.setPulsing(pulsing); mKeyguardViewMediator.setPulsing(pulsing); mNotificationPanel.setPulsing(pulsing); @@ -4027,8 +4096,8 @@ public class StatusBar extends SystemUI implements DemoMode, if (reason == DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN) { mScrimController.setWakeLockScreenSensorActive(true); } - if (mDozeScrimController.isPulsing() && mAmbientPulseManager.hasNotifications()) { - mAmbientPulseManager.extendPulse(); + if (mDozeScrimController.isPulsing() && mHeadsUpManager.hasNotifications()) { + mHeadsUpManager.extendHeadsUp(); } else { mDozeScrimController.extendPulse(); } @@ -4080,6 +4149,11 @@ public class StatusBar extends SystemUI implements DemoMode, mScrimController.setAodFrontScrimAlpha(scrimOpacity); } + @Override + public void prepareForGentleWakeUp() { + mScrimController.prepareForGentleWakeUp(); + } + private void dispatchTap(View view, float x, float y) { long now = SystemClock.elapsedRealtime(); dispatchTouchEvent(view, x, y, now, MotionEvent.ACTION_DOWN); @@ -4117,12 +4191,6 @@ public class StatusBar extends SystemUI implements DemoMode, protected NotificationGroupAlertTransferHelper mGroupAlertTransferHelper; - - // for heads up notifications - protected HeadsUpManagerPhone mHeadsUpManager; - - protected AmbientPulseManager mAmbientPulseManager = Dependency.get(AmbientPulseManager.class); - // handling reordering protected VisualStabilityManager mVisualStabilityManager; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 93168db861be..4d85a422d9b9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.phone; import static com.android.systemui.plugins.ActivityStarter.OnDismissAction; +import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_UNLOCK_FADING; import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK; import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING; @@ -51,6 +52,7 @@ import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.RemoteInputController; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; +import com.android.systemui.statusbar.notification.ViewGroupFadeHelper; import com.android.systemui.statusbar.phone.KeyguardBouncer.BouncerExpansionCallback; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardMonitor; @@ -67,7 +69,7 @@ import java.util.ArrayList; */ public class StatusBarKeyguardViewManager implements RemoteInputController.Callback, StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener, - NotificationPanelView.PanelExpansionListener, NavigationModeController.ModeChangedListener { + PanelExpansionListener, NavigationModeController.ModeChangedListener { // When hiding the Keyguard with timing supplied from WindowManager, better be early than late. private static final long HIDE_TIMING_CORRECTION_MS = - 16 * 3; @@ -132,6 +134,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private ViewGroup mContainer; private ViewGroup mLockIconContainer; + private View mNotificationContainer; protected KeyguardBouncer mBouncer; protected boolean mShowing; @@ -165,9 +168,10 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb (KeyguardMonitorImpl) Dependency.get(KeyguardMonitor.class); private final NotificationMediaManager mMediaManager = Dependency.get(NotificationMediaManager.class); - private final StatusBarStateController mStatusBarStateController = - Dependency.get(StatusBarStateController.class); + private final SysuiStatusBarStateController mStatusBarStateController = + (SysuiStatusBarStateController) Dependency.get(StatusBarStateController.class); private final DockManager mDockManager; + private KeyguardBypassController mBypassController; private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { @@ -205,7 +209,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb NotificationPanelView notificationPanelView, BiometricUnlockController biometricUnlockController, DismissCallbackRegistry dismissCallbackRegistry, - ViewGroup lockIconContainer) { + ViewGroup lockIconContainer, View notificationContainer, + KeyguardBypassController bypassController) { mStatusBar = statusBar; mContainer = container; mLockIconContainer = lockIconContainer; @@ -217,7 +222,9 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mViewMediatorCallback, mLockPatternUtils, container, dismissCallbackRegistry, mExpansionCallback); mNotificationPanelView = notificationPanelView; - notificationPanelView.setExpansionListener(this); + notificationPanelView.addExpansionListener(this); + mBypassController = bypassController; + mNotificationContainer = notificationContainer; } @Override @@ -261,7 +268,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb boolean keyguardWithoutQs = mStatusBarStateController.getState() == StatusBarState.KEYGUARD && !mNotificationPanelView.isQsExpanded(); boolean lockVisible = (mBouncer.isShowing() || keyguardWithoutQs) - && !mBouncer.isAnimatingAway(); + && !mBouncer.isAnimatingAway() && !mKeyguardMonitor.isKeyguardFadingAway(); if (mLastLockVisible != lockVisible) { mLastLockVisible = lockVisible; @@ -270,8 +277,14 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb AppearAnimationUtils.DEFAULT_APPEAR_DURATION /* duration */, 0 /* delay */); } else { + final long duration; + if (needsBypassFading()) { + duration = KeyguardBypassController.BYPASS_PANEL_FADE_DURATION; + } else { + duration = AppearAnimationUtils.DEFAULT_APPEAR_DURATION / 2; + } CrossFadeHelper.fadeOut(mLockIconContainer, - AppearAnimationUtils.DEFAULT_APPEAR_DURATION / 2 /* duration */, + duration /* duration */, 0 /* delay */, null /* runnable */); } } @@ -547,20 +560,44 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb executeAfterKeyguardGoneAction(); boolean wakeUnlockPulsing = mBiometricUnlockController.getMode() == MODE_WAKE_AND_UNLOCK_PULSING; - if (wakeUnlockPulsing) { + boolean needsFading = needsBypassFading(); + if (needsFading) { + delay = 0; + fadeoutDuration = KeyguardBypassController.BYPASS_PANEL_FADE_DURATION; + } else if (wakeUnlockPulsing) { delay = 0; fadeoutDuration = 240; } - mStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration); + mStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration, needsFading); mBiometricUnlockController.startKeyguardFadingAway(); hideBouncer(true /* destroyView */); if (wakeUnlockPulsing) { - mStatusBar.fadeKeyguardWhilePulsing(); + if (needsFading) { + ViewGroupFadeHelper.fadeOutAllChildrenExcept(mNotificationPanelView, + mNotificationContainer, + fadeoutDuration, + () -> { + mStatusBar.hideKeyguard(); + onKeyguardFadedAway(); + }); + } else { + mStatusBar.fadeKeyguardWhilePulsing(); + } wakeAndUnlockDejank(); } else { - boolean staying = mStatusBar.hideKeyguard(); + boolean staying = mStatusBarStateController.leaveOpenOnKeyguardHide(); if (!staying) { mStatusBarWindowController.setKeyguardFadingAway(true); + if (needsFading) { + ViewGroupFadeHelper.fadeOutAllChildrenExcept(mNotificationPanelView, + mNotificationContainer, + fadeoutDuration, + () -> { + mStatusBar.hideKeyguard(); + }); + } else { + mStatusBar.hideKeyguard(); + } // hide() will happen asynchronously and might arrive after the scrims // were already hidden, this means that the transition callback won't // be triggered anymore and StatusBarWindowController will be forever in @@ -568,10 +605,12 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb mStatusBar.updateScrimController(); wakeAndUnlockDejank(); } else { + mStatusBar.hideKeyguard(); mStatusBar.finishKeyguardFadingAway(); mBiometricUnlockController.finishKeyguardFadingAway(); } } + updateLockIcon(); updateStates(); mStatusBarWindowController.setKeyguardShowing(false); mViewMediatorCallback.keyguardGone(); @@ -580,6 +619,13 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb StatsLog.KEYGUARD_STATE_CHANGED__STATE__HIDDEN); } + private boolean needsBypassFading() { + return (mBiometricUnlockController.getMode() == MODE_UNLOCK_FADING + || mBiometricUnlockController.getMode() == MODE_WAKE_AND_UNLOCK_PULSING + || mBiometricUnlockController.getMode() == MODE_WAKE_AND_UNLOCK) + && mBypassController.getBypassEnabled(); + } + @Override public void onDensityOrFontScaleChanged() { hideBouncer(true /* destroyView */); @@ -602,6 +648,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb public void onKeyguardFadedAway() { mContainer.postDelayed(() -> mStatusBarWindowController.setKeyguardFadingAway(false), 100); + ViewGroupFadeHelper.reset(mNotificationPanelView); mStatusBar.finishKeyguardFadingAway(); mBiometricUnlockController.finishKeyguardFadingAway(); WindowManagerGlobal.getInstance().trimMemory( @@ -677,8 +724,12 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb return mBouncer.isShowing(); } - public boolean isBouncerPartiallyVisible() { - return mBouncer.isPartiallyVisible(); + /** + * When bouncer is fully visible or {@link KeyguardBouncer#show(boolean)} was called but + * animation didn't finish yet. + */ + public boolean bouncerIsOrWillBeShowing() { + return mBouncer.isShowing() || mBouncer.inTransit(); } public boolean isFullscreenBouncer() { @@ -812,6 +863,14 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb return mStatusBar.isInLaunchTransition(); } + + /** + * @return Whether subtle animation should be used for unlocking the device. + */ + public boolean shouldSubtleWindowAnimationsForUnlock() { + return needsBypassFading(); + } + public boolean isGoingToNotificationShade() { return ((SysuiStatusBarStateController) Dependency.get(StatusBarStateController.class)) .leaveOpenOnKeyguardHide(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java index e00d439dc1c7..bec53a1b2d3c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java @@ -406,8 +406,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit } private void handleFullScreenIntent(NotificationEntry entry) { - boolean isHeadsUped = mNotificationInterruptionStateProvider.shouldHeadsUp(entry); - if (!isHeadsUped && entry.notification.getNotification().fullScreenIntent != null) { + if (mNotificationInterruptionStateProvider.shouldLaunchFullScreenIntentWhenAdded(entry)) { if (shouldSuppressFullScreenIntent(entry)) { if (DEBUG) { Log.d(TAG, "No Fullscreen intent: suppressed by DND: " + entry.key); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java index 6fe89645ef19..a870590c08ac 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java @@ -49,7 +49,6 @@ import com.android.systemui.R; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationMediaManager; @@ -60,6 +59,7 @@ import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.notification.AboveShelfObserver; import com.android.systemui.statusbar.notification.ActivityLaunchAnimator; +import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.NotificationAlertingManager; import com.android.systemui.statusbar.notification.NotificationEntryListener; import com.android.systemui.statusbar.notification.NotificationEntryManager; @@ -106,7 +106,6 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, Dependency.get(VisualStabilityManager.class); private final NotificationGutsManager mGutsManager = Dependency.get(NotificationGutsManager.class); - protected AmbientPulseManager mAmbientPulseManager = Dependency.get(AmbientPulseManager.class); private final NotificationPanelView mNotificationPanel; private final HeadsUpManagerPhone mHeadsUpManager; @@ -119,9 +118,9 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, private final AccessibilityManager mAccessibilityManager; private final KeyguardManager mKeyguardManager; private final ActivityLaunchAnimator mActivityLaunchAnimator; - private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private final int mMaxAllowedKeyguardNotifications; private final IStatusBarService mBarService; + private final DynamicPrivacyController mDynamicPrivacyController; private boolean mReinflateNotificationsOnUserSwitched; private boolean mDispatchUiModeChangeOnUserSwitched; private final UnlockMethodCache mUnlockMethodCache; @@ -138,16 +137,16 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, DozeScrimController dozeScrimController, ScrimController scrimController, ActivityLaunchAnimator activityLaunchAnimator, - StatusBarKeyguardViewManager statusBarKeyguardViewManager, + DynamicPrivacyController dynamicPrivacyController, NotificationAlertingManager notificationAlertingManager, NotificationRowBinderImpl notificationRowBinder) { mContext = context; mNotificationPanel = panel; mHeadsUpManager = headsUp; + mDynamicPrivacyController = dynamicPrivacyController; mCommandQueue = getComponent(context, CommandQueue.class); mAboveShelfObserver = new AboveShelfObserver(stackScroller); mActivityLaunchAnimator = activityLaunchAnimator; - mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; mAboveShelfObserver.setListener(statusBarWindow.findViewById( R.id.notification_container_parent)); mAccessibilityManager = context.getSystemService(AccessibilityManager.class); @@ -213,7 +212,6 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, mEntryManager.setUpWithPresenter(this, notifListContainer, mHeadsUpManager); mEntryManager.addNotificationEntryListener(notificationEntryListener); mEntryManager.addNotificationLifetimeExtender(mHeadsUpManager); - mEntryManager.addNotificationLifetimeExtender(mAmbientPulseManager); mEntryManager.addNotificationLifetimeExtender(mGutsManager); mEntryManager.addNotificationLifetimeExtenders( remoteInputManager.getLifetimeExtenders()); @@ -297,7 +295,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, private void maybeEndAmbientPulse() { if (mNotificationPanel.hasPulsingNotifications() && - !mAmbientPulseManager.hasNotifications()) { + !mHeadsUpManager.hasNotifications()) { // We were showing a pulse for a notification, but no notifications are pulsing anymore. // Finish the pulse. mDozeScrimController.pulseOutNow(); @@ -343,10 +341,6 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, } public boolean canHeadsUp(NotificationEntry entry, StatusBarNotification sbn) { - if (mShadeController.isDozing()) { - return false; - } - if (mShadeController.isOccluded()) { boolean devicePublic = mLockscreenUserManager. isLockscreenPublicMode(mLockscreenUserManager.getCurrentUserId()); @@ -354,6 +348,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, || mLockscreenUserManager.isLockscreenPublicMode(sbn.getUserId()); boolean needsRedaction = mLockscreenUserManager.needsRedaction(entry); if (userPublic && needsRedaction) { + // TODO(b/135046837): we can probably relax this with dynamic privacy return false; } } @@ -460,8 +455,15 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, @Override public void onExpandClicked(NotificationEntry clickedEntry, boolean nowExpanded) { mHeadsUpManager.setExpanded(clickedEntry, nowExpanded); - if (mStatusBarStateController.getState() == StatusBarState.KEYGUARD && nowExpanded) { - mShadeController.goToLockedShade(clickedEntry.getRow()); + if (nowExpanded) { + if (mStatusBarStateController.getState() == StatusBarState.KEYGUARD) { + mShadeController.goToLockedShade(clickedEntry.getRow()); + } else if (clickedEntry.isSensitive() + && mDynamicPrivacyController.isInLockedDownShade()) { + mStatusBarStateController.setLeaveOpenOnKeyguardHide(true); + mActivityStarter.dismissKeyguardThenExecute(() -> false /* dismissAction */ + , null /* cancelRunnable */, false /* afterKeyguardGone */); + } } } @@ -470,12 +472,6 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, return mVrMode; } - @Override - public boolean isPresenterLocked() { - return mStatusBarKeyguardViewManager.isShowing() - && mStatusBarKeyguardViewManager.isSecure(); - } - private void onLockedNotificationImportanceChange(OnDismissAction dismissAction) { mStatusBarStateController.setLeaveOpenOnKeyguardHide(true); mActivityStarter.dismissKeyguardThenExecute(dismissAction, null, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java index 6691f7a759f3..13d4b8edb8d4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java @@ -48,6 +48,7 @@ import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.policy.KeyguardMonitor; +import com.android.systemui.statusbar.policy.RemoteInputView; import javax.inject.Inject; import javax.inject.Singleton; @@ -93,9 +94,11 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks, @Override public void onStateChanged(int state) { - if (state == StatusBarState.SHADE && mStatusBarStateController.leaveOpenOnKeyguardHide()) { + boolean hasPendingRemoteInput = mPendingRemoteInputView != null; + if (state == StatusBarState.SHADE + && (mStatusBarStateController.leaveOpenOnKeyguardHide() || hasPendingRemoteInput)) { if (!mStatusBarStateController.isKeyguardRequested()) { - if (mPendingRemoteInputView != null) { + if (hasPendingRemoteInput) { mMainHandler.post(mPendingRemoteInputView::callOnClick); } mPendingRemoteInputView = null; @@ -105,7 +108,9 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks, @Override public void onLockedRemoteInput(ExpandableNotificationRow row, View clicked) { - mStatusBarStateController.setLeaveOpenOnKeyguardHide(true); + if (!row.isPinned()) { + mStatusBarStateController.setLeaveOpenOnKeyguardHide(true); + } mShadeController.showBouncer(true /* scrimmed */); mPendingRemoteInputView = clicked; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java index e949ade28b59..3d25749265f1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarTouchableRegionManager.java @@ -26,7 +26,6 @@ import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.OnComputeInternalInsetsListener; import com.android.systemui.Dependency; -import com.android.systemui.assist.AssistManager; import com.android.systemui.bubbles.BubbleController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; @@ -38,7 +37,6 @@ import com.android.systemui.statusbar.policy.ConfigurationController.Configurati public final class StatusBarTouchableRegionManager implements OnComputeInternalInsetsListener, ConfigurationListener { - private final AssistManager mAssistManager = Dependency.get(AssistManager.class); private final BubbleController mBubbleController = Dependency.get(BubbleController.class); private final Context mContext; private final HeadsUpManagerPhone mHeadsUpManager; @@ -48,6 +46,7 @@ public final class StatusBarTouchableRegionManager implements private int mStatusBarHeight; private final View mStatusBarWindowView; private boolean mForceCollapsedUntilLayout = false; + private final StatusBarWindowController mStatusBarWindowController; public StatusBarTouchableRegionManager(@NonNull Context context, HeadsUpManagerPhone headsUpManager, @@ -57,12 +56,17 @@ public final class StatusBarTouchableRegionManager implements mHeadsUpManager = headsUpManager; mStatusBar = statusBar; mStatusBarWindowView = statusBarWindowView; + mStatusBarWindowController = Dependency.get(StatusBarWindowController.class); initResources(); mBubbleController.setBubbleStateChangeListener((hasBubbles) -> { updateTouchableRegion(); }); + + mStatusBarWindowController.setForcePluginOpenListener((forceOpen) -> { + updateTouchableRegion(); + }); Dependency.get(ConfigurationController.class).addCallback(this); } @@ -77,7 +81,8 @@ public final class StatusBarTouchableRegionManager implements mHeadsUpManager.hasPinnedHeadsUp() || mHeadsUpManager.isHeadsUpGoingAway() || mBubbleController.hasBubbles() || mForceCollapsedUntilLayout - || hasCutoutInset; + || hasCutoutInset + || mStatusBarWindowController.getForcePluginOpen(); if (shouldObserve == mShouldAdjustInsets) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java index 8621b7293711..0ef981bdb3de 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowController.java @@ -29,7 +29,9 @@ import android.graphics.PixelFormat; import android.os.Binder; import android.os.RemoteException; import android.os.SystemProperties; +import android.os.Trace; import android.util.Log; +import android.view.Display; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; @@ -51,12 +53,14 @@ import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import com.google.android.collect.Lists; + import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.lang.reflect.Field; - import java.util.ArrayList; +import java.util.Arrays; + import javax.inject.Inject; import javax.inject.Singleton; @@ -72,41 +76,69 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat private final WindowManager mWindowManager; private final IActivityManager mActivityManager; private final DozeParameters mDozeParameters; - private final WindowManager.LayoutParams mLpChanged; + private final LayoutParams mLpChanged; private final boolean mKeyguardScreenRotation; + private final long mLockScreenDisplayTimeout; + private final Display.Mode mKeyguardDisplayMode; + private final KeyguardBypassController mKeyguardBypassController; private ViewGroup mStatusBarView; - private WindowManager.LayoutParams mLp; + private LayoutParams mLp; private boolean mHasTopUi; private boolean mHasTopUiChanged; private int mBarHeight; private float mScreenBrightnessDoze; private final State mCurrentState = new State(); private OtherwisedCollapsedListener mListener; + private ForcePluginOpenListener mForcePluginOpenListener; private final ArrayList<WeakReference<StatusBarWindowCallback>> mCallbacks = Lists.newArrayList(); private final SysuiColorExtractor mColorExtractor = Dependency.get(SysuiColorExtractor.class); @Inject - public StatusBarWindowController(Context context) { + public StatusBarWindowController(Context context, + StatusBarStateController statusBarStateController, + ConfigurationController configurationController, + KeyguardBypassController keyguardBypassController) { this(context, context.getSystemService(WindowManager.class), ActivityManager.getService(), - DozeParameters.getInstance(context)); + DozeParameters.getInstance(context), statusBarStateController, + configurationController, keyguardBypassController); } @VisibleForTesting public StatusBarWindowController(Context context, WindowManager windowManager, - IActivityManager activityManager, DozeParameters dozeParameters) { + IActivityManager activityManager, DozeParameters dozeParameters, + StatusBarStateController statusBarStateController, + ConfigurationController configurationController, + KeyguardBypassController keyguardBypassController) { mContext = context; mWindowManager = windowManager; mActivityManager = activityManager; mKeyguardScreenRotation = shouldEnableKeyguardScreenRotation(); mDozeParameters = dozeParameters; mScreenBrightnessDoze = mDozeParameters.getScreenBrightnessDoze(); - mLpChanged = new WindowManager.LayoutParams(); - ((SysuiStatusBarStateController) Dependency.get(StatusBarStateController.class)) + mLpChanged = new LayoutParams(); + mKeyguardBypassController = keyguardBypassController; + mLockScreenDisplayTimeout = context.getResources() + .getInteger(R.integer.config_lockScreenDisplayTimeout); + ((SysuiStatusBarStateController) statusBarStateController) .addCallback(mStateListener, SysuiStatusBarStateController.RANK_STATUS_BAR_WINDOW_CONTROLLER); - Dependency.get(ConfigurationController.class).addCallback(this); + configurationController.addCallback(this); + + Display.Mode[] supportedModes = context.getDisplay().getSupportedModes(); + Display.Mode currentMode = context.getDisplay().getMode(); + // Running on the highest frame rate available can be expensive. + // Let's specify a preferred refresh rate, and allow higher FPS only when we + // know that we're not falsing (because we unlocked.) + int keyguardRefreshRate = context.getResources() + .getInteger(R.integer.config_keyguardRefreshRate); + // Find supported display mode with the same resolution and requested refresh rate. + mKeyguardDisplayMode = Arrays.stream(supportedModes).filter(mode -> + (int) mode.getRefreshRate() == keyguardRefreshRate + && mode.getPhysicalWidth() == currentMode.getPhysicalWidth() + && mode.getPhysicalHeight() == currentMode.getPhysicalHeight()) + .findFirst().orElse(null); } /** @@ -139,19 +171,19 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat // Now that the status bar window encompasses the sliding panel and its // translucent backdrop, the entire thing is made TRANSLUCENT and is // hardware-accelerated. - mLp = new WindowManager.LayoutParams( + mLp = new LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, barHeight, - WindowManager.LayoutParams.TYPE_STATUS_BAR, - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE - | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING - | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH - | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH - | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, + LayoutParams.TYPE_STATUS_BAR, + LayoutParams.FLAG_NOT_FOCUSABLE + | LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING + | LayoutParams.FLAG_SPLIT_TOUCH + | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH + | LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, PixelFormat.TRANSLUCENT); mLp.token = new Binder(); mLp.gravity = Gravity.TOP; - mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; + mLp.softInputMode = LayoutParams.SOFT_INPUT_ADJUST_RESIZE; mLp.setTitle("StatusBar"); mLp.packageName = mContext.getPackageName(); mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; @@ -184,9 +216,9 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat private void applyKeyguardFlags(State state) { if (state.keyguardShowing) { - mLpChanged.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; + mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_KEYGUARD; } else { - mLpChanged.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; + mLpChanged.privateFlags &= ~LayoutParams.PRIVATE_FLAG_KEYGUARD; } final boolean scrimsOccludingWallpaper = @@ -194,9 +226,9 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat final boolean keyguardOrAod = state.keyguardShowing || (state.dozing && mDozeParameters.getAlwaysOn()); if (keyguardOrAod && !state.backdropShowing && !scrimsOccludingWallpaper) { - mLpChanged.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; + mLpChanged.flags |= LayoutParams.FLAG_SHOW_WALLPAPER; } else { - mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; + mLpChanged.flags &= ~LayoutParams.FLAG_SHOW_WALLPAPER; } if (state.dozing) { @@ -204,6 +236,18 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat } else { mLpChanged.privateFlags &= ~LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; } + + if (mKeyguardDisplayMode != null) { + boolean bypassOnKeyguard = mKeyguardBypassController.getBypassEnabled() + && state.statusBarState == StatusBarState.KEYGUARD && !state.keyguardFadingAway + && !state.keyguardGoingAway; + if (state.dozing || bypassOnKeyguard) { + mLpChanged.preferredDisplayModeId = mKeyguardDisplayMode.getModeId(); + } else { + mLpChanged.preferredDisplayModeId = 0; + } + Trace.setCounter("display_mode_id", mLpChanged.preferredDisplayModeId); + } } private void adjustScreenOrientation(State state) { @@ -223,17 +267,17 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat if (state.bouncerShowing && (state.keyguardOccluded || state.keyguardNeedsInput) || ENABLE_REMOTE_INPUT && state.remoteInputActive || state.bubbleExpanded) { - mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; - mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; + mLpChanged.flags &= ~LayoutParams.FLAG_NOT_FOCUSABLE; + mLpChanged.flags &= ~LayoutParams.FLAG_ALT_FOCUSABLE_IM; } else if (state.isKeyguardShowingAndNotOccluded() || panelFocusable) { - mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; - mLpChanged.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; + mLpChanged.flags &= ~LayoutParams.FLAG_NOT_FOCUSABLE; + mLpChanged.flags |= LayoutParams.FLAG_ALT_FOCUSABLE_IM; } else { - mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; - mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; + mLpChanged.flags |= LayoutParams.FLAG_NOT_FOCUSABLE; + mLpChanged.flags &= ~LayoutParams.FLAG_ALT_FOCUSABLE_IM; } - mLpChanged.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; + mLpChanged.softInputMode = LayoutParams.SOFT_INPUT_ADJUST_RESIZE; } private void applyForceShowNavigationFlag(State state) { @@ -279,7 +323,8 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat if (state.isKeyguardShowingAndNotOccluded() && state.statusBarState == StatusBarState.KEYGUARD && !state.qsExpanded) { - mLpChanged.userActivityTimeout = KeyguardViewMediator.AWAKE_INTERVAL_DEFAULT_MS; + mLpChanged.userActivityTimeout = state.bouncerShowing + ? KeyguardViewMediator.AWAKE_INTERVAL_BOUNCER_MS : mLockScreenDisplayTimeout; } else { mLpChanged.userActivityTimeout = -1; } @@ -290,19 +335,19 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat && state.statusBarState == StatusBarState.KEYGUARD && !state.qsExpanded && !state.forceUserActivity) { mLpChanged.inputFeatures |= - WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY; + LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY; } else { mLpChanged.inputFeatures &= - ~WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY; + ~LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY; } } private void applyStatusBarColorSpaceAgnosticFlag(State state) { if (!isExpanded(state)) { - mLpChanged.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC; + mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC; } else { mLpChanged.privateFlags &= - ~WindowManager.LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC; + ~LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC; } } @@ -347,20 +392,20 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat } private void applyForceStatusBarVisibleFlag(State state) { - if (state.forceStatusBarVisible) { + if (state.forceStatusBarVisible || state.forcePluginOpen) { mLpChanged.privateFlags |= WindowManager .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT; } else { - mLpChanged.privateFlags &= ~WindowManager - .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT; + mLpChanged.privateFlags + &= ~LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT; } } private void applyModalFlag(State state) { if (state.headsUpShowing) { - mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; + mLpChanged.flags |= LayoutParams.FLAG_NOT_TOUCH_MODAL; } else { - mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; + mLpChanged.flags &= ~LayoutParams.FLAG_NOT_TOUCH_MODAL; } } @@ -368,12 +413,12 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat if (state.forceDozeBrightness) { mLpChanged.screenBrightness = mScreenBrightnessDoze; } else { - mLpChanged.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE; + mLpChanged.screenBrightness = LayoutParams.BRIGHTNESS_OVERRIDE_NONE; } } private void applyHasTopUi(State state) { - mHasTopUiChanged = isExpanded(state); + mHasTopUiChanged = state.forceHasTopUi || isExpanded(state); } private void applyNotTouchable(State state) { @@ -506,6 +551,16 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat public void setForcePluginOpen(boolean forcePluginOpen) { mCurrentState.forcePluginOpen = forcePluginOpen; apply(mCurrentState); + if (mForcePluginOpenListener != null) { + mForcePluginOpenListener.onChange(forcePluginOpen); + } + } + + /** + * The forcePluginOpen state for the status bar. + */ + public boolean getForcePluginOpen() { + return mCurrentState.forcePluginOpen; } public void setNotTouchable(boolean notTouchable) { @@ -554,8 +609,13 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat mListener = listener; } + public void setForcePluginOpenListener(ForcePluginOpenListener listener) { + mForcePluginOpenListener = listener; + } + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - pw.println("StatusBarWindowController state:"); + pw.println("StatusBarWindowController:"); + pw.println(" mKeyguardDisplayMode=" + mKeyguardDisplayMode); pw.println(mCurrentState); } @@ -574,6 +634,23 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat setKeyguardDark(useDarkText); } + /** + * When keyguard will be dismissed but didn't start animation yet. + */ + public void setKeyguardGoingAway(boolean goingAway) { + mCurrentState.keyguardGoingAway = goingAway; + apply(mCurrentState); + } + + public boolean getForceHasTopUi() { + return mCurrentState.forceHasTopUi; + } + + public void setForceHasTopUi(boolean forceHasTopUi) { + mCurrentState.forceHasTopUi = forceHasTopUi; + apply(mCurrentState); + } + private static class State { boolean keyguardShowing; boolean keyguardOccluded; @@ -583,6 +660,7 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat boolean statusBarFocusable; boolean bouncerShowing; boolean keyguardFadingAway; + boolean keyguardGoingAway; boolean qsExpanded; boolean headsUpShowing; boolean forceStatusBarVisible; @@ -594,6 +672,7 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat boolean notTouchable; boolean bubblesShowing; boolean bubbleExpanded; + boolean forceHasTopUi; /** * The {@link StatusBar} state from the status bar. @@ -656,4 +735,14 @@ public class StatusBarWindowController implements Callback, Dumpable, Configurat public interface OtherwisedCollapsedListener { void setWouldOtherwiseCollapse(boolean otherwiseCollapse); } + + /** + * Listener to indicate forcePluginOpen has changed + */ + public interface ForcePluginOpenListener { + /** + * Called when mState.forcePluginOpen is changed + */ + void onChange(boolean forceOpen); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index 7d5f23bc1e58..1081bad9bf1c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -67,6 +67,7 @@ import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.DragDownHelper; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.phone.ScrimController.ScrimVisibility; import com.android.systemui.tuner.TunerService; @@ -149,6 +150,7 @@ public class StatusBarWindowView extends FrameLayout { * events manually as it's outside of the regular view bounds. */ private boolean mExpandingBelowNotch; + private KeyguardBypassController mBypassController; public StatusBarWindowView(Context context, AttributeSet attrs) { super(context, attrs); @@ -271,10 +273,11 @@ public class StatusBarWindowView extends FrameLayout { /** * Called when the biometric authentication mode changes. * @param wakeAndUnlock If the type is {@link BiometricUnlockController#isWakeAndUnlock()} + * @param isUnlock If the type is {@link BiometricUnlockController#isBiometricUnlock()} () */ - public void onBiometricAuthModeChanged(boolean wakeAndUnlock) { + public void onBiometricAuthModeChanged(boolean wakeAndUnlock, boolean isUnlock) { if (mLockIcon != null) { - mLockIcon.onBiometricAuthModeChanged(wakeAndUnlock); + mLockIcon.onBiometricAuthModeChanged(wakeAndUnlock, isUnlock); } } @@ -415,8 +418,7 @@ public class StatusBarWindowView extends FrameLayout { } boolean intercept = false; if (mNotificationPanel.isFullyExpanded() - && stackScrollLayout.getVisibility() == View.VISIBLE - && mStatusBarStateController.getState() == StatusBarState.KEYGUARD + && mDragDownHelper.isDragDownEnabled() && !mService.isBouncerShowing() && !mService.isDozing()) { intercept = mDragDownHelper.onInterceptTouchEvent(ev); @@ -440,8 +442,7 @@ public class StatusBarWindowView extends FrameLayout { if (mService.isDozing()) { handled = !mService.isPulsing(); } - if ((mStatusBarStateController.getState() == StatusBarState.KEYGUARD && !handled) - || mDragDownHelper.isDraggingDown()) { + if ((mDragDownHelper.isDragDownEnabled() && !handled) || mDragDownHelper.isDraggingDown()) { // we still want to finish our drag down gesture when locking the screen handled = mDragDownHelper.onTouchEvent(ev); } @@ -519,6 +520,16 @@ public class StatusBarWindowView extends FrameLayout { } } + public void setBypassController(KeyguardBypassController bypassController) { + mBypassController = bypassController; + } + + public void setBouncerShowingScrimmed(boolean bouncerShowing) { + if (mLockIcon != null) { + mLockIcon.setBouncerShowingScrimmed(bouncerShowing); + } + } + public class LayoutParams extends FrameLayout.LayoutParams { public boolean ignoreRightInset; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java index 39bf7283e1be..b1d6ca6e5580 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java @@ -16,22 +16,19 @@ package com.android.systemui.statusbar.phone; -import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.hardware.biometrics.BiometricSourceType; -import android.media.AudioManager; import android.os.Build; import android.os.Trace; -import android.telephony.TelephonyManager; -import com.android.internal.telephony.TelephonyIntents; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; +import java.io.PrintWriter; import java.util.ArrayList; /** @@ -55,6 +52,7 @@ public class UnlockMethodCache { private boolean mTrustManaged; private boolean mTrusted; private boolean mDebugUnlocked = false; + private boolean mFaceAuthEnabled; private UnlockMethodCache(Context ctx) { mLockPatternUtils = new LockPatternUtils(ctx); @@ -110,6 +108,13 @@ public class UnlockMethodCache { mListeners.remove(listener); } + /** + * If there are faces enrolled and user enabled face auth on keyguard. + */ + public boolean isFaceAuthEnabled() { + return mFaceAuthEnabled; + } + private void update(boolean updateAlways) { Trace.beginSection("UnlockMethodCache#update"); int user = KeyguardUpdateMonitor.getCurrentUser(); @@ -118,13 +123,16 @@ public class UnlockMethodCache { || (Build.IS_DEBUGGABLE && DEBUG_AUTH_WITH_ADB && mDebugUnlocked); boolean trustManaged = mKeyguardUpdateMonitor.getUserTrustIsManaged(user); boolean trusted = mKeyguardUpdateMonitor.getUserHasTrust(user); - boolean changed = secure != mSecure || canSkipBouncer != mCanSkipBouncer || - trustManaged != mTrustManaged; + boolean faceAuthEnabled = mKeyguardUpdateMonitor.isFaceAuthEnabledForUser(user); + boolean changed = secure != mSecure || canSkipBouncer != mCanSkipBouncer + || trustManaged != mTrustManaged + || mFaceAuthEnabled != faceAuthEnabled; if (changed || updateAlways) { mSecure = secure; mCanSkipBouncer = canSkipBouncer; mTrusted = trusted; mTrustManaged = trustManaged; + mFaceAuthEnabled = faceAuthEnabled; notifyListeners(); } Trace.endSection(); @@ -136,6 +144,16 @@ public class UnlockMethodCache { } } + public void dump(PrintWriter pw) { + pw.println("UnlockMethodCache"); + pw.println(" mSecure: " + mSecure); + pw.println(" mCanSkipBouncer: " + mCanSkipBouncer); + pw.println(" mTrustManaged: " + mTrustManaged); + pw.println(" mTrusted: " + mTrusted); + pw.println(" mDebugUnlocked: " + mDebugUnlocked); + pw.println(" mFaceAuthEnabled: " + mFaceAuthEnabled); + } + private final KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() { @Override public void onUserSwitchComplete(int userId) { @@ -187,6 +205,11 @@ public class UnlockMethodCache { public void onKeyguardVisibilityChanged(boolean showing) { update(false /* updateAlways */); } + + @Override + public void onBiometricsCleared() { + update(false /* alwaysUpdate */); + } }; public boolean isTrustManaged() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java index d1a225320eb7..b84dc476dd6f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java @@ -356,6 +356,10 @@ public abstract class HeadsUpManager extends AlertingNotificationManager { public void onDensityOrFontScaleChanged() { } + public boolean isEntryAutoHeadsUpped(String key) { + return false; + } + /** * This represents a notification and how long it is in a heads up mode. It also manages its * lifecycle automatically when created. @@ -416,16 +420,17 @@ public abstract class HeadsUpManager extends AlertingNotificationManager { @Override protected long calculateFinishTime() { - return mPostTime + getRecommendedTimeoutMillis(); + return mPostTime + getRecommendedHeadsUpTimeoutMs(mAutoDismissNotificationDecay); } /** * Get user-preferred or default timeout duration. The larger one will be returned. * @return milliseconds before auto-dismiss + * @param requestedTimeout */ - private int getRecommendedTimeoutMillis() { + protected int getRecommendedHeadsUpTimeoutMs(int requestedTimeout) { return mAccessibilityMgr.getRecommendedTimeoutMillis( - mAutoDismissNotificationDecay, + requestedTimeout, AccessibilityManager.FLAG_CONTENT_CONTROLS | AccessibilityManager.FLAG_CONTENT_ICONS | AccessibilityManager.FLAG_CONTENT_TEXT); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java index 01498e6bd54d..070136ec94c1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java @@ -29,6 +29,19 @@ public interface KeyguardMonitor extends CallbackController<Callback> { long getKeyguardFadingAwayDelay(); long calculateGoingToFullShadeDelay(); + /** + * @return a shortened fading away duration similar to + * {{@link #getKeyguardFadingAwayDuration()}} which may only span half of the duration, unless + * we're bypassing + */ + default long getShortenedFadingAwayDuration() { + if (isBypassFadingAnimation()) { + return getKeyguardFadingAwayDuration(); + } else { + return getKeyguardFadingAwayDuration() / 2; + } + } + default boolean isDeviceInteractive() { return false; } @@ -39,7 +52,21 @@ public interface KeyguardMonitor extends CallbackController<Callback> { default void notifyKeyguardGoingAway(boolean b) { } - default void notifyKeyguardFadingAway(long delay, long fadeoutDuration) { + /** + * @return {@code true} if the current fading away animation is the fast bypass fading. + */ + default boolean isBypassFadingAnimation() { + return false; + } + + /** + * Notifies that the Keyguard is fading away with the specified timings. + * @param delay the precalculated animation delay in milliseconds + * @param fadeoutDuration the duration of the exit animation, in milliseconds + * @param isBypassFading is this a fading away animation while bypassing + */ + default void notifyKeyguardFadingAway(long delay, long fadeoutDuration, + boolean isBypassFading) { } default void notifyKeyguardDoneFading() { @@ -50,5 +77,6 @@ public interface KeyguardMonitor extends CallbackController<Callback> { interface Callback { void onKeyguardShowingChanged(); + default void onKeyguardFadingAwayChanged() {} } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java index b53ff0e45cea..8829be4ee0f8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java @@ -54,6 +54,7 @@ public class KeyguardMonitorImpl extends KeyguardUpdateMonitorCallback private long mKeyguardFadingAwayDuration; private boolean mKeyguardGoingAway; private boolean mLaunchTransitionFadingAway; + private boolean mBypassFadingAnimation; /** */ @@ -140,15 +141,26 @@ public class KeyguardMonitorImpl extends KeyguardUpdateMonitorCallback new ArrayList<>(mCallbacks).forEach(Callback::onKeyguardShowingChanged); } - public void notifyKeyguardFadingAway(long delay, long fadeoutDuration) { - mKeyguardFadingAway = true; + public void notifyKeyguardFadingAway(long delay, long fadeoutDuration, boolean isBypassFading) { + setKeyguardFadingAway(true); mKeyguardFadingAwayDelay = delay; mKeyguardFadingAwayDuration = fadeoutDuration; + mBypassFadingAnimation = isBypassFading; + } + + private void setKeyguardFadingAway(boolean keyguardFadingAway) { + if (mKeyguardFadingAway != keyguardFadingAway) { + mKeyguardFadingAway = keyguardFadingAway; + ArrayList<Callback> callbacks = new ArrayList<>(mCallbacks); + for (int i = 0; i < callbacks.size(); i++) { + callbacks.get(i).onKeyguardFadingAwayChanged(); + } + } } public void notifyKeyguardDoneFading() { - mKeyguardFadingAway = false; mKeyguardGoingAway = false; + setKeyguardFadingAway(false); } @Override @@ -162,6 +174,11 @@ public class KeyguardMonitorImpl extends KeyguardUpdateMonitorCallback } @Override + public boolean isBypassFadingAnimation() { + return mBypassFadingAnimation; + } + + @Override public long getKeyguardFadingAwayDelay() { return mKeyguardFadingAwayDelay; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 13f93b923505..45627631efe1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -163,7 +163,8 @@ public class MobileSignalController extends SignalController< | PhoneStateListener.LISTEN_CALL_STATE | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE | PhoneStateListener.LISTEN_DATA_ACTIVITY - | PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE); + | PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE + | PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE); mContext.getContentResolver().registerContentObserver(Global.getUriFor(Global.MOBILE_DATA), true, mObserver); mContext.getContentResolver().registerContentObserver(Global.getUriFor( @@ -376,9 +377,9 @@ public class MobileSignalController extends SignalController< } private void updateDataSim() { - int defaultDataSub = mDefaults.getDefaultDataSubId(); - if (SubscriptionManager.isValidSubscriptionId(defaultDataSub)) { - mCurrentState.dataSim = defaultDataSub == mSubscriptionInfo.getSubscriptionId(); + int activeDataSubId = mDefaults.getActiveDataSubId(); + if (SubscriptionManager.isValidSubscriptionId(activeDataSubId)) { + mCurrentState.dataSim = activeDataSubId == mSubscriptionInfo.getSubscriptionId(); } else { // There doesn't seem to be a data sim selected, however if // there isn't a MobileSignalController with dataSim set, then @@ -636,6 +637,13 @@ public class MobileSignalController extends SignalController< updateTelephony(); } + + @Override + public void onActiveDataSubscriptionIdChanged(int subId) { + if (DEBUG) Log.d(mTag, "onActiveDataSubscriptionIdChanged: subId=" + subId); + updateDataSim(); + updateTelephony(); + } }; static class MobileIconGroup extends SignalController.IconGroup { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index b2972fcd1286..d545dc8f7428 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -361,7 +361,7 @@ public class NetworkControllerImpl extends BroadcastReceiver } private MobileSignalController getDataController() { - int dataSubId = mSubDefaults.getDefaultDataSubId(); + int dataSubId = mSubDefaults.getActiveDataSubId(); if (!SubscriptionManager.isValidSubscriptionId(dataSubId)) { if (DEBUG) Log.e(TAG, "No data sim selected"); return mDefaultSignalController; @@ -1098,6 +1098,10 @@ public class NetworkControllerImpl extends BroadcastReceiver public int getDefaultDataSubId() { return SubscriptionManager.getDefaultDataSubscriptionId(); } + + public int getActiveDataSubId() { + return SubscriptionManager.getActiveDataSubscriptionId(); + } } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnHeadsUpChangedListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnHeadsUpChangedListener.java index 438226ae082d..94aa39142926 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnHeadsUpChangedListener.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/OnHeadsUpChangedListener.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.policy; +import android.annotation.NonNull; + import com.android.systemui.statusbar.notification.collection.NotificationEntry; /** @@ -45,5 +47,5 @@ public interface OnHeadsUpChangedListener { * @param entry the entry of the changed notification * @param isHeadsUp whether the notification is now a headsUp notification */ - default void onHeadsUpStateChanged(NotificationEntry entry, boolean isHeadsUp) {} + default void onHeadsUpStateChanged(@NonNull NotificationEntry entry, boolean isHeadsUp) {} } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java index 640f0f0cc3f6..282d28c3b20c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java @@ -303,7 +303,7 @@ public class SmartReplyView extends ViewGroup { }; OnClickListener onClickListener = view -> - smartReplyView.mKeyguardDismissUtil.executeWhenUnlocked(action); + smartReplyView.mKeyguardDismissUtil.executeWhenUnlocked(action, !entry.isRowPinned()); if (useDelayedOnClickListener) { onClickListener = new DelayedOnClickListener(onClickListener, smartReplyView.mConstants.getOnClickInitDelay()); diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayManager.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayManager.java index 930016be2d22..41e026af7c72 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayManager.java +++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayManager.java @@ -172,10 +172,15 @@ class ThemeOverlayManager { private void setEnabledAsync(String pkg, UserHandle userHandle, boolean enabled) { mExecutor.execute(() -> { if (DEBUG) Log.d(TAG, String.format("setEnabled: %s %s %b", pkg, userHandle, enabled)); - if (enabled) { - mOverlayManager.setEnabledExclusiveInCategory(pkg, userHandle); - } else { - mOverlayManager.setEnabled(pkg, false, userHandle); + try { + if (enabled) { + mOverlayManager.setEnabledExclusiveInCategory(pkg, userHandle); + } else { + mOverlayManager.setEnabled(pkg, false, userHandle); + } + } catch (IllegalStateException e) { + Log.e(TAG, + String.format("setEnabled failed: %s %s %b", pkg, userHandle, enabled), e); } }); } diff --git a/packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java b/packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java index 31f4991a82b5..b9c5ee5a7a7e 100644 --- a/packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java +++ b/packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java @@ -156,17 +156,21 @@ public class AsyncSensorManager extends SensorManager * Requests for all sensors that match the given type from all plugins. * @param sensor * @param listener + * @return true if there were plugins to register the listener to */ - public void registerPluginListener(SensorManagerPlugin.Sensor sensor, + public boolean registerPluginListener(SensorManagerPlugin.Sensor sensor, SensorManagerPlugin.SensorEventListener listener) { if (mPlugins.isEmpty()) { Log.w(TAG, "No plugins registered"); + return false; } mHandler.post(() -> { for (int i = 0; i < mPlugins.size(); i++) { mPlugins.get(i).registerListener(sensor, listener); } }); + + return true; } /** diff --git a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java index d521e5534ad4..ede30046d6c3 100644 --- a/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java +++ b/packages/SystemUI/src/com/android/systemui/util/InjectionInflationController.java @@ -32,6 +32,7 @@ import com.android.systemui.qs.QSFooterImpl; import com.android.systemui.qs.QSPanel; import com.android.systemui.qs.QuickQSPanel; import com.android.systemui.qs.QuickStatusBarHeader; +import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.phone.LockIcon; import com.android.systemui.statusbar.phone.NotificationPanelView; @@ -138,6 +139,11 @@ public class InjectionInflationController { QSCarrierGroup createQSCarrierGroup(); /** + * Creates the Shelf. + */ + NotificationShelf creatNotificationShelf(); + + /** * Creates the KeyguardClockSwitch. */ KeyguardClockSwitch createKeyguardClockSwitch(); diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java index 69d2e31135e8..d3862b6eed81 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java @@ -43,6 +43,7 @@ import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.UserHandle; import android.os.VibrationEffect; import android.os.Vibrator; import android.provider.Settings; @@ -272,14 +273,14 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa } public boolean areCaptionsEnabled() { - int currentValue = Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.ODI_CAPTIONS_ENABLED, 0); + int currentValue = Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.ODI_CAPTIONS_ENABLED, 0, UserHandle.USER_CURRENT); return currentValue == 1; } public void setCaptionsEnabled(boolean isEnabled) { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.ODI_CAPTIONS_ENABLED, isEnabled ? 1 : 0); + Settings.Secure.putIntForUser(mContext.getContentResolver(), + Settings.Secure.ODI_CAPTIONS_ENABLED, isEnabled ? 1 : 0, UserHandle.USER_CURRENT); } @Override diff --git a/packages/SystemUI/tests/res/values/overlayable_icons_test.xml b/packages/SystemUI/tests/res/values/overlayable_icons_test.xml index ba651ac82dc9..24cd8cb23ed8 100644 --- a/packages/SystemUI/tests/res/values/overlayable_icons_test.xml +++ b/packages/SystemUI/tests/res/values/overlayable_icons_test.xml @@ -59,6 +59,8 @@ <item>@drawable/ic_volume_bt_sco</item> <item>@drawable/ic_volume_media</item> <item>@drawable/ic_volume_media_mute</item> + <item>@drawable/ic_volume_odi_captions</item> + <item>@drawable/ic_volume_odi_captions_disabled</item> <item>@drawable/ic_volume_ringer</item> <item>@drawable/ic_volume_ringer_mute</item> <item>@drawable/ic_volume_ringer_vibrate</item> diff --git a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java index db45ad788bfc..0044ca7c0409 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java @@ -36,6 +36,7 @@ import android.content.Context; import android.net.ConnectivityManager; import android.net.wifi.WifiManager; import android.os.Handler; +import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; @@ -65,6 +66,8 @@ import java.util.List; public class CarrierTextControllerTest extends SysuiTestCase { private static final CharSequence SEPARATOR = " \u2014 "; + private static final CharSequence INVALID_CARD_TEXT = "Invalid card"; + private static final CharSequence AIRPLANE_MODE_TEXT = "Airplane mode"; private static final String TEST_CARRIER = "TEST_CARRIER"; private static final String TEST_CARRIER_2 = "TEST_CARRIER_2"; private static final String TEST_GROUP_UUID = "59b5c870-fc4c-47a4-a99e-9db826b48b24"; @@ -106,6 +109,10 @@ public class CarrierTextControllerTest extends SysuiTestCase { mContext.addMockSystemService(ConnectivityManager.class, mConnectivityManager); mContext.addMockSystemService(TelephonyManager.class, mTelephonyManager); mContext.addMockSystemService(SubscriptionManager.class, mSubscriptionManager); + mContext.getOrCreateTestableResources().addOverride( + R.string.keyguard_sim_error_message_short, INVALID_CARD_TEXT); + mContext.getOrCreateTestableResources().addOverride( + R.string.airplane_mode, AIRPLANE_MODE_TEXT); mDependency.injectMockDependency(WakefulnessLifecycle.class); mDependency.injectTestDependency(Dependency.MAIN_HANDLER, new Handler(mTestableLooper.getLooper())); @@ -122,6 +129,53 @@ public class CarrierTextControllerTest extends SysuiTestCase { } @Test + public void testAirplaneMode() { + Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1); + reset(mCarrierTextCallback); + List<SubscriptionInfo> list = new ArrayList<>(); + list.add(TEST_SUBSCRIPTION); + when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(list); + when(mKeyguardUpdateMonitor.getSimState(0)).thenReturn(IccCardConstants.State.READY); + mKeyguardUpdateMonitor.mServiceStates = new HashMap<>(); + + mCarrierTextController.updateCarrierText(); + + ArgumentCaptor<CarrierTextController.CarrierTextCallbackInfo> captor = + ArgumentCaptor.forClass( + CarrierTextController.CarrierTextCallbackInfo.class); + + mTestableLooper.processAllMessages(); + verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); + assertEquals(AIRPLANE_MODE_TEXT, captor.getValue().carrierText); + } + + @Test + public void testCardIOError() { + reset(mCarrierTextCallback); + List<SubscriptionInfo> list = new ArrayList<>(); + list.add(TEST_SUBSCRIPTION); + when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(list); + when(mKeyguardUpdateMonitor.getSimState(0)).thenReturn(IccCardConstants.State.READY); + when(mKeyguardUpdateMonitor.getSimState(1)).thenReturn( + IccCardConstants.State.CARD_IO_ERROR); + mKeyguardUpdateMonitor.mServiceStates = new HashMap<>(); + + mCarrierTextController.mCallback.onSimStateChanged(3, 1, + IccCardConstants.State.CARD_IO_ERROR); + + ArgumentCaptor<CarrierTextController.CarrierTextCallbackInfo> captor = + ArgumentCaptor.forClass( + CarrierTextController.CarrierTextCallbackInfo.class); + + mTestableLooper.processAllMessages(); + verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); + assertEquals("TEST_CARRIER" + SEPARATOR + INVALID_CARD_TEXT, captor.getValue().carrierText); + // There's only one subscription in the list + assertEquals(1, captor.getValue().listOfCarriers.length); + assertEquals(TEST_CARRIER, captor.getValue().listOfCarriers[0]); + } + + @Test public void testWrongSlots() { reset(mCarrierTextCallback); when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn( diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index 6208ab82dda6..db6177a63f96 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; @@ -52,6 +53,7 @@ import com.android.internal.telephony.IccCardConstants; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.TelephonyIntents; import com.android.systemui.SysuiTestCase; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import org.junit.Assert; import org.junit.Before; @@ -88,6 +90,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { private UserManager mUserManager; @Mock private DevicePolicyManager mDevicePolicyManager; + @Mock + private KeyguardBypassController mKeyguardBypassController; private TestableLooper mTestableLooper; private TestableKeyguardUpdateMonitor mKeyguardUpdateMonitor; @@ -99,7 +103,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { when(context.getPackageManager()).thenReturn(mPackageManager); doAnswer(invocation -> { IBiometricEnabledOnKeyguardCallback callback = invocation.getArgument(0); - callback.onChanged(BiometricSourceType.FACE, true /* enabled */); + callback.onChanged(BiometricSourceType.FACE, true /* enabled */, + KeyguardUpdateMonitor.getCurrentUser()); return null; }).when(mBiometricManager).registerEnabledOnKeyguardCallback(any()); when(mFaceManager.isHardwareDetected()).thenReturn(true); @@ -314,13 +319,44 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { @Test public void skipsAuthentication_whenEncryptedKeyguard() { - reset(mUserManager); - when(mUserManager.isUserUnlocked(anyInt())).thenReturn(false); + when(mStrongAuthTracker.getStrongAuthForUser(anyInt())).thenReturn( + KeyguardUpdateMonitor.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT); + mKeyguardUpdateMonitor.setKeyguardBypassController(mKeyguardBypassController); mKeyguardUpdateMonitor.dispatchStartedWakingUp(); mTestableLooper.processAllMessages(); mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(true); - verify(mFaceManager, never()).authenticate(any(), any(), anyInt(), any(), any()); + verify(mFaceManager, never()).authenticate(any(), any(), anyInt(), any(), any(), anyInt()); + } + + @Test + public void requiresAuthentication_whenEncryptedKeyguard_andBypass() { + testStrongAuthExceptOnBouncer( + KeyguardUpdateMonitor.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT); + } + + @Test + public void requiresAuthentication_whenTimeoutKeyguard_andBypass() { + testStrongAuthExceptOnBouncer( + KeyguardUpdateMonitor.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_TIMEOUT); + } + + private void testStrongAuthExceptOnBouncer(int strongAuth) { + when(mKeyguardBypassController.canBypass()).thenReturn(true); + mKeyguardUpdateMonitor.setKeyguardBypassController(mKeyguardBypassController); + when(mStrongAuthTracker.getStrongAuthForUser(anyInt())).thenReturn(strongAuth); + + mKeyguardUpdateMonitor.dispatchStartedWakingUp(); + mTestableLooper.processAllMessages(); + mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(true); + verify(mFaceManager).authenticate(any(), any(), anyInt(), any(), any(), anyInt()); + + // Stop scanning when bouncer becomes visible + mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(true /* showingBouncer */); + mTestableLooper.processAllMessages(); + clearInvocations(mFaceManager); + mKeyguardUpdateMonitor.requestFaceAuth(); + verify(mFaceManager, never()).authenticate(any(), any(), anyInt(), any(), any(), anyInt()); } @Test @@ -332,6 +368,50 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { } @Test + public void testTriesToAuthenticate_whenTrustOnAgentKeyguard_ifBypass() { + mKeyguardUpdateMonitor.setKeyguardBypassController(mKeyguardBypassController); + mKeyguardUpdateMonitor.dispatchStartedWakingUp(); + mTestableLooper.processAllMessages(); + when(mKeyguardBypassController.canBypass()).thenReturn(true); + mKeyguardUpdateMonitor.onTrustChanged(true /* enabled */, + KeyguardUpdateMonitor.getCurrentUser(), 0 /* flags */); + mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(true); + verify(mFaceManager).authenticate(any(), any(), anyInt(), any(), any(), anyInt()); + } + + @Test + public void testIgnoresAuth_whenTrustAgentOnKeyguard_withoutBypass() { + mKeyguardUpdateMonitor.dispatchStartedWakingUp(); + mTestableLooper.processAllMessages(); + mKeyguardUpdateMonitor.onTrustChanged(true /* enabled */, + KeyguardUpdateMonitor.getCurrentUser(), 0 /* flags */); + mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(true); + verify(mFaceManager, never()).authenticate(any(), any(), anyInt(), any(), any(), anyInt()); + } + + @Test + public void testIgnoresAuth_whenLockdown() { + mKeyguardUpdateMonitor.dispatchStartedWakingUp(); + mTestableLooper.processAllMessages(); + when(mStrongAuthTracker.getStrongAuthForUser(anyInt())).thenReturn( + KeyguardUpdateMonitor.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); + + mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(true); + verify(mFaceManager, never()).authenticate(any(), any(), anyInt(), any(), any(), anyInt()); + } + + @Test + public void testIgnoresAuth_whenLockout() { + mKeyguardUpdateMonitor.dispatchStartedWakingUp(); + mTestableLooper.processAllMessages(); + when(mStrongAuthTracker.getStrongAuthForUser(anyInt())).thenReturn( + KeyguardUpdateMonitor.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT); + + mKeyguardUpdateMonitor.onKeyguardVisibilityChanged(true); + verify(mFaceManager, never()).authenticate(any(), any(), anyInt(), any(), any(), anyInt()); + } + + @Test public void testOnFaceAuthenticated_skipsFaceWhenAuthenticated() { mKeyguardUpdateMonitor.onFaceAuthenticated(KeyguardUpdateMonitor.getCurrentUser()); mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(true); diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/AnalogClockControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/AnalogClockControllerTest.java index 3f48ea7e23ad..ef3af8a3c9bc 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/clock/AnalogClockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/AnalogClockControllerTest.java @@ -18,6 +18,7 @@ package com.android.keyguard.clock; import static com.google.common.truth.Truth.assertThat; import android.content.res.Resources; +import android.graphics.Color; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; @@ -67,9 +68,9 @@ public final class AnalogClockControllerTest extends SysuiTestCase { public void setColorPalette_setDigitalClock() { ViewGroup smallClock = (ViewGroup) mClockController.getView(); // WHEN color palette is set - mClockController.setColorPalette(true, new int[]{42}); + mClockController.setColorPalette(true, new int[]{Color.RED}); // THEN child of small clock should have text color set. TextView digitalClock = (TextView) smallClock.getChildAt(0); - assertThat(digitalClock.getCurrentTextColor()).isEqualTo(42); + assertThat(digitalClock.getCurrentTextColor()).isEqualTo(Color.RED); } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java index 90083b42749e..b56986eb80d0 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/BubbleClockControllerTest.java @@ -18,6 +18,7 @@ package com.android.keyguard.clock; import static com.google.common.truth.Truth.assertThat; import android.content.res.Resources; +import android.graphics.Color; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; @@ -66,9 +67,9 @@ public final class BubbleClockControllerTest extends SysuiTestCase { public void setColorPalette_setDigitalClock() { ViewGroup smallClock = (ViewGroup) mClockController.getView(); // WHEN text color is set - mClockController.setColorPalette(true, new int[]{42}); + mClockController.setColorPalette(true, new int[]{Color.RED}); // THEN child of small clock should have text color set. TextView digitalClock = (TextView) smallClock.getChildAt(0); - assertThat(digitalClock.getCurrentTextColor()).isEqualTo(42); + assertThat(digitalClock.getCurrentTextColor()).isEqualTo(Color.RED); } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockPaletteTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockPaletteTest.kt new file mode 100644 index 000000000000..347b26deacd4 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockPaletteTest.kt @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2019 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.clock + +import android.graphics.Color +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidTestingRunner::class) +@SmallTest +class ClockPaletteTest : SysuiTestCase() { + + private lateinit var clockPalette: ClockPalette + private lateinit var colors: IntArray + + @Before + fun setUp() { + clockPalette = ClockPalette() + // colors used are reds from light to dark. + val hsv: FloatArray = FloatArray(3) + Color.colorToHSV(Color.RED, hsv) + colors = IntArray(10) + val step: Float = (0f - hsv[2]) / colors.size + for (i in 0 until colors.size) { + hsv[2] += step + colors[i] = Color.HSVToColor(hsv) + } + } + + @Test + fun testDark() { + // GIVEN on AOD + clockPalette.setDarkAmount(1f) + // AND GIVEN that wallpaper doesn't support dark text + clockPalette.setColorPalette(false, colors) + // THEN the secondary color should be lighter than the primary color + assertThat(value(clockPalette.getPrimaryColor())) + .isGreaterThan(value(clockPalette.getSecondaryColor())) + } + + @Test + fun testDarkText() { + // GIVEN on lock screen + clockPalette.setDarkAmount(0f) + // AND GIVEN that wallpaper supports dark text + clockPalette.setColorPalette(true, colors) + // THEN the secondary color should be darker the primary color + assertThat(value(clockPalette.getPrimaryColor())) + .isLessThan(value(clockPalette.getSecondaryColor())) + } + + @Test + fun testLightText() { + // GIVEN on lock screen + clockPalette.setDarkAmount(0f) + // AND GIVEN that wallpaper doesn't support dark text + clockPalette.setColorPalette(false, colors) + // THEN the secondary color should be darker than the primary color + assertThat(value(clockPalette.getPrimaryColor())) + .isGreaterThan(value(clockPalette.getSecondaryColor())) + } + + @Test + fun testNullColors() { + // GIVEN on AOD + clockPalette.setDarkAmount(1f) + // AND GIVEN that wallpaper colors are null + clockPalette.setColorPalette(false, null) + // THEN the primary color should be whilte + assertThat(clockPalette.getPrimaryColor()).isEqualTo(Color.WHITE) + } + + private fun value(color: Int): Float { + val hsv: FloatArray = FloatArray(3) + Color.colorToHSV(color, hsv) + return hsv[2] + } +} diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/SettingsWrapperTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/clock/SettingsWrapperTest.kt new file mode 100644 index 000000000000..573581dae3b1 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/SettingsWrapperTest.kt @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2019 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.clock + +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.google.common.truth.Truth.assertThat +import org.json.JSONObject +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito.mock +import org.mockito.Mockito.never +import org.mockito.Mockito.verify + +private const val PACKAGE = "com.android.keyguard.clock.Clock" +private const val CLOCK_FIELD = "clock" +private const val TIMESTAMP_FIELD = "_applied_timestamp" +private const val USER_ID = 0 + +@RunWith(AndroidTestingRunner::class) +@SmallTest +class SettingsWrapperTest : SysuiTestCase() { + + private lateinit var wrapper: SettingsWrapper + private lateinit var migration: SettingsWrapper.Migration + + @Before + fun setUp() { + migration = mock(SettingsWrapper.Migration::class.java) + wrapper = SettingsWrapper(getContext().contentResolver, migration) + } + + @Test + fun testDecodeUnnecessary() { + // GIVEN a settings value that doesn't need to be decoded + val value = PACKAGE + // WHEN the value is decoded + val decoded = wrapper.decode(value, USER_ID) + // THEN the same value is returned, because decoding isn't necessary. + // TODO(b/135674383): Null should be returned when the migration code in removed. + assertThat(decoded).isEqualTo(value) + // AND the value is migrated to JSON format + verify(migration).migrate(value, USER_ID) + } + + @Test + fun testDecodeJSON() { + // GIVEN a settings value that is encoded in JSON + val json: JSONObject = JSONObject() + json.put(CLOCK_FIELD, PACKAGE) + json.put(TIMESTAMP_FIELD, System.currentTimeMillis()) + val value = json.toString() + // WHEN the value is decoded + val decoded = wrapper.decode(value, USER_ID) + // THEN the clock field should have been extracted + assertThat(decoded).isEqualTo(PACKAGE) + } + + @Test + fun testDecodeJSONWithoutClockField() { + // GIVEN a settings value that doesn't contain the CLOCK_FIELD + val json: JSONObject = JSONObject() + json.put(TIMESTAMP_FIELD, System.currentTimeMillis()) + val value = json.toString() + // WHEN the value is decoded + val decoded = wrapper.decode(value, USER_ID) + // THEN null is returned + assertThat(decoded).isNull() + // AND the value is not migrated to JSON format + verify(migration, never()).migrate(value, USER_ID) + } + + @Test + fun testDecodeNullJSON() { + assertThat(wrapper.decode(null, USER_ID)).isNull() + } +} diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/SmallClockPositionTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/clock/SmallClockPositionTest.kt index f4d59ccb372e..456f32b4bd40 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/clock/SmallClockPositionTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/SmallClockPositionTest.kt @@ -52,8 +52,8 @@ class SmallClockPositionTest : SysuiTestCase() { fun darkPosition() { // GIVEN on AOD position.setDarkAmount(1f) - // THEN Y position is statusBarHeight + lockPadding + burnInY (100 + 15 + 20 = 135) - assertThat(position.preferredY).isEqualTo(135) + // THEN Y is sum of statusBarHeight, lockPadding, lockHeight, lockPadding, burnInY + assertThat(position.preferredY).isEqualTo(185) } @Test @@ -64,4 +64,4 @@ class SmallClockPositionTest : SysuiTestCase() { // (100 + 15 + 35 + 15 = 165) assertThat(position.preferredY).isEqualTo(165) } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/IconPackOverlayTest.java b/packages/SystemUI/tests/src/com/android/systemui/IconPackOverlayTest.java new file mode 100644 index 000000000000..ccc9afcd4296 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/IconPackOverlayTest.java @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2019 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; + +import static junit.framework.Assert.fail; + +import static org.junit.Assert.assertEquals; + +import android.annotation.DrawableRes; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.text.TextUtils; +import android.util.TypedValue; + +import androidx.test.filters.MediumTest; +import androidx.test.runner.AndroidJUnit4; + +import com.android.internal.util.XmlUtils; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; + +@RunWith(AndroidJUnit4.class) +@MediumTest +public class IconPackOverlayTest extends SysuiTestCase { + + private static final String[] ICON_PACK_OVERLAY_PACKAGES = { + "com.android.theme.icon_pack.circular.systemui", + "com.android.theme.icon_pack.rounded.systemui", + "com.android.theme.icon_pack.filled.systemui", + }; + + private static final int[] VECTOR_ATTRIBUTES = { + android.R.attr.tint, + android.R.attr.height, + android.R.attr.width, + android.R.attr.alpha, + android.R.attr.autoMirrored, + }; + + private final TypedValue mTargetTypedValue = new TypedValue(); + private final TypedValue mOverlayTypedValue = new TypedValue(); + + private Resources mResources; + private TypedArray mOverlayableIcons; + + @Before + public void setup() { + mResources = mContext.getResources(); + mOverlayableIcons = mResources.obtainTypedArray(R.array.overlayable_icons); + } + + @After + public void teardown() { + mOverlayableIcons.recycle(); + } + + /** + * Ensure that all icons contained in overlayable_icons_test.xml exist in all 3 overlay icon + * packs for systemui. This test fails if you remove or rename an overlaid icon. If so, + * make the same change to the corresponding drawables in {@link #ICON_PACK_OVERLAY_PACKAGES}. + */ + @Test + public void testIconPack_containAllOverlayedIcons() { + StringBuilder errors = new StringBuilder(); + + for (String overlayPackage : ICON_PACK_OVERLAY_PACKAGES) { + Resources overlayResources; + try { + overlayResources = mContext.getPackageManager() + .getResourcesForApplication(overlayPackage); + } catch (PackageManager.NameNotFoundException e) { + continue; // No need to test overlay resources if apk is not on the system. + } + + for (int i = 0; i < mOverlayableIcons.length(); i++) { + int sysuiRid = mOverlayableIcons.getResourceId(i, 0); + String sysuiResourceName = mResources.getResourceName(sysuiRid); + String overlayResourceName = sysuiResourceName + .replace(mContext.getPackageName(), overlayPackage); + if (overlayResources.getIdentifier(overlayResourceName, null, null) + == Resources.ID_NULL) { + errors.append(String.format("[%s] is not contained in overlay package [%s]", + overlayResourceName, overlayPackage)); + } + } + } + + if (!TextUtils.isEmpty(errors)) { + fail(errors.toString()); + } + } + + /** + * Ensures that all overlay icons have the same values for {@link #VECTOR_ATTRIBUTES} as the + * underlying drawable in systemui. To fix this test, make the attribute change to all of the + * corresponding drawables in {@link #ICON_PACK_OVERLAY_PACKAGES}. + */ + @Test + public void testIconPacks_haveEqualVectorDrawableAttributes() { + StringBuilder errors = new StringBuilder(); + + for (String overlayPackage : ICON_PACK_OVERLAY_PACKAGES) { + Resources overlayResources; + try { + overlayResources = mContext.getPackageManager() + .getResourcesForApplication(overlayPackage); + } catch (PackageManager.NameNotFoundException e) { + continue; // No need to test overlay resources if apk is not on the system. + } + + for (int i = 0; i < mOverlayableIcons.length(); i++) { + int sysuiRid = mOverlayableIcons.getResourceId(i, 0); + String sysuiResourceName = mResources.getResourceName(sysuiRid); + TypedArray sysuiAttrs = getAVDAttributes(mResources, sysuiRid); + if (sysuiAttrs == null) { + errors.append(String.format("[%s] does not exist or is not a valid AVD.", + sysuiResourceName)); + continue; + } + + String overlayResourceName = sysuiResourceName + .replace(mContext.getPackageName(), overlayPackage); + int overlayRid = overlayResources.getIdentifier(overlayResourceName, null, null); + TypedArray overlayAttrs = getAVDAttributes(overlayResources, overlayRid); + if (overlayAttrs == null) { + errors.append(String.format("[%s] does not exist or is not a valid AVD.", + overlayResourceName)); + continue; + } + + if (!attributesEquals(sysuiAttrs, overlayAttrs)) { + errors.append(String.format("[%s] AVD attributes do not match [%s]\n", + sysuiResourceName, overlayResourceName)); + } + sysuiAttrs.recycle(); + overlayAttrs.recycle(); + } + } + + if (!TextUtils.isEmpty(errors)) { + fail(errors.toString()); + } + } + + private TypedArray getAVDAttributes(Resources resources, @DrawableRes int rid) { + try { + XmlResourceParser parser = resources.getXml(rid); + XmlUtils.nextElement(parser); + return resources.obtainAttributes(parser, VECTOR_ATTRIBUTES); + } catch (XmlPullParserException | IOException | Resources.NotFoundException e) { + return null; + } + } + + private boolean attributesEquals(TypedArray target, TypedArray overlay) { + assertEquals(target.length(), overlay.length()); + for (int i = 0; i < target.length(); i++) { + target.getValue(i, mTargetTypedValue); + overlay.getValue(i, mOverlayTypedValue); + if (!attributesEquals(mTargetTypedValue, mOverlayTypedValue)) { + return false; + } + } + return true; + } + + private boolean attributesEquals(TypedValue target, TypedValue overlay) { + return target.type == overlay.type && target.data == overlay.data; + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java index bd7f897dc1c0..59d5c243af73 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java @@ -16,9 +16,8 @@ package com.android.systemui.appops; -import static junit.framework.TestCase.assertFalse; - import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java index b3f6f4ecdf0c..2221915a627a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java @@ -60,6 +60,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.NotificationPresenter; import com.android.systemui.statusbar.NotificationRemoveInterceptor; import com.android.systemui.statusbar.NotificationTestHelper; +import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.notification.NotificationEntryListener; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider; @@ -67,6 +68,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationData; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.phone.DozeParameters; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.StatusBarWindowController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.HeadsUpManager; @@ -105,6 +107,10 @@ public class BubbleControllerTest extends SysuiTestCase { private ZenModeController mZenModeController; @Mock private ZenModeConfig mZenModeConfig; + @Mock + private SysuiStatusBarStateController mStatusBarStateController; + @Mock + private KeyguardBypassController mKeyguardBypassController; private FrameLayout mStatusBarView; @Captor @@ -143,7 +149,8 @@ public class BubbleControllerTest extends SysuiTestCase { // Bubbles get added to status bar window view mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager, - mActivityManager, mDozeParameters); + mActivityManager, mDozeParameters, mStatusBarStateController, + mConfigurationController, mKeyguardBypassController); mStatusBarWindowController.add(mStatusBarView, 120 /* height */); // Need notifications for bubbles diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java index 9438cbb6ebcd..2ed0970ce44b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeConfigurationUtil.java @@ -24,6 +24,7 @@ import static org.mockito.Mockito.when; import static org.mockito.Mockito.withSettings; import com.android.systemui.statusbar.phone.DozeParameters; +import com.android.systemui.utils.hardware.FakeSensorManager; import org.mockito.Answers; import org.mockito.MockSettings; @@ -36,9 +37,10 @@ public class DozeConfigurationUtil { when(params.getPulseOnSigMotion()).thenReturn(false); when(params.getPickupVibrationThreshold()).thenReturn(0); when(params.getProxCheckBeforePulse()).thenReturn(true); - when(params.getPickupSubtypePerformsProxCheck(anyInt())).thenReturn(true); + when(params.getPickupPerformsProxCheck()).thenReturn(true); when(params.getPolicy()).thenReturn(mock(AlwaysOnDisplayPolicy.class)); when(params.doubleTapReportsTouchCoordinates()).thenReturn(false); + when(params.getDisplayNeedsBlanking()).thenReturn(false); doneHolder[0] = true; return params; @@ -52,11 +54,17 @@ public class DozeConfigurationUtil { when(config.pickupGestureEnabled(anyInt())).thenReturn(false); when(config.pulseOnNotificationEnabled(anyInt())).thenReturn(true); when(config.alwaysOnEnabled(anyInt())).thenReturn(false); + when(config.enabled(anyInt())).thenReturn(true); + when(config.getWakeLockScreenDebounce()).thenReturn(0L); when(config.doubleTapSensorType()).thenReturn(null); when(config.tapSensorType()).thenReturn(null); when(config.longPressSensorType()).thenReturn(null); + when(config.tapGestureEnabled(anyInt())).thenReturn(true); + when(config.tapSensorAvailable()).thenReturn(true); + when(config.tapSensorType()).thenReturn(FakeSensorManager.TAP_SENSOR_TYPE); + when(config.dozePickupSensorAvailable()).thenReturn(false); when(config.wakeScreenGestureAvailable()).thenReturn(false); diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java index 33042918cfc9..7df45a3d8949 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeSensorsTest.java @@ -23,6 +23,7 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -77,7 +78,9 @@ public class DozeSensorsTest extends SysuiTestCase { @Mock private AlwaysOnDisplayPolicy mAlwaysOnDisplayPolicy; @Mock - private TriggerSensor mMockTriggerSensor; + private TriggerSensor mTriggerSensor; + @Mock + private TriggerSensor mProxGatedTriggerSensor; private SensorManagerPlugin.SensorEventListener mWakeLockScreenListener; private TestableLooper mTestableLooper; private DozeSensors mDozeSensors; @@ -85,6 +88,7 @@ public class DozeSensorsTest extends SysuiTestCase { @Before public void setUp() { MockitoAnnotations.initMocks(this); + when(mProxGatedTriggerSensor.performsProxCheck()).thenReturn(true); mTestableLooper = TestableLooper.get(this); when(mAmbientDisplayConfiguration.getWakeLockScreenDebounce()).thenReturn(5000L); when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true); @@ -114,21 +118,34 @@ public class DozeSensorsTest extends SysuiTestCase { @Test public void testSetListening_firstTrue_registerSettingsObserver() { - mDozeSensors.mSensors = new TriggerSensor[] {mMockTriggerSensor}; - mDozeSensors.setListening(true); - verify(mMockTriggerSensor).registerSettingsObserver(any(ContentObserver.class)); + verify(mTriggerSensor).registerSettingsObserver(any(ContentObserver.class)); } @Test public void testSetListening_twiceTrue_onlyRegisterSettingsObserverOnce() { - mDozeSensors.mSensors = new TriggerSensor[] {mMockTriggerSensor}; mDozeSensors.setListening(true); - mDozeSensors.setListening(true); - verify(mMockTriggerSensor, times(1)).registerSettingsObserver(any(ContentObserver.class)); + verify(mTriggerSensor, times(1)).registerSettingsObserver(any(ContentObserver.class)); + } + + @Test + public void testSetPaused_onlyPausesNonGatedSensors() { + mDozeSensors.setListening(true); + verify(mTriggerSensor).setListening(eq(true)); + verify(mProxGatedTriggerSensor).setListening(eq(true)); + + clearInvocations(mTriggerSensor, mProxGatedTriggerSensor); + mDozeSensors.setPaused(true); + verify(mTriggerSensor).setListening(eq(false)); + verify(mProxGatedTriggerSensor).setListening(eq(true)); + + clearInvocations(mTriggerSensor, mProxGatedTriggerSensor); + mDozeSensors.setPaused(false); + verify(mTriggerSensor).setListening(eq(true)); + verify(mProxGatedTriggerSensor).setListening(eq(true)); } private class TestableDozeSensors extends DozeSensors { @@ -144,6 +161,7 @@ public class DozeSensorsTest extends SysuiTestCase { mWakeLockScreenListener = (PluginSensor) sensor; } } + mSensors = new TriggerSensor[] {mTriggerSensor, mProxGatedTriggerSensor}; } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java index 6979fd811817..d4642238d8fd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java @@ -19,6 +19,7 @@ package com.android.systemui.doze; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -27,18 +28,17 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AlarmManager; -import android.app.Instrumentation; +import android.hardware.Sensor; import android.hardware.display.AmbientDisplayConfiguration; import android.os.Handler; import android.os.Looper; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; -import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; -import com.android.systemui.dock.DockManagerFake; +import com.android.systemui.dock.DockManager; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.util.wakelock.WakeLock; import com.android.systemui.util.wakelock.WakeLockFake; @@ -46,14 +46,12 @@ import com.android.systemui.utils.hardware.FakeSensorManager; import org.junit.Before; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @SmallTest -@Ignore("failing") @RunWith(AndroidTestingRunner.class) -@RunWithLooper +@RunWithLooper(setAsMainLooper = true) public class DozeTriggersTest extends SysuiTestCase { private DozeTriggers mTriggers; private DozeMachine mMachine; @@ -61,10 +59,10 @@ public class DozeTriggersTest extends SysuiTestCase { private AmbientDisplayConfiguration mConfig; private DozeParameters mParameters; private FakeSensorManager mSensors; + private Sensor mTapSensor; private WakeLock mWakeLock; - private Instrumentation mInstrumentation; private AlarmManager mAlarmManager; - private DockManagerFake mDockManagerFake; + private DockManager mDockManagerFake; @BeforeClass public static void setupSuite() { @@ -74,15 +72,15 @@ public class DozeTriggersTest extends SysuiTestCase { @Before public void setUp() throws Exception { - mInstrumentation = InstrumentationRegistry.getInstrumentation(); mMachine = mock(DozeMachine.class); mAlarmManager = mock(AlarmManager.class); - mHost = new DozeHostFake(); + mHost = spy(new DozeHostFake()); mConfig = DozeConfigurationUtil.createMockConfig(); mParameters = DozeConfigurationUtil.createMockParameters(); - mSensors = new FakeSensorManager(mContext); + mSensors = spy(new FakeSensorManager(mContext)); + mTapSensor = mSensors.getFakeTapSensor().getSensor(); mWakeLock = new WakeLockFake(); - mDockManagerFake = spy(new DockManagerFake()); + mDockManagerFake = mock(DockManager.class); mTriggers = new DozeTriggers(mContext, mMachine, mHost, mAlarmManager, mConfig, mParameters, mSensors, Handler.createAsync(Looper.myLooper()), mWakeLock, true, @@ -95,29 +93,45 @@ public class DozeTriggersTest extends SysuiTestCase { mTriggers.transitionTo(DozeMachine.State.UNINITIALIZED, DozeMachine.State.INITIALIZED); mTriggers.transitionTo(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE); + clearInvocations(mMachine); - mHost.callback.onNotificationAlerted(); - + mHost.callback.onNotificationAlerted(null /* pulseSuppressedListener */); mSensors.getMockProximitySensor().sendProximityResult(false); /* Near */ verify(mMachine, never()).requestState(any()); verify(mMachine, never()).requestPulse(anyInt()); - mHost.callback.onNotificationAlerted(); - + mHost.callback.onNotificationAlerted(null /* pulseSuppressedListener */); mSensors.getMockProximitySensor().sendProximityResult(true); /* Far */ verify(mMachine).requestPulse(anyInt()); } @Test + public void testTransitionTo_disablesAndEnablesTouchSensors() { + when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE); + + mTriggers.transitionTo(DozeMachine.State.INITIALIZED, DozeMachine.State.DOZE); + verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor)); + + clearInvocations(mSensors); + mTriggers.transitionTo(DozeMachine.State.DOZE, + DozeMachine.State.DOZE_REQUEST_PULSE); + mTriggers.transitionTo(DozeMachine.State.DOZE_REQUEST_PULSE, + DozeMachine.State.DOZE_PULSING); + verify(mSensors).cancelTriggerSensor(any(), eq(mTapSensor)); + + clearInvocations(mSensors); + mTriggers.transitionTo(DozeMachine.State.DOZE_PULSING, DozeMachine.State.DOZE_PULSE_DONE); + verify(mSensors).requestTriggerSensor(any(), eq(mTapSensor)); + } + + @Test public void testDockEventListener_registerAndUnregister() { mTriggers.transitionTo(DozeMachine.State.UNINITIALIZED, DozeMachine.State.INITIALIZED); - verify(mDockManagerFake).addListener(any()); mTriggers.transitionTo(DozeMachine.State.DOZE, DozeMachine.State.FINISH); - verify(mDockManagerFake).removeListener(any()); } @@ -128,7 +142,6 @@ public class DozeTriggersTest extends SysuiTestCase { mTriggers.onSensor(DozeLog.REASON_SENSOR_DOUBLE_TAP, false /* sensorPerformedProxCheck */, 50 /* screenX */, 50 /* screenY */, null /* rawValues */); - verify(mMachine, never()).wakeUp(); } @@ -142,7 +155,7 @@ public class DozeTriggersTest extends SysuiTestCase { false /* sensorPerformedProxCheck */, 50 /* screenX */, 50 /* screenY */, null /* rawValues */); - verify(mHost).setAodDimmingScrim(eq(255)); + verify(mHost).setAodDimmingScrim(eq(1f)); verify(mMachine).wakeUp(); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java index a83c4b653ce7..9576cb2eec45 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java @@ -49,6 +49,8 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.phone.DozeParameters; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.util.wakelock.SettableWakeLock; @@ -77,11 +79,15 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Mock private StatusBarStateController mStatusBarStateController; @Mock + private KeyguardBypassController mKeyguardBypassController; + @Mock private ZenModeController mZenModeController; @Mock private SettableWakeLock mMediaWakeLock; @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor; + @Mock + private DozeParameters mDozeParameters; private TestableKeyguardSliceProvider mProvider; private boolean mIsZenMode; @@ -91,7 +97,8 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { mIsZenMode = false; mProvider = new TestableKeyguardSliceProvider(); mProvider.attachInfo(getContext(), null); - mProvider.initDependencies(mNotificationMediaManager, mStatusBarStateController); + mProvider.initDependencies(mNotificationMediaManager, mStatusBarStateController, + mKeyguardBypassController, mDozeParameters); SliceProvider.setSpecs(new HashSet<>(Arrays.asList(SliceSpecs.LIST))); } @@ -111,7 +118,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { } @Test - public void onBindSlice_readsMedia() { + public void onBindSlice_readsMedia_withoutBypass() { MediaMetadata metadata = mock(MediaMetadata.class); when(metadata.getText(any())).thenReturn("metadata"); mProvider.onDozingChanged(true); @@ -123,6 +130,19 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { } @Test + public void onBindSlice_readsMedia_withBypass_notDozing() { + MediaMetadata metadata = mock(MediaMetadata.class); + when(metadata.getText(any())).thenReturn("metadata"); + when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); + when(mDozeParameters.getAlwaysOn()).thenReturn(true); + mProvider.onMetadataOrStateChanged(metadata, PlaybackState.STATE_PLAYING); + mProvider.onBindSlice(mProvider.getUri()); + verify(metadata).getText(eq(MediaMetadata.METADATA_KEY_TITLE)); + verify(metadata).getText(eq(MediaMetadata.METADATA_KEY_ARTIST)); + verify(mNotificationMediaManager).getMediaIcon(); + } + + @Test public void cleansDateFormat() { mProvider.mKeyguardUpdateMonitorCallback.onTimeZoneChanged(null); TestableLooper.get(this).processAllMessages(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java index db4f5ffcdfeb..4eee23056bc2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java @@ -39,6 +39,7 @@ import com.android.systemui.DumpController; import com.android.systemui.R; import com.android.systemui.SystemUIFactory; import com.android.systemui.SysuiBaseFragmentTest; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.tileimpl.QSFactoryImpl; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.statusbar.phone.AutoTileManager; @@ -139,6 +140,7 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { new RemoteInputQuickSettingsDisabler(context, mock(ConfigurationController.class)), new InjectionInflationController(SystemUIFactory.getInstance().getRootComponent()), context, - mock(QSTileHost.class)); + mock(QSTileHost.class), + mock(StatusBarStateController.class)); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/recents/model/TaskKeyLruCacheTest.java b/packages/SystemUI/tests/src/com/android/systemui/shared/recents/model/TaskKeyLruCacheTest.java new file mode 100644 index 000000000000..eb71dd6ee677 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/recents/model/TaskKeyLruCacheTest.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2019 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.shared.recents.model; + + +import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertNull; + +import android.test.suitebuilder.annotation.SmallTest; + +import com.android.systemui.SysuiTestCase; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@SmallTest +@RunWith(JUnit4.class) +public class TaskKeyLruCacheTest extends SysuiTestCase { + private static int sCacheSize = 3; + private static int sIdTask1 = 1; + private static int sIdTask2 = 2; + private static int sIdTask3 = 3; + private static int sIdUser1 = 1; + + TaskKeyCache<Integer> mCache = new TaskKeyLruCache<>(sCacheSize, null); + Task.TaskKey mKey1; + Task.TaskKey mKey2; + Task.TaskKey mKey3; + + @Before + public void setup() { + mKey1 = new Task.TaskKey(sIdTask1, 0, null, null, sIdUser1, System.currentTimeMillis()); + mKey2 = new Task.TaskKey(sIdTask2, 0, null, null, sIdUser1, System.currentTimeMillis()); + mKey3 = new Task.TaskKey(sIdTask3, 0, null, null, sIdUser1, System.currentTimeMillis()); + } + + @Test + public void addSingleItem_get_success() { + mCache.put(mKey1, 1); + + assertEquals(1, (int) mCache.get(mKey1)); + } + + @Test + public void addSingleItem_getUninsertedItem_returnsNull() { + mCache.put(mKey1, 1); + + assertNull(mCache.get(mKey2)); + } + + @Test + public void emptyCache_get_returnsNull() { + assertNull(mCache.get(mKey1)); + } + + @Test + public void updateItem_get_returnsSecond() { + mCache.put(mKey1, 1); + mCache.put(mKey1, 2); + + assertEquals(2, (int) mCache.get(mKey1)); + assertEquals(1, mCache.mKeys.size()); + } + + @Test + public void fillCache_put_evictsOldest() { + mCache.put(mKey1, 1); + mCache.put(mKey2, 2); + mCache.put(mKey3, 3); + Task.TaskKey key4 = new Task.TaskKey(sIdTask3 + 1, 0, + null, null, sIdUser1, System.currentTimeMillis()); + mCache.put(key4, 4); + + assertNull(mCache.get(mKey1)); + assertEquals(3, mCache.mKeys.size()); + assertEquals(mKey2, mCache.mKeys.valueAt(0)); + } + + @Test + public void fillCache_remove_success() { + mCache.put(mKey1, 1); + mCache.put(mKey2, 2); + mCache.put(mKey3, 3); + + mCache.remove(mKey2); + + assertNull(mCache.get(mKey2)); + assertEquals(2, mCache.mKeys.size()); + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java index 5c1f473360b2..881cc3915880 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AlertingNotificationManagerTest.java @@ -64,7 +64,7 @@ public class AlertingNotificationManagerTest extends SysuiTestCase { protected static final int TEST_AUTO_DISMISS_TIME = 500; // Number of notifications to use in tests requiring multiple notifications private static final int TEST_NUM_NOTIFICATIONS = 4; - protected static final int TEST_TIMEOUT_TIME = 10000; + protected static final int TEST_TIMEOUT_TIME = 15000; protected final Runnable TEST_TIMEOUT_RUNNABLE = () -> mTimedOut = true; private AlertingNotificationManager mAlertingNotificationManager; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AmbientPulseManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/AmbientPulseManagerTest.java deleted file mode 100644 index 0b25a7c8e07c..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/AmbientPulseManagerTest.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.systemui.statusbar; - -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; - -import android.testing.AndroidTestingRunner; -import android.testing.TestableLooper; - -import androidx.test.filters.SmallTest; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -@SmallTest -@RunWith(AndroidTestingRunner.class) -@TestableLooper.RunWithLooper -public class AmbientPulseManagerTest extends AlertingNotificationManagerTest { - @Rule - public MockitoRule rule = MockitoJUnit.rule(); - - private static final int TEST_EXTENSION_TIME = 500; - private AmbientPulseManager mAmbientPulseManager; - private boolean mLivesPastNormalTime; - - protected AlertingNotificationManager createAlertingNotificationManager() { - return mAmbientPulseManager; - } - - @Before - public void setUp() { - mAmbientPulseManager = new AmbientPulseManager(mContext); - mAmbientPulseManager.mMinimumDisplayTime = TEST_MINIMUM_DISPLAY_TIME; - mAmbientPulseManager.mAutoDismissNotificationDecay = TEST_AUTO_DISMISS_TIME; - mAmbientPulseManager.mExtensionTime = TEST_EXTENSION_TIME; - super.setUp(); - mAmbientPulseManager.mHandler = mTestHandler; - } - - @Test - public void testExtendPulse() { - mAmbientPulseManager.showNotification(mEntry); - Runnable pastNormalTimeRunnable = - () -> mLivesPastNormalTime = mAmbientPulseManager.isAlerting(mEntry.key); - mTestHandler.postDelayed(pastNormalTimeRunnable, - mAmbientPulseManager.mAutoDismissNotificationDecay + - mAmbientPulseManager.mExtensionTime / 2); - mTestHandler.postDelayed(TEST_TIMEOUT_RUNNABLE, TEST_TIMEOUT_TIME); - - mAmbientPulseManager.extendPulse(); - - // Wait for normal time runnable and extended remove runnable and process them on arrival. - TestableLooper.get(this).processMessages(2); - - assertFalse("Test timed out", mTimedOut); - assertTrue("Pulse was not extended", mLivesPastNormalTime); - assertFalse(mAmbientPulseManager.isAlerting(mEntry.key)); - } -} - diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/MediaArtworkProcessorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/MediaArtworkProcessorTest.kt new file mode 100644 index 000000000000..72e6df27a254 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/MediaArtworkProcessorTest.kt @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.systemui.statusbar + +import com.google.common.truth.Truth.assertThat + +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Point +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +private const val WIDTH = 200 +private const val HEIGHT = 200 + +@RunWith(AndroidTestingRunner::class) +@SmallTest +class MediaArtworkProcessorTest : SysuiTestCase() { + + private var screenWidth = 0 + private var screenHeight = 0 + + private lateinit var processor: MediaArtworkProcessor + + @Before + fun setUp() { + processor = MediaArtworkProcessor() + + val point = Point() + context.display.getSize(point) + screenWidth = point.x + screenHeight = point.y + } + + @After + fun tearDown() { + processor.clearCache() + } + + @Test + fun testProcessArtwork() { + // GIVEN some "artwork", which is just a solid blue image + val artwork = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888) + Canvas(artwork).drawColor(Color.BLUE) + // WHEN the background is created from the artwork + val background = processor.processArtwork(context, artwork)!! + // THEN the background has the size of the screen that has been downsamples + assertThat(background.height).isLessThan(screenHeight) + assertThat(background.width).isLessThan(screenWidth) + assertThat(background.config).isEqualTo(Bitmap.Config.ARGB_8888) + } + + @Test + fun testCache() { + // GIVEN a solid blue image + val artwork = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888) + Canvas(artwork).drawColor(Color.BLUE) + // WHEN the background is processed twice + val background1 = processor.processArtwork(context, artwork)!! + val background2 = processor.processArtwork(context, artwork)!! + // THEN the two bitmaps are the same + // Note: This is currently broken and trying to use caching causes issues + assertThat(background1).isNotSameAs(background2) + } + + @Test + fun testConfig() { + // GIVEN some which is not ARGB_8888 + val artwork = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ALPHA_8) + Canvas(artwork).drawColor(Color.BLUE) + // WHEN the background is created from the artwork + val background = processor.processArtwork(context, artwork)!! + // THEN the background has Config ARGB_8888 + assertThat(background.config).isEqualTo(Bitmap.Config.ARGB_8888) + } + + @Test + fun testRecycledArtwork() { + // GIVEN some "artwork", which is just a solid blue image + val artwork = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888) + Canvas(artwork).drawColor(Color.BLUE) + // AND the artwork is recycled + artwork.recycle() + // WHEN the background is created from the artwork + val background = processor.processArtwork(context, artwork) + // THEN the processed bitmap is null + assertThat(background).isNull() + } +}
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java index b81e04821463..da25eed4a24e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationRemoteInputManagerTest.java @@ -1,3 +1,4 @@ + package com.android.systemui.statusbar; import static junit.framework.Assert.assertEquals; @@ -22,12 +23,14 @@ import android.testing.TestableLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationRemoteInputManager.RemoteInputActiveExtender; import com.android.systemui.statusbar.NotificationRemoteInputManager.RemoteInputHistoryExtender; import com.android.systemui.statusbar.NotificationRemoteInputManager.SmartReplyHistoryExtender; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.ShadeController; import com.google.android.collect.Sets; @@ -54,6 +57,7 @@ public class NotificationRemoteInputManagerTest extends SysuiTestCase { @Mock private SmartReplyController mSmartReplyController; @Mock private NotificationListenerService.RankingMap mRanking; @Mock private ExpandableNotificationRow mRow; + @Mock private StatusBarStateController mStateController; // Dependency mocks: @Mock private NotificationEntryManager mEntryManager; @@ -73,6 +77,7 @@ public class NotificationRemoteInputManagerTest extends SysuiTestCase { mRemoteInputManager = new TestableNotificationRemoteInputManager(mContext, mLockscreenUserManager, mSmartReplyController, mEntryManager, () -> mock(ShadeController.class), + mStateController, Handler.createAsync(Looper.myLooper())); mSbn = new StatusBarNotification(TEST_PACKAGE_NAME, TEST_PACKAGE_NAME, 0, null, TEST_UID, 0, new Notification(), UserHandle.CURRENT, null, 0); @@ -196,15 +201,15 @@ public class NotificationRemoteInputManagerTest extends SysuiTestCase { private class TestableNotificationRemoteInputManager extends NotificationRemoteInputManager { - TestableNotificationRemoteInputManager(Context context, NotificationLockscreenUserManager lockscreenUserManager, SmartReplyController smartReplyController, NotificationEntryManager notificationEntryManager, Lazy<ShadeController> shadeController, + StatusBarStateController statusBarStateController, Handler mainHandler) { super(context, lockscreenUserManager, smartReplyController, notificationEntryManager, - shadeController, mainHandler); + shadeController, statusBarStateController, mainHandler); } public void setUpWithPresenterForTest(Callback callback, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java index 028fd7afd945..7063ddf3e653 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationTestHelper.java @@ -20,6 +20,8 @@ import static android.app.Notification.FLAG_BUBBLE; import static android.app.NotificationManager.IMPORTANCE_DEFAULT; import static android.app.NotificationManager.IMPORTANCE_HIGH; +import static org.mockito.Mockito.mock; + import android.annotation.Nullable; import android.app.ActivityManager; import android.app.Instrumentation; @@ -40,11 +42,13 @@ import androidx.test.InstrumentationRegistry; import com.android.systemui.R; import com.android.systemui.bubbles.BubblesTestActivity; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.NotificationContentInflater.InflationFlag; import com.android.systemui.statusbar.notification.row.NotificationContentInflaterTest; import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.policy.HeadsUpManager; @@ -66,14 +70,18 @@ public class NotificationTestHelper { private final Context mContext; private final Instrumentation mInstrumentation; private int mId; - private final NotificationGroupManager mGroupManager = new NotificationGroupManager(); + private final NotificationGroupManager mGroupManager; private ExpandableNotificationRow mRow; - private HeadsUpManager mHeadsUpManager; + private HeadsUpManagerPhone mHeadsUpManager; public NotificationTestHelper(Context context) { mContext = context; mInstrumentation = InstrumentationRegistry.getInstrumentation(); - mHeadsUpManager = new HeadsUpManagerPhone(mContext, null, mGroupManager, null, null); + StatusBarStateController stateController = mock(StatusBarStateController.class); + mGroupManager = new NotificationGroupManager(stateController); + mHeadsUpManager = new HeadsUpManagerPhone(mContext, stateController, + mock(KeyguardBypassController.class)); + mHeadsUpManager.setUp(null, mGroupManager, null, null); mGroupManager.setHeadsUpManager(mHeadsUpManager); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java index 5103e8e89209..58fb53aae7bb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java @@ -52,6 +52,7 @@ import com.android.systemui.statusbar.notification.logging.NotificationLogger; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.ExpandableView; import com.android.systemui.statusbar.notification.stack.NotificationListContainer; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.util.Assert; @@ -109,7 +110,9 @@ public class NotificationViewHierarchyManagerTest extends SysuiTestCase { mViewHierarchyManager = new NotificationViewHierarchyManager(mContext, mHandler, mLockscreenUserManager, mGroupManager, mVisualStabilityManager, mock(StatusBarStateControllerImpl.class), mEntryManager, - () -> mShadeController, new BubbleData(mContext), mock(DynamicPrivacyController.class)); + () -> mShadeController, new BubbleData(mContext), + mock(KeyguardBypassController.class), + mock(DynamicPrivacyController.class)); Dependency.get(InitController.class).executePostInitTasks(); mViewHierarchyManager.setUpWithPresenter(mPresenter, mListContainer); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java index 81e373a8be27..185723ffa09b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SmartReplyControllerTest.java @@ -38,6 +38,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.statusbar.IStatusBarService; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.phone.ShadeController; @@ -70,6 +71,7 @@ public class SmartReplyControllerTest extends SysuiTestCase { @Mock private StatusBarNotification mSbn; @Mock private NotificationEntryManager mNotificationEntryManager; @Mock private IStatusBarService mIStatusBarService; + @Mock private StatusBarStateController mStatusBarStateController; @Before public void setUp() { @@ -85,6 +87,7 @@ public class SmartReplyControllerTest extends SysuiTestCase { mRemoteInputManager = new NotificationRemoteInputManager(mContext, mock(NotificationLockscreenUserManager.class), mSmartReplyController, mNotificationEntryManager, () -> mock(ShadeController.class), + mStatusBarStateController, Handler.createAsync(Looper.myLooper())); mRemoteInputManager.setUpWithCallback(mCallback, mDelegate); mNotification = new Notification.Builder(mContext, "") diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicPrivacyControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicPrivacyControllerTest.java index 6ca5d2c7f687..d804b6f5c5ee 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicPrivacyControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/DynamicPrivacyControllerTest.java @@ -29,9 +29,12 @@ import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationViewHierarchyManager; +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.UnlockMethodCache; +import com.android.systemui.statusbar.policy.KeyguardMonitor; import org.junit.Assert; import org.junit.Before; @@ -51,12 +54,17 @@ public class DynamicPrivacyControllerTest extends SysuiTestCase { = mock(NotificationLockscreenUserManager.class); private DynamicPrivacyController.Listener mListener = mock(DynamicPrivacyController.Listener.class); + private KeyguardMonitor mKeyguardMonitor = mock(KeyguardMonitor.class); @Before public void setUp() throws Exception { when(mCache.canSkipBouncer()).thenReturn(false); + when(mKeyguardMonitor.isShowing()).thenReturn(true); mDynamicPrivacyController = new DynamicPrivacyController( - mLockScreenUserManager, mCache); + mLockScreenUserManager, mKeyguardMonitor, mCache, + mock(StatusBarStateController.class)); + mDynamicPrivacyController.setStatusBarKeyguardViewManager( + mock(StatusBarKeyguardViewManager.class)); mDynamicPrivacyController.addListener(mListener); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java index 72f3a62f30a7..2ca1b0611cd6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java @@ -64,6 +64,7 @@ import com.android.systemui.ForegroundServiceController; import com.android.systemui.InitController; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationLifetimeExtender; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationLockscreenUserManager; @@ -83,6 +84,7 @@ import com.android.systemui.statusbar.notification.row.NotificationContentInflat import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.row.RowInflaterTask; import com.android.systemui.statusbar.notification.stack.NotificationListContainer; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; @@ -247,7 +249,8 @@ public class NotificationEntryManagerTest extends SysuiTestCase { mEntryManager.setNotificationRemoveInterceptor(mRemoveInterceptor); NotificationRowBinderImpl notificationRowBinder = - new NotificationRowBinderImpl(mContext, true /* allowLongPress */); + new NotificationRowBinderImpl(mContext, true, /* allowLongPress */ + mock(KeyguardBypassController.class), mock(StatusBarStateController.class)); notificationRowBinder.setUpWithPresenter( mPresenter, mListContainer, mHeadsUpManager, mEntryManager, mBindCallback); notificationRowBinder.setNotificationClicker(mock(NotificationClicker.class)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java index 91a7ea87a93b..6f7751b2e2a5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationFilterTest.java @@ -40,6 +40,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.ForegroundServiceController; import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationTestHelper; import com.android.systemui.statusbar.notification.collection.NotificationData; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -90,7 +91,7 @@ public class NotificationFilterTest extends SysuiTestCase { .thenReturn(PackageManager.PERMISSION_GRANTED); mDependency.injectTestDependency(ForegroundServiceController.class, mFsc); mDependency.injectTestDependency(NotificationGroupManager.class, - new NotificationGroupManager()); + new NotificationGroupManager(mock(StatusBarStateController.class))); mDependency.injectMockDependency(ShadeController.class); mDependency.injectTestDependency(NotificationData.KeyguardEnvironment.class, mEnvironment); when(mEnvironment.isDeviceProvisioned()).thenReturn(true); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationDataTest.java index 6e0ddbf0cc46..260555f71256 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationDataTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationDataTest.java @@ -66,6 +66,7 @@ import com.android.systemui.Dependency; import com.android.systemui.ForegroundServiceController; import com.android.systemui.InitController; import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationTestHelper; import com.android.systemui.statusbar.notification.collection.NotificationData.KeyguardEnvironment; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; @@ -125,7 +126,7 @@ public class NotificationDataTest extends SysuiTestCase { mDependency.injectTestDependency(ForegroundServiceController.class, mFsc); mDependency.injectTestDependency(NotificationGroupManager.class, - new NotificationGroupManager()); + new NotificationGroupManager(mock(StatusBarStateController.class))); mDependency.injectMockDependency(ShadeController.class); mDependency.injectTestDependency(KeyguardEnvironment.class, mEnvironment); when(mEnvironment.isDeviceProvisioned()).thenReturn(true); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java index 8077e3fbaa0a..d526d104630e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java @@ -37,9 +37,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.AppOpsManager; -import android.app.Notification; import android.app.NotificationChannel; -import android.os.UserHandle; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; @@ -51,6 +49,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationTestHelper; import com.android.systemui.statusbar.notification.AboveShelfChangedListener; import com.android.systemui.statusbar.notification.stack.NotificationChildrenContainer; @@ -138,13 +137,6 @@ public class ExpandableNotificationRowTest extends SysuiTestCase { } @Test - public void testIconColorShouldBeUpdatedWhenSettingDark() throws Exception { - ExpandableNotificationRow row = spy(mNotificationTestHelper.createRow()); - row.setDark(true, false, 0); - verify(row).updateShelfIconColor(); - } - - @Test public void testFreeContentViewWhenSafe() throws Exception { ExpandableNotificationRow row = mNotificationTestHelper.createRow(FLAG_CONTENT_VIEW_ALL); @@ -212,7 +204,9 @@ public class ExpandableNotificationRowTest extends SysuiTestCase { @Test public void testClickSound() throws Exception { assertTrue("Should play sounds by default.", mGroupRow.isSoundEffectsEnabled()); - mGroupRow.setDark(true /* dark */, false /* fade */, 0 /* delay */); + StatusBarStateController mock = mock(StatusBarStateController.class); + when(mock.isDozing()).thenReturn(true); + mGroupRow.setStatusBarStateController(mock); mGroupRow.setSecureStateProvider(()-> false); assertFalse("Shouldn't play sounds when dark and trusted.", mGroupRow.isSoundEffectsEnabled()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java index 06ff0478a804..2ec125e8a43b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java @@ -17,7 +17,6 @@ package com.android.systemui.statusbar.notification.row; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_ALL; -import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_AMBIENT; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_EXPANDED; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_HEADS_UP; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_PUBLIC; @@ -135,7 +134,6 @@ public class NotificationContentInflaterTest extends SysuiTestCase { mNotificationInflater); assertNotNull(mRow.getPrivateLayout().getHeadsUpChild()); - assertNull(mRow.getShowingLayout().getAmbientChild()); verify(mRow).onNotificationUpdated(); } @@ -178,7 +176,7 @@ public class NotificationContentInflaterTest extends SysuiTestCase { result, FLAG_CONTENT_VIEW_EXPANDED, 0, - new ArrayMap() /* cachedContentViews */, mRow, false /* redactAmbient */, + new ArrayMap() /* cachedContentViews */, mRow, true /* isNewView */, (v, p, r) -> true, new InflationCallback() { @Override @@ -210,14 +208,12 @@ public class NotificationContentInflaterTest extends SysuiTestCase { @Test public void testUpdateNeedsRedactionReinflatesChangedContentViews() { - mNotificationInflater.updateInflationFlag(FLAG_CONTENT_VIEW_AMBIENT, true); mNotificationInflater.updateInflationFlag(FLAG_CONTENT_VIEW_PUBLIC, true); mNotificationInflater.updateNeedsRedaction(true); NotificationContentInflater.AsyncInflationTask asyncInflationTask = (NotificationContentInflater.AsyncInflationTask) mRow.getEntry().getRunningTask(); - assertEquals(FLAG_CONTENT_VIEW_AMBIENT | FLAG_CONTENT_VIEW_PUBLIC, - asyncInflationTask.getReInflateFlags()); + assertEquals(FLAG_CONTENT_VIEW_PUBLIC, asyncInflationTask.getReInflateFlags()); asyncInflationTask.abort(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java index 5cd0ca7efa9e..675b3efc5a26 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.java @@ -50,8 +50,6 @@ public class NotificationContentViewTest extends SysuiTestCase { NotificationContentView mView; - private Icon mActionIcon; - @Before @UiThreadTest public void setup() { @@ -62,12 +60,11 @@ public class NotificationContentViewTest extends SysuiTestCase { doReturn(10).when(mockRow).getIntrinsicHeight(); mView.setContainingNotification(mockRow); - mView.setHeights(10, 20, 30, 40); + mView.setHeights(10, 20, 30); mView.setContractedChild(createViewWithHeight(10)); mView.setExpandedChild(createViewWithHeight(20)); mView.setHeadsUpChild(createViewWithHeight(30)); - mView.setAmbientChild(createViewWithHeight(40)); mView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); mView.layout(0, 0, mView.getMeasuredWidth(), mView.getMeasuredHeight()); @@ -81,16 +78,6 @@ public class NotificationContentViewTest extends SysuiTestCase { @Test @UiThreadTest - public void animationStartType_getsClearedAfterUpdatingVisibilitiesWithoutAnimation() { - mView.setHeadsUp(true); - mView.setDark(true, false, 0); - mView.setDark(false, true, 0); - mView.setHeadsUpAnimatingAway(true); - assertFalse(mView.isAnimatingVisibleType()); - } - - @Test - @UiThreadTest public void testShowAppOpsIcons() { NotificationHeaderView mockContracted = mock(NotificationHeaderView.class); when(mockContracted.findViewById(com.android.internal.R.id.notification_header)) @@ -101,14 +88,10 @@ public class NotificationContentViewTest extends SysuiTestCase { NotificationHeaderView mockHeadsUp = mock(NotificationHeaderView.class); when(mockHeadsUp.findViewById(com.android.internal.R.id.notification_header)) .thenReturn(mockHeadsUp); - NotificationHeaderView mockAmbient = mock(NotificationHeaderView.class); - when(mockAmbient.findViewById(com.android.internal.R.id.notification_header)) - .thenReturn(mockAmbient); mView.setContractedChild(mockContracted); mView.setExpandedChild(mockExpanded); mView.setHeadsUpChild(mockHeadsUp); - mView.setAmbientChild(mockAmbient); ArraySet<Integer> ops = new ArraySet<>(); ops.add(AppOpsManager.OP_ANSWER_PHONE_CALLS); @@ -116,7 +99,6 @@ public class NotificationContentViewTest extends SysuiTestCase { verify(mockContracted, times(1)).showAppOpsIcons(ops); verify(mockExpanded, times(1)).showAppOpsIcons(ops); - verify(mockAmbient, never()).showAppOpsIcons(ops); verify(mockHeadsUp, times(1)).showAppOpsIcons(any()); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java index 1b4acd71ad31..524ad85c3a98 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationRoundnessManagerTest.java @@ -30,11 +30,12 @@ import android.testing.TestableLooper.RunWithLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; -import com.android.systemui.statusbar.AmbientPulseManager; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationTestHelper; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.ExpandableView; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import org.junit.Assert; import org.junit.Before; @@ -56,12 +57,14 @@ public class NotificationRoundnessManagerTest extends SysuiTestCase { private ExpandableNotificationRow mFirst; private ExpandableNotificationRow mSecond; @Mock - private AmbientPulseManager mAmbientPulseManager; + private StatusBarStateController mStatusBarStateController; + @Mock + private KeyguardBypassController mBypassController; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mRoundnessManager = new NotificationRoundnessManager(mAmbientPulseManager); + mRoundnessManager = new NotificationRoundnessManager(mBypassController); com.android.systemui.util.Assert.sMainLooper = TestableLooper.get(this).getLooper(); NotificationTestHelper testHelper = new NotificationTestHelper(getContext()); mFirst = testHelper.createRow(); @@ -147,11 +150,15 @@ public class NotificationRoundnessManagerTest extends SysuiTestCase { NotificationEntry entry = mock(NotificationEntry.class); when(entry.getRow()).thenReturn(row); - mRoundnessManager.onAmbientStateChanged(entry, true); + when(mStatusBarStateController.isDozing()).thenReturn(true); + row.setStatusBarStateController(mStatusBarStateController); + row.setHeadsUp(true); + mRoundnessManager.onHeadsUpStateChanged(entry, true); Assert.assertEquals(1f, row.getCurrentBottomRoundness(), 0.0f); Assert.assertEquals(1f, row.getCurrentTopRoundness(), 0.0f); - mRoundnessManager.onAmbientStateChanged(entry, false); + row.setHeadsUp(false); + mRoundnessManager.onHeadsUpStateChanged(entry, false); Assert.assertEquals(0f, row.getCurrentBottomRoundness(), 0.0f); Assert.assertEquals(0f, row.getCurrentTopRoundness(), 0.0f); } @@ -256,15 +263,15 @@ public class NotificationRoundnessManagerTest extends SysuiTestCase { } @Test - public void testTrackingHeadsUpNotRoundedIfPushingDown() { + public void testTrackingHeadsUpPartiallyRoundedIfPushingDown() { mRoundnessManager.setExpanded(1.0f /* expandedHeight */, 0.5f /* appearFraction */); mRoundnessManager.setTrackingHeadsUp(mFirst); mRoundnessManager.updateRoundedChildren(new NotificationSection[]{ createSection(mSecond, mSecond), createSection(null, null) }); - Assert.assertEquals(0.0f, mFirst.getCurrentBottomRoundness(), 0.0f); - Assert.assertEquals(0.0f, mFirst.getCurrentTopRoundness(), 0.0f); + Assert.assertEquals(0.5f, mFirst.getCurrentBottomRoundness(), 0.0f); + Assert.assertEquals(0.5f, mFirst.getCurrentTopRoundness(), 0.0f); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index ff835871d822..c851c915d655 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -55,13 +55,13 @@ import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.EmptyShadeView; import com.android.systemui.statusbar.NotificationPresenter; import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.RemoteInputController; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.collection.NotificationData; @@ -70,6 +70,7 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.FooterView; import com.android.systemui.statusbar.notification.row.NotificationBlockingHelperManager; import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.NotificationIconAreaController; import com.android.systemui.statusbar.phone.ScrimController; @@ -105,7 +106,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Rule public MockitoRule mockito = MockitoJUnit.rule(); @Mock private StatusBar mBar; - @Mock private StatusBarStateController mBarState; + @Mock private SysuiStatusBarStateController mBarState; @Mock private HeadsUpManagerPhone mHeadsUpManager; @Mock private NotificationBlockingHelperManager mBlockingHelperManager; @Mock private NotificationGroupManager mGroupManager; @@ -117,6 +118,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Mock private NotificationIconAreaController mNotificationIconAreaController; @Mock private MetricsLogger mMetricsLogger; @Mock private NotificationRoundnessManager mNotificationRoundnessManager; + @Mock private KeyguardBypassController mKeyguardBypassController; private TestableNotificationEntryManager mEntryManager; private int mOriginalInterruptionModelSetting; @@ -135,7 +137,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { mDependency.injectTestDependency( NotificationBlockingHelperManager.class, mBlockingHelperManager); - mDependency.injectTestDependency(StatusBarStateController.class, mBarState); + mDependency.injectTestDependency(SysuiStatusBarStateController.class, mBarState); mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger); mDependency.injectTestDependency(NotificationRemoteInputManager.class, mRemoteInputManager); @@ -158,16 +160,16 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { // member variables, not the spy's member variables. mStackScrollerInternal = new NotificationStackScrollLayout(getContext(), null, true /* allowLongPress */, mNotificationRoundnessManager, - new AmbientPulseManager(mContext), mock(DynamicPrivacyController.class), mock(ConfigurationController.class), mock(ActivityStarterDelegate.class), - mock(StatusBarStateController.class)); + mock(SysuiStatusBarStateController.class), + mHeadsUpManager, + mKeyguardBypassController); mStackScroller = spy(mStackScrollerInternal); mStackScroller.setShelf(notificationShelf); mStackScroller.setStatusBar(mBar); mStackScroller.setScrimController(mock(ScrimController.class)); - mStackScroller.setHeadsUpManager(mHeadsUpManager); mStackScroller.setGroupManager(mGroupManager); mStackScroller.setEmptyShadeView(mEmptyShadeView); mStackScroller.setIconAreaController(mNotificationIconAreaController); @@ -182,7 +184,6 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { doNothing().when(mGroupManager).collapseAllGroups(); doNothing().when(mExpandHelper).cancelImmediately(); doNothing().when(notificationShelf).setAnimationsEnabled(anyBoolean()); - doNothing().when(notificationShelf).fadeInTranslating(); } @After @@ -200,17 +201,6 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { } @Test - public void testAntiBurnInOffset() { - final int burnInOffset = 30; - mStackScroller.setAntiBurnInOffsetX(burnInOffset); - mStackScroller.setDark(false /* dark */, false /* animated */, null /* touch */); - Assert.assertEquals(0 /* expected */, mStackScroller.getTranslationX(), 0.01 /* delta */); - mStackScroller.setDark(true /* dark */, false /* animated */, null /* touch */); - Assert.assertEquals(burnInOffset /* expected */, mStackScroller.getTranslationX(), - 0.01 /* delta */); - } - - @Test public void updateEmptyView_dndSuppressing() { when(mEmptyShadeView.willBeGone()).thenReturn(true); when(mBar.areNotificationsHidden()).thenReturn(true); @@ -395,7 +385,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { NotificationSwipeHelper swipeActionHelper = (NotificationSwipeHelper) mStackScroller.getSwipeActionHelper(); swipeActionHelper.setExposedMenuView(new View(mContext)); - mStackScroller.setDarkAmount(0.1f, 0.1f); + mStackScroller.setHideAmount(0.1f, 0.1f); assertNull(swipeActionHelper.getExposedMenuView()); } @@ -442,9 +432,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Test @UiThreadTest - public void testOnMenuShownLogging() { - // Set up the object under test to have a valid mHeadsUpManager. See notes in setup. - mStackScrollerInternal.setHeadsUpManager(mHeadsUpManager); + public void testOnMenuShownLogging() { ; ExpandableNotificationRow row = mock(ExpandableNotificationRow.class, RETURNS_DEEP_STUBS); when(row.getStatusBarNotification().getLogMaker()).thenReturn(new LogMaker( diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java index d2d294bf8d37..fd676111b1da 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; +import static com.google.common.truth.Truth.assertThat; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; @@ -37,7 +39,6 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.statusbar.NotificationMediaManager; -import com.android.systemui.tuner.TunerService; import org.junit.Before; import org.junit.Test; @@ -71,9 +72,9 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { @Mock private UnlockMethodCache mUnlockMethodCache; @Mock - private TunerService mTunerService; - @Mock private Handler mHandler; + @Mock + private KeyguardBypassController mKeyguardBypassController; private BiometricUnlockController mBiometricUnlockController; @Before @@ -81,12 +82,16 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { MockitoAnnotations.initMocks(this); when(mStatusBarKeyguardViewManager.isShowing()).thenReturn(true); when(mUpdateMonitor.isDeviceInteractive()).thenReturn(true); + when(mUnlockMethodCache.isFaceAuthEnabled()).thenReturn(true); + when(mKeyguardBypassController.onBiometricAuthenticated(any())).thenReturn(true); + when(mKeyguardBypassController.canPlaySubtleWindowAnimations()).thenReturn(true); mContext.addMockSystemService(PowerManager.class, mPowerManager); mDependency.injectTestDependency(NotificationMediaManager.class, mMediaManager); mDependency.injectTestDependency(StatusBarWindowController.class, mStatusBarWindowController); - mBiometricUnlockController = new TestableBiometricUnlockController( - false /* faceDismissesKeyguard */); + mBiometricUnlockController = new BiometricUnlockController(mContext, mDozeScrimController, + mKeyguardViewMediator, mScrimController, mStatusBar, mUnlockMethodCache, + mHandler, mUpdateMonitor, 0 /* wakeUpDelay */, mKeyguardBypassController); mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); } @@ -124,7 +129,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { @Test public void onBiometricAuthenticated_whenFingerprintOnBouncer_dismissBouncer() { when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true); - when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true); + when(mStatusBarKeyguardViewManager.bouncerIsOrWillBeShowing()).thenReturn(true); mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, BiometricSourceType.FINGERPRINT); @@ -138,29 +143,92 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { BiometricSourceType.FACE); verify(mStatusBarKeyguardViewManager, never()).animateCollapsePanels(anyFloat()); + verify(mStatusBarKeyguardViewManager, never()).notifyKeyguardAuthenticated(anyBoolean()); } @Test - public void onBiometricAuthenticated_whenFace_dismissingKeyguard() { - mBiometricUnlockController = new TestableBiometricUnlockController( - true /* faceDismissesKeyguard */); + public void onBiometricAuthenticated_whenFace_andBypass_dismissKeyguard() { + when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true); mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, BiometricSourceType.FACE); - verify(mStatusBarKeyguardViewManager).animateCollapsePanels(anyFloat()); + verify(mStatusBarKeyguardViewManager, never()).animateCollapsePanels(anyFloat()); + verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(eq(false)); + } + + @Test + public void onBiometricAuthenticated_whenFace_andBypass_encrypted_showBouncer() { + reset(mUpdateMonitor); + when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); + mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); + + when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(false); + mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, + BiometricSourceType.FACE); + + // Wake up before showing the bouncer + verify(mStatusBarKeyguardViewManager, never()).showBouncer(eq(false)); + mBiometricUnlockController.mWakefulnessObserver.onFinishedWakingUp(); + + verify(mStatusBarKeyguardViewManager).showBouncer(eq(false)); + assertThat(mBiometricUnlockController.getMode()) + .isEqualTo(BiometricUnlockController.MODE_SHOW_BOUNCER); + } + + @Test + public void onBiometricAuthenticated_whenFace_noBypass_encrypted_doNothing() { + reset(mUpdateMonitor); + mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager); + + when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(false); + mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, + BiometricSourceType.FACE); + + verify(mStatusBarKeyguardViewManager, never()).showBouncer(anyBoolean()); + verify(mStatusBarKeyguardViewManager, never()).animateCollapsePanels(anyFloat()); + assertThat(mBiometricUnlockController.getMode()) + .isEqualTo(BiometricUnlockController.MODE_NONE); } @Test public void onBiometricAuthenticated_whenFaceOnBouncer_dismissBouncer() { when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true); - when(mStatusBarKeyguardViewManager.isBouncerShowing()).thenReturn(true); + when(mStatusBarKeyguardViewManager.bouncerIsOrWillBeShowing()).thenReturn(true); + mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, + BiometricSourceType.FACE); + + verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(eq(false)); + } + + @Test + public void onBiometricAuthenticated_whenBypassOnBouncer_dismissBouncer() { + reset(mKeyguardBypassController); + when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true); + when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); + when(mKeyguardBypassController.onBiometricAuthenticated(any())).thenReturn(true); + when(mStatusBarKeyguardViewManager.bouncerIsOrWillBeShowing()).thenReturn(true); mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, BiometricSourceType.FACE); verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(eq(false)); + assertThat(mBiometricUnlockController.getMode()) + .isEqualTo(BiometricUnlockController.MODE_DISMISS_BOUNCER); + } + + @Test + public void onBiometricAuthenticated_whenBypassOnBouncer_respectsCanPlaySubtleAnim() { + when(mUpdateMonitor.isUnlockingWithBiometricAllowed()).thenReturn(true); + when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); + when(mStatusBarKeyguardViewManager.bouncerIsOrWillBeShowing()).thenReturn(true); + mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT, + BiometricSourceType.FACE); + + verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(eq(false)); + assertThat(mBiometricUnlockController.getMode()) + .isEqualTo(BiometricUnlockController.MODE_UNLOCK_FADING); } @Test @@ -186,15 +254,4 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { mBiometricUnlockController.onFinishedGoingToSleep(-1); verify(mHandler).post(any()); } - - private class TestableBiometricUnlockController extends BiometricUnlockController { - - TestableBiometricUnlockController(boolean faceDismissesKeyguard) { - super(mContext, mDozeScrimController, - mKeyguardViewMediator, mScrimController, mStatusBar, mUnlockMethodCache, - mHandler, mUpdateMonitor, mTunerService, 0 /* wakeUpDelay */, - faceDismissesKeyguard); - mFaceDismissesKeyguard = faceDismissesKeyguard; - } - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java index f6f4eb489603..60050b182e0f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java @@ -16,10 +16,6 @@ package com.android.systemui.statusbar.phone; -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; -import static junit.framework.Assert.fail; - import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; @@ -33,7 +29,6 @@ import androidx.test.runner.AndroidJUnit4; import com.android.systemui.SysuiTestCase; import com.android.systemui.doze.DozeScreenState; -import com.android.systemui.statusbar.phone.DozeParameters.IntInOutMatcher; import org.junit.Assert; import org.junit.Test; @@ -44,160 +39,6 @@ import org.junit.runner.RunWith; public class DozeParametersTest extends SysuiTestCase { @Test - public void test_inOutMatcher_defaultIn() { - IntInOutMatcher intInOutMatcher = new IntInOutMatcher("*"); - - assertTrue(intInOutMatcher.isIn(1)); - assertTrue(intInOutMatcher.isIn(-1)); - assertTrue(intInOutMatcher.isIn(0)); - } - - @Test - public void test_inOutMatcher_defaultOut() { - IntInOutMatcher intInOutMatcher = new IntInOutMatcher("!*"); - - assertFalse(intInOutMatcher.isIn(1)); - assertFalse(intInOutMatcher.isIn(-1)); - assertFalse(intInOutMatcher.isIn(0)); - } - - @Test - public void test_inOutMatcher_someIn() { - IntInOutMatcher intInOutMatcher = new IntInOutMatcher("1,2,3,!*"); - - assertTrue(intInOutMatcher.isIn(1)); - assertTrue(intInOutMatcher.isIn(2)); - assertTrue(intInOutMatcher.isIn(3)); - - assertFalse(intInOutMatcher.isIn(0)); - assertFalse(intInOutMatcher.isIn(4)); - } - - @Test - public void test_inOutMatcher_someOut() { - IntInOutMatcher intInOutMatcher = new IntInOutMatcher("!1,!2,!3,*"); - - assertFalse(intInOutMatcher.isIn(1)); - assertFalse(intInOutMatcher.isIn(2)); - assertFalse(intInOutMatcher.isIn(3)); - - assertTrue(intInOutMatcher.isIn(0)); - assertTrue(intInOutMatcher.isIn(4)); - } - - @Test - public void test_inOutMatcher_mixed() { - IntInOutMatcher intInOutMatcher = new IntInOutMatcher("!1,2,!3,*"); - - assertFalse(intInOutMatcher.isIn(1)); - assertTrue(intInOutMatcher.isIn(2)); - assertFalse(intInOutMatcher.isIn(3)); - - assertTrue(intInOutMatcher.isIn(0)); - assertTrue(intInOutMatcher.isIn(4)); - } - - @Test - public void test_inOutMatcher_failEmpty() { - try { - new IntInOutMatcher(""); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failNull() { - try { - new IntInOutMatcher(null); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failEmptyClause() { - try { - new IntInOutMatcher("!1,*,"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failDuplicate() { - try { - new IntInOutMatcher("!1,*,!1"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failDuplicateDefault() { - try { - new IntInOutMatcher("!1,*,*"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failMalformedNot() { - try { - new IntInOutMatcher("!,*"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failText() { - try { - new IntInOutMatcher("!abc,*"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failContradiction() { - try { - new IntInOutMatcher("1,!1,*"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failContradictionDefault() { - try { - new IntInOutMatcher("1,*,!*"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test - public void test_inOutMatcher_failMissingDefault() { - try { - new IntInOutMatcher("1"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - // expected - } - } - - @Test public void test_setControlScreenOffAnimation_setsDozeAfterScreenOff_false() { TestableDozeParameters dozeParameters = new TestableDozeParameters(getContext()); PowerManager mockedPowerManager = dozeParameters.getPowerManager(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java index 0479b4a01dc9..a38094da3e1c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceControllerTest.java @@ -32,8 +32,10 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.DarkIconDispatcher; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.HeadsUpStatusBarView; import com.android.systemui.statusbar.NotificationTestHelper; +import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; @@ -56,6 +58,9 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { private HeadsUpStatusBarView mHeadsUpStatusBarView; private HeadsUpManagerPhone mHeadsUpManager; private View mOperatorNameView; + private StatusBarStateController mStatusbarStateController; + private KeyguardBypassController mBypassController; + private NotificationWakeUpCoordinator mWakeUpCoordinator; @Before public void setUp() throws Exception { @@ -67,16 +72,22 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { mock(TextView.class)); mHeadsUpManager = mock(HeadsUpManagerPhone.class); mOperatorNameView = new View(mContext); + mStatusbarStateController = mock(StatusBarStateController.class); + mBypassController = mock(KeyguardBypassController.class); + mWakeUpCoordinator = mock(NotificationWakeUpCoordinator.class); mHeadsUpAppearanceController = new HeadsUpAppearanceController( mock(NotificationIconAreaController.class), mHeadsUpManager, + mStatusbarStateController, + mBypassController, + mWakeUpCoordinator, mHeadsUpStatusBarView, mStackScroller, mPanelView, new View(mContext), mOperatorNameView, new View(mContext)); - mHeadsUpAppearanceController.setExpandedHeight(0.0f, 0.0f); + mHeadsUpAppearanceController.setAppearFraction(0.0f, 0.0f); } @Test @@ -139,11 +150,14 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { @Test public void testHeaderReadFromOldController() { - mHeadsUpAppearanceController.setExpandedHeight(1.0f, 1.0f); + mHeadsUpAppearanceController.setAppearFraction(1.0f, 1.0f); HeadsUpAppearanceController newController = new HeadsUpAppearanceController( mock(NotificationIconAreaController.class), mHeadsUpManager, + mStatusbarStateController, + mBypassController, + mWakeUpCoordinator, mHeadsUpStatusBarView, mStackScroller, mPanelView, @@ -154,8 +168,8 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { Assert.assertEquals(mHeadsUpAppearanceController.mExpandedHeight, newController.mExpandedHeight, 0.0f); - Assert.assertEquals(mHeadsUpAppearanceController.mExpandFraction, - newController.mExpandFraction, 0.0f); + Assert.assertEquals(mHeadsUpAppearanceController.mAppearFraction, + newController.mAppearFraction, 0.0f); Assert.assertEquals(mHeadsUpAppearanceController.mIsExpanded, newController.mIsExpanded); } @@ -172,7 +186,7 @@ public class HeadsUpAppearanceControllerTest extends SysuiTestCase { verify(mPanelView).removeVerticalTranslationListener(any()); verify(mPanelView).removeTrackingHeadsUpListener(any()); verify(mPanelView).setHeadsUpAppearanceController(any()); - verify(mStackScroller).removeOnExpandedHeightListener(any()); + verify(mStackScroller).removeOnExpandedHeightChangedListener(any()); verify(mStackScroller).removeOnLayoutChangeListener(any()); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java index 7bd41584f889..48934da9fb37 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/HeadsUpManagerPhoneTest.java @@ -29,6 +29,7 @@ import android.view.View; import androidx.test.filters.SmallTest; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.AlertingNotificationManager; import com.android.systemui.statusbar.AlertingNotificationManagerTest; import com.android.systemui.statusbar.notification.VisualStabilityManager; @@ -55,12 +56,18 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest { @Mock private View mStatusBarWindowView; @Mock private VisualStabilityManager mVSManager; @Mock private StatusBar mBar; + @Mock private StatusBarStateController mStatusBarStateController; + @Mock private KeyguardBypassController mBypassController; + private boolean mLivesPastNormalTime; private final class TestableHeadsUpManagerPhone extends HeadsUpManagerPhone { TestableHeadsUpManagerPhone(Context context, View statusBarWindowView, NotificationGroupManager groupManager, StatusBar bar, - VisualStabilityManager vsManager) { - super(context, statusBarWindowView, groupManager, bar, vsManager); + VisualStabilityManager vsManager, + StatusBarStateController statusBarStateController, + KeyguardBypassController keyguardBypassController) { + super(context, statusBarStateController, keyguardBypassController); + setUp(statusBarWindowView, groupManager, bar, vsManager); mMinimumDisplayTime = TEST_MINIMUM_DISPLAY_TIME; mAutoDismissNotificationDecay = TEST_AUTO_DISMISS_TIME; } @@ -72,13 +79,13 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest { @Before public void setUp() { - AccessibilityManagerWrapper mAccessibilityMgr = + AccessibilityManagerWrapper accessibilityMgr = mDependency.injectMockDependency(AccessibilityManagerWrapper.class); - when(mAccessibilityMgr.getRecommendedTimeoutMillis(anyInt(), anyInt())) + when(accessibilityMgr.getRecommendedTimeoutMillis(anyInt(), anyInt())) .thenReturn(TEST_AUTO_DISMISS_TIME); when(mVSManager.isReorderingAllowed()).thenReturn(true); mHeadsUpManager = new TestableHeadsUpManagerPhone(mContext, mStatusBarWindowView, - mGroupManager, mBar, mVSManager); + mGroupManager, mBar, mVSManager, mStatusBarStateController, mBypassController); super.setUp(); mHeadsUpManager.mHandler = mTestHandler; } @@ -122,4 +129,24 @@ public class HeadsUpManagerPhoneTest extends AlertingNotificationManagerTest { // Notification is "behind" a higher priority notification so we can remove it immediately. assertTrue(mHeadsUpManager.canRemoveImmediately(mEntry.key)); } + + + @Test + public void testExtendHeadsUp() { + mHeadsUpManager.showNotification(mEntry); + Runnable pastNormalTimeRunnable = + () -> mLivesPastNormalTime = mHeadsUpManager.isAlerting(mEntry.key); + mTestHandler.postDelayed(pastNormalTimeRunnable, + TEST_AUTO_DISMISS_TIME + mHeadsUpManager.mExtensionTime / 2); + mTestHandler.postDelayed(TEST_TIMEOUT_RUNNABLE, TEST_TIMEOUT_TIME); + + mHeadsUpManager.extendHeadsUp(); + + // Wait for normal time runnable and extended remove runnable and process them on arrival. + TestableLooper.get(this).processMessages(2); + + assertFalse("Test timed out", mTimedOut); + assertTrue("Pulse was not extended", mLivesPastNormalTime); + assertFalse(mHeadsUpManager.isAlerting(mEntry.key)); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java index 3bc5f3e62aaa..907e695f2513 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardBouncerTest.java @@ -82,6 +82,8 @@ public class KeyguardBouncerTest extends SysuiTestCase { @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor; @Mock + private UnlockMethodCache mUnlockMethodCache; + @Mock private Handler mHandler; private KeyguardBouncer mBouncer; @@ -96,7 +98,7 @@ public class KeyguardBouncerTest extends SysuiTestCase { when(mKeyguardHostView.getHeight()).thenReturn(500); mBouncer = new KeyguardBouncer(getContext(), mViewMediatorCallback, mLockPatternUtils, container, mDismissCallbackRegistry, mFalsingManager, - mExpansionCallback, mKeyguardUpdateMonitor, mHandler) { + mExpansionCallback, mUnlockMethodCache, mKeyguardUpdateMonitor, mHandler) { @Override protected void inflateView() { super.inflateView(); @@ -377,7 +379,7 @@ public class KeyguardBouncerTest extends SysuiTestCase { @Test public void testShow_delaysIfFaceAuthIsRunning() { - when(mKeyguardUpdateMonitor.isFaceDetectionRunning()).thenReturn(true); + when(mUnlockMethodCache.isFaceAuthEnabled()).thenReturn(true); mBouncer.show(true /* reset */); ArgumentCaptor<Runnable> showRunnable = ArgumentCaptor.forClass(Runnable.class); @@ -392,4 +394,15 @@ public class KeyguardBouncerTest extends SysuiTestCase { public void testRegisterUpdateMonitorCallback() { verify(mKeyguardUpdateMonitor).registerCallback(any()); } + + @Test + public void testInTransit_whenTranslation() { + mBouncer.show(true); + mBouncer.setExpansion(KeyguardBouncer.EXPANSION_HIDDEN); + assertThat(mBouncer.inTransit()).isFalse(); + mBouncer.setExpansion(0.5f); + assertThat(mBouncer.inTransit()).isTrue(); + mBouncer.setExpansion(KeyguardBouncer.EXPANSION_VISIBLE); + assertThat(mBouncer.inTransit()).isFalse(); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java index f8394f01a081..2042faba2b3a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithmTest.java @@ -383,7 +383,8 @@ public class KeyguardClockPositionAlgorithmTest extends SysuiTestCase { private void positionClock() { mClockPositionAlgorithm.setup(EMPTY_MARGIN, SCREEN_HEIGHT, mNotificationStackHeight, mPanelExpansion, SCREEN_HEIGHT, mKeyguardStatusHeight, mPreferredClockY, - mHasCustomClock, mHasVisibleNotifs, mDark, ZERO_DRAG); + mHasCustomClock, mHasVisibleNotifs, mDark, ZERO_DRAG, false /* bypassEnabled */, + 0 /* unlockedStackScrollerPadding */); mClockPositionAlgorithm.run(mClockPosition); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java index 337c35c39ca1..b1c3c83e938e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupAlertTransferHelperTest.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.phone; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -32,7 +33,7 @@ import android.testing.TestableLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; -import com.android.systemui.statusbar.AmbientPulseManager; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.notification.NotificationEntryListener; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -58,7 +59,6 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase { private NotificationGroupAlertTransferHelper mGroupAlertTransferHelper; private NotificationGroupManager mGroupManager; - private AmbientPulseManager mAmbientPulseManager; private HeadsUpManager mHeadsUpManager; @Mock private NotificationEntryManager mNotificationEntryManager; @Captor @@ -71,14 +71,12 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase { @Before public void setup() { - mAmbientPulseManager = new AmbientPulseManager(mContext); - mDependency.injectTestDependency(AmbientPulseManager.class, mAmbientPulseManager); mHeadsUpManager = new HeadsUpManager(mContext) {}; when(mNotificationEntryManager.getPendingNotificationsIterator()) .thenReturn(mPendingEntries.values()); - mGroupManager = new NotificationGroupManager(); + mGroupManager = new NotificationGroupManager(mock(StatusBarStateController.class)); mDependency.injectTestDependency(NotificationGroupManager.class, mGroupManager); mGroupManager.setHeadsUpManager(mHeadsUpManager); @@ -89,7 +87,6 @@ public class NotificationGroupAlertTransferHelperTest extends SysuiTestCase { verify(mNotificationEntryManager).addNotificationEntryListener(mListenerCaptor.capture()); mNotificationEntryListener = mListenerCaptor.getValue(); mHeadsUpManager.addListener(mGroupAlertTransferHelper); - mAmbientPulseManager.addListener(mGroupAlertTransferHelper); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java index 43685f0513e7..dd274c7c09b9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationGroupManagerTest.java @@ -21,6 +21,7 @@ import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.testing.AndroidTestingRunner; @@ -29,7 +30,7 @@ import android.testing.TestableLooper; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; -import com.android.systemui.statusbar.AmbientPulseManager; +import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.policy.HeadsUpManager; @@ -53,17 +54,14 @@ public class NotificationGroupManagerTest extends SysuiTestCase { new NotificationGroupTestHelper(mContext); @Mock HeadsUpManager mHeadsUpManager; - @Mock AmbientPulseManager mAmbientPulseManager; @Before public void setup() { - mDependency.injectTestDependency(AmbientPulseManager.class, mAmbientPulseManager); - initializeGroupManager(); } private void initializeGroupManager() { - mGroupManager = new NotificationGroupManager(); + mGroupManager = new NotificationGroupManager(mock(StatusBarStateController.class)); mGroupManager.setHeadsUpManager(mHeadsUpManager); } @@ -146,21 +144,4 @@ public class NotificationGroupManagerTest extends SysuiTestCase { assertEquals(childEntry, mGroupManager.getGroupSummary(childEntry.notification)); assertEquals(summaryEntry, mGroupManager.getLogicalGroupSummary(childEntry.notification)); } - - @Test - public void testAmbientPulseEntryIsIsolated() { - NotificationEntry childEntry = mGroupTestHelper.createChildNotification(); - NotificationEntry summaryEntry = mGroupTestHelper.createSummaryNotification(); - mGroupManager.onEntryAdded(summaryEntry); - mGroupManager.onEntryAdded(childEntry); - mGroupManager.onEntryAdded(mGroupTestHelper.createChildNotification()); - when(mAmbientPulseManager.isAlerting(childEntry.key)).thenReturn(true); - - mGroupManager.onAmbientStateChanged(childEntry, true); - - // Child entries that are heads upped should be considered separate groups visually even if - // they are the same group logically - assertEquals(childEntry, mGroupManager.getGroupSummary(childEntry.notification)); - assertEquals(summaryEntry, mGroupManager.getLogicalGroupSummary(childEntry.notification)); - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java index 1b7ca952dbfe..d14b460d8c63 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java @@ -37,7 +37,6 @@ import com.android.keyguard.KeyguardStatusView; import com.android.systemui.SystemUIFactory; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.statusbar.AmbientPulseManager; import com.android.systemui.statusbar.KeyguardAffordanceView; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationShelf; @@ -46,9 +45,11 @@ import com.android.systemui.statusbar.StatusBarStateControllerImpl; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; +import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ZenModeController; +import com.android.systemui.tuner.TunerService; import com.android.systemui.util.InjectionInflationController; import org.junit.Before; @@ -111,12 +112,18 @@ public class NotificationPanelViewTest extends SysuiTestCase { mDependency.injectMockDependency(NotificationLockscreenUserManager.class); mDependency.injectMockDependency(ConfigurationController.class); mDependency.injectMockDependency(ZenModeController.class); + KeyguardBypassController bypassController = new KeyguardBypassController(mContext, + mock(TunerService.class), mStatusBarStateController, + mock(NotificationLockscreenUserManager.class)); NotificationWakeUpCoordinator coordinator = new NotificationWakeUpCoordinator(mContext, - new AmbientPulseManager(mContext), - new StatusBarStateControllerImpl()); - PulseExpansionHandler expansionHandler = new PulseExpansionHandler(mContext, coordinator); - mNotificationPanelView = new TestableNotificationPanelView(coordinator, expansionHandler); + mock(HeadsUpManagerPhone.class), + new StatusBarStateControllerImpl(), + bypassController); + PulseExpansionHandler expansionHandler = new PulseExpansionHandler(mContext, coordinator, + bypassController, mHeadsUpManager, mock(NotificationRoundnessManager.class)); + mNotificationPanelView = new TestableNotificationPanelView(coordinator, expansionHandler, + bypassController); mNotificationPanelView.setHeadsUpManager(mHeadsUpManager); mNotificationPanelView.setBar(mPanelBar); @@ -128,7 +135,7 @@ public class NotificationPanelViewTest extends SysuiTestCase { public void testSetDozing_notifiesNsslAndStateController() { mNotificationPanelView.setDozing(true /* dozing */, true /* animate */, null /* touch */); InOrder inOrder = inOrder(mNotificationStackScrollLayout, mStatusBarStateController); - inOrder.verify(mNotificationStackScrollLayout).setDark(eq(true), eq(true), eq(null)); + inOrder.verify(mNotificationStackScrollLayout).setDozing(eq(true), eq(true), eq(null)); inOrder.verify(mStatusBarStateController).setDozeAmount(eq(1f), eq(true)); } @@ -178,11 +185,13 @@ public class NotificationPanelViewTest extends SysuiTestCase { private class TestableNotificationPanelView extends NotificationPanelView { TestableNotificationPanelView(NotificationWakeUpCoordinator coordinator, - PulseExpansionHandler expansionHandler) { + PulseExpansionHandler expansionHandler, + KeyguardBypassController bypassController) { super(NotificationPanelViewTest.this.mContext, null, new InjectionInflationController( SystemUIFactory.getInstance().getRootComponent()), - coordinator, expansionHandler, mock(DynamicPrivacyController.class)); + coordinator, expansionHandler, mock(DynamicPrivacyController.class), + bypassController); mNotificationStackScroller = mNotificationStackScrollLayout; mKeyguardStatusView = NotificationPanelViewTest.this.mKeyguardStatusView; mKeyguardStatusBar = NotificationPanelViewTest.this.mKeyguardStatusBar; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index d8e90a584058..0dbf30881ffe 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -225,11 +225,12 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimController.transitionTo(ScrimState.PULSING); mScrimController.finishAnimationsImmediately(); - // Front scrim should be transparent + // Front scrim should be transparent, but tinted // Back scrim should be semi-transparent so the user can see the wallpaper // Pulse callback should have been invoked assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE); assertScrimTint(mScrimBehind, true /* tinted */); + assertScrimTint(mScrimInFront, true /* tinted */); mScrimController.setWakeLockScreenSensorActive(true); mScrimController.finishAnimationsImmediately(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java index f50cf5a70cdc..da2e8dc90854 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.phone; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -29,7 +30,9 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; +import android.view.View; import android.view.ViewGroup; +import android.view.ViewPropertyAnimator; import androidx.test.filters.SmallTest; @@ -39,6 +42,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.keyguard.DismissCallbackRegistry; import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.statusbar.SysuiStatusBarStateController; import org.junit.Before; import org.junit.Test; @@ -70,7 +74,11 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { @Mock private ViewGroup mLockIconContainer; @Mock - private StatusBarStateController mStatusBarStateController; + private SysuiStatusBarStateController mStatusBarStateController; + @Mock + private View mNotificationContainer; + @Mock + private KeyguardBypassController mBypassController; private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; @Before @@ -79,11 +87,13 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { mDependency.injectMockDependency(StatusBarWindowController.class); mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController); when(mLockIconContainer.getParent()).thenReturn(mock(ViewGroup.class)); + when(mLockIconContainer.animate()).thenReturn(mock(ViewPropertyAnimator.class, + RETURNS_DEEP_STUBS)); mStatusBarKeyguardViewManager = new TestableStatusBarKeyguardViewManager(getContext(), mViewMediatorCallback, mLockPatternUtils); mStatusBarKeyguardViewManager.registerStatusBar(mStatusBar, mContainer, mNotificationPanelView, mBiometrucUnlockController, mDismissCallbackRegistry, - mLockIconContainer); + mLockIconContainer, mNotificationContainer, mBypassController); mStatusBarKeyguardViewManager.show(null); } @@ -221,9 +231,11 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { NotificationPanelView notificationPanelView, BiometricUnlockController fingerprintUnlockController, DismissCallbackRegistry dismissCallbackRegistry, - ViewGroup lockIconContainer) { + ViewGroup lockIconContainer, View notificationContainer, + KeyguardBypassController bypassController) { super.registerStatusBar(statusBar, container, notificationPanelView, - fingerprintUnlockController, dismissCallbackRegistry, lockIconContainer); + fingerprintUnlockController, dismissCallbackRegistry, lockIconContainer, + notificationContainer, bypassController); mBouncer = StatusBarKeyguardViewManagerTest.this.mBouncer; } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java index e811e1d955ee..186a8c7dcee1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java @@ -40,6 +40,7 @@ import com.android.internal.logging.testing.FakeMetricsLogger; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.notification.ActivityLaunchAnimator; +import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.NotificationAlertingManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationRowBinderImpl; @@ -75,7 +76,7 @@ public class StatusBarNotificationPresenterTest extends SysuiTestCase { mock(NotificationPanelView.class), mock(HeadsUpManagerPhone.class), statusBarWindowView, mock(NotificationListContainerViewGroup.class), mock(DozeScrimController.class), mock(ScrimController.class), - mock(ActivityLaunchAnimator.class), mock(StatusBarKeyguardViewManager.class), + mock(ActivityLaunchAnimator.class), mock(DynamicPrivacyController.class), mock(NotificationAlertingManager.class), mock(NotificationRowBinderImpl.class)); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index 79e05c373534..fa235bd46d7e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -157,7 +157,7 @@ public class StatusBarTest extends SysuiTestCase { @Mock private RemoteInputController mRemoteInputController; @Mock private StatusBarStateControllerImpl mStatusBarStateController; @Mock private DeviceProvisionedController mDeviceProvisionedController; - @Mock private NotificationPresenter mNotificationPresenter; + @Mock private StatusBarNotificationPresenter mNotificationPresenter; @Mock private NotificationEntryListener mEntryListener; @Mock @@ -222,6 +222,7 @@ public class StatusBarTest extends SysuiTestCase { mNotificationLogger = new NotificationLogger(mNotificationListener, Dependency.get(UiOffloadThread.class), mEntryManager, mStatusBarStateController, mExpansionStateLogger); + mNotificationLogger.setVisibilityReporter(mock(Runnable.class)); mDependency.injectTestDependency(NotificationLogger.class, mNotificationLogger); DozeLog.traceDozing(mContext, false /* dozing */); @@ -253,7 +254,7 @@ public class StatusBarTest extends SysuiTestCase { when(mRemoteInputManager.getController()).thenReturn(mRemoteInputController); mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache, - mKeyguardIndicationController, mStackScroller, mHeadsUpManager, + mKeyguardIndicationController, mStackScroller, mPowerManager, mNotificationPanelView, mBarService, mNotificationListener, mNotificationLogger, mVisualStabilityManager, mViewHierarchyManager, mEntryManager, mScrimController, mBiometricUnlockController, @@ -269,19 +270,13 @@ public class StatusBarTest extends SysuiTestCase { SystemUIFactory.getInstance().getRootComponent() .getStatusBarInjector() .createStatusBar(mStatusBar); + mStatusBar.setHeadsUpManager(mHeadsUpManager); mStatusBar.putComponent(StatusBar.class, mStatusBar); Dependency.get(InitController.class).executePostInitTasks(); mEntryManager.setUpForTest(mock(NotificationPresenter.class), mStackScroller, mHeadsUpManager, mNotificationData); mEntryManager.addNotificationEntryListener(mEntryListener); mNotificationLogger.setUpWithContainer(mStackScroller); - - TestableLooper.get(this).setMessageHandler(m -> { - if (m.getCallback() == mStatusBar.mNotificationLogger.getVisibilityReporter()) { - return false; - } - return true; - }); } @Test @@ -644,10 +639,10 @@ public class StatusBarTest extends SysuiTestCase { @Test public void testPulseWhileDozing_notifyAuthInterrupt() { HashSet<Integer> reasonsWantingAuth = new HashSet<>( - Collections.singletonList(DozeLog.PULSE_REASON_NOTIFICATION)); + Collections.singletonList(DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN)); HashSet<Integer> reasonsSkippingAuth = new HashSet<>( Arrays.asList(DozeLog.PULSE_REASON_INTENT, - DozeLog.PULSE_REASON_SENSOR_WAKE_LOCK_SCREEN, + DozeLog.PULSE_REASON_NOTIFICATION, DozeLog.PULSE_REASON_SENSOR_SIGMOTION, DozeLog.REASON_SENSOR_PICKUP, DozeLog.REASON_SENSOR_DOUBLE_TAP, @@ -666,6 +661,7 @@ public class StatusBarTest extends SysuiTestCase { return null; }).when(mDozeScrimController).pulse(any(), anyInt()); + mStatusBar.mDozeServiceHost.mWakeLockScreenPerformsAuth = true; for (int i = 0; i < DozeLog.REASONS; i++) { reset(mKeyguardUpdateMonitor); mStatusBar.mDozeServiceHost.pulseWhileDozing(mock(DozeHost.PulseCallback.class), i); @@ -765,7 +761,7 @@ public class StatusBarTest extends SysuiTestCase { static class TestableStatusBar extends StatusBar { public TestableStatusBar(StatusBarKeyguardViewManager man, UnlockMethodCache unlock, KeyguardIndicationController key, - NotificationStackScrollLayout stack, HeadsUpManagerPhone hum, + NotificationStackScrollLayout stack, PowerManager pm, NotificationPanelView panelView, IStatusBarService barService, NotificationListener notificationListener, NotificationLogger notificationLogger, @@ -784,7 +780,7 @@ public class StatusBarTest extends SysuiTestCase { NotificationShelf notificationShelf, NotificationLockscreenUserManager notificationLockscreenUserManager, CommandQueue commandQueue, - NotificationPresenter notificationPresenter, + StatusBarNotificationPresenter notificationPresenter, BubbleController bubbleController, NavigationBarController navBarController, AutoHideController autoHideController, @@ -794,7 +790,6 @@ public class StatusBarTest extends SysuiTestCase { mUnlockMethodCache = unlock; mKeyguardIndicationController = key; mStackScroller = stack; - mHeadsUpManager = hum; mPowerManager = pm; mNotificationPanel = panelView; mBarService = barService; @@ -824,6 +819,7 @@ public class StatusBarTest extends SysuiTestCase { mAutoHideController = autoHideController; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mStatusBarWindow = statusBarWindow; + mDozeServiceHost.mWakeLockScreenPerformsAuth = false; } private WakefulnessLifecycle createAwakeWakefulnessLifecycle() { @@ -842,6 +838,10 @@ public class StatusBarTest extends SysuiTestCase { mState = state; } + void setHeadsUpManager(HeadsUpManagerPhone headsUpManager) { + mHeadsUpManager = headsUpManager; + } + public void setUserSetupForTest(boolean userSetup) { mUserSetup = userSetup; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java index fea41a441065..4ffaeaef77b4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowControllerTest.java @@ -33,6 +33,8 @@ import android.view.WindowManager; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.statusbar.SysuiStatusBarStateController; +import com.android.systemui.statusbar.policy.ConfigurationController; import org.junit.Before; import org.junit.Test; @@ -54,6 +56,12 @@ public class StatusBarWindowControllerTest extends SysuiTestCase { private ViewGroup mStatusBarView; @Mock private IActivityManager mActivityManager; + @Mock + private SysuiStatusBarStateController mStatusBarStateController; + @Mock + private ConfigurationController mConfigurationController; + @Mock + private KeyguardBypassController mKeyguardBypassController; private StatusBarWindowController mStatusBarWindowController; @@ -63,7 +71,8 @@ public class StatusBarWindowControllerTest extends SysuiTestCase { when(mDozeParameters.getAlwaysOn()).thenReturn(true); mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager, - mActivityManager, mDozeParameters); + mActivityManager, mDozeParameters, mStatusBarStateController, + mConfigurationController, mKeyguardBypassController); mStatusBarWindowController.add(mStatusBarView, 100 /* height */); } @@ -88,7 +97,8 @@ public class StatusBarWindowControllerTest extends SysuiTestCase { @Test public void testOnThemeChanged_doesntCrash() { mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager, - mActivityManager, mDozeParameters); + mActivityManager, mDozeParameters, mStatusBarStateController, + mConfigurationController, mKeyguardBypassController); mStatusBarWindowController.onThemeChanged(); } @@ -100,7 +110,8 @@ public class StatusBarWindowControllerTest extends SysuiTestCase { @Test public void testSetForcePluginOpen_beforeStatusBarInitialization() { mStatusBarWindowController = new StatusBarWindowController(mContext, mWindowManager, - mActivityManager, mDozeParameters); + mActivityManager, mDozeParameters, mStatusBarStateController, + mConfigurationController, mKeyguardBypassController); mStatusBarWindowController.setForcePluginOpen(true); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index 3464fe574007..9ae9ceb2629f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -181,6 +181,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected void setDefaultSubId(int subId) { when(mMockSubDefaults.getDefaultDataSubId()).thenReturn(subId); when(mMockSubDefaults.getDefaultVoiceSubId()).thenReturn(subId); + when(mMockSubDefaults.getActiveDataSubId()).thenReturn(subId); } protected void setSubscriptions(int... subIds) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java index 8c5fac47885f..0cb575483466 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java @@ -109,7 +109,9 @@ public class SmartReplyViewTest extends SysuiTestCase { MockitoAnnotations.initMocks(this); mReceiver = new BlockingQueueIntentReceiver(); mContext.registerReceiver(mReceiver, new IntentFilter(TEST_ACTION)); - mDependency.get(KeyguardDismissUtil.class).setDismissHandler(action -> action.onDismiss()); + mDependency.get(KeyguardDismissUtil.class).setDismissHandler((action, unused) -> { + action.onDismiss(); + }); mDependency.injectMockDependency(ShadeController.class); mDependency.injectTestDependency(ActivityStarter.class, mActivityStarter); mDependency.injectTestDependency(SmartReplyConstants.class, mConstants); @@ -162,7 +164,7 @@ public class SmartReplyViewTest extends SysuiTestCase { @Test public void testSendSmartReply_keyguardCancelled() throws InterruptedException { - mDependency.get(KeyguardDismissUtil.class).setDismissHandler(action -> {}); + mDependency.get(KeyguardDismissUtil.class).setDismissHandler((action, unused) -> {}); setSmartReplies(TEST_CHOICES); mView.getChildAt(2).performClick(); @@ -173,7 +175,9 @@ public class SmartReplyViewTest extends SysuiTestCase { @Test public void testSendSmartReply_waitsForKeyguard() throws InterruptedException { AtomicReference<OnDismissAction> actionRef = new AtomicReference<>(); - mDependency.get(KeyguardDismissUtil.class).setDismissHandler(actionRef::set); + mDependency.get(KeyguardDismissUtil.class).setDismissHandler((action, unused) -> { + actionRef.set(action); + }); setSmartReplies(TEST_CHOICES); mView.getChildAt(2).performClick(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/hardware/FakeSensorManager.java b/packages/SystemUI/tests/src/com/android/systemui/utils/hardware/FakeSensorManager.java index a4ae166d0675..29b8ab600caf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/hardware/FakeSensorManager.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/hardware/FakeSensorManager.java @@ -40,18 +40,23 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import javax.annotation.Nullable; + /** * Rudimentary fake for SensorManager * - * Currently only supports the proximity sensor. + * Currently only supports proximity, light and tap sensors. * * Note that this class ignores the "Handler" argument, so the test is responsible for calling the * listener on the right thread. */ public class FakeSensorManager extends SensorManager { + public static final String TAP_SENSOR_TYPE = "tapSensorType"; + private final MockProximitySensor mMockProximitySensor; private final FakeGenericSensor mFakeLightSensor; + private final FakeGenericSensor mFakeTapSensor; private final FakeGenericSensor[] mSensors; public FakeSensorManager(Context context) throws Exception { @@ -59,12 +64,13 @@ public class FakeSensorManager extends SensorManager { .getDefaultSensor(Sensor.TYPE_PROXIMITY); if (proxSensor == null) { // No prox? Let's create a fake one! - proxSensor = createSensor(Sensor.TYPE_PROXIMITY); + proxSensor = createSensor(Sensor.TYPE_PROXIMITY, null); } mSensors = new FakeGenericSensor[]{ mMockProximitySensor = new MockProximitySensor(proxSensor), - mFakeLightSensor = new FakeGenericSensor(createSensor(Sensor.TYPE_LIGHT)), + mFakeLightSensor = new FakeGenericSensor(createSensor(Sensor.TYPE_LIGHT, null)), + mFakeTapSensor = new FakeGenericSensor(createSensor(99, TAP_SENSOR_TYPE)) }; } @@ -76,6 +82,10 @@ public class FakeSensorManager extends SensorManager { return mFakeLightSensor; } + public FakeGenericSensor getFakeTapSensor() { + return mFakeTapSensor; + } + @Override public Sensor getDefaultSensor(int type) { Sensor s = super.getDefaultSensor(type); @@ -160,13 +170,13 @@ public class FakeSensorManager extends SensorManager { @Override protected boolean requestTriggerSensorImpl(TriggerEventListener listener, Sensor sensor) { - return false; + return true; } @Override protected boolean cancelTriggerSensorImpl(TriggerEventListener listener, Sensor sensor, boolean disable) { - return false; + return true; } @Override @@ -185,12 +195,15 @@ public class FakeSensorManager extends SensorManager { return false; } - private Sensor createSensor(int type) throws Exception { + private Sensor createSensor(int type, @Nullable String stringType) throws Exception { Constructor<Sensor> constr = Sensor.class.getDeclaredConstructor(); constr.setAccessible(true); Sensor sensor = constr.newInstance(); setSensorType(sensor, type); + if (stringType != null) { + setSensorField(sensor, "mStringType", stringType); + } setSensorField(sensor, "mName", "Mock " + sensor.getStringType() + "/" + type); setSensorField(sensor, "mVendor", "Mock Vendor"); setSensorField(sensor, "mVersion", 1); diff --git a/packages/VpnDialogs/res/values-hi/strings.xml b/packages/VpnDialogs/res/values-hi/strings.xml index 34b79cb4100a..eed0858787d9 100644 --- a/packages/VpnDialogs/res/values-hi/strings.xml +++ b/packages/VpnDialogs/res/values-hi/strings.xml @@ -22,7 +22,7 @@ <string name="session" msgid="6470628549473641030">"सत्र:"</string> <string name="duration" msgid="3584782459928719435">"अवधि:"</string> <string name="data_transmitted" msgid="7988167672982199061">"भेजे गए:"</string> - <string name="data_received" msgid="4062776929376067820">"प्राप्त:"</string> + <string name="data_received" msgid="4062776929376067820">"पाया:"</string> <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> बाइट / <xliff:g id="NUMBER_1">%2$s</xliff:g> पैकेट"</string> <string name="always_on_disconnected_title" msgid="1906740176262776166">"हमेशा चालू रहने वाले VPN से नहीं जुड़ पा रहा है"</string> <string name="always_on_disconnected_message" msgid="555634519845992917">"<xliff:g id="VPN_APP_0">%1$s</xliff:g> को हर समय जुड़े रहने के लिए सेट अप किया गया है, लेकिन वह इस समय नहीं जुड़ पा रहा है. जब तक आपका फ़ोन <xliff:g id="VPN_APP_1">%1$s</xliff:g> से नहीं जुड़ जाता, तब तक वह सार्वजनिक नेटवर्क का इस्तेमाल करेगा."</string> diff --git a/packages/overlays/Android.mk b/packages/overlays/Android.mk index 3f16c128f664..3eb90491f902 100644 --- a/packages/overlays/Android.mk +++ b/packages/overlays/Android.mk @@ -44,7 +44,6 @@ LOCAL_REQUIRED_MODULES := \ IconPackRoundedSystemUIOverlay \ IconPackRoundedThemePickerUIOverlay \ IconShapeRoundedRectOverlay \ - IconShapeSquareOverlay \ IconShapeSquircleOverlay \ IconShapeTeardropOverlay \ NavigationBarMode3ButtonOverlay \ diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_battery_status_bad_24dp.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_battery_80_24dp.xml index 22e183c694d5..4d8dbdba9207 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_battery_status_bad_24dp.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_battery_80_24dp.xml @@ -21,5 +21,5 @@ android:width="24dp" > <path android:fillColor="@android:color/white" - android:pathData="M10,2v2H8.33C7.6,4,7,4.6,7,5.33v15.33C7,21.4,7.6,22,8.33,22h7.33C16.4,22,17,21.4,17,20.67V5.33C17,4.6,16.4,4,15.67,4 H14V2H10z M15,13c0,0.55-0.45,1-1,1h-1v1c0,0.55-0.45,1-1,1s-1-0.45-1-1v-1h-1c-0.55,0-1-0.45-1-1s0.45-1,1-1h1v-1 c0-0.55,0.45-1,1-1s1,0.45,1,1v1h1C14.55,12,15,12.45,15,13z" /> + android:pathData="M18,19V7c0-1.66-1.34-3-3-3h-1c0-0.55-0.45-1-1-1h-2c-0.55,0-1,0.45-1,1H9C7.34,4,6,5.34,6,7v12c0,1.66,1.34,3,3,3h6 C16.66,22,18,20.66,18,19z M9,5.5h6c0.83,0,1.5,0.67,1.5,1.5v1h-9V7C7.5,6.17,8.17,5.5,9,5.5z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_bt_misc_hid.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_bt_misc_hid.xml index e182886d4252..5096f2f0f2e9 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_bt_misc_hid.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_bt_misc_hid.xml @@ -20,7 +20,6 @@ android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - <path android:pathData="M0,0h24v24H0V0z" /> <path android:fillColor="@android:color/white" android:pathData="M9,16.5V20c0,1.1,0.9,2,2,2h2c1.1,0,2-0.9,2-2v-3.5l-3-3L9,16.5z M13.5,20c0,0.28-0.22,0.5-0.5,0.5h-2 c-0.28,0-0.5-0.22-0.5-0.5v-2.88l1.5-1.5l1.5,1.5V20z M15,7.5V4c0-1.1-0.9-2-2-2h-2C9.9,2,9,2.9,9,4v3.5l3,3L15,7.5z M10.5,4 c0-0.28,0.22-0.5,0.5-0.5h2c0.28,0,0.5,0.22,0.5,0.5v2.88L12,8.38l-1.5-1.5V4z M7.5,9H4c-1.1,0-2,0.9-2,2v2c0,1.1,0.9,2,2,2h3.5 l3-3L7.5,9z M6.88,13.5H4c-0.28,0-0.5-0.22-0.5-0.5v-2c0-0.28,0.22-0.5,0.5-0.5h2.88l1.5,1.5L6.88,13.5z M20,9h-3.5l-3,3l3,3H20 c1.1,0,2-0.9,2-2v-2C22,9.9,21.1,9,20,9z M20.5,13c0,0.28-0.22,0.5-0.5,0.5h-2.88l-1.5-1.5l1.5-1.5H20c0.28,0,0.5,0.22,0.5,0.5V13z" /> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_file_copy.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_file_copy.xml index dc6ab95e23b1..b8e9845d5039 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_file_copy.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_file_copy.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="#FF737373" + android:tint="@*android:color/material_grey_600" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lock.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lock.xml index 1e3400b40e79..5a67f95788ee 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lock.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lock.xml @@ -16,7 +16,6 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="32dp" - android:tint="?android:attr/textColor" android:viewportHeight="24" android:viewportWidth="24" android:width="32dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lock_open.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lock_open.xml index f4606a2a9d3e..21abd6e2d3ba 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lock_open.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lock_open.xml @@ -16,7 +16,6 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="32dp" - android:tint="?android:attr/textColor" android:viewportHeight="24" android:viewportWidth="24" android:width="32dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lockscreen_ime.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lockscreen_ime.xml index 4344e32a75aa..455bdd50ceba 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lockscreen_ime.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_lockscreen_ime.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_mode_edit.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_mode_edit.xml index f0d782e03d11..aca3d52c1a24 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_mode_edit.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_mode_edit.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_delete_accent.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_notifications_alerted.xml index b4d88271284c..86863b3b6c98 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_delete_accent.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_notifications_alerted.xml @@ -16,17 +16,19 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="?android:attr/colorAccent" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > <path android:fillColor="@android:color/white" - android:pathData="M9,20h6c1.66,0,3-1.34,3-3V6h0.5c0.41,0,0.75-0.34,0.75-0.75S18.91,4.5,18.5,4.5H18h-3l-1-1h-4l-1,1H6H5.5 c-0.41,0-0.75,0.34-0.75,0.75S5.09,6,5.5,6H6v11C6,18.66,7.34,20,9,20z M16.5,6v11c0,0.83-0.67,1.5-1.5,1.5H9 c-0.83,0-1.5-0.67-1.5-1.5V6H16.5z" /> + android:pathData="M5.85,3.01C3.72,4.82,2.5,7.46,2.5,10.25C2.5,10.66,2.84,11,3.25,11S4,10.66,4,10.25c0-2.35,1.03-4.57,2.82-6.1 C7.14,3.88,7.17,3.41,6.91,3.1C6.64,2.78,6.17,2.74,5.85,3.01z" /> <path android:fillColor="@android:color/white" - android:pathData="M13.97,16c0.41,0,0.75-0.34,0.75-0.75v-6.5c0-0.41-0.34-0.75-0.75-0.75s-0.75,0.34-0.75,0.75v6.5 C13.22,15.66,13.55,16,13.97,16z" /> + android:pathData="M21.5,10.25c0-2.79-1.22-5.43-3.35-7.24c-0.32-0.27-0.79-0.23-1.06,0.08c-0.27,0.32-0.23,0.79,0.08,1.06 C18.97,5.68,20,7.9,20,10.25c0,0.41,0.34,0.75,0.75,0.75S21.5,10.66,21.5,10.25z" /> <path android:fillColor="@android:color/white" - android:pathData="M10,16c0.41,0,0.75-0.34,0.75-0.75v-6.5C10.75,8.34,10.41,8,10,8S9.25,8.34,9.25,8.75v6.5C9.25,15.66,9.59,16,10,16z" /> + android:pathData="M12,2.5c-0.83,0-1.5,0.67-1.5,1.5v0.7C7.91,5.36,6,7.71,6,10.5V15c0,0.55-0.45,1-1,1s-1,0.45-1,1v2h16v-2 c0-0.55-0.45-1-1-1s-1-0.45-1-1v-4.5c0-2.79-1.91-5.14-4.5-5.8V4C13.5,3.17,12.83,2.5,12,2.5z M16.5,10.5V15 c0,1.21,0.86,2.22,2,2.45v0.05h-13v-0.05c1.14-0.23,2-1.24,2-2.45v-4.5C7.5,8.02,9.52,6,12,6S16.5,8.02,16.5,10.5z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M14,20h-4c0,1.1,0.9,2,2,2S14,21.1,14,20z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_phone.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_phone.xml index 28733c1890cb..85c184b9f9a8 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_phone.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_phone.xml @@ -15,7 +15,9 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_battery_saver.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_battery_saver.xml index a558337902c4..73310b03f625 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_battery_saver.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_battery_saver.xml @@ -15,7 +15,9 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_bluetooth.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_bluetooth.xml index 452a032c49e9..19731249bfc7 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_bluetooth.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_bluetooth.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml new file mode 100644 index 000000000000..3cf7541219f0 --- /dev/null +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M12,20.5 L12,3.5 C16.687,3.5 20.5,7.313 20.5,12 C20.5,16.687 16.687,20.5 12,20.5 M12,2 C10.619,2 9.304,2.279 8.107,2.786 C7.51,3.039 6.941,3.349 6.409,3.708 C6.143,3.888 5.886,4.08 5.639,4.283 C4.651,5.099 3.822,6.1 3.207,7.233 C2.899,7.8 2.645,8.4 2.449,9.026 C2.255,9.652 2.12,10.305 2.052,10.978 C2.018,11.313 2,11.654 2,12 C2,17.522 6.478,22 12,22 C17.522,22 22,17.522 22,12 C22,6.478 17.522,2 12,2" + android:strokeWidth="1" /> +</vector> diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_0_4_bar.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_0_4_bar.xml index e09aeb7f1d2f..d9dfa54697e4 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_0_4_bar.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_0_4_bar.xml @@ -19,28 +19,32 @@ android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - <path - android:fillAlpha="0.3" - android:fillColor="@android:color/white" - android:pathData="M20,22H18.5V4.75A0.76 0.76 ,0,0,1,19.25,4h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" - android:strokeAlpha="0.3" - android:strokeWidth="1" /> - <path - android:fillAlpha="0.3" - android:fillColor="@android:color/white" - android:pathData="M15.33,22h-1.5V9.75A0.76 0.76 ,0,0,1,14.58,9h0a0.75 0.75 ,0,0,1,0.75 0.75 Z" - android:strokeAlpha="0.3" - android:strokeWidth="1" /> - <path - android:fillAlpha="0.3" - android:fillColor="@android:color/white" - android:pathData="M10.67,22H9.17V14.75A0.75 0.75 ,0,0,1,9.92,14h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" - android:strokeAlpha="0.3" - android:strokeWidth="1" /> - <path - android:fillAlpha="0.3" - android:fillColor="@android:color/white" - android:pathData="M6,22H4.5V19.75A0.76 0.76 ,0,0,1,5.25,19h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" - android:strokeAlpha="0.3" - android:strokeWidth="1" /> + <group + android:translateX="4.000000" + android:translateY="3.000000" > + <path + android:fillAlpha="0.3" + android:fillColor="@android:color/white" + android:pathData="M16,18 L14.5,18 L14.5,0.75 C14.5053858,0.338037936 14.8380379,0.00538581231 15.25,0 L15.25,0 C15.6619621,0.00538581231 15.9946142,0.338037936 16,0.75 L16,18 Z" + android:strokeAlpha="0.3" + android:strokeWidth="1" /> + <path + android:fillAlpha="0.3" + android:fillColor="@android:color/white" + android:pathData="M11.33,18 L9.83,18 L9.83,5.75 C9.83538581,5.33803794 10.1680379,5.00538581 10.58,5 L10.58,5 C10.9942136,5 11.33,5.33578644 11.33,5.75 L11.33,18 Z" + android:strokeAlpha="0.3" + android:strokeWidth="1" /> + <path + android:fillAlpha="0.3" + android:fillColor="@android:color/white" + android:pathData="M6.67,18 L5.17,18 L5.17,10.75 C5.17,10.3357864 5.50578644,10 5.92,10 L5.92,10 C6.33196206,10.0053858 6.66461419,10.3380379 6.67,10.75 L6.67,18 Z" + android:strokeAlpha="0.3" + android:strokeWidth="1" /> + <path + android:fillAlpha="0.3" + android:fillColor="@android:color/white" + android:pathData="M2,18 L0.5,18 L0.5,15.75 C0.505385812,15.3380379 0.838037936,15.0053858 1.25,15 L1.25,15 C1.66196206,15.0053858 1.99461419,15.3380379 2,15.75 L2,18 Z" + android:strokeAlpha="0.3" + android:strokeWidth="1" /> + </group> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_1_4_bar.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_1_4_bar.xml index 26e96ab4c5c8..70f91afab7d5 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_1_4_bar.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_1_4_bar.xml @@ -19,25 +19,30 @@ android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - <path - android:fillAlpha="0.3" - android:fillColor="@android:color/white" - android:pathData="M20,22H18.5V4.75A0.76 0.76 ,0,0,1,19.25,4h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" - android:strokeAlpha="0.3" - android:strokeWidth="1" /> - <path - android:fillAlpha="0.3" - android:fillColor="@android:color/white" - android:pathData="M15.33,22h-1.5V9.75A0.76 0.76 ,0,0,1,14.58,9h0a0.75 0.75 ,0,0,1,0.75 0.75 Z" - android:strokeAlpha="0.3" - android:strokeWidth="1" /> - <path - android:fillAlpha="0.3" - android:fillColor="@android:color/white" - android:pathData="M10.67,22H9.17V14.75A0.75 0.75 ,0,0,1,9.92,14h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" - android:strokeAlpha="0.3" - android:strokeWidth="1" /> - <path - android:fillColor="@android:color/white" - android:pathData="M6,22H4.5V19.75A0.76 0.76 ,0,0,1,5.25,19h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" /> + <group + android:translateX="4.000000" + android:translateY="3.000000" > + <path + android:fillAlpha="0.3" + android:fillColor="@android:color/white" + android:pathData="M16,18 L14.5,18 L14.5,0.75 C14.5053858,0.338037936 14.8380379,0.00538581231 15.25,0 L15.25,0 C15.6619621,0.00538581231 15.9946142,0.338037936 16,0.75 L16,18 Z" + android:strokeAlpha="0.3" + android:strokeWidth="1" /> + <path + android:fillAlpha="0.3" + android:fillColor="@android:color/white" + android:pathData="M11.33,18 L9.83,18 L9.83,5.75 C9.83538581,5.33803794 10.1680379,5.00538581 10.58,5 L10.58,5 C10.9942136,5 11.33,5.33578644 11.33,5.75 L11.33,18 Z" + android:strokeAlpha="0.3" + android:strokeWidth="1" /> + <path + android:fillAlpha="0.3" + android:fillColor="@android:color/white" + android:pathData="M6.67,18 L5.17,18 L5.17,10.75 C5.17,10.3357864 5.50578644,10 5.92,10 L5.92,10 C6.33196206,10.0053858 6.66461419,10.3380379 6.67,10.75 L6.67,18 Z" + android:strokeAlpha="0.3" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M2,18 L0.5,18 L0.5,15.75 C0.505385812,15.3380379 0.838037936,15.0053858 1.25,15 L1.25,15 C1.66196206,15.0053858 1.99461419,15.3380379 2,15.75 L2,18 Z" + android:strokeWidth="1" /> + </group> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_2_4_bar.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_2_4_bar.xml index 53be899d5a8d..f014eea9354f 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_2_4_bar.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_2_4_bar.xml @@ -19,22 +19,28 @@ android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - <path - android:fillAlpha="0.3" - android:fillColor="@android:color/white" - android:pathData="M20,22H18.5V4.75A0.76 0.76 ,0,0,1,19.25,4h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" - android:strokeAlpha="0.3" - android:strokeWidth="1" /> - <path - android:fillAlpha="0.3" - android:fillColor="@android:color/white" - android:pathData="M15.33,22h-1.5V9.75A0.76 0.76 ,0,0,1,14.58,9h0a0.75 0.75 ,0,0,1,0.75 0.75 Z" - android:strokeAlpha="0.3" - android:strokeWidth="1" /> - <path - android:fillColor="@android:color/white" - android:pathData="M10.67,22H9.17V14.75A0.75 0.75 ,0,0,1,9.92,14h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M6,22H4.5V19.75A0.76 0.76 ,0,0,1,5.25,19h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" /> + <group + android:translateX="4.000000" + android:translateY="3.000000" > + <path + android:fillAlpha="0.3" + android:fillColor="@android:color/white" + android:pathData="M16,18 L14.5,18 L14.5,0.75 C14.5053858,0.338037936 14.8380379,0.00538581231 15.25,0 L15.25,0 C15.6619621,0.00538581231 15.9946142,0.338037936 16,0.75 L16,18 Z" + android:strokeAlpha="0.3" + android:strokeWidth="1" /> + <path + android:fillAlpha="0.3" + android:fillColor="@android:color/white" + android:pathData="M11.33,18 L9.83,18 L9.83,5.75 C9.83538581,5.33803794 10.1680379,5.00538581 10.58,5 L10.58,5 C10.9942136,5 11.33,5.33578644 11.33,5.75 L11.33,18 Z" + android:strokeAlpha="0.3" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M6.67,18 L5.17,18 L5.17,10.75 C5.17,10.3357864 5.50578644,10 5.92,10 L5.92,10 C6.33196206,10.0053858 6.66461419,10.3380379 6.67,10.75 L6.67,18 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M2,18 L0.5,18 L0.5,15.75 C0.505385812,15.3380379 0.838037936,15.0053858 1.25,15 L1.25,15 C1.66196206,15.0053858 1.99461419,15.3380379 2,15.75 L2,18 Z" + android:strokeWidth="1" /> + </group> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_3_4_bar.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_3_4_bar.xml index 9139bb449509..9b83fab35144 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_3_4_bar.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_3_4_bar.xml @@ -19,19 +19,26 @@ android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - <path - android:fillAlpha="0.3" - android:fillColor="@android:color/white" - android:pathData="M20,22H18.5V4.75A0.76 0.76 ,0,0,1,19.25,4h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" - android:strokeAlpha="0.3" - android:strokeWidth="1" /> - <path - android:fillColor="@android:color/white" - android:pathData="M15.33,22h-1.5V9.75A0.76 0.76 ,0,0,1,14.58,9h0a0.75 0.75 ,0,0,1,0.75 0.75 Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M10.67,22H9.17V14.75A0.75 0.75 ,0,0,1,9.92,14h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M6,22H4.5V19.75A0.76 0.76 ,0,0,1,5.25,19h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" /> + <group + android:translateX="4.000000" + android:translateY="3.000000" > + <path + android:fillAlpha="0.3" + android:fillColor="@android:color/white" + android:pathData="M16,18 L14.5,18 L14.5,0.75 C14.5053858,0.338037936 14.8380379,0.00538581231 15.25,0 L15.25,0 C15.6619621,0.00538581231 15.9946142,0.338037936 16,0.75 L16,18 Z" + android:strokeAlpha="0.3" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M11.33,18 L9.83,18 L9.83,5.75 C9.83538581,5.33803794 10.1680379,5.00538581 10.58,5 L10.58,5 C10.9942136,5 11.33,5.33578644 11.33,5.75 L11.33,18 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M6.67,18 L5.17,18 L5.17,10.75 C5.17,10.3357864 5.50578644,10 5.92,10 L5.92,10 C6.33196206,10.0053858 6.66461419,10.3380379 6.67,10.75 L6.67,18 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M2,18 L0.5,18 L0.5,15.75 C0.505385812,15.3380379 0.838037936,15.0053858 1.25,15 L1.25,15 C1.66196206,15.0053858 1.99461419,15.3380379 2,15.75 L2,18 Z" + android:strokeWidth="1" /> + </group> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_4_4_bar.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_4_4_bar.xml index 2c8d70123f60..6f7f48d1ea96 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_4_4_bar.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/ic_signal_cellular_4_4_bar.xml @@ -19,16 +19,24 @@ android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - <path - android:fillColor="@android:color/white" - android:pathData="M20,22H18.5V4.75A0.76 0.76 ,0,0,1,19.25,4h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M15.33,22h-1.5V9.75A0.76 0.76 ,0,0,1,14.58,9h0a0.75 0.75 ,0,0,1,0.75 0.75 Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M10.67,22H9.17V14.75A0.75 0.75 ,0,0,1,9.92,14h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M6,22H4.5V19.75A0.76 0.76 ,0,0,1,5.25,19h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" /> + <group + android:translateX="4.000000" + android:translateY="3.000000" > + <path + android:fillColor="@android:color/white" + android:pathData="M16,18 L14.5,18 L14.5,0.75 C14.5053858,0.338037936 14.8380379,0.00538581231 15.25,0 L15.25,0 C15.6619621,0.00538581231 15.9946142,0.338037936 16,0.75 L16,18 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M11.33,18 L9.83,18 L9.83,5.75 C9.83538581,5.33803794 10.1680379,5.00538581 10.58,5 L10.58,5 C10.9942136,5 11.33,5.33578644 11.33,5.75 L11.33,18 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M6.67,18 L5.17,18 L5.17,10.75 C5.17,10.3357864 5.50578644,10 5.92,10 L5.92,10 C6.33196206,10.0053858 6.66461419,10.3380379 6.67,10.75 L6.67,18 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M2,18 L0.5,18 L0.5,15.75 C0.505385812,15.3380379 0.838037936,15.0053858 1.25,15 L1.25,15 C1.66196206,15.0053858 1.99461419,15.3380379 2,15.75 L2,18 Z" + android:strokeWidth="1" /> + </group> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_activity_recognition.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_activity_recognition.xml index 5ad146eb21ac..cbd60d880fb2 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_activity_recognition.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_activity_recognition.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_aural.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_aural.xml new file mode 100644 index 000000000000..64802640a9ec --- /dev/null +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_aural.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="2.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M12.64,3 L12.64,8.82352941 C12.2536,8.5 11.772,8.29411765 11.24,8.29411765 C10.0024,8.29411765 9,9.34705882 9,10.6470588 C9,11.9470588 10.0024,13 11.24,13 C12.4776,13 13.48,11.9470588 13.48,10.6470588 L13.48,5.00157166 L15.02,5.00157166 C15.5576,5.00157166 16,4.53686577 16,3.97215989 L16,3 L12.64,3 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M20,2 C20,0.9 19.1,0 18,0 L6,0 C4.9,0 4,0.9 4,2 L4,14 C4,15.1 4.9,16 6,16 L18,16 C19.1,16 20,15.1 20,14 L20,2 Z M18.5,14 C18.5,14.28 18.28,14.5 18,14.5 L6,14.5 C5.72,14.5 5.5,14.28 5.5,14 L5.5,2 C5.5,1.72 5.72,1.5 6,1.5 L18,1.5 C18.28,1.5 18.5,1.72 18.5,2 L18.5,14 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M0.5,4.75 L0.5,16.75 C0.5,18.27 1.73,19.5 3.25,19.5 L15.25,19.5 C15.66,19.5 16,19.16 16,18.75 C16,18.34 15.66,18 15.25,18 L3.25,18 C2.56,18 2,17.44 2,16.75 L2,4.75 C2,4.34 1.66,4 1.25,4 C0.84,4 0.5,4.34 0.5,4.75 Z" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_calendar.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_calendar.xml index 781c0f8e8ea5..397050fd88f4 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_calendar.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_calendar.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_call_log.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_call_log.xml index 126b70cff251..b56eec39334c 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_call_log.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_call_log.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_camera.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_camera.xml index 70d4fcc945df..c8cb2e2cfc1f 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_camera.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_camera.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_contacts.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_contacts.xml index 6da4b269d312..6124df86e931 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_contacts.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_contacts.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_location.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_location.xml index d443a7484e5a..77ff42ad3e25 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_location.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_location.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_microphone.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_microphone.xml index cdac2d8cadaa..06aa0cd3f238 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_microphone.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_microphone.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_phone_calls.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_phone_calls.xml index 991f320add6c..3aea5f44902b 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_phone_calls.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_phone_calls.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_sensors.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_sensors.xml index e4dee2adc467..4d70fc90850e 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_sensors.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_sensors.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_sms.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_sms.xml index d15cfa3b1e3a..30ed8c92a198 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_sms.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_sms.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_storage.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_storage.xml index 29d26736135b..52cd4c1c7153 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_storage.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_storage.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_visual.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_visual.xml index 519136a28725..1c461791c868 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_visual.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/drawable/perm_group_visual.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularAndroidOverlay/res/values/config.xml b/packages/overlays/IconPackCircularAndroidOverlay/res/values/config.xml index ae5cc2bf9883..30f29f778858 100644 --- a/packages/overlays/IconPackCircularAndroidOverlay/res/values/config.xml +++ b/packages/overlays/IconPackCircularAndroidOverlay/res/values/config.xml @@ -30,4 +30,12 @@ <string name="config_batterymeterPowersavePath" translatable="false"> M 3.75,11.25 H 5.25 V 12.75 C 5.25,13.16 5.59,13.5 6,13.5 6.41,13.5 6.75,13.16 6.75,12.75 V 11.25 H 8.25 C 8.66,11.25 9,10.91 9,10.5 9,10.09 8.6601,9.75 8.25,9.75 H 6.75 V 8.25 C 6.75,7.84 6.41,7.5 6,7.5 5.59,7.5 5.25,7.84 5.25,8.25 V 9.75 H 3.75 C 3.34,9.75 3,10.09 3,10.5 3,10.91 3.34,11.25 3.75,11.25 Z </string> + <!-- X path for SignalDrawable as defined on a 24x24 canvas. --> + <string name="config_signalXPath" translatable="false"> + M 17.81,18.75 L 19.81,16.75 C 20.01,16.56 20.09,16.28 20.02,16.02 C 19.96,15.75 19.75,15.54 19.48,15.47 C 19.22,15.41 18.94,15.49 18.75,15.69 L 16.75,17.69 L 14.75,15.69 C 14.56,15.49 14.28,15.41 14.02,15.47 C 13.75,15.54 13.54,15.75 13.47,16.02 C 13.41,16.28 13.49,16.56 13.69,16.75 L 15.69,18.75 L 13.69,20.75 C 13.4,21.04 13.4,21.52 13.69,21.81 C 13.98,22.1 14.46,22.1 14.75,21.81 L 16.75,19.81 L 18.75,21.81 C 19.04,22.1 19.52,22.1 19.81,21.81 C 20.1,21.52 20.1,21.04 19.81,20.75 Z + </string> + <!-- config_signalCutout{Height,Width}Fraction define fraction of the 24x24 canvas that + should be cut out to display config_signalXPath.--> + <item name="config_signalCutoutWidthFraction" format="float" type="dimen">10.5</item> + <item name="config_signalCutoutHeightFraction" format="float" type="dimen">11</item> </resources> diff --git a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_setting.xml b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_setting.xml index 4c9b5d7b1c48..f1f0f507d4b9 100644 --- a/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_setting.xml +++ b/packages/overlays/IconPackCircularLauncherOverlay/res/drawable/ic_setting.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/textColorPrimary" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_arrow_back.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_arrow_back.xml index 920ecb5deb70..a9e1ffe6d69e 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_arrow_back.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_arrow_back.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_battery_saver_accent_24dp.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_battery_saver_accent_24dp.xml deleted file mode 100644 index 01d87ce25a2f..000000000000 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_battery_saver_accent_24dp.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2019 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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="24dp" - android:tint="?android:attr/colorAccent" - android:viewportHeight="24" - android:viewportWidth="24" - android:width="24dp" > - <path - android:fillColor="@android:color/white" - android:pathData="M9.75,13.75h1.5v1.5c0,0.41,0.34,0.75,0.75,0.75s0.75-0.34,0.75-0.75v-1.5h1.5c0.41,0,0.75-0.34,0.75-0.75 s-0.34-0.75-0.75-0.75h-1.5v-1.5c0-0.41-0.34-0.75-0.75-0.75s-0.75,0.34-0.75,0.75v1.5h-1.5C9.34,12.25,9,12.59,9,13 S9.34,13.75,9.75,13.75z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M6,19c0,1.66,1.34,3,3,3h6c1.66,0,3-1.34,3-3V7c0-1.66-1.34-3-3-3h-1c0-0.55-0.45-1-1-1h-2c-0.55,0-1,0.45-1,1H9 C7.34,4,6,5.34,6,7V19z M7.5,7c0-0.83,0.67-1.5,1.5-1.5h6c0.83,0,1.5,0.67,1.5,1.5v12c0,0.83-0.67,1.5-1.5,1.5H9 c-0.83,0-1.5-0.67-1.5-1.5V7z" /> -</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_battery_status_bad_24dp.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_battery_status_bad_24dp.xml deleted file mode 100644 index a558337902c4..000000000000 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_battery_status_bad_24dp.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2019 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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="24dp" - android:viewportHeight="24" - android:viewportWidth="24" - android:width="24dp" > - <path - android:fillColor="@android:color/white" - android:pathData="M9.75,13.75h1.5v1.5c0,0.41,0.34,0.75,0.75,0.75s0.75-0.34,0.75-0.75v-1.5h1.5c0.41,0,0.75-0.34,0.75-0.75 s-0.34-0.75-0.75-0.75h-1.5v-1.5c0-0.41-0.34-0.75-0.75-0.75s-0.75,0.34-0.75,0.75v1.5h-1.5C9.34,12.25,9,12.59,9,13 S9.34,13.75,9.75,13.75z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M6,19c0,1.66,1.34,3,3,3h6c1.66,0,3-1.34,3-3V7c0-1.66-1.34-3-3-3h-1c0-0.55-0.45-1-1-1h-2c-0.55,0-1,0.45-1,1H9 C7.34,4,6,5.34,6,7V19z M7.5,7c0-0.83,0.67-1.5,1.5-1.5h6c0.83,0,1.5,0.67,1.5,1.5v12c0,0.83-0.67,1.5-1.5,1.5H9 c-0.83,0-1.5-0.67-1.5-1.5V7z" /> -</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_cellular_off.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_cellular_off.xml index 57fcebc91d2e..6df47564407e 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_cellular_off.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_cellular_off.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorAccent" android:viewportHeight="24" diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_chevron_right_24dp.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_chevron_right_24dp.xml index 9569e68be613..82df1de6211c 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_chevron_right_24dp.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_chevron_right_24dp.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_content_copy_grey600_24dp.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_content_copy_grey600_24dp.xml index 9dea4ca2ea28..b8e9845d5039 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_content_copy_grey600_24dp.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_content_copy_grey600_24dp.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="#757575" + android:tint="@*android:color/material_grey_600" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_data_saver.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_data_saver.xml index 77c0a158ebdd..ba3c5808d26c 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_data_saver.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_data_saver.xml @@ -15,18 +15,19 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - <path - android:fillColor="@android:color/white" - android:pathData="M12,7a0.76 0.76 ,0,0,0-0.75 0.75 v3.5H7.75a0.75 0.75 ,0,0,0,0,1.5h3.5v3.5a0.75 0.75 ,0,0,0,1.5,0v-3.5h3.5a0.75 0.75 ,0,0,0,0-1.5h-3.5V7.75A0.76 0.76 ,0,0,0,12,7Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M3.36,7A10,10,0,0,0,20.27,17.64L18.1,16.39A7.5,7.5,0,1,1,11.25,4.56V2.05A10,10,0,0,0,3.36,7Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M21,16.35a10,10,0,0,0-8.27-14.3V4.56a7.48,7.48,0,0,1,6.1,10.54Z" /> + <group + android:translateX="2.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M17.5000671,10 C17.5000671,6.198 14.6680671,3.064 11.0000671,2.574 L11.0000671,0.05 C16.0500671,0.55 20.0000671,4.82 20.0000671,10 C20.0000671,11.45 19.6800671,12.83 19.1200671,14.07 L16.9560671,12.796 C17.3040671,11.932 17.5000671,10.989 17.5000671,10 Z M10.0000671,17.5 C12.3900671,17.5 14.5140671,16.378 15.8870671,14.637 C16.6270671,15.073 18.0500671,15.91 18.0500671,15.91 C15.9790671,18.732 12.4710671,20.427 8.60106711,19.906 C4.22106711,19.316 0.68406711,15.774 0.0940671101,11.394 C-0.68693289,5.591 3.49306711,0.594 9.00006711,0.05 L9.00006711,2.574 C5.33206711,3.064 2.50006711,6.198 2.50006711,10 C2.50006711,14.142 5.85806711,17.5 10.0000671,17.5 Z M6,10 C6.00538581,9.58803794 6.33803794,9.25538581 6.75,9.25 L9.25,9.25 L9.25,6.75 C9.25,6.33578644 9.58578644,6 10,6 C10.4142136,6 10.75,6.33578644 10.75,6.75 L10.75,9.25 L13.25,9.25 C13.6642136,9.25 14,9.58578644 14,10 C14,10.4142136 13.6642136,10.75 13.25,10.75 L10.75,10.75 L10.75,13.25 C10.75,13.6642136 10.4142136,14 10,14 C9.58578644,14 9.25,13.6642136 9.25,13.25 L9.25,10.75 L6.75,10.75 C6.33803794,10.7446142 6.00538581,10.4119621 6,10 Z" + android:strokeWidth="1" /> + </group> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_devices_other.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_devices_other.xml index 17a191e2ad07..14898c465a31 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_devices_other.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_devices_other.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:viewportHeight="24" android:viewportWidth="24" diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_eject_24dp.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_eject_24dp.xml index 1c1fa4b7a5ee..abbab51e90e1 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_eject_24dp.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_eject_24dp.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_find_in_page_24px.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_find_in_page_24px.xml new file mode 100644 index 000000000000..fd1a00dc738b --- /dev/null +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_find_in_page_24px.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="4.000100" + android:translateY="2.000100" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M7.9999,15.2499 C6.2079,15.2499 4.7499,13.7919 4.7499,11.9999 C4.7499,10.2079 6.2079,8.7499 7.9999,8.7499 C9.7919,8.7499 11.2499,10.2079 11.2499,11.9999 C11.2499,13.7919 9.7919,15.2499 7.9999,15.2499 L7.9999,15.2499 Z M1.4999,17.7779 L1.4999,2.2219 C1.4999,1.8239 1.8529,1.4999 2.2859,1.4999 L9.6769,1.4999 L14.4999,6.1889 L14.4999,17.5799 L11.8269,14.7879 C12.3999,14.0029 12.7499,13.0439 12.7499,11.9999 C12.7499,9.3809 10.6189,7.2499 7.9999,7.2499 C5.3809,7.2499 3.2499,9.3809 3.2499,11.9999 C3.2499,14.6189 5.3809,16.7499 7.9999,16.7499 C9.0329,16.7499 9.9829,16.4089 10.7649,15.8469 L13.3039,18.4999 L2.2859,18.4999 C1.8529,18.4999 1.4999,18.1759 1.4999,17.7779 L1.4999,17.7779 Z M10.2859,-0.0001 L2.2859,-0.0001 C1.0229,-0.0001 -0.0001,0.9949 -0.0001,2.2219 L-0.0001,17.7779 C-0.0001,19.0049 1.0229,19.9999 2.2859,19.9999 L13.7139,19.9999 C14.9769,19.9999 15.9999,19.0049 15.9999,17.7779 L15.9999,5.5559 L10.2859,-0.0001 Z" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_help_actionbar.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_help_actionbar.xml index 8b388f2d8761..b980a2cce710 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_help_actionbar.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_help_actionbar.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_network_cell.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_network_cell.xml index b6fa9fcf8294..1d72e5fa284f 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_network_cell.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_network_cell.xml @@ -15,21 +15,30 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - <path - android:fillColor="@android:color/white" - android:pathData="M20,22H18.5V4.75A0.76 0.76 ,0,0,1,19.25,4h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M15.33,22h-1.5V9.75A0.76 0.76 ,0,0,1,14.58,9h0a0.75 0.75 ,0,0,1,0.75 0.75 Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M10.67,22H9.17V14.75A0.75 0.75 ,0,0,1,9.92,14h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M6,22H4.5V19.75A0.76 0.76 ,0,0,1,5.25,19h0a0.76 0.76 ,0,0,1,0.75 0.75 Z" /> + <group + android:translateX="4.000000" + android:translateY="3.000000" > + <path + android:fillColor="@android:color/white" + android:pathData="M16,18 L14.5,18 L14.5,0.75 C14.5053858,0.338037936 14.8380379,0.00538581231 15.25,0 L15.25,0 C15.6619621,0.00538581231 15.9946142,0.338037936 16,0.75 L16,18 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M11.33,18 L9.83,18 L9.83,5.75 C9.83538581,5.33803794 10.1680379,5.00538581 10.58,5 L10.58,5 C10.9942136,5 11.33,5.33578644 11.33,5.75 L11.33,18 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M6.67,18 L5.17,18 L5.17,10.75 C5.17,10.3357864 5.50578644,10 5.92,10 L5.92,10 C6.33196206,10.0053858 6.66461419,10.3380379 6.67,10.75 L6.67,18 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M2,18 L0.5,18 L0.5,15.75 C0.505385812,15.3380379 0.838037936,15.0053858 1.25,15 L1.25,15 C1.66196206,15.0053858 1.99461419,15.3380379 2,15.75 L2,18 Z" + android:strokeWidth="1" /> + </group> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_notifications_off_24dp.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_notifications_off_24dp.xml index 2dc6545c0fe3..2a21776232b4 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_notifications_off_24dp.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_notifications_off_24dp.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_scan_24dp.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_scan_24dp.xml new file mode 100644 index 000000000000..f160fe9cdd1e --- /dev/null +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_scan_24dp.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorAccent" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="3.000000" + android:translateY="3.000000" > + <path + android:fillColor="@android:color/white" + android:pathData="M1.5,4.5 L1.5,1.9 C1.5,1.6790861 1.6790861,1.5 1.9,1.5 L4.1,1.5 C4.3209139,1.5 4.5,1.6790861 4.5,1.9 L4.5,4.5 L1.5,4.5 L1.5,4.5 Z M0,6 L6,6 L6,1.5 C6,0.671572875 5.32842712,0 4.5,0 L1.5,0 C0.671572875,0 0,0.671572875 0,1.5 L0,6 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M13.5,4.5 L13.5,1.9 C13.5,1.6790861 13.6790861,1.5 13.9,1.5 L16.1,1.5 C16.3209139,1.5 16.5,1.6790861 16.5,1.9 L16.5,4.5 L13.5,4.5 L13.5,4.5 Z M12,6 L18,6 L18,1.5 C18,0.671572875 17.3284271,0 16.5,0 L13.5,0 C12.6715729,0 12,0.671572875 12,1.5 L12,6 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M4.5,13.5 L4.5,16.1 C4.5,16.3209139 4.3209139,16.5 4.1,16.5 L1.9,16.5 C1.6790861,16.5 1.5,16.3209139 1.5,16.1 L1.5,13.5 L4.5,13.5 L4.5,13.5 Z M6,12 L0,12 L0,16.5 C0,17.3284271 0.671572875,18 1.5,18 L4.5,18 C5.32842712,18 6,17.3284271 6,16.5 L6,12 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M 2 8 L 0 8 L 0 10 L 2 10 L 2 8 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M9,0 C8.58803794,0.00538581231 8.25538581,0.338037936 8.25,0.75 L8.25,5.75 C8.25000002,6.16421355 8.58578645,6.49999997 9,6.49999997 C9.41421355,6.49999997 9.74999998,6.16421355 9.75,5.75 L9.75,0.75 C9.74461419,0.338037936 9.41196206,0.00538581231 9,0 L9,0 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M13.75,12.25 L17.25,12.25 C17.6619621,12.2553858 17.9946142,12.5880379 18,13 C17.9946142,13.4119621 17.6619621,13.7446142 17.25,13.75 L13.75,13.75 L13.75,17.25 C13.75,17.6642136 13.4142136,18 13,18 C12.5857864,18 12.25,17.6642136 12.25,17.25 L12.25,13.75 L8.74999997,13.75 C8.33578642,13.75 8,13.4142136 8,13 C8,12.5857864 8.33578642,12.25 8.74999997,12.25 L12.25,12.25 L12.25,8.75 C12.2553858,8.33803794 12.5880379,8.00538581 13,8 C13.4119621,8.00538581 13.7446142,8.33803794 13.75,8.75 L13.75,12.25 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M 6 8 L 4 8 L 4 10 L 6 10 L 6 8 Z" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_data_usage.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_data_usage.xml index e48cc146a515..855e4bb2a39d 100644 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_data_usage.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_data_usage.xml @@ -22,8 +22,7 @@ android:width="24dp" > <path android:fillColor="@android:color/white" - android:pathData="M12,19.52a7.5,7.5,0,0,1-0.77-15V2.06A10,10,0,1,0,22,12.77h-2.5A7.52,7.52,0,0,1,12,19.52Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M19.48,11.27H22a10,10,0,0,0-9.23-9.22v2.5A7.51,7.51,0,0,1,19.48,11.27Z" /> + android:fillType="evenOdd" + android:pathData="M19.5000671,12 C19.5000671,8.198 16.6680671,5.064 13.0000671,4.574 L13.0000671,2.05 C18.0500671,2.55 22.0000671,6.82 22.0000671,12 C22.0000671,13.45 21.6800671,14.83 21.1200671,16.07 L18.9560671,14.796 C19.3040671,13.932 19.5000671,12.989 19.5000671,12 Z M12.0000671,19.5 C14.3900671,19.5 16.5140671,18.378 17.8870671,16.637 C18.6270671,17.073 20.0500671,17.91 20.0500671,17.91 C17.9790671,20.732 14.4710671,22.427 10.6010671,21.906 C6.22106711,21.316 2.68406711,17.774 2.09406711,13.394 C1.31306711,7.591 5.49306711,2.594 11.0000671,2.05 L11.0000671,4.574 C7.33206711,5.064 4.50006711,8.198 4.50006711,12 C4.50006711,16.142 7.85806711,19.5 12.0000671,19.5 Z" + android:strokeWidth="1" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_disable.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_disable.xml new file mode 100644 index 000000000000..0572fb72f82e --- /dev/null +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_disable.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="1.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M11,18.5 C6.313,18.5 2.5,14.687 2.5,10 C2.5,8.182 3.078,6.498 4.055,5.114 L15.887,16.945 C14.503,17.922 12.818,18.5 11,18.5 M20.031,18.969 L2.032,0.971 C1.739,0.678 1.264,0.678 0.971,0.971 C0.678,1.264 0.678,1.738 0.971,2.031 L2.983,4.043 C1.742,5.707 1,7.765 1,10 C1,15.522 5.477,20 11,20 C13.236,20 15.293,19.258 16.957,18.017 L18.971,20.029 C19.117,20.176 19.309,20.249 19.501,20.249 C19.693,20.249 19.885,20.176 20.031,20.029 C20.324,19.736 20.324,19.262 20.031,18.969" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M11,1.5 C15.687,1.5 19.5,5.313 19.5,10 C19.5,11.782 18.946,13.436 18.006,14.804 L19.078,15.877 C20.281,14.226 21,12.199 21,10 C21,4.478 16.522,0 11,0 C8.801,0 6.774,0.719 5.124,1.922 L6.196,2.994 C7.564,2.054 9.218,1.5 11,1.5" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_enable.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_enable.xml new file mode 100644 index 000000000000..41962b27b270 --- /dev/null +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_enable.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="2.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M12.25,0.2637 L12.25,1.8127 C15.847,2.8017 18.5,6.0927 18.5,9.9997 C18.5,14.6867 14.687,18.4997 10,18.4997 C5.313,18.4997 1.5,14.6867 1.5,9.9997 C1.5,6.0927 4.153,2.8017 7.75,1.8127 L7.75,0.2637 C3.312,1.2847 0,5.2517 0,9.9997 C0,15.5227 4.477,19.9997 10,19.9997 C15.523,19.9997 20,15.5227 20,9.9997 C20,5.2517 16.687,1.2847 12.25,0.2637" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M15.0303,9.9697 C14.7373,9.6767 14.2623,9.6767 13.9693,9.9697 L10.7503,13.1897 L10.7503,0.7387 C10.7503,0.3307 10.4143,-0.0003 10.0003,-0.0003 C9.5863,-0.0003 9.2503,0.3307 9.2503,0.7387 L9.2503,13.1897 L6.0303,9.9697 C5.7373,9.6767 5.2623,9.6767 4.9693,9.9697 C4.6763,10.2627 4.6763,10.7377 4.9693,11.0307 L10.0003,16.0607 L15.0303,11.0307 C15.3233,10.7377 15.3233,10.2627 15.0303,9.9697" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_language.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_language.xml new file mode 100644 index 000000000000..2c83c3481ba4 --- /dev/null +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_language.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <path + android:fillColor="@android:color/white" + android:pathData="M12,2C6.48,2,2,6.48,2,12c0,5.15,3.89,9.38,8.89,9.93c0.01,0.01,0.01,0.01,0.01,0.02l0.02-0.02C11.28,21.98,11.64,22,12,22 s0.72-0.02,1.08-0.06l0.02,0.02c0.01-0.01,0.01-0.01,0.01-0.02c5-0.55,8.89-4.79,8.89-9.93C22,6.48,17.52,2,12,2z M19.35,7.75 h-3.39c-0.39-1.35-0.97-2.67-1.73-3.94C16.41,4.4,18.24,5.84,19.35,7.75z M20.5,12c0,0.96-0.17,1.89-0.47,2.75h-3.69 c0.33-1.82,0.32-3.67-0.02-5.5h3.71C20.33,10.11,20.5,11.04,20.5,12z M12,20.5c-0.1,0-0.2-0.01-0.3-0.02 c-0.96-1.36-1.68-2.78-2.14-4.23h4.89c-0.47,1.45-1.18,2.87-2.14,4.23C12.2,20.49,12.1,20.5,12,20.5z M9.16,14.75 c-0.37-1.82-0.36-3.67,0.02-5.5h5.64c0.38,1.83,0.39,3.68,0.02,5.5H9.16z M3.5,12c0-0.96,0.17-1.89,0.47-2.75h3.71 c-0.34,1.83-0.35,3.68-0.02,5.5H3.97C3.67,13.89,3.5,12.96,3.5,12z M12,3.5c0.09,0,0.17,0.01,0.26,0.01 c0.96,1.37,1.68,2.79,2.16,4.24H9.58c0.48-1.45,1.2-2.87,2.16-4.24C11.83,3.51,11.91,3.5,12,3.5z M9.77,3.81 C9.01,5.08,8.43,6.4,8.04,7.75H4.65C5.76,5.84,7.59,4.4,9.77,3.81z M4.65,16.25h3.36c0.38,1.34,0.95,2.66,1.71,3.93 C7.56,19.58,5.75,18.15,4.65,16.25z M14.28,20.18c0.75-1.27,1.32-2.59,1.71-3.93h3.36C18.25,18.15,16.44,19.58,14.28,20.18z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_battery_status_bad_24dp.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_multiuser.xml index db4d302eb240..d6d655871b74 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_battery_status_bad_24dp.xml +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_multiuser.xml @@ -16,13 +16,14 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > <path android:fillColor="@android:color/white" - android:pathData="M9.74,13.75h1.5v1.5c0,0.41,0.34,0.75,0.75,0.75s0.75-0.34,0.75-0.75v-1.5h1.5c0.41,0,0.75-0.34,0.75-0.75 s-0.34-0.75-0.75-0.75h-1.5v-1.5c0-0.41-0.34-0.75-0.75-0.75s-0.75,0.34-0.75,0.75v1.5h-1.5c-0.41,0-0.75,0.34-0.75,0.75 S9.33,13.75,9.74,13.75z" /> + android:pathData="M8,8c0,2.21,1.79,4,4,4s4-1.79,4-4c0-2.21-1.79-4-4-4S8,5.79,8,8z M12,5.5c1.38,0,2.5,1.12,2.5,2.5 c0,1.38-1.12,2.5-2.5,2.5S9.5,9.38,9.5,8C9.5,6.62,10.62,5.5,12,5.5z" /> <path android:fillColor="@android:color/white" - android:pathData="M17,4h-3V3.49c0-0.55-0.45-1-1-1h-2c-0.55,0-1,0.45-1,1V4H7C6.45,4,6,4.45,6,5v16c0,0.55,0.45,1,1,1h10c0.55,0,1-0.45,1-1 V5C18,4.45,17.55,4,17,4z M16.5,20.5h-9v-15h9V20.5z" /> + android:pathData="M20,20c0-3.99-4-6-8-6s-8,2.01-8,6H20z M12,15.5c2.57,0,5.3,0.95,6.2,3H5.8C6.7,16.45,9.43,15.5,12,15.5z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_wireless_white.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_wireless_white.xml deleted file mode 100644 index fde996584f57..000000000000 --- a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_settings_wireless_white.xml +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2019 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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="24dp" - android:viewportHeight="24" - android:viewportWidth="24" - android:width="24dp" > - <path - android:fillColor="@android:color/white" - android:pathData="M 12 17 C 12.8284271247 17 13.5 17.6715728753 13.5 18.5 C 13.5 19.3284271247 12.8284271247 20 12 20 C 11.1715728753 20 10.5 19.3284271247 10.5 18.5 C 10.5 17.6715728753 11.1715728753 17 12 17 Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M19.42,11.84c-0.19,0-0.38-0.07-0.53-0.22C17.05,9.77,14.6,8.75,12,8.75s-5.05,1.02-6.89,2.86 c-0.29,0.29-0.77,0.29-1.06,0c-0.29-0.29-0.29-0.77,0-1.06C6.17,8.43,9,7.25,12,7.25s5.83,1.17,7.95,3.3 c0.29,0.29,0.29,0.77,0,1.06C19.8,11.76,19.61,11.84,19.42,11.84z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M22.61,8.65c-0.19,0-0.38-0.07-0.53-0.22C19.38,5.74,15.81,4.25,12,4.25S4.62,5.74,1.92,8.43c-0.29,0.29-0.77,0.29-1.06,0 s-0.29-0.77,0-1.06C3.84,4.39,7.79,2.75,12,2.75s8.16,1.64,11.14,4.61c0.29,0.29,0.29,0.77,0,1.06 C22.99,8.57,22.8,8.65,22.61,8.65z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M16.25,15c-0.19,0-0.38-0.07-0.53-0.22c-1-0.99-2.32-1.53-3.73-1.53s-2.73,0.54-3.73,1.53c-0.29,0.29-0.77,0.29-1.06-0.01 s-0.29-0.77,0.01-1.06c1.28-1.27,2.98-1.96,4.78-1.96s3.5,0.7,4.78,1.96c0.29,0.29,0.3,0.77,0.01,1.06 C16.64,14.93,16.45,15,16.25,15z" /> -</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml new file mode 100644 index 000000000000..a0233ba8acc9 --- /dev/null +++ b/packages/overlays/IconPackCircularSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="4.000000" + android:translateY="3.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M12.9902,13.5098 C12.9902,13.7858 12.7652,14.0098 12.4902,14.0098 C12.2142,14.0098 11.9902,13.7858 11.9902,13.5098 L11.9902,11.5098 C11.9902,11.2348 12.2142,11.0098 12.4902,11.0098 C12.7652,11.0098 12.9902,11.2348 12.9902,11.5098 L12.9902,13.5098 Z M12.4902,16.0098 C12.2142,16.0098 11.9902,15.7858 11.9902,15.5098 C11.9902,15.2348 12.2142,15.0098 12.4902,15.0098 C12.7652,15.0098 12.9902,15.2348 12.9902,15.5098 C12.9902,15.7858 12.7652,16.0098 12.4902,16.0098 L12.4902,16.0098 Z M15.5182,11.7848 C15.8372,10.9048 16.0102,9.9558 16.0102,8.9698 C16.0102,6.0698 14.5002,3.4798 12.1102,2.0098 L14.5102,2.0098 C14.9102,1.9998 15.2502,1.6598 15.2502,1.2498 C15.2502,0.8398 14.9102,0.4998 14.5002,0.4998 L9.2502,0.4998 L9.2502,6.2498 C9.2502,6.6598 9.5902,6.9998 10.0002,6.9998 C10.4102,6.9998 10.7502,6.6598 10.7502,6.2498 L10.7502,2.9398 C13.0302,4.0598 14.5002,6.3698 14.5002,8.9698 C14.5002,9.5068 14.4172,10.0238 14.2982,10.5268 C13.7682,10.2048 13.1542,10.0098 12.4902,10.0098 C10.5562,10.0098 8.9902,11.5768 8.9902,13.5098 C8.9902,15.4438 10.5562,17.0098 12.4902,17.0098 C14.4232,17.0098 15.9902,15.4438 15.9902,13.5098 C15.9902,12.8798 15.8092,12.2958 15.5182,11.7848 L15.5182,11.7848 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M6.3901,1.04 C2.6301,1.91 0.0001,5.21 0.0001,9.07 C0.0001,11.65 1.2001,13.98 3.1301,15.5 L1.5001,15.5 C1.0901,15.5 0.7501,15.84 0.7501,16.25 C0.7501,16.66 1.0901,17 1.5001,17 L6.7501,17 L6.7501,11.75 C6.7501,11.34 6.4101,11 6.0001,11 C5.5901,11 5.2501,11.34 5.2501,11.75 L5.2501,15.09 C2.9701,13.97 1.5001,11.66 1.5001,9.06 C1.5001,5.91 3.6501,3.21 6.7301,2.5 C7.1301,2.41 7.3901,2 7.2901,1.6 C7.2001,1.2 6.8001,0.95 6.3901,1.04" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_arrow_back.xml b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_arrow_back.xml index 920ecb5deb70..a9e1ffe6d69e 100644 --- a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_arrow_back.xml +++ b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_arrow_back.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_brightness_thumb.xml b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_brightness_thumb.xml index dbd9b8e6d494..fae73a4c0e09 100644 --- a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_brightness_thumb.xml +++ b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_brightness_thumb.xml @@ -20,7 +20,7 @@ android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="?android:attr/colorPrimary" + android:fillColor="?android:attr/colorBackgroundFloating" android:pathData="M18.94,9.75L18.5,9.31V8.69V6c0-0.28-0.22-0.5-0.5-0.5h-2.69h-0.62l-0.44-0.44l-1.9-1.9 C12.23,3.04,12.08,3.02,12,3.02c-0.08,0-0.23,0.02-0.35,0.15l-1.9,1.9L9.31,5.5H8.69H6C5.72,5.5,5.5,5.72,5.5,6v2.69v0.62 L5.06,9.75l-1.9,1.9C3.04,11.77,3.02,11.92,3.02,12s0.02,0.23,0.15,0.35l1.9,1.9l0.44,0.44v0.62V18c0,0.28,0.22,0.5,0.5,0.5h2.69 h0.62l0.44,0.44l1.9,1.9c0.13,0.13,0.28,0.15,0.35,0.15c0.08,0,0.23-0.02,0.35-0.15l1.9-1.9l0.44-0.44h0.62H18 c0.28,0,0.5-0.22,0.5-0.5v-2.69v-0.62l0.44-0.44l1.9-1.9c0.13-0.13,0.15-0.28,0.15-0.35s-0.02-0.23-0.15-0.35L18.94,9.75z M12,17 c-2.76,0-5-2.24-5-5s2.24-5,5-5s5,2.24,5,5S14.76,17,12,17z" /> <path android:fillColor="?android:attr/colorControlActivated" diff --git a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_camera.xml b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_camera.xml index c4728eb3f389..77197a58a04a 100644 --- a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_camera.xml +++ b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_camera.xml @@ -15,10 +15,10 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="24dp" + android:height="17dp" android:viewportHeight="24" android:viewportWidth="24" - android:width="24dp" > + android:width="17dp" > <path android:fillColor="@android:color/white" android:pathData="M22,8c0-1.66-1.34-3-3-3h-2l-2-2H9L7,5H5C3.34,5,2,6.34,2,8v13h20V8z M20.5,19.5h-17V8c0-0.83,0.67-1.5,1.5-1.5h14 c0.83,0,1.5,0.67,1.5,1.5V19.5z" /> diff --git a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_data_saver.xml b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_data_saver.xml index 938d2412bef8..cdc3bfbd3d5f 100644 --- a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_data_saver.xml +++ b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_data_saver.xml @@ -15,17 +15,17 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="18dp " + android:height="18dp" android:viewportHeight="24" android:viewportWidth="24" - android:width="18dp " > - <path - android:fillColor="@android:color/white" - android:pathData="M12,7a0.76 0.76 ,0,0,0-0.75 0.75 v3.5H7.75a0.75 0.75 ,0,0,0,0,1.5h3.5v3.5a0.75 0.75 ,0,0,0,1.5,0v-3.5h3.5a0.75 0.75 ,0,0,0,0-1.5h-3.5V7.75A0.76 0.76 ,0,0,0,12,7Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M3.36,7A10,10,0,0,0,20.27,17.64L18.1,16.39A7.5,7.5,0,1,1,11.25,4.56V2.05A10,10,0,0,0,3.36,7Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M21,16.35a10,10,0,0,0-8.27-14.3V4.56a7.48,7.48,0,0,1,6.1,10.54Z" /> + android:width="18dp" > + <group + android:translateX="2.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M17.5000671,10 C17.5000671,6.198 14.6680671,3.064 11.0000671,2.574 L11.0000671,0.05 C16.0500671,0.55 20.0000671,4.82 20.0000671,10 C20.0000671,11.45 19.6800671,12.83 19.1200671,14.07 L16.9560671,12.796 C17.3040671,11.932 17.5000671,10.989 17.5000671,10 Z M10.0000671,17.5 C12.3900671,17.5 14.5140671,16.378 15.8870671,14.637 C16.6270671,15.073 18.0500671,15.91 18.0500671,15.91 C15.9790671,18.732 12.4710671,20.427 8.60106711,19.906 C4.22106711,19.316 0.68406711,15.774 0.0940671101,11.394 C-0.68693289,5.591 3.49306711,0.594 9.00006711,0.05 L9.00006711,2.574 C5.33206711,3.064 2.50006711,6.198 2.50006711,10 C2.50006711,14.142 5.85806711,17.5 10.0000671,17.5 Z M6,10 C6.00538581,9.58803794 6.33803794,9.25538581 6.75,9.25 L9.25,9.25 L9.25,6.75 C9.25,6.33578644 9.58578644,6 10,6 C10.4142136,6 10.75,6.33578644 10.75,6.75 L10.75,9.25 L13.25,9.25 C13.6642136,9.25 14,9.58578644 14,10 C14,10.4142136 13.6642136,10.75 13.25,10.75 L10.75,10.75 L10.75,13.25 C10.75,13.6642136 10.4142136,14 10,14 C9.58578644,14 9.25,13.6642136 9.25,13.25 L9.25,10.75 L6.75,10.75 C6.33803794,10.7446142 6.00538581,10.4119621 6,10 Z" + android:strokeWidth="1" /> + </group> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_data_saver_off.xml b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_data_saver_off.xml index 3d620a18bb1a..7dab949f9da5 100644 --- a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_data_saver_off.xml +++ b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_data_saver_off.xml @@ -21,8 +21,7 @@ android:width="24dp" > <path android:fillColor="@android:color/white" - android:pathData="M3.36,7A10,10,0,0,0,20.27,17.64L18.1,16.39A7.5,7.5,0,1,1,11.25,4.56V2.05A10,10,0,0,0,3.36,7Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M21,16.35a10,10,0,0,0-8.27-14.3V4.56a7.48,7.48,0,0,1,6.1,10.54Z" /> + android:fillType="evenOdd" + android:pathData="M19.5000671,12 C19.5000671,8.198 16.6680671,5.064 13.0000671,4.574 L13.0000671,2.05 C18.0500671,2.55 22.0000671,6.82 22.0000671,12 C22.0000671,13.45 21.6800671,14.83 21.1200671,16.07 L18.9560671,14.796 C19.3040671,13.932 19.5000671,12.989 19.5000671,12 Z M12.0000671,19.5 C14.3900671,19.5 16.5140671,18.378 17.8870671,16.637 C18.6270671,17.073 20.0500671,17.91 20.0500671,17.91 C17.9790671,20.732 14.4710671,22.427 10.6010671,21.906 C6.22106711,21.316 2.68406711,17.774 2.09406711,13.394 C1.31306711,7.591 5.49306711,2.594 11.0000671,2.05 L11.0000671,4.574 C7.33206711,5.064 4.50006711,8.198 4.50006711,12 C4.50006711,16.142 7.85806711,19.5 12.0000671,19.5 Z" + android:strokeWidth="1" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml index fc38ed431759..c7a0266cbfca 100644 --- a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml +++ b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml index 659b4e164415..9bdc79a23008 100644 --- a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml +++ b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml new file mode 100644 index 000000000000..e210bcb04849 --- /dev/null +++ b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="2.000000" + android:translateY="4.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M3.75,11.5 L13.25,11.5 C13.664,11.5 14,11.836 14,12.25 C14,12.664 13.664,13 13.25,13 L3.75,13 C3.336,13 3,12.664 3,12.25 C3,11.836 3.336,11.5 3.75,11.5" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M3.75,8.5 L3.75,8.5 C4.164,8.5 4.5,8.836 4.5,9.25 C4.5,9.664 4.164,10 3.75,10 C3.336,10 3,9.664 3,9.25 C3,8.836 3.336,8.5 3.75,8.5" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M17,12.25 L17,12.25 C17,12.664 16.664,13 16.25,13 C15.836,13 15.5,12.664 15.5,12.25 C15.5,11.836 15.836,11.5 16.25,11.5 C16.664,11.5 17,11.836 17,12.25" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M17,9.25 L17,9.25 C17,9.664 16.664,10 16.25,10 L6.75,10 C6.336,10 6,9.664 6,9.25 C6,8.836 6.336,8.5 6.75,8.5 L16.25,8.5 C16.664,8.5 17,8.836 17,9.25" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M18,0 L2,0 C0.896,0 0,0.896 0,2 L0,14 C0,15.104 0.896,16 2,16 L18,16 C19.104,16 20,15.104 20,14 L20,2 C20,0.896 19.104,0 18,0 M18,1.5 C18.275,1.5 18.5,1.725 18.5,2 L18.5,14 C18.5,14.275 18.275,14.5 18,14.5 L2,14.5 C1.725,14.5 1.5,14.275 1.5,14 L1.5,2 C1.5,1.725 1.725,1.5 2,1.5 L18,1.5" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml new file mode 100644 index 000000000000..660f64a8cead --- /dev/null +++ b/packages/overlays/IconPackCircularSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="1.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M19,3.5 C19.275,3.5 19.5,3.725 19.5,4 L19.5,16 C19.5,16.09 19.47,16.17 19.428,16.244 L20.497,17.313 C20.807,16.961 21,16.506 21,16 L21,4 C21,2.896 20.104,2 19,2 L5.184,2 L6.684,3.5 L19,3.5 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M19,3.5 C19.275,3.5 19.5,3.725 19.5,4 L19.5,16 C19.5,16.09 19.47,16.17 19.428,16.244 L20.497,17.313 C20.807,16.961 21,16.506 21,16 L21,4 C21,2.896 20.104,2 19,2 L5.184,2 L6.684,3.5 L19,3.5 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M18,14.25 C18,13.836 17.664,13.5 17.25,13.5 C17.091,13.5 16.951,13.561 16.829,13.646 L17.854,14.671 C17.939,14.549 18,14.409 18,14.25" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M4.75,12 C5.164,12 5.5,11.664 5.5,11.25 C5.5,10.836 5.164,10.5 4.75,10.5 C4.336,10.5 4,10.836 4,11.25 C4,11.664 4.336,12 4.75,12" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M3,16.5 C2.725,16.5 2.5,16.275 2.5,16 L2.5,4 C2.5,3.878 2.549,3.77 2.622,3.684 L9.439,10.5 L7.75,10.5 C7.336,10.5 7,10.836 7,11.25 C7,11.664 7.336,12 7.75,12 L10.939,12 L12.439,13.5 L4.75,13.5 C4.336,13.5 4,13.836 4,14.25 C4,14.664 4.336,15 4.75,15 L13.939,15 L15.44,16.5 L3,16.5 Z M20.03,18.969 L2.03,0.971 C1.737,0.678 1.263,0.678 0.97,0.971 C0.677,1.264 0.677,1.738 0.97,2.031 L1.558,2.619 C1.214,2.979 1,3.463 1,4 L1,16 C1,17.104 1.896,18 3,18 L16.94,18 L18.97,20.029 C19.116,20.176 19.308,20.249 19.5,20.249 C19.692,20.249 19.884,20.176 20.03,20.029 C20.323,19.736 20.323,19.262 20.03,18.969 L20.03,18.969 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M17.25,12 C17.664,12 18,11.664 18,11.25 C18,10.836 17.664,10.5 17.25,10.5 L13.684,10.5 L15.184,12 L17.25,12 Z" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_delete_accent.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_battery_80_24dp.xml index e65987e1d5f6..eb8550fb9f44 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_delete_accent.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_battery_80_24dp.xml @@ -16,14 +16,16 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="?android:attr/colorAccent" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > <path + android:fillAlpha="0.3" android:fillColor="@android:color/white" - android:pathData="M18,4h-2.5l-0.71-0.71C14.61,3.11,14.35,3,14.09,3H9.9C9.64,3,9.38,3.11,9.2,3.29L8.49,4h-2.5c-0.55,0-1,0.45-1,1 s0.45,1,1,1h12c0.55,0,1-0.45,1-1C19,4.45,18.55,4,18,4z" /> + android:pathData="M17,5.33C17,4.6,16.4,4,15.67,4H14V2h-4v2H8.33C7.6,4,7,4.6,7,5.33V9h10V5.33z" + android:strokeAlpha="0.3" + android:strokeWidth="1" /> <path android:fillColor="@android:color/white" - android:pathData="M6,19c0,1.1,0.9,2,2,2h8c1.1,0,2-0.9,2-2V7H6V19z" /> + android:pathData="M7,9v11.67C7,21.4,7.6,22,8.33,22h7.33C16.4,22,17,21.4,17,20.67V9H7z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_bluetooth_share_icon.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_bluetooth_share_icon.xml index df79827ce624..8ff3c1cf06f5 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_bluetooth_share_icon.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_bluetooth_share_icon.xml @@ -22,5 +22,5 @@ android:width="24dp" > <path android:fillColor="@android:color/white" - android:pathData="M17.21,6.79l-4.5-4.5c-0.29-0.29-0.72-0.37-1.09-0.22C11.25,2.23,11,2.6,11,3v6.59l-3.8-3.8c-0.39-0.39-1.02-0.39-1.41,0 c-0.39,0.39-0.39,1.02,0,1.41l4.8,4.8l-4.8,4.8c-0.39,0.39-0.39,1.02,0,1.41c0.39,0.39,1.02,0.39,1.41,0l3.8-3.8V21 c0,0.4,0.24,0.77,0.62,0.92C11.74,21.98,11.87,22,12,22c0.26,0,0.52-0.1,0.71-0.29l4.5-4.5c0.39-0.39,0.39-1.02,0-1.41L13.42,12 l3.79-3.79C17.6,7.82,17.6,7.18,17.21,6.79z M15.09,16.5L13,18.58v-4.17L15.09,16.5z M13,9.58V5.42l2.08,2.08L13,9.58z" /> + android:pathData="M13.51,12l3.75-3.74c0.41-0.41,0.41-1.07,0-1.48l-4.47-4.47l-0.03-0.03c-0.42-0.39-1.08-0.37-1.48,0.05 C11.1,2.52,11,2.78,11,3.04v6.44L6.95,5.43c-0.41-0.41-1.06-0.41-1.47,0c-0.41,0.41-0.41,1.06,0,1.47l5.09,5.1l-5.09,5.09 c-0.41,0.41-0.41,1.06,0,1.47c0.41,0.41,1.06,0.41,1.47,0L11,14.51v6.45c0,0.57,0.47,1.04,1.04,1.04c0.26,0,0.52-0.1,0.71-0.28 l0.05-0.05l4.46-4.46c0.41-0.41,0.41-1.07,0-1.48L13.51,12z M12.99,5.37l2.15,2.15l-2.15,2.15V5.37z M12.99,18.62v-4.3l2.15,2.15 L12.99,18.62z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_bt_misc_hid.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_bt_misc_hid.xml index b86d9ba1849b..6b9735c1acfb 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_bt_misc_hid.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_bt_misc_hid.xml @@ -20,7 +20,6 @@ android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - <path android:pathData="M0,0h24v24H0V0z" /> <path android:fillColor="@android:color/white" android:pathData="M15,7.09V3c0-0.55-0.45-1-1-1h-4C9.45,2,9,2.45,9,3v4.09c0,0.27,0.11,0.52,0.29,0.71l2,2c0.39,0.39,1.02,0.39,1.41,0l2-2 C14.89,7.61,15,7.35,15,7.09z M7.09,9H3c-0.55,0-1,0.45-1,1v4c0,0.55,0.45,1,1,1h4.09c0.27,0,0.52-0.11,0.71-0.29l2-2 c0.39-0.39,0.39-1.02,0-1.41l-2-2C7.61,9.11,7.35,9,7.09,9z M9,16.91V21c0,0.55,0.45,1,1,1h4c0.55,0,1-0.45,1-1v-4.09 c0-0.27-0.11-0.52-0.29-0.71l-2-2c-0.39-0.39-1.02-0.39-1.41,0l-2,2C9.11,16.39,9,16.65,9,16.91z M16.21,9.29l-2,2 c-0.39,0.39-0.39,1.02,0,1.41l2,2c0.19,0.19,0.44,0.29,0.71,0.29H21c0.55,0,1-0.45,1-1v-4c0-0.55-0.45-1-1-1h-4.09 C16.65,9,16.39,9.11,16.21,9.29z" /> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_file_copy.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_file_copy.xml index 6245147c538b..e479f506bac5 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_file_copy.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_file_copy.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="#FF737373" + android:tint="@*android:color/material_grey_600" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lock.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lock.xml index 07c81ddf563c..b2fa85f9fd16 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lock.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lock.xml @@ -16,7 +16,6 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="32dp" - android:tint="?android:attr/textColor" android:viewportHeight="24" android:viewportWidth="24" android:width="32dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lock_open.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lock_open.xml index 698ce668c1e9..13bfbf901adb 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lock_open.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lock_open.xml @@ -16,7 +16,6 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="32dp" - android:tint="?android:attr/textColor" android:viewportHeight="24" android:viewportWidth="24" android:width="32dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lockscreen_ime.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lockscreen_ime.xml index 4cd05f3374c9..16541e614965 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lockscreen_ime.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_lockscreen_ime.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_mode_edit.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_mode_edit.xml index bf8df45826ec..bb3c043f68f5 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_mode_edit.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_mode_edit.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_wireless_white.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_notifications_alerted.xml index 03e142e2be35..0847a3564998 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_wireless_white.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_notifications_alerted.xml @@ -21,11 +21,14 @@ android:width="24dp" > <path android:fillColor="@android:color/white" - android:pathData="M11.29,19.29c0.39,0.39,1.03,0.4,1.42,0L14,18c0.47-0.47,0.38-1.28-0.22-1.58C13.25,16.15,12.64,16,12,16 c-0.64,0-1.24,0.15-1.77,0.41c-0.59,0.29-0.69,1.11-0.22,1.58L11.29,19.29z" /> + android:pathData="M4.12,9.67C4.42,7.73,5.38,6,6.77,4.73C7.19,4.35,7.2,3.7,6.8,3.3c-0.39-0.39-1-0.39-1.4-0.03 C3.7,4.84,2.52,6.96,2.15,9.34c-0.1,0.61,0.37,1.16,0.99,1.16C3.63,10.5,4.04,10.15,4.12,9.67z" /> <path android:fillColor="@android:color/white" - android:pathData="M17.6,14.39l0.71-0.71c0.42-0.42,0.39-1.12-0.08-1.5C16.52,10.82,14.35,10,12,10c-2.34,0-4.5,0.81-6.21,2.17 c-0.47,0.37-0.51,1.07-0.09,1.49l0.71,0.71c0.35,0.36,0.92,0.39,1.32,0.08C8.91,13.54,10.39,13,12,13c1.61,0,3.1,0.55,4.29,1.47 C16.69,14.78,17.25,14.75,17.6,14.39z" /> + android:pathData="M18.6,3.28c-0.4-0.37-1.02-0.36-1.4,0.02c-0.4,0.4-0.38,1.04,0.03,1.42c1.38,1.27,2.35,3,2.65,4.94 c0.08,0.49,0.5,0.84,0.98,0.84c0.61,0,1.09-0.55,0.99-1.16C21.47,6.96,20.29,4.84,18.6,3.28z" /> <path android:fillColor="@android:color/white" - android:pathData="M21.83,10.16l0.71-0.71c0.42-0.42,0.38-1.09-0.06-1.48C19.68,5.5,16.01,4,12,4C8.01,4,4.36,5.49,1.56,7.94 C1.12,8.33,1.08,9,1.49,9.41l0.71,0.71c0.37,0.37,0.96,0.4,1.35,0.06C5.81,8.2,8.77,7,12,7c3.25,0,6.22,1.22,8.49,3.22 C20.88,10.56,21.47,10.53,21.83,10.16z" /> + android:pathData="M12,22c1.1,0,2-0.9,2-2h-4C10,21.1,10.9,22,12,22z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M18,16v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-0.83-0.67-1.5-1.5-1.5S10.5,3.17,10.5,4v0.68C7.63,5.36,6,7.92,6,11v5 l-2.15,2.15c-0.19,0.2-0.19,0.51,0.01,0.71C3.95,18.95,4.07,19,4.2,19h15.6c0.45,0,0.67-0.54,0.35-0.85L18,16z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_phone.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_phone.xml index de348159cc6c..adf521c853ae 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_phone.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_phone.xml @@ -15,7 +15,9 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_battery_saver.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_battery_saver.xml index 22e183c694d5..4f7d96381e6e 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_battery_saver.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_battery_saver.xml @@ -15,7 +15,9 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_bluetooth.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_bluetooth.xml index 09643e606350..18a60d82faed 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_bluetooth.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_bluetooth.xml @@ -16,10 +16,11 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > <path android:fillColor="@android:color/white" - android:pathData="M17.21,6.79l-4.5-4.5c-0.29-0.29-0.72-0.37-1.09-0.22C11.25,2.23,11,2.6,11,3v6.59l-3.8-3.8c-0.39-0.39-1.02-0.39-1.41,0 c-0.39,0.39-0.39,1.02,0,1.41l4.8,4.8l-4.8,4.8c-0.39,0.39-0.39,1.02,0,1.41c0.39,0.39,1.02,0.39,1.41,0l3.8-3.8V21 c0,0.4,0.24,0.77,0.62,0.92C11.74,21.98,11.87,22,12,22c0.26,0,0.52-0.1,0.71-0.29l4.5-4.5c0.39-0.39,0.39-1.02,0-1.41L13.42,12 l3.79-3.79C17.6,7.82,17.6,7.18,17.21,6.79z M15.09,16.5L13,18.58v-4.17L15.09,16.5z M13,9.58V5.42l2.08,2.08L13,9.58z" /> + android:pathData="M13.51,12l3.75-3.74c0.41-0.41,0.41-1.07,0-1.48l-4.47-4.47l-0.03-0.03c-0.42-0.39-1.08-0.37-1.48,0.05 C11.1,2.52,11,2.78,11,3.04v6.44L6.95,5.43c-0.41-0.41-1.06-0.41-1.47,0c-0.41,0.41-0.41,1.06,0,1.47l5.09,5.1l-5.09,5.09 c-0.41,0.41-0.41,1.06,0,1.47c0.41,0.41,1.06,0.41,1.47,0L11,14.51v6.45c0,0.57,0.47,1.04,1.04,1.04c0.26,0,0.52-0.1,0.71-0.28 l0.05-0.05l4.46-4.46c0.41-0.41,0.41-1.07,0-1.48L13.51,12z M12.99,5.37l2.15,2.15l-2.15,2.15V5.37z M12.99,18.62v-4.3l2.15,2.15 L12.99,18.62z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_battery_saver_accent_24dp.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml index 4ddeae66401c..5eea8895aaa1 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_battery_saver_accent_24dp.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml @@ -16,11 +16,10 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="?android:attr/colorAccent" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > <path android:fillColor="@android:color/white" - android:pathData="M10,2v2H8.33C7.6,4,7,4.6,7,5.33v15.33C7,21.4,7.6,22,8.33,22h7.33C16.4,22,17,21.4,17,20.67V5.33C17,4.6,16.4,4,15.67,4 H14V2H10z M15,13c0,0.55-0.45,1-1,1h-1v1c0,0.55-0.45,1-1,1s-1-0.45-1-1v-1h-1c-0.55,0-1-0.45-1-1s0.45-1,1-1h1v-1 c0-0.55,0.45-1,1-1s1,0.45,1,1v1h1C14.55,12,15,12.45,15,13z" /> -</vector>
\ No newline at end of file + android:pathData="M12,2C6.48,2,2,6.48,2,12c0,5.52,4.48,10,10,10c5.52,0,10-4.48,10-10C22,6.48,17.52,2,12,2z M12,20V4c4.41,0,8,3.59,8,8 C20,16.41,16.41,20,12,20z" /> +</vector> diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_settings_bluetooth.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_settings_bluetooth.xml index 58800c8d29be..18a60d82faed 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_settings_bluetooth.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/ic_settings_bluetooth.xml @@ -22,5 +22,5 @@ android:width="24dp" > <path android:fillColor="@android:color/white" - android:pathData="M17.21,6.79l-4.5-4.5c-0.29-0.29-0.72-0.37-1.09-0.22C11.25,2.23,11,2.6,11,3v6.59l-3.8-3.8c-0.39-0.39-1.02-0.39-1.41,0 c-0.39,0.39-0.39,1.02,0,1.41l4.8,4.8l-4.8,4.8c-0.39,0.39-0.39,1.02,0,1.41c0.39,0.39,1.02,0.39,1.41,0l3.8-3.8V21 c0,0.4,0.24,0.77,0.62,0.92C11.74,21.98,11.87,22,12,22c0.26,0,0.52-0.1,0.71-0.29l4.5-4.5c0.39-0.39,0.39-1.02,0-1.41L13.42,12 l3.79-3.79C17.6,7.82,17.6,7.18,17.21,6.79z M15.09,16.5L13,18.58v-4.17L15.09,16.5z M13,9.58V5.42l2.08,2.08L13,9.58z" /> + android:pathData="M13.51,12l3.75-3.74c0.41-0.41,0.41-1.07,0-1.48l-4.47-4.47l-0.03-0.03c-0.42-0.39-1.08-0.37-1.48,0.05 C11.1,2.52,11,2.78,11,3.04v6.44L6.95,5.43c-0.41-0.41-1.06-0.41-1.47,0c-0.41,0.41-0.41,1.06,0,1.47l5.09,5.1l-5.09,5.09 c-0.41,0.41-0.41,1.06,0,1.47c0.41,0.41,1.06,0.41,1.47,0L11,14.51v6.45c0,0.57,0.47,1.04,1.04,1.04c0.26,0,0.52-0.1,0.71-0.28 l0.05-0.05l4.46-4.46c0.41-0.41,0.41-1.07,0-1.48L13.51,12z M12.99,5.37l2.15,2.15l-2.15,2.15V5.37z M12.99,18.62v-4.3l2.15,2.15 L12.99,18.62z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_activity_recognition.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_activity_recognition.xml index e1849bbee061..67d28c60b7a0 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_activity_recognition.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_activity_recognition.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_aural.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_aural.xml new file mode 100644 index 000000000000..3f5c75b66f4c --- /dev/null +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_aural.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <path android:pathData="M0 0h24v24H0z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M20 2H8c-1.1 0-2 0.9-2 2v12c0 1.1 0.9 2 2 2h12c1.1 0 2-0.9 2-2V4c0-1.1-0.9-2-2-2zm-2 5h-3v5.5c0 1.38-1.12 2.5-2.5 2.5S10 13.88 10 12.5s1.12-2.5 2.5-2.5c0.57 0 1.08 0.19 1.5 0.51 V5h4v2zM4 6H2v14c0 1.1 0.9 2 2 2h14v-2H4V6z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_calendar.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_calendar.xml index 16359b04178d..0144ba2fbf36 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_calendar.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_calendar.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_call_log.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_call_log.xml index 8d70f484e731..590ced09e4af 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_call_log.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_call_log.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_camera.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_camera.xml index 03075a688846..b063e2bb6985 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_camera.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_camera.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_contacts.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_contacts.xml index 50cd6331e42a..54cfeec0355e 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_contacts.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_contacts.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_location.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_location.xml index ebd9e61d8efe..3815921846b7 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_location.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_location.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_microphone.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_microphone.xml index 39acc9ca82a1..e6493bc95ff2 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_microphone.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_microphone.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_phone_calls.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_phone_calls.xml index 2b6e32a59cab..ae84541e0801 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_phone_calls.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_phone_calls.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_sensors.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_sensors.xml index 2128e79b350a..88f0c541caf5 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_sensors.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_sensors.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_sms.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_sms.xml index eef9e62f15b0..7a320e0c81e2 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_sms.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_sms.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_storage.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_storage.xml index 3a863a342354..0ad7e6d3484b 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_storage.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_storage.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_visual.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_visual.xml index 57c7ae9f6efa..d5bdb872825e 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_visual.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/drawable/perm_group_visual.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledAndroidOverlay/res/values/config.xml b/packages/overlays/IconPackFilledAndroidOverlay/res/values/config.xml index 6b59b6265c54..f1d8c7345396 100644 --- a/packages/overlays/IconPackFilledAndroidOverlay/res/values/config.xml +++ b/packages/overlays/IconPackFilledAndroidOverlay/res/values/config.xml @@ -33,4 +33,12 @@ M 9,11 C 9,11.55 8.55,12 8,12 H 7 V 13 C 7,13.55 6.55,14 6,14 5.45,14 5,13.55 5,13 V 12 H 4 C 3.45,12 3,11.55 3,11 3,10.45 3.45,10.005 4,10 H 5 V 9 C 5,8.45 5.45,8 6,8 6.55,8 7,8.45 7,9 V 10 H 8 C 8.55,10 9,10.45 9,11 Z </string> <bool name="config_batterymeterDualTone">true</bool> + <!-- X path for SignalDrawable as defined on a 24x24 canvas. --> + <string name="config_signalXPath" translatable="false"> + M 21.7,20.28 L 19.92,18.5 L 21.7,16.72 C 22.1,16.32 22.1,15.68 21.71,15.29 C 21.32,14.9 20.68,14.9 20.28,15.3 L 18.5,17.08 L 16.72,15.3 C 16.32,14.9 15.68,14.9 15.29,15.29 C 14.9,15.68 14.9,16.32 15.3,16.72 L 17.08,18.5 L 15.3,20.28 C 14.9,20.68 14.9,21.32 15.29,21.71 C 15.68,22.1 16.32,22.1 16.72,21.7 L 18.5,19.92 L 20.28,21.7 C 20.68,22.1 21.32,22.1 21.71,21.71 C 22.1,21.32 22.1,20.68 21.7,20.28 + </string> + <!-- config_signalCutout{Height,Width}Fraction define fraction of the 24x24 canvas that + should be cut out to display config_signalXPath.--> + <item name="config_signalCutoutWidthFraction" format="float" type="dimen">11</item> + <item name="config_signalCutoutHeightFraction" format="float" type="dimen">11</item> </resources> diff --git a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_setting.xml b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_setting.xml index 30e866095675..b3625ac9cf15 100644 --- a/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_setting.xml +++ b/packages/overlays/IconPackFilledLauncherOverlay/res/drawable/ic_setting.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/textColorPrimary" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_arrow_back.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_arrow_back.xml index b4f2a9de63a6..deb77c820ecb 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_arrow_back.xml +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_arrow_back.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_cellular_off.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_cellular_off.xml index 32ce0f5ea249..466ae50cb46a 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_cellular_off.xml +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_cellular_off.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorAccent" android:viewportHeight="24" diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_chevron_right_24dp.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_chevron_right_24dp.xml index e1a8b1feb22b..b5b514a57e9d 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_chevron_right_24dp.xml +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_chevron_right_24dp.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_content_copy_grey600_24dp.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_content_copy_grey600_24dp.xml index be607a3c4d33..e479f506bac5 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_content_copy_grey600_24dp.xml +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_content_copy_grey600_24dp.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="#757575" + android:tint="@*android:color/material_grey_600" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_data_saver.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_data_saver.xml index 2718efadfe59..5c85eb36b41c 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_data_saver.xml +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_data_saver.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_devices_other.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_devices_other.xml index 21368fe5782b..a451ef831e78 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_devices_other.xml +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_devices_other.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:viewportHeight="24" android:viewportWidth="24" diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_eject_24dp.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_eject_24dp.xml index 5a9511a5cfbe..7af92461d3f9 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_eject_24dp.xml +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_eject_24dp.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_find_in_page_24px.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_find_in_page_24px.xml new file mode 100644 index 000000000000..dd35dae227b0 --- /dev/null +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_find_in_page_24px.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <path android:pathData="M0 0h24v24H0z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M20 19.59V8l-6-6H6c-1.1 0-1.99 0.9 -1.99 2L4 20c0 1.1 0.89 2 1.99 2H18c0.45 0 0.85-0.15 1.19-0.4l-4.43-4.43c-0.8 0.52 -1.74 0.83 -2.76 0.83 -2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5c0 1.02-0.31 1.96-0.83 2.75L20 19.59zM9 13c0 1.66 1.34 3 3 3s3-1.34 3-3-1.34-3-3-3-3 1.34-3 3z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_help_actionbar.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_help_actionbar.xml index ed6d553f5f37..4d6d9dd0a9e5 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_help_actionbar.xml +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_help_actionbar.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_network_cell.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_network_cell.xml index 2e9433b08220..d62758e51976 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_network_cell.xml +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_network_cell.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_notifications_off_24dp.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_notifications_off_24dp.xml index 9944bb5b4f69..c6cd0159854e 100644 --- a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_notifications_off_24dp.xml +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_notifications_off_24dp.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_scan_24dp.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_scan_24dp.xml new file mode 100644 index 000000000000..146e20fc68d0 --- /dev/null +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_scan_24dp.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorAccent" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <path + android:fillColor="@android:color/white" + android:pathData="M4,9 L8,9 C8.55228475,9 9,8.55228475 9,8 L9,4 C9,3.44771525 8.55228475,3 8,3 L4,3 C3.44771525,3 3,3.44771525 3,4 L3,8 C3,8.55228475 3.44771525,9 4,9 Z M5,5 L7,5 L7,7 L5,7 L5,5 Z M15,4 L15,8 C15,8.55228475 15.4477153,9 16,9 L20,9 C20.5522847,9 21,8.55228475 21,8 L21,4 C21,3.44771525 20.5522847,3 20,3 L16,3 C15.4477153,3 15,3.44771525 15,4 Z M19,7 L17,7 L17,5 L19,5 L19,7 Z M4,21 L8,21 C8.55228475,21 9,20.5522847 9,20 L9,16 C9,15.4477153 8.55228475,15 8,15 L4,15 C3.44771525,15 3,15.4477153 3,16 L3,20 C3,20.5522847 3.44771525,21 4,21 Z M5,17 L7,17 L7,19 L5,19 L5,17 Z M7.4,11 L8.6,11 C8.8209139,11 9,11.1790861 9,11.4 L9,12.6 C9,12.8209139 8.8209139,13 8.6,13 L7.4,13 C7.1790861,13 7,12.8209139 7,12.6 L7,11.4 C7,11.1790861 7.1790861,11 7.4,11 Z M4.6,13 L3.4,13 C3.1790861,13 3,12.8209139 3,12.6 L3,11.4 C3,11.1790861 3.1790861,11 3.4,11 L4.6,11 C4.8209139,11 5,11.1790861 5,11.4 L5,12.6 C5,12.8209139 4.8209139,13 4.6,13 L4.6,13 Z M11.6,9 C11.2686292,9 11,8.73137085 11,8.4 L11,3.6 C11,3.26862915 11.2686292,3 11.6,3 L12.4,3 C12.7313708,3 13,3.26862915 13,3.6 L13,8.4 C13,8.73137085 12.7313708,9 12.4,9 L11.6,9 Z M17,15 L20.5,15 C20.7761424,15 21,15.2238576 21,15.5 L21,16.5 C21,16.7761424 20.7761424,17 20.5,17 L17,17 L17,20.5 C17,20.7761424 16.7761424,21 16.5,21 L15.5,21 C15.2238576,21 15,20.7761424 15,20.5 L15,17 L11.5,17 C11.2238576,17 11,16.7761424 11,16.5 L11,15.5 C11,15.2238576 11.2238576,15 11.5,15 L15,15 L15,11.5 C15,11.2238576 15.2238576,11 15.5,11 L16.5,11 C16.7761424,11 17,11.2238576 17,11.5 L17,15 Z" + android:strokeWidth="1" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_disable.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_disable.xml new file mode 100644 index 000000000000..b816e4e838fe --- /dev/null +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_disable.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:scaleX="-1" + android:translateX="-12.000000" + android:translateY="-12.000000" > + <path + android:fillType="evenOdd" + android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" + android:strokeWidth="1" /> + </group> + <path + android:fillColor="@android:color/white" + android:pathData="M12.11,2 C10.33,2 8.67,2.46 7.22,3.28 L8.7,4.76 C9.74,4.28 10.89,4 12.11,4 C16.52,4 20.11,7.59 20.11,12 C20.11,13.22 19.83,14.37 19.35,15.41 L20.83,16.89 C21.65,15.44 22.11,13.78 22.11,12 C22.11,6.48 17.63,2 12.11,2 Z M18.23,17.13 L6.98,5.87 L4.12750442,3.01750442 C3.73635677,2.62635677 3.10252735,2.62523693 2.71,3.015 C2.31926097,3.40298735 2.31703029,4.0342698 2.70501764,4.42500883 C2.70584509,4.42584216 2.70667402,4.42667402 2.70750442,4.42750442 L4.19,5.91 C2.88,7.59 2.11,9.71 2.11,12 C2.11,17.52 6.59,22 12.11,22 C14.4,22 16.52,21.23 18.2,19.92 L19.685,21.405 C20.0743607,21.7943607 20.7056393,21.7943607 21.095,21.405 C21.4843607,21.0156393 21.4843607,20.3843607 21.095,19.995 L18.23,17.13 Z M12.11,20 C7.7,20 4.11,16.41 4.11,12 C4.11,10.26 4.67,8.65 5.62,7.34 L16.77,18.49 C15.46,19.44 13.85,20 12.11,20 Z M8.7,4.76 L7.22,3.28 L8.7,4.76 Z" + android:strokeWidth="1" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_enable.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_enable.xml new file mode 100644 index 000000000000..d0b6209b38ad --- /dev/null +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_enable.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:scaleX="-1" + android:translateX="-12.000000" + android:translateY="-12.000000" > + <path + android:fillType="evenOdd" + android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" + android:strokeWidth="1" /> + </group> + <path + android:fillColor="@android:color/white" + android:pathData="M13.0016705,11.5012475 L15.3917467,11.5012475 C15.9314188,11.5012475 16.206996,12.1426752 15.8165949,12.5140281 L12.4292913,15.822445 C12.1961989,16.0553846 11.8138355,16.0598858 11.5761501,15.8314475 C11.5738536,15.8280716 11.5704089,15.8258209 11.5681124,15.822445 L8.17851232,12.5117775 C7.79729714,12.1392993 8.06713319,11.5012475 8.60565705,11.5012475 L11.002341,11.5012475 L11.002341,2.99966471 C11.002341,2.44756514 11.4499062,2 12.0020057,2 C12.5541053,2 13.0016705,2.44756514 13.0016705,2.99966471 L13.0016705,11.5012475 Z M15,2.46 L15,4.59 C17.93,5.78 20,8.65 20,12 C20,16.41 16.41,20 12,20 C7.59,20 4,16.41 4,12 C4,8.65 6.07,5.78 9,4.59 L9,2.46 C4.94,3.74 2,7.53 2,12 C2,17.52 6.48,22 12,22 C17.52,22 22,17.52 22,12 C22,7.53 19.06,3.74 15,2.46 Z" + android:strokeWidth="1" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_language.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_language.xml new file mode 100644 index 000000000000..e23b9b6ebf58 --- /dev/null +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_language.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <path + android:fillColor="@android:color/white" + android:pathData="M11.99,2C6.47,2,2,6.48,2,12c0,5.52,4.47,10,9.99,10C17.52,22,22,17.52,22,12C22,6.48,17.52,2,11.99,2z M18.92,8h-2.95 c-0.31-1.24-0.78-2.43-1.38-3.56C16.41,5.07,17.95,6.33,18.92,8z M12,4.04c0.83,1.2,1.48,2.53,1.91,3.96h-3.82 C10.52,6.57,11.17,5.24,12,4.04z M4.26,14C4.1,13.36,4,12.69,4,12s0.1-1.36,0.26-2h3.38c-0.08,0.66-0.14,1.32-0.14,2 s0.06,1.34,0.14,2H4.26z M5.08,16h2.95c0.32,1.25,0.78,2.45,1.38,3.56C7.58,18.94,6.05,17.67,5.08,16z M8.03,8H5.08 c0.97-1.67,2.5-2.94,4.33-3.56C8.81,5.57,8.34,6.76,8.03,8z M12,19.96c-0.83-1.2-1.48-2.53-1.91-3.96h3.82 C13.48,17.43,12.83,18.76,12,19.96z M14.34,14H9.66c-0.09-0.66-0.16-1.32-0.16-2s0.07-1.35,0.16-2h4.68c0.09,0.65,0.16,1.32,0.16,2 S14.43,13.34,14.34,14z M14.59,19.56c0.6-1.11,1.06-2.31,1.38-3.56h2.95C17.95,17.67,16.41,18.93,14.59,19.56z M16.36,14 c0.08-0.66,0.14-1.32,0.14-2s-0.06-1.34-0.14-2h3.38C19.9,10.64,20,11.31,20,12s-0.1,1.36-0.26,2H16.36z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_multiuser.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_multiuser.xml new file mode 100644 index 000000000000..accc694238d9 --- /dev/null +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_settings_multiuser.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <path + android:fillColor="@android:color/white" + android:pathData="M 12 4 C 14.2091389993 4 16 5.79086100068 16 8 C 16 10.2091389993 14.2091389993 12 12 12 C 9.79086100068 12 8 10.2091389993 8 8 C 8 5.79086100068 9.79086100068 4 12 4 Z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M12,13.5c-2.67,0-8,1.34-8,4v2C4,19.77,4.22,20,4.5,20h15c0.27,0,0.5-0.23,0.5-0.5v-2C20,14.84,14.67,13.5,12,13.5z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml new file mode 100644 index 000000000000..f2dd9e818fc4 --- /dev/null +++ b/packages/overlays/IconPackFilledSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <path android:pathData="M0 0h24v24H0z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M3 12c0 2.21 0.91 4.2 2.36 5.64L3 20h6v-6l-2.24 2.24C5.68 15.15 5 13.66 5 12c0-2.61 1.67-4.83 4-5.65V4.26C5.55 5.15 3 8.27 3 12zm8 5h2v-2h-2v2zM21 4h-6v6l2.24-2.24C18.32 8.85 19 10.34 19 12c0 2.61-1.67 4.83-4 5.65v2.09c3.45-0.89 6-4.01 6-7.74 0-2.21-0.91-4.2-2.36-5.64L21 4zm-10 9h2V7h-2v6z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_arrow_back.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_arrow_back.xml index b4f2a9de63a6..deb77c820ecb 100644 --- a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_arrow_back.xml +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_arrow_back.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_brightness_thumb.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_brightness_thumb.xml index e82e9a3ee185..1b881eac9fc2 100644 --- a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_brightness_thumb.xml +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_brightness_thumb.xml @@ -23,6 +23,6 @@ android:fillColor="?android:attr/colorControlActivated" android:pathData="M4,15.3V19c0,0.55,0.45,1,1,1h3.69l2.6,2.6c0.39,0.39,1.02,0.39,1.41,0l2.6-2.6H19c0.55,0,1-0.45,1-1v-3.69l2.6-2.6 c0.39-0.39,0.39-1.02,0-1.41L20,8.69V5c0-0.55-0.45-1-1-1h-3.69l-2.6-2.6c-0.39-0.39-1.02-0.39-1.41,0L8.69,4H5C4.45,4,4,4.45,4,5 v3.69l-2.6,2.6c-0.39,0.39-0.39,1.02,0,1.41L4,15.3z M12,7c2.76,0,5,2.24,5,5s-2.24,5-5,5s-5-2.24-5-5S9.24,7,12,7z" /> <path - android:fillColor="?android:attr/colorPrimary" + android:fillColor="?android:attr/colorBackgroundFloating" android:pathData="M 12 7 C 14.7614237492 7 17 9.23857625085 17 12 C 17 14.7614237492 14.7614237492 17 12 17 C 9.23857625085 17 7 14.7614237492 7 12 C 7 9.23857625085 9.23857625085 7 12 7 Z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_camera.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_camera.xml index ae3e7e2d60c6..fac551cf4a63 100644 --- a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_camera.xml +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_camera.xml @@ -15,10 +15,10 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="24dp" + android:height="17dp" android:viewportHeight="24" android:viewportWidth="24" - android:width="24dp" > + android:width="17dp" > <path android:fillColor="@android:color/white" android:pathData="M 12 8.8 C 13.7673111995 8.8 15.2 10.2326888005 15.2 12 C 15.2 13.7673111995 13.7673111995 15.2 12 15.2 C 10.2326888005 15.2 8.8 13.7673111995 8.8 12 C 8.8 10.2326888005 10.2326888005 8.8 12 8.8 Z" /> diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_cast_connected.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_cast_connected.xml index f5056f2a1f12..bbe2cff62720 100644 --- a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_cast_connected.xml +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_cast_connected.xml @@ -15,10 +15,10 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="17dp" + android:height="24dp" android:viewportHeight="24" android:viewportWidth="24" - android:width="17dp" > + android:width="24dp" > <path android:fillColor="@android:color/white" android:pathData="M2.07,10.05C1.5,10,1.02,10.45,1,11.03c-0.01,0.52,0.34,0.96,0.85,1.01c4.26,0.43,7.68,3.82,8.1,8.08 C10,20.62,10.43,21,10.94,21c0.59,0,1.06-0.51,1-1.1C11.42,14.69,7.28,10.56,2.07,10.05z" /> diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_data_saver.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_data_saver.xml index 3d4cf5e88f07..28b8ba1bccfc 100644 --- a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_data_saver.xml +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_data_saver.xml @@ -15,10 +15,10 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="18dp " + android:height="18dp" android:viewportHeight="24" android:viewportWidth="24" - android:width="18dp " > + android:width="18dp" > <path android:fillColor="@android:color/white" android:pathData="M11,11H9c-0.55,0-1,0.45-1,1s0.45,1,1,1h2v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2h2c0.55,0,1-0.45,1-1s-0.45-1-1-1h-2V9 c0-0.55-0.45-1-1-1s-1,0.45-1,1V11z" /> diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml index f661673e1fea..59a18bad6c66 100644 --- a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml index 8640a7950672..e498f803f687 100644 --- a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml new file mode 100644 index 000000000000..42ef41cfe9c0 --- /dev/null +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="2.000000" + android:translateY="4.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M8,8 L16,8 L16,6 L8,6 L8,8 Z M14,12 L16,12 L16,10 L14,10 L14,12 Z M4,12 L12,12 L12,10 L4,10 L4,12 Z M4,8 L6,8 L6,6 L4,6 L4,8 Z M18,0 L2,0 C0.9,0 0,0.9 0,2 L0,14 C0,15.1 0.9,16 2,16 L18,16 C19.1,16 20,15.1 20,14 L20,2 C20,0.9 19.1,0 18,0 L18,0 Z" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml new file mode 100644 index 000000000000..f164ba877096 --- /dev/null +++ b/packages/overlays/IconPackFilledSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M6,14 L13.17,14 L11.17,12 L6,12 L6,14 Z M6,8 L6,10 L8,10 L8,8.83 L7.17,8 L6,8 Z M1.293,0.7085 C1.68545692,0.318530482 2.3194559,0.319620835 2.71056916,0.71093794 L20.4851837,18.4948164 C20.8744727,18.8843082 20.8743905,19.5156095 20.485,19.905 C20.0956393,20.2943607 19.4643607,20.2943607 19.075,19.905 L17.17,18 L4,18 C2.9,18 2,17.1 2,16 L2,4 C2,3.663 2.092,3.35 2.241,3.071 L1.29096704,2.12154004 C1.29014848,2.12072198 1.28933135,2.11990248 1.28851564,2.11908157 C0.900232614,1.7283219 0.902240332,1.09678302 1.293,0.7085 Z M6.82,2 L20,2 C21.1,2 22,2.9 22,4 L22,16 C22,16.342 21.905,16.659 21.753,16.94 L18,13.187 L18,12 L16.814,12 L14.815,10 L18,10 L18,8 L12.816,8 L8.819,4 L6.82,2 Z" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_battery_80_24dp.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_battery_80_24dp.xml new file mode 100644 index 000000000000..c19ca31d41b2 --- /dev/null +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_battery_80_24dp.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <path + android:fillColor="@android:color/white" + android:pathData="M13,2.49h-2c-0.55,0-1,0.45-1,1V4H7C6.45,4,6,4.45,6,5v16c0,0.55,0.45,1,1,1h10c0.55,0,1-0.45,1-1V5c0-0.55-0.45-1-1-1h-3 V3.49C14,2.94,13.55,2.49,13,2.49z M16.5,9.01h-9V5.5h9V9.01z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_file_copy.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_file_copy.xml index 97945f00395e..1feaab1663c1 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_file_copy.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_file_copy.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="#FF737373" + android:tint="@*android:color/material_grey_600" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lock.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lock.xml index ac8e4781b904..d0b85e70920d 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lock.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lock.xml @@ -16,7 +16,6 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="32dp" - android:tint="?android:attr/textColor" android:viewportHeight="24" android:viewportWidth="24" android:width="32dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lock_open.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lock_open.xml index 345d6b181b92..6f19afe7c484 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lock_open.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lock_open.xml @@ -16,7 +16,6 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="32dp" - android:tint="?android:attr/textColor" android:viewportHeight="24" android:viewportWidth="24" android:width="32dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lockscreen_ime.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lockscreen_ime.xml index 16f0868987fb..fae8445a0a42 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lockscreen_ime.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_lockscreen_ime.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_mode_edit.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_mode_edit.xml index 5db3b12ac1dd..c44a8d6fb9c5 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_mode_edit.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_mode_edit.xml @@ -16,10 +16,17 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - <path - android:fillColor="@android:color/white" - android:pathData="M20.08,5.08l-1.17-1.17c-0.39-0.39-0.9-0.58-1.41-0.58c-0.51,0-1.02,0.2-1.41,0.59L3.29,16.71C3.11,16.89,3,17.15,3,17.41 l0,2.59c0,0.55,0.45,1,1,1c0,0,0,0,0,0L6.59,21c0.26,0,0.52-0.11,0.71-0.29l10.68-10.68l0,0l1.06-1.06l0,0l1.05-1.06 C20.87,7.13,20.87,5.86,20.08,5.08z M6.38,19.5l-1.88,0l0-1.88L15.03,7.09l1.88,1.88L6.38,19.5z M19.02,6.85l-1.06,1.06l-1.88-1.88 l1.05-1.05c0.13-0.13,0.28-0.15,0.35-0.15c0.08,0,0.23,0.02,0.35,0.15l1.17,1.17c0.13,0.13,0.15,0.28,0.15,0.35 C19.17,6.57,19.15,6.72,19.02,6.85z" /> + <group + android:translateX="3.000000" + android:translateY="3.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M14.971,4.992 L13.092,3.115 L14.499,1.707 L16.38,3.583 L14.971,4.992 Z M3.38,16.588 L1.501,16.592 L1.502,14.708 L12.031,4.176 L13.91,6.054 L3.38,16.588 Z M17.794,2.874 L15.205,0.292 C15.01,0.097 14.755,0 14.499,0 C14.243,0 13.987,0.098 13.792,0.293 L0.295,13.794 C0.108,13.981 0.002,14.236 0.002,14.5 L-1.42108547e-14,17.594 C-1.42108547e-14,17.87 0.224,18.094 0.5,18.094 L0.501,18.094 L3.589,18.088 C3.854,18.087 4.107,17.982 4.294,17.795 L17.795,4.289 C18.185,3.898 18.185,3.264 17.794,2.874 L17.794,2.874 Z" + android:strokeWidth="1" /> + </group> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_delete_accent.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_notifications_alerted.xml index d30eb7c0f098..752dab5082a4 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_delete_accent.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_notifications_alerted.xml @@ -16,17 +16,19 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="?android:attr/colorAccent" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > <path android:fillColor="@android:color/white" - android:pathData="M20,4h-1h-4c0-0.55-0.45-1-1-1h-4C9.45,3,9,3.45,9,4H5H4C3.59,4,3.25,4.34,3.25,4.75S3.59,5.5,4,5.5h1V18 c0,1.66,1.34,3,3,3h8c1.66,0,3-1.34,3-3V5.5h1c0.41,0,0.75-0.34,0.75-0.75S20.41,4,20,4z M17.5,18c0,0.83-0.67,1.5-1.5,1.5H8 c-0.83,0-1.5-0.67-1.5-1.5V5.5h11V18z" /> + android:pathData="M14,20h-4c0,1.1,0.9,2,2,2S14,21.1,14,20z" /> <path android:fillColor="@android:color/white" - android:pathData="M14.25,8c-0.41,0-0.75,0.34-0.75,0.75v7.5c0,0.41,0.34,0.75,0.75,0.75S15,16.66,15,16.25v-7.5C15,8.34,14.66,8,14.25,8z" /> + android:pathData="M12,2.5c-0.69,0-1.25,0.56-1.25,1.25v0.77C8.04,5.11,6,7.51,6,10.4V17H4.75C4.34,17,4,17.34,4,17.75s0.34,0.75,0.75,0.75 h14.5c0.41,0,0.75-0.34,0.75-0.75S19.66,17,19.25,17H18v-6.6c0-2.88-2.04-5.29-4.75-5.87V3.75C13.25,3.06,12.69,2.5,12,2.5z M16.5,10.4V17h-9v-6.6c0-2.48,2.02-4.5,4.5-4.5S16.5,7.91,16.5,10.4z" /> <path android:fillColor="@android:color/white" - android:pathData="M9.75,8C9.34,8,9,8.34,9,8.75v7.5C9,16.66,9.34,17,9.75,17s0.75-0.34,0.75-0.75v-7.5C10.5,8.34,10.16,8,9.75,8z" /> + android:pathData="M5.85,3.01C3.72,4.82,2.5,7.46,2.5,10.25C2.5,10.66,2.84,11,3.25,11S4,10.66,4,10.25c0-2.35,1.03-4.57,2.82-6.1 C7.14,3.88,7.17,3.41,6.91,3.1C6.64,2.78,6.17,2.74,5.85,3.01z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M18.15,3.01c-0.32-0.27-0.79-0.23-1.06,0.08c-0.27,0.32-0.23,0.79,0.08,1.06C18.97,5.68,20,7.9,20,10.25 c0,0.41,0.34,0.75,0.75,0.75s0.75-0.34,0.75-0.75C21.5,7.46,20.28,4.82,18.15,3.01z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_phone.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_phone.xml index 21153928240f..c6e8f57f5ec1 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_phone.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_phone.xml @@ -15,7 +15,9 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_battery_saver.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_battery_saver.xml index db4d302eb240..ca37d581332b 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_battery_saver.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_battery_saver.xml @@ -15,7 +15,9 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_bluetooth.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_bluetooth.xml index 3d270b3fce42..5e1a5f20c6d6 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_bluetooth.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_bluetooth.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml new file mode 100644 index 000000000000..3cf7541219f0 --- /dev/null +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/ic_qs_ui_mode_night.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M12,20.5 L12,3.5 C16.687,3.5 20.5,7.313 20.5,12 C20.5,16.687 16.687,20.5 12,20.5 M12,2 C10.619,2 9.304,2.279 8.107,2.786 C7.51,3.039 6.941,3.349 6.409,3.708 C6.143,3.888 5.886,4.08 5.639,4.283 C4.651,5.099 3.822,6.1 3.207,7.233 C2.899,7.8 2.645,8.4 2.449,9.026 C2.255,9.652 2.12,10.305 2.052,10.978 C2.018,11.313 2,11.654 2,12 C2,17.522 6.478,22 12,22 C17.522,22 22,17.522 22,12 C22,6.478 17.522,2 12,2" + android:strokeWidth="1" /> +</vector> diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_activity_recognition.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_activity_recognition.xml index b470603cddd0..669704775311 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_activity_recognition.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_activity_recognition.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_aural.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_aural.xml new file mode 100644 index 000000000000..8cd240d47b2d --- /dev/null +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_aural.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="2.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:pathData="M18,0 L6,0 C4.9,0 4,0.9 4,2 L4,14 C4,15.1 4.9,16 6,16 L18,16 C19.1,16 20,15.1 20,14 L20,2 C20,0.9 19.1,0 18,0 Z M18.5,14 C18.5,14.28 18.28,14.5 18,14.5 L6,14.5 C5.72,14.5 5.5,14.28 5.5,14 L5.5,2 C5.5,1.72 5.72,1.5 6,1.5 L18,1.5 C18.28,1.5 18.5,1.72 18.5,2 L18.5,14 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M15.86,3.10740288 C15.7704,3.02963963 15.6528,2.990758 15.5352,3.00186703 L13.0152,3.27959295 C12.8024,3.30736554 12.64,3.48511013 12.64,3.69618182 L12.64,9.056292 C12.2536,8.75079349 11.772,8.55638535 11.24,8.55638535 C10.0024,8.55638535 9,9.55064413 9,10.7781927 C9,12.0057412 10.0024,13 11.24,13 C12.4776,13 13.48,12.0057412 13.48,10.7781927 L13.48,5.01241596 L15.6248,4.77912619 C15.8376,4.7513536 16,4.57360901 16,4.36253732 L16,3.41845591 C16,3.30181102 15.9496,3.18516614 15.86,3.10740288 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M15.25,18 L3.25,18 C2.56,18 2,17.44 2,16.75 L2,4.75 C2,4.34 1.66,4 1.25,4 C0.84,4 0.5,4.34 0.5,4.75 L0.5,16.75 C0.5,18.27 1.73,19.5 3.25,19.5 L15.25,19.5 C15.66,19.5 16,19.16 16,18.75 C16,18.34 15.66,18 15.25,18 Z" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_calendar.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_calendar.xml index e9dddd071481..4e61af0dbf34 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_calendar.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_calendar.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_call_log.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_call_log.xml index 2d6a6b916789..8d3c43c3d216 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_call_log.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_call_log.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_camera.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_camera.xml index e3498c380d11..7d42ff758b8c 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_camera.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_camera.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_contacts.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_contacts.xml index 987ed184a826..5d68581757ba 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_contacts.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_contacts.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_location.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_location.xml index 2da48d857617..5dce9cb985b3 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_location.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_location.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_microphone.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_microphone.xml index ddf14df872f2..b45e8322628d 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_microphone.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_microphone.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_phone_calls.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_phone_calls.xml index 516ee36d7f48..fe45a97a3287 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_phone_calls.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_phone_calls.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_sensors.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_sensors.xml index 65a193d98b32..c84cb0e99bde 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_sensors.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_sensors.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_sms.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_sms.xml index b5509d12a059..96b70f7fbfbd 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_sms.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_sms.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_storage.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_storage.xml index 9b17e55f0be1..9240bb48b35e 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_storage.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_storage.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_visual.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_visual.xml index 350bb4b80c85..2cd1bc0f17b0 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_visual.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/drawable/perm_group_visual.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="@android:color/black" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedAndroidOverlay/res/values/config.xml b/packages/overlays/IconPackRoundedAndroidOverlay/res/values/config.xml index ebcac82c695f..b7bfaad56249 100644 --- a/packages/overlays/IconPackRoundedAndroidOverlay/res/values/config.xml +++ b/packages/overlays/IconPackRoundedAndroidOverlay/res/values/config.xml @@ -30,4 +30,12 @@ <string name="config_batterymeterPowersavePath" translatable="false"> M 3.75,11.25 H 5.25 V 12.75 C 5.25,13.16 5.59,13.5 6,13.5 6.41,13.5 6.75,13.16 6.75,12.75 V 11.25 H 8.25 C 8.66,11.25 9,10.91 9,10.5 9,10.09 8.66,9.7499 8.25,9.7499 H 6.75 V 8.2499 C 6.75,7.8399 6.41,7.4999 6,7.4999 5.59,7.4999 5.2794,7.841 5.25,8.2499 V 9.7499 H 3.75 C 3.34,9.7499 3,10.09 3,10.5 3,10.91 3.3401,11.25 3.75,11.25 Z </string> + <!-- X path for SignalDrawable as defined on a 24x24 canvas. --> + <string name="config_signalXPath" translatable="false"> + M 20.72,16.22 L 19,17.94 L 17.28,16.22 C 16.99,15.93 16.51,15.93 16.22,16.22 C 15.93,16.51 15.93,16.99 16.22,17.28 L 17.94,19 L 16.22,20.72 C 15.93,21.01 15.93,21.49 16.22,21.78 C 16.37,21.93 16.56,22 16.75,22 C 16.94,22 17.13,21.93 17.28,21.78 L 19,20.06 L 20.72,21.78 C 20.87,21.93 21.06,22 21.25,22 C 21.44,22 21.63,21.93 21.78,21.78 C 22.07,21.49 22.07,21.01 21.78,20.72 L 20.06,19 L 21.78,17.28 C 22.07,16.99 22.07,16.51 21.78,16.22 C 21.49,15.93 21.01,15.93 20.72,16.22 Z + </string> + <!-- config_signalCutout{Height,Width}Fraction define fraction of the 24x24 canvas that + should be cut out to display config_signalXPath.--> + <item name="config_signalCutoutWidthFraction" format="float" type="dimen">10</item> + <item name="config_signalCutoutHeightFraction" format="float" type="dimen">10</item> </resources> diff --git a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_setting.xml b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_setting.xml index 86cb525e203a..70621ae19749 100644 --- a/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_setting.xml +++ b/packages/overlays/IconPackRoundedLauncherOverlay/res/drawable/ic_setting.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/textColorPrimary" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_arrow_back.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_arrow_back.xml index 03f06e997e26..34f79b4478c9 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_arrow_back.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_arrow_back.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_cellular_off.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_cellular_off.xml index 710387ca88d5..34d40ec813e4 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_cellular_off.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_cellular_off.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorAccent" android:viewportHeight="24" diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_chevron_right_24dp.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_chevron_right_24dp.xml index 7df03ad48705..1e86983cd551 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_chevron_right_24dp.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_chevron_right_24dp.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_content_copy_grey600_24dp.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_content_copy_grey600_24dp.xml index b3f642191ca3..1feaab1663c1 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_content_copy_grey600_24dp.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_content_copy_grey600_24dp.xml @@ -16,7 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="#757575" + android:tint="@*android:color/material_grey_600" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_data_saver.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_data_saver.xml index 9acb62da7d43..ba3c5808d26c 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_data_saver.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_data_saver.xml @@ -15,18 +15,19 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > - <path - android:fillColor="@android:color/white" - android:pathData="M3.36,7A10,10,0,0,0,20.27,17.64L18.1,16.39A7.5,7.5,0,1,1,11.25,4.56V2.05A10,10,0,0,0,3.36,7Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M21,16.35a10,10,0,0,0-8.27-14.3V4.56a7.48,7.48,0,0,1,6.1,10.54Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M8,12a0.76 0.76 ,0,0,0,0.75 0.75 h2.5v2.5a0.75 0.75 ,0,0,0,1.5,0v-2.5h2.5a0.75 0.75 ,0,0,0,0-1.5h-2.5V8.75a0.75 0.75 ,0,0,0-1.5,0v2.5H8.75A0.76 0.76 ,0,0,0,8,12Z" /> + <group + android:translateX="2.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M17.5000671,10 C17.5000671,6.198 14.6680671,3.064 11.0000671,2.574 L11.0000671,0.05 C16.0500671,0.55 20.0000671,4.82 20.0000671,10 C20.0000671,11.45 19.6800671,12.83 19.1200671,14.07 L16.9560671,12.796 C17.3040671,11.932 17.5000671,10.989 17.5000671,10 Z M10.0000671,17.5 C12.3900671,17.5 14.5140671,16.378 15.8870671,14.637 C16.6270671,15.073 18.0500671,15.91 18.0500671,15.91 C15.9790671,18.732 12.4710671,20.427 8.60106711,19.906 C4.22106711,19.316 0.68406711,15.774 0.0940671101,11.394 C-0.68693289,5.591 3.49306711,0.594 9.00006711,0.05 L9.00006711,2.574 C5.33206711,3.064 2.50006711,6.198 2.50006711,10 C2.50006711,14.142 5.85806711,17.5 10.0000671,17.5 Z M6,10 C6.00538581,9.58803794 6.33803794,9.25538581 6.75,9.25 L9.25,9.25 L9.25,6.75 C9.25,6.33578644 9.58578644,6 10,6 C10.4142136,6 10.75,6.33578644 10.75,6.75 L10.75,9.25 L13.25,9.25 C13.6642136,9.25 14,9.58578644 14,10 C14,10.4142136 13.6642136,10.75 13.25,10.75 L10.75,10.75 L10.75,13.25 C10.75,13.6642136 10.4142136,14 10,14 C9.58578644,14 9.25,13.6642136 9.25,13.25 L9.25,10.75 L6.75,10.75 C6.33803794,10.7446142 6.00538581,10.4119621 6,10 Z" + android:strokeWidth="1" /> + </group> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_devices_other.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_devices_other.xml index 9283216b1a2f..463525d4bf26 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_devices_other.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_devices_other.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:viewportHeight="24" android:viewportWidth="24" diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_eject_24dp.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_eject_24dp.xml index 4e37a8866dfb..0d4bd9bc48d0 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_eject_24dp.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_eject_24dp.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_find_in_page_24px.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_find_in_page_24px.xml new file mode 100644 index 000000000000..36d5c7cf4cbf --- /dev/null +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_find_in_page_24px.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="4.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M8.0001,15.25 C6.2081,15.25 4.7501,13.792 4.7501,12 C4.7501,10.208 6.2081,8.75 8.0001,8.75 C9.7921,8.75 11.2501,10.208 11.2501,12 C11.2501,13.792 9.7921,15.25 8.0001,15.25 L8.0001,15.25 Z M1.5001,18.5 L1.5001,1.5 L9.3791,1.5 L14.5001,6.621 L14.5001,17.439 L11.8371,14.776 C12.5921,13.735 12.9531,12.393 12.6341,10.949 C12.2191,9.075 10.6391,7.595 8.7411,7.307 C5.5431,6.82 2.8181,9.547 3.3071,12.745 C3.5971,14.642 5.0781,16.221 6.9521,16.634 C8.3941,16.952 9.7361,16.592 10.7761,15.837 L13.4391,18.5 L1.5001,18.5 Z M10.0001,0 L1.5001,0 C0.6721,0 0.0001,0.672 0.0001,1.5 L0.0001,18.5 C0.0001,19.328 0.6721,20 1.5001,20 L14.5001,20 C15.3281,20 16.0001,19.328 16.0001,18.5 L16.0001,6 L10.0001,0 Z" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_help_actionbar.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_help_actionbar.xml index e0a6f9553b15..c7d672efa574 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_help_actionbar.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_help_actionbar.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_network_cell.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_network_cell.xml index 10e0f2fd1fca..fbe5ef03ad80 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_network_cell.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_network_cell.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_notifications_off_24dp.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_notifications_off_24dp.xml index 81f18fb4b383..56a67c912176 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_notifications_off_24dp.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_notifications_off_24dp.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_scan_24dp.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_scan_24dp.xml new file mode 100644 index 000000000000..3d79f7946b31 --- /dev/null +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_scan_24dp.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorAccent" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="3.000000" + android:translateY="3.000000" > + <path + android:fillColor="@android:color/white" + android:pathData="M4.5,1.5 L4.5,4.5 L1.5,4.5 L1.5,1.5 L4.5,1.5 L4.5,1.5 Z M5,0 L1,0 C0.44771525,0 0,0.44771525 0,1 L0,5 C0,5.55228475 0.44771525,6 1,6 L5,6 C5.55228475,6 6,5.55228475 6,5 L6,1 C6,0.44771525 5.55228475,0 5,0 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M16.5,1.5 L16.5,4.5 L13.5,4.5 L13.5,1.5 L16.5,1.5 L16.5,1.5 Z M17,0 L13,0 C12.4477153,0 12,0.44771525 12,1 L12,5 C12,5.55228475 12.4477153,6 13,6 L17,6 C17.5522847,6 18,5.55228475 18,5 L18,1 C18,0.44771525 17.5522847,0 17,0 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M4.5,13.5 L4.5,16.5 L1.5,16.5 L1.5,13.5 L4.5,13.5 L4.5,13.5 Z M5,12 L1,12 C0.44771525,12 0,12.4477153 0,13 L0,17 C0,17.5522847 0.44771525,18 1,18 L5,18 C5.55228475,18 6,17.5522847 6,17 L6,13 C6,12.4477153 5.55228475,12 5,12 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M13.75,12.25 L17.25,12.25 C17.6619621,12.2553858 17.9946142,12.5880379 18,13 C17.9946142,13.4119621 17.6619621,13.7446142 17.25,13.75 L13.75,13.75 L13.75,17.25 C13.75,17.6642136 13.4142136,18 13,18 C12.5857864,18 12.25,17.6642136 12.25,17.25 L12.25,13.75 L8.74999997,13.75 C8.33578642,13.75 8,13.4142136 8,13 C8,12.5857864 8.33578642,12.25 8.74999997,12.25 L12.25,12.25 L12.25,8.75 C12.2553858,8.33803794 12.5880379,8.00538581 13,8 C13.4119621,8.00538581 13.7446142,8.33803794 13.75,8.75 L13.75,12.25 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M1.6,8 L0.4,8 C0.1790861,8 0,8.1790861 0,8.4 L0,9.6 C0,9.8209139 0.1790861,10 0.4,10 L1.6,10 C1.8209139,10 2,9.8209139 2,9.6 L2,8.4 C2,8.1790861 1.8209139,8 1.6,8 L1.6,8 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M9,0 C8.58803794,0.00538581231 8.25538581,0.338037936 8.25,0.75 L8.25,5.75 C8.25000002,6.16421355 8.58578645,6.49999997 9,6.49999997 C9.41421355,6.49999997 9.74999998,6.16421355 9.75,5.75 L9.75,0.75 C9.74461419,0.338037936 9.41196206,0.00538581231 9,0 L9,0 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:pathData="M5.6,8 L4.4,8 C4.1790861,8 4,8.1790861 4,8.4 L4,9.6 C4,9.8209139 4.1790861,10 4.4,10 L5.6,10 C5.8209139,10 6,9.8209139 6,9.6 L6,8.4 C6,8.1790861 5.8209139,8 5.6,8 Z" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_data_usage.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_data_usage.xml index b9c131b80ab6..855e4bb2a39d 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_data_usage.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_data_usage.xml @@ -22,8 +22,7 @@ android:width="24dp" > <path android:fillColor="@android:color/white" - android:pathData="M12,20c-4.4,0-8-3.6-8-8c0-4.2,3.2-7.6,7.2-8V2C5.7,2.4,1.6,7.3,2,12.8c0.4,5.5,5.3,9.6,10.8,9.2c4.9-0.4,8.8-4.3,9.2-9.2 h-2C19.6,16.8,16.2,20,12,20z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M20,11.2h2c-0.4-4.9-4.3-8.9-9.2-9.2v2C16.6,4.4,19.6,7.4,20,11.2z" /> + android:fillType="evenOdd" + android:pathData="M19.5000671,12 C19.5000671,8.198 16.6680671,5.064 13.0000671,4.574 L13.0000671,2.05 C18.0500671,2.55 22.0000671,6.82 22.0000671,12 C22.0000671,13.45 21.6800671,14.83 21.1200671,16.07 L18.9560671,14.796 C19.3040671,13.932 19.5000671,12.989 19.5000671,12 Z M12.0000671,19.5 C14.3900671,19.5 16.5140671,18.378 17.8870671,16.637 C18.6270671,17.073 20.0500671,17.91 20.0500671,17.91 C17.9790671,20.732 14.4710671,22.427 10.6010671,21.906 C6.22106711,21.316 2.68406711,17.774 2.09406711,13.394 C1.31306711,7.591 5.49306711,2.594 11.0000671,2.05 L11.0000671,4.574 C7.33206711,5.064 4.50006711,8.198 4.50006711,12 C4.50006711,16.142 7.85806711,19.5 12.0000671,19.5 Z" + android:strokeWidth="1" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_disable.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_disable.xml new file mode 100644 index 000000000000..0572fb72f82e --- /dev/null +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_disable.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="1.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M11,18.5 C6.313,18.5 2.5,14.687 2.5,10 C2.5,8.182 3.078,6.498 4.055,5.114 L15.887,16.945 C14.503,17.922 12.818,18.5 11,18.5 M20.031,18.969 L2.032,0.971 C1.739,0.678 1.264,0.678 0.971,0.971 C0.678,1.264 0.678,1.738 0.971,2.031 L2.983,4.043 C1.742,5.707 1,7.765 1,10 C1,15.522 5.477,20 11,20 C13.236,20 15.293,19.258 16.957,18.017 L18.971,20.029 C19.117,20.176 19.309,20.249 19.501,20.249 C19.693,20.249 19.885,20.176 20.031,20.029 C20.324,19.736 20.324,19.262 20.031,18.969" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M11,1.5 C15.687,1.5 19.5,5.313 19.5,10 C19.5,11.782 18.946,13.436 18.006,14.804 L19.078,15.877 C20.281,14.226 21,12.199 21,10 C21,4.478 16.522,0 11,0 C8.801,0 6.774,0.719 5.124,1.922 L6.196,2.994 C7.564,2.054 9.218,1.5 11,1.5" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_enable.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_enable.xml new file mode 100644 index 000000000000..ec608cdf67dd --- /dev/null +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_enable.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="2.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M12.2502,0.2637 L12.2502,1.8127 C15.8472,2.8017 18.5002,6.0927 18.5002,9.9997 C18.5002,14.6867 14.6872,18.4997 10.0002,18.4997 C5.3132,18.4997 1.5002,14.6867 1.5002,9.9997 C1.5002,6.0927 4.1532,2.8017 7.7502,1.8127 L7.7502,0.2637 C3.3122,1.2847 0.0002,5.2517 0.0002,9.9997 C0.0002,15.5227 4.4772,19.9997 10.0002,19.9997 C15.5222,19.9997 20.0002,15.5227 20.0002,9.9997 C20.0002,5.2517 16.6872,1.2847 12.2502,0.2637" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M15.0304,9.9697 C14.7374,9.6767 14.2624,9.6767 13.9694,9.9697 L10.7504,13.1897 L10.7504,0.7387 C10.7504,0.3307 10.4144,-0.0003 10.0004,-0.0003 C9.5864,-0.0003 9.2504,0.3307 9.2504,0.7387 L9.2504,13.1897 L6.0304,9.9697 C5.7374,9.6767 5.2624,9.6767 4.9694,9.9697 C4.6764,10.2627 4.6764,10.7377 4.9694,11.0307 L9.4694,15.5307 C9.6164,15.6767 9.8074,15.7497 10.0004,15.7497 C10.1924,15.7497 10.3844,15.6767 10.5304,15.5307 L15.0304,11.0307 C15.3234,10.7377 15.3234,10.2627 15.0304,9.9697" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_language.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_language.xml new file mode 100644 index 000000000000..730942bda59c --- /dev/null +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_language.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <path + android:fillColor="@android:color/white" + android:pathData="M12,22c5.52,0,10-4.48,10-10c0-5.52-4.48-10-10-10C6.48,2,2,6.48,2,12C2,17.52,6.48,22,12,22z M4.5,16h3.14 c0.4,1.41,1.01,2.8,1.84,4.12C7.34,19.45,5.55,17.95,4.5,16z M3.5,12c0-0.87,0.13-1.71,0.38-2.5H7.3c-0.29,1.66-0.3,3.34-0.01,5 H3.88C3.63,13.71,3.5,12.87,3.5,12z M20.5,12c0,0.87-0.13,1.71-0.38,2.5h-3.42c0.29-1.66,0.28-3.34-0.01-5h3.43 C20.37,10.29,20.5,11.13,20.5,12z M15.2,14.5H8.8c-0.33-1.66-0.32-3.34,0.01-5h6.39C15.53,11.16,15.53,12.84,15.2,14.5z M11.55,20.48c-1.08-1.43-1.86-2.94-2.36-4.48h5.62c-0.5,1.54-1.28,3.05-2.36,4.48c-0.15,0.01-0.3,0.02-0.45,0.02 S11.7,20.49,11.55,20.48z M14.51,20.12c0.83-1.32,1.44-2.71,1.84-4.12h3.14C18.45,17.95,16.66,19.45,14.51,20.12z M19.5,8h-3.15 c-0.4-1.41-1.01-2.79-1.84-4.12C16.66,4.54,18.45,6.04,19.5,8z M12.45,3.52C13.52,4.96,14.3,6.46,14.8,8H9.2 c0.5-1.54,1.28-3.04,2.35-4.48C11.7,3.51,11.85,3.5,12,3.5S12.3,3.51,12.45,3.52z M9.49,3.88C8.67,5.21,8.06,6.59,7.65,8H4.5 C5.55,6.04,7.34,4.54,9.49,3.88z" /> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_battery_saver_accent_24dp.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_multiuser.xml index 9b39a9406dc8..83d9d2a9311e 100644 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_battery_saver_accent_24dp.xml +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_multiuser.xml @@ -16,14 +16,14 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" - android:tint="?android:attr/colorAccent" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > <path android:fillColor="@android:color/white" - android:pathData="M9.74,13.75h1.5v1.5c0,0.41,0.34,0.75,0.75,0.75s0.75-0.34,0.75-0.75v-1.5h1.5c0.41,0,0.75-0.34,0.75-0.75 s-0.34-0.75-0.75-0.75h-1.5v-1.5c0-0.41-0.34-0.75-0.75-0.75s-0.75,0.34-0.75,0.75v1.5h-1.5c-0.41,0-0.75,0.34-0.75,0.75 S9.33,13.75,9.74,13.75z" /> + android:pathData="M4,19c0,0.55,0.45,1,1,1h14c0.55,0,1-0.45,1-1v-3c0-1.66-1.34-3-3-3H7c-1.66,0-3,1.34-3,3V19z M5.5,16 c0-0.83,0.67-1.5,1.5-1.5h10c0.83,0,1.5,0.67,1.5,1.5v2.5h-13V16z" /> <path android:fillColor="@android:color/white" - android:pathData="M17,4h-3V3.49c0-0.55-0.45-1-1-1h-2c-0.55,0-1,0.45-1,1V4H7C6.45,4,6,4.45,6,5v16c0,0.55,0.45,1,1,1h10c0.55,0,1-0.45,1-1 V5C18,4.45,17.55,4,17,4z M16.5,20.5h-9v-15h9V20.5z" /> + android:pathData="M8,8c0,2.21,1.79,4,4,4s4-1.79,4-4c0-2.21-1.79-4-4-4S8,5.79,8,8z M12,5.5c1.38,0,2.5,1.12,2.5,2.5 c0,1.38-1.12,2.5-2.5,2.5S9.5,9.38,9.5,8C9.5,6.62,10.62,5.5,12,5.5z" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_wireless_white.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_wireless_white.xml deleted file mode 100644 index 0a1c3055870d..000000000000 --- a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_settings_wireless_white.xml +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2019 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. ---> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="24dp" - android:viewportHeight="24" - android:viewportWidth="24" - android:width="24dp" > - <path - android:fillColor="@android:color/white" - android:pathData="M12,2.75C7.95,2.69,4.05,4.3,1.22,7.2C0.96,7.5,0.97,7.95,1.24,8.23C1.53,8.53,2,8.54,2.3,8.25c2.55-2.61,6.05-4.06,9.7-4 c3.65-0.06,7.17,1.4,9.72,4.02c0.28,0.27,0.73,0.28,1.03,0.01c0.31-0.28,0.33-0.75,0.05-1.06C19.96,4.32,16.06,2.69,12,2.75z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M15.78,14.82c0.05,0.06,0.1,0.11,0.17,0.15c0.34,0.23,0.81,0.14,1.04-0.21s0.14-0.81-0.21-1.04 c-2.64-2.64-6.91-2.64-9.55,0c-0.27,0.29-0.27,0.73,0,1.02c0.28,0.3,0.76,0.32,1.06,0.04h0.03c0,0,0,0,0.01-0.01 c2.05-2.05,5.37-2.04,7.42,0.01C15.75,14.8,15.76,14.81,15.78,14.82z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M 12 17 C 12.8284271247 17 13.5 17.6715728753 13.5 18.5 C 13.5 19.3284271247 12.8284271247 20 12 20 C 11.1715728753 20 10.5 19.3284271247 10.5 18.5 C 10.5 17.6715728753 11.1715728753 17 12 17 Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M20.03,11.79c0.3-0.29,0.3-0.77,0.01-1.06h-0.01c-2.12-2.18-5.01-3.44-8.04-3.5c-3.04,0.06-5.93,1.32-8.05,3.5 c-0.29,0.3-0.28,0.77,0.01,1.06c0.3,0.29,0.77,0.28,1.06-0.01c1.85-1.88,4.36-2.96,7-3c2.62,0.05,5.11,1.13,6.95,3 C19.25,12.07,19.73,12.08,20.03,11.79z" /> -</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml new file mode 100644 index 000000000000..e9a07cc3b988 --- /dev/null +++ b/packages/overlays/IconPackRoundedSettingsOverlay/res/drawable/ic_sync_problem_24dp.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="3.000000" + android:translateY="3.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M16.7178,12.626 C17.2378,11.522 17.5288,10.291 17.5288,9 C17.5288,6.119 16.1088,3.539 13.8488,2 L15.7588,2 C16.1578,2 16.4988,1.659 16.4988,1.25 C16.4988,0.84 16.1578,0.5 15.7488,0.5 L10.7488,0.5 C10.3388,0.5 9.9988,0.84 9.9988,1.25 L9.9988,6.25 C9.9988,6.659 10.3388,7 10.7488,7 C11.1578,7 11.4988,6.659 11.4988,6.25 L11.4988,2.47 C14.1978,3.489 16.0188,6.039 16.0188,9 C16.0188,9.785 15.8828,10.542 15.6438,11.252 C15.0498,10.788 14.3108,10.5 13.4988,10.5 C11.5658,10.5 9.9988,12.066 9.9988,14 C9.9988,15.933 11.5658,17.5 13.4988,17.5 C15.4318,17.5 16.9988,15.933 16.9988,14 C16.9988,13.512 16.8978,13.048 16.7178,12.626 L16.7178,12.626 Z M13.4988,16.5 C13.2228,16.5 12.9988,16.275 12.9988,16 C12.9988,15.723 13.2228,15.5 13.4988,15.5 C13.7748,15.5 13.9988,15.723 13.9988,16 C13.9988,16.275 13.7748,16.5 13.4988,16.5 L13.4988,16.5 Z M13.9988,14 C13.9988,14.275 13.7748,14.5 13.4988,14.5 C13.2228,14.5 12.9988,14.275 12.9988,14 L12.9988,12 C12.9988,11.723 13.2228,11.5 13.4988,11.5 C13.7748,11.5 13.9988,11.723 13.9988,12 L13.9988,14 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M7.0811,0.7197 C3.1901,1.6097 0.4801,5.0097 0.4801,8.9997 C0.4801,11.8797 1.9011,14.4587 4.1611,15.9987 L2.2511,15.9987 C1.8411,15.9987 1.5011,16.3397 1.5011,16.7497 C1.5011,17.1577 1.8411,17.4997 2.2511,17.4997 L7.2511,17.4997 C7.6621,17.4997 8.0011,17.1577 8.0011,16.7497 L8.0011,11.7487 C8.0011,11.3397 7.6621,10.9997 7.2511,10.9997 C6.8411,10.9997 6.5021,11.3397 6.5021,11.7487 L6.5021,15.5287 C3.8011,14.5107 1.9811,11.9587 1.9811,8.9997 C1.9811,5.7197 4.2111,2.9097 7.4211,2.1807 C7.8221,2.0907 8.0811,1.6797 7.9801,1.2797 C7.9041,0.9347 7.5961,0.7017 7.2491,0.7017 C7.1941,0.7017 7.1381,0.7067 7.0811,0.7197" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_arrow_back.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_arrow_back.xml index 03f06e997e26..34f79b4478c9 100644 --- a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_arrow_back.xml +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_arrow_back.xml @@ -15,6 +15,7 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" android:height="24dp" android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_brightness_thumb.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_brightness_thumb.xml index 697d1c29eac7..62fcd4c3a33a 100644 --- a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_brightness_thumb.xml +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_brightness_thumb.xml @@ -20,7 +20,7 @@ android:viewportWidth="24" android:width="24dp" > <path - android:fillColor="?android:attr/colorPrimary" + android:fillColor="?android:attr/colorBackgroundFloating" android:pathData="M 12 0 L 12 0 Q 24 0 24 12 L 24 12 Q 24 24 12 24 L 12 24 Q 0 24 0 12 L 0 12 Q 0 0 12 0 Z" /> <path android:fillColor="?android:attr/colorControlActivated" diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_camera.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_camera.xml index 294e181faef8..142e078bdfd9 100644 --- a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_camera.xml +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_camera.xml @@ -15,10 +15,10 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="24dp" + android:height="17dp" android:viewportHeight="24" android:viewportWidth="24" - android:width="24dp" > + android:width="17dp" > <path android:fillColor="@android:color/white" android:pathData="M22,7c0-1.1-0.9-2-2-2h-3l-1.41-1.41C15.21,3.21,14.7,3,14.17,3H9.83C9.3,3,8.79,3.21,8.41,3.59L7,5H4C2.9,5,2,5.9,2,7v12 c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V7z M20.5,19c0,0.28-0.22,0.5-0.5,0.5H4c-0.28,0-0.5-0.22-0.5-0.5V7c0-0.28,0.22-0.5,0.5-0.5 h3.62l1.85-1.85C9.57,4.55,9.69,4.5,9.83,4.5h4.34c0.13,0,0.26,0.05,0.35,0.15l1.85,1.85H20c0.28,0,0.5,0.22,0.5,0.5V19z" /> diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_cast_connected.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_cast_connected.xml index 14d88e76bb91..f2821668c870 100644 --- a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_cast_connected.xml +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_cast_connected.xml @@ -15,10 +15,10 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="17dp" + android:height="24dp" android:viewportHeight="24" android:viewportWidth="24" - android:width="17dp" > + android:width="24dp" > <path android:fillColor="@android:color/white" android:pathData="M20.5,4h-17C3.49,4,3.48,4,3.47,4C2.64,4.02,1.98,4.7,2,5.53v3.18c0,0.41,0.34,0.75,0.75,0.75S3.5,9.12,3.5,8.71 c0-1.96,0-3.21,0-3.21l17,0.03V18.5h-7.35c-0.41,0-0.75,0.34-0.75,0.75S12.74,20,13.15,20h7.35c0.01,0,0.02,0,0.03,0 c0.83-0.02,1.49-0.7,1.47-1.53V5.53c0-0.01,0-0.02,0-0.03C22,4.67,21.33,4,20.5,4z" /> diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_data_saver.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_data_saver.xml index ee11b84b28ba..cdc3bfbd3d5f 100644 --- a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_data_saver.xml +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_data_saver.xml @@ -15,17 +15,17 @@ limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="18dp " + android:height="18dp" android:viewportHeight="24" android:viewportWidth="24" - android:width="18dp " > - <path - android:fillColor="@android:color/white" - android:pathData="M3.36,7A10,10,0,0,0,20.27,17.64L18.1,16.39A7.5,7.5,0,1,1,11.25,4.56V2.05A10,10,0,0,0,3.36,7Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M21,16.35a10,10,0,0,0-8.27-14.3V4.56a7.48,7.48,0,0,1,6.1,10.54Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M8,12a0.76 0.76 ,0,0,0,0.75 0.75 h2.5v2.5a0.75 0.75 ,0,0,0,1.5,0v-2.5h2.5a0.75 0.75 ,0,0,0,0-1.5h-2.5V8.75a0.75 0.75 ,0,0,0-1.5,0v2.5H8.75A0.76 0.76 ,0,0,0,8,12Z" /> + android:width="18dp" > + <group + android:translateX="2.000000" + android:translateY="2.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M17.5000671,10 C17.5000671,6.198 14.6680671,3.064 11.0000671,2.574 L11.0000671,0.05 C16.0500671,0.55 20.0000671,4.82 20.0000671,10 C20.0000671,11.45 19.6800671,12.83 19.1200671,14.07 L16.9560671,12.796 C17.3040671,11.932 17.5000671,10.989 17.5000671,10 Z M10.0000671,17.5 C12.3900671,17.5 14.5140671,16.378 15.8870671,14.637 C16.6270671,15.073 18.0500671,15.91 18.0500671,15.91 C15.9790671,18.732 12.4710671,20.427 8.60106711,19.906 C4.22106711,19.316 0.68406711,15.774 0.0940671101,11.394 C-0.68693289,5.591 3.49306711,0.594 9.00006711,0.05 L9.00006711,2.574 C5.33206711,3.064 2.50006711,6.198 2.50006711,10 C2.50006711,14.142 5.85806711,17.5 10.0000671,17.5 Z M6,10 C6.00538581,9.58803794 6.33803794,9.25538581 6.75,9.25 L9.25,9.25 L9.25,6.75 C9.25,6.33578644 9.58578644,6 10,6 C10.4142136,6 10.75,6.33578644 10.75,6.75 L10.75,9.25 L13.25,9.25 C13.6642136,9.25 14,9.58578644 14,10 C14,10.4142136 13.6642136,10.75 13.25,10.75 L10.75,10.75 L10.75,13.25 C10.75,13.6642136 10.4142136,14 10,14 C9.58578644,14 9.25,13.6642136 9.25,13.25 L9.25,10.75 L6.75,10.75 C6.33803794,10.7446142 6.00538581,10.4119621 6,10 Z" + android:strokeWidth="1" /> + </group> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_data_saver_off.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_data_saver_off.xml index 3d620a18bb1a..7dab949f9da5 100644 --- a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_data_saver_off.xml +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_data_saver_off.xml @@ -21,8 +21,7 @@ android:width="24dp" > <path android:fillColor="@android:color/white" - android:pathData="M3.36,7A10,10,0,0,0,20.27,17.64L18.1,16.39A7.5,7.5,0,1,1,11.25,4.56V2.05A10,10,0,0,0,3.36,7Z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M21,16.35a10,10,0,0,0-8.27-14.3V4.56a7.48,7.48,0,0,1,6.1,10.54Z" /> + android:fillType="evenOdd" + android:pathData="M19.5000671,12 C19.5000671,8.198 16.6680671,5.064 13.0000671,4.574 L13.0000671,2.05 C18.0500671,2.55 22.0000671,6.82 22.0000671,12 C22.0000671,13.45 21.6800671,14.83 21.1200671,16.07 L18.9560671,14.796 C19.3040671,13.932 19.5000671,12.989 19.5000671,12 Z M12.0000671,19.5 C14.3900671,19.5 16.5140671,18.378 17.8870671,16.637 C18.6270671,17.073 20.0500671,17.91 20.0500671,17.91 C17.9790671,20.732 14.4710671,22.427 10.6010671,21.906 C6.22106711,21.316 2.68406711,17.774 2.09406711,13.394 C1.31306711,7.591 5.49306711,2.594 11.0000671,2.05 L11.0000671,4.574 C7.33206711,5.064 4.50006711,8.198 4.50006711,12 C4.50006711,16.142 7.85806711,19.5 12.0000671,19.5 Z" + android:strokeWidth="1" /> </vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml index f2284bc37287..85c2bcdbdce0 100644 --- a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_qs_bluetooth_connecting.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml index 15201e924933..3a26cbaf7238 100644 --- a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_alarm_mute.xml @@ -16,6 +16,7 @@ --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" + android:tint="?android:attr/colorControlNormal" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" > diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml new file mode 100644 index 000000000000..ad79132bb0f8 --- /dev/null +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_odi_captions.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="2.000000" + android:translateY="4.000000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M18.0001,0 L2.0001,0 C0.8961,0 0.0001,0.896 0.0001,2 L0.0001,14 C0.0001,15.104 0.8961,16 2.0001,16 L18.0001,16 C19.1041,16 20.0001,15.104 20.0001,14 L20.0001,2 C20.0001,0.896 19.1041,0 18.0001,0 M18.0001,1.5 C18.2751,1.5 18.5001,1.725 18.5001,2 L18.5001,14 C18.5001,14.275 18.2751,14.5 18.0001,14.5 L2.0001,14.5 C1.7251,14.5 1.5001,14.275 1.5001,14 L1.5001,2 C1.5001,1.725 1.7251,1.5 2.0001,1.5 L18.0001,1.5" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M3.5001,11.5 L13.5001,11.5 C13.7761,11.5 14.0001,11.724 14.0001,12 L14.0001,12.5 C14.0001,12.776 13.7761,13 13.5001,13 L3.5001,13 C3.2241,13 3.0001,12.776 3.0001,12.5 L3.0001,12 C3.0001,11.724 3.2241,11.5 3.5001,11.5" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M3.5001,8.5 L4.0001,8.5 C4.2761,8.5 4.5001,8.724 4.5001,9 L4.5001,9.5 C4.5001,9.776 4.2761,10 4.0001,10 L3.5001,10 C3.2241,10 3.0001,9.776 3.0001,9.5 L3.0001,9 C3.0001,8.724 3.2241,8.5 3.5001,8.5" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M16.0001,11.5 L16.5001,11.5 C16.7761,11.5 17.0001,11.724 17.0001,12 L17.0001,12.5 C17.0001,12.776 16.7761,13 16.5001,13 L16.0001,13 C15.7241,13 15.5001,12.776 15.5001,12.5 L15.5001,12 C15.5001,11.724 15.7241,11.5 16.0001,11.5" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M6.5001,8.5 L16.5001,8.5 C16.7761,8.5 17.0001,8.724 17.0001,9 L17.0001,9.5 C17.0001,9.776 16.7761,10 16.5001,10 L6.5001,10 C6.2241,10 6.0001,9.776 6.0001,9.5 L6.0001,9 C6.0001,8.724 6.2241,8.5 6.5001,8.5" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml new file mode 100644 index 000000000000..2ea41f22943a --- /dev/null +++ b/packages/overlays/IconPackRoundedSystemUIOverlay/res/drawable/ic_volume_odi_captions_disabled.xml @@ -0,0 +1,61 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2019 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:height="24dp" + android:viewportHeight="24" + android:viewportWidth="24" + android:width="24dp" > + <group + android:translateX="1.750150" + android:translateY="2.750000" > + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M3.74975,9.74875 L4.24975,9.74875 C4.52575,9.74875 4.74975,9.97275 4.74975,10.24875 L4.74975,10.74875 C4.74975,11.02475 4.52575,11.24875 4.24975,11.24875 L3.74975,11.24875 C3.47375,11.24875 3.24975,11.02475 3.24975,10.74875 L3.24975,10.24875 C3.24975,9.97275 3.47375,9.74875 3.74975,9.74875" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M18.24975,2.74875 C18.52475,2.74875 18.74975,2.97375 18.74975,3.24875 L18.74975,15.24875 C18.74975,15.33875 18.71975,15.41875 18.67775,15.49275 L19.74675,16.56175 C20.05675,16.20975 20.24975,15.75475 20.24975,15.24875 L20.24975,3.24875 C20.24975,2.14475 19.35375,1.24875 18.24975,1.24875 L4.43375,1.24875 L5.93375,2.74875 L18.24975,2.74875 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M17.24975,13.74875 L17.24975,13.24875 C17.24975,12.97275 17.02575,12.74875 16.74975,12.74875 L16.24975,12.74875 C16.15875,12.74875 16.07875,12.77875 16.00575,12.82075 L17.17775,13.99275 C17.21975,13.91975 17.24975,13.83875 17.24975,13.74875" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M16.74975,11.24875 C17.02575,11.24875 17.24975,11.02475 17.24975,10.74875 L17.24975,10.24875 C17.24975,9.97275 17.02575,9.74875 16.74975,9.74875 L12.93375,9.74875 L14.43375,11.24875 L16.74975,11.24875 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M2.24975,15.74875 C1.97475,15.74875 1.74975,15.52375 1.74975,15.24875 L1.74975,3.24875 C1.74975,3.12675 1.79875,3.01875 1.87175,2.93275 L8.68875,9.74875 L6.74975,9.74875 C6.47375,9.74875 6.24975,9.97275 6.24975,10.24875 L6.24975,10.74875 C6.24975,11.02475 6.47375,11.24875 6.74975,11.24875 L10.18875,11.24875 L11.68875,12.74875 L3.74975,12.74875 C3.47375,12.74875 3.24975,12.97275 3.24975,13.24875 L3.24975,13.74875 C3.24975,14.02475 3.47375,14.24875 3.74975,14.24875 L13.18875,14.24875 L14.68975,15.74875 L2.24975,15.74875 Z M19.27975,18.21775 L1.27975,0.21975 C0.98675,-0.07325 0.51275,-0.07325 0.21975,0.21975 C-0.07325,0.51275 -0.07325,0.98675 0.21975,1.27975 L0.80775,1.86775 C0.46375,2.22775 0.24975,2.71175 0.24975,3.24875 L0.24975,15.24875 C0.24975,16.35275 1.14575,17.24875 2.24975,17.24875 L16.18975,17.24875 L18.21975,19.27775 C18.51275,19.57075 18.98675,19.57075 19.27975,19.27775 C19.57275,18.98475 19.57275,18.51075 19.27975,18.21775 L19.27975,18.21775 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M2.24975,15.74875 C1.97475,15.74875 1.74975,15.52375 1.74975,15.24875 L1.74975,3.24875 C1.74975,3.12675 1.79875,3.01875 1.87175,2.93275 L0.80775,1.86775 C0.46375,2.22775 0.24975,2.71175 0.24975,3.24875 L0.24975,15.24875 C0.24975,16.35275 1.14575,17.24875 2.24975,17.24875 L16.18975,17.24875 L14.68975,15.74875 L2.24975,15.74875 Z" + android:strokeWidth="1" /> + <path + android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M18.24975,2.74875 C18.52475,2.74875 18.74975,2.97375 18.74975,3.24875 L18.74975,15.24875 C18.74975,15.33875 18.71975,15.41875 18.67775,15.49275 L19.74675,16.56175 C20.05675,16.20975 20.24975,15.75475 20.24975,15.24875 L20.24975,3.24875 C20.24975,2.14475 19.35375,1.24875 18.24975,1.24875 L4.43375,1.24875 L5.93375,2.74875 L18.24975,2.74875 Z" + android:strokeWidth="1" /> + </group> +</vector>
\ No newline at end of file diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto index f9a2ca269335..8ad24894a1b9 100644 --- a/proto/src/wifi.proto +++ b/proto/src/wifi.proto @@ -551,6 +551,30 @@ message WifiLog { // Histogram of the EAP method type of all installed Passpoint profiles for R2 repeated PasspointProfileTypeCount installed_passpoint_profile_type_for_r2 = 148; + + // Histogram of Tx link speed at 2G + repeated Int32Count tx_link_speed_count_2g = 149; + + // Histogram of Tx link speed at 5G low band + repeated Int32Count tx_link_speed_count_5g_low = 150; + + // Histogram of Tx link speed at 5G middle band + repeated Int32Count tx_link_speed_count_5g_mid = 151; + + // Histogram of Tx link speed at 5G high band + repeated Int32Count tx_link_speed_count_5g_high = 152; + + // Histogram of Rx link speed at 2G + repeated Int32Count rx_link_speed_count_2g = 153; + + // Histogram of Rx link speed at 5G low band + repeated Int32Count rx_link_speed_count_5g_low = 154; + + // Histogram of Rx link speed at 5G middle band + repeated Int32Count rx_link_speed_count_5g_mid = 155; + + // Histogram of Rx link speed at 5G high band + repeated Int32Count rx_link_speed_count_5g_high = 156; } // Information that gets logged for every WiFi connection. @@ -827,6 +851,7 @@ message LinkSpeedCount { optional int64 rssi_sum_of_squares_dbm_sq = 4; } + // Number of occurrences of Soft AP session durations message SoftApDurationBucket { // Bucket covers duration : [duration_sec, duration_sec + bucket_size_sec) diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index c0af99c30542..2554433fb659 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -166,6 +166,52 @@ import java.util.concurrent.atomic.AtomicInteger; /** System service that performs backup/restore operations. */ public class UserBackupManagerService { + /** Wrapper over {@link PowerManager.WakeLock} to prevent double-free exceptions on release() + * after quit(). + * */ + public static class BackupWakeLock { + private final PowerManager.WakeLock mPowerManagerWakeLock; + private boolean mHasQuit = false; + + public BackupWakeLock(PowerManager.WakeLock powerManagerWakeLock) { + mPowerManagerWakeLock = powerManagerWakeLock; + } + + /** Acquires the {@link PowerManager.WakeLock} if hasn't been quit. */ + public synchronized void acquire() { + if (mHasQuit) { + Slog.v(TAG, "Ignore wakelock acquire after quit:" + mPowerManagerWakeLock.getTag()); + return; + } + mPowerManagerWakeLock.acquire(); + } + + /** Releases the {@link PowerManager.WakeLock} if hasn't been quit. */ + public synchronized void release() { + if (mHasQuit) { + Slog.v(TAG, "Ignore wakelock release after quit:" + mPowerManagerWakeLock.getTag()); + return; + } + mPowerManagerWakeLock.release(); + } + + /** + * Returns true if the {@link PowerManager.WakeLock} has been acquired but not yet released. + */ + public synchronized boolean isHeld() { + return mPowerManagerWakeLock.isHeld(); + } + + /** Release the {@link PowerManager.WakeLock} till it isn't held. */ + public synchronized void quit() { + while (mPowerManagerWakeLock.isHeld()) { + Slog.v(TAG, "Releasing wakelock:" + mPowerManagerWakeLock.getTag()); + mPowerManagerWakeLock.release(); + } + mHasQuit = true; + } + } + // Persistently track the need to do a full init. private static final String INIT_SENTINEL_FILE_NAME = "_need_init_"; @@ -252,7 +298,6 @@ public class UserBackupManagerService { private final @UserIdInt int mUserId; private final BackupAgentTimeoutParameters mAgentTimeoutParameters; private final TransportManager mTransportManager; - private final HandlerThread mUserBackupThread; private final Context mContext; private final PackageManager mPackageManager; @@ -263,7 +308,7 @@ public class UserBackupManagerService { private final AlarmManager mAlarmManager; private final IStorageManager mStorageManager; private final BackupManagerConstants mConstants; - private final PowerManager.WakeLock mWakelock; + private final BackupWakeLock mWakelock; private final BackupHandler mBackupHandler; private final IBackupManager mBackupManagerBinder; @@ -367,6 +412,9 @@ public class UserBackupManagerService { private long mCurrentToken = 0; @Nullable private File mAncestralSerialNumberFile; + private final ContentObserver mSetupObserver; + private final BroadcastReceiver mRunBackupReceiver; + private final BroadcastReceiver mRunInitReceiver; /** * Creates an instance of {@link UserBackupManagerService} and initializes state for it. This @@ -484,8 +532,7 @@ public class UserBackupManagerService { mAgentTimeoutParameters.start(); checkNotNull(userBackupThread, "userBackupThread cannot be null"); - mUserBackupThread = userBackupThread; - mBackupHandler = new BackupHandler(this, userBackupThread.getLooper()); + mBackupHandler = new BackupHandler(this, userBackupThread); // Set up our bookkeeping final ContentResolver resolver = context.getContentResolver(); @@ -493,11 +540,11 @@ public class UserBackupManagerService { mAutoRestore = Settings.Secure.getIntForUser(resolver, Settings.Secure.BACKUP_AUTO_RESTORE, 1, userId) != 0; - ContentObserver setupObserver = new SetupObserver(this, mBackupHandler); + mSetupObserver = new SetupObserver(this, mBackupHandler); resolver.registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE), /* notifyForDescendents */ false, - setupObserver, + mSetupObserver, mUserId); mBaseStateDir = checkNotNull(baseStateDir, "baseStateDir cannot be null"); @@ -516,21 +563,21 @@ public class UserBackupManagerService { mBackupPasswordManager = new BackupPasswordManager(mContext, mBaseStateDir, mRng); // Receivers for scheduled backups and transport initialization operations. - BroadcastReceiver runBackupReceiver = new RunBackupReceiver(this); + mRunBackupReceiver = new RunBackupReceiver(this); IntentFilter filter = new IntentFilter(); filter.addAction(RUN_BACKUP_ACTION); context.registerReceiverAsUser( - runBackupReceiver, + mRunBackupReceiver, UserHandle.of(userId), filter, android.Manifest.permission.BACKUP, /* scheduler */ null); - BroadcastReceiver runInitReceiver = new RunInitializeReceiver(this); + mRunInitReceiver = new RunInitializeReceiver(this); filter = new IntentFilter(); filter.addAction(RUN_INITIALIZE_ACTION); context.registerReceiverAsUser( - runInitReceiver, + mRunInitReceiver, UserHandle.of(userId), filter, android.Manifest.permission.BACKUP, @@ -585,7 +632,10 @@ public class UserBackupManagerService { mBackupHandler.postDelayed(this::parseLeftoverJournals, INITIALIZATION_DELAY_MILLIS); // Power management - mWakelock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*-" + userId); + mWakelock = new BackupWakeLock( + mPowerManager.newWakeLock( + PowerManager.PARTIAL_WAKE_LOCK, + "*backup*-" + userId + "-" + userBackupThread.getThreadId())); // Set up the various sorts of package tracking we do mFullBackupScheduleFile = new File(mBaseStateDir, "fb-schedule"); @@ -599,7 +649,13 @@ public class UserBackupManagerService { /** Cleans up state when the user of this service is stopped. */ void tearDownService() { - mUserBackupThread.quit(); + mAgentTimeoutParameters.stop(); + mConstants.stop(); + mContext.getContentResolver().unregisterContentObserver(mSetupObserver); + mContext.unregisterReceiver(mRunBackupReceiver); + mContext.unregisterReceiver(mRunInitReceiver); + mContext.unregisterReceiver(mPackageTrackingReceiver); + mBackupHandler.stop(); } public @UserIdInt int getUserId() { @@ -659,7 +715,7 @@ public class UserBackupManagerService { mSetupComplete = setupComplete; } - public PowerManager.WakeLock getWakelock() { + public BackupWakeLock getWakelock() { return mWakelock; } @@ -670,7 +726,7 @@ public class UserBackupManagerService { @VisibleForTesting public void setWorkSource(@Nullable WorkSource workSource) { // TODO: This is for testing, unfortunately WakeLock is final and WorkSource is not exposed - mWakelock.setWorkSource(workSource); + mWakelock.mPowerManagerWakeLock.setWorkSource(workSource); } public Handler getBackupHandler() { @@ -747,7 +803,7 @@ public class UserBackupManagerService { @VisibleForTesting BroadcastReceiver getPackageTrackingReceiver() { - return mBroadcastReceiver; + return mPackageTrackingReceiver; } @Nullable @@ -874,7 +930,7 @@ public class UserBackupManagerService { filter.addAction(Intent.ACTION_PACKAGE_CHANGED); filter.addDataScheme("package"); mContext.registerReceiverAsUser( - mBroadcastReceiver, + mPackageTrackingReceiver, UserHandle.of(mUserId), filter, /* broadcastPermission */ null, @@ -885,7 +941,7 @@ public class UserBackupManagerService { sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE); sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE); mContext.registerReceiverAsUser( - mBroadcastReceiver, + mPackageTrackingReceiver, UserHandle.of(mUserId), sdFilter, /* broadcastPermission */ null, @@ -1158,7 +1214,7 @@ public class UserBackupManagerService { * A {@link BroadcastReceiver} tracking changes to packages and sd cards in order to update our * internal bookkeeping. */ - private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + private BroadcastReceiver mPackageTrackingReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { if (MORE_DEBUG) { Slog.d(TAG, "Received broadcast " + intent); diff --git a/services/backup/java/com/android/server/backup/internal/BackupHandler.java b/services/backup/java/com/android/server/backup/internal/BackupHandler.java index ba153bf90ebe..059b1b9379af 100644 --- a/services/backup/java/com/android/server/backup/internal/BackupHandler.java +++ b/services/backup/java/com/android/server/backup/internal/BackupHandler.java @@ -23,7 +23,7 @@ import static com.android.server.backup.BackupManagerService.TAG; import android.app.backup.RestoreSet; import android.content.Intent; import android.os.Handler; -import android.os.Looper; +import android.os.HandlerThread; import android.os.Message; import android.os.RemoteException; import android.os.UserHandle; @@ -83,19 +83,47 @@ public class BackupHandler extends Handler { // backup task state machine tick public static final int MSG_BACKUP_RESTORE_STEP = 20; public static final int MSG_OP_COMPLETE = 21; + // Release the wakelock. This is used to ensure we don't hold it after + // a user is removed. This will also terminate the looper thread. + public static final int MSG_STOP = 22; private final UserBackupManagerService backupManagerService; private final BackupAgentTimeoutParameters mAgentTimeoutParameters; - public BackupHandler(UserBackupManagerService backupManagerService, Looper looper) { - super(looper); + private final HandlerThread mBackupThread; + private volatile boolean mIsStopping = false; + + public BackupHandler( + UserBackupManagerService backupManagerService, HandlerThread backupThread) { + super(backupThread.getLooper()); + mBackupThread = backupThread; this.backupManagerService = backupManagerService; mAgentTimeoutParameters = Preconditions.checkNotNull( backupManagerService.getAgentTimeoutParameters(), "Timeout parameters cannot be null"); } + /** + * Put the BackupHandler into a stopping state where the remaining messages on the queue will be + * silently dropped and the {@link WakeLock} held by the {@link UserBackupManagerService} will + * then be released. + */ + public void stop() { + mIsStopping = true; + sendMessage(obtainMessage(BackupHandler.MSG_STOP)); + } + public void handleMessage(Message msg) { + if (msg.what == MSG_STOP) { + Slog.v(TAG, "Stopping backup handler"); + backupManagerService.getWakelock().quit(); + mBackupThread.quitSafely(); + } + + if (mIsStopping) { + // If we're finishing all other types of messages should be ignored + return; + } TransportManager transportManager = backupManagerService.getTransportManager(); switch (msg.what) { diff --git a/services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java b/services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java index 97711e3c27ed..96d61e5755c8 100644 --- a/services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java +++ b/services/backup/java/com/android/server/backup/internal/RunInitializeReceiver.java @@ -23,7 +23,6 @@ import static com.android.server.backup.UserBackupManagerService.RUN_INITIALIZE_ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.os.PowerManager; import android.util.Slog; import com.android.server.backup.UserBackupManagerService; @@ -57,7 +56,8 @@ public class RunInitializeReceiver extends BroadcastReceiver { mUserBackupManagerService.clearPendingInits(); - PowerManager.WakeLock wakelock = mUserBackupManagerService.getWakelock(); + UserBackupManagerService.BackupWakeLock wakelock = + mUserBackupManagerService.getWakelock(); wakelock.acquire(); OnTaskFinishedListener listener = caller -> wakelock.release(); diff --git a/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java b/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java index 10304c39f021..5a57cdc39402 100644 --- a/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java +++ b/services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java @@ -34,7 +34,6 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.os.Binder; import android.os.Handler; import android.os.Message; -import android.os.PowerManager; import android.util.Slog; import com.android.server.backup.TransportManager; @@ -110,7 +109,7 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { // comes in. mBackupManagerService.getBackupHandler().removeMessages(MSG_RESTORE_SESSION_TIMEOUT); - PowerManager.WakeLock wakelock = mBackupManagerService.getWakelock(); + UserBackupManagerService.BackupWakeLock wakelock = mBackupManagerService.getWakelock(); wakelock.acquire(); // Prevent lambda from leaking 'this' @@ -392,7 +391,7 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { Handler backupHandler = mBackupManagerService.getBackupHandler(); backupHandler.removeMessages(MSG_RESTORE_SESSION_TIMEOUT); - PowerManager.WakeLock wakelock = mBackupManagerService.getWakelock(); + UserBackupManagerService.BackupWakeLock wakelock = mBackupManagerService.getWakelock(); wakelock.acquire(); if (MORE_DEBUG) { Slog.d(TAG, callerLogString); diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index fc67c38560fa..e5fddef96d8e 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -193,6 +193,7 @@ import com.android.server.net.BaseNetdEventCallback; import com.android.server.net.BaseNetworkObserver; import com.android.server.net.LockdownVpnTracker; import com.android.server.net.NetworkPolicyManagerInternal; +import com.android.server.net.NetworkStatsFactory; import com.android.server.utils.PriorityDump; import com.google.android.collect.Lists; @@ -4389,7 +4390,7 @@ public class ConnectivityService extends IConnectivityManager.Stub /** * @return VPN information for accounting, or null if we can't retrieve all required - * information, e.g primary underlying iface. + * information, e.g underlying ifaces. */ @Nullable private VpnInfo createVpnInfo(Vpn vpn) { @@ -4401,17 +4402,28 @@ public class ConnectivityService extends IConnectivityManager.Stub // see VpnService.setUnderlyingNetworks()'s javadoc about how to interpret // the underlyingNetworks list. if (underlyingNetworks == null) { - NetworkAgentInfo defaultNetwork = getDefaultNetwork(); - if (defaultNetwork != null && defaultNetwork.linkProperties != null) { - info.primaryUnderlyingIface = getDefaultNetwork().linkProperties.getInterfaceName(); + NetworkAgentInfo defaultNai = getDefaultNetwork(); + if (defaultNai != null) { + underlyingNetworks = new Network[] { defaultNai.network }; + } + } + if (underlyingNetworks != null && underlyingNetworks.length > 0) { + List<String> interfaces = new ArrayList<>(); + for (Network network : underlyingNetworks) { + LinkProperties lp = getLinkProperties(network); + if (lp != null) { + for (String iface : lp.getAllInterfaceNames()) { + if (!TextUtils.isEmpty(iface)) { + interfaces.add(iface); + } + } + } } - } else if (underlyingNetworks.length > 0) { - LinkProperties linkProperties = getLinkProperties(underlyingNetworks[0]); - if (linkProperties != null) { - info.primaryUnderlyingIface = linkProperties.getInterfaceName(); + if (!interfaces.isEmpty()) { + info.underlyingIfaces = interfaces.toArray(new String[interfaces.size()]); } } - return info.primaryUnderlyingIface == null ? null : info; + return info.underlyingIfaces == null ? null : info; } /** @@ -6791,8 +6803,8 @@ public class ConnectivityService extends IConnectivityManager.Stub } /** - * Notify NetworkStatsService that the set of active ifaces has changed, or that one of the - * properties tracked by NetworkStatsService on an active iface has changed. + * Notify NetworkStatsService and NetworkStatsFactory that the set of active ifaces has changed, + * or that one of the active iface's trackedproperties has changed. */ private void notifyIfacesChangedForNetworkStats() { ensureRunningOnConnectivityServiceThread(); @@ -6801,11 +6813,17 @@ public class ConnectivityService extends IConnectivityManager.Stub if (activeLinkProperties != null) { activeIface = activeLinkProperties.getInterfaceName(); } + + // CAUTION: Ordering matters between updateVpnInfos() and forceUpdateIfaces(), which + // triggers a new poll. Trigger the poll first to ensure a snapshot is taken before + // switching to the new state. This ensures that traffic does not get mis-attributed to + // incorrect apps (including VPN app). try { mStatsService.forceUpdateIfaces( - getDefaultNetworks(), getAllVpnInfo(), getAllNetworkState(), activeIface); + getDefaultNetworks(), getAllNetworkState(), activeIface); } catch (Exception ignored) { } + NetworkStatsFactory.updateVpnInfos(getAllVpnInfo()); } @Override diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index 8a639c543366..90e467034e6a 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -466,7 +466,7 @@ public class LocationManagerService extends ILocationManager.Stub { // the user being changed will cause a reload of all user specific settings, which causes // provider initialization, and propagates changes until a steady state is reached mCurrentUserId = UserHandle.USER_NULL; - onUserChangedLocked(UserHandle.USER_SYSTEM); + onUserChangedLocked(ActivityManager.getCurrentUser()); // initialize in-memory settings values onBackgroundThrottleWhitelistChangedLocked(); diff --git a/services/core/java/com/android/server/MmsServiceBroker.java b/services/core/java/com/android/server/MmsServiceBroker.java index b6fa1570cdb0..c0f10a3c86e1 100644 --- a/services/core/java/com/android/server/MmsServiceBroker.java +++ b/services/core/java/com/android/server/MmsServiceBroker.java @@ -37,6 +37,7 @@ import android.os.SystemClock; import android.os.UserHandle; import android.service.carrier.CarrierMessagingService; import android.telephony.SmsManager; +import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.Slog; @@ -331,7 +332,7 @@ public class MmsServiceBroker extends SystemService { @Override public void sendMessage(int subId, String callingPkg, Uri contentUri, String locationUrl, Bundle configOverrides, PendingIntent sentIntent) - throws RemoteException { + throws RemoteException { Slog.d(TAG, "sendMessage() by " + callingPkg); mContext.enforceCallingPermission(Manifest.permission.SEND_SMS, "Send MMS message"); if (getAppOpsManager().noteOp(AppOpsManager.OP_SEND_SMS, Binder.getCallingUid(), @@ -341,7 +342,8 @@ public class MmsServiceBroker extends SystemService { } contentUri = adjustUriForUserAndGrantPermission(contentUri, CarrierMessagingService.SERVICE_INTERFACE, - Intent.FLAG_GRANT_READ_URI_PERMISSION); + Intent.FLAG_GRANT_READ_URI_PERMISSION, + subId); getServiceGuarded().sendMessage(subId, callingPkg, contentUri, locationUrl, configOverrides, sentIntent); } @@ -360,7 +362,8 @@ public class MmsServiceBroker extends SystemService { } contentUri = adjustUriForUserAndGrantPermission(contentUri, CarrierMessagingService.SERVICE_INTERFACE, - Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION, + subId); getServiceGuarded().downloadMessage(subId, callingPkg, locationUrl, contentUri, configOverrides, downloadedIntent); @@ -388,7 +391,7 @@ public class MmsServiceBroker extends SystemService { @Override public Uri importMultimediaMessage(String callingPkg, Uri contentUri, String messageId, long timestampSecs, boolean seen, boolean read) - throws RemoteException { + throws RemoteException { if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(), callingPkg) != AppOpsManager.MODE_ALLOWED) { // Silently fail AppOps failure due to not being the default SMS app @@ -496,12 +499,12 @@ public class MmsServiceBroker extends SystemService { * even if the caller is not in the primary user. * * @param contentUri The Uri to adjust - * @param action The intent action used to find the associated carrier app + * @param action The intent action used to find the associated carrier app * @param permission The permission to add * @return The adjusted Uri containing the calling userId. */ private Uri adjustUriForUserAndGrantPermission(Uri contentUri, String action, - int permission) { + int permission, int subId) { final Intent grantIntent = new Intent(); grantIntent.setData(contentUri); grantIntent.setFlags(permission); @@ -521,9 +524,10 @@ public class MmsServiceBroker extends SystemService { // Grant permission for the carrier app. Intent intent = new Intent(action); TelephonyManager telephonyManager = - (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); - List<String> carrierPackages = telephonyManager.getCarrierPackageNamesForIntent( - intent); + (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); + List<String> carrierPackages = + telephonyManager.getCarrierPackageNamesForIntentAndPhone( + intent, SubscriptionManager.getPhoneId(subId)); if (carrierPackages != null && carrierPackages.size() == 1) { LocalServices.getService(UriGrantsManagerInternal.class) .grantUriPermissionFromIntent(callingUid, carrierPackages.get(0), diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java index 8d76634b7018..e5fb5062541e 100644 --- a/services/core/java/com/android/server/NetworkManagementService.java +++ b/services/core/java/com/android/server/NetworkManagementService.java @@ -36,7 +36,6 @@ import static android.net.NetworkStats.SET_DEFAULT; import static android.net.NetworkStats.STATS_PER_UID; import static android.net.NetworkStats.TAG_ALL; import static android.net.NetworkStats.TAG_NONE; -import static android.net.NetworkStats.UID_ALL; import static android.net.TrafficStats.UID_TETHERING; import static com.android.server.NetworkManagementSocketTagger.PROP_QTAGUID_ENABLED; @@ -1236,7 +1235,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub { public NetworkStats getNetworkStatsDetail() { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { - return mStatsFactory.readNetworkStatsDetail(UID_ALL, null, TAG_ALL, null); + return mStatsFactory.readNetworkStatsDetail(); } catch (IOException e) { throw new IllegalStateException(e); } @@ -1545,7 +1544,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub { public NetworkStats getNetworkStatsUidDetail(int uid, String[] ifaces) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { - return mStatsFactory.readNetworkStatsDetail(uid, ifaces, TAG_ALL, null); + return mStatsFactory.readNetworkStatsDetail(uid, ifaces, TAG_ALL); } catch (IOException e) { throw new IllegalStateException(e); } diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 1a6faecaecfd..e66e596d5038 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -1255,23 +1255,21 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } } - public void notifyPhysicalChannelConfiguration(List<PhysicalChannelConfig> configs) { - notifyPhysicalChannelConfigurationForSubscriber(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, - configs); - } - - public void notifyPhysicalChannelConfigurationForSubscriber(int subId, + /** + * Notify physical channel configuration according to subscripton ID and phone ID + */ + public void notifyPhysicalChannelConfigurationForSubscriber(int phoneId, int subId, List<PhysicalChannelConfig> configs) { if (!checkNotifyPermission("notifyPhysicalChannelConfiguration()")) { return; } if (VDBG) { - log("notifyPhysicalChannelConfiguration: subId=" + subId + " configs=" + configs); + log("notifyPhysicalChannelConfiguration: subId=" + subId + " phoneId=" + phoneId + + " configs=" + configs); } synchronized (mRecords) { - int phoneId = SubscriptionManager.getPhoneId(subId); if (validatePhoneId(phoneId)) { mPhysicalChannelConfigs.set(phoneId, configs); for (Record r : mRecords) { diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java index 6eb9f0c7a6bc..07482796b027 100644 --- a/services/core/java/com/android/server/VibratorService.java +++ b/services/core/java/com/android/server/VibratorService.java @@ -16,6 +16,7 @@ package com.android.server; +import android.annotation.Nullable; import android.app.ActivityManager; import android.app.AppOpsManager; import android.app.IUidObserver; @@ -193,7 +194,7 @@ public class VibratorService extends IVibratorService.Stub // with other system events, any duration calculations should be done use startTime so as // not to be affected by discontinuities created by RTC adjustments. public final long startTimeDebug; - public final int usageHint; + public final AudioAttributes attrs; public final int uid; public final String opPkg; public final String reason; @@ -206,12 +207,12 @@ public class VibratorService extends IVibratorService.Stub public VibrationEffect originalEffect; private Vibration(IBinder token, VibrationEffect effect, - int usageHint, int uid, String opPkg, String reason) { + AudioAttributes attrs, int uid, String opPkg, String reason) { this.token = token; this.effect = effect; this.startTime = SystemClock.elapsedRealtime(); this.startTimeDebug = System.currentTimeMillis(); - this.usageHint = usageHint; + this.attrs = attrs; this.uid = uid; this.opPkg = opPkg; this.reason = reason; @@ -231,7 +232,7 @@ public class VibratorService extends IVibratorService.Stub } public boolean isHapticFeedback() { - if (VibratorService.this.isHapticFeedback(usageHint)) { + if (VibratorService.this.isHapticFeedback(attrs.getUsage())) { return true; } if (effect instanceof VibrationEffect.Prebaked) { @@ -256,15 +257,15 @@ public class VibratorService extends IVibratorService.Stub } public boolean isNotification() { - return VibratorService.this.isNotification(usageHint); + return VibratorService.this.isNotification(attrs.getUsage()); } public boolean isRingtone() { - return VibratorService.this.isRingtone(usageHint); + return VibratorService.this.isRingtone(attrs.getUsage()); } public boolean isAlarm() { - return VibratorService.this.isAlarm(usageHint); + return VibratorService.this.isAlarm(attrs.getUsage()); } public boolean isFromSystem() { @@ -273,7 +274,7 @@ public class VibratorService extends IVibratorService.Stub public VibrationInfo toInfo() { return new VibrationInfo( - startTimeDebug, effect, originalEffect, usageHint, uid, opPkg, reason); + startTimeDebug, effect, originalEffect, attrs, uid, opPkg, reason); } } @@ -281,18 +282,18 @@ public class VibratorService extends IVibratorService.Stub private final long mStartTimeDebug; private final VibrationEffect mEffect; private final VibrationEffect mOriginalEffect; - private final int mUsageHint; + private final AudioAttributes mAttrs; private final int mUid; private final String mOpPkg; private final String mReason; public VibrationInfo(long startTimeDebug, VibrationEffect effect, - VibrationEffect originalEffect, int usageHint, int uid, + VibrationEffect originalEffect, AudioAttributes attrs, int uid, String opPkg, String reason) { mStartTimeDebug = startTimeDebug; mEffect = effect; mOriginalEffect = originalEffect; - mUsageHint = usageHint; + mAttrs = attrs; mUid = uid; mOpPkg = opPkg; mReason = reason; @@ -307,8 +308,8 @@ public class VibratorService extends IVibratorService.Stub .append(mEffect) .append(", originalEffect: ") .append(mOriginalEffect) - .append(", usageHint: ") - .append(mUsageHint) + .append(", attrs: ") + .append(mAttrs) .append(", uid: ") .append(mUid) .append(", opPkg: ") @@ -549,12 +550,11 @@ public class VibratorService extends IVibratorService.Stub } @Override // Binder call - public void vibrate(int uid, String opPkg, VibrationEffect effect, int usageHint, String reason, - IBinder token) { + public void vibrate(int uid, String opPkg, VibrationEffect effect, + @Nullable AudioAttributes attrs, String reason, IBinder token) { Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "vibrate, reason = " + reason); try { - if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.VIBRATE) - != PackageManager.PERMISSION_GRANTED) { + if (!hasPermission(android.Manifest.permission.VIBRATE)) { throw new SecurityException("Requires VIBRATE permission"); } if (token == null) { @@ -566,6 +566,22 @@ public class VibratorService extends IVibratorService.Stub return; } + if (attrs == null) { + attrs = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_UNKNOWN) + .build(); + } + + if (shouldBypassDnd(attrs)) { + if (!(hasPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) + || hasPermission(android.Manifest.permission.MODIFY_PHONE_STATE) + || hasPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING))) { + final int flags = attrs.getAllFlags() + & ~AudioAttributes.FLAG_BYPASS_INTERRUPTION_POLICY; + attrs = new AudioAttributes.Builder(attrs).replaceFlags(flags).build(); + } + } + // If our current vibration is longer than the new vibration and is the same amplitude, // then just let the current one finish. synchronized (mLock) { @@ -608,13 +624,13 @@ public class VibratorService extends IVibratorService.Stub return; } - Vibration vib = new Vibration(token, effect, usageHint, uid, opPkg, reason); + Vibration vib = new Vibration(token, effect, attrs, uid, opPkg, reason); if (mProcStatesCache.get(uid, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND && !vib.isNotification() && !vib.isRingtone() && !vib.isAlarm()) { Slog.e(TAG, "Ignoring incoming vibration as process with" - + " uid = " + uid + " is background," - + " usage = " + AudioAttributes.usageToString(vib.usageHint)); + + " uid= " + uid + " is background," + + " attrs= " + vib.attrs); return; } linkVibration(vib); @@ -632,6 +648,11 @@ public class VibratorService extends IVibratorService.Stub } } + private boolean hasPermission(String permission) { + return mContext.checkCallingOrSelfPermission(permission) + == PackageManager.PERMISSION_GRANTED; + } + private static boolean isRepeatingVibration(VibrationEffect effect) { return effect.getDuration() == Long.MAX_VALUE; } @@ -760,14 +781,14 @@ public class VibratorService extends IVibratorService.Stub if (vib.effect instanceof VibrationEffect.OneShot) { Trace.asyncTraceBegin(Trace.TRACE_TAG_VIBRATOR, "vibration", 0); VibrationEffect.OneShot oneShot = (VibrationEffect.OneShot) vib.effect; - doVibratorOn(oneShot.getDuration(), oneShot.getAmplitude(), vib.uid, vib.usageHint); + doVibratorOn(oneShot.getDuration(), oneShot.getAmplitude(), vib.uid, vib.attrs); mH.postDelayed(mVibrationEndRunnable, oneShot.getDuration()); } else if (vib.effect instanceof VibrationEffect.Waveform) { // mThread better be null here. doCancelVibrate should always be // called before startNextVibrationLocked or startVibrationLocked. Trace.asyncTraceBegin(Trace.TRACE_TAG_VIBRATOR, "vibration", 0); VibrationEffect.Waveform waveform = (VibrationEffect.Waveform) vib.effect; - mThread = new VibrateThread(waveform, vib.uid, vib.usageHint); + mThread = new VibrateThread(waveform, vib.uid, vib.attrs); mThread.start(); } else if (vib.effect instanceof VibrationEffect.Prebaked) { Trace.asyncTraceBegin(Trace.TRACE_TAG_VIBRATOR, "vibration", 0); @@ -788,13 +809,14 @@ public class VibratorService extends IVibratorService.Stub return true; } - if (vib.usageHint == AudioAttributes.USAGE_NOTIFICATION_RINGTONE) { + if (vib.attrs.getUsage() == AudioAttributes.USAGE_NOTIFICATION_RINGTONE) { return true; } - if (vib.usageHint == AudioAttributes.USAGE_ALARM || - vib.usageHint == AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY || - vib.usageHint == AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_REQUEST) { + if (vib.attrs.getUsage() == AudioAttributes.USAGE_ALARM + || vib.attrs.getUsage() == AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY + || vib.attrs.getUsage() + == AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_REQUEST) { return true; } @@ -887,12 +909,24 @@ public class VibratorService extends IVibratorService.Stub } } + private static boolean shouldBypassDnd(AudioAttributes attrs) { + return (attrs.getAllFlags() & AudioAttributes.FLAG_BYPASS_INTERRUPTION_POLICY) != 0; + } + private int getAppOpMode(Vibration vib) { int mode = mAppOps.checkAudioOpNoThrow(AppOpsManager.OP_VIBRATE, - vib.usageHint, vib.uid, vib.opPkg); + vib.attrs.getUsage(), vib.uid, vib.opPkg); if (mode == AppOpsManager.MODE_ALLOWED) { mode = mAppOps.startOpNoThrow(AppOpsManager.OP_VIBRATE, vib.uid, vib.opPkg); } + + if (mode == AppOpsManager.MODE_IGNORED && shouldBypassDnd(vib.attrs)) { + // If we're just ignoring the vibration op then this is set by DND and we should ignore + // if we're asked to bypass. AppOps won't be able to record this operation, so make + // sure we at least note it in the logs for debugging. + Slog.d(TAG, "Bypassing DND for vibration: " + vib); + mode = AppOpsManager.MODE_ALLOWED; + } return mode; } @@ -1032,7 +1066,7 @@ public class VibratorService extends IVibratorService.Stub return vibratorExists(); } - private void doVibratorOn(long millis, int amplitude, int uid, int usageHint) { + private void doVibratorOn(long millis, int amplitude, int uid, AudioAttributes attrs) { Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "doVibratorOn"); try { synchronized (mInputDeviceVibrators) { @@ -1046,10 +1080,8 @@ public class VibratorService extends IVibratorService.Stub noteVibratorOnLocked(uid, millis); final int vibratorCount = mInputDeviceVibrators.size(); if (vibratorCount != 0) { - final AudioAttributes attributes = - new AudioAttributes.Builder().setUsage(usageHint).build(); for (int i = 0; i < vibratorCount; i++) { - mInputDeviceVibrators.get(i).vibrate(millis, attributes); + mInputDeviceVibrators.get(i).vibrate(millis, attrs); } } else { // Note: ordering is important here! Many haptic drivers will reset their @@ -1118,7 +1150,7 @@ public class VibratorService extends IVibratorService.Stub Slog.w(TAG, "Failed to play prebaked effect, no fallback"); return 0; } - Vibration fallbackVib = new Vibration(vib.token, effect, vib.usageHint, vib.uid, + Vibration fallbackVib = new Vibration(vib.token, effect, vib.attrs, vib.uid, vib.opPkg, vib.reason + " (fallback)"); final int intensity = getCurrentIntensityLocked(fallbackVib); linkVibration(fallbackVib); @@ -1213,14 +1245,14 @@ public class VibratorService extends IVibratorService.Stub private class VibrateThread extends Thread { private final VibrationEffect.Waveform mWaveform; private final int mUid; - private final int mUsageHint; + private final AudioAttributes mAttrs; private boolean mForceStop; - VibrateThread(VibrationEffect.Waveform waveform, int uid, int usageHint) { + VibrateThread(VibrationEffect.Waveform waveform, int uid, AudioAttributes attrs) { mWaveform = waveform; mUid = uid; - mUsageHint = usageHint; + mAttrs = attrs; mTmpWorkSource.set(uid); mWakeLock.setWorkSource(mTmpWorkSource); } @@ -1295,7 +1327,7 @@ public class VibratorService extends IVibratorService.Stub // appropriate intervals. onDuration = getTotalOnDuration(timings, amplitudes, index - 1, repeat); - doVibratorOn(onDuration, amplitude, mUid, mUsageHint); + doVibratorOn(onDuration, amplitude, mUid, mAttrs); } else { doVibratorSetAmplitude(amplitude); } @@ -1612,8 +1644,9 @@ public class VibratorService extends IVibratorService.Stub VibrationEffect effect = VibrationEffect.createOneShot(duration, VibrationEffect.DEFAULT_AMPLITUDE); - vibrate(Binder.getCallingUid(), description, effect, AudioAttributes.USAGE_UNKNOWN, - "Shell Command", mToken); + AudioAttributes attrs = createAudioAttributes(commonOptions); + vibrate(Binder.getCallingUid(), description, effect, attrs, "Shell Command", + mToken); return 0; } finally { Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR); @@ -1672,8 +1705,9 @@ public class VibratorService extends IVibratorService.Stub amplitudesList.stream().mapToInt(Integer::intValue).toArray(); effect = VibrationEffect.createWaveform(timings, amplitudes, repeat); } - vibrate(Binder.getCallingUid(), description, effect, AudioAttributes.USAGE_UNKNOWN, - "Shell Command", mToken); + AudioAttributes attrs = createAudioAttributes(commonOptions); + vibrate(Binder.getCallingUid(), description, effect, attrs, "Shell Command", + mToken); return 0; } finally { Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR); @@ -1703,14 +1737,25 @@ public class VibratorService extends IVibratorService.Stub VibrationEffect effect = VibrationEffect.get(id, false); - vibrate(Binder.getCallingUid(), description, effect, AudioAttributes.USAGE_UNKNOWN, - "Shell Command", mToken); + AudioAttributes attrs = createAudioAttributes(commonOptions); + vibrate(Binder.getCallingUid(), description, effect, attrs, "Shell Command", + mToken); return 0; } finally { Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR); } } + private AudioAttributes createAudioAttributes(CommonOptions commonOptions) { + final int flags = commonOptions.force + ? AudioAttributes.FLAG_BYPASS_INTERRUPTION_POLICY + : 0; + return new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_UNKNOWN) + .setFlags(flags) + .build(); + } + @Override public void onHelp() { try (PrintWriter pw = getOutPrintWriter();) { diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java index 4e416a27c8ea..5b9c78f6e8ea 100644 --- a/services/core/java/com/android/server/Watchdog.java +++ b/services/core/java/com/android/server/Watchdog.java @@ -103,6 +103,7 @@ public class Watchdog extends Thread { public static final List<String> HAL_INTERFACES_OF_INTEREST = Arrays.asList( "android.hardware.audio@2.0::IDevicesFactory", "android.hardware.audio@4.0::IDevicesFactory", + "android.hardware.biometrics.face@1.0::IBiometricsFace", "android.hardware.bluetooth@1.0::IBluetoothHci", "android.hardware.camera.provider@2.4::ICameraProvider", "android.hardware.graphics.allocator@2.0::IAllocator", @@ -111,9 +112,9 @@ public class Watchdog extends Thread { "android.hardware.media.c2@1.0::IComponentStore", "android.hardware.media.omx@1.0::IOmx", "android.hardware.media.omx@1.0::IOmxStore", + "android.hardware.power.stats@1.0::IPowerStats", "android.hardware.sensors@1.0::ISensors", - "android.hardware.vr@1.0::IVr", - "android.hardware.biometrics.face@1.0::IBiometricsFace" + "android.hardware.vr@1.0::IVr" ); static Watchdog sWatchdog; diff --git a/services/core/java/com/android/server/WiredAccessoryManager.java b/services/core/java/com/android/server/WiredAccessoryManager.java index 9bbc3158757c..8e5c73bfc022 100644 --- a/services/core/java/com/android/server/WiredAccessoryManager.java +++ b/services/core/java/com/android/server/WiredAccessoryManager.java @@ -16,33 +16,33 @@ package com.android.server; +import static com.android.server.input.InputManagerService.SW_HEADPHONE_INSERT; +import static com.android.server.input.InputManagerService.SW_HEADPHONE_INSERT_BIT; +import static com.android.server.input.InputManagerService.SW_LINEOUT_INSERT; +import static com.android.server.input.InputManagerService.SW_LINEOUT_INSERT_BIT; +import static com.android.server.input.InputManagerService.SW_MICROPHONE_INSERT; +import static com.android.server.input.InputManagerService.SW_MICROPHONE_INSERT_BIT; + import android.content.Context; +import android.media.AudioManager; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.os.UEventObserver; +import android.util.Log; import android.util.Pair; import android.util.Slog; -import android.media.AudioManager; -import android.util.Log; import android.view.InputDevice; import com.android.internal.R; import com.android.server.input.InputManagerService; import com.android.server.input.InputManagerService.WiredAccessoryCallbacks; -import static com.android.server.input.InputManagerService.SW_HEADPHONE_INSERT; -import static com.android.server.input.InputManagerService.SW_MICROPHONE_INSERT; -import static com.android.server.input.InputManagerService.SW_LINEOUT_INSERT; -import static com.android.server.input.InputManagerService.SW_HEADPHONE_INSERT_BIT; -import static com.android.server.input.InputManagerService.SW_MICROPHONE_INSERT_BIT; -import static com.android.server.input.InputManagerService.SW_LINEOUT_INSERT_BIT; - import java.io.File; -import java.io.FileReader; import java.io.FileNotFoundException; +import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -538,7 +538,7 @@ final class WiredAccessoryManager implements WiredAccessoryCallbacks { synchronized (mLock) { int mask = maskAndState.first; int state = maskAndState.second; - updateLocked(name, mHeadsetState | (mask & state) & ~(mask & ~state)); + updateLocked(name, mHeadsetState & ~(mask & ~state) | (mask & state)); return; } } diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index cba9674d7360..26b3f435dea1 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -510,12 +510,12 @@ final class ActivityManagerShellCommand extends ShellCommand { options.setLockTaskEnabled(true); } if (mWaitOption) { - result = mInternal.startActivityAndWait(null, null, intent, mimeType, + result = mInternal.startActivityAndWait(null, SHELL_PACKAGE_NAME, intent, mimeType, null, null, 0, mStartFlags, profilerInfo, options != null ? options.toBundle() : null, mUserId); res = result.result; } else { - res = mInternal.startActivityAsUser(null, null, intent, mimeType, + res = mInternal.startActivityAsUser(null, SHELL_PACKAGE_NAME, intent, mimeType, null, null, 0, mStartFlags, profilerInfo, options != null ? options.toBundle() : null, mUserId); } diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index e2b59b45e1e6..c2f452932775 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -108,7 +108,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub .replaceWith("?"); private ByteBuffer mUtf8BufferStat = ByteBuffer.allocateDirect(MAX_LOW_POWER_STATS_SIZE); private CharBuffer mUtf16BufferStat = CharBuffer.allocate(MAX_LOW_POWER_STATS_SIZE); - private static final int MAX_LOW_POWER_STATS_SIZE = 2048; + private static final int MAX_LOW_POWER_STATS_SIZE = 4096; /** * Replaces the information in the given rpmStats with up-to-date information. diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index bcfe71b82a6a..dbf8acf74dbd 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -34,6 +34,7 @@ import static android.os.Process.THREAD_GROUP_BG_NONINTERACTIVE; import static android.os.Process.THREAD_GROUP_DEFAULT; import static android.os.Process.THREAD_GROUP_RESTRICTED; import static android.os.Process.THREAD_GROUP_TOP_APP; +import static android.os.Process.THREAD_PRIORITY_DISPLAY; import static android.os.Process.setProcessGroup; import static android.os.Process.setThreadPriority; import static android.os.Process.setThreadScheduler; @@ -1803,7 +1804,6 @@ public final class OomAdjuster { if (app.renderThreadTid != 0) { setThreadScheduler(app.renderThreadTid, SCHED_OTHER, 0); - setThreadPriority(app.renderThreadTid, -4); } } catch (IllegalArgumentException e) { Slog.w(TAG, @@ -1815,9 +1815,10 @@ public final class OomAdjuster { } else { // Reset priority for top app UI and render threads setThreadPriority(app.pid, 0); - if (app.renderThreadTid != 0) { - setThreadPriority(app.renderThreadTid, 0); - } + } + + if (app.renderThreadTid != 0) { + setThreadPriority(app.renderThreadTid, THREAD_PRIORITY_DISPLAY); } } } catch (Exception e) { diff --git a/services/core/java/com/android/server/attention/AttentionManagerService.java b/services/core/java/com/android/server/attention/AttentionManagerService.java index 1b45eb4f00bb..087c84f1a42f 100644 --- a/services/core/java/com/android/server/attention/AttentionManagerService.java +++ b/services/core/java/com/android/server/attention/AttentionManagerService.java @@ -375,7 +375,7 @@ public class AttentionManagerService extends SystemService { private void dumpInternal(IndentingPrintWriter ipw) { ipw.println("Attention Manager Service (dumpsys attention) state:\n"); - + ipw.println("isServiceEnabled=" + isServiceEnabled()); ipw.println("AttentionServicePackageName=" + getServiceConfigPackage(mContext)); ipw.println("Resolved component:"); if (mComponentName != null) { diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java index 884ecbaac058..3a75eebaa4ca 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java +++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java @@ -15,9 +15,6 @@ */ package com.android.server.audio; -import static com.android.server.audio.AudioService.CONNECTION_STATE_CONNECTED; -import static com.android.server.audio.AudioService.CONNECTION_STATE_DISCONNECTED; - import android.annotation.NonNull; import android.bluetooth.BluetoothA2dp; import android.bluetooth.BluetoothDevice; @@ -93,13 +90,28 @@ import com.android.internal.annotations.GuardedBy; /*package*/ AudioDeviceBroker(@NonNull Context context, @NonNull AudioService service) { mContext = context; mAudioService = service; - setupMessaging(context); mBtHelper = new BtHelper(this); mDeviceInventory = new AudioDeviceInventory(this); + init(); + } + + /** for test purposes only, inject AudioDeviceInventory */ + AudioDeviceBroker(@NonNull Context context, @NonNull AudioService service, + @NonNull AudioDeviceInventory mockDeviceInventory) { + mContext = context; + mAudioService = service; + mBtHelper = new BtHelper(this); + mDeviceInventory = mockDeviceInventory; + + init(); + } + + private void init() { + setupMessaging(mContext); + mForcedUseForComm = AudioSystem.FORCE_NONE; mForcedUseForCommExt = mForcedUseForComm; - } /*package*/ Context getContext() { @@ -123,6 +135,8 @@ import com.android.internal.annotations.GuardedBy; /*package*/ void onAudioServerDied() { // Restore forced usage for communications and record synchronized (mDeviceStateLock) { + AudioSystem.setParameters( + "BT_SCO=" + (mForcedUseForComm == AudioSystem.FORCE_BT_SCO ? "on" : "off")); onSetForceUse(AudioSystem.FOR_COMMUNICATION, mForcedUseForComm, "onAudioServerDied"); onSetForceUse(AudioSystem.FOR_RECORD, mForcedUseForComm, "onAudioServerDied"); } @@ -228,17 +242,42 @@ import com.android.internal.annotations.GuardedBy; mSupprNoisy = suppressNoisyIntent; mVolume = vol; } + + // redefine equality op so we can match messages intended for this device + @Override + public boolean equals(Object o) { + return mDevice.equals(o); + } } + /*package*/ void postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent( @NonNull BluetoothDevice device, @AudioService.BtProfileConnectionState int state, int profile, boolean suppressNoisyIntent, int a2dpVolume) { final BtDeviceConnectionInfo info = new BtDeviceConnectionInfo(device, state, profile, suppressNoisyIntent, a2dpVolume); - // TODO add a check to try to remove unprocessed messages for the same device (the old - // check didn't work), and make sure it doesn't conflict with config change message - sendLMsgNoDelay(MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT, SENDMSG_QUEUE, info); + // when receiving a request to change the connection state of a device, this last request + // is the source of truth, so cancel all previous requests + removeAllA2dpConnectionEvents(device); + + sendLMsgNoDelay( + state == BluetoothProfile.STATE_CONNECTED + ? MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_CONNECTION + : MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_DISCONNECTION, + SENDMSG_QUEUE, info); + } + + /** remove all previously scheduled connection and disconnection events for the given device */ + private void removeAllA2dpConnectionEvents(@NonNull BluetoothDevice device) { + mBrokerHandler.removeMessages(MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_DISCONNECTION, + device); + mBrokerHandler.removeMessages(MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_CONNECTION, + device); + mBrokerHandler.removeMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED, + device); + mBrokerHandler.removeMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED, + device); } private static final class HearingAidDeviceConnectionInfo { @@ -426,13 +465,16 @@ import com.android.internal.annotations.GuardedBy; sendMsgNoDelay(MSG_BROADCAST_AUDIO_BECOMING_NOISY, SENDMSG_REPLACE); } - /*package*/ void postA2dpSinkConnection(int state, + /*package*/ void postA2dpSinkConnection(@AudioService.BtProfileConnectionState int state, @NonNull BtHelper.BluetoothA2dpDeviceInfo btDeviceInfo, int delay) { - sendILMsg(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE, SENDMSG_QUEUE, + sendILMsg(state == BluetoothA2dp.STATE_CONNECTED + ? MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED + : MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED, + SENDMSG_QUEUE, state, btDeviceInfo, delay); } - /*package*/ void postA2dpSourceConnection(int state, + /*package*/ void postA2dpSourceConnection(@AudioService.BtProfileConnectionState int state, @NonNull BtHelper.BluetoothA2dpDeviceInfo btDeviceInfo, int delay) { sendILMsg(MSG_IL_SET_A2DP_SOURCE_CONNECTION_STATE, SENDMSG_QUEUE, state, btDeviceInfo, delay); @@ -518,25 +560,6 @@ import com.android.internal.annotations.GuardedBy; } } - @GuardedBy("mDeviceStateLock") - /*package*/ void handleSetA2dpSinkConnectionState(@BluetoothProfile.BtProfileState int state, - @NonNull BtHelper.BluetoothA2dpDeviceInfo btDeviceInfo) { - final int intState = (state == BluetoothA2dp.STATE_CONNECTED) - ? CONNECTION_STATE_CONNECTED : CONNECTION_STATE_DISCONNECTED; - final int delay = mDeviceInventory.checkSendBecomingNoisyIntent( - AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, intState, - AudioSystem.DEVICE_NONE); - final String addr = btDeviceInfo == null ? "null" : btDeviceInfo.getBtDevice().getAddress(); - - if (AudioService.DEBUG_DEVICES) { - Log.d(TAG, "handleSetA2dpSinkConnectionState btDevice= " + btDeviceInfo - + " state= " + state - + " is dock: " + btDeviceInfo.getBtDevice().isBluetoothDock()); - } - sendILMsg(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE, SENDMSG_QUEUE, - state, btDeviceInfo, delay); - } - /*package*/ void postSetA2dpSourceConnectionState(@BluetoothProfile.BtProfileState int state, @NonNull BtHelper.BluetoothA2dpDeviceInfo btDeviceInfo) { final int intState = (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0; @@ -571,8 +594,10 @@ import com.android.internal.annotations.GuardedBy; // must be called synchronized on mConnectedDevices /*package*/ boolean hasScheduledA2dpSinkConnectionState(BluetoothDevice btDevice) { - return mBrokerHandler.hasMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE, - new BtHelper.BluetoothA2dpDeviceInfo(btDevice)); + return (mBrokerHandler.hasMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED, + new BtHelper.BluetoothA2dpDeviceInfo(btDevice)) + || mBrokerHandler.hasMessages(MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED, + new BtHelper.BluetoothA2dpDeviceInfo(btDevice))); } /*package*/ void setA2dpDockTimeout(String address, int a2dpCodec, int delayMs) { @@ -698,7 +723,8 @@ import com.android.internal.annotations.GuardedBy; mDeviceInventory.onReportNewRoutes(); } break; - case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE: + case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED: + case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED: synchronized (mDeviceStateLock) { mDeviceInventory.onSetA2dpSinkConnectionState( (BtHelper.BluetoothA2dpDeviceInfo) msg.obj, msg.arg1); @@ -823,7 +849,8 @@ import com.android.internal.annotations.GuardedBy; } } break; - case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT: { + case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_CONNECTION: + case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_DISCONNECTION: { final BtDeviceConnectionInfo info = (BtDeviceConnectionInfo) msg.obj; AudioService.sDeviceLogger.log((new AudioEventLogger.StringEvent( "setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent " @@ -874,7 +901,7 @@ import com.android.internal.annotations.GuardedBy; private static final int MSG_I_BROADCAST_BT_CONNECTION_STATE = 3; private static final int MSG_IIL_SET_FORCE_USE = 4; private static final int MSG_IIL_SET_FORCE_BT_A2DP_USE = 5; - private static final int MSG_IL_SET_A2DP_SINK_CONNECTION_STATE = 6; + private static final int MSG_TOGGLE_HDMI = 6; private static final int MSG_IL_SET_A2DP_SOURCE_CONNECTION_STATE = 7; private static final int MSG_IL_SET_HEARING_AID_CONNECTION_STATE = 8; private static final int MSG_BT_HEADSET_CNCT_FAILED = 9; @@ -885,7 +912,6 @@ import com.android.internal.annotations.GuardedBy; private static final int MSG_II_SET_HEARING_AID_VOLUME = 14; private static final int MSG_I_SET_AVRCP_ABSOLUTE_VOLUME = 15; private static final int MSG_I_DISCONNECT_BT_SCO = 16; - private static final int MSG_TOGGLE_HDMI = 17; private static final int MSG_L_A2DP_ACTIVE_DEVICE_CHANGE = 18; private static final int MSG_DISCONNECT_A2DP = 19; private static final int MSG_DISCONNECT_A2DP_SINK = 20; @@ -895,25 +921,30 @@ import com.android.internal.annotations.GuardedBy; private static final int MSG_L_BT_SERVICE_CONNECTED_PROFILE_A2DP_SINK = 24; private static final int MSG_L_BT_SERVICE_CONNECTED_PROFILE_HEARING_AID = 25; private static final int MSG_L_BT_SERVICE_CONNECTED_PROFILE_HEADSET = 26; + private static final int MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED = 27; + private static final int MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED = 28; // process external command to (dis)connect an A2DP device - private static final int MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT = 27; + private static final int MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_CONNECTION = 29; + private static final int MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_DISCONNECTION = 30; // process external command to (dis)connect a hearing aid device - private static final int MSG_L_HEARING_AID_DEVICE_CONNECTION_CHANGE_EXT = 28; + private static final int MSG_L_HEARING_AID_DEVICE_CONNECTION_CHANGE_EXT = 31; // a ScoClient died in BtHelper - private static final int MSG_L_SCOCLIENT_DIED = 29; + private static final int MSG_L_SCOCLIENT_DIED = 32; private static boolean isMessageHandledUnderWakelock(int msgId) { switch(msgId) { case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE: - case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE: + case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED: + case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED: case MSG_IL_SET_A2DP_SOURCE_CONNECTION_STATE: case MSG_IL_SET_HEARING_AID_CONNECTION_STATE: case MSG_IL_BTA2DP_DOCK_TIMEOUT: case MSG_L_A2DP_DEVICE_CONFIG_CHANGE: case MSG_TOGGLE_HDMI: case MSG_L_A2DP_ACTIVE_DEVICE_CHANGE: - case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT: + case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_CONNECTION: + case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT_DISCONNECTION: case MSG_L_HEARING_AID_DEVICE_CONNECTION_CHANGE_EXT: return true; default: @@ -994,7 +1025,8 @@ import com.android.internal.annotations.GuardedBy; switch (msg) { case MSG_IL_SET_A2DP_SOURCE_CONNECTION_STATE: - case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE: + case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_CONNECTED: + case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE_DISCONNECTED: case MSG_IL_SET_HEARING_AID_CONNECTION_STATE: case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE: case MSG_IL_BTA2DP_DOCK_TIMEOUT: diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java index a9a8ef2f7e12..90973a888a9d 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -41,14 +41,16 @@ import android.util.Log; import android.util.Slog; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; /** * Class to manage the inventory of all connected devices. * This class is thread-safe. + * (non final for mocking/spying) */ -public final class AudioDeviceInventory { +public class AudioDeviceInventory { private static final String TAG = "AS.AudioDeviceInventory"; @@ -56,11 +58,7 @@ public final class AudioDeviceInventory { // Key for map created from DeviceInfo.makeDeviceListKey() private final ArrayMap<String, DeviceInfo> mConnectedDevices = new ArrayMap<>(); - private final @NonNull AudioDeviceBroker mDeviceBroker; - - AudioDeviceInventory(@NonNull AudioDeviceBroker broker) { - mDeviceBroker = broker; - } + private @NonNull AudioDeviceBroker mDeviceBroker; // cache of the address of the last dock the device was connected to private String mDockAddress; @@ -70,6 +68,20 @@ public final class AudioDeviceInventory { final RemoteCallbackList<IAudioRoutesObserver> mRoutesObservers = new RemoteCallbackList<IAudioRoutesObserver>(); + /*package*/ AudioDeviceInventory(@NonNull AudioDeviceBroker broker) { + mDeviceBroker = broker; + } + + //----------------------------------------------------------- + /** for mocking only */ + /*package*/ AudioDeviceInventory() { + mDeviceBroker = null; + } + + /*package*/ void setDeviceBroker(@NonNull AudioDeviceBroker broker) { + mDeviceBroker = broker; + } + //------------------------------------------------------------ /** * Class to store info about connected devices. @@ -146,8 +158,10 @@ public final class AudioDeviceInventory { } } + // only public for mocking/spying @GuardedBy("AudioDeviceBroker.mDeviceStateLock") - /*package*/ void onSetA2dpSinkConnectionState(@NonNull BtHelper.BluetoothA2dpDeviceInfo btInfo, + @VisibleForTesting + public void onSetA2dpSinkConnectionState(@NonNull BtHelper.BluetoothA2dpDeviceInfo btInfo, @AudioService.BtProfileConnectionState int state) { final BluetoothDevice btDevice = btInfo.getBtDevice(); int a2dpVolume = btInfo.getVolume(); @@ -159,30 +173,40 @@ public final class AudioDeviceInventory { if (!BluetoothAdapter.checkBluetoothAddress(address)) { address = ""; } + + final int a2dpCodec = btInfo.getCodec(); + AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent( "A2DP sink connected: device addr=" + address + " state=" + state + + " codec=" + a2dpCodec + " vol=" + a2dpVolume)); - final int a2dpCodec = btInfo.getCodec(); - synchronized (mConnectedDevices) { final String key = DeviceInfo.makeDeviceListKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, btDevice.getAddress()); final DeviceInfo di = mConnectedDevices.get(key); boolean isConnected = di != null; - if (isConnected && state != BluetoothProfile.STATE_CONNECTED) { - if (btDevice.isBluetoothDock()) { - if (state == BluetoothProfile.STATE_DISCONNECTED) { - // introduction of a delay for transient disconnections of docks when - // power is rapidly turned off/on, this message will be canceled if - // we reconnect the dock under a preset delay - makeA2dpDeviceUnavailableLater(address, - AudioDeviceBroker.BTA2DP_DOCK_TIMEOUT_MS); - // the next time isConnected is evaluated, it will be false for the dock + if (isConnected) { + if (state == BluetoothProfile.STATE_CONNECTED) { + // device is already connected, but we are receiving a connection again, + // it could be for a codec change + if (a2dpCodec != di.mDeviceCodecFormat) { + mDeviceBroker.postBluetoothA2dpDeviceConfigChange(btDevice); } } else { - makeA2dpDeviceUnavailableNow(address, di.mDeviceCodecFormat); + if (btDevice.isBluetoothDock()) { + if (state == BluetoothProfile.STATE_DISCONNECTED) { + // introduction of a delay for transient disconnections of docks when + // power is rapidly turned off/on, this message will be canceled if + // we reconnect the dock under a preset delay + makeA2dpDeviceUnavailableLater(address, + AudioDeviceBroker.BTA2DP_DOCK_TIMEOUT_MS); + // the next time isConnected is evaluated, it will be false for the dock + } + } else { + makeA2dpDeviceUnavailableNow(address, di.mDeviceCodecFormat); + } } } else if (!isConnected && state == BluetoothProfile.STATE_CONNECTED) { if (btDevice.isBluetoothDock()) { @@ -282,11 +306,9 @@ public final class AudioDeviceInventory { + " event=" + BtHelper.a2dpDeviceEventToString(event))); synchronized (mConnectedDevices) { - //TODO original CL is not consistent between BluetoothDevice and BluetoothA2dpDeviceInfo - // for this type of message if (mDeviceBroker.hasScheduledA2dpSinkConnectionState(btDevice)) { AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent( - "A2dp config change ignored")); + "A2dp config change ignored (scheduled connection change)")); return; } final String key = DeviceInfo.makeDeviceListKey( @@ -534,8 +556,10 @@ public final class AudioDeviceInventory { return mCurAudioRoutes; } + // only public for mocking/spying @GuardedBy("AudioDeviceBroker.mDeviceStateLock") - /*package*/ void setBluetoothA2dpDeviceConnectionState( + @VisibleForTesting + public void setBluetoothA2dpDeviceConnectionState( @NonNull BluetoothDevice device, @AudioService.BtProfileConnectionState int state, int profile, boolean suppressNoisyIntent, int musicDevice, int a2dpVolume) { int delay; @@ -544,9 +568,12 @@ public final class AudioDeviceInventory { } synchronized (mConnectedDevices) { if (profile == BluetoothProfile.A2DP && !suppressNoisyIntent) { - int intState = (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0; + @AudioService.ConnectionState int asState = + (state == BluetoothA2dp.STATE_CONNECTED) + ? AudioService.CONNECTION_STATE_CONNECTED + : AudioService.CONNECTION_STATE_DISCONNECTED; delay = checkSendBecomingNoisyIntentInt(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, - intState, musicDevice); + asState, musicDevice); } else { delay = 0; } @@ -785,7 +812,7 @@ public final class AudioDeviceInventory { return 0; } mDeviceBroker.postBroadcastBecomingNoisy(); - delay = 1000; + delay = AudioService.BECOMING_NOISY_DELAY_MS; } return delay; @@ -943,4 +970,21 @@ public final class AudioDeviceInventory { intent.putExtra(AudioManager.EXTRA_MAX_CHANNEL_COUNT, maxChannels); } } + + //---------------------------------------------------------- + // For tests only + + /** + * Check if device is in the list of connected devices + * @param device + * @return true if connected + */ + @VisibleForTesting + public boolean isA2dpDeviceConnected(@NonNull BluetoothDevice device) { + final String key = DeviceInfo.makeDeviceListKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, + device.getAddress()); + synchronized (mConnectedDevices) { + return (mConnectedDevices.get(key) != null); + } + } } diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 4b08db6be047..6c56f8e5dbf6 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -134,6 +134,7 @@ import android.view.accessibility.AccessibilityManager; import android.widget.Toast; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.DumpUtils; import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; @@ -201,6 +202,13 @@ public class AudioService extends IAudioService.Stub private static final int UNMUTE_STREAM_DELAY = 350; /** + * Delay before disconnecting a device that would cause BECOMING_NOISY intent to be sent, + * to give a chance to applications to pause. + */ + @VisibleForTesting + public static final int BECOMING_NOISY_DELAY_MS = 1000; + + /** * Only used in the result from {@link #checkForRingerModeChange(int, int, int)} */ private static final int FLAG_ADJUST_VOLUME = 1; @@ -4123,7 +4131,9 @@ public class AudioService extends IAudioService.Stub || adjust == AudioManager.ADJUST_TOGGLE_MUTE; } - /*package*/ boolean isInCommunication() { + /** only public for mocking/spying, do not call outside of AudioService */ + @VisibleForTesting + public boolean isInCommunication() { boolean IsInCall = false; TelecomManager telecomManager = @@ -4292,7 +4302,9 @@ public class AudioService extends IAudioService.Stub return false; } - /*package*/ int getDeviceForStream(int stream) { + /** only public for mocking/spying, do not call outside of AudioService */ + @VisibleForTesting + public int getDeviceForStream(int stream) { int device = getDevicesForStream(stream); if ((device & (device - 1)) != 0) { // Multiple device selection is either: @@ -4337,7 +4349,9 @@ public class AudioService extends IAudioService.Stub } } - /*package*/ void postObserveDevicesForAllStreams() { + /** only public for mocking/spying, do not call outside of AudioService */ + @VisibleForTesting + public void postObserveDevicesForAllStreams() { sendMsg(mAudioHandler, MSG_OBSERVE_DEVICES_FOR_ALL_STREAMS, SENDMSG_QUEUE, 0 /*arg1*/, 0 /*arg2*/, null /*obj*/, @@ -4448,7 +4462,9 @@ public class AudioService extends IAudioService.Stub AudioSystem.DEVICE_OUT_ALL_USB | AudioSystem.DEVICE_OUT_HDMI; - /*package*/ void postAccessoryPlugMediaUnmute(int newDevice) { + /** only public for mocking/spying, do not call outside of AudioService */ + @VisibleForTesting + public void postAccessoryPlugMediaUnmute(int newDevice) { sendMsg(mAudioHandler, MSG_ACCESSORY_PLUG_MEDIA_UNMUTE, SENDMSG_QUEUE, newDevice, 0, null, 0); } @@ -4998,7 +5014,9 @@ public class AudioService extends IAudioService.Stub } } - /*package*/ void postSetVolumeIndexOnDevice(int streamType, int vssVolIndex, int device, + /** only public for mocking/spying, do not call outside of AudioService */ + @VisibleForTesting + public void postSetVolumeIndexOnDevice(int streamType, int vssVolIndex, int device, String caller) { sendMsg(mAudioHandler, MSG_SET_DEVICE_STREAM_VOLUME, @@ -5577,15 +5595,19 @@ public class AudioService extends IAudioService.Stub /** * @return true if there is currently a registered dynamic mixing policy that affects media + * and is not a render + loopback policy */ - /*package*/ boolean hasMediaDynamicPolicy() { + // only public for mocking/spying + @VisibleForTesting + public boolean hasMediaDynamicPolicy() { synchronized (mAudioPolicies) { if (mAudioPolicies.isEmpty()) { return false; } final Collection<AudioPolicyProxy> appColl = mAudioPolicies.values(); for (AudioPolicyProxy app : appColl) { - if (app.hasMixAffectingUsage(AudioAttributes.USAGE_MEDIA)) { + if (app.hasMixAffectingUsage(AudioAttributes.USAGE_MEDIA, + AudioMix.ROUTE_FLAG_LOOP_BACK_RENDER)) { return true; } } @@ -5910,7 +5932,9 @@ public class AudioService extends IAudioService.Stub return mMediaFocusControl.getFocusRampTimeMs(focusGain, attr); } - /*package*/ boolean hasAudioFocusUsers() { + /** only public for mocking/spying, do not call outside of AudioService */ + @VisibleForTesting + public boolean hasAudioFocusUsers() { return mMediaFocusControl.hasAudioFocusUsers(); } @@ -7348,9 +7372,10 @@ public class AudioService extends IAudioService.Stub Binder.restoreCallingIdentity(identity); } - boolean hasMixAffectingUsage(int usage) { + boolean hasMixAffectingUsage(int usage, int excludedFlags) { for (AudioMix mix : mMixes) { - if (mix.isAffectingUsage(usage)) { + if (mix.isAffectingUsage(usage) + && ((mix.getRouteFlags() & excludedFlags) != excludedFlags)) { return true; } } diff --git a/services/core/java/com/android/server/audio/BtHelper.java b/services/core/java/com/android/server/audio/BtHelper.java index 1a63f8f51ee3..9f1a6bd15ac3 100644 --- a/services/core/java/com/android/server/audio/BtHelper.java +++ b/services/core/java/com/android/server/audio/BtHelper.java @@ -139,6 +139,12 @@ public class BtHelper { public int getCodec() { return mCodec; } + + // redefine equality op so we can match messages intended for this device + @Override + public boolean equals(Object o) { + return mBtDevice.equals(o); + } } // A2DP device events @@ -441,9 +447,9 @@ public class BtHelper { return; } final BluetoothDevice btDevice = deviceList.get(0); - final @BluetoothProfile.BtProfileState int state = mA2dp.getConnectionState(btDevice); - mDeviceBroker.handleSetA2dpSinkConnectionState( - state, new BluetoothA2dpDeviceInfo(btDevice)); + // the device is guaranteed CONNECTED + mDeviceBroker.postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(btDevice, + BluetoothA2dp.STATE_CONNECTED, BluetoothProfile.A2DP_SINK, true, -1); } /*package*/ synchronized void onA2dpSinkProfileConnected(BluetoothProfile profile) { diff --git a/services/core/java/com/android/server/biometrics/AuthenticationClient.java b/services/core/java/com/android/server/biometrics/AuthenticationClient.java index b899d028869b..4a9ccdee0522 100644 --- a/services/core/java/com/android/server/biometrics/AuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/AuthenticationClient.java @@ -46,6 +46,7 @@ public abstract class AuthenticationClient extends ClientMonitor { // authentication while the device is already locked out. In that case, the client is created // but not started yet. The user shouldn't receive the error haptics in this case. private boolean mStarted; + private long mStartTimeMs; /** * This method is called when authentication starts. @@ -75,6 +76,10 @@ public abstract class AuthenticationClient extends ClientMonitor { mRequireConfirmation = requireConfirmation; } + protected long getStartTimeMs() { + return mStartTimeMs; + } + @Override public void binderDied() { super.binderDied(); @@ -228,6 +233,7 @@ public abstract class AuthenticationClient extends ClientMonitor { mStarted = true; onStart(); try { + mStartTimeMs = System.currentTimeMillis(); final int result = getDaemonWrapper().authenticate(mOpId, getGroupId()); if (result != 0) { Slog.w(getLogTag(), "startAuthentication failed, result=" + result); diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java index db17f8397ed4..af2f24f959b4 100644 --- a/services/core/java/com/android/server/biometrics/BiometricService.java +++ b/services/core/java/com/android/server/biometrics/BiometricService.java @@ -170,6 +170,8 @@ public class BiometricService extends SystemService { // the authentication. byte[] mTokenEscrow; + // Timestamp when authentication started + private long mStartTimeMs; // Timestamp when hardware authentication occurred private long mAuthenticatedTimeMs; @@ -519,8 +521,8 @@ public class BiometricService extends SystemService { List<EnabledOnKeyguardCallback> callbacks = mEnabledOnKeyguardCallbacks; for (int i = 0; i < callbacks.size(); i++) { callbacks.get(i).notify(BiometricSourceType.FACE, - mFaceEnabledOnKeyguard.getOrDefault(userId, - DEFAULT_KEYGUARD_ENABLED)); + mFaceEnabledOnKeyguard.getOrDefault(userId, DEFAULT_KEYGUARD_ENABLED), + userId); } } } @@ -538,9 +540,9 @@ public class BiometricService extends SystemService { } } - void notify(BiometricSourceType sourceType, boolean enabled) { + void notify(BiometricSourceType sourceType, boolean enabled, int userId) { try { - mCallback.onChanged(sourceType, enabled); + mCallback.onChanged(sourceType, enabled, userId); } catch (DeadObjectException e) { Slog.w(TAG, "Death while invoking notify", e); mEnabledOnKeyguardCallbacks.remove(this); @@ -766,10 +768,16 @@ public class BiometricService extends SystemService { } @Override // Binder call - public int canAuthenticate(String opPackageName) { - checkPermission(); + public int canAuthenticate(String opPackageName, int userId) { + Slog.d(TAG, "canAuthenticate: User=" + userId + + ", Caller=" + UserHandle.getCallingUserId()); + + if (userId != UserHandle.getCallingUserId()) { + checkInternalPermission(); + } else { + checkPermission(); + } - final int userId = UserHandle.getCallingUserId(); final long ident = Binder.clearCallingIdentity(); int error; try { @@ -781,6 +789,23 @@ public class BiometricService extends SystemService { return error; } + @Override + public boolean hasEnrolledBiometrics(int userId) { + checkInternalPermission(); + + final long ident = Binder.clearCallingIdentity(); + try { + for (int i = 0; i < mAuthenticators.size(); i++) { + if (mAuthenticators.get(i).mAuthenticator.hasEnrolledTemplates(userId)) { + return true; + } + } + } finally { + Binder.restoreCallingIdentity(ident); + } + return false; + } + @Override // Binder call public void registerEnabledOnKeyguardCallback(IBiometricEnabledOnKeyguardCallback callback) throws RemoteException { @@ -788,7 +813,8 @@ public class BiometricService extends SystemService { mEnabledOnKeyguardCallbacks.add(new EnabledOnKeyguardCallback(callback)); try { callback.onChanged(BiometricSourceType.FACE, - mSettingObserver.getFaceEnabledOnKeyguard()); + mSettingObserver.getFaceEnabledOnKeyguard(), + UserHandle.getCallingUserId()); } catch (RemoteException e) { Slog.w(TAG, "Remote exception", e); } @@ -965,6 +991,11 @@ public class BiometricService extends SystemService { } } + Slog.d(TAG, "checkAndGetBiometricModality: user=" + userId + + " isHardwareDetected=" + isHardwareDetected + + " hasTemplatesEnrolled=" + hasTemplatesEnrolled + + " enabledForApps=" + enabledForApps); + // Check error conditions if (!isHardwareDetected) { return new Pair<>(TYPE_NONE, BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE); @@ -1065,6 +1096,9 @@ public class BiometricService extends SystemService { latency, Utils.isDebugEnabled(getContext(), mCurrentAuthSession.mUserId)); } else { + + final long latency = System.currentTimeMillis() - mCurrentAuthSession.mStartTimeMs; + int error = reason == BiometricPrompt.DISMISSED_REASON_NEGATIVE ? BiometricConstants.BIOMETRIC_ERROR_NEGATIVE_BUTTON : reason == BiometricPrompt.DISMISSED_REASON_USER_CANCEL @@ -1076,7 +1110,8 @@ public class BiometricService extends SystemService { + ", IsCrypto: " + mCurrentAuthSession.isCrypto() + ", Action: " + BiometricsProtoEnums.ACTION_AUTHENTICATE + ", Client: " + BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT - + ", Error: " + error); + + ", Error: " + error + + ", Latency: " + latency); } // Auth canceled StatsLog.write(StatsLog.BIOMETRIC_ERROR_OCCURRED, @@ -1087,7 +1122,8 @@ public class BiometricService extends SystemService { BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, error, 0 /* vendorCode */, - Utils.isDebugEnabled(getContext(), mCurrentAuthSession.mUserId)); + Utils.isDebugEnabled(getContext(), mCurrentAuthSession.mUserId), + latency); } } @@ -1411,6 +1447,9 @@ public class BiometricService extends SystemService { && mCurrentAuthSession.mState == STATE_AUTH_PAUSED; mCurrentAuthSession = mPendingAuthSession; + + // Time starts when lower layers are ready to start the client. + mCurrentAuthSession.mStartTimeMs = System.currentTimeMillis(); mPendingAuthSession = null; mCurrentAuthSession.mState = STATE_AUTH_STARTED; diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java index d3c62bed7b5f..f3f9754bd32b 100644 --- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java +++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java @@ -282,10 +282,10 @@ public abstract class BiometricServiceBase extends SystemService public EnrollClientImpl(Context context, DaemonWrapper daemon, long halDeviceId, IBinder token, ServiceListener listener, int userId, int groupId, byte[] cryptoToken, boolean restricted, String owner, - final int[] disabledFeatures) { + final int[] disabledFeatures, int timeoutSec) { super(context, getConstants(), daemon, halDeviceId, token, listener, userId, groupId, cryptoToken, restricted, owner, getBiometricUtils(), - disabledFeatures); + disabledFeatures, timeoutSec); } @Override @@ -497,9 +497,9 @@ public abstract class BiometricServiceBase extends SystemService } } - private final class BiometricTaskStackListener extends TaskStackListener { + private final Runnable mOnTaskStackChangedRunnable = new Runnable() { @Override - public void onTaskStackChanged() { + public void run() { try { if (!(mCurrentClient instanceof AuthenticationClient)) { return; @@ -514,8 +514,8 @@ public abstract class BiometricServiceBase extends SystemService final String topPackage = runningTasks.get(0).topActivity.getPackageName(); if (!topPackage.contentEquals(currentClient) && !mCurrentClient.isAlreadyDone()) { - Slog.e(getTag(), "Stopping background authentication, top: " + topPackage - + " currentClient: " + currentClient); + Slog.e(getTag(), "Stopping background authentication, top: " + + topPackage + " currentClient: " + currentClient); mCurrentClient.stop(false /* initiatedByClient */); } } @@ -523,6 +523,13 @@ public abstract class BiometricServiceBase extends SystemService Slog.e(getTag(), "Unable to get running tasks", e); } } + }; + + private final class BiometricTaskStackListener extends TaskStackListener { + @Override + public void onTaskStackChanged() { + mHandler.post(mOnTaskStackChangedRunnable); + } } private final class ResetClientStateRunnable implements Runnable { @@ -658,8 +665,12 @@ public abstract class BiometricServiceBase extends SystemService mMetricsLogger.count(getConstants().tagHalDied(), 1); mHALDeathCount++; mCurrentUserId = UserHandle.USER_NULL; - handleError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE, - 0 /*vendorCode */); + + // All client lifecycle must be managed on the handler. + mHandler.post(() -> { + handleError(getHalDeviceId(), BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE, + 0 /*vendorCode */); + }); StatsLog.write(StatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED, statsModality(), BiometricsProtoEnums.ISSUE_HAL_DEATH); @@ -713,8 +724,6 @@ public abstract class BiometricServiceBase extends SystemService // already generated a new authenticator id when the new biometric is enrolled. if (identifier instanceof Fingerprint) { updateActiveGroup(((Fingerprint)identifier).getGroupId(), null); - } else { - updateActiveGroup(mCurrentUserId, null); } } } @@ -903,8 +912,12 @@ public abstract class BiometricServiceBase extends SystemService } protected void setActiveUserInternal(int userId) { - // Do not put on handler, since it should finish before returning to caller. - updateActiveGroup(userId, null /* clientPackage */); + mHandler.post(() -> { + if (DEBUG) { + Slog.d(getTag(), "setActiveUser(" + userId + ")"); + } + updateActiveGroup(userId, null /* clientPackage */); + }); } protected void removeInternal(RemovalClient client) { @@ -1090,6 +1103,8 @@ public abstract class BiometricServiceBase extends SystemService if (DEBUG) Slog.v(getTag(), "starting client " + mCurrentClient.getClass().getSuperclass().getSimpleName() + "(" + mCurrentClient.getOwnerString() + ")" + + " targetUserId: " + mCurrentClient.getTargetUserId() + + " currentUserId: " + mCurrentUserId + " cookie: " + cookie + "/" + mCurrentClient.getCookie()); if (cookie != mCurrentClient.getCookie()) { Slog.e(getTag(), "Mismatched cookie"); diff --git a/services/core/java/com/android/server/biometrics/EnrollClient.java b/services/core/java/com/android/server/biometrics/EnrollClient.java index 854528f0654d..7ebb7c059b4c 100644 --- a/services/core/java/com/android/server/biometrics/EnrollClient.java +++ b/services/core/java/com/android/server/biometrics/EnrollClient.java @@ -31,11 +31,11 @@ import java.util.Arrays; * A class to keep track of the enrollment state for a given client. */ public abstract class EnrollClient extends ClientMonitor { - private static final long MS_PER_SEC = 1000; - private static final int ENROLLMENT_TIMEOUT_MS = 60 * 1000; // 1 minute private final byte[] mCryptoToken; private final BiometricUtils mBiometricUtils; private final int[] mDisabledFeatures; + private final int mTimeoutSec; + private long mEnrollmentStartTimeMs; public abstract boolean shouldVibrate(); @@ -44,12 +44,13 @@ public abstract class EnrollClient extends ClientMonitor { BiometricServiceBase.DaemonWrapper daemon, long halDeviceId, IBinder token, BiometricServiceBase.ServiceListener listener, int userId, int groupId, byte[] cryptoToken, boolean restricted, String owner, BiometricUtils utils, - final int[] disabledFeatures) { + final int[] disabledFeatures, int timeoutSec) { super(context, constants, daemon, halDeviceId, token, listener, userId, groupId, restricted, owner, 0 /* cookie */); mBiometricUtils = utils; mCryptoToken = Arrays.copyOf(cryptoToken, cryptoToken.length); mDisabledFeatures = Arrays.copyOf(disabledFeatures, disabledFeatures.length); + mTimeoutSec = timeoutSec; } @Override @@ -94,14 +95,13 @@ public abstract class EnrollClient extends ClientMonitor { @Override public int start() { mEnrollmentStartTimeMs = System.currentTimeMillis(); - final int timeout = (int) (ENROLLMENT_TIMEOUT_MS / MS_PER_SEC); try { final ArrayList<Integer> disabledFeatures = new ArrayList<>(); for (int i = 0; i < mDisabledFeatures.length; i++) { disabledFeatures.add(mDisabledFeatures[i]); } - final int result = getDaemonWrapper().enroll(mCryptoToken, getGroupId(), timeout, + final int result = getDaemonWrapper().enroll(mCryptoToken, getGroupId(), mTimeoutSec, disabledFeatures); if (result != 0) { Slog.w(getLogTag(), "startEnroll failed, result=" + result); diff --git a/services/core/java/com/android/server/biometrics/LoggableMonitor.java b/services/core/java/com/android/server/biometrics/LoggableMonitor.java index 9c040884772c..ecf3864e3362 100644 --- a/services/core/java/com/android/server/biometrics/LoggableMonitor.java +++ b/services/core/java/com/android/server/biometrics/LoggableMonitor.java @@ -33,6 +33,10 @@ public abstract class LoggableMonitor { private long mFirstAcquireTimeMs; + protected long getFirstAcquireTimeMs() { + return mFirstAcquireTimeMs; + } + /** * Only valid for AuthenticationClient. * @return true if the client is authenticating for a crypto operation. @@ -89,11 +93,15 @@ public abstract class LoggableMonitor { statsAction(), statsClient(), acquiredInfo, - 0 /* vendorCode */, // Don't log vendorCode for now + vendorCode, Utils.isDebugEnabled(context, targetUserId)); } protected final void logOnError(Context context, int error, int vendorCode, int targetUserId) { + + final long latency = mFirstAcquireTimeMs != 0 + ? (System.currentTimeMillis() - mFirstAcquireTimeMs) : -1; + if (DEBUG) { Slog.v(TAG, "Error! Modality: " + statsModality() + ", User: " + targetUserId @@ -101,7 +109,10 @@ public abstract class LoggableMonitor { + ", Action: " + statsAction() + ", Client: " + statsClient() + ", Error: " + error - + ", VendorCode: " + vendorCode); + + ", VendorCode: " + vendorCode + + ", Latency: " + latency); + } else { + Slog.v(TAG, "Error latency: " + latency); } StatsLog.write(StatsLog.BIOMETRIC_ERROR_OCCURRED, statsModality(), @@ -111,7 +122,8 @@ public abstract class LoggableMonitor { statsClient(), error, vendorCode, - Utils.isDebugEnabled(context, targetUserId)); + Utils.isDebugEnabled(context, targetUserId), + latency); } protected final void logOnAuthenticated(Context context, boolean authenticated, diff --git a/services/core/java/com/android/server/biometrics/Utils.java b/services/core/java/com/android/server/biometrics/Utils.java index 5544bede92f2..4fa29ac541f9 100644 --- a/services/core/java/com/android/server/biometrics/Utils.java +++ b/services/core/java/com/android/server/biometrics/Utils.java @@ -18,10 +18,15 @@ package com.android.server.biometrics; import android.content.Context; import android.os.Build; +import android.os.UserHandle; import android.provider.Settings; public class Utils { public static boolean isDebugEnabled(Context context, int targetUserId) { + if (targetUserId == UserHandle.USER_NULL) { + return false; + } + if (!(Build.IS_ENG || Build.IS_USERDEBUG)) { return false; } diff --git a/services/core/java/com/android/server/biometrics/face/FaceService.java b/services/core/java/com/android/server/biometrics/face/FaceService.java index 463a49931ae1..a7065216f6a3 100644 --- a/services/core/java/com/android/server/biometrics/face/FaceService.java +++ b/services/core/java/com/android/server/biometrics/face/FaceService.java @@ -54,7 +54,6 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; import android.util.Slog; -import android.util.proto.ProtoOutputStream; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; @@ -64,6 +63,7 @@ import com.android.server.SystemServerInitThreadPool; import com.android.server.biometrics.AuthenticationClient; import com.android.server.biometrics.BiometricServiceBase; import com.android.server.biometrics.BiometricUtils; +import com.android.server.biometrics.ClientMonitor; import com.android.server.biometrics.Constants; import com.android.server.biometrics.EnumerateClient; import com.android.server.biometrics.RemovalClient; @@ -79,7 +79,9 @@ import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * A service to manage multiple clients that want to access the face HAL API. @@ -97,6 +99,107 @@ public class FaceService extends BiometricServiceBase { "com.android.server.biometrics.face.ACTION_LOCKOUT_RESET"; private static final int CHALLENGE_TIMEOUT_SEC = 600; // 10 minutes + private static final String NOTIFICATION_TAG = "FaceService"; + private static final int NOTIFICATION_ID = 1; + + /** + * Events for bugreports. + */ + public static final class AuthenticationEvent { + private long mStartTime; + private long mLatency; + // Only valid if mError is 0 + private boolean mAuthenticated; + private int mError; + // Only valid if mError is ERROR_VENDOR + private int mVendorError; + + AuthenticationEvent(long startTime, long latency, boolean authenticated, int error, + int vendorError) { + mStartTime = startTime; + mLatency = latency; + mAuthenticated = authenticated; + mError = error; + mVendorError = vendorError; + } + + public String toString(Context context) { + return "Start: " + mStartTime + + "\tLatency: " + mLatency + + "\tAuthenticated: " + mAuthenticated + + "\tError: " + mError + + "\tVendorCode: " + mVendorError + + "\t" + FaceManager.getErrorString(context, mError, mVendorError); + } + } + + /** + * Keep a short historical buffer of stats, with an aggregated usage time. + */ + private class UsageStats { + static final int EVENT_LOG_SIZE = 100; + + Context mContext; + List<AuthenticationEvent> mAuthenticationEvents; + + int acceptCount; + int rejectCount; + Map<Integer, Integer> mErrorCount; + + long acceptLatency; + long rejectLatency; + Map<Integer, Long> mErrorLatency; + + UsageStats(Context context) { + mAuthenticationEvents = new ArrayList<>(); + mErrorCount = new HashMap<>(); + mErrorLatency = new HashMap<>(); + mContext = context; + } + + void addEvent(AuthenticationEvent event) { + if (mAuthenticationEvents.size() >= EVENT_LOG_SIZE) { + mAuthenticationEvents.remove(0); + } + mAuthenticationEvents.add(event); + + if (event.mAuthenticated) { + acceptCount++; + acceptLatency += event.mLatency; + } else if (event.mError == 0) { + rejectCount++; + rejectLatency += event.mLatency; + } else { + mErrorCount.put(event.mError, mErrorCount.getOrDefault(event.mError, 0) + 1); + mErrorLatency.put(event.mError, + mErrorLatency.getOrDefault(event.mError, 0l) + event.mLatency); + } + } + + void print(PrintWriter pw) { + pw.println("Events since last reboot: " + mAuthenticationEvents.size()); + for (int i = 0; i < mAuthenticationEvents.size(); i++) { + pw.println(mAuthenticationEvents.get(i).toString(mContext)); + } + + // Dump aggregated usage stats + // TODO: Remove or combine with json dump in a future release + pw.println("Accept\tCount: " + acceptCount + "\tLatency: " + acceptLatency + + "\tAverage: " + (acceptCount > 0 ? acceptLatency / acceptCount : 0)); + pw.println("Reject\tCount: " + rejectCount + "\tLatency: " + rejectLatency + + "\tAverage: " + (rejectCount > 0 ? rejectLatency / rejectCount : 0)); + + for (Integer key : mErrorCount.keySet()) { + final int count = mErrorCount.get(key); + pw.println("Error" + key + "\tCount: " + count + + "\tLatency: " + mErrorLatency.getOrDefault(key, 0l) + + "\tAverage: " + (count > 0 ? mErrorLatency.getOrDefault(key, 0l) / count + : 0) + + "\t" + FaceManager.getErrorString(mContext, key, 0 /* vendorCode */)); + } + } + } + private final class FaceAuthClient extends AuthenticationClientImpl { private int mLastAcquire; @@ -128,6 +231,13 @@ public class FaceService extends BiometricServiceBase { boolean authenticated, ArrayList<Byte> token) { final boolean result = super.onAuthenticated(identifier, authenticated, token); + mUsageStats.addEvent(new AuthenticationEvent( + getStartTimeMs(), + System.currentTimeMillis() - getStartTimeMs() /* latency */, + authenticated, + 0 /* error */, + 0 /* vendorError */)); + // For face, the authentication lifecycle ends either when // 1) Authenticated == true // 2) Error occurred @@ -138,6 +248,18 @@ public class FaceService extends BiometricServiceBase { } @Override + public boolean onError(long deviceId, int error, int vendorCode) { + mUsageStats.addEvent(new AuthenticationEvent( + getStartTimeMs(), + System.currentTimeMillis() - getStartTimeMs() /* latency */, + false /* authenticated */, + error, + vendorCode)); + + return super.onError(deviceId, error, vendorCode); + } + + @Override public int[] getAcquireIgnorelist() { if (isBiometricPrompt()) { return mBiometricPromptIgnoreList; @@ -177,13 +299,11 @@ public class FaceService extends BiometricServiceBase { 0 /* requestCode */, intent, 0 /* flags */, null /* options */, UserHandle.CURRENT); - final String id = "FaceService"; + final String channelName = "FaceEnrollNotificationChannel"; - NotificationManager nm = - getContext().getSystemService(NotificationManager.class); - NotificationChannel channel = new NotificationChannel(id, name, + NotificationChannel channel = new NotificationChannel(channelName, name, NotificationManager.IMPORTANCE_HIGH); - Notification notification = new Notification.Builder(getContext(), id) + Notification notification = new Notification.Builder(getContext(), channelName) .setSmallIcon(R.drawable.ic_lock) .setContentTitle(title) .setContentText(content) @@ -193,10 +313,12 @@ public class FaceService extends BiometricServiceBase { .setAutoCancel(true) .setCategory(Notification.CATEGORY_SYSTEM) .setContentIntent(pendingIntent) + .setVisibility(Notification.VISIBILITY_SECRET) .build(); - nm.createNotificationChannel(channel); - nm.notifyAsUser(null /* tag */, 0 /* id */, notification, UserHandle.CURRENT); + mNotificationManager.createNotificationChannel(channel); + mNotificationManager.notifyAsUser(NOTIFICATION_TAG, NOTIFICATION_ID, notification, + UserHandle.CURRENT); } return super.onAcquired(acquireInfo, vendorCode); @@ -207,6 +329,7 @@ public class FaceService extends BiometricServiceBase { * Receives the incoming binder calls from FaceManager. */ private final class FaceServiceWrapper extends IFaceService.Stub { + private static final int ENROLL_TIMEOUT_SEC = 75; /** * The following methods contain common code which is shared in biometrics/common. @@ -221,19 +344,36 @@ public class FaceService extends BiometricServiceBase { @Override // Binder call public int revokeChallenge(IBinder token) { checkPermission(MANAGE_BIOMETRIC); - return startRevokeChallenge(token); + mHandler.post(() -> { + // TODO(b/137106905): Schedule binder calls in FaceService to avoid deadlocks. + if (getCurrentClient() == null) { + // if we aren't handling any other HIDL calls (mCurrentClient == null), revoke + // the challenge right away. + startRevokeChallenge(token); + } else { + // postpone revoking the challenge until we finish processing the current HIDL + // call. + mRevokeChallengePending = true; + } + }); + return Status.OK; } @Override // Binder call - public void enroll(final IBinder token, final byte[] cryptoToken, + public void enroll(int userId, final IBinder token, final byte[] cryptoToken, final IFaceServiceReceiver receiver, final String opPackageName, final int[] disabledFeatures) { checkPermission(MANAGE_BIOMETRIC); + updateActiveGroup(userId, opPackageName); + + mNotificationManager.cancelAsUser(NOTIFICATION_TAG, NOTIFICATION_ID, + UserHandle.CURRENT); final boolean restricted = isRestricted(); final EnrollClientImpl client = new EnrollClientImpl(getContext(), mDaemonWrapper, mHalDeviceId, token, new ServiceListenerImpl(receiver), mCurrentUserId, - 0 /* groupId */, cryptoToken, restricted, opPackageName, disabledFeatures) { + 0 /* groupId */, cryptoToken, restricted, opPackageName, disabledFeatures, + ENROLL_TIMEOUT_SEC) { @Override public int[] getAcquireIgnorelist() { @@ -324,8 +464,9 @@ public class FaceService extends BiometricServiceBase { @Override // Binder call public void remove(final IBinder token, final int faceId, final int userId, - final IFaceServiceReceiver receiver) { + final IFaceServiceReceiver receiver, final String opPackageName) { checkPermission(MANAGE_BIOMETRIC); + updateActiveGroup(userId, opPackageName); if (token == null) { Slog.w(TAG, "remove(): token is null"); @@ -378,8 +519,6 @@ public class FaceService extends BiometricServiceBase { try { if (args.length > 1 && "--hal".equals(args[0])) { dumpHal(fd, Arrays.copyOfRange(args, 1, args.length, args.getClass())); - } else if (args.length > 0 && "--proto".equals(args[0])) { - dumpProto(fd); } else { dumpInternal(pw); } @@ -475,24 +614,32 @@ public class FaceService extends BiometricServiceBase { public void resetLockout(byte[] token) { checkPermission(MANAGE_BIOMETRIC); - if (!FaceService.this.hasEnrolledBiometrics(mCurrentUserId)) { - Slog.w(TAG, "Ignoring lockout reset, no templates enrolled"); - return; - } + mHandler.post(() -> { + if (!FaceService.this.hasEnrolledBiometrics(mCurrentUserId)) { + Slog.w(TAG, "Ignoring lockout reset, no templates enrolled"); + return; + } - try { - mDaemonWrapper.resetLockout(token); - } catch (RemoteException e) { - Slog.e(getTag(), "Unable to reset lockout", e); - } + Slog.d(TAG, "Resetting lockout for user: " + mCurrentUserId); + + try { + mDaemonWrapper.resetLockout(token); + } catch (RemoteException e) { + Slog.e(getTag(), "Unable to reset lockout", e); + } + }); } @Override - public void setFeature(int feature, boolean enabled, final byte[] token, - IFaceServiceReceiver receiver) { + public void setFeature(int userId, int feature, boolean enabled, final byte[] token, + IFaceServiceReceiver receiver, final String opPackageName) { checkPermission(MANAGE_BIOMETRIC); mHandler.post(() -> { + if (DEBUG) { + Slog.d(TAG, "setFeature for user(" + userId + ")"); + } + updateActiveGroup(userId, opPackageName); if (!FaceService.this.hasEnrolledBiometrics(mCurrentUserId)) { Slog.e(TAG, "No enrolled biometrics while setting feature: " + feature); return; @@ -520,10 +667,15 @@ public class FaceService extends BiometricServiceBase { } @Override - public void getFeature(int feature, IFaceServiceReceiver receiver) { + public void getFeature(int userId, int feature, IFaceServiceReceiver receiver, + final String opPackageName) { checkPermission(MANAGE_BIOMETRIC); mHandler.post(() -> { + if (DEBUG) { + Slog.d(TAG, "getFeature for user(" + userId + ")"); + } + updateActiveGroup(userId, opPackageName); // This should ideally return tri-state, but the user isn't shown settings unless // they are enrolled so it's fine for now. if (!FaceService.this.hasEnrolledBiometrics(mCurrentUserId)) { @@ -682,9 +834,13 @@ public class FaceService extends BiometricServiceBase { @GuardedBy("this") private IBiometricsFace mDaemon; + private UsageStats mUsageStats; + private boolean mRevokeChallengePending = false; // One of the AuthenticationClient constants private int mCurrentUserLockoutMode; + private NotificationManager mNotificationManager; + private int[] mBiometricPromptIgnoreList; private int[] mBiometricPromptIgnoreListVendor; private int[] mKeyguardIgnoreList; @@ -704,6 +860,18 @@ public class FaceService extends BiometricServiceBase { final Face face = new Face(getBiometricUtils() .getUniqueName(getContext(), userId), faceId, deviceId); FaceService.super.handleEnrollResult(face, remaining); + + // Enrollment changes the authenticatorId, so update it here. + IBiometricsFace daemon = getFaceDaemon(); + if (remaining == 0 && daemon != null) { + try { + mAuthenticatorIds.put(userId, + hasEnrolledBiometrics(userId) ? daemon.getAuthenticatorId().value + : 0L); + } catch (RemoteException e) { + Slog.e(TAG, "Unable to get authenticatorId", e); + } + } }); } @@ -878,6 +1046,10 @@ public class FaceService extends BiometricServiceBase { public FaceService(Context context) { super(context); + mUsageStats = new UsageStats(context); + + mNotificationManager = getContext().getSystemService(NotificationManager.class); + mBiometricPromptIgnoreList = getContext().getResources() .getIntArray(R.array.config_face_acquire_biometricprompt_ignorelist); mBiometricPromptIgnoreListVendor = getContext().getResources() @@ -893,10 +1065,22 @@ public class FaceService extends BiometricServiceBase { } @Override + protected void removeClient(ClientMonitor client) { + super.removeClient(client); + if (mRevokeChallengePending) { + startRevokeChallenge(null); + mRevokeChallengePending = false; + } + } + + @Override public void onStart() { super.onStart(); publishBinderService(Context.FACE_SERVICE, new FaceServiceWrapper()); - SystemServerInitThreadPool.get().submit(this::getFaceDaemon, TAG + ".onStart"); + // Get the face daemon on FaceService's on thread so SystemServerInitThreadPool isn't + // blocked + SystemServerInitThreadPool.get().submit(() -> mHandler.post(this::getFaceDaemon), + TAG + ".onStart"); } @Override @@ -965,9 +1149,9 @@ public class FaceService extends BiometricServiceBase { daemon.setActiveUser(userId, faceDir.getAbsolutePath()); mCurrentUserId = userId; + mAuthenticatorIds.put(userId, + hasEnrolledBiometrics(userId) ? daemon.getAuthenticatorId().value : 0L); } - mAuthenticatorIds.put(userId, - hasEnrolledBiometrics(userId) ? daemon.getAuthenticatorId().value : 0L); } catch (RemoteException e) { Slog.e(TAG, "Failed to setActiveUser():", e); } @@ -1100,7 +1284,11 @@ public class FaceService extends BiometricServiceBase { return 0; } try { - return daemon.revokeChallenge(); + final int res = daemon.revokeChallenge(); + if (res != Status.OK) { + Slog.e(TAG, "revokeChallenge returned " + res); + } + return res; } catch (RemoteException e) { Slog.e(TAG, "startRevokeChallenge failed", e); } @@ -1142,51 +1330,9 @@ public class FaceService extends BiometricServiceBase { Slog.e(TAG, "dump formatting failure", e); } pw.println(dump); - pw.println("HAL Deaths: " + mHALDeathCount); - mHALDeathCount = 0; - } + pw.println("HAL deaths since last reboot: " + mHALDeathCount); - private void dumpProto(FileDescriptor fd) { - final ProtoOutputStream proto = new ProtoOutputStream(fd); - for (UserInfo user : UserManager.get(getContext()).getUsers()) { - final int userId = user.getUserHandle().getIdentifier(); - - final long userToken = proto.start(FaceServiceDumpProto.USERS); - - proto.write(FaceUserStatsProto.USER_ID, userId); - proto.write(FaceUserStatsProto.NUM_FACES, - getBiometricUtils().getBiometricsForUser(getContext(), userId).size()); - - // Normal face authentications (e.g. lockscreen) - final PerformanceStats normal = mPerformanceMap.get(userId); - if (normal != null) { - final long countsToken = proto.start(FaceUserStatsProto.NORMAL); - proto.write(FaceActionStatsProto.ACCEPT, normal.accept); - proto.write(FaceActionStatsProto.REJECT, normal.reject); - proto.write(FaceActionStatsProto.ACQUIRE, normal.acquire); - proto.write(FaceActionStatsProto.LOCKOUT, normal.lockout); - proto.write(FaceActionStatsProto.LOCKOUT_PERMANENT, normal.lockout); - proto.end(countsToken); - } - - // Statistics about secure face transactions (e.g. to unlock password - // storage, make secure purchases, etc.) - final PerformanceStats crypto = mCryptoPerformanceMap.get(userId); - if (crypto != null) { - final long countsToken = proto.start(FaceUserStatsProto.CRYPTO); - proto.write(FaceActionStatsProto.ACCEPT, crypto.accept); - proto.write(FaceActionStatsProto.REJECT, crypto.reject); - proto.write(FaceActionStatsProto.ACQUIRE, crypto.acquire); - proto.write(FaceActionStatsProto.LOCKOUT, crypto.lockout); - proto.write(FaceActionStatsProto.LOCKOUT_PERMANENT, crypto.lockout); - proto.end(countsToken); - } - - proto.end(userToken); - } - proto.flush(); - mPerformanceMap.clear(); - mCryptoPerformanceMap.clear(); + mUsageStats.print(pw); } private void dumpHal(FileDescriptor fd, String[] args) { diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java index 24fd1b7a6daf..320e1022873c 100644 --- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java @@ -176,6 +176,7 @@ public class FingerprintService extends BiometricServiceBase { * Receives the incoming binder calls from FingerprintManager. */ private final class FingerprintServiceWrapper extends IFingerprintService.Stub { + private static final int ENROLL_TIMEOUT_SEC = 60; /** * The following methods contain common code which is shared in biometrics/common. @@ -203,7 +204,8 @@ public class FingerprintService extends BiometricServiceBase { final int groupId = userId; // default group for fingerprint enrollment final EnrollClientImpl client = new EnrollClientImpl(getContext(), mDaemonWrapper, mHalDeviceId, token, new ServiceListenerImpl(receiver), mCurrentUserId, groupId, - cryptoToken, restricted, opPackageName, new int[0] /* disabledFeatures */) { + cryptoToken, restricted, opPackageName, new int[0] /* disabledFeatures */, + ENROLL_TIMEOUT_SEC) { @Override public boolean shouldVibrate() { return true; @@ -1035,8 +1037,7 @@ public class FingerprintService extends BiometricServiceBase { Slog.e(TAG, "dump formatting failure", e); } pw.println(dump); - pw.println("HAL Deaths: " + mHALDeathCount); - mHALDeathCount = 0; + pw.println("HAL deaths since last reboot: " + mHALDeathCount); } private void dumpProto(FileDescriptor fd) { diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index 33c84d161a90..73d160d8c444 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -44,6 +44,7 @@ import static android.net.wifi.WifiManager.IFACE_IP_MODE_TETHERED; import static android.net.wifi.WifiManager.IFACE_IP_MODE_UNSPECIFIED; import static android.net.wifi.WifiManager.WIFI_AP_STATE_DISABLED; import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED; +import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; import static com.android.server.ConnectivityService.SHORT_ARG; @@ -89,6 +90,8 @@ import android.os.UserHandle; import android.os.UserManager; import android.os.UserManagerInternal; import android.os.UserManagerInternal.UserRestrictionsListener; +import android.telephony.PhoneStateListener; +import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.ArrayMap; import android.util.Log; @@ -97,7 +100,6 @@ import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.internal.notification.SystemNotificationChannels; -import com.android.internal.telephony.TelephonyIntents; import com.android.internal.util.DumpUtils; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.MessageUtils; @@ -182,12 +184,13 @@ public class Tethering extends BaseNetworkObserver { // into a single coherent structure. private final HashSet<IpServer> mForwardedDownstreams; private final VersionedBroadcastListener mCarrierConfigChange; - private final VersionedBroadcastListener mDefaultSubscriptionChange; private final TetheringDependencies mDeps; private final EntitlementManager mEntitlementMgr; private final Handler mHandler; private final RemoteCallbackList<ITetheringEventCallback> mTetheringEventCallbacks = new RemoteCallbackList<>(); + private final PhoneStateListener mPhoneStateListener; + private int mActiveDataSubId = INVALID_SUBSCRIPTION_ID; private volatile TetheringConfiguration mConfig; private InterfaceSet mCurrentUpstreamIfaceSet; @@ -238,7 +241,6 @@ public class Tethering extends BaseNetworkObserver { stopTethering(downstream); }); mEntitlementMgr.setTetheringConfigurationFetcher(() -> { - maybeDefaultDataSubChanged(); return mConfig; }); @@ -250,22 +252,26 @@ public class Tethering extends BaseNetworkObserver { mEntitlementMgr.reevaluateSimCardProvisioning(mConfig); }); - filter = new IntentFilter(); - filter.addAction(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED); - mDefaultSubscriptionChange = new VersionedBroadcastListener( - "DefaultSubscriptionChangeListener", mContext, mHandler, filter, - (Intent ignored) -> { - mLog.log("OBSERVED default data subscription change"); - maybeDefaultDataSubChanged(); - // To avoid launch unexpected provisioning checks, ignore re-provisioning when - // no CarrierConfig loaded yet. Assume reevaluateSimCardProvisioning() will be - // triggered again when CarrierConfig is loaded. - if (mEntitlementMgr.getCarrierConfig(mConfig) != null) { - mEntitlementMgr.reevaluateSimCardProvisioning(mConfig); - } else { - mLog.log("IGNORED reevaluate provisioning due to no carrier config loaded"); - } - }); + mPhoneStateListener = new PhoneStateListener(mLooper) { + @Override + public void onActiveDataSubscriptionIdChanged(int subId) { + mLog.log("OBSERVED active data subscription change, from " + mActiveDataSubId + + " to " + subId); + if (subId == mActiveDataSubId) return; + + mActiveDataSubId = subId; + updateConfiguration(); + // To avoid launching unexpected provisioning checks, ignore re-provisioning when + // no CarrierConfig loaded yet. Assume reevaluateSimCardProvisioning() will be + // triggered again when CarrierConfig is loaded. + if (mEntitlementMgr.getCarrierConfig(mConfig) != null) { + mEntitlementMgr.reevaluateSimCardProvisioning(mConfig); + } else { + mLog.log("IGNORED reevaluate provisioning due to no carrier config loaded"); + } + } + }; + mStateReceiver = new StateReceiver(); // Load tethering configuration. @@ -276,7 +282,8 @@ public class Tethering extends BaseNetworkObserver { private void startStateMachineUpdaters(Handler handler) { mCarrierConfigChange.startListening(); - mDefaultSubscriptionChange.startListening(); + TelephonyManager.from(mContext).listen(mPhoneStateListener, + PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE); IntentFilter filter = new IntentFilter(); filter.addAction(UsbManager.ACTION_USB_STATE); @@ -304,27 +311,17 @@ public class Tethering extends BaseNetworkObserver { // NOTE: This is always invoked on the mLooper thread. private void updateConfiguration() { - final int subId = mDeps.getDefaultDataSubscriptionId(); - updateConfiguration(subId); - } - - private void updateConfiguration(final int subId) { - mConfig = new TetheringConfiguration(mContext, mLog, subId); + mConfig = mDeps.generateTetheringConfiguration(mContext, mLog, mActiveDataSubId); mUpstreamNetworkMonitor.updateMobileRequiresDun(mConfig.isDunRequired); } private void maybeDunSettingChanged() { - final boolean isDunRequired = TetheringConfiguration.checkDunRequired(mContext); + final boolean isDunRequired = TetheringConfiguration.checkDunRequired( + mContext, mActiveDataSubId); if (isDunRequired == mConfig.isDunRequired) return; updateConfiguration(); } - private void maybeDefaultDataSubChanged() { - final int subId = mDeps.getDefaultDataSubscriptionId(); - if (subId == mConfig.subId) return; - updateConfiguration(subId); - } - @Override public void interfaceStatusChanged(String iface, boolean up) { // Never called directly: only called from interfaceLinkStateChanged. @@ -775,7 +772,6 @@ public class Tethering extends BaseNetworkObserver { case WifiManager.WIFI_AP_STATE_FAILED: default: disableWifiIpServingLocked(ifname, curState); - mEntitlementMgr.stopProvisioningIfNeeded(TETHERING_WIFI); break; } } diff --git a/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java b/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java index 8427b6eceab9..1907892c4d87 100644 --- a/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java +++ b/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java @@ -112,7 +112,7 @@ public class TetheringConfiguration { tetherableWifiRegexs = getResourceStringArray(res, config_tether_wifi_regexs); tetherableBluetoothRegexs = getResourceStringArray(res, config_tether_bluetooth_regexs); - isDunRequired = checkDunRequired(ctx); + isDunRequired = checkDunRequired(ctx, subId); chooseUpstreamAutomatically = getResourceBoolean(res, config_tether_upstream_automatic); preferredUpstreamIfaceTypes = getUpstreamIfaceTypes(res, isDunRequired); @@ -228,9 +228,9 @@ public class TetheringConfiguration { } /** Check whether dun is required. */ - public static boolean checkDunRequired(Context ctx) { + public static boolean checkDunRequired(Context ctx, int id) { final TelephonyManager tm = (TelephonyManager) ctx.getSystemService(TELEPHONY_SERVICE); - return (tm != null) ? tm.getTetherApnRequired() : false; + return (tm != null) ? tm.getTetherApnRequired(id) : false; } private static Collection<Integer> getUpstreamIfaceTypes(Resources res, boolean dunRequired) { diff --git a/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java b/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java index a0aad7c50481..4ad7ac4bead0 100644 --- a/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java +++ b/services/core/java/com/android/server/connectivity/tethering/TetheringDependencies.java @@ -21,7 +21,6 @@ import android.net.NetworkRequest; import android.net.ip.IpServer; import android.net.util.SharedLog; import android.os.Handler; -import android.telephony.SubscriptionManager; import com.android.internal.util.StateMachine; import com.android.server.connectivity.MockableSystemProperties; @@ -88,9 +87,10 @@ public class TetheringDependencies { } /** - * Get default data subscription id to build TetheringConfiguration. + * Generate a new TetheringConfiguration according to input sub Id. */ - public int getDefaultDataSubscriptionId() { - return SubscriptionManager.getDefaultDataSubscriptionId(); + public TetheringConfiguration generateTetheringConfiguration(Context ctx, SharedLog log, + int subId) { + return new TetheringConfiguration(ctx, log, subId); } } diff --git a/services/core/java/com/android/server/display/ColorFade.java b/services/core/java/com/android/server/display/ColorFade.java index 36d9c0e4478e..f61306405daa 100644 --- a/services/core/java/com/android/server/display/ColorFade.java +++ b/services/core/java/com/android/server/display/ColorFade.java @@ -29,6 +29,7 @@ import android.opengl.GLES11Ext; import android.opengl.GLES20; import android.os.IBinder; import android.util.Slog; +import android.view.Display; import android.view.DisplayInfo; import android.view.Surface; import android.view.Surface.OutOfResourcesException; @@ -72,6 +73,9 @@ final class ColorFade { // See code for details. private static final int DEJANK_FRAMES = 3; + private static final int EGL_GL_COLORSPACE_KHR = 0x309D; + private static final int EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT = 0x3490; + private final int mDisplayId; // Set to true when the animation context has been fully prepared. @@ -93,6 +97,7 @@ final class ColorFade { private EGLSurface mEglSurface; private boolean mSurfaceVisible; private float mSurfaceAlpha; + private boolean mIsWideColor; // Texture names. We only use one texture, which contains the screenshot. private final int[] mTexNames = new int[1]; @@ -482,6 +487,8 @@ final class ColorFade { return false; } + mIsWideColor = SurfaceControl.getActiveColorMode(token) + == Display.COLOR_MODE_DISPLAY_P3; SurfaceControl.screenshot(token, s); st.updateTexImage(); st.getTransformMatrix(mTexMatrix); @@ -608,8 +615,16 @@ final class ColorFade { private boolean createEglSurface() { if (mEglSurface == null) { int[] eglSurfaceAttribList = new int[] { + EGL14.EGL_NONE, + EGL14.EGL_NONE, EGL14.EGL_NONE }; + + // If the current display is in wide color, then so is the screenshot. + if (mIsWideColor) { + eglSurfaceAttribList[0] = EGL_GL_COLORSPACE_KHR; + eglSurfaceAttribList[1] = EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT; + } // turn our SurfaceControl into a Surface mEglSurface = EGL14.eglCreateWindowSurface(mEglDisplay, mEglConfig, mSurface, eglSurfaceAttribList, 0); diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 99341d1c96ae..4f33ebb035da 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -303,6 +303,8 @@ public final class DisplayManagerService extends SystemService { private final Spline mMinimumBrightnessSpline; private final ColorSpace mWideColorSpace; + private SensorManager mSensorManager; + public DisplayManagerService(Context context) { this(context, new Injector()); } @@ -430,7 +432,7 @@ public final class DisplayManagerService extends SystemService { } mDisplayModeDirector.setListener(new AllowedDisplayModeObserver()); - mDisplayModeDirector.start(); + mDisplayModeDirector.start(mSensorManager); mHandler.sendEmptyMessage(MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS); } @@ -2358,6 +2360,7 @@ public final class DisplayManagerService extends SystemService { }; mDisplayPowerController = new DisplayPowerController( mContext, callbacks, handler, sensorManager, blanker); + mSensorManager = sensorManager; } mHandler.sendEmptyMessage(MSG_LOAD_BRIGHTNESS_CONFIGURATION); diff --git a/services/core/java/com/android/server/display/DisplayModeDirector.java b/services/core/java/com/android/server/display/DisplayModeDirector.java index 0940a2e4b3cd..c45a314e39cc 100644 --- a/services/core/java/com/android/server/display/DisplayModeDirector.java +++ b/services/core/java/com/android/server/display/DisplayModeDirector.java @@ -18,26 +18,41 @@ package com.android.server.display; import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.res.Resources; import android.database.ContentObserver; import android.hardware.display.DisplayManager; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; + import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.UserHandle; +import android.os.PowerManager; +import android.os.SystemClock; import android.provider.Settings; +import android.text.TextUtils; import android.util.Slog; import android.util.SparseArray; import android.view.Display; import android.view.DisplayInfo; import com.android.internal.R; +import com.android.server.display.whitebalance.DisplayWhiteBalanceFactory; +import com.android.server.display.whitebalance.AmbientFilter; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Objects; /** @@ -74,7 +89,7 @@ public class DisplayModeDirector { private final AppRequestObserver mAppRequestObserver; private final SettingsObserver mSettingsObserver; private final DisplayObserver mDisplayObserver; - + private final BrightnessObserver mBrightnessObserver; private Listener mListener; @@ -87,6 +102,8 @@ public class DisplayModeDirector { mAppRequestObserver = new AppRequestObserver(); mSettingsObserver = new SettingsObserver(context, handler); mDisplayObserver = new DisplayObserver(context, handler); + mBrightnessObserver = new BrightnessObserver(context, handler); + } /** @@ -96,15 +113,17 @@ public class DisplayModeDirector { * This has to be deferred because the object may be constructed before the rest of the system * is ready. */ - public void start() { + public void start(SensorManager sensorManager) { mSettingsObserver.observe(); mDisplayObserver.observe(); mSettingsObserver.observe(); + mBrightnessObserver.observe(sensorManager); synchronized (mLock) { // We may have a listener already registered before the call to start, so go ahead and // notify them to pick up our newly initialized state. notifyAllowedModesChangedLocked(); } + } /** @@ -315,6 +334,7 @@ public class DisplayModeDirector { } mSettingsObserver.dumpLocked(pw); mAppRequestObserver.dumpLocked(pw); + mBrightnessObserver.dumpLocked(pw); } } @@ -402,17 +422,18 @@ public class DisplayModeDirector { } private static final class Vote { - public static final int PRIORITY_USER_SETTING = 0; // We split the app request into two priorities in case we can satisfy one desire without // the other. - public static final int PRIORITY_APP_REQUEST_REFRESH_RATE = 1; - public static final int PRIORITY_APP_REQUEST_SIZE = 2; - public static final int PRIORITY_LOW_POWER_MODE = 3; + public static final int PRIORITY_APP_REQUEST_REFRESH_RATE = 0; + public static final int PRIORITY_APP_REQUEST_SIZE = 1; + public static final int PRIORITY_USER_SETTING_REFRESH_RATE = 2; + public static final int PRIORITY_LOW_BRIGHTNESS = 3; + public static final int PRIORITY_LOW_POWER_MODE = 4; // Whenever a new priority is added, remember to update MIN_PRIORITY and/or MAX_PRIORITY as // appropriate, as well as priorityToString. - public static final int MIN_PRIORITY = PRIORITY_USER_SETTING; + public static final int MIN_PRIORITY = PRIORITY_APP_REQUEST_REFRESH_RATE; public static final int MAX_PRIORITY = PRIORITY_LOW_POWER_MODE; /** @@ -456,12 +477,12 @@ public class DisplayModeDirector { public static String priorityToString(int priority) { switch (priority) { - case PRIORITY_USER_SETTING: - return "PRIORITY_USER_SETTING"; case PRIORITY_APP_REQUEST_REFRESH_RATE: return "PRIORITY_APP_REQUEST_REFRESH_RATE"; case PRIORITY_APP_REQUEST_SIZE: return "PRIORITY_APP_REQUEST_SIZE"; + case PRIORITY_USER_SETTING_REFRESH_RATE: + return "PRIORITY_USER_SETTING_REFRESH_RATE"; case PRIORITY_LOW_POWER_MODE: return "PRIORITY_LOW_POWER_MODE"; default: @@ -529,13 +550,15 @@ public class DisplayModeDirector { vote = null; } updateVoteLocked(Vote.PRIORITY_LOW_POWER_MODE, vote); + mBrightnessObserver.onLowPowerModeEnabled(inLowPowerMode); } private void updateRefreshRateSettingLocked() { float peakRefreshRate = Settings.System.getFloat(mContext.getContentResolver(), Settings.System.PEAK_REFRESH_RATE, mDefaultPeakRefreshRate); Vote vote = Vote.forRefreshRates(0f, peakRefreshRate); - updateVoteLocked(Vote.PRIORITY_USER_SETTING, vote); + updateVoteLocked(Vote.PRIORITY_USER_SETTING_REFRESH_RATE, vote); + mBrightnessObserver.onPeakRefreshRateEnabled(peakRefreshRate > 60f); } public void dumpLocked(PrintWriter pw) { @@ -685,4 +708,303 @@ public class DisplayModeDirector { } } } + + /** + * This class manages brightness threshold for switching between 60 hz and higher refresh rate. + * See more information at the definition of + * {@link R.array#config_brightnessThresholdsOfPeakRefreshRate} and + * {@link R.array#config_ambientThresholdsOfPeakRefreshRate}. + */ + private class BrightnessObserver extends ContentObserver { + private final Uri mDisplayBrightnessSetting = + Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS); + + private final static int LIGHT_SENSOR_RATE_MS = 250; + private final int[] mDisplayBrightnessThresholds; + private final int[] mAmbientBrightnessThresholds; + // valid threshold if any item from the array >= 0 + private boolean mShouldObserveDisplayChange; + private boolean mShouldObserveAmbientChange; + + private SensorManager mSensorManager; + private Sensor mLightSensor; + private LightSensorEventListener mLightSensorListener = new LightSensorEventListener(); + // Take it as low brightness before valid sensor data comes + private float mAmbientLux = -1.0f; + private AmbientFilter mAmbientFilter; + + private final Context mContext; + private ScreenStateReceiver mScreenStateReceiver; + + // Enable light sensor only when screen is on, peak refresh rate enabled and low power mode + // off. After initialization, these states will be updated from the same handler thread. + private boolean mScreenOn = false; + private boolean mPeakRefreshRateEnabled = false; + private boolean mLowPowerModeEnabled = false; + + BrightnessObserver(Context context, Handler handler) { + super(handler); + mContext = context; + mDisplayBrightnessThresholds = context.getResources().getIntArray( + R.array.config_brightnessThresholdsOfPeakRefreshRate); + mAmbientBrightnessThresholds = context.getResources().getIntArray( + R.array.config_ambientThresholdsOfPeakRefreshRate); + if (mDisplayBrightnessThresholds.length != mAmbientBrightnessThresholds.length) { + throw new RuntimeException("display brightness threshold array and ambient " + + "brightness threshold array have different length"); + } + + mShouldObserveDisplayChange = checkShouldObserve(mDisplayBrightnessThresholds); + mShouldObserveAmbientChange = checkShouldObserve(mAmbientBrightnessThresholds); + } + + public void observe(SensorManager sensorManager) { + if (mShouldObserveDisplayChange) { + final ContentResolver cr = mContext.getContentResolver(); + cr.registerContentObserver(mDisplayBrightnessSetting, + false /*notifyDescendants*/, this, UserHandle.USER_SYSTEM); + } + + if (mShouldObserveAmbientChange) { + Resources resources = mContext.getResources(); + String lightSensorType = resources.getString( + com.android.internal.R.string.config_displayLightSensorType); + + Sensor lightSensor = null; + if (!TextUtils.isEmpty(lightSensorType)) { + List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL); + for (int i = 0; i < sensors.size(); i++) { + Sensor sensor = sensors.get(i); + if (lightSensorType.equals(sensor.getStringType())) { + lightSensor = sensor; + break; + } + } + } + + if (lightSensor == null) { + lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); + } + + if (lightSensor != null) { + final Resources res = mContext.getResources(); + + mAmbientFilter = DisplayWhiteBalanceFactory.createBrightnessFilter(res); + mSensorManager = sensorManager; + mLightSensor = lightSensor; + + // Intent.ACTION_SCREEN_ON is not sticky. Check current screen status. + if (mContext.getSystemService(PowerManager.class).isInteractive()) { + onScreenOn(true); + } + mScreenStateReceiver = new ScreenStateReceiver(mContext); + } + } + + if (mShouldObserveDisplayChange || mShouldObserveAmbientChange) { + synchronized (mLock) { + onBrightnessChangedLocked(); + } + } + } + + public void onPeakRefreshRateEnabled(boolean b) { + if (mShouldObserveAmbientChange && mPeakRefreshRateEnabled != b) { + mPeakRefreshRateEnabled = b; + updateSensorStatus(); + } + } + + public void onLowPowerModeEnabled(boolean b) { + if (mShouldObserveAmbientChange && mLowPowerModeEnabled != b) { + mLowPowerModeEnabled = b; + updateSensorStatus(); + } + } + + public void dumpLocked(PrintWriter pw) { + pw.println(" BrightnessObserver"); + + for (int d: mDisplayBrightnessThresholds) { + pw.println(" mDisplayBrightnessThreshold: " + d); + } + + for (int d: mAmbientBrightnessThresholds) { + pw.println(" mAmbientBrightnessThreshold: " + d); + } + } + + @Override + public void onChange(boolean selfChange, Uri uri, int userId) { + synchronized (mLock) { + onBrightnessChangedLocked(); + } + } + + /** + * Checks to see if at least one value is positive, in which case it is necessary to listen + * to value changes. + */ + private boolean checkShouldObserve(int[] a) { + for (int d: a) { + if (d >= 0) { + return true; + } + } + + return false; + } + + private void onBrightnessChangedLocked() { + int brightness = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS, -1); + + Vote vote = null; + for (int i = 0; i < mDisplayBrightnessThresholds.length; i++) { + int disp = mDisplayBrightnessThresholds[i]; + int ambi = mAmbientBrightnessThresholds[i]; + + if (disp >= 0 && ambi >= 0) { + if (brightness <= disp && mAmbientLux <= ambi) { + vote = Vote.forRefreshRates(0f, 60f); + } + } else if (disp >= 0) { + if (brightness <= disp) { + vote = Vote.forRefreshRates(0f, 60f); + } + } else if (ambi >= 0) { + if (mAmbientLux <= ambi) { + vote = Vote.forRefreshRates(0f, 60f); + } + } + + if (vote != null) { + break; + } + } + + if (DEBUG) { + Slog.d(TAG, "Display brightness " + brightness + ", ambient lux " + mAmbientLux + + (vote != null ? " 60hz only" : " no refresh rate limit")); + } + updateVoteLocked(Vote.PRIORITY_LOW_BRIGHTNESS, vote); + } + + private void onScreenOn(boolean on) { + // Not check mShouldObserveAmbientChange because Screen status receiver is registered + // only when it is true. + if (mScreenOn != on) { + mScreenOn = on; + updateSensorStatus(); + } + } + + private void updateSensorStatus() { + if (mSensorManager == null || mLightSensorListener == null) { + return; + } + + if (mScreenOn && !mLowPowerModeEnabled && mPeakRefreshRateEnabled) { + mSensorManager.registerListener(mLightSensorListener, + mLightSensor, LIGHT_SENSOR_RATE_MS * 1000, mHandler); + } else { + mLightSensorListener.removeCallbacks(); + mSensorManager.unregisterListener(mLightSensorListener); + } + } + + private final class LightSensorEventListener implements SensorEventListener { + final private static int INJECT_EVENTS_INTERVAL_MS = LIGHT_SENSOR_RATE_MS; + private float mLastSensorData; + + @Override + public void onSensorChanged(SensorEvent event) { + mLastSensorData = event.values[0]; + if (DEBUG) { + Slog.d(TAG, "On sensor changed: " + mLastSensorData); + } + + boolean zoneChanged = isDifferentZone(mLastSensorData, mAmbientLux); + if (zoneChanged && mLastSensorData < mAmbientLux) { + // Easier to see flicker at lower brightness environment. Forget the history to + // get immediate response. + mAmbientFilter.clear(); + } + + long now = SystemClock.uptimeMillis(); + mAmbientFilter.addValue(now, mLastSensorData); + + mHandler.removeCallbacks(mInjectSensorEventRunnable); + processSensorData(now); + + if (zoneChanged && mLastSensorData > mAmbientLux) { + // Sensor may not report new event if there is no brightness change. + // Need to keep querying the temporal filter for the latest estimation, + // until enter in higher lux zone or is interrupted by a new sensor event. + mHandler.postDelayed(mInjectSensorEventRunnable, INJECT_EVENTS_INTERVAL_MS); + } + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + // Not used. + } + + public void removeCallbacks() { + mHandler.removeCallbacks(mInjectSensorEventRunnable); + } + + private void processSensorData(long now) { + mAmbientLux = mAmbientFilter.getEstimate(now); + + synchronized (mLock) { + onBrightnessChangedLocked(); + } + } + + private boolean isDifferentZone(float lux1, float lux2) { + for (int z = 0; z < mAmbientBrightnessThresholds.length; z++) { + final float boundary = mAmbientBrightnessThresholds[z]; + + // Test each boundary. See if the current value and the new value are at + // different sides. + if ((lux1 <= boundary && lux2 > boundary) + || (lux1 > boundary && lux2 <= boundary)) { + return true; + } + } + + return false; + } + + private Runnable mInjectSensorEventRunnable = new Runnable() { + @Override + public void run() { + long now = SystemClock.uptimeMillis(); + // No need to really inject the last event into a temporal filter. + processSensorData(now); + + // Inject next event if there is a possible zone change. + if (isDifferentZone(mLastSensorData, mAmbientLux)) { + mHandler.postDelayed(mInjectSensorEventRunnable, INJECT_EVENTS_INTERVAL_MS); + } + } + }; + }; + + private final class ScreenStateReceiver extends BroadcastReceiver { + public ScreenStateReceiver(Context context) { + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_SCREEN_OFF); + filter.addAction(Intent.ACTION_SCREEN_ON); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + context.registerReceiver(this, filter, null, mHandler); + } + + @Override + public void onReceive(Context context, Intent intent) { + onScreenOn(Intent.ACTION_SCREEN_ON.equals(intent.getAction())); + } + } + } } diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index 85fbdf6d0182..b03dc3b2ae93 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -856,7 +856,7 @@ final class LocalDisplayAdapter extends DisplayAdapter { private final class PhysicalDisplayEventReceiver extends DisplayEventReceiver { PhysicalDisplayEventReceiver(Looper looper) { - super(looper, VSYNC_SOURCE_APP); + super(looper, VSYNC_SOURCE_APP, CONFIG_CHANGED_EVENT_DISPATCH); } @Override diff --git a/services/core/java/com/android/server/display/color/ColorDisplayService.java b/services/core/java/com/android/server/display/color/ColorDisplayService.java index 64a9e0074cb1..7fb5b191a9b0 100644 --- a/services/core/java/com/android/server/display/color/ColorDisplayService.java +++ b/services/core/java/com/android/server/display/color/ColorDisplayService.java @@ -63,6 +63,8 @@ import android.provider.Settings.Secure; import android.provider.Settings.System; import android.util.MathUtils; import android.util.Slog; +import android.util.SparseIntArray; +import android.view.Display; import android.view.SurfaceControl; import android.view.accessibility.AccessibilityManager; import android.view.animation.AnimationUtils; @@ -171,6 +173,11 @@ public final class ColorDisplayService extends SystemService { private NightDisplayAutoMode mNightDisplayAutoMode; + /** + * Map of color modes -> display composition colorspace + */ + private SparseIntArray mColorModeCompositionColorSpaces = null; + public ColorDisplayService(Context context) { super(context); mHandler = new TintHandler(DisplayThread.get().getLooper()); @@ -226,7 +233,7 @@ public final class ColorDisplayService extends SystemService { } } - private void onUserChanged(int userHandle) { + @VisibleForTesting void onUserChanged(int userHandle) { final ContentResolver cr = getContext().getContentResolver(); if (mCurrentUser != UserHandle.USER_NULL) { @@ -267,6 +274,30 @@ public final class ColorDisplayService extends SystemService { return Secure.getIntForUser(cr, Secure.USER_SETUP_COMPLETE, 0, userHandle) == 1; } + private void setUpDisplayCompositionColorSpaces(Resources res) { + mColorModeCompositionColorSpaces = null; + + final int[] colorModes = res.getIntArray(R.array.config_displayCompositionColorModes); + if (colorModes == null) { + return; + } + + final int[] compSpaces = res.getIntArray(R.array.config_displayCompositionColorSpaces); + if (compSpaces == null) { + return; + } + + if (colorModes.length != compSpaces.length) { + Slog.e(TAG, "Number of composition color spaces doesn't match specified color modes"); + return; + } + + mColorModeCompositionColorSpaces = new SparseIntArray(colorModes.length); + for (int i = 0; i < colorModes.length; i++) { + mColorModeCompositionColorSpaces.put(colorModes[i], compSpaces[i]); + } + } + private void setUp() { Slog.d(TAG, "setUp: currentUser=" + mCurrentUser); @@ -359,6 +390,8 @@ public final class ColorDisplayService extends SystemService { onAccessibilityInversionChanged(); onAccessibilityDaltonizerChanged(); + setUpDisplayCompositionColorSpaces(getContext().getResources()); + // Set the color mode, if valid, and immediately apply the updated tint matrix based on the // existing activated state. This ensures consistency of tint across the color mode change. onDisplayColorModeChanged(getColorModeInternal()); @@ -450,6 +483,14 @@ public final class ColorDisplayService extends SystemService { } } + private int getCompositionColorSpace(int mode) { + if (mColorModeCompositionColorSpaces == null) { + return Display.COLOR_MODE_INVALID; + } + + return mColorModeCompositionColorSpaces.get(mode, Display.COLOR_MODE_INVALID); + } + private void onDisplayColorModeChanged(int mode) { if (mode == NOT_SET) { return; @@ -465,12 +506,17 @@ public final class ColorDisplayService extends SystemService { .setMatrix(mNightDisplayTintController.getColorTemperatureSetting()); } + // dtm.setColorMode() needs to be called before + // updateDisplayWhiteBalanceStatus(), this is because the latter calls + // DisplayTransformManager.needsLinearColorMatrix(), therefore it is dependent + // on the state of DisplayTransformManager. + final DisplayTransformManager dtm = getLocalService(DisplayTransformManager.class); + dtm.setColorMode(mode, mNightDisplayTintController.getMatrix(), + getCompositionColorSpace(mode)); + if (mDisplayWhiteBalanceTintController.isAvailable(getContext())) { updateDisplayWhiteBalanceStatus(); } - - final DisplayTransformManager dtm = getLocalService(DisplayTransformManager.class); - dtm.setColorMode(mode, mNightDisplayTintController.getMatrix()); } private void onAccessibilityActivated() { @@ -931,7 +977,7 @@ public final class ColorDisplayService extends SystemService { if (mNightDisplayTintController.isActivatedStateNotSet() || (mNightDisplayTintController.isActivated() != activate)) { - mNightDisplayTintController.setActivated(activate); + mNightDisplayTintController.setActivated(activate, activate ? start : end); } updateNextAlarm(mNightDisplayTintController.isActivated(), now); @@ -1127,6 +1173,14 @@ public final class ColorDisplayService extends SystemService { @Override public void setActivated(Boolean activated) { + setActivated(activated, LocalDateTime.now()); + } + + /** + * Use directly when it is important that the last activation time be exact (for example, an + * automatic change). Otherwise use {@link #setActivated(Boolean)}. + */ + public void setActivated(Boolean activated, @NonNull LocalDateTime lastActivationTime) { if (activated == null) { super.setActivated(null); return; @@ -1138,7 +1192,7 @@ public final class ColorDisplayService extends SystemService { // This is a true state change, so set this as the last activation time. Secure.putStringForUser(getContext().getContentResolver(), Secure.NIGHT_DISPLAY_LAST_ACTIVATED_TIME, - LocalDateTime.now().toString(), + lastActivationTime.toString(), mCurrentUser); } diff --git a/services/core/java/com/android/server/display/color/DisplayTransformManager.java b/services/core/java/com/android/server/display/color/DisplayTransformManager.java index 5ff45a97706e..d5706a59b987 100644 --- a/services/core/java/com/android/server/display/color/DisplayTransformManager.java +++ b/services/core/java/com/android/server/display/color/DisplayTransformManager.java @@ -26,6 +26,7 @@ import android.os.ServiceManager; import android.os.SystemProperties; import android.util.Slog; import android.util.SparseArray; +import android.view.Display; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; @@ -77,6 +78,8 @@ public class DisplayTransformManager { @VisibleForTesting static final String PERSISTENT_PROPERTY_SATURATION = "persist.sys.sf.color_saturation"; @VisibleForTesting + static final String PERSISTENT_PROPERTY_COMPOSITION_COLOR_MODE = "persist.sys.sf.color_mode"; + @VisibleForTesting static final String PERSISTENT_PROPERTY_DISPLAY_COLOR = "persist.sys.sf.native_mode"; private static final float COLOR_SATURATION_NATURAL = 1.0f; @@ -251,23 +254,24 @@ public class DisplayTransformManager { /** * Sets color mode and updates night display transform values. */ - public boolean setColorMode(int colorMode, float[] nightDisplayMatrix) { + public boolean setColorMode(int colorMode, float[] nightDisplayMatrix, + int compositionColorMode) { if (colorMode == ColorDisplayManager.COLOR_MODE_NATURAL) { applySaturation(COLOR_SATURATION_NATURAL); - setDisplayColor(DISPLAY_COLOR_MANAGED); + setDisplayColor(DISPLAY_COLOR_MANAGED, compositionColorMode); } else if (colorMode == ColorDisplayManager.COLOR_MODE_BOOSTED) { applySaturation(COLOR_SATURATION_BOOSTED); - setDisplayColor(DISPLAY_COLOR_MANAGED); + setDisplayColor(DISPLAY_COLOR_MANAGED, compositionColorMode); } else if (colorMode == ColorDisplayManager.COLOR_MODE_SATURATED) { applySaturation(COLOR_SATURATION_NATURAL); - setDisplayColor(DISPLAY_COLOR_UNMANAGED); + setDisplayColor(DISPLAY_COLOR_UNMANAGED, compositionColorMode); } else if (colorMode == ColorDisplayManager.COLOR_MODE_AUTOMATIC) { applySaturation(COLOR_SATURATION_NATURAL); - setDisplayColor(DISPLAY_COLOR_ENHANCED); + setDisplayColor(DISPLAY_COLOR_ENHANCED, compositionColorMode); } else if (colorMode >= ColorDisplayManager.VENDOR_COLOR_MODE_RANGE_MIN && colorMode <= ColorDisplayManager.VENDOR_COLOR_MODE_RANGE_MAX) { applySaturation(COLOR_SATURATION_NATURAL); - setDisplayColor(colorMode); + setDisplayColor(colorMode, compositionColorMode); } setColorMatrix(LEVEL_COLOR_MATRIX_NIGHT_DISPLAY, nightDisplayMatrix); @@ -323,13 +327,21 @@ public class DisplayTransformManager { /** * Toggles native mode on/off in SurfaceFlinger. */ - private void setDisplayColor(int color) { + private void setDisplayColor(int color, int compositionColorMode) { SystemProperties.set(PERSISTENT_PROPERTY_DISPLAY_COLOR, Integer.toString(color)); + if (compositionColorMode != Display.COLOR_MODE_INVALID) { + SystemProperties.set(PERSISTENT_PROPERTY_COMPOSITION_COLOR_MODE, + Integer.toString(compositionColorMode)); + } + final IBinder flinger = ServiceManager.getService(SURFACE_FLINGER); if (flinger != null) { final Parcel data = Parcel.obtain(); data.writeInterfaceToken("android.ui.ISurfaceComposer"); data.writeInt(color); + if (compositionColorMode != Display.COLOR_MODE_INVALID) { + data.writeInt(compositionColorMode); + } try { flinger.transact(SURFACE_FLINGER_TRANSACTION_DISPLAY_COLOR, data, null, 0); } catch (RemoteException ex) { diff --git a/services/core/java/com/android/server/display/whitebalance/AmbientFilter.java b/services/core/java/com/android/server/display/whitebalance/AmbientFilter.java index 532bbed9588e..35808974b9e4 100644 --- a/services/core/java/com/android/server/display/whitebalance/AmbientFilter.java +++ b/services/core/java/com/android/server/display/whitebalance/AmbientFilter.java @@ -18,6 +18,7 @@ package com.android.server.display.whitebalance; import android.util.Slog; +import com.android.internal.annotations.VisibleForTesting; import com.android.server.display.utils.RollingBuffer; import java.io.PrintWriter; @@ -35,7 +36,7 @@ import java.util.Arrays; * - {@link WeightedMovingAverageAmbientFilter} * A weighted average prioritising recent changes. */ -abstract class AmbientFilter { +abstract public class AmbientFilter { protected static final boolean DEBUG = false; // Enable for verbose logs. diff --git a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java index 0f86b478468f..02ec10e2d49d 100644 --- a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java +++ b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.util.Slog; import android.util.Spline; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import com.android.server.LocalServices; import com.android.server.display.color.ColorDisplayService.ColorDisplayServiceInternal; @@ -53,18 +54,22 @@ public class DisplayWhiteBalanceController implements private Callbacks mCallbacks; private AmbientSensor.AmbientBrightnessSensor mBrightnessSensor; - private AmbientFilter mBrightnessFilter; + + @VisibleForTesting + AmbientFilter mBrightnessFilter; private AmbientSensor.AmbientColorTemperatureSensor mColorTemperatureSensor; - private AmbientFilter mColorTemperatureFilter; + + @VisibleForTesting + AmbientFilter mColorTemperatureFilter; private DisplayWhiteBalanceThrottler mThrottler; - // When the brightness drops below a certain threshold, it affects the color temperature - // accuracy, so we fall back to a fixed ambient color temperature. - private final float mLowLightAmbientBrightnessThreshold; private final float mLowLightAmbientColorTemperature; + private final float mHighLightAmbientColorTemperature; private float mAmbientColorTemperature; - private float mPendingAmbientColorTemperature; + + @VisibleForTesting + float mPendingAmbientColorTemperature; private float mLastAmbientColorTemperature; private ColorDisplayServiceInternal mColorDisplayServiceInternal; @@ -79,6 +84,17 @@ public class DisplayWhiteBalanceController implements // A piecewise linear relationship between ambient and display color temperatures. private Spline.LinearSpline mAmbientToDisplayColorTemperatureSpline; + // In very low or very high brightness conditions ambient EQ should to set to a default + // instead of using mAmbientToDisplayColorTemperatureSpline. However, setting ambient EQ + // based on thresholds can cause the display to rapidly change color temperature. To solve + // this, mLowLightAmbientBrightnessToBiasSpline and mHighLightAmbientBrightnessToBiasSpline + // are used to smoothly interpolate from ambient color temperature to the defaults. + // A piecewise linear relationship between low light brightness and low light bias. + private Spline.LinearSpline mLowLightAmbientBrightnessToBiasSpline; + + // A piecewise linear relationship between high light brightness and high light bias. + private Spline.LinearSpline mHighLightAmbientBrightnessToBiasSpline; + /** * @param brightnessSensor * The sensor used to detect changes in the ambient brightness. @@ -93,12 +109,22 @@ public class DisplayWhiteBalanceController implements * @param throttler * The throttler used to determine whether the new display color temperature should be * updated or not. - * @param lowLightAmbientBrightnessThreshold - * The ambient brightness threshold beneath which we fall back to a fixed ambient color - * temperature. + * @param lowLightAmbientBrightnesses + * The ambient brightness used to map the ambient brightnesses to the biases used to + * interpolate to lowLightAmbientColorTemperature. + * @param lowLightAmbientBiases + * The biases used to map the ambient brightnesses to the biases used to interpolate to + * lowLightAmbientColorTemperature. * @param lowLightAmbientColorTemperature - * The ambient color temperature to which we fall back when the ambient brightness drops - * beneath a certain threshold. + * The ambient color temperature to which we interpolate to based on the low light curve. + * @param highLightAmbientBrightnesses + * The ambient brightness used to map the ambient brightnesses to the biases used to + * interpolate to highLightAmbientColorTemperature. + * @param highLightAmbientBiases + * The biases used to map the ambient brightnesses to the biases used to interpolate to + * highLightAmbientColorTemperature. + * @param highLightAmbientColorTemperature + * The ambient color temperature to which we interpolate to based on the high light curve. * @param ambientColorTemperatures * The ambient color tempeartures used to map the ambient color temperature to the display * color temperature (or null if no mapping is necessary). @@ -119,7 +145,10 @@ public class DisplayWhiteBalanceController implements @NonNull AmbientSensor.AmbientColorTemperatureSensor colorTemperatureSensor, @NonNull AmbientFilter colorTemperatureFilter, @NonNull DisplayWhiteBalanceThrottler throttler, - float lowLightAmbientBrightnessThreshold, float lowLightAmbientColorTemperature, + float[] lowLightAmbientBrightnesses, float[] lowLightAmbientBiases, + float lowLightAmbientColorTemperature, + float[] highLightAmbientBrightnesses, float[] highLightAmbientBiases, + float highLightAmbientColorTemperature, float[] ambientColorTemperatures, float[] displayColorTemperatures) { validateArguments(brightnessSensor, brightnessFilter, colorTemperatureSensor, colorTemperatureFilter, throttler); @@ -131,8 +160,8 @@ public class DisplayWhiteBalanceController implements mColorTemperatureSensor = colorTemperatureSensor; mColorTemperatureFilter = colorTemperatureFilter; mThrottler = throttler; - mLowLightAmbientBrightnessThreshold = lowLightAmbientBrightnessThreshold; mLowLightAmbientColorTemperature = lowLightAmbientColorTemperature; + mHighLightAmbientColorTemperature = highLightAmbientColorTemperature; mAmbientColorTemperature = -1.0f; mPendingAmbientColorTemperature = -1.0f; mLastAmbientColorTemperature = -1.0f; @@ -140,9 +169,55 @@ public class DisplayWhiteBalanceController implements mAmbientColorTemperatureOverride = -1.0f; try { + mLowLightAmbientBrightnessToBiasSpline = new Spline.LinearSpline( + lowLightAmbientBrightnesses, lowLightAmbientBiases); + } catch (Exception e) { + Slog.e(TAG, "failed to create low light ambient brightness to bias spline.", e); + mLowLightAmbientBrightnessToBiasSpline = null; + } + if (mLowLightAmbientBrightnessToBiasSpline != null) { + if (mLowLightAmbientBrightnessToBiasSpline.interpolate(0.0f) != 0.0f || + mLowLightAmbientBrightnessToBiasSpline.interpolate(Float.POSITIVE_INFINITY) + != 1.0f) { + Slog.d(TAG, "invalid low light ambient brightness to bias spline, " + + "bias must begin at 0.0 and end at 1.0."); + mLowLightAmbientBrightnessToBiasSpline = null; + } + } + + try { + mHighLightAmbientBrightnessToBiasSpline = new Spline.LinearSpline( + highLightAmbientBrightnesses, highLightAmbientBiases); + } catch (Exception e) { + Slog.e(TAG, "failed to create high light ambient brightness to bias spline.", e); + mHighLightAmbientBrightnessToBiasSpline = null; + } + if (mHighLightAmbientBrightnessToBiasSpline != null) { + if (mHighLightAmbientBrightnessToBiasSpline.interpolate(0.0f) != 0.0f || + mHighLightAmbientBrightnessToBiasSpline.interpolate(Float.POSITIVE_INFINITY) + != 1.0f) { + Slog.d(TAG, "invalid high light ambient brightness to bias spline, " + + "bias must begin at 0.0 and end at 1.0."); + mHighLightAmbientBrightnessToBiasSpline = null; + } + } + + if (mLowLightAmbientBrightnessToBiasSpline != null && + mHighLightAmbientBrightnessToBiasSpline != null) { + if (lowLightAmbientBrightnesses[lowLightAmbientBrightnesses.length - 1] > + highLightAmbientBrightnesses[0]) { + Slog.d(TAG, "invalid low light and high light ambient brightness to bias spline " + + "combination, defined domains must not intersect."); + mLowLightAmbientBrightnessToBiasSpline = null; + mHighLightAmbientBrightnessToBiasSpline = null; + } + } + + try { mAmbientToDisplayColorTemperatureSpline = new Spline.LinearSpline( ambientColorTemperatures, displayColorTemperatures); } catch (Exception e) { + Slog.e(TAG, "failed to create ambient to display color temperature spline.", e); mAmbientToDisplayColorTemperatureSpline = null; } @@ -238,9 +313,8 @@ public class DisplayWhiteBalanceController implements mColorTemperatureSensor.dump(writer); mColorTemperatureFilter.dump(writer); mThrottler.dump(writer); - writer.println(" mLowLightAmbientBrightnessThreshold=" - + mLowLightAmbientBrightnessThreshold); writer.println(" mLowLightAmbientColorTemperature=" + mLowLightAmbientColorTemperature); + writer.println(" mHighLightAmbientColorTemperature=" + mHighLightAmbientColorTemperature); writer.println(" mAmbientColorTemperature=" + mAmbientColorTemperature); writer.println(" mPendingAmbientColorTemperature=" + mPendingAmbientColorTemperature); writer.println(" mLastAmbientColorTemperature=" + mLastAmbientColorTemperature); @@ -248,6 +322,10 @@ public class DisplayWhiteBalanceController implements writer.println(" mAmbientColorTemperatureOverride=" + mAmbientColorTemperatureOverride); writer.println(" mAmbientToDisplayColorTemperatureSpline=" + mAmbientToDisplayColorTemperatureSpline); + writer.println(" mLowLightAmbientBrightnessToBiasSpline=" + + mLowLightAmbientBrightnessToBiasSpline); + writer.println(" mHighLightAmbientBrightnessToBiasSpline=" + + mHighLightAmbientBrightnessToBiasSpline); } @Override // AmbientSensor.AmbientBrightnessSensor.Callbacks @@ -276,15 +354,21 @@ public class DisplayWhiteBalanceController implements mAmbientToDisplayColorTemperatureSpline.interpolate(ambientColorTemperature); } - final float ambientBrightness = mBrightnessFilter.getEstimate(time); - if (ambientBrightness < mLowLightAmbientBrightnessThreshold) { - if (mLoggingEnabled) { - Slog.d(TAG, "low light ambient brightness: " + ambientBrightness + " < " - + mLowLightAmbientBrightnessThreshold - + ", falling back to fixed ambient color temperature: " - + ambientColorTemperature + " => " + mLowLightAmbientColorTemperature); - } - ambientColorTemperature = mLowLightAmbientColorTemperature; + float ambientBrightness = mBrightnessFilter.getEstimate(time); + + if (ambientColorTemperature != -1.0f && + mLowLightAmbientBrightnessToBiasSpline != null) { + float bias = mLowLightAmbientBrightnessToBiasSpline.interpolate(ambientBrightness); + ambientColorTemperature = + bias * ambientColorTemperature + (1.0f - bias) + * mLowLightAmbientColorTemperature; + } + if (ambientColorTemperature != -1.0f && + mHighLightAmbientBrightnessToBiasSpline != null) { + float bias = mHighLightAmbientBrightnessToBiasSpline.interpolate(ambientBrightness); + ambientColorTemperature = + (1.0f - bias) * ambientColorTemperature + bias + * mHighLightAmbientColorTemperature; } if (mAmbientColorTemperatureOverride != -1.0f) { diff --git a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java index 6ff2b09988e6..bf0a1d16219d 100644 --- a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java +++ b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java @@ -63,19 +63,34 @@ public class DisplayWhiteBalanceFactory { createColorTemperatureSensor(handler, sensorManager, resources); final AmbientFilter colorTemperatureFilter = createColorTemperatureFilter(resources); final DisplayWhiteBalanceThrottler throttler = createThrottler(resources); - final float lowLightAmbientBrightnessThreshold = getFloat(resources, - com.android.internal.R.dimen - .config_displayWhiteBalanceLowLightAmbientBrightnessThreshold); + final float[] displayWhiteBalanceLowLightAmbientBrightnesses = getFloatArray(resources, + com.android.internal.R.array + .config_displayWhiteBalanceLowLightAmbientBrightnesses); + final float[] displayWhiteBalanceLowLightAmbientBiases = getFloatArray(resources, + com.android.internal.R.array + .config_displayWhiteBalanceLowLightAmbientBiases); final float lowLightAmbientColorTemperature = getFloat(resources, com.android.internal.R.dimen .config_displayWhiteBalanceLowLightAmbientColorTemperature); + final float[] displayWhiteBalanceHighLightAmbientBrightnesses = getFloatArray(resources, + com.android.internal.R.array + .config_displayWhiteBalanceHighLightAmbientBrightnesses); + final float[] displayWhiteBalanceHighLightAmbientBiases = getFloatArray(resources, + com.android.internal.R.array + .config_displayWhiteBalanceHighLightAmbientBiases); + final float highLightAmbientColorTemperature = getFloat(resources, + com.android.internal.R.dimen + .config_displayWhiteBalanceHighLightAmbientColorTemperature); final float[] ambientColorTemperatures = getFloatArray(resources, com.android.internal.R.array.config_displayWhiteBalanceAmbientColorTemperatures); final float[] displayColorTempeartures = getFloatArray(resources, com.android.internal.R.array.config_displayWhiteBalanceDisplayColorTemperatures); final DisplayWhiteBalanceController controller = new DisplayWhiteBalanceController( brightnessSensor, brightnessFilter, colorTemperatureSensor, colorTemperatureFilter, - throttler, lowLightAmbientBrightnessThreshold, lowLightAmbientColorTemperature, + throttler, displayWhiteBalanceLowLightAmbientBrightnesses, + displayWhiteBalanceLowLightAmbientBiases, lowLightAmbientColorTemperature, + displayWhiteBalanceHighLightAmbientBrightnesses, + displayWhiteBalanceHighLightAmbientBiases, highLightAmbientColorTemperature, ambientColorTemperatures, displayColorTempeartures); brightnessSensor.setCallbacks(controller); colorTemperatureSensor.setCallbacks(controller); @@ -100,8 +115,7 @@ public class DisplayWhiteBalanceFactory { * Creates a BrightnessFilter which functions as a weighted moving average buffer for recent * brightness values. */ - @VisibleForTesting - static AmbientFilter createBrightnessFilter(Resources resources) { + public static AmbientFilter createBrightnessFilter(Resources resources) { final int horizon = resources.getInteger( com.android.internal.R.integer.config_displayWhiteBalanceBrightnessFilterHorizon); final float intercept = getFloat(resources, @@ -114,7 +128,6 @@ public class DisplayWhiteBalanceFactory { + "expected config_displayWhiteBalanceBrightnessFilterIntercept"); } - /** * Creates an ambient color sensor instance to redirect sensor data to callbacks. */ diff --git a/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java b/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java index c52921ef344b..16cf7eef6a1e 100644 --- a/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java +++ b/services/core/java/com/android/server/infra/AbstractPerUserSystemService.java @@ -75,6 +75,14 @@ public abstract class AbstractPerUserSystemService<S extends AbstractPerUserSyst mMaster = master; mLock = lock; mUserId = userId; + updateIsSetupComplete(userId); + } + + /** Updates whether setup is complete for current user */ + private void updateIsSetupComplete(@UserIdInt int userId) { + final String setupComplete = Settings.Secure.getStringForUser( + getContext().getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, userId); + mSetupComplete = "1".equals(setupComplete); } /** @@ -143,9 +151,7 @@ public abstract class AbstractPerUserSystemService<S extends AbstractPerUserSyst + ", disabled=" + disabled + ", mDisabled=" + mDisabled); } - final String setupComplete = Settings.Secure.getStringForUser( - getContext().getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, mUserId); - mSetupComplete = "1".equals(setupComplete); + updateIsSetupComplete(mUserId); mDisabled = disabled; updateServiceInfoLocked(); diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index 107e1fbbf760..9510db09aa25 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -32,6 +32,7 @@ import static com.android.internal.widget.LockPatternUtils.USER_FRP; import static com.android.internal.widget.LockPatternUtils.frpCredentialEnabled; import static com.android.internal.widget.LockPatternUtils.userOwnsFrpCredential; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; @@ -169,6 +170,20 @@ public class LockSettingsService extends ILockSettings.Stub { private static final String SEPARATE_PROFILE_CHALLENGE_KEY = "lockscreen.profilechallenge"; private static final int SYNTHETIC_PASSWORD_ENABLED_BY_DEFAULT = 1; + // No challenge provided + private static final int CHALLENGE_NONE = 0; + // Challenge was provided from the external caller (non-LockSettingsService) + private static final int CHALLENGE_FROM_CALLER = 1; + // Challenge was generated from within LockSettingsService, for resetLockout. When challenge + // type is set to internal, LSS will revokeChallenge after all profiles for that user are + // unlocked. + private static final int CHALLENGE_INTERNAL = 2; + + @IntDef({CHALLENGE_NONE, + CHALLENGE_FROM_CALLER, + CHALLENGE_INTERNAL}) + @interface ChallengeType {}; + // Order of holding lock: mSeparateChallengeLock -> mSpManager -> this // Do not call into ActivityManager while holding mSpManager lock. private final Object mSeparateChallengeLock = new Object(); @@ -276,6 +291,15 @@ public class LockSettingsService extends ILockSettings.Stub { } } + private class PendingResetLockout { + final int mUserId; + final byte[] mHAT; + PendingResetLockout(int userId, byte[] hat) { + mUserId = userId; + mHAT = hat; + } + } + /** * Tie managed profile to primary profile if it is in unified mode and not tied before. * @@ -420,9 +444,9 @@ public class LockSettingsService extends ILockSettings.Stub { new PasswordSlotManager()); } - public boolean hasEnrolledBiometrics() { + public boolean hasEnrolledBiometrics(int userId) { BiometricManager bm = mContext.getSystemService(BiometricManager.class); - return bm.canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS; + return bm.hasEnrolledBiometrics(userId); } public int binderGetCallingUid() { @@ -584,7 +608,8 @@ public class LockSettingsService extends ILockSettings.Stub { // If boot took too long and the password in vold got expired, parent keystore will // be still locked, we ignore this case since the user will be prompted to unlock // the device after boot. - unlockChildProfile(userId, true /* ignoreUserNotAuthenticated */); + unlockChildProfile(userId, true /* ignoreUserNotAuthenticated */, + CHALLENGE_NONE, 0 /* challenge */, null /* resetLockouts */); } catch (RemoteException e) { Slog.e(TAG, "Failed to unlock child profile"); } @@ -1160,12 +1185,15 @@ public class LockSettingsService extends ILockSettings.Stub { return decryptionResult; } - private void unlockChildProfile(int profileHandle, boolean ignoreUserNotAuthenticated) + private void unlockChildProfile(int profileHandle, boolean ignoreUserNotAuthenticated, + @ChallengeType int challengeType, long challenge, + @Nullable ArrayList<PendingResetLockout> resetLockouts) throws RemoteException { try { doVerifyCredential(getDecryptedPasswordForTiedProfile(profileHandle), CREDENTIAL_TYPE_PASSWORD, - false, 0 /* no challenge */, profileHandle, null /* progressCallback */); + challengeType, challenge, profileHandle, null /* progressCallback */, + resetLockouts); } catch (UnrecoverableKeyException | InvalidKeyException | KeyStoreException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidAlgorithmParameterException | IllegalBlockSizeException @@ -1180,6 +1208,10 @@ public class LockSettingsService extends ILockSettings.Stub { } } + private void unlockUser(int userId, byte[] token, byte[] secret) { + unlockUser(userId, token, secret, CHALLENGE_NONE, 0 /* challenge */, null); + } + /** * Unlock the user (both storage and user state) and its associated managed profiles * synchronously. @@ -1188,7 +1220,9 @@ public class LockSettingsService extends ILockSettings.Stub { * can end up calling into other system services to process user unlock request (via * {@link com.android.server.SystemServiceManager#unlockUser} </em> */ - private void unlockUser(int userId, byte[] token, byte[] secret) { + private void unlockUser(int userId, byte[] token, byte[] secret, + @ChallengeType int challengeType, long challenge, + @Nullable ArrayList<PendingResetLockout> resetLockouts) { // TODO: make this method fully async so we can update UI with progress strings final boolean alreadyUnlocked = mUserManager.isUserUnlockingOrUnlocked(userId); final CountDownLatch latch = new CountDownLatch(1); @@ -1230,7 +1264,10 @@ public class LockSettingsService extends ILockSettings.Stub { // Unlock managed profile with unified lock if (tiedManagedProfileReadyToUnlock(profile)) { try { - unlockChildProfile(profile.id, false /* ignoreUserNotAuthenticated */); + // Must pass the challenge on for resetLockout, so it's not over-written, which + // causes LockSettingsService to revokeChallenge inappropriately. + unlockChildProfile(profile.id, false /* ignoreUserNotAuthenticated */, + challengeType, challenge, resetLockouts); } catch (RemoteException e) { Log.d(TAG, "Failed to unlock child profile", e); } @@ -1247,6 +1284,21 @@ public class LockSettingsService extends ILockSettings.Stub { } } + + if (resetLockouts != null && !resetLockouts.isEmpty()) { + mHandler.post(() -> { + final BiometricManager bm = mContext.getSystemService(BiometricManager.class); + final PackageManager pm = mContext.getPackageManager(); + for (int i = 0; i < resetLockouts.size(); i++) { + bm.setActiveUser(resetLockouts.get(i).mUserId); + bm.resetLockout(resetLockouts.get(i).mHAT); + } + if (challengeType == CHALLENGE_INTERNAL + && pm.hasSystemFeature(PackageManager.FEATURE_FACE)) { + mContext.getSystemService(FaceManager.class).revokeChallenge(); + } + }); + } } private boolean tiedManagedProfileReadyToUnlock(UserInfo userInfo) { @@ -1518,7 +1570,8 @@ public class LockSettingsService extends ILockSettings.Stub { setUserKeyProtection(userId, credential, convertResponse(gkResponse)); fixateNewestUserKeyAuth(userId); // Refresh the auth token - doVerifyCredential(credential, credentialType, true, 0, userId, null /* progressCallback */); + doVerifyCredential(credential, credentialType, CHALLENGE_FROM_CALLER, 0, userId, + null /* progressCallback */); synchronizeUnifiedWorkChallengeForProfiles(userId, null); sendCredentialsOnChangeIfRequired( credentialType, credential, userId, isLockTiedToParent); @@ -1743,24 +1796,32 @@ public class LockSettingsService extends ILockSettings.Stub { public VerifyCredentialResponse checkCredential(byte[] credential, int type, int userId, ICheckCredentialProgressCallback progressCallback) throws RemoteException { checkPasswordReadPermission(userId); - return doVerifyCredential(credential, type, false, 0, userId, progressCallback); + return doVerifyCredential(credential, type, CHALLENGE_NONE, 0, userId, progressCallback); } @Override public VerifyCredentialResponse verifyCredential(byte[] credential, int type, long challenge, int userId) throws RemoteException { checkPasswordReadPermission(userId); - return doVerifyCredential(credential, type, true, challenge, userId, + return doVerifyCredential(credential, type, CHALLENGE_FROM_CALLER, challenge, userId, null /* progressCallback */); } + private VerifyCredentialResponse doVerifyCredential(byte[] credential, int credentialType, + @ChallengeType int challengeType, long challenge, int userId, + ICheckCredentialProgressCallback progressCallback) throws RemoteException { + return doVerifyCredential(credential, credentialType, challengeType, challenge, userId, + progressCallback, null /* resetLockouts */); + } + /** * Verify user credential and unlock the user. Fix pattern bug by deprecating the old base zero * format. */ private VerifyCredentialResponse doVerifyCredential(byte[] credential, int credentialType, - boolean hasChallenge, long challenge, int userId, - ICheckCredentialProgressCallback progressCallback) throws RemoteException { + @ChallengeType int challengeType, long challenge, int userId, + ICheckCredentialProgressCallback progressCallback, + @Nullable ArrayList<PendingResetLockout> resetLockouts) throws RemoteException { if (credential == null || credential.length == 0) { throw new IllegalArgumentException("Credential can't be null or empty"); } @@ -1770,8 +1831,8 @@ public class LockSettingsService extends ILockSettings.Stub { return VerifyCredentialResponse.ERROR; } VerifyCredentialResponse response = null; - response = spBasedDoVerifyCredential(credential, credentialType, hasChallenge, challenge, - userId, progressCallback); + response = spBasedDoVerifyCredential(credential, credentialType, challengeType, challenge, + userId, progressCallback, resetLockouts); // The user employs synthetic password based credential. if (response != null) { if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_OK) { @@ -1803,7 +1864,7 @@ public class LockSettingsService extends ILockSettings.Stub { } response = verifyCredential(userId, storedHash, credentialToVerify, - hasChallenge, challenge, progressCallback); + challengeType, challenge, progressCallback); if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_OK) { mStrongAuth.reportSuccessfulStrongAuthUnlock(userId); @@ -1829,7 +1890,7 @@ public class LockSettingsService extends ILockSettings.Stub { final VerifyCredentialResponse parentResponse = doVerifyCredential( credential, type, - true /* hasChallenge */, + CHALLENGE_FROM_CALLER, challenge, parentProfileId, null /* progressCallback */); @@ -1842,7 +1903,7 @@ public class LockSettingsService extends ILockSettings.Stub { // Unlock work profile, and work profile with unified lock must use password only return doVerifyCredential(getDecryptedPasswordForTiedProfile(userId), CREDENTIAL_TYPE_PASSWORD, - true, + CHALLENGE_FROM_CALLER, challenge, userId, null /* progressCallback */); } catch (UnrecoverableKeyException | InvalidKeyException | KeyStoreException @@ -1860,7 +1921,7 @@ public class LockSettingsService extends ILockSettings.Stub { * hash to GK. */ private VerifyCredentialResponse verifyCredential(int userId, CredentialHash storedHash, - byte[] credential, boolean hasChallenge, long challenge, + byte[] credential, @ChallengeType int challengeType, long challenge, ICheckCredentialProgressCallback progressCallback) throws RemoteException { if ((storedHash == null || storedHash.hash.length == 0) && (credential == null || credential.length == 0)) { @@ -1903,7 +1964,7 @@ public class LockSettingsService extends ILockSettings.Stub { : DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC /* TODO(roosa): keep the same password quality */, userId, false, /* isLockTiedToParent= */ false); - if (!hasChallenge) { + if (challengeType == CHALLENGE_NONE) { notifyActivePasswordMetricsAvailable(storedHash.type, credential, userId); // Use credentials to create recoverable keystore snapshot. sendCredentialsOnUnlockIfRequired(storedHash.type, credential, userId); @@ -2491,9 +2552,14 @@ public class LockSettingsService extends ILockSettings.Stub { } private VerifyCredentialResponse spBasedDoVerifyCredential(byte[] userCredential, - @CredentialType int credentialType, boolean hasChallenge, long challenge, int userId, - ICheckCredentialProgressCallback progressCallback) throws RemoteException { - if (DEBUG) Slog.d(TAG, "spBasedDoVerifyCredential: user=" + userId); + @CredentialType int credentialType, @ChallengeType int challengeType, long challenge, + int userId, ICheckCredentialProgressCallback progressCallback, + @Nullable ArrayList<PendingResetLockout> resetLockouts) throws RemoteException { + + final boolean hasEnrolledBiometrics = mInjector.hasEnrolledBiometrics(userId); + + Slog.d(TAG, "spBasedDoVerifyCredential: user=" + userId + " challengeType=" + challengeType + + " hasEnrolledBiometrics=" + hasEnrolledBiometrics); if (credentialType == CREDENTIAL_TYPE_NONE) { userCredential = null; } @@ -2502,8 +2568,11 @@ public class LockSettingsService extends ILockSettings.Stub { // TODO: When lockout is handled under the HAL for all biometrics (fingerprint), // we need to generate challenge for each one, have it signed by GK and reset lockout // for each modality. - if (!hasChallenge && pm.hasSystemFeature(PackageManager.FEATURE_FACE) - && mInjector.hasEnrolledBiometrics()) { + if (challengeType == CHALLENGE_NONE && pm.hasSystemFeature(PackageManager.FEATURE_FACE) + && hasEnrolledBiometrics) { + // If there are multiple profiles in the same account, ensure we only generate the + // challenge once. + challengeType = CHALLENGE_INTERNAL; challenge = mContext.getSystemService(FaceManager.class).generateChallenge(); } @@ -2545,21 +2614,18 @@ public class LockSettingsService extends ILockSettings.Stub { if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_OK) { notifyActivePasswordMetricsAvailable(credentialType, userCredential, userId); unlockKeystore(authResult.authToken.deriveKeyStorePassword(), userId); - // Reset lockout only if user has enrolled templates - if (mInjector.hasEnrolledBiometrics()) { - BiometricManager bm = mContext.getSystemService(BiometricManager.class); - Slog.i(TAG, "Resetting lockout, length: " - + authResult.gkResponse.getPayload().length); - bm.resetLockout(authResult.gkResponse.getPayload()); - - if (!hasChallenge && pm.hasSystemFeature(PackageManager.FEATURE_FACE)) { - mContext.getSystemService(FaceManager.class).revokeChallenge(); + + // Do resetLockout / revokeChallenge when all profiles are unlocked + if (hasEnrolledBiometrics) { + if (resetLockouts == null) { + resetLockouts = new ArrayList<>(); } + resetLockouts.add(new PendingResetLockout(userId, response.getPayload())); } final byte[] secret = authResult.authToken.deriveDiskEncryptionKey(); Slog.i(TAG, "Unlocking user " + userId + " with secret only, length " + secret.length); - unlockUser(userId, null, secret); + unlockUser(userId, null, secret, challengeType, challenge, resetLockouts); activateEscrowTokens(authResult.authToken, userId); diff --git a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java index f0e431ee0354..84ae7c790a74 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsStorage.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsStorage.java @@ -48,6 +48,8 @@ import java.io.DataOutputStream; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; +import java.nio.channels.FileChannel; +import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -390,6 +392,17 @@ class LockSettingsStorage { return stored; } + private void fsyncDirectory(File directory) { + try { + try (FileChannel file = FileChannel.open(directory.toPath(), + StandardOpenOption.READ)) { + file.force(true); + } + } catch (IOException e) { + Slog.e(TAG, "Error syncing directory: " + directory, e); + } + } + private void writeFile(String name, byte[] hash) { synchronized (mFileWriteLock) { RandomAccessFile raf = null; @@ -406,6 +419,7 @@ class LockSettingsStorage { raf.write(hash, 0, hash.length); } raf.close(); + fsyncDirectory((new File(name)).getAbsoluteFile().getParentFile()); } catch (IOException e) { Slog.e(TAG, "Error writing to file " + e); } finally { diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/PlatformKeyManager.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/PlatformKeyManager.java index c54bfc01e031..0ad6c2a69556 100644 --- a/services/core/java/com/android/server/locksettings/recoverablekeystore/PlatformKeyManager.java +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/PlatformKeyManager.java @@ -19,6 +19,7 @@ package com.android.server.locksettings.recoverablekeystore; import android.app.KeyguardManager; import android.content.Context; import android.os.RemoteException; +import android.os.UserHandle; import android.security.GateKeeper; import android.security.keystore.AndroidKeyStoreSecretKey; import android.security.keystore.KeyPermanentlyInvalidatedException; @@ -437,25 +438,31 @@ public class PlatformKeyManager { // so it may live in memory for some time. SecretKey secretKey = generateAesKey(); - long secureUserId = getGateKeeperService().getSecureUserId(userId); - // TODO(b/124095438): Propagate this failure instead of silently failing. - if (secureUserId == GateKeeper.INVALID_SECURE_USER_ID) { - Log.e(TAG, "No SID available for user " + userId); - return; - } - - // Store decryption key first since it is more likely to fail. - mKeyStore.setEntry( - decryptAlias, - new KeyStore.SecretKeyEntry(secretKey), + KeyProtection.Builder decryptionKeyProtection = new KeyProtection.Builder(KeyProperties.PURPOSE_DECRYPT) .setUserAuthenticationRequired(true) .setUserAuthenticationValidityDurationSeconds( USER_AUTHENTICATION_VALIDITY_DURATION_SECONDS) .setBlockModes(KeyProperties.BLOCK_MODE_GCM) - .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) + .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE); + if (userId != UserHandle.USER_SYSTEM) { + // Bind decryption key to secondary profile lock screen secret. + long secureUserId = getGateKeeperService().getSecureUserId(userId); + // TODO(b/124095438): Propagate this failure instead of silently failing. + if (secureUserId == GateKeeper.INVALID_SECURE_USER_ID) { + Log.e(TAG, "No SID available for user " + userId); + return; + } + decryptionKeyProtection .setBoundToSpecificSecureUserId(secureUserId) - .build()); + // Ignore caller uid which always belongs to the primary profile. + .setCriticalToDeviceEncryption(true); + } + // Store decryption key first since it is more likely to fail. + mKeyStore.setEntry( + decryptAlias, + new KeyStore.SecretKeyEntry(secretKey), + decryptionKeyProtection.build()); mKeyStore.setEntry( encryptAlias, new KeyStore.SecretKeyEntry(secretKey), diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 6c34e1313f73..d3346cddf3d0 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -232,7 +232,6 @@ import com.android.server.ServiceThread; import com.android.server.SystemConfig; import libcore.io.IoUtils; -import libcore.util.EmptyArray; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlSerializer; @@ -540,7 +539,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private final SparseArray<String> mSubIdToSubscriberId = new SparseArray<>(); /** Set of all merged subscriberId as of last update */ @GuardedBy("mNetworkPoliciesSecondLock") - private String[] mMergedSubscriberIds = EmptyArray.STRING; + private List<String[]> mMergedSubscriberIds = new ArrayList<>(); /** * Indicates the uids restricted by admin from accessing metered data. It's a mapping from @@ -1801,7 +1800,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final SubscriptionManager sm = mContext.getSystemService(SubscriptionManager.class); final int[] subIds = ArrayUtils.defeatNullable(sm.getActiveSubscriptionIdList()); - final String[] mergedSubscriberIds = ArrayUtils.defeatNullable(tm.getMergedSubscriberIds()); + final List<String[]> mergedSubscriberIdsList = new ArrayList(); final SparseArray<String> subIdToSubscriberId = new SparseArray<>(subIds.length); for (int subId : subIds) { @@ -1811,6 +1810,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } else { Slog.wtf(TAG, "Missing subscriberId for subId " + subId); } + + String[] mergedSubscriberId = ArrayUtils.defeatNullable( + tm.createForSubscriptionId(subId).getMergedSubscriberIdsFromGroup()); + mergedSubscriberIdsList.add(mergedSubscriberId); } synchronized (mNetworkPoliciesSecondLock) { @@ -1820,7 +1823,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { subIdToSubscriberId.valueAt(i)); } - mMergedSubscriberIds = mergedSubscriberIds; + mMergedSubscriberIds = mergedSubscriberIdsList; } Trace.traceEnd(TRACE_TAG_NETWORK); @@ -3373,8 +3376,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { fout.decreaseIndent(); fout.println(); - fout.println("Merged subscriptions: " - + Arrays.toString(NetworkIdentity.scrubSubscriberId(mMergedSubscriberIds))); + for (String[] mergedSubscribers : mMergedSubscriberIds) { + fout.println("Merged subscriptions: " + Arrays.toString( + NetworkIdentity.scrubSubscriberId(mergedSubscribers))); + } fout.println(); fout.println("Policy for UIDs:"); diff --git a/services/core/java/com/android/server/net/NetworkStatsFactory.java b/services/core/java/com/android/server/net/NetworkStatsFactory.java index 69efd02dea9c..7687718b0693 100644 --- a/services/core/java/com/android/server/net/NetworkStatsFactory.java +++ b/services/core/java/com/android/server/net/NetworkStatsFactory.java @@ -16,6 +16,7 @@ package com.android.server.net; +import static android.net.NetworkStats.INTERFACES_ALL; import static android.net.NetworkStats.SET_ALL; import static android.net.NetworkStats.TAG_ALL; import static android.net.NetworkStats.TAG_NONE; @@ -33,6 +34,7 @@ import android.os.SystemClock; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.net.VpnInfo; import com.android.internal.util.ArrayUtils; import com.android.internal.util.ProcFileReader; @@ -66,15 +68,29 @@ public class NetworkStatsFactory { /** Path to {@code /proc/net/xt_qtaguid/stats}. */ private final File mStatsXtUid; - private boolean mUseBpfStats; + private final boolean mUseBpfStats; private INetd mNetdService; - // A persistent Snapshot since device start for eBPF stats - @GuardedBy("mPersistSnapshot") - private final NetworkStats mPersistSnapshot; + /** + * Guards persistent data access in this class + * + * <p>In order to prevent deadlocks, critical sections protected by this lock SHALL NOT call out + * to other code that will acquire other locks within the system server. See b/134244752. + */ + private static final Object sPersistentDataLock = new Object(); + + /** Set containing info about active VPNs and their underlying networks. */ + private static volatile VpnInfo[] sVpnInfos = new VpnInfo[0]; + + // A persistent snapshot of cumulative stats since device start + @GuardedBy("sPersistentDataLock") + private NetworkStats mPersistSnapshot; + + // The persistent snapshot of tun and 464xlat adjusted stats since device start + @GuardedBy("sPersistentDataLock") + private NetworkStats mTunAnd464xlatAdjustedStats; - // TODO: only do adjustments in NetworkStatsService and remove this. /** * (Stacked interface) -> (base interface) association for all connected ifaces since boot. * @@ -91,6 +107,24 @@ public class NetworkStatsFactory { } /** + * Set active VPN information for data usage migration purposes + * + * <p>Traffic on TUN-based VPNs inherently all appear to be originated from the VPN providing + * app's UID. This method is used to support migration of VPN data usage, ensuring data is + * accurately billed to the real owner of the traffic. + * + * @param vpnArray The snapshot of the currently-running VPNs. + */ + public static void updateVpnInfos(VpnInfo[] vpnArray) { + sVpnInfos = vpnArray.clone(); + } + + @VisibleForTesting + public static VpnInfo[] getVpnInfos() { + return sVpnInfos.clone(); + } + + /** * Get a set of interfaces containing specified ifaces and stacked interfaces. * * <p>The added stacked interfaces are ifaces stacked on top of the specified ones, or ifaces @@ -146,6 +180,7 @@ public class NetworkStatsFactory { mStatsXtUid = new File(procRoot, "net/xt_qtaguid/stats"); mUseBpfStats = useBpfStats; mPersistSnapshot = new NetworkStats(SystemClock.elapsedRealtime(), -1); + mTunAnd464xlatAdjustedStats = new NetworkStats(SystemClock.elapsedRealtime(), -1); } public NetworkStats readBpfNetworkStatsDev() throws IOException { @@ -264,47 +299,43 @@ public class NetworkStatsFactory { } public NetworkStats readNetworkStatsDetail() throws IOException { - return readNetworkStatsDetail(UID_ALL, null, TAG_ALL, null); - } - - public NetworkStats readNetworkStatsDetail(int limitUid, String[] limitIfaces, int limitTag, - NetworkStats lastStats) throws IOException { - final NetworkStats stats = - readNetworkStatsDetailInternal(limitUid, limitIfaces, limitTag, lastStats); - - // No locking here: apply464xlatAdjustments behaves fine with an add-only ConcurrentHashMap. - // TODO: remove this and only apply adjustments in NetworkStatsService. - stats.apply464xlatAdjustments(sStackedIfaces, mUseBpfStats); - - return stats; + return readNetworkStatsDetail(UID_ALL, INTERFACES_ALL, TAG_ALL); } - @GuardedBy("mPersistSnapshot") + @GuardedBy("sPersistentDataLock") private void requestSwapActiveStatsMapLocked() throws RemoteException { // Ask netd to do a active map stats swap. When the binder call successfully returns, // the system server should be able to safely read and clean the inactive map // without race problem. - if (mUseBpfStats) { - if (mNetdService == null) { - mNetdService = NetdService.getInstance(); - } - mNetdService.trafficSwapActiveStatsMap(); + if (mNetdService == null) { + mNetdService = NetdService.getInstance(); } + mNetdService.trafficSwapActiveStatsMap(); } - // TODO: delete the lastStats parameter - private NetworkStats readNetworkStatsDetailInternal(int limitUid, String[] limitIfaces, - int limitTag, NetworkStats lastStats) throws IOException { - if (USE_NATIVE_PARSING) { - final NetworkStats stats; - if (lastStats != null) { - stats = lastStats; - stats.setElapsedRealtime(SystemClock.elapsedRealtime()); - } else { - stats = new NetworkStats(SystemClock.elapsedRealtime(), -1); - } - if (mUseBpfStats) { - synchronized (mPersistSnapshot) { + /** + * Reads the detailed UID stats based on the provided parameters + * + * @param limitUid the UID to limit this query to + * @param limitIfaces the interfaces to limit this query to. Use {@link + * NetworkStats.INTERFACES_ALL} to select all interfaces + * @param limitTag the tags to limit this query to + * @return the NetworkStats instance containing network statistics at the present time. + */ + public NetworkStats readNetworkStatsDetail( + int limitUid, String[] limitIfaces, int limitTag) throws IOException { + // In order to prevent deadlocks, anything protected by this lock MUST NOT call out to other + // code that will acquire other locks within the system server. See b/134244752. + synchronized (sPersistentDataLock) { + // Take a reference. If this gets swapped out, we still have the old reference. + final VpnInfo[] vpnArray = sVpnInfos; + // Take a defensive copy. mPersistSnapshot is mutated in some cases below + final NetworkStats prev = mPersistSnapshot.clone(); + + if (USE_NATIVE_PARSING) { + final NetworkStats stats = + new NetworkStats(SystemClock.elapsedRealtime(), 0 /* initialSize */); + if (mUseBpfStats) { try { requestSwapActiveStatsMapLocked(); } catch (RemoteException e) { @@ -313,30 +344,64 @@ public class NetworkStatsFactory { // Stats are always read from the inactive map, so they must be read after the // swap if (nativeReadNetworkStatsDetail(stats, mStatsXtUid.getAbsolutePath(), UID_ALL, - null, TAG_ALL, mUseBpfStats) != 0) { + INTERFACES_ALL, TAG_ALL, mUseBpfStats) != 0) { throw new IOException("Failed to parse network stats"); } + + // BPF stats are incremental; fold into mPersistSnapshot. mPersistSnapshot.setElapsedRealtime(stats.getElapsedRealtime()); mPersistSnapshot.combineAllValues(stats); - NetworkStats result = mPersistSnapshot.clone(); - result.filter(limitUid, limitIfaces, limitTag); - return result; + } else { + if (nativeReadNetworkStatsDetail(stats, mStatsXtUid.getAbsolutePath(), UID_ALL, + INTERFACES_ALL, TAG_ALL, mUseBpfStats) != 0) { + throw new IOException("Failed to parse network stats"); + } + if (SANITY_CHECK_NATIVE) { + final NetworkStats javaStats = javaReadNetworkStatsDetail(mStatsXtUid, + UID_ALL, INTERFACES_ALL, TAG_ALL); + assertEquals(javaStats, stats); + } + + mPersistSnapshot = stats; } } else { - if (nativeReadNetworkStatsDetail(stats, mStatsXtUid.getAbsolutePath(), limitUid, - limitIfaces, limitTag, mUseBpfStats) != 0) { - throw new IOException("Failed to parse network stats"); - } - if (SANITY_CHECK_NATIVE) { - final NetworkStats javaStats = javaReadNetworkStatsDetail(mStatsXtUid, limitUid, - limitIfaces, limitTag); - assertEquals(javaStats, stats); - } - return stats; + mPersistSnapshot = javaReadNetworkStatsDetail(mStatsXtUid, UID_ALL, INTERFACES_ALL, + TAG_ALL); } - } else { - return javaReadNetworkStatsDetail(mStatsXtUid, limitUid, limitIfaces, limitTag); + + NetworkStats adjustedStats = adjustForTunAnd464Xlat(mPersistSnapshot, prev, vpnArray); + + // Filter return values + adjustedStats.filter(limitUid, limitIfaces, limitTag); + return adjustedStats; + } + } + + @GuardedBy("sPersistentDataLock") + private NetworkStats adjustForTunAnd464Xlat( + NetworkStats uidDetailStats, NetworkStats previousStats, VpnInfo[] vpnArray) { + // Calculate delta from last snapshot + final NetworkStats delta = uidDetailStats.subtract(previousStats); + + // Apply 464xlat adjustments before VPN adjustments. If VPNs are using v4 on a v6 only + // network, the overhead is their fault. + // No locking here: apply464xlatAdjustments behaves fine with an add-only + // ConcurrentHashMap. + delta.apply464xlatAdjustments(sStackedIfaces, mUseBpfStats); + + // Migrate data usage over a VPN to the TUN network. + for (VpnInfo info : vpnArray) { + delta.migrateTun(info.ownerUid, info.vpnIface, info.underlyingIfaces); } + + // Filter out debug entries as that may lead to over counting. + delta.filterDebugEntries(); + + // Update mTunAnd464xlatAdjustedStats with migrated delta. + mTunAnd464xlatAdjustedStats.combineAllValues(delta); + mTunAnd464xlatAdjustedStats.setElapsedRealtime(uidDetailStats.getElapsedRealtime()); + + return mTunAnd464xlatAdjustedStats.clone(); } /** diff --git a/services/core/java/com/android/server/net/NetworkStatsObservers.java b/services/core/java/com/android/server/net/NetworkStatsObservers.java index d8408730dd25..2564daeaa1c0 100644 --- a/services/core/java/com/android/server/net/NetworkStatsObservers.java +++ b/services/core/java/com/android/server/net/NetworkStatsObservers.java @@ -39,7 +39,6 @@ import android.util.Slog; import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.net.VpnInfo; import java.util.concurrent.atomic.AtomicInteger; @@ -104,9 +103,9 @@ class NetworkStatsObservers { public void updateStats(NetworkStats xtSnapshot, NetworkStats uidSnapshot, ArrayMap<String, NetworkIdentitySet> activeIfaces, ArrayMap<String, NetworkIdentitySet> activeUidIfaces, - VpnInfo[] vpnArray, long currentTime) { + long currentTime) { StatsContext statsContext = new StatsContext(xtSnapshot, uidSnapshot, activeIfaces, - activeUidIfaces, vpnArray, currentTime); + activeUidIfaces, currentTime); getHandler().sendMessage(mHandler.obtainMessage(MSG_UPDATE_STATS, statsContext)); } @@ -354,7 +353,7 @@ class NetworkStatsObservers { // thread will update it. We pass a null VPN array because usage is aggregated by uid // for this snapshot, so VPN traffic can't be reattributed to responsible apps. mRecorder.recordSnapshotLocked(statsContext.mXtSnapshot, statsContext.mActiveIfaces, - null /* vpnArray */, statsContext.mCurrentTime); + statsContext.mCurrentTime); } /** @@ -396,7 +395,7 @@ class NetworkStatsObservers { // thread will update it. We pass the VPN info so VPN traffic is reattributed to // responsible apps. mRecorder.recordSnapshotLocked(statsContext.mUidSnapshot, statsContext.mActiveUidIfaces, - statsContext.mVpnArray, statsContext.mCurrentTime); + statsContext.mCurrentTime); } /** @@ -427,18 +426,16 @@ class NetworkStatsObservers { NetworkStats mUidSnapshot; ArrayMap<String, NetworkIdentitySet> mActiveIfaces; ArrayMap<String, NetworkIdentitySet> mActiveUidIfaces; - VpnInfo[] mVpnArray; long mCurrentTime; StatsContext(NetworkStats xtSnapshot, NetworkStats uidSnapshot, ArrayMap<String, NetworkIdentitySet> activeIfaces, ArrayMap<String, NetworkIdentitySet> activeUidIfaces, - VpnInfo[] vpnArray, long currentTime) { + long currentTime) { mXtSnapshot = xtSnapshot; mUidSnapshot = uidSnapshot; mActiveIfaces = activeIfaces; mActiveUidIfaces = activeUidIfaces; - mVpnArray = vpnArray; mCurrentTime = currentTime; } } diff --git a/services/core/java/com/android/server/net/NetworkStatsRecorder.java b/services/core/java/com/android/server/net/NetworkStatsRecorder.java index a2e7e0cae96b..06ec341d9e46 100644 --- a/services/core/java/com/android/server/net/NetworkStatsRecorder.java +++ b/services/core/java/com/android/server/net/NetworkStatsRecorder.java @@ -23,7 +23,6 @@ import static android.text.format.DateUtils.YEAR_IN_MILLIS; import static com.android.internal.util.Preconditions.checkNotNull; -import android.annotation.Nullable; import android.net.NetworkStats; import android.net.NetworkStats.NonMonotonicObserver; import android.net.NetworkStatsHistory; @@ -37,14 +36,13 @@ import android.util.MathUtils; import android.util.Slog; import android.util.proto.ProtoOutputStream; -import com.android.internal.net.VpnInfo; import com.android.internal.util.FileRotator; import com.android.internal.util.IndentingPrintWriter; -import libcore.io.IoUtils; - import com.google.android.collect.Sets; +import libcore.io.IoUtils; + import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.File; @@ -202,18 +200,12 @@ public class NetworkStatsRecorder { } /** - * Record any delta that occurred since last {@link NetworkStats} snapshot, - * using the given {@link Map} to identify network interfaces. First - * snapshot is considered bootstrap, and is not counted as delta. - * - * @param vpnArray Optional info about the currently active VPN, if any. This is used to - * redistribute traffic from the VPN app to the underlying responsible apps. - * This should always be set to null if the provided snapshot is aggregated - * across all UIDs (e.g. contains UID_ALL buckets), regardless of VPN state. + * Record any delta that occurred since last {@link NetworkStats} snapshot, using the given + * {@link Map} to identify network interfaces. First snapshot is considered bootstrap, and is + * not counted as delta. */ public void recordSnapshotLocked(NetworkStats snapshot, - Map<String, NetworkIdentitySet> ifaceIdent, @Nullable VpnInfo[] vpnArray, - long currentTimeMillis) { + Map<String, NetworkIdentitySet> ifaceIdent, long currentTimeMillis) { final HashSet<String> unknownIfaces = Sets.newHashSet(); // skip recording when snapshot missing @@ -232,12 +224,6 @@ public class NetworkStatsRecorder { final long end = currentTimeMillis; final long start = end - delta.getElapsedRealtime(); - if (vpnArray != null) { - for (VpnInfo info : vpnArray) { - delta.migrateTun(info.ownerUid, info.vpnIface, info.primaryUnderlyingIface); - } - } - NetworkStats.Entry entry = null; for (int i = 0; i < delta.size(); i++) { entry = delta.getValues(i, entry); diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java index e0692f698bc6..d1b5534e3777 100644 --- a/services/core/java/com/android/server/net/NetworkStatsService.java +++ b/services/core/java/com/android/server/net/NetworkStatsService.java @@ -131,7 +131,6 @@ import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.net.VpnInfo; import com.android.internal.util.ArrayUtils; import com.android.internal.util.DumpUtils; import com.android.internal.util.FileRotator; @@ -267,10 +266,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub { @GuardedBy("mStatsLock") private Network[] mDefaultNetworks = new Network[0]; - /** Set containing info about active VPNs and their underlying networks. */ - @GuardedBy("mStatsLock") - private VpnInfo[] mVpnInfos = new VpnInfo[0]; - private final DropBoxNonMonotonicObserver mNonMonotonicObserver = new DropBoxNonMonotonicObserver(); @@ -864,7 +859,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub { @Override public void forceUpdateIfaces( Network[] defaultNetworks, - VpnInfo[] vpnArray, NetworkState[] networkStates, String activeIface) { checkNetworkStackPermission(mContext); @@ -872,7 +866,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { final long token = Binder.clearCallingIdentity(); try { - updateIfaces(defaultNetworks, vpnArray, networkStates, activeIface); + updateIfaces(defaultNetworks, networkStates, activeIface); } finally { Binder.restoreCallingIdentity(token); } @@ -1138,13 +1132,11 @@ public class NetworkStatsService extends INetworkStatsService.Stub { private void updateIfaces( Network[] defaultNetworks, - VpnInfo[] vpnArray, NetworkState[] networkStates, String activeIface) { synchronized (mStatsLock) { mWakeLock.acquire(); try { - mVpnInfos = vpnArray; mActiveIface = activeIface; updateIfacesLocked(defaultNetworks, networkStates); } finally { @@ -1154,10 +1146,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } /** - * Inspect all current {@link NetworkState} to derive mapping from {@code - * iface} to {@link NetworkStatsHistory}. When multiple {@link NetworkInfo} - * are active on a single {@code iface}, they are combined under a single - * {@link NetworkIdentitySet}. + * Inspect all current {@link NetworkState} to derive mapping from {@code iface} to {@link + * NetworkStatsHistory}. When multiple {@link NetworkInfo} are active on a single {@code iface}, + * they are combined under a single {@link NetworkIdentitySet}. */ @GuardedBy("mStatsLock") private void updateIfacesLocked(Network[] defaultNetworks, NetworkState[] states) { @@ -1282,27 +1273,24 @@ public class NetworkStatsService extends INetworkStatsService.Stub { // For xt/dev, we pass a null VPN array because usage is aggregated by UID, so VPN traffic // can't be reattributed to responsible apps. Trace.traceBegin(TRACE_TAG_NETWORK, "recordDev"); - mDevRecorder.recordSnapshotLocked( - devSnapshot, mActiveIfaces, null /* vpnArray */, currentTime); + mDevRecorder.recordSnapshotLocked(devSnapshot, mActiveIfaces, currentTime); Trace.traceEnd(TRACE_TAG_NETWORK); Trace.traceBegin(TRACE_TAG_NETWORK, "recordXt"); - mXtRecorder.recordSnapshotLocked( - xtSnapshot, mActiveIfaces, null /* vpnArray */, currentTime); + mXtRecorder.recordSnapshotLocked(xtSnapshot, mActiveIfaces, currentTime); Trace.traceEnd(TRACE_TAG_NETWORK); // For per-UID stats, pass the VPN info so VPN traffic is reattributed to responsible apps. - VpnInfo[] vpnArray = mVpnInfos; Trace.traceBegin(TRACE_TAG_NETWORK, "recordUid"); - mUidRecorder.recordSnapshotLocked(uidSnapshot, mActiveUidIfaces, vpnArray, currentTime); + mUidRecorder.recordSnapshotLocked(uidSnapshot, mActiveUidIfaces, currentTime); Trace.traceEnd(TRACE_TAG_NETWORK); Trace.traceBegin(TRACE_TAG_NETWORK, "recordUidTag"); - mUidTagRecorder.recordSnapshotLocked(uidSnapshot, mActiveUidIfaces, vpnArray, currentTime); + mUidTagRecorder.recordSnapshotLocked(uidSnapshot, mActiveUidIfaces, currentTime); Trace.traceEnd(TRACE_TAG_NETWORK); // We need to make copies of member fields that are sent to the observer to avoid // a race condition between the service handler thread and the observer's mStatsObservers.updateStats(xtSnapshot, uidSnapshot, new ArrayMap<>(mActiveIfaces), - new ArrayMap<>(mActiveUidIfaces), vpnArray, currentTime); + new ArrayMap<>(mActiveUidIfaces), currentTime); } /** @@ -1675,8 +1663,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub { */ private NetworkStats getNetworkStatsUidDetail(String[] ifaces) throws RemoteException { - - // TODO: remove 464xlat adjustments from NetworkStatsFactory and apply all at once here. final NetworkStats uidSnapshot = mNetworkManager.getNetworkStatsUidDetail(UID_ALL, ifaces); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index bd198dd74af7..d358f9a1a553 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -397,7 +397,7 @@ public class NotificationManagerService extends SystemService { // for enabling and disabling notification pulse behavior boolean mScreenOn = true; - protected boolean mInCall = false; + protected boolean mInCallStateOffHook = false; boolean mNotificationPulseEnabled; private Uri mInCallNotificationUri; @@ -1292,7 +1292,7 @@ public class NotificationManagerService extends SystemService { mScreenOn = false; updateNotificationPulse(); } else if (action.equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) { - mInCall = TelephonyManager.EXTRA_STATE_OFFHOOK + mInCallStateOffHook = TelephonyManager.EXTRA_STATE_OFFHOOK .equals(intent.getStringExtra(TelephonyManager.EXTRA_STATE)); updateNotificationPulse(); } else if (action.equals(Intent.ACTION_USER_STOPPED)) { @@ -5710,7 +5710,7 @@ public class NotificationManagerService extends SystemService { } if (DBG) Slog.v(TAG, "Interrupting!"); if (hasValidSound) { - if (mInCall) { + if (isInCall()) { playInCallNotification(); beep = true; } else { @@ -5724,7 +5724,7 @@ public class NotificationManagerService extends SystemService { final boolean ringerModeSilent = mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT; - if (!mInCall && hasValidVibrate && !ringerModeSilent) { + if (!isInCall() && hasValidVibrate && !ringerModeSilent) { buzz = playVibration(record, vibration, hasValidSound); if(buzz) { mVibrateNotificationKey = key; @@ -5812,7 +5812,7 @@ public class NotificationManagerService extends SystemService { return false; } // not if in call or the screen's on - if (mInCall || mScreenOn) { + if (isInCall() || mScreenOn) { return false; } @@ -6913,7 +6913,7 @@ public class NotificationManagerService extends SystemService { } // Don't flash while we are in a call or screen is on - if (ledNotification == null || mInCall || mScreenOn) { + if (ledNotification == null || isInCall() || mScreenOn) { mNotificationLight.turnOff(); } else { NotificationRecord.Light light = ledNotification.getLight(); @@ -7381,6 +7381,18 @@ public class NotificationManagerService extends SystemService { } } + private boolean isInCall() { + if (mInCallStateOffHook) { + return true; + } + int audioMode = mAudioManager.getMode(); + if (audioMode == AudioManager.MODE_IN_CALL + || audioMode == AudioManager.MODE_IN_COMMUNICATION) { + return true; + } + return false; + } + public class NotificationAssistants extends ManagedServices { static final String TAG_ENABLED_NOTIFICATION_ASSISTANTS = "enabled_assistants"; diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java index c2e559a8a96b..3c2169a446a1 100644 --- a/services/core/java/com/android/server/notification/NotificationRecord.java +++ b/services/core/java/com/android/server/notification/NotificationRecord.java @@ -34,11 +34,8 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManagerInternal; -import android.content.res.Resources; import android.graphics.Bitmap; -import android.graphics.drawable.Icon; import android.media.AudioAttributes; import android.media.AudioSystem; import android.metrics.LogMaker; @@ -453,16 +450,11 @@ public final class NotificationRecord { void dump(PrintWriter pw, String prefix, Context baseContext, boolean redact) { final Notification notification = sbn.getNotification(); - final Icon icon = notification.getSmallIcon(); - String iconStr = String.valueOf(icon); - if (icon != null && icon.getType() == Icon.TYPE_RESOURCE) { - iconStr += " / " + idDebugString(baseContext, icon.getResPackage(), icon.getResId()); - } pw.println(prefix + this); prefix = prefix + " "; pw.println(prefix + "uid=" + sbn.getUid() + " userId=" + sbn.getUserId()); pw.println(prefix + "opPkg=" + sbn.getOpPkg()); - pw.println(prefix + "icon=" + iconStr); + pw.println(prefix + "icon=" + notification.getSmallIcon()); pw.println(prefix + "flags=0x" + Integer.toHexString(notification.flags)); pw.println(prefix + "pri=" + notification.priority); pw.println(prefix + "key=" + sbn.getKey()); @@ -592,28 +584,6 @@ public final class NotificationRecord { pw.println(prefix + "mAdjustments=" + mAdjustments); } - - static String idDebugString(Context baseContext, String packageName, int id) { - Context c; - - if (packageName != null) { - try { - c = baseContext.createPackageContext(packageName, 0); - } catch (NameNotFoundException e) { - c = baseContext; - } - } else { - c = baseContext; - } - - Resources r = c.getResources(); - try { - return r.getResourceName(id); - } catch (Resources.NotFoundException e) { - return "<name unknown>"; - } - } - @Override public final String toString() { return String.format( diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index d60fa2e5c110..7cbf919b3d00 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -17037,11 +17037,6 @@ public class PackageManagerService extends IPackageManager.Stub commitPackagesLocked(commitRequest); success = true; } finally { - for (PrepareResult result : prepareResults.values()) { - if (result.freezer != null) { - result.freezer.close(); - } - } Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); } } @@ -19867,6 +19862,9 @@ public class PackageManagerService extends IPackageManager.Stub } }; + final AppOpsManager appOpsManager = mContext.getSystemService(AppOpsManager.class); + final int uid = UserHandle.getUid(userId, ps.pkg.applicationInfo.uid); + final int permissionCount = ps.pkg.requestedPermissions.size(); for (int i = 0; i < permissionCount; i++) { final String permName = ps.pkg.requestedPermissions.get(i); @@ -19926,6 +19924,14 @@ public class PackageManagerService extends IPackageManager.Stub if ((oldFlags & FLAG_PERMISSION_GRANTED_BY_DEFAULT) != 0) { mPermissionManager.grantRuntimePermission(permName, packageName, false, Process.SYSTEM_UID, userId, delayingPermCallback); + // Allow app op later as we are holding mPackages + // PermissionPolicyService will handle the app op for foreground/background + // permissions. + String appOp = AppOpsManager.permissionToOp(permName); + if (appOp != null) { + mHandler.post(() -> appOpsManager.setUidMode(appOp, uid, + AppOpsManager.MODE_ALLOWED)); + } // If permission review is enabled the permissions for a legacy apps // are represented as constantly granted runtime ones, so don't revoke. } else if ((flags & FLAG_PERMISSION_REVIEW_REQUIRED) == 0) { diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index 8884821c770e..899f8022dc8d 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -2098,7 +2098,8 @@ public class PermissionManagerService { final PackageParser.Package pkg = mPackageManagerInt.getPackage(packageName); if (pkg == null || pkg.mExtras == null) { - throw new IllegalArgumentException("Unknown package: " + packageName); + Log.e(TAG, "Unknown package: " + packageName); + return; } final BasePermission bp; synchronized(mLock) { @@ -2239,7 +2240,8 @@ public class PermissionManagerService { final PackageParser.Package pkg = mPackageManagerInt.getPackage(packageName); if (pkg == null || pkg.mExtras == null) { - throw new IllegalArgumentException("Unknown package: " + packageName); + Log.e(TAG, "Unknown package: " + packageName); + return; } if (mPackageManagerInt.filterAppAccess(pkg, Binder.getCallingUid(), userId)) { throw new IllegalArgumentException("Unknown package: " + packageName); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index da87b2f1994b..eba4fb63bfc6 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2517,14 +2517,21 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public Animation createHiddenByKeyguardExit(boolean onWallpaper, - boolean goingToNotificationShade) { + boolean goingToNotificationShade, boolean subtleAnimation) { if (goingToNotificationShade) { return AnimationUtils.loadAnimation(mContext, R.anim.lock_screen_behind_enter_fade_in); } - AnimationSet set = (AnimationSet) AnimationUtils.loadAnimation(mContext, onWallpaper ? - R.anim.lock_screen_behind_enter_wallpaper : - R.anim.lock_screen_behind_enter); + final int resource; + if (subtleAnimation) { + resource = R.anim.lock_screen_behind_enter_subtle; + } else if (onWallpaper) { + resource = R.anim.lock_screen_behind_enter_wallpaper; + } else { + resource = R.anim.lock_screen_behind_enter; + } + + AnimationSet set = (AnimationSet) AnimationUtils.loadAnimation(mContext, resource); // TODO: Use XML interpolators when we have log interpolators available in XML. final List<Animation> animations = set.getAnimations(); diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index b196754796e9..6d9c71096cb0 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -980,7 +980,7 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { * Create and return an animation to re-display a window that was force hidden by Keyguard. */ public Animation createHiddenByKeyguardExit(boolean onWallpaper, - boolean goingToNotificationShade); + boolean goingToNotificationShade, boolean subtleAnimation); /** * Create and return an animation to let the wallpaper disappear after being shown behind diff --git a/services/core/java/com/android/server/power/AttentionDetector.java b/services/core/java/com/android/server/power/AttentionDetector.java index ed11fd45ec39..4e9b724f528d 100644 --- a/services/core/java/com/android/server/power/AttentionDetector.java +++ b/services/core/java/com/android/server/power/AttentionDetector.java @@ -40,6 +40,7 @@ import android.util.StatsLog; import com.android.internal.annotations.VisibleForTesting; import com.android.server.LocalServices; +import com.android.server.wm.WindowManagerInternal; import java.io.PrintWriter; import java.util.concurrent.atomic.AtomicBoolean; @@ -102,6 +103,9 @@ public class AttentionDetector { protected AttentionManagerInternal mAttentionManager; @VisibleForTesting + protected WindowManagerInternal mWindowManager; + + @VisibleForTesting protected PackageManager mPackageManager; @VisibleForTesting @@ -142,6 +146,7 @@ public class AttentionDetector { mPackageManager = context.getPackageManager(); mContentResolver = context.getContentResolver(); mAttentionManager = LocalServices.getService(AttentionManagerInternal.class); + mWindowManager = LocalServices.getService(WindowManagerInternal.class); mMaximumExtensionMillis = context.getResources().getInteger( com.android.internal.R.integer.config_attentionMaximumExtension); mMaxAttentionApiTimeoutMillis = context.getResources().getInteger( @@ -156,7 +161,7 @@ public class AttentionDetector { context.getContentResolver().registerContentObserver(Settings.System.getUriFor( Settings.System.ADAPTIVE_SLEEP), - false, new ContentObserver(new Handler()) { + false, new ContentObserver(new Handler(context.getMainLooper())) { @Override public void onChange(boolean selfChange) { updateEnabledFromSettings(context); @@ -165,14 +170,10 @@ public class AttentionDetector { } public long updateUserActivity(long nextScreenDimming) { - if (nextScreenDimming == mLastActedOnNextScreenDimming) { - return nextScreenDimming; - } - if (!mIsSettingEnabled) { - return nextScreenDimming; - } - - if (!isAttentionServiceSupported()) { + if (nextScreenDimming == mLastActedOnNextScreenDimming + || !mIsSettingEnabled + || !isAttentionServiceSupported() + || mWindowManager.isKeyguardShowingAndNotOccluded()) { return nextScreenDimming; } @@ -297,6 +298,7 @@ public class AttentionDetector { public void dump(PrintWriter pw) { pw.println("AttentionDetector:"); + pw.println(" mIsSettingEnabled=" + mIsSettingEnabled); pw.println(" mMaximumExtensionMillis=" + mMaximumExtensionMillis); pw.println(" mMaxAttentionApiTimeoutMillis=" + mMaxAttentionApiTimeoutMillis); pw.println(" mLastUserActivityTime(excludingAttention)=" + mLastUserActivityTime); diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index cfd3ae6ef594..aa49ba62f48b 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -2724,6 +2724,14 @@ public final class PowerManagerService extends SystemService return true; } } + + if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DOZE + && mDisplayPowerRequest.dozeScreenState == Display.STATE_ON) { + // Although we are in DOZE and would normally allow the device to suspend, + // the doze service has explicitly requested the display to remain in the ON + // state which means we should hold the display suspend blocker. + return true; + } if (mScreenBrightnessBoostInProgress) { return true; } @@ -4858,7 +4866,8 @@ public final class PowerManagerService extends SystemService } } - private final class LocalService extends PowerManagerInternal { + @VisibleForTesting + final class LocalService extends PowerManagerInternal { @Override public void setScreenBrightnessOverrideFromWindowManager(int screenBrightness) { if (screenBrightness < PowerManager.BRIGHTNESS_DEFAULT diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java index c6a1867fa1e9..d66803b2cbe9 100644 --- a/services/core/java/com/android/server/role/RoleManagerService.java +++ b/services/core/java/com/android/server/role/RoleManagerService.java @@ -225,9 +225,10 @@ public class RoleManagerService extends SystemService implements RoleUserState.C //TODO gradually add more role migrations statements here for remaining roles // Make sure to implement LegacyRoleResolutionPolicy#getRoleHolders // for a given role before adding a migration statement for it here - migrateRoleIfNecessary(RoleManager.ROLE_SMS, userId); migrateRoleIfNecessary(RoleManager.ROLE_ASSISTANT, userId); + migrateRoleIfNecessary(RoleManager.ROLE_BROWSER, userId); migrateRoleIfNecessary(RoleManager.ROLE_DIALER, userId); + migrateRoleIfNecessary(RoleManager.ROLE_SMS, userId); migrateRoleIfNecessary(RoleManager.ROLE_EMERGENCY, userId); // Some vital packages state has changed since last role grant diff --git a/services/core/java/com/android/server/slice/PinnedSliceState.java b/services/core/java/com/android/server/slice/PinnedSliceState.java index e139ab86775d..4970862070bb 100644 --- a/services/core/java/com/android/server/slice/PinnedSliceState.java +++ b/services/core/java/com/android/server/slice/PinnedSliceState.java @@ -188,7 +188,7 @@ public class PinnedSliceState { b.putParcelable(SliceProvider.EXTRA_BIND_URI, mUri); try { client.call(SliceProvider.METHOD_PIN, null, b); - } catch (RemoteException e) { + } catch (Exception e) { Log.w(TAG, "Unable to contact " + mUri, e); } } @@ -201,7 +201,7 @@ public class PinnedSliceState { b.putParcelable(SliceProvider.EXTRA_BIND_URI, mUri); try { client.call(SliceProvider.METHOD_UNPIN, null, b); - } catch (RemoteException e) { + } catch (Exception e) { Log.w(TAG, "Unable to contact " + mUri, e); } } diff --git a/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java b/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java index b12129835ca1..d7f86cd65ae9 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java +++ b/services/core/java/com/android/server/statusbar/StatusBarShellCommand.java @@ -161,7 +161,15 @@ public class StatusBarShellCommand extends ShellCommand { case "statusbar-expansion": info.setStatusBarExpansionDisabled(true); break; - + case "system-icons": + info.setSystemIconsDisabled(true); + break; + case "clock": + info.setClockDisabled(true); + break; + case "notification-icons": + info.setNotificationIconsDisabled(true); + break; default: break; } @@ -221,6 +229,9 @@ public class StatusBarShellCommand extends ShellCommand { pw.println(" recents - disable recents/overview"); pw.println(" notification-peek - disable notification peeking"); pw.println(" statusbar-expansion - disable status bar expansion"); + pw.println(" system-icons - disable system icons appearing in status bar"); + pw.println(" clock - disable clock appearing in status bar"); + pw.println(" notification-icons - disable notification icons from status bar"); pw.println(""); } diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java index b6a5be807fb6..4cfc1d1df2ae 100644 --- a/services/core/java/com/android/server/wm/AccessibilityController.java +++ b/services/core/java/com/android/server/wm/AccessibilityController.java @@ -1065,8 +1065,6 @@ final class AccessibilityController { private final long mRecurringAccessibilityEventsIntervalMillis; - private int mTempLayer = 0; - public WindowsForAccessibilityObserver(WindowManagerService windowManagerService, WindowsForAccessibilityCallback callback) { mContext = windowManagerService.mContext; @@ -1091,7 +1089,7 @@ final class AccessibilityController { } /** - * Check if windows have changed, and send them to the accessibilty subsystem if they have. + * Check if windows have changed, and send them to the accessibility subsystem if they have. * * @param forceSend Send the windows the accessibility even if they haven't changed. */ @@ -1108,8 +1106,7 @@ final class AccessibilityController { // the window manager is still looking for where to put it. // We will do the work when we get a focus change callback. // TODO(b/112273690): Support multiple displays - // TODO(b/129098348): Support embedded displays - if (mService.getDefaultDisplayContentLocked().mCurrentFocus == null) { + if (!isCurrentFocusWindowOnDefaultDisplay()) { return; } @@ -1395,21 +1392,35 @@ final class AccessibilityController { } private void populateVisibleWindowsOnScreenLocked(SparseArray<WindowState> outWindows) { + final List<WindowState> tempWindowStatesList = new ArrayList<>(); final DisplayContent dc = mService.getDefaultDisplayContentLocked(); - mTempLayer = 0; dc.forAllWindows((w) -> { if (w.isVisibleLw()) { - outWindows.put(mTempLayer++, w); + tempWindowStatesList.add(w); } }, false /* traverseTopToBottom */); + // Insert the re-parented windows in another display on top of their parents in + // default display. mService.mRoot.forAllWindows(w -> { - final WindowState win = findRootDisplayParentWindow(w); - if (win != null && win.getDisplayContent().isDefaultDisplay && w.isVisibleLw()) { - // TODO(b/129098348): insert windows on child displays into outWindows based on - // root-display-parent window. - outWindows.put(mTempLayer++, w); + final WindowState parentWindow = findRootDisplayParentWindow(w); + if (parentWindow == null) { + return; } - }, false /* traverseTopToBottom */); + + // TODO: Use Region instead to get rid of this complicated logic. + // Check the tap exclude region of the parent window. If the tap exclude region + // is empty, it means there is another can-receive-pointer-event view on top of + // the region. Hence, we don't count the window as visible. + if (w.isVisibleLw() && parentWindow.getDisplayContent().isDefaultDisplay + && parentWindow.hasTapExcludeRegion() + && tempWindowStatesList.contains(parentWindow)) { + tempWindowStatesList.add( + tempWindowStatesList.lastIndexOf(parentWindow) + 1, w); + } + }, true /* traverseTopToBottom */); + for (int i = 0; i < tempWindowStatesList.size(); i++) { + outWindows.put(i, tempWindowStatesList.get(i)); + } } private WindowState findRootDisplayParentWindow(WindowState win) { @@ -1425,6 +1436,23 @@ final class AccessibilityController { return displayParentWindow; } + private boolean isCurrentFocusWindowOnDefaultDisplay() { + final WindowState focusedWindow = + mService.mRoot.getTopFocusedDisplayContent().mCurrentFocus; + if (focusedWindow == null) { + return false; + } + + final WindowState rootDisplayParentWindow = findRootDisplayParentWindow(focusedWindow); + if (!focusedWindow.isDefaultDisplay() + && (rootDisplayParentWindow == null + || !rootDisplayParentWindow.isDefaultDisplay())) { + return false; + } + + return true; + } + private class MyHandler extends Handler { public static final int MESSAGE_COMPUTE_CHANGED_WINDOWS = 1; diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 371a94356432..64913609a81c 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -921,8 +921,9 @@ final class ActivityRecord extends ConfigurationContainer { return ResolverActivity.class.getName().equals(className); } - boolean isResolverActivity() { - return isResolverActivity(mActivityComponent.getClassName()); + boolean isResolverOrDelegateActivity() { + return isResolverActivity(mActivityComponent.getClassName()) || Objects.equals( + mActivityComponent, mAtmService.mStackSupervisor.getSystemChooserActivity()); } boolean isResolverOrChildActivity() { @@ -1251,7 +1252,8 @@ final class ActivityRecord extends ConfigurationContainer { && intent.getType() == null; } - private boolean canLaunchHomeActivity(int uid, ActivityRecord sourceRecord) { + @VisibleForTesting + boolean canLaunchHomeActivity(int uid, ActivityRecord sourceRecord) { if (uid == Process.myUid() || uid == 0) { // System process can launch home activity. return true; @@ -1261,8 +1263,8 @@ final class ActivityRecord extends ConfigurationContainer { if (recentTasks != null && recentTasks.isCallerRecents(uid)) { return true; } - // Resolver activity can launch home activity. - return sourceRecord != null && sourceRecord.isResolverActivity(); + // Resolver or system chooser activity can launch home activity. + return sourceRecord != null && sourceRecord.isResolverOrDelegateActivity(); } /** @@ -1281,7 +1283,7 @@ final class ActivityRecord extends ConfigurationContainer { ActivityOptions options, ActivityRecord sourceRecord) { int activityType = ACTIVITY_TYPE_UNDEFINED; if ((!componentSpecified || canLaunchHomeActivity(launchedFromUid, sourceRecord)) - && isHomeIntent(intent) && !isResolverActivity()) { + && isHomeIntent(intent) && !isResolverOrDelegateActivity()) { // This sure looks like a home activity! activityType = ACTIVITY_TYPE_HOME; @@ -3165,7 +3167,7 @@ final class ActivityRecord extends ConfigurationContainer { boolean ensureActivityConfiguration(int globalChanges, boolean preserveWindow) { return ensureActivityConfiguration(globalChanges, preserveWindow, - false /* ignoreStopState */); + false /* ignoreVisibility */); } /** @@ -3175,15 +3177,15 @@ final class ActivityRecord extends ConfigurationContainer { * @param globalChanges The changes to the global configuration. * @param preserveWindow If the activity window should be preserved on screen if the activity * is relaunched. - * @param ignoreStopState If we should try to relaunch the activity even if it is in the stopped - * state. This is useful for the case where we know the activity will be - * visible soon and we want to ensure its configuration before we make it - * visible. + * @param ignoreVisibility If we should try to relaunch the activity even if it is invisible + * (stopped state). This is useful for the case where we know the + * activity will be visible soon and we want to ensure its configuration + * before we make it visible. * @return False if the activity was relaunched and true if it wasn't relaunched because we * can't or the app handles the specific configuration that is changing. */ boolean ensureActivityConfiguration(int globalChanges, boolean preserveWindow, - boolean ignoreStopState) { + boolean ignoreVisibility) { final ActivityStack stack = getActivityStack(); if (stack.mConfigWillChange) { if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, @@ -3199,15 +3201,9 @@ final class ActivityRecord extends ConfigurationContainer { return true; } - if (!ignoreStopState && (mState == STOPPING || mState == STOPPED)) { - if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, - "Skipping config check stopped or stopping: " + this); - return true; - } - - if (!shouldBeVisible()) { + if (!ignoreVisibility && (mState == STOPPING || mState == STOPPED || !shouldBeVisible())) { if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, - "Skipping config check invisible stack: " + this); + "Skipping config check invisible: " + this); return true; } diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 6bed46226b42..b33f23cfdf4e 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -40,6 +40,7 @@ import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE; import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN; import static android.view.WindowManager.TRANSIT_CRASHING_ACTIVITY_CLOSE; import static android.view.WindowManager.TRANSIT_NONE; +import static android.view.WindowManager.TRANSIT_SHOW_SINGLE_TASK_DISPLAY; import static android.view.WindowManager.TRANSIT_TASK_CLOSE; import static android.view.WindowManager.TRANSIT_TASK_OPEN; import static android.view.WindowManager.TRANSIT_TASK_OPEN_BEHIND; @@ -163,6 +164,8 @@ import com.android.server.am.AppTimeTracker; import com.android.server.am.EventLogTags; import com.android.server.am.PendingIntentRecord; +import com.google.android.collect.Sets; + import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.ref.WeakReference; @@ -1879,8 +1882,7 @@ class ActivityStack extends ConfigurationContainer { mRootActivityContainer.ensureActivitiesVisible(resuming, 0, !PRESERVE_WINDOWS); } - private void addToStopping(ActivityRecord r, boolean scheduleIdle, boolean idleDelayed, - String reason) { + void addToStopping(ActivityRecord r, boolean scheduleIdle, boolean idleDelayed, String reason) { if (!mStackSupervisor.mStoppingActivities.contains(r)) { EventLog.writeEvent(EventLogTags.AM_ADD_TO_STOPPING, r.mUserId, System.identityHashCode(r), r.shortComponentName, reason); @@ -2175,7 +2177,7 @@ class ActivityStack extends ConfigurationContainer { // sure it matches the current configuration. if (r != starting && notifyClients) { r.ensureActivityConfiguration(0 /* globalChanges */, preserveWindows, - true /* ignoreStopState */); + true /* ignoreVisibility */); } if (!r.attachedToProcess()) { @@ -3138,8 +3140,10 @@ class ActivityStack extends ConfigurationContainer { boolean newTask, boolean keepCurTransition, ActivityOptions options) { TaskRecord rTask = r.getTaskRecord(); final int taskId = rTask.taskId; + final boolean allowMoveToFront = options == null || !options.getAvoidMoveToFront(); // mLaunchTaskBehind tasks get placed at the back of the task stack. - if (!r.mLaunchTaskBehind && (taskForIdLocked(taskId) == null || newTask)) { + if (!r.mLaunchTaskBehind && allowMoveToFront + && (taskForIdLocked(taskId) == null || newTask)) { // Last activity in task had been removed or ActivityManagerService is reusing task. // Insert or replace. // Might not even be in. @@ -3198,7 +3202,9 @@ class ActivityStack extends ConfigurationContainer { task.setFrontOfTask(); - if (!isHomeOrRecentsStack() || numActivities() > 0) { + // The transition animation and starting window are not needed if {@code allowMoveToFront} + // is false, because the activity won't be visible. + if ((!isHomeOrRecentsStack() || numActivities() > 0) && allowMoveToFront) { final DisplayContent dc = getDisplay().mDisplayContent; if (DEBUG_TRANSITION) Slog.v(TAG_TRANSITION, "Prepare open transition: starting " + r); @@ -3210,6 +3216,8 @@ class ActivityStack extends ConfigurationContainer { if (newTask) { if (r.mLaunchTaskBehind) { transit = TRANSIT_TASK_OPEN_BEHIND; + } else if (getDisplay().isSingleTaskInstance()) { + transit = TRANSIT_SHOW_SINGLE_TASK_DISPLAY; } else { // If a new task is being launched, then mark the existing top activity as // supporting picture-in-picture while pausing only if the starting activity @@ -4019,6 +4027,14 @@ class ActivityStack extends ConfigurationContainer { } getDisplay().mDisplayContent.prepareAppTransition(transit, false); + // When finishing the activity pre-emptively take the snapshot before the app window + // is marked as hidden and any configuration changes take place + if (mWindowManager.mTaskSnapshotController != null) { + final ArraySet<Task> tasks = Sets.newArraySet(task.mTask); + mWindowManager.mTaskSnapshotController.snapshotTasks(tasks); + mWindowManager.mTaskSnapshotController.addSkipClosingAppSnapshotTasks(tasks); + } + // Tell window manager to prepare for this one to be removed. r.setVisibility(false); diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java index 19916bc617f4..3550ebf9a03f 100644 --- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java @@ -130,6 +130,7 @@ import android.util.Slog; import android.util.SparseArray; import android.util.SparseIntArray; +import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.content.ReferrerIntent; @@ -323,6 +324,12 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { boolean mUserLeaving = false; /** + * The system chooser activity which worked as a delegate of + * {@link com.android.internal.app.ResolverActivity}. + */ + private ComponentName mSystemChooserActivity; + + /** * We don't want to allow the device to go to sleep while in the process * of launching an activity. This is primarily to allow alarm intent * receivers to launch an activity and get that to run before the device @@ -469,6 +476,14 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { return mKeyguardController; } + ComponentName getSystemChooserActivity() { + if (mSystemChooserActivity == null) { + mSystemChooserActivity = ComponentName.unflattenFromString( + mService.mContext.getResources().getString(R.string.config_chooserActivity)); + } + return mSystemChooserActivity; + } + void setRecentTasks(RecentTasks recentTasks) { mRecentTasks = recentTasks; mRecentTasks.registerCallback(this); diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 0a88eef86ea8..5a1eed8897b6 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -187,6 +187,7 @@ class ActivityStarter { private boolean mNoAnimation; private boolean mKeepCurTransition; private boolean mAvoidMoveToFront; + private boolean mFrozeTaskList; // We must track when we deliver the new intent since multiple code paths invoke // {@link #deliverNewIntent}. This is due to early returns in the code path. This flag is used @@ -483,6 +484,7 @@ class ActivityStarter { mNoAnimation = starter.mNoAnimation; mKeepCurTransition = starter.mKeepCurTransition; mAvoidMoveToFront = starter.mAvoidMoveToFront; + mFrozeTaskList = starter.mFrozeTaskList; mVoiceSession = starter.mVoiceSession; mVoiceInteractor = starter.mVoiceInteractor; @@ -1093,6 +1095,14 @@ class ActivityStarter { void postStartActivityProcessing(ActivityRecord r, int result, ActivityStack startedActivityStack) { + if (!ActivityManager.isStartResultSuccessful(result)) { + if (mFrozeTaskList) { + // If we specifically froze the task list as part of starting an activity, then + // reset the frozen list state if it failed to start. This is normally otherwise + // called when the freeze-timeout has elapsed. + mSupervisor.mRecentTasks.resetFreezeTaskListReorderingOnTimeout(); + } + } if (ActivityManager.isStartResultFatalError(result)) { return; } @@ -1485,6 +1495,14 @@ class ActivityStarter { mLaunchParams.hasPreferredDisplay() ? mLaunchParams.mPreferredDisplayId : DEFAULT_DISPLAY; + // If requested, freeze the task list + if (mOptions != null && mOptions.freezeRecentTasksReordering() + && mSupervisor.mRecentTasks.isCallerRecents(r.launchedFromUid) + && !mSupervisor.mRecentTasks.isFreezeTaskListReorderingSet()) { + mFrozeTaskList = true; + mSupervisor.mRecentTasks.setFreezeTaskListReordering(); + } + // Do not start home activity if it cannot be launched on preferred display. We are not // doing this in ActivityStackSupervisor#canPlaceEntityOnDisplay because it might // fallback to launch on other displays. @@ -1775,6 +1793,7 @@ class ActivityStarter { mNoAnimation = false; mKeepCurTransition = false; mAvoidMoveToFront = false; + mFrozeTaskList = false; mVoiceSession = null; mVoiceInteractor = null; @@ -1979,8 +1998,8 @@ class ActivityStarter { // Also put noDisplay activities in the source task. These by itself can be placed // in any task/stack, however it could launch other activities like ResolverActivity, // and we want those to stay in the original task. - if ((mStartActivity.isResolverActivity() || mStartActivity.noDisplay) && mSourceRecord != null - && mSourceRecord.inFreeformWindowingMode()) { + if ((mStartActivity.isResolverOrDelegateActivity() || mStartActivity.noDisplay) + && mSourceRecord != null && mSourceRecord.inFreeformWindowingMode()) { mAddingToTask = true; } } @@ -2307,12 +2326,12 @@ class ActivityStarter { // isLockTaskModeViolation fails below. if (mReuseTask == null) { + final boolean toTop = !mLaunchTaskBehind && !mAvoidMoveToFront; final TaskRecord task = mTargetStack.createTaskRecord( mSupervisor.getNextTaskIdForUserLocked(mStartActivity.mUserId), mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info, mNewTaskIntent != null ? mNewTaskIntent : mIntent, mVoiceSession, - mVoiceInteractor, !mLaunchTaskBehind /* toTop */, mStartActivity, mSourceRecord, - mOptions); + mVoiceInteractor, toTop, mStartActivity, mSourceRecord, mOptions); addOrReparentStartingActivity(task, "setTaskFromReuseOrCreateNewTask - mReuseTask"); updateBounds(mStartActivity.getTaskRecord(), mLaunchParams.mBounds); diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java index 5459edeb3d8b..ab35652eb525 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -34,7 +34,6 @@ import android.os.IBinder; import android.os.RemoteException; import android.os.SystemClock; import android.service.voice.IVoiceInteractionSession; -import android.util.Pair; import android.util.SparseIntArray; import android.util.proto.ProtoOutputStream; @@ -189,6 +188,13 @@ public abstract class ActivityTaskManagerInternal { public abstract void notifyDockedStackMinimizedChanged(boolean minimized); /** + * Notify listeners that contents are drawn for the first time on a single task display. + * + * @param displayId An ID of the display on which contents are drawn. + */ + public abstract void notifySingleTaskDisplayDrawn(int displayId); + + /** * Start activity {@code intents} as if {@code packageName} on user {@code userId} did it. * * - DO NOT call it with the calling UID cleared. diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index e2421d6d1a93..8a9dfc7569dc 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -1451,9 +1451,15 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { .execute(); } + /** + * Start the recents activity to perform the recents animation. + * + * @param intent The intent to start the recents activity. + * @param recentsAnimationRunner Pass {@code null} to only preload the activity. + */ @Override - public void startRecentsActivity(Intent intent, IAssistDataReceiver assistDataReceiver, - IRecentsAnimationRunner recentsAnimationRunner) { + public void startRecentsActivity(Intent intent, @Deprecated IAssistDataReceiver unused, + @Nullable IRecentsAnimationRunner recentsAnimationRunner) { enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "startRecentsActivity()"); final int callingPid = Binder.getCallingPid(); final long origId = Binder.clearCallingIdentity(); @@ -1464,9 +1470,13 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { // Start a new recents animation final RecentsAnimation anim = new RecentsAnimation(this, mStackSupervisor, - getActivityStartController(), mWindowManager, callingPid); - anim.startRecentsActivity(intent, recentsAnimationRunner, recentsComponent, - recentsUid, assistDataReceiver); + getActivityStartController(), mWindowManager, intent, recentsComponent, + recentsUid, callingPid); + if (recentsAnimationRunner == null) { + anim.preloadRecentsActivity(); + } else { + anim.startRecentsActivity(recentsAnimationRunner); + } } } finally { Binder.restoreCallingIdentity(origId); @@ -4988,6 +4998,9 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { * - the cmd arg isn't the flattened component name of an existing activity: * dump all activity whose component contains the cmd as a substring * - A hex number of the ActivityRecord object instance. + * <p> + * The caller should not hold lock when calling this method because it will wait for the + * activities to complete the dump. * * @param dumpVisibleStacksOnly dump activity with {@param name} only if in a visible stack * @param dumpFocusedStackOnly dump activity with {@param name} only if in the focused stack @@ -5040,29 +5053,28 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { private void dumpActivity(String prefix, FileDescriptor fd, PrintWriter pw, final ActivityRecord r, String[] args, boolean dumpAll) { String innerPrefix = prefix + " "; + IApplicationThread appThread = null; synchronized (mGlobalLock) { pw.print(prefix); pw.print("ACTIVITY "); pw.print(r.shortComponentName); pw.print(" "); pw.print(Integer.toHexString(System.identityHashCode(r))); pw.print(" pid="); - if (r.hasProcess()) pw.println(r.app.getPid()); - else pw.println("(not running)"); + if (r.hasProcess()) { + pw.println(r.app.getPid()); + appThread = r.app.getThread(); + } else { + pw.println("(not running)"); + } if (dumpAll) { r.dump(pw, innerPrefix); } } - if (r.attachedToProcess()) { + if (appThread != null) { // flush anything that is already in the PrintWriter since the thread is going // to write to the file descriptor directly pw.flush(); - try { - TransferPipe tp = new TransferPipe(); - try { - r.app.getThread().dumpActivity(tp.getWriteFd(), - r.appToken, innerPrefix, args); - tp.go(fd); - } finally { - tp.kill(); - } + try (TransferPipe tp = new TransferPipe()) { + appThread.dumpActivity(tp.getWriteFd(), r.appToken, innerPrefix, args); + tp.go(fd); } catch (IOException e) { pw.println(innerPrefix + "Failure while dumping the activity: " + e); } catch (RemoteException e) { @@ -6100,7 +6112,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } @Override - public void notifyAppTransitionStarting(SparseIntArray reasons, long timestamp) { + public void notifyAppTransitionStarting(SparseIntArray reasons, + long timestamp) { synchronized (mGlobalLock) { mStackSupervisor.getActivityMetricsLogger().notifyTransitionStarting( reasons, timestamp); @@ -6108,6 +6121,11 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } @Override + public void notifySingleTaskDisplayDrawn(int displayId) { + mTaskChangeNotificationController.notifySingleTaskDisplayDrawn(displayId); + } + + @Override public void notifyAppTransitionFinished() { synchronized (mGlobalLock) { mStackSupervisor.notifyAppTransitionDone(); @@ -7165,10 +7183,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { public boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name, String[] args, int opti, boolean dumpAll, boolean dumpVisibleStacksOnly, boolean dumpFocusedStackOnly) { - synchronized (mGlobalLock) { - return ActivityTaskManagerService.this.dumpActivity(fd, pw, name, args, opti, - dumpAll, dumpVisibleStacksOnly, dumpFocusedStackOnly); - } + return ActivityTaskManagerService.this.dumpActivity(fd, pw, name, args, opti, dumpAll, + dumpVisibleStacksOnly, dumpFocusedStackOnly); } @Override diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index e6a83dedded9..557a609dbc7b 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -23,12 +23,14 @@ import static android.view.WindowManager.TRANSIT_ACTIVITY_RELAUNCH; import static android.view.WindowManager.TRANSIT_CRASHING_ACTIVITY_CLOSE; import static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION; +import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE; import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY; import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER; import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE; import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE; import static android.view.WindowManager.TRANSIT_NONE; +import static android.view.WindowManager.TRANSIT_SHOW_SINGLE_TASK_DISPLAY; import static android.view.WindowManager.TRANSIT_TASK_CHANGE_WINDOWING_MODE; import static android.view.WindowManager.TRANSIT_TASK_CLOSE; import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE; @@ -1801,8 +1803,10 @@ public class AppTransition implements Dump { } final boolean toShade = (mNextAppTransitionFlags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0; + final boolean subtle = + (mNextAppTransitionFlags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION) != 0; return mService.mPolicy.createHiddenByKeyguardExit( - transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER, toShade); + transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER, toShade, subtle); } int getAppStackClipMode() { @@ -2080,6 +2084,9 @@ public class AppTransition implements Dump { case TRANSIT_CRASHING_ACTIVITY_CLOSE: { return "TRANSIT_CRASHING_ACTIVITY_CLOSE"; } + case TRANSIT_SHOW_SINGLE_TASK_DISPLAY: { + return "TRANSIT_SHOW_SINGLE_TASK_DISPLAY"; + } default: { return "<UNKNOWN: " + transition + ">"; } diff --git a/services/core/java/com/android/server/wm/AppTransitionController.java b/services/core/java/com/android/server/wm/AppTransitionController.java index d4c4e6a93fa6..d4e95cfb8025 100644 --- a/services/core/java/com/android/server/wm/AppTransitionController.java +++ b/services/core/java/com/android/server/wm/AppTransitionController.java @@ -23,11 +23,13 @@ import static android.view.WindowManager.TRANSIT_ACTIVITY_RELAUNCH; import static android.view.WindowManager.TRANSIT_CRASHING_ACTIVITY_CLOSE; import static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION; +import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER; import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY; import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER; import static android.view.WindowManager.TRANSIT_NONE; +import static android.view.WindowManager.TRANSIT_SHOW_SINGLE_TASK_DISPLAY; import static android.view.WindowManager.TRANSIT_TASK_CLOSE; import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE; import static android.view.WindowManager.TRANSIT_TASK_OPEN; @@ -211,6 +213,12 @@ public class AppTransitionController { mService.mAtmInternal.notifyAppTransitionStarting(mTempTransitionReasons.clone(), SystemClock.uptimeMillis()); + if (transit == TRANSIT_SHOW_SINGLE_TASK_DISPLAY) { + mService.mAnimator.addAfterPrepareSurfacesRunnable(() -> { + mService.mAtmInternal.notifySingleTaskDisplayDrawn(mDisplayContent.getDisplayId()); + }); + } + Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); mDisplayContent.pendingLayoutChanges |= @@ -418,7 +426,8 @@ public class AppTransitionController { private void handleNonAppWindowsInTransition(int transit, int flags) { if (transit == TRANSIT_KEYGUARD_GOING_AWAY) { if ((flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER) != 0 - && (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION) == 0) { + && (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION) == 0 + && (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION) == 0) { Animation anim = mService.mPolicy.createKeyguardWallpaperExit( (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0); if (anim != null) { @@ -430,7 +439,8 @@ public class AppTransitionController { || transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER) { mDisplayContent.startKeyguardExitOnNonAppWindows( transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER, - (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0); + (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0, + (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION) != 0); } } diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index eab5e0dd270e..f1a9e60d18aa 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -206,6 +206,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree boolean removed; // Information about an application starting window if displayed. + // Note: these are de-referenced before the starting window animates away. StartingData mStartingData; WindowState startingWindow; StartingSurface startingSurface; @@ -1243,6 +1244,21 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree return true; } + /** + * @return {@code true} if starting window is in app's hierarchy. + */ + boolean hasStartingWindow() { + if (startingDisplayed || mStartingData != null) { + return true; + } + for (int i = mChildren.size() - 1; i >= 0; i--) { + if (getChildAt(i).mAttrs.type == TYPE_APPLICATION_STARTING) { + return true; + } + } + return false; + } + @Override void addWindow(WindowState w) { super.addWindow(w); @@ -2477,7 +2493,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree // transformed the task. final RecentsAnimationController controller = mWmService.getRecentsAnimationController(); if (controller != null && controller.isAnimatingTask(getTask()) - && controller.shouldCancelWithDeferredScreenshot()) { + && controller.shouldDeferCancelUntilNextTransition()) { return false; } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index b837d9ec874b..885095f248f4 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -2559,6 +2559,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo void removeImmediately() { mRemovingDisplay = true; try { + if (mParentWindow != null) { + mParentWindow.removeEmbeddedDisplayContent(this); + } // Clear all transitions & screen frozen states when removing display. mOpeningApps.clear(); mClosingApps.clear(); @@ -3489,12 +3492,14 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo /** * Starts the Keyguard exit animation on all windows that don't belong to an app token. */ - void startKeyguardExitOnNonAppWindows(boolean onWallpaper, boolean goingToShade) { + void startKeyguardExitOnNonAppWindows(boolean onWallpaper, boolean goingToShade, + boolean subtle) { final WindowManagerPolicy policy = mWmService.mPolicy; forAllWindows(w -> { if (w.mAppToken == null && policy.canBeHiddenByKeyguardLw(w) && w.wouldBeVisibleIfPolicyIgnored() && !w.isVisible()) { - w.startAnimation(policy.createHiddenByKeyguardExit(onWallpaper, goingToShade)); + w.startAnimation(policy.createHiddenByKeyguardExit( + onWallpaper, goingToShade, subtle)); } }, true /* traverseTopToBottom */); } @@ -4840,9 +4845,13 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo // // In the case where we have no IME target we assign it where it's base layer would // place it in the AboveAppWindowContainers. - if (imeTarget != null && !(imeTarget.inSplitScreenWindowingMode() - || imeTarget.mToken.isAppAnimating()) - && (imeTarget.getSurfaceControl() != null)) { + // + // Keep IME window in mAboveAppWindowsContainers as long as app's starting window exists + // so it get's layered above the starting window. + if (imeTarget != null + && !(imeTarget.mAppToken != null && imeTarget.mAppToken.hasStartingWindow()) + && (!(imeTarget.inSplitScreenWindowingMode() || imeTarget.mToken.isAppAnimating()) + && (imeTarget.getSurfaceControl() != null))) { mImeWindowsContainers.assignRelativeLayer(t, imeTarget.getSurfaceControl(), // TODO: We need to use an extra level on the app surface to ensure // this is always above SurfaceView but always below attached window. @@ -5046,6 +5055,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo */ void reparentDisplayContent(WindowState win, SurfaceControl sc) { mParentWindow = win; + mParentWindow.addEmbeddedDisplayContent(this); mParentSurfaceControl = sc; if (mPortalWindowHandle == null) { mPortalWindowHandle = createPortalWindowHandle(sc.toString()); @@ -5076,12 +5086,12 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo throw new IllegalArgumentException( "The given window is not the parent window of this display."); } - if (mLocationInParentWindow.x != x || mLocationInParentWindow.y != y) { - mLocationInParentWindow.x = x; - mLocationInParentWindow.y = y; + if (!mLocationInParentWindow.equals(x, y)) { + mLocationInParentWindow.set(x, y); if (mWmService.mAccessibilityController != null) { mWmService.mAccessibilityController.onSomeWindowResizedOrMovedLocked(); } + notifyLocationInParentDisplayChanged(); } } @@ -5089,6 +5099,30 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo return mLocationInParentWindow; } + Point getLocationInParentDisplay() { + final Point location = new Point(); + if (mParentWindow != null) { + // LocationInParentWindow indicates the offset to (0,0) of window, but what we need is + // the offset to (0,0) of display. + DisplayContent dc = this; + do { + final WindowState displayParent = dc.getParentWindow(); + location.x += displayParent.getFrameLw().left + + (dc.getLocationInParentWindow().x * displayParent.mGlobalScale + 0.5f); + location.y += displayParent.getFrameLw().top + + (dc.getLocationInParentWindow().y * displayParent.mGlobalScale + 0.5f); + dc = displayParent.getDisplayContent(); + } while (dc != null && dc.getParentWindow() != null); + } + return location; + } + + void notifyLocationInParentDisplayChanged() { + forAllWindows(w -> { + w.updateLocationInParentDisplayIfNeeded(); + }, false /* traverseTopToBottom */); + } + @VisibleForTesting SurfaceControl getWindowingLayer() { return mWindowingLayer; diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index 1d76a71aaea1..b1bc21977405 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -569,7 +569,6 @@ public class DockedStackDividerController { mMaximizeMeetFraction = getClipRevealMeetFraction(stack); animDuration = (long) (mAnimationDuration * mMaximizeMeetFraction); } - mService.mAtmInternal.notifyDockedStackMinimizedChanged(minimizedDock); final int size = mDockedStackListeners.beginBroadcast(); for (int i = 0; i < size; ++i) { final IDockedStackListener listener = mDockedStackListeners.getBroadcastItem(i); @@ -581,6 +580,9 @@ public class DockedStackDividerController { } } mDockedStackListeners.finishBroadcast(); + // Only notify ATM after we update the remote listeners, otherwise it may trigger another + // minimize change, which would lead to an inversion of states send to the listeners + mService.mAtmInternal.notifyDockedStackMinimizedChanged(minimizedDock); } void notifyDockSideChanged(int newDockSide) { diff --git a/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java b/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java index c0f53b819125..5726cb2d87d4 100644 --- a/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java +++ b/services/core/java/com/android/server/wm/HighRefreshRateBlacklist.java @@ -16,60 +16,102 @@ package com.android.server.wm; +import static android.provider.DeviceConfig.WindowManager.KEY_HIGH_REFRESH_RATE_BLACKLIST; + import android.annotation.NonNull; -import android.os.SystemProperties; +import android.annotation.Nullable; +import android.content.res.Resources; +import android.provider.DeviceConfig; import android.util.ArraySet; +import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.os.BackgroundThread; + +import java.io.PrintWriter; +import java.util.concurrent.Executor; /** * A Blacklist for packages that should force the display out of high refresh rate. */ class HighRefreshRateBlacklist { - private static final String SYSPROP_KEY = "ro.window_manager.high_refresh_rate_blacklist"; - private static final String SYSPROP_KEY_LENGTH_SUFFIX = "_length"; - private static final String SYSPROP_KEY_ENTRY_SUFFIX = "_entry"; - private static final int MAX_ENTRIES = 50; + private final ArraySet<String> mBlacklistedPackages = new ArraySet<>(); + @NonNull + private final String[] mDefaultBlacklist; + private final Object mLock = new Object(); - private ArraySet<String> mBlacklistedPackages = new ArraySet<>(); - - static HighRefreshRateBlacklist create() { - return new HighRefreshRateBlacklist(new SystemPropertyGetter() { + static HighRefreshRateBlacklist create(@NonNull Resources r) { + return new HighRefreshRateBlacklist(r, new DeviceConfigInterface() { @Override - public int getInt(String key, int def) { - return SystemProperties.getInt(key, def); + public @Nullable String getProperty(@NonNull String namespace, @NonNull String name) { + return DeviceConfig.getProperty(namespace, name); } - - @Override - public String get(String key) { - return SystemProperties.get(key); + public void addOnPropertyChangedListener(@NonNull String namespace, + @NonNull Executor executor, + @NonNull DeviceConfig.OnPropertyChangedListener listener) { + DeviceConfig.addOnPropertyChangedListener(namespace, executor, listener); } }); } @VisibleForTesting - HighRefreshRateBlacklist(SystemPropertyGetter propertyGetter) { + HighRefreshRateBlacklist(Resources r, DeviceConfigInterface deviceConfig) { + mDefaultBlacklist = r.getStringArray(R.array.config_highRefreshRateBlacklist); + deviceConfig.addOnPropertyChangedListener(DeviceConfig.NAMESPACE_WINDOW_MANAGER, + BackgroundThread.getExecutor(), new OnPropertyChangedListener()); + final String property = deviceConfig.getProperty(DeviceConfig.NAMESPACE_WINDOW_MANAGER, + KEY_HIGH_REFRESH_RATE_BLACKLIST); + updateBlacklist(property); + } - // Read and populate the blacklist - final int length = Math.min( - propertyGetter.getInt(SYSPROP_KEY + SYSPROP_KEY_LENGTH_SUFFIX, 0), - MAX_ENTRIES); - for (int i = 1; i <= length; i++) { - final String packageName = propertyGetter.get( - SYSPROP_KEY + SYSPROP_KEY_ENTRY_SUFFIX + i); - if (!packageName.isEmpty()) { - mBlacklistedPackages.add(packageName); + private void updateBlacklist(@Nullable String property) { + synchronized (mLock) { + mBlacklistedPackages.clear(); + if (property != null) { + String[] packages = property.split(","); + for (String pkg : packages) { + String pkgName = pkg.trim(); + if (!pkgName.isEmpty()) { + mBlacklistedPackages.add(pkgName); + } + } + } else { + // If there's no config, or the config has been deleted, fallback to the device's + // default blacklist + for (String pkg : mDefaultBlacklist) { + mBlacklistedPackages.add(pkg); + } } } } boolean isBlacklisted(String packageName) { - return mBlacklistedPackages.contains(packageName); + synchronized (mLock) { + return mBlacklistedPackages.contains(packageName); + } + } + void dump(PrintWriter pw) { + pw.println("High Refresh Rate Blacklist"); + pw.println(" Packages:"); + synchronized (mLock) { + for (String pkg : mBlacklistedPackages) { + pw.println(" " + pkg); + } + } } - interface SystemPropertyGetter { - int getInt(String key, int def); - @NonNull String get(String key); + interface DeviceConfigInterface { + @Nullable String getProperty(@NonNull String namespace, @NonNull String name); + void addOnPropertyChangedListener(@NonNull String namespace, @NonNull Executor executor, + @NonNull DeviceConfig.OnPropertyChangedListener listener); + } + + private class OnPropertyChangedListener implements DeviceConfig.OnPropertyChangedListener { + public void onPropertyChanged(@NonNull String namespace, @NonNull String name, + @Nullable String value) { + updateBlacklist(value); + } } } + diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index 169f03b0023d..ca4749f7b365 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -19,6 +19,7 @@ package com.android.server.wm; import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION; +import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER; import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY; @@ -26,6 +27,7 @@ import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE; import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE; import static android.view.WindowManager.TRANSIT_UNSET; import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS; +import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_SUBTLE_WINDOW_ANIMATIONS; import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_SHADE; import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER; @@ -238,6 +240,9 @@ class KeyguardController { if ((keyguardGoingAwayFlags & KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER) != 0) { result |= TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER; } + if ((keyguardGoingAwayFlags & KEYGUARD_GOING_AWAY_FLAG_SUBTLE_WINDOW_ANIMATIONS) != 0) { + result |= TRANSIT_FLAG_KEYGUARD_GOING_AWAY_SUBTLE_ANIMATION; + } return result; } diff --git a/services/core/java/com/android/server/wm/RecentsAnimation.java b/services/core/java/com/android/server/wm/RecentsAnimation.java index 434239f6ecf7..0a3e7a4860d5 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimation.java +++ b/services/core/java/com/android/server/wm/RecentsAnimation.java @@ -34,7 +34,6 @@ import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_T import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_RECENTS_ANIMATIONS; import android.app.ActivityOptions; -import android.app.IAssistDataReceiver; import android.content.ComponentName; import android.content.Intent; import android.os.RemoteException; @@ -58,7 +57,12 @@ class RecentsAnimation implements RecentsAnimationCallbacks, private final ActivityStartController mActivityStartController; private final WindowManagerService mWindowManager; private final ActivityDisplay mDefaultDisplay; + private final Intent mTargetIntent; + private final ComponentName mRecentsComponent; + private final int mRecentsUid; private final int mCallingPid; + private final int mUserId; + private final int mTargetActivityType; /** * The activity which has been launched behind. We need to remember the activity because the @@ -66,27 +70,90 @@ class RecentsAnimation implements RecentsAnimationCallbacks, * for the exact activity. */ private ActivityRecord mLaunchedTargetActivity; - private int mTargetActivityType; // The stack to restore the target stack behind when the animation is finished private ActivityStack mRestoreTargetBehindStack; RecentsAnimation(ActivityTaskManagerService atm, ActivityStackSupervisor stackSupervisor, ActivityStartController activityStartController, WindowManagerService wm, - int callingPid) { + Intent targetIntent, ComponentName recentsComponent, int recentsUid, int callingPid) { mService = atm; mStackSupervisor = stackSupervisor; mDefaultDisplay = mService.mRootActivityContainer.getDefaultDisplay(); mActivityStartController = activityStartController; mWindowManager = wm; + mTargetIntent = targetIntent; + mRecentsComponent = recentsComponent; + mRecentsUid = recentsUid; mCallingPid = callingPid; + mUserId = atm.getCurrentUserId(); + mTargetActivityType = targetIntent.getComponent() != null + && recentsComponent.equals(targetIntent.getComponent()) + ? ACTIVITY_TYPE_RECENTS + : ACTIVITY_TYPE_HOME; + } + + /** + * Starts the recents activity in background without animation if the record doesn't exist or + * the client isn't launched. If the recents activity is already alive, ensure its configuration + * is updated to the current one. + */ + void preloadRecentsActivity() { + if (DEBUG) Slog.d(TAG, "Preload recents with " + mTargetIntent); + ActivityStack targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED, + mTargetActivityType); + ActivityRecord targetActivity = getTargetActivity(targetStack); + if (targetActivity != null) { + if (targetActivity.visible || targetActivity.isTopRunningActivity()) { + // The activity is ready. + return; + } + if (targetActivity.attachedToProcess()) { + // The activity may be relaunched if it cannot handle the current configuration + // changes. The activity will be paused state if it is relaunched, otherwise it + // keeps the original stopped state. + targetActivity.ensureActivityConfiguration(0 /* globalChanges */, + false /* preserveWindow */, true /* ignoreVisibility */); + if (DEBUG) Slog.d(TAG, "Updated config=" + targetActivity.getConfiguration()); + } + } else { + // Create the activity record. Because the activity is invisible, this doesn't really + // start the client. + startRecentsActivityInBackground("preloadRecents"); + targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED, mTargetActivityType); + targetActivity = getTargetActivity(targetStack); + if (targetActivity == null) { + Slog.w(TAG, "Cannot start " + mTargetIntent); + return; + } + } + + if (!targetActivity.attachedToProcess()) { + if (DEBUG) Slog.d(TAG, "Real start recents"); + mStackSupervisor.startSpecificActivityLocked(targetActivity, false /* andResume */, + false /* checkConfig */); + // Make sure the activity won't be involved in transition. + if (targetActivity.mAppWindowToken != null) { + targetActivity.mAppWindowToken.getDisplayContent().mUnknownAppVisibilityController + .appRemovedOrHidden(targetActivity.mAppWindowToken); + } + } + + // Invisible activity should be stopped. If the recents activity is alive and its doesn't + // need to relaunch by current configuration, then it may be already in stopped state. + if (!targetActivity.isState(ActivityStack.ActivityState.STOPPING, + ActivityStack.ActivityState.STOPPED)) { + // Add to stopping instead of stop immediately. So the client has the chance to perform + // traversal in non-stopped state (ViewRootImpl.mStopped) that would initialize more + // things (e.g. the measure can be done earlier). The actual stop will be performed when + // it reports idle. + targetStack.addToStopping(targetActivity, true /* scheduleIdle */, + true /* idleDelayed */, "preloadRecents"); + } } - void startRecentsActivity(Intent intent, IRecentsAnimationRunner recentsAnimationRunner, - ComponentName recentsComponent, int recentsUid, - @Deprecated IAssistDataReceiver assistDataReceiver) { - if (DEBUG) Slog.d(TAG, "startRecentsActivity(): intent=" + intent - + " assistDataReceiver=" + assistDataReceiver); + void startRecentsActivity(IRecentsAnimationRunner recentsAnimationRunner) { + if (DEBUG) Slog.d(TAG, "startRecentsActivity(): intent=" + mTargetIntent); Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "RecentsAnimation#startRecentsActivity"); // TODO(multi-display) currently only support recents animation in default display. @@ -100,15 +167,9 @@ class RecentsAnimation implements RecentsAnimationCallbacks, } // If the activity is associated with the recents stack, then try and get that first - final int userId = mService.getCurrentUserId(); - mTargetActivityType = intent.getComponent() != null - && recentsComponent.equals(intent.getComponent()) - ? ACTIVITY_TYPE_RECENTS - : ACTIVITY_TYPE_HOME; ActivityStack targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED, mTargetActivityType); - ActivityRecord targetActivity = getTargetActivity(targetStack, intent.getComponent(), - userId); + ActivityRecord targetActivity = getTargetActivity(targetStack); final boolean hasExistingActivity = targetActivity != null; if (hasExistingActivity) { final ActivityDisplay display = targetActivity.getDisplay(); @@ -127,7 +188,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks, true /* forceSend */, targetActivity); } - mStackSupervisor.getActivityMetricsLogger().notifyActivityLaunching(intent); + mStackSupervisor.getActivityMetricsLogger().notifyActivityLaunching(mTargetIntent); mService.mH.post(() -> mService.mAmInternal.setRunningRemoteAnimation(mCallingPid, true)); @@ -148,23 +209,12 @@ class RecentsAnimation implements RecentsAnimationCallbacks, } } else { // No recents activity, create the new recents activity bottom most - ActivityOptions options = ActivityOptions.makeBasic(); - options.setLaunchActivityType(mTargetActivityType); - options.setAvoidMoveToFront(); - intent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_NO_ANIMATION); - - mActivityStartController - .obtainStarter(intent, "startRecentsActivity_noTargetActivity") - .setCallingUid(recentsUid) - .setCallingPackage(recentsComponent.getPackageName()) - .setActivityOptions(SafeActivityOptions.fromBundle(options.toBundle())) - .setMayWait(userId) - .execute(); + startRecentsActivityInBackground("startRecentsActivity_noTargetActivity"); // Move the recents activity into place for the animation targetStack = mDefaultDisplay.getStack(WINDOWING_MODE_UNDEFINED, mTargetActivityType); - targetActivity = getTargetActivity(targetStack, intent.getComponent(), userId); + targetActivity = getTargetActivity(targetStack); mDefaultDisplay.moveStackBehindBottomMostVisibleStack(targetStack); if (DEBUG) { Slog.d(TAG, "Moved stack=" + targetStack + " behind stack=" @@ -176,7 +226,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks, // TODO: Maybe wait for app to draw in this particular case? - if (DEBUG) Slog.d(TAG, "Started intent=" + intent); + if (DEBUG) Slog.d(TAG, "Started intent=" + mTargetIntent); } // Mark the target activity as launch-behind to bump its visibility for the @@ -305,7 +355,7 @@ class RecentsAnimation implements RecentsAnimationCallbacks, // launch-behind state is restored. That also prevents the next transition // type being disturbed if the visibility is updated after setting the next // transition (the target activity will be one of closing apps). - if (!controller.shouldCancelWithDeferredScreenshot() + if (!controller.shouldDeferCancelWithScreenshot() && !targetStack.isFocusedStackOnDisplay()) { targetStack.ensureActivitiesVisibleLocked(null /* starting */, 0 /* starting */, false /* preserveWindows */); @@ -365,16 +415,18 @@ class RecentsAnimation implements RecentsAnimationCallbacks, final DisplayContent dc = mService.mRootActivityContainer.getDefaultDisplay().mDisplayContent; dc.mBoundsAnimationController.setAnimationType( - controller.shouldCancelWithDeferredScreenshot() ? FADE_IN : BOUNDS); + controller.shouldDeferCancelUntilNextTransition() ? FADE_IN : BOUNDS); - // Cancel running recents animation and screenshot previous task when the next - // transition starts in below cases: - // 1) The next launching task is not in recents animation task. + // We defer canceling the recents animation until the next app transition in the following + // cases: + // 1) The next launching task is not being animated by the recents animation // 2) The next task is home activity. (i.e. pressing home key to back home in recents). if ((!controller.isAnimatingTask(stack.getTaskStack().getTopChild()) || controller.isTargetApp(stack.getTopActivity().mAppWindowToken)) - && controller.shouldCancelWithDeferredScreenshot()) { - controller.cancelOnNextTransitionStart(); + && controller.shouldDeferCancelUntilNextTransition()) { + // Always prepare an app transition since we rely on the transition callbacks to cleanup + mWindowManager.prepareAppTransition(TRANSIT_NONE, false); + controller.setCancelOnNextTransitionStart(); } else { // Just cancel directly to unleash from launcher when the next launching task is the // current top task. @@ -383,6 +435,21 @@ class RecentsAnimation implements RecentsAnimationCallbacks, } } + private void startRecentsActivityInBackground(String reason) { + final ActivityOptions options = ActivityOptions.makeBasic(); + options.setLaunchActivityType(mTargetActivityType); + options.setAvoidMoveToFront(); + mTargetIntent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_NO_ANIMATION); + + mActivityStartController + .obtainStarter(mTargetIntent, reason) + .setCallingUid(mRecentsUid) + .setCallingPackage(mRecentsComponent.getPackageName()) + .setActivityOptions(new SafeActivityOptions(options)) + .setMayWait(mUserId) + .execute(); + } + /** * Called only when the animation should be canceled prior to starting. */ @@ -412,15 +479,15 @@ class RecentsAnimation implements RecentsAnimationCallbacks, * @return the top activity in the {@param targetStack} matching the {@param component}, or just * the top activity of the top task if no task matches the component. */ - private ActivityRecord getTargetActivity(ActivityStack targetStack, ComponentName component, - int userId) { + private ActivityRecord getTargetActivity(ActivityStack targetStack) { if (targetStack == null) { return null; } for (int i = targetStack.getChildCount() - 1; i >= 0; i--) { final TaskRecord task = targetStack.getChildAt(i); - if (task.userId == userId && task.getBaseIntent().getComponent().equals(component)) { + if (task.userId == mUserId + && task.getBaseIntent().getComponent().equals(mTargetIntent.getComponent())) { return task.getTopActivity(); } } diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index c03dabe660ad..a8b00838577f 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -96,10 +96,9 @@ public class RecentsAnimationController implements DeathRecipient { private final Runnable mFailsafeRunnable = () -> cancelAnimation(REORDER_MOVE_TO_ORIGINAL_POSITION, "failSafeRunnable"); - final Object mLock = new Object(); - // The recents component app token that is shown behind the visibile tasks private AppWindowToken mTargetAppToken; + private DisplayContent mDisplayContent; private int mTargetActivityType; private Rect mMinimizedHomeBounds = new Rect(); @@ -123,25 +122,47 @@ public class RecentsAnimationController implements DeathRecipient { private boolean mLinkedToDeathOfRunner; - private boolean mCancelWithDeferredScreenshot; - + // Whether to try to defer canceling from a stack order change until the next transition + private boolean mRequestDeferCancelUntilNextTransition; + // Whether to actually defer canceling until the next transition private boolean mCancelOnNextTransitionStart; + // Whether to take a screenshot when handling a deferred cancel + private boolean mCancelDeferredWithScreenshot; /** * Animates the screenshot of task that used to be controlled by RecentsAnimation. - * @see {@link #cancelOnNextTransitionStart} + * @see {@link #setCancelOnNextTransitionStart} */ SurfaceAnimator mRecentScreenshotAnimator; + /** + * An app transition listener to cancel the recents animation only after the app transition + * starts or is canceled. + */ final AppTransitionListener mAppTransitionListener = new AppTransitionListener() { @Override public int onAppTransitionStartingLocked(int transit, long duration, long statusBarAnimationStartTime, long statusBarAnimationDuration) { - onTransitionStart(); - mService.mRoot.getDisplayContent(mDisplayId).mAppTransition - .unregisterListener(this); + continueDeferredCancel(); return 0; } + + @Override + public void onAppTransitionCancelledLocked(int transit) { + continueDeferredCancel(); + } + + private void continueDeferredCancel() { + mDisplayContent.mAppTransition.unregisterListener(this); + if (mCanceled) { + return; + } + + if (mCancelOnNextTransitionStart) { + mCancelOnNextTransitionStart = false; + cancelAnimationWithScreenshot(mCancelDeferredWithScreenshot); + } + } }; public interface RecentsAnimationCallbacks { @@ -201,8 +222,7 @@ public class RecentsAnimationController implements DeathRecipient { ? REORDER_MOVE_TO_TOP : REORDER_MOVE_TO_ORIGINAL_POSITION, true /* runSynchronously */, sendUserLeaveHint); - final DisplayContent dc = mService.mRoot.getDisplayContent(mDisplayId); - dc.mBoundsAnimationController.setAnimationType(FADE_IN); + mDisplayContent.mBoundsAnimationController.setAnimationType(FADE_IN); } finally { Binder.restoreCallingIdentity(token); } @@ -239,8 +259,7 @@ public class RecentsAnimationController implements DeathRecipient { } mInputConsumerEnabled = enabled; - final InputMonitor inputMonitor = - mService.mRoot.getDisplayContent(mDisplayId).getInputMonitor(); + final InputMonitor inputMonitor = mDisplayContent.getInputMonitor(); inputMonitor.updateInputWindowsLw(true /*force*/); mService.scheduleAnimationLocked(); } @@ -281,15 +300,23 @@ public class RecentsAnimationController implements DeathRecipient { } @Override + @Deprecated public void setCancelWithDeferredScreenshot(boolean screenshot) { - synchronized (mLock) { - setCancelWithDeferredScreenshotLocked(screenshot); + synchronized (mService.mGlobalLock) { + setDeferredCancel(true /* deferred */, screenshot); + } + } + + @Override + public void setDeferCancelUntilNextTransition(boolean defer, boolean screenshot) { + synchronized (mService.mGlobalLock) { + setDeferredCancel(defer, screenshot); } } @Override public void cleanupScreenshot() { - synchronized (mLock) { + synchronized (mService.mGlobalLock) { if (mRecentScreenshotAnimator != null) { mRecentScreenshotAnimator.cancelAnimation(); mRecentScreenshotAnimator = null; @@ -311,10 +338,7 @@ public class RecentsAnimationController implements DeathRecipient { mCallbacks = callbacks; mDisplayId = displayId; mStatusBar = LocalServices.getService(StatusBarManagerInternal.class); - } - - public void initialize(int targetActivityType, SparseBooleanArray recentTaskIds) { - initialize(mService.mRoot.getDisplayContent(mDisplayId), targetActivityType, recentTaskIds); + mDisplayContent = service.mRoot.getDisplayContent(displayId); } /** @@ -322,15 +346,15 @@ public class RecentsAnimationController implements DeathRecipient { * because it may call cancelAnimation() which needs to properly clean up the controller * in the window manager. */ - @VisibleForTesting - void initialize(DisplayContent dc, int targetActivityType, SparseBooleanArray recentTaskIds) { + public void initialize(int targetActivityType, SparseBooleanArray recentTaskIds) { mTargetActivityType = targetActivityType; - dc.mAppTransition.registerListenerLocked(mAppTransitionListener); + mDisplayContent.mAppTransition.registerListenerLocked(mAppTransitionListener); // Make leashes for each of the visible/target tasks and add it to the recents animation to // be started - final ArrayList<Task> visibleTasks = dc.getVisibleTasks(); - final TaskStack targetStack = dc.getStack(WINDOWING_MODE_UNDEFINED, targetActivityType); + final ArrayList<Task> visibleTasks = mDisplayContent.getVisibleTasks(); + final TaskStack targetStack = mDisplayContent.getStack(WINDOWING_MODE_UNDEFINED, + targetActivityType); if (targetStack != null) { for (int i = targetStack.getChildCount() - 1; i >= 0; i--) { final Task t = targetStack.getChildAt(i); @@ -364,29 +388,31 @@ public class RecentsAnimationController implements DeathRecipient { } // Adjust the wallpaper visibility for the showing target activity - final AppWindowToken recentsComponentAppToken = dc.getStack(WINDOWING_MODE_UNDEFINED, - targetActivityType).getTopChild().getTopFullscreenAppToken(); + final AppWindowToken recentsComponentAppToken = + targetStack.getTopChild().getTopFullscreenAppToken(); if (recentsComponentAppToken != null) { if (DEBUG_RECENTS_ANIMATIONS) Slog.d(TAG, "setHomeApp(" + recentsComponentAppToken.getName() + ")"); mTargetAppToken = recentsComponentAppToken; if (recentsComponentAppToken.windowsCanBeWallpaperTarget()) { - dc.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; - dc.setLayoutNeeded(); + mDisplayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; + mDisplayContent.setLayoutNeeded(); } } // Save the minimized home height - final TaskStack dockedStack = dc.getSplitScreenPrimaryStackIgnoringVisibility(); - dc.getDockedDividerController().getHomeStackBoundsInDockedMode( - dc.getConfiguration(), + final TaskStack dockedStack = mDisplayContent.getSplitScreenPrimaryStackIgnoringVisibility(); + mDisplayContent.getDockedDividerController().getHomeStackBoundsInDockedMode( + mDisplayContent.getConfiguration(), dockedStack == null ? DOCKED_INVALID : dockedStack.getDockSide(), mMinimizedHomeBounds); mService.mWindowPlacerLocked.performSurfacePlacement(); // Notify that the animation has started - mStatusBar.onRecentsAnimationStateChanged(true /* running */); + if (mStatusBar != null) { + mStatusBar.onRecentsAnimationStateChanged(true /* running */); + } } @VisibleForTesting @@ -440,8 +466,7 @@ public class RecentsAnimationController implements DeathRecipient { // Perform layout if it was scheduled before to make sure that we get correct content // insets for the target app window after a rotation - final DisplayContent displayContent = mService.mRoot.getDisplayContent(mDisplayId); - displayContent.performLayout(false /* initial */, false /* updateInputWindows */); + mDisplayContent.performLayout(false /* initial */, false /* updateInputWindows */); final Rect minimizedHomeBounds = mTargetAppToken != null && mTargetAppToken.inSplitScreenSecondaryWindowingMode() @@ -479,9 +504,8 @@ public class RecentsAnimationController implements DeathRecipient { cancelAnimation(reorderMode, true /* runSynchronously */, false /* screenshot */, reason); } - void cancelAnimationWithScreenShot() { - cancelAnimation(REORDER_KEEP_IN_PLACE, true /* sync */, true /* screenshot */, - "stackOrderChanged"); + void cancelAnimationWithScreenshot(boolean screenshot) { + cancelAnimation(REORDER_KEEP_IN_PLACE, true /* sync */, screenshot, "stackOrderChanged"); } private void cancelAnimation(@ReorderMode int reorderMode, boolean runSynchronously, @@ -495,21 +519,29 @@ public class RecentsAnimationController implements DeathRecipient { } mService.mH.removeCallbacks(mFailsafeRunnable); mCanceled = true; - try { - if (screenshot) { - // Screen shot previous task when next task starts transition. - final Task task = mPendingAnimations.get(0).mTask; - screenshotRecentTask(task, reorderMode, runSynchronously); + + if (screenshot) { + // Screen shot previous task when next task starts transition and notify the runner. + // We will actually finish the animation once the runner calls cleanUpScreenshot(). + final Task task = mPendingAnimations.get(0).mTask; + screenshotRecentTask(task, reorderMode, runSynchronously); + try { mRunner.onAnimationCanceled(true /* deferredWithScreenshot */); - return; + } catch (RemoteException e) { + Slog.e(TAG, "Failed to cancel recents animation", e); + } + } else { + // Otherwise, notify the runner and clean up the animation immediately + // Note: In the fallback case, this can trigger multiple onAnimationCancel() calls + // to the runner if we this actually triggers cancel twice on the caller + try { + mRunner.onAnimationCanceled(false /* deferredWithScreenshot */); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to cancel recents animation", e); } - mRunner.onAnimationCanceled(false /* deferredWithScreenshot */); - } catch (RemoteException e) { - Slog.e(TAG, "Failed to cancel recents animation", e); + mCallbacks.onAnimationFinished(reorderMode, runSynchronously, + false /* sendUserLeaveHint */); } - // Clean up and return to the previous app - mCallbacks.onAnimationFinished(reorderMode, runSynchronously, - false /* sendUserLeaveHint */); } } @@ -522,27 +554,36 @@ public class RecentsAnimationController implements DeathRecipient { * screenshot, so that Launcher can still control the leash lifecycle & make the next app * transition animate smoothly without flickering. */ - void cancelOnNextTransitionStart() { + void setCancelOnNextTransitionStart() { mCancelOnNextTransitionStart = true; } - void setCancelWithDeferredScreenshotLocked(boolean screenshot) { - mCancelWithDeferredScreenshot = screenshot; + /** + * Requests that we attempt to defer the cancel until the next app transition if we are + * canceling from a stack order change. If {@param screenshot} is specified, then the system + * will replace the contents of the leash with a screenshot, which must be cleaned up when the + * runner calls cleanUpScreenshot(). + */ + void setDeferredCancel(boolean defer, boolean screenshot) { + mRequestDeferCancelUntilNextTransition = defer; + mCancelDeferredWithScreenshot = screenshot; } - boolean shouldCancelWithDeferredScreenshot() { - return mCancelWithDeferredScreenshot; + /** + * @return Whether we should defer the cancel from a stack order change until the next app + * transition. + */ + boolean shouldDeferCancelUntilNextTransition() { + return mRequestDeferCancelUntilNextTransition; } - void onTransitionStart() { - if (mCanceled) { - return; - } - - if (mCancelOnNextTransitionStart) { - mCancelOnNextTransitionStart = false; - cancelAnimationWithScreenShot(); - } + /** + * @return Whether we should both defer the cancel from a stack order change until the next + * app transition, and also that the deferred cancel should replace the contents of the leash + * with a screenshot. + */ + boolean shouldDeferCancelWithScreenshot() { + return mRequestDeferCancelUntilNextTransition && mCancelDeferredWithScreenshot; } void screenshotRecentTask(Task task, @ReorderMode int reorderMode, boolean runSynchronously) { @@ -575,6 +616,7 @@ public class RecentsAnimationController implements DeathRecipient { // Clear any pending failsafe runnables mService.mH.removeCallbacks(mFailsafeRunnable); + mDisplayContent.mAppTransition.unregisterListener(mAppTransitionListener); // Clear references to the runner unlinkToDeathOfRunner(); @@ -588,21 +630,22 @@ public class RecentsAnimationController implements DeathRecipient { } // Update the input windows after the animation is complete - final InputMonitor inputMonitor = - mService.mRoot.getDisplayContent(mDisplayId).getInputMonitor(); + final InputMonitor inputMonitor = mDisplayContent.getInputMonitor(); inputMonitor.updateInputWindowsLw(true /*force*/); // We have deferred all notifications to the target app as a part of the recents animation, // so if we are actually transitioning there, notify again here if (mTargetAppToken != null) { if (reorderMode == REORDER_MOVE_TO_TOP || reorderMode == REORDER_KEEP_IN_PLACE) { - mService.mRoot.getDisplayContent(mDisplayId) - .mAppTransition.notifyAppTransitionFinishedLocked(mTargetAppToken.token); + mDisplayContent.mAppTransition.notifyAppTransitionFinishedLocked( + mTargetAppToken.token); } } // Notify that the animation has ended - mStatusBar.onRecentsAnimationStateChanged(false /* running */); + if (mStatusBar != null) { + mStatusBar.onRecentsAnimationStateChanged(false /* running */); + } } void scheduleFailsafe() { @@ -629,8 +672,7 @@ public class RecentsAnimationController implements DeathRecipient { synchronized (mService.getWindowManagerLock()) { // Clear associated input consumers on runner death - final InputMonitor inputMonitor = - mService.mRoot.getDisplayContent(mDisplayId).getInputMonitor(); + final InputMonitor inputMonitor = mDisplayContent.getInputMonitor(); inputMonitor.destroyInputConsumer(INPUT_CONSUMER_RECENTS_ANIMATION); } } @@ -826,5 +868,11 @@ public class RecentsAnimationController implements DeathRecipient { pw.print(innerPrefix); pw.println("mSplitScreenMinimized=" + mSplitScreenMinimized); pw.print(innerPrefix); pw.println("mTargetAppToken=" + mTargetAppToken); pw.print(innerPrefix); pw.println("isTargetOverWallpaper=" + isTargetOverWallpaper()); + pw.print(innerPrefix); pw.println("mRequestDeferCancelUntilNextTransition=" + + mRequestDeferCancelUntilNextTransition); + pw.print(innerPrefix); pw.println("mCancelOnNextTransitionStart=" + + mCancelOnNextTransitionStart); + pw.print(innerPrefix); pw.println("mCancelDeferredWithScreenshot=" + + mCancelDeferredWithScreenshot); } } diff --git a/services/core/java/com/android/server/wm/RootActivityContainer.java b/services/core/java/com/android/server/wm/RootActivityContainer.java index 3ec461d065ff..d58c61368f9a 100644 --- a/services/core/java/com/android/server/wm/RootActivityContainer.java +++ b/services/core/java/com/android/server/wm/RootActivityContainer.java @@ -35,6 +35,7 @@ import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK; import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; +import static android.view.WindowManager.TRANSIT_SHOW_SINGLE_TASK_DISPLAY; import static com.android.server.am.ActivityStackSupervisorProto.CONFIGURATION_CONTAINER; import static com.android.server.am.ActivityStackSupervisorProto.DISPLAYS; @@ -1217,6 +1218,15 @@ class RootActivityContainer extends ConfigurationContainer if (displayShouldSleep) { stack.goToSleepIfPossible(false /* shuttingDown */); } else { + // When the display which can only contain one task turns on, start a special + // transition. {@link AppTransitionController#handleAppTransitionReady} later + // picks up the transition, and schedules + // {@link ITaskStackListener#onSingleTaskDisplayDrawn} callback which is + // triggered after contents are drawn on the display. + if (display.isSingleTaskInstance()) { + display.mDisplayContent.prepareAppTransition( + TRANSIT_SHOW_SINGLE_TASK_DISPLAY, false); + } stack.awakeFromSleepingLocked(); if (stack.isFocusedStackOnDisplay() && !mStackSupervisor.getKeyguardController() diff --git a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java index c0942c908f3b..0be9736e9d76 100644 --- a/services/core/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/core/java/com/android/server/wm/ScreenRotationAnimation.java @@ -279,7 +279,8 @@ class ScreenRotationAnimation { mService.mDisplayManagerInternal.screenshot(displayId); if (gb != null) { try { - surface.attachAndQueueBuffer(gb.getGraphicBuffer()); + surface.attachAndQueueBufferWithColorSpace(gb.getGraphicBuffer(), + gb.getColorSpace()); } catch (RuntimeException e) { Slog.w(TAG, "Failed to attach screenshot - " + e.getMessage()); } diff --git a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java index cb504607420c..85176bee67df 100644 --- a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java +++ b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java @@ -193,7 +193,9 @@ class SurfaceAnimationRunner { public void onAnimationStart(Animator animation) { synchronized (mCancelLock) { if (!a.mCancelled) { - mFrameTransaction.show(a.mLeash); + // TODO: change this back to use show instead of alpha when b/138459974 is + // fixed. + mFrameTransaction.setAlpha(a.mLeash, 1); } } } diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java index 3d9dfeb4ecec..cd211a28a908 100644 --- a/services/core/java/com/android/server/wm/SurfaceAnimator.java +++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java @@ -324,9 +324,9 @@ class SurfaceAnimator { .setName(surface + " - animation-leash"); final SurfaceControl leash = builder.build(); t.setWindowCrop(leash, width, height); - if (!hidden) { - t.show(leash); - } + t.show(leash); + // TODO: change this back to use show instead of alpha when b/138459974 is fixed. + t.setAlpha(leash, hidden ? 0 : 1); t.reparent(surface, leash); return leash; } diff --git a/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java b/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java index 22f529b28b8e..8f72cdad8dce 100644 --- a/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java +++ b/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java @@ -52,4 +52,11 @@ class TapExcludeRegionHolder { region.op(r, Region.Op.UNION); } } + + /** + * Return true if tap exclude region is empty. + */ + boolean isEmpty() { + return mTapExcludeRegions.size() == 0; + } } diff --git a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java index c7fcc2cda80f..f776062b31a1 100644 --- a/services/core/java/com/android/server/wm/TaskChangeNotificationController.java +++ b/services/core/java/com/android/server/wm/TaskChangeNotificationController.java @@ -54,7 +54,8 @@ class TaskChangeNotificationController { private static final int NOTIFY_ACTIVITY_LAUNCH_ON_SECONDARY_DISPLAY_REROUTED_MSG = 19; private static final int NOTIFY_SIZE_COMPAT_MODE_ACTIVITY_CHANGED_MSG = 20; private static final int NOTIFY_BACK_PRESSED_ON_TASK_ROOT = 21; - private static final int NOTIFY_TASK_DISPLAY_CHANGED_LISTENERS_MSG = 22; + private static final int NOTIFY_SINGLE_TASK_DISPLAY_DRAWN = 22; + private static final int NOTIFY_TASK_DISPLAY_CHANGED_LISTENERS_MSG = 23; // Delay in notifying task stack change listeners (in millis) private static final int NOTIFY_TASK_STACK_CHANGE_LISTENERS_DELAY = 100; @@ -155,6 +156,10 @@ class TaskChangeNotificationController { l.onSizeCompatModeActivityChanged(m.arg1, (IBinder) m.obj); }; + private final TaskStackConsumer mNotifySingleTaskDisplayDrawn = (l, m) -> { + l.onSingleTaskDisplayDrawn(m.arg1); + }; + private final TaskStackConsumer mNotifyTaskDisplayChanged = (l, m) -> { l.onTaskDisplayChanged(m.arg1, m.arg2); }; @@ -238,6 +243,9 @@ class TaskChangeNotificationController { case NOTIFY_BACK_PRESSED_ON_TASK_ROOT: forAllRemoteListeners(mNotifyBackPressedOnTaskRoot, msg); break; + case NOTIFY_SINGLE_TASK_DISPLAY_DRAWN: + forAllRemoteListeners(mNotifySingleTaskDisplayDrawn, msg); + break; case NOTIFY_TASK_DISPLAY_CHANGED_LISTENERS_MSG: forAllRemoteListeners(mNotifyTaskDisplayChanged, msg); break; @@ -487,6 +495,16 @@ class TaskChangeNotificationController { } /** + * Notify listeners that contents are drawn for the first time on a single task display. + */ + void notifySingleTaskDisplayDrawn(int displayId) { + final Message msg = mHandler.obtainMessage(NOTIFY_SINGLE_TASK_DISPLAY_DRAWN, + displayId, 0 /* unused */); + forAllLocalListeners(mNotifySingleTaskDisplayDrawn, msg); + msg.sendToTarget(); + } + + /** * Notify listeners that a task is reparented to another display. */ void notifyTaskDisplayChanged(int taskId, int newDisplayId) { diff --git a/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java b/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java index ee4e462cb85e..c0877a0a6752 100644 --- a/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java +++ b/services/core/java/com/android/server/wm/TaskScreenshotAnimatable.java @@ -28,7 +28,7 @@ import android.view.SurfaceSession; * Class used by {@link RecentsAnimationController} to create a surface control with taking * screenshot of task when canceling recents animation. * - * @see {@link RecentsAnimationController#cancelOnNextTransitionStart} + * @see {@link RecentsAnimationController#setCancelOnNextTransitionStart} */ class TaskScreenshotAnimatable implements SurfaceAnimator.Animatable { private static final String TAG = "TaskScreenshotAnim"; @@ -69,7 +69,7 @@ class TaskScreenshotAnimatable implements SurfaceAnimator.Animatable { if (buffer != null) { final Surface surface = new Surface(); surface.copyFrom(mSurfaceControl); - surface.attachAndQueueBuffer(buffer); + surface.attachAndQueueBufferWithColorSpace(buffer, screenshotBuffer.getColorSpace()); surface.release(); } getPendingTransaction().show(mSurfaceControl); diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java index c3762d6352b8..1905476f4729 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java @@ -284,7 +284,6 @@ class TaskSnapshotSurface implements StartingSurface { } private void drawSnapshot() { - final GraphicBuffer buffer = mSnapshot.getSnapshot(); mSurface.copyFrom(mSurfaceControl); if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Drawing snapshot surface sizeMismatch=" @@ -293,9 +292,9 @@ class TaskSnapshotSurface implements StartingSurface { // The dimensions of the buffer and the window don't match, so attaching the buffer // will fail. Better create a child window with the exact dimensions and fill the parent // window with the background color! - drawSizeMismatchSnapshot(buffer); + drawSizeMismatchSnapshot(); } else { - drawSizeMatchSnapshot(buffer); + drawSizeMatchSnapshot(); } synchronized (mService.mGlobalLock) { mShownTime = SystemClock.uptimeMillis(); @@ -307,15 +306,17 @@ class TaskSnapshotSurface implements StartingSurface { mSnapshot = null; } - private void drawSizeMatchSnapshot(GraphicBuffer buffer) { - mSurface.attachAndQueueBuffer(buffer); + private void drawSizeMatchSnapshot() { + mSurface.attachAndQueueBufferWithColorSpace(mSnapshot.getSnapshot(), + mSnapshot.getColorSpace()); mSurface.release(); } - private void drawSizeMismatchSnapshot(GraphicBuffer buffer) { + private void drawSizeMismatchSnapshot() { if (!mSurface.isValid()) { throw new IllegalStateException("mSurface does not hold a valid surface."); } + final GraphicBuffer buffer = mSnapshot.getSnapshot(); final SurfaceSession session = new SurfaceSession(); // We consider nearly matched dimensions as there can be rounding errors and the user won't // notice very minute differences from scaling one dimension more than the other @@ -355,7 +356,7 @@ class TaskSnapshotSurface implements StartingSurface { } finally { SurfaceControl.closeTransaction(); } - surface.attachAndQueueBuffer(buffer); + surface.attachAndQueueBufferWithColorSpace(buffer, mSnapshot.getColorSpace()); surface.release(); if (aspectRatioMismatch) { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 436a5c729b86..57f402c8fe9c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -854,7 +854,7 @@ public class WindowManagerService extends IWindowManager.Stub final Configuration mTempConfiguration = new Configuration(); - final HighRefreshRateBlacklist mHighRefreshRateBlacklist = HighRefreshRateBlacklist.create(); + final HighRefreshRateBlacklist mHighRefreshRateBlacklist; // If true, only the core apps and services are being launched because the device // is in a special boot mode, such as being encrypted or waiting for a decryption password. @@ -1141,6 +1141,8 @@ public class WindowManagerService extends IWindowManager.Stub this, mInputManager, mActivityTaskManager, mH.getLooper()); mDragDropController = new DragDropController(this, mH.getLooper()); + mHighRefreshRateBlacklist = HighRefreshRateBlacklist.create(context.getResources()); + mSystemGestureExclusionLimitDp = Math.max(MIN_GESTURE_EXCLUSION_LIMIT_DP, DeviceConfig.getInt(DeviceConfig.NAMESPACE_WINDOW_MANAGER, KEY_SYSTEM_GESTURE_EXCLUSION_LIMIT_DP, 0)); @@ -2002,6 +2004,7 @@ public class WindowManagerService extends IWindowManager.Stub int attrChanges = 0; int flagChanges = 0; + int privateFlagChanges = 0; if (attrs != null) { displayPolicy.adjustWindowParamsLw(win, attrs, pid, uid); // if they don't have the permission, mask out the status bar bits @@ -2030,6 +2033,7 @@ public class WindowManagerService extends IWindowManager.Stub } flagChanges = win.mAttrs.flags ^= attrs.flags; + privateFlagChanges = win.mAttrs.privateFlags ^ attrs.privateFlags; attrChanges = win.mAttrs.copyFrom(attrs); if ((attrChanges & (WindowManager.LayoutParams.LAYOUT_CHANGED | WindowManager.LayoutParams.SYSTEM_UI_VISIBILITY_CHANGED)) != 0) { @@ -2047,7 +2051,7 @@ public class WindowManagerService extends IWindowManager.Stub mAccessibilityController.onSomeWindowResizedOrMovedLocked(); } - if ((flagChanges & SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS) != 0) { + if ((privateFlagChanges & SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS) != 0) { updateNonSystemOverlayWindowsVisibilityIfNeeded( win, win.mWinAnimator.getShown()); } @@ -4576,8 +4580,11 @@ public class WindowManagerService extends IWindowManager.Stub AccessibilityController accessibilityController = null; synchronized (mGlobalLock) { - // TODO(multidisplay): Accessibility supported only of default desiplay. - if (mAccessibilityController != null && displayContent.isDefaultDisplay) { + // TODO(multidisplay): Accessibility supported only of default display and + // embedded displays. + if (mAccessibilityController != null + && (displayContent.isDefaultDisplay + || displayContent.getParentWindow() != null)) { accessibilityController = mAccessibilityController; } @@ -5919,6 +5926,12 @@ public class WindowManagerService extends IWindowManager.Stub mRoot.dumpTokens(pw, dumpAll); } + + private void dumpHighRefreshRateBlacklist(PrintWriter pw) { + pw.println("WINDOW MANAGER HIGH REFRESH RATE BLACKLIST (dumpsys window refresh)"); + mHighRefreshRateBlacklist.dump(pw); + } + private void dumpTraceStatus(PrintWriter pw) { pw.println("WINDOW MANAGER TRACE (dumpsys window trace)"); pw.print(mWindowTracing.getStatus() + "\n"); @@ -6318,6 +6331,9 @@ public class WindowManagerService extends IWindowManager.Stub } else if ("trace".equals(cmd)) { dumpTraceStatus(pw); return; + } else if ("refresh".equals(cmd)) { + dumpHighRefreshRateBlacklist(pw); + return; } else { // Dumping a single name? if (!dumpWindows(pw, cmd, args, opti, dumpAll)) { @@ -6373,6 +6389,10 @@ public class WindowManagerService extends IWindowManager.Stub pw.println(separator); } dumpTraceStatus(pw); + if (dumpAll) { + pw.println(separator); + } + dumpHighRefreshRateBlacklist(pw); } } @@ -7574,7 +7594,7 @@ public class WindowManagerService extends IWindowManager.Stub return; } final boolean systemAlertWindowsHidden = !mHidingNonSystemOverlayWindows.isEmpty(); - if (surfaceShown) { + if (surfaceShown && win.hideNonSystemOverlayWindowsWhenVisible()) { if (!mHidingNonSystemOverlayWindows.contains(win)) { mHidingNonSystemOverlayWindows.add(win); } diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index bc5e32823547..b6960f0d1fe6 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -565,7 +565,8 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio * activities are allowed to be resumed per process. * @return {@code true} if the activity is allowed to be resumed by compatibility * restrictions, which the activity was the topmost visible activity in process or the app is - * targeting after Q. + * targeting after Q. Note that non-focusable activity, in picture-in-picture mode for instance, + * does not count as a topmost activity. */ boolean updateTopResumingActivityInProcessIfNeeded(@NonNull ActivityRecord activity) { if (mInfo.targetSdkVersion >= Q || mPreQTopResumedActivity == activity) { @@ -581,9 +582,13 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio boolean canUpdate = false; final ActivityDisplay topDisplay = mPreQTopResumedActivity != null ? mPreQTopResumedActivity.getDisplay() : null; - // Update the topmost activity if current top activity was not on any display or no - // longer visible. - if (topDisplay == null || !mPreQTopResumedActivity.visible) { + // Update the topmost activity if current top activity is + // - not on any display OR + // - no longer visible OR + // - not focusable (in PiP mode for instance) + if (topDisplay == null + || !mPreQTopResumedActivity.visible + || !mPreQTopResumedActivity.isFocusable()) { canUpdate = true; } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 703fe4ac867b..f68d7c077e72 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -170,6 +170,7 @@ import android.os.UserHandle; import android.os.WorkSource; import android.provider.Settings; import android.text.TextUtils; +import android.util.ArraySet; import android.util.DisplayMetrics; import android.util.MergedConfiguration; import android.util.Slog; @@ -319,6 +320,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP int mLayoutSeq = -1; + /** @see #addEmbeddedDisplayContent(DisplayContent dc) */ + private final ArraySet<DisplayContent> mEmbeddedDisplayContents = new ArraySet<>(); + /** * Used to store last reported to client configuration and check if we have newer available. * We'll send configuration to client only if it is different from the last applied one and @@ -539,6 +543,12 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP private final Point mTmpPoint = new Point(); /** + * If a window is on a display which has been re-parented to a view in another window, + * use this offset to indicate the correct location. + */ + private final Point mLastReportedDisplayOffset = new Point(); + + /** * Whether the window was resized by us while it was gone for layout. */ boolean mResizedWhileGone = false; @@ -1792,11 +1802,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP startMoveAnimation(left, top); } - //TODO (multidisplay): Accessibility supported only for the default display. - if (mWmService.mAccessibilityController != null - && getDisplayContent().getDisplayId() == DEFAULT_DISPLAY) { + // TODO (multidisplay): Accessibility supported only for the default display and + // embedded displays + if (mWmService.mAccessibilityController != null && (getDisplayId() == DEFAULT_DISPLAY + || getDisplayContent().getParentWindow() != null)) { mWmService.mAccessibilityController.onSomeWindowResizedOrMovedLocked(); } + updateLocationInParentDisplayIfNeeded(); try { mClient.moved(left, top); @@ -3177,11 +3189,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP displayCutout); } - //TODO (multidisplay): Accessibility supported only for the default display. + // TODO (multidisplay): Accessibility supported only for the default display and + // embedded displays if (mWmService.mAccessibilityController != null && (getDisplayId() == DEFAULT_DISPLAY || getDisplayContent().getParentWindow() != null)) { mWmService.mAccessibilityController.onSomeWindowResizedOrMovedLocked(); } + updateLocationInParentDisplayIfNeeded(); mWindowFrames.resetInsetsChanged(); mWinAnimator.mSurfaceResized = false; @@ -3199,6 +3213,36 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); } + void updateLocationInParentDisplayIfNeeded() { + final int embeddedDisplayContentsSize = mEmbeddedDisplayContents.size(); + // If there is any embedded display which is re-parented to this window, we need to + // notify all windows in the embedded display about the location change. + if (embeddedDisplayContentsSize != 0) { + for (int i = embeddedDisplayContentsSize - 1; i >= 0; i--) { + final DisplayContent edc = mEmbeddedDisplayContents.valueAt(i); + edc.notifyLocationInParentDisplayChanged(); + } + } + // If this window is in a embedded display which is re-parented to another window, + // we may need to update its correct on-screen location. + final DisplayContent dc = getDisplayContent(); + if (dc.getParentWindow() == null) { + return; + } + + final Point offset = dc.getLocationInParentDisplay(); + if (mLastReportedDisplayOffset.equals(offset)) { + return; + } + + mLastReportedDisplayOffset.set(offset.x, offset.y); + try { + mClient.locationInParentDisplayChanged(mLastReportedDisplayOffset); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to update offset from DisplayContent", e); + } + } + /** * Called when the insets state changed. */ @@ -3618,6 +3662,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } pw.println(prefix + "isOnScreen=" + isOnScreen()); pw.println(prefix + "isVisible=" + isVisible()); + pw.println(prefix + "mEmbeddedDisplayContents=" + mEmbeddedDisplayContents); } @Override @@ -4248,7 +4293,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return; } - //TODO (multidisplay): Accessibility is supported only for the default display. + // TODO (multidisplay): Accessibility supported only for the default display and + // embedded displays if (mWmService.mAccessibilityController != null && (getDisplayId() == DEFAULT_DISPLAY || getDisplayContent().getParentWindow() != null)) { mWmService.mAccessibilityController.onSomeWindowResizedOrMovedLocked(); @@ -4620,6 +4666,28 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } /** + * Add the DisplayContent of the embedded display which is re-parented to this window to + * the list of embedded displays. + * + * @param dc DisplayContent of the re-parented embedded display. + * @return {@code true} if the giving DisplayContent is added, {@code false} otherwise. + */ + boolean addEmbeddedDisplayContent(DisplayContent dc) { + return mEmbeddedDisplayContents.add(dc); + } + + /** + * Remove the DisplayContent of the embedded display which is re-parented to this window from + * the list of embedded displays. + * + * @param dc DisplayContent of the re-parented embedded display. + * @return {@code true} if the giving DisplayContent is removed, {@code false} otherwise. + */ + boolean removeEmbeddedDisplayContent(DisplayContent dc) { + return mEmbeddedDisplayContents.remove(dc); + } + + /** * Updates the last inset values to the current ones. */ void updateLastInsetValues() { @@ -5041,6 +5109,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP tempRegion.recycle(); } + boolean hasTapExcludeRegion() { + return mTapExcludeRegionHolder != null && !mTapExcludeRegionHolder.isEmpty(); + } + @Override public boolean isInputMethodTarget() { return getDisplayContent().mInputMethodTarget == this; diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 2c0a733eebde..3505afb5e7a3 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -1493,6 +1493,12 @@ class WindowStateAnimator { } void detachChildren() { + + // Do not detach children of starting windows, as their lifecycle is well under control and + // it may lead to issues in case we relaunch when we just added the starting window. + if (mWin.mAttrs.type == TYPE_APPLICATION_STARTING) { + return; + } if (mSurfaceController != null) { mSurfaceController.detachChildren(); } diff --git a/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java b/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java index cc64323e51c7..1d082c735d09 100644 --- a/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java +++ b/services/robotests/backup/src/com/android/server/backup/keyvalue/KeyValueBackupTaskTest.java @@ -94,7 +94,6 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.ParcelFileDescriptor; -import android.os.PowerManager; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.util.Pair; @@ -184,7 +183,7 @@ public class KeyValueBackupTaskTest { private TransportData mTransport; private ShadowLooper mShadowBackupLooper; private Handler mBackupHandler; - private PowerManager.WakeLock mWakeLock; + private UserBackupManagerService.BackupWakeLock mWakeLock; private KeyValueBackupReporter mReporter; private PackageManager mPackageManager; private ShadowPackageManager mShadowPackageManager; diff --git a/services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java b/services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java index f4cea7ae86a6..3fc421dfb6e9 100644 --- a/services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java +++ b/services/robotests/backup/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java @@ -18,7 +18,7 @@ package com.android.server.backup.restore; import static com.android.server.backup.testing.BackupManagerServiceTestUtils.createBackupWakeLock; import static com.android.server.backup.testing.BackupManagerServiceTestUtils.setUpBackupManagerServiceBasics; -import static com.android.server.backup.testing.BackupManagerServiceTestUtils.startBackupThreadAndGetLooper; +import static com.android.server.backup.testing.BackupManagerServiceTestUtils.startBackupThread; import static com.android.server.backup.testing.TestUtils.assertEventLogged; import static com.android.server.backup.testing.TestUtils.assertEventNotLogged; import static com.android.server.backup.testing.TransportData.backupTransport; @@ -44,8 +44,8 @@ import android.app.backup.RestoreSet; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.os.Handler; +import android.os.HandlerThread; import android.os.Looper; -import android.os.PowerManager; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; @@ -98,7 +98,7 @@ public class ActiveRestoreSessionTest { @Mock private IBackupManagerMonitor mMonitor; private ShadowLooper mShadowBackupLooper; private ShadowApplication mShadowApplication; - private PowerManager.WakeLock mWakeLock; + private UserBackupManagerService.BackupWakeLock mWakeLock; private TransportData mTransport; private RestoreSet mRestoreSet1; private RestoreSet mRestoreSet2; @@ -118,7 +118,8 @@ public class ActiveRestoreSessionTest { mShadowPackageManager = shadowOf(application.getPackageManager()); - Looper backupLooper = startBackupThreadAndGetLooper(); + HandlerThread handlerThread = startBackupThread(null); + Looper backupLooper = handlerThread.getLooper(); mShadowBackupLooper = shadowOf(backupLooper); Handler mainHandler = new Handler(Looper.getMainLooper()); @@ -129,7 +130,7 @@ public class ActiveRestoreSessionTest { // We need to mock BMS timeout parameters before initializing the BackupHandler since // the constructor of BackupHandler relies on it. when(mBackupManagerService.getAgentTimeoutParameters()).thenReturn(agentTimeoutParameters); - BackupHandler backupHandler = new BackupHandler(mBackupManagerService, backupLooper); + BackupHandler backupHandler = new BackupHandler(mBackupManagerService, handlerThread); mWakeLock = createBackupWakeLock(application); diff --git a/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java b/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java index 47abcc5a2dd1..392d182328a5 100644 --- a/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java +++ b/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java @@ -113,7 +113,7 @@ public class BackupManagerServiceTestUtils { TransportManager transportManager, PackageManager packageManager, Handler backupHandler, - PowerManager.WakeLock wakeLock, + UserBackupManagerService.BackupWakeLock wakeLock, BackupAgentTimeoutParameters agentTimeoutParameters) { when(backupManagerService.getContext()).thenReturn(application); @@ -161,10 +161,12 @@ public class BackupManagerServiceTestUtils { }); } - public static PowerManager.WakeLock createBackupWakeLock(Application application) { + public static UserBackupManagerService.BackupWakeLock createBackupWakeLock( + Application application) { PowerManager powerManager = (PowerManager) application.getSystemService(Context.POWER_SERVICE); - return powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*"); + return new UserBackupManagerService.BackupWakeLock( + powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*")); } /** diff --git a/services/tests/mockingservicestests/src/com/android/server/display/color/DisplayTransformManagerTest.java b/services/tests/mockingservicestests/src/com/android/server/display/color/DisplayTransformManagerTest.java index 73b3b8b1ce3c..a785300e98a3 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/color/DisplayTransformManagerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/color/DisplayTransformManagerTest.java @@ -19,6 +19,7 @@ package com.android.server.display.color; import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyString; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer; import static com.android.server.display.color.DisplayTransformManager.LEVEL_COLOR_MATRIX_NIGHT_DISPLAY; +import static com.android.server.display.color.DisplayTransformManager.PERSISTENT_PROPERTY_COMPOSITION_COLOR_MODE; import static com.android.server.display.color.DisplayTransformManager.PERSISTENT_PROPERTY_DISPLAY_COLOR; import static com.android.server.display.color.DisplayTransformManager.PERSISTENT_PROPERTY_SATURATION; @@ -28,6 +29,7 @@ import static org.mockito.ArgumentMatchers.any; import android.hardware.display.ColorDisplayManager; import android.os.SystemProperties; +import android.view.Display; import androidx.test.runner.AndroidJUnit4; @@ -79,7 +81,7 @@ public class DisplayTransformManagerTest { @Test public void setColorMode_natural() { - mDtm.setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL, mNightDisplayMatrix); + mDtm.setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL, mNightDisplayMatrix, -1); assertThat(mSystemProperties.get(PERSISTENT_PROPERTY_DISPLAY_COLOR)) .isEqualTo("0" /* managed */); assertThat(mSystemProperties.get(PERSISTENT_PROPERTY_SATURATION)) @@ -88,7 +90,7 @@ public class DisplayTransformManagerTest { @Test public void setColorMode_boosted() { - mDtm.setColorMode(ColorDisplayManager.COLOR_MODE_BOOSTED, mNightDisplayMatrix); + mDtm.setColorMode(ColorDisplayManager.COLOR_MODE_BOOSTED, mNightDisplayMatrix, -1); assertThat(mSystemProperties.get(PERSISTENT_PROPERTY_DISPLAY_COLOR)) .isEqualTo("0" /* managed */); @@ -98,7 +100,7 @@ public class DisplayTransformManagerTest { @Test public void setColorMode_saturated() { - mDtm.setColorMode(ColorDisplayManager.COLOR_MODE_SATURATED, mNightDisplayMatrix); + mDtm.setColorMode(ColorDisplayManager.COLOR_MODE_SATURATED, mNightDisplayMatrix, -1); assertThat(mSystemProperties.get(PERSISTENT_PROPERTY_DISPLAY_COLOR)) .isEqualTo("1" /* unmanaged */); assertThat(mSystemProperties.get(PERSISTENT_PROPERTY_SATURATION)) @@ -107,7 +109,7 @@ public class DisplayTransformManagerTest { @Test public void setColorMode_automatic() { - mDtm.setColorMode(ColorDisplayManager.COLOR_MODE_AUTOMATIC, mNightDisplayMatrix); + mDtm.setColorMode(ColorDisplayManager.COLOR_MODE_AUTOMATIC, mNightDisplayMatrix, -1); assertThat(mSystemProperties.get(PERSISTENT_PROPERTY_DISPLAY_COLOR)) .isEqualTo("2" /* enhanced */); assertThat(mSystemProperties.get(PERSISTENT_PROPERTY_SATURATION)) @@ -116,7 +118,7 @@ public class DisplayTransformManagerTest { @Test public void setColorMode_vendor() { - mDtm.setColorMode(0x100, mNightDisplayMatrix); + mDtm.setColorMode(0x100, mNightDisplayMatrix, -1); assertThat(mSystemProperties.get(PERSISTENT_PROPERTY_DISPLAY_COLOR)) .isEqualTo(Integer.toString(0x100) /* pass-through */); assertThat(mSystemProperties.get(PERSISTENT_PROPERTY_SATURATION)) @@ -125,10 +127,38 @@ public class DisplayTransformManagerTest { @Test public void setColorMode_outOfBounds() { - mDtm.setColorMode(0x50, mNightDisplayMatrix); + mDtm.setColorMode(0x50, mNightDisplayMatrix, -1); assertThat(mSystemProperties.get(PERSISTENT_PROPERTY_DISPLAY_COLOR)) .isEqualTo(null); assertThat(mSystemProperties.get(PERSISTENT_PROPERTY_SATURATION)) .isEqualTo(null); } + + @Test + public void setColorMode_withoutColorSpace() { + String magicPropertyValue = "magic"; + + // Start with a known state, which we expect to remain unmodified + SystemProperties.set(PERSISTENT_PROPERTY_COMPOSITION_COLOR_MODE, magicPropertyValue); + + mDtm.setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL, mNightDisplayMatrix, + Display.COLOR_MODE_INVALID); + assertThat(mSystemProperties.get(PERSISTENT_PROPERTY_COMPOSITION_COLOR_MODE)) + .isEqualTo(magicPropertyValue); + } + + @Test + public void setColorMode_withColorSpace() { + String magicPropertyValue = "magic"; + int testPropertyValue = Display.COLOR_MODE_SRGB; + + // Start with a known state, which we expect to get modified + SystemProperties.set(PERSISTENT_PROPERTY_COMPOSITION_COLOR_MODE, magicPropertyValue); + + mDtm.setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL, mNightDisplayMatrix, + testPropertyValue); + assertThat(mSystemProperties.get(PERSISTENT_PROPERTY_COMPOSITION_COLOR_MODE)) + .isEqualTo(Integer.toString(testPropertyValue)); + } + } diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml index 25bd4ec489a9..178ae2533664 100644 --- a/services/tests/servicestests/AndroidManifest.xml +++ b/services/tests/servicestests/AndroidManifest.xml @@ -70,6 +70,8 @@ <uses-permission android:name="android.permission.WRITE_DEVICE_CONFIG" /> <uses-permission android:name="android.permission.HARDWARE_TEST"/> <uses-permission android:name="android.permission.MANAGE_APPOPS"/> + <uses-permission android:name="android.permission.BLUETOOTH"/> + <!-- Uses API introduced in O (26) --> <uses-sdk android:minSdkVersion="1" diff --git a/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java b/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java new file mode 100644 index 000000000000..5c2ad94720f0 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java @@ -0,0 +1,162 @@ +/* + * Copyright 2019 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.audio; + +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyInt; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.media.AudioManager; +import android.media.AudioSystem; +import android.util.Log; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.MediumTest; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Spy; + +@MediumTest +@RunWith(AndroidJUnit4.class) +public class AudioDeviceBrokerTest { + + private static final String TAG = "AudioDeviceBrokerTest"; + private static final int MAX_MESSAGE_HANDLING_DELAY_MS = 100; + + private Context mContext; + // the actual class under test + private AudioDeviceBroker mAudioDeviceBroker; + + @Mock private AudioService mMockAudioService; + @Spy private AudioDeviceInventory mSpyDevInventory; + + private BluetoothDevice mFakeBtDevice; + + @Before + public void setUp() throws Exception { + mContext = InstrumentationRegistry.getTargetContext(); + + mMockAudioService = mock(AudioService.class); + mSpyDevInventory = spy(new AudioDeviceInventory()); + mAudioDeviceBroker = new AudioDeviceBroker(mContext, mMockAudioService, mSpyDevInventory); + mSpyDevInventory.setDeviceBroker(mAudioDeviceBroker); + + BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); + mFakeBtDevice = adapter.getRemoteDevice("00:01:02:03:04:05"); + Assert.assertNotNull("invalid null BT device", mFakeBtDevice); + } + + @After + public void tearDown() throws Exception { } + + @Test + public void testSetUpAndTearDown() { } + + /** + * Verify call to postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent() for connection + * calls into AudioDeviceInventory with the right params + * @throws Exception + */ + @Test + public void testPostA2dpDeviceConnectionChange() throws Exception { + Log.i(TAG, "testPostA2dpDeviceConnectionChange"); + Assert.assertNotNull("invalid null BT device", mFakeBtDevice); + + mAudioDeviceBroker.postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(mFakeBtDevice, + BluetoothProfile.STATE_CONNECTED, BluetoothProfile.A2DP, true, 1); + Thread.sleep(MAX_MESSAGE_HANDLING_DELAY_MS); + verify(mSpyDevInventory, times(1)).setBluetoothA2dpDeviceConnectionState( + any(BluetoothDevice.class), + ArgumentMatchers.eq(BluetoothProfile.STATE_CONNECTED) /*state*/, + ArgumentMatchers.eq(BluetoothProfile.A2DP) /*profile*/, + ArgumentMatchers.eq(true) /*suppressNoisyIntent*/, anyInt() /*musicDevice*/, + ArgumentMatchers.eq(1) /*a2dpVolume*/ + ); + } + + /** + * Verify call to postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent() for + * connection > pause > disconnection > connection + * keeps the device connected + * @throws Exception + */ + @Test + public void testA2dpDeviceConnectionDisconnectionConnectionChange() throws Exception { + Log.i(TAG, "testA2dpDeviceConnectionDisconnectionConnectionChange"); + + doTestConnectionDisconnectionReconnection(0); + } + + /** + * Verify device disconnection and reconnection within the BECOMING_NOISY window + * @throws Exception + */ + @Test + public void testA2dpDeviceReconnectionWithinBecomingNoisyDelay() throws Exception { + Log.i(TAG, "testA2dpDeviceReconnectionWithinBecomingNoisyDelay"); + + doTestConnectionDisconnectionReconnection(AudioService.BECOMING_NOISY_DELAY_MS / 2); + } + + private void doTestConnectionDisconnectionReconnection(int delayAfterDisconnection) + throws Exception { + when(mMockAudioService.getDeviceForStream(AudioManager.STREAM_MUSIC)) + .thenReturn(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP); + when(mMockAudioService.isInCommunication()).thenReturn(false); + when(mMockAudioService.hasMediaDynamicPolicy()).thenReturn(false); + when(mMockAudioService.hasAudioFocusUsers()).thenReturn(false); + + // first connection + mAudioDeviceBroker.postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(mFakeBtDevice, + BluetoothProfile.STATE_CONNECTED, BluetoothProfile.A2DP, true, 1); + Thread.sleep(MAX_MESSAGE_HANDLING_DELAY_MS); + + // disconnection + mAudioDeviceBroker.postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(mFakeBtDevice, + BluetoothProfile.STATE_DISCONNECTED, BluetoothProfile.A2DP, false, -1); + if (delayAfterDisconnection > 0) { + Thread.sleep(delayAfterDisconnection); + } + + // reconnection + mAudioDeviceBroker.postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(mFakeBtDevice, + BluetoothProfile.STATE_CONNECTED, BluetoothProfile.A2DP, true, 2); + Thread.sleep(AudioService.BECOMING_NOISY_DELAY_MS + MAX_MESSAGE_HANDLING_DELAY_MS); + + // Verify disconnection has been cancelled and we're seeing two connections attempts, + // with the device connected at the end of the test + verify(mSpyDevInventory, times(2)).onSetA2dpSinkConnectionState( + any(BtHelper.BluetoothA2dpDeviceInfo.class), + ArgumentMatchers.eq(BluetoothProfile.STATE_CONNECTED)); + Assert.assertTrue("Mock device not connected", + mSpyDevInventory.isA2dpDeviceConnected(mFakeBtDevice)); + } +} diff --git a/services/tests/servicestests/src/com/android/server/display/color/ColorDisplayServiceTest.java b/services/tests/servicestests/src/com/android/server/display/color/ColorDisplayServiceTest.java index 8bb8aae76849..a19b3872949e 100644 --- a/services/tests/servicestests/src/com/android/server/display/color/ColorDisplayServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/display/color/ColorDisplayServiceTest.java @@ -18,13 +18,19 @@ package com.android.server.display.color; import static com.google.common.truth.Truth.assertWithMessage; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.annotation.NonNull; import android.app.ActivityManager; import android.app.AlarmManager; import android.content.Context; import android.content.ContextWrapper; +import android.content.res.Resources; import android.hardware.display.ColorDisplayManager; import android.hardware.display.Time; import android.os.Handler; @@ -33,6 +39,7 @@ import android.provider.Settings; import android.provider.Settings.Secure; import android.provider.Settings.System; import android.test.mock.MockContentResolver; +import android.view.Display; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; @@ -73,6 +80,8 @@ public class ColorDisplayServiceTest { private ColorDisplayService mCds; private ColorDisplayService.BinderService mBinderService; + private Resources mResourcesSpy; + @BeforeClass public static void setDtm() { final DisplayTransformManager dtm = Mockito.mock(DisplayTransformManager.class); @@ -84,6 +93,9 @@ public class ColorDisplayServiceTest { mContext = Mockito.spy(new ContextWrapper(InstrumentationRegistry.getTargetContext())); doReturn(mContext).when(mContext).getApplicationContext(); + mResourcesSpy = Mockito.spy(mContext.getResources()); + when(mContext.getResources()).thenReturn(mResourcesSpy); + mUserId = ActivityManager.getCurrentUser(); final MockContentResolver cr = new MockContentResolver(mContext); @@ -113,6 +125,8 @@ public class ColorDisplayServiceTest { mUserId = UserHandle.USER_NULL; mContext = null; + FakeSettingsProvider.clearSettingsProvider(); + LocalServices.removeServiceForTest(ColorDisplayService.ColorDisplayServiceInternal.class); } @@ -924,11 +938,8 @@ public class ColorDisplayServiceTest { startService(); assertUserColorMode(ColorDisplayManager.COLOR_MODE_NATURAL); - if (isColorModeValid(ColorDisplayManager.COLOR_MODE_SATURATED)) { - assertActiveColorMode(ColorDisplayManager.COLOR_MODE_SATURATED); - } else if (isColorModeValid(ColorDisplayManager.COLOR_MODE_AUTOMATIC)) { - assertActiveColorMode(ColorDisplayManager.COLOR_MODE_AUTOMATIC); - } + assertActiveColorMode(mContext.getResources().getInteger( + R.integer.config_accessibilityColorMode)); } @Test @@ -942,11 +953,8 @@ public class ColorDisplayServiceTest { startService(); assertUserColorMode(ColorDisplayManager.COLOR_MODE_NATURAL); - if (isColorModeValid(ColorDisplayManager.COLOR_MODE_SATURATED)) { - assertActiveColorMode(ColorDisplayManager.COLOR_MODE_SATURATED); - } else if (isColorModeValid(ColorDisplayManager.COLOR_MODE_AUTOMATIC)) { - assertActiveColorMode(ColorDisplayManager.COLOR_MODE_AUTOMATIC); - } + assertActiveColorMode(mContext.getResources().getInteger( + R.integer.config_accessibilityColorMode)); } @Test @@ -961,11 +969,8 @@ public class ColorDisplayServiceTest { startService(); assertUserColorMode(ColorDisplayManager.COLOR_MODE_NATURAL); - if (isColorModeValid(ColorDisplayManager.COLOR_MODE_SATURATED)) { - assertActiveColorMode(ColorDisplayManager.COLOR_MODE_SATURATED); - } else if (isColorModeValid(ColorDisplayManager.COLOR_MODE_AUTOMATIC)) { - assertActiveColorMode(ColorDisplayManager.COLOR_MODE_AUTOMATIC); - } + assertActiveColorMode(mContext.getResources().getInteger( + R.integer.config_accessibilityColorMode)); } @Test @@ -1020,11 +1025,15 @@ public class ColorDisplayServiceTest { @Test public void displayWhiteBalance_enabledAfterLinearColorModeSelected() { + if (!isColorModeValid(ColorDisplayManager.COLOR_MODE_SATURATED)) { + return; + } setDisplayWhiteBalanceEnabled(true); - setNightDisplayActivated(false /* activated */, -30 /* lastActivatedTimeOffset */); + mBinderService.setColorMode(ColorDisplayManager.COLOR_MODE_SATURATED); startService(); - mBinderService.setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL); + assertDwbActive(false); + mBinderService.setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL); mCds.updateDisplayWhiteBalanceStatus(); assertDwbActive(true); } @@ -1032,10 +1041,8 @@ public class ColorDisplayServiceTest { @Test public void displayWhiteBalance_disabledWhileAccessibilityColorCorrectionEnabled() { setDisplayWhiteBalanceEnabled(true); - startService(); setAccessibilityColorCorrection(true); - - mCds.updateDisplayWhiteBalanceStatus(); + startService(); assertDwbActive(false); setAccessibilityColorCorrection(false); @@ -1046,10 +1053,8 @@ public class ColorDisplayServiceTest { @Test public void displayWhiteBalance_disabledWhileAccessibilityColorInversionEnabled() { setDisplayWhiteBalanceEnabled(true); - startService(); setAccessibilityColorInversion(true); - - mCds.updateDisplayWhiteBalanceStatus(); + startService(); assertDwbActive(false); setAccessibilityColorInversion(false); @@ -1057,6 +1062,80 @@ public class ColorDisplayServiceTest { assertDwbActive(true); } + @Test + public void compositionColorSpaces_noResources() { + final DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class); + reset(dtm); + + when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorModes)) + .thenReturn(new int[] {}); + when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorSpaces)) + .thenReturn(new int[] {}); + setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL); + startService(); + verify(dtm).setColorMode(eq(ColorDisplayManager.COLOR_MODE_NATURAL), any(), + eq(Display.COLOR_MODE_INVALID)); + } + + @Test + public void compositionColorSpaces_invalidResources() { + final DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class); + reset(dtm); + + when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorModes)) + .thenReturn(new int[] { + ColorDisplayManager.COLOR_MODE_NATURAL, + // Missing second color mode + }); + when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorSpaces)) + .thenReturn(new int[] { + Display.COLOR_MODE_SRGB, + Display.COLOR_MODE_DISPLAY_P3 + }); + setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL); + startService(); + verify(dtm).setColorMode(eq(ColorDisplayManager.COLOR_MODE_NATURAL), any(), + eq(Display.COLOR_MODE_INVALID)); + } + + @Test + public void compositionColorSpaces_validResources_validColorMode() { + final DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class); + reset(dtm); + + when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorModes)) + .thenReturn(new int[] { + ColorDisplayManager.COLOR_MODE_NATURAL + }); + when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorSpaces)) + .thenReturn(new int[] { + Display.COLOR_MODE_SRGB, + }); + setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL); + startService(); + verify(dtm).setColorMode(eq(ColorDisplayManager.COLOR_MODE_NATURAL), any(), + eq(Display.COLOR_MODE_SRGB)); + } + + @Test + public void compositionColorSpaces_validResources_invalidColorMode() { + final DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class); + reset(dtm); + + when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorModes)) + .thenReturn(new int[] { + ColorDisplayManager.COLOR_MODE_NATURAL + }); + when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorSpaces)) + .thenReturn(new int[] { + Display.COLOR_MODE_SRGB, + }); + setColorMode(ColorDisplayManager.COLOR_MODE_BOOSTED); + startService(); + verify(dtm).setColorMode(eq(ColorDisplayManager.COLOR_MODE_BOOSTED), any(), + eq(Display.COLOR_MODE_INVALID)); + } + /** * Configures Night display to use a custom schedule. * @@ -1159,7 +1238,7 @@ public class ColorDisplayServiceTest { InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { mCds.onBootPhase(SystemService.PHASE_BOOT_COMPLETED); - mCds.onStartUser(mUserId); + mCds.onUserChanged(mUserId); }); } diff --git a/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java b/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java new file mode 100644 index 000000000000..6b0798bdce22 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java @@ -0,0 +1,490 @@ +/* + * Copyright (C) 2019 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.display.whitebalance; + +import com.android.internal.R; +import com.google.common.collect.ImmutableList; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyLong; +import static org.mockito.Matchers.eq; +import org.mockito.stubbing.Answer; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; + +import android.content.ContextWrapper; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.os.Handler; +import android.os.Looper; +import android.util.TypedValue; + +import androidx.test.InstrumentationRegistry; + +import org.junit.Before; +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.List; + +@RunWith(JUnit4.class) +public final class AmbientLuxTest { + private static final int AMBIENT_COLOR_TYPE = 20705; + private static final String AMBIENT_COLOR_TYPE_STR = "colorSensoryDensoryDoc"; + private static final float LOW_LIGHT_AMBIENT_COLOR_TEMPERATURE = 5432.1f; + private static final float HIGH_LIGHT_AMBIENT_COLOR_TEMPERATURE = 3456.7f; + + private Handler mHandler = new Handler(Looper.getMainLooper()); + private Sensor mLightSensor; + private Sensor mAmbientColorSensor; + private ContextWrapper mContextSpy; + private Resources mResourcesSpy; + + @Mock private SensorManager mSensorManagerMock; + + @Mock private TypedArray mBrightnesses; + @Mock private TypedArray mBiases; + @Mock private TypedArray mHighLightBrightnesses; + @Mock private TypedArray mHighLightBiases; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + mLightSensor = createSensor(Sensor.TYPE_LIGHT, null); + mAmbientColorSensor = createSensor(AMBIENT_COLOR_TYPE, AMBIENT_COLOR_TYPE_STR); + mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext())); + mResourcesSpy = spy(mContextSpy.getResources()); + when(mContextSpy.getResources()).thenReturn(mResourcesSpy); + when(mSensorManagerMock.getDefaultSensor(Sensor.TYPE_LIGHT)).thenReturn(mLightSensor); + final List<Sensor> sensorList = ImmutableList.of(mLightSensor, mAmbientColorSensor); + when(mSensorManagerMock.getSensorList(Sensor.TYPE_ALL)).thenReturn(sensorList); + when(mResourcesSpy.getString( + R.string.config_displayWhiteBalanceColorTemperatureSensorName)) + .thenReturn(AMBIENT_COLOR_TYPE_STR); + when(mResourcesSpy.getInteger( + R.integer.config_displayWhiteBalanceDecreaseDebounce)) + .thenReturn(0); + when(mResourcesSpy.getInteger( + R.integer.config_displayWhiteBalanceIncreaseDebounce)) + .thenReturn(0); + mockResourcesFloat(R.dimen.config_displayWhiteBalanceLowLightAmbientColorTemperature, + LOW_LIGHT_AMBIENT_COLOR_TEMPERATURE); + mockResourcesFloat(R.dimen.config_displayWhiteBalanceHighLightAmbientColorTemperature, + HIGH_LIGHT_AMBIENT_COLOR_TEMPERATURE); + when(mResourcesSpy.obtainTypedArray( + R.array.config_displayWhiteBalanceAmbientColorTemperatures)) + .thenReturn(createTypedArray()); + when(mResourcesSpy.obtainTypedArray( + R.array.config_displayWhiteBalanceDisplayColorTemperatures)) + .thenReturn(createTypedArray()); + + when(mResourcesSpy.obtainTypedArray( + R.array.config_displayWhiteBalanceLowLightAmbientBrightnesses)) + .thenReturn(mBrightnesses); + when(mResourcesSpy.obtainTypedArray( + R.array.config_displayWhiteBalanceLowLightAmbientBiases)) + .thenReturn(mBiases); + when(mResourcesSpy.obtainTypedArray( + R.array.config_displayWhiteBalanceHighLightAmbientBrightnesses)) + .thenReturn(mHighLightBrightnesses); + when(mResourcesSpy.obtainTypedArray( + R.array.config_displayWhiteBalanceHighLightAmbientBiases)) + .thenReturn(mHighLightBiases); + mockThrottler(); + } + + @Test + public void testNoSpline() throws Exception { + setBrightnesses(); + setBiases(); + + DisplayWhiteBalanceController controller = + DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); + final float ambientColorTemperature = 8000.0f; + setEstimatedColorTemperature(controller, ambientColorTemperature); + controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + + for (float luxOverride = 0.1f; luxOverride <= 10000; luxOverride *= 10) { + setEstimatedBrightnessAndUpdate(controller, luxOverride); + assertEquals(controller.mPendingAmbientColorTemperature, + ambientColorTemperature, 0.001); + } + } + + @Test + public void testSpline_OneSegment() throws Exception { + final float lowerBrightness = 10.0f; + final float upperBrightness = 50.0f; + setBrightnesses(lowerBrightness, upperBrightness); + setBiases(0.0f, 1.0f); + + DisplayWhiteBalanceController controller = + DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); + final float ambientColorTemperature = 8000.0f; + setEstimatedColorTemperature(controller, ambientColorTemperature); + controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + + for (float t = 0.0f; t <= 1.0f; t += 0.1f) { + setEstimatedBrightnessAndUpdate(controller, + mix(lowerBrightness, upperBrightness, t)); + assertEquals(controller.mPendingAmbientColorTemperature, + mix(LOW_LIGHT_AMBIENT_COLOR_TEMPERATURE, ambientColorTemperature, t), 0.001); + } + + setEstimatedBrightnessAndUpdate(controller, 0.0f); + assertEquals(controller.mPendingAmbientColorTemperature, + LOW_LIGHT_AMBIENT_COLOR_TEMPERATURE, 0.001); + + setEstimatedBrightnessAndUpdate(controller, upperBrightness + 1.0f); + assertEquals(controller.mPendingAmbientColorTemperature, ambientColorTemperature, 0.001); + } + + @Test + public void testSpline_TwoSegments() throws Exception { + final float brightness0 = 10.0f; + final float brightness1 = 50.0f; + final float brightness2 = 60.0f; + setBrightnesses(brightness0, brightness1, brightness2); + final float bias0 = 0.0f; + final float bias1 = 0.25f; + final float bias2 = 1.0f; + setBiases(bias0, bias1, bias2); + + DisplayWhiteBalanceController controller = + DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); + final float ambientColorTemperature = 8000.0f; + setEstimatedColorTemperature(controller, ambientColorTemperature); + controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + + for (float t = 0.0f; t <= 1.0f; t += 0.1f) { + float luxOverride = mix(brightness0, brightness1, t); + setEstimatedBrightnessAndUpdate(controller, luxOverride); + float bias = mix(bias0, bias1, t); + assertEquals(controller.mPendingAmbientColorTemperature, + mix(LOW_LIGHT_AMBIENT_COLOR_TEMPERATURE, ambientColorTemperature, bias), 0.001); + } + + for (float t = 0.0f; t <= 1.0f; t += 0.1f) { + float luxOverride = mix(brightness1, brightness2, t); + setEstimatedBrightnessAndUpdate(controller, luxOverride); + float bias = mix(bias1, bias2, t); + assertEquals(controller.mPendingAmbientColorTemperature, + mix(LOW_LIGHT_AMBIENT_COLOR_TEMPERATURE, ambientColorTemperature, bias), 0.001); + } + + setEstimatedBrightnessAndUpdate(controller, 0.0f); + assertEquals(controller.mPendingAmbientColorTemperature, + LOW_LIGHT_AMBIENT_COLOR_TEMPERATURE, 0.001); + + setEstimatedBrightnessAndUpdate(controller, brightness2 + 1.0f); + assertEquals(controller.mPendingAmbientColorTemperature, ambientColorTemperature, 0.001); + } + + @Test + public void testSpline_VerticalSegment() throws Exception { + final float lowerBrightness = 10.0f; + final float upperBrightness = 10.0f; + setBrightnesses(lowerBrightness, upperBrightness); + setBiases(0.0f, 1.0f); + + DisplayWhiteBalanceController controller = + DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); + final float ambientColorTemperature = 8000.0f; + setEstimatedColorTemperature(controller, ambientColorTemperature); + controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + + setEstimatedBrightnessAndUpdate(controller, 0.0f); + assertEquals(controller.mPendingAmbientColorTemperature, + LOW_LIGHT_AMBIENT_COLOR_TEMPERATURE, 0.001); + + setEstimatedBrightnessAndUpdate(controller, upperBrightness + 1.0f); + assertEquals(controller.mPendingAmbientColorTemperature, ambientColorTemperature, 0.001); + } + + @Test + public void testSpline_InvalidEndBias() throws Exception { + setBrightnesses(10.0f, 1000.0f); + setBiases(0.0f, 2.0f); + + DisplayWhiteBalanceController controller = + DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); + final float ambientColorTemperature = 8000.0f; + setEstimatedColorTemperature(controller, ambientColorTemperature); + controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + + for (float luxOverride = 0.1f; luxOverride <= 10000; luxOverride *= 10) { + setEstimatedBrightnessAndUpdate(controller, luxOverride); + assertEquals(controller.mPendingAmbientColorTemperature, + ambientColorTemperature, 0.001); + } + } + + @Test + public void testSpline_InvalidBeginBias() throws Exception { + setBrightnesses(10.0f, 1000.0f); + setBiases(0.1f, 1.0f); + + DisplayWhiteBalanceController controller = + DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); + final float ambientColorTemperature = 8000.0f; + setEstimatedColorTemperature(controller, ambientColorTemperature); + controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + + for (float luxOverride = 0.1f; luxOverride <= 10000; luxOverride *= 10) { + setEstimatedBrightnessAndUpdate(controller, luxOverride); + assertEquals(controller.mPendingAmbientColorTemperature, + ambientColorTemperature, 0.001); + } + } + + @Test + public void testSpline_OneSegmentHighLight() throws Exception { + final float lowerBrightness = 10.0f; + final float upperBrightness = 50.0f; + setHighLightBrightnesses(lowerBrightness, upperBrightness); + setHighLightBiases(0.0f, 1.0f); + + DisplayWhiteBalanceController controller = + DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); + final float ambientColorTemperature = 8000.0f; + setEstimatedColorTemperature(controller, ambientColorTemperature); + controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + + for (float t = 0.0f; t <= 1.0f; t += 0.1f) { + setEstimatedBrightnessAndUpdate(controller, + mix(lowerBrightness, upperBrightness, t)); + assertEquals(controller.mPendingAmbientColorTemperature, + mix(HIGH_LIGHT_AMBIENT_COLOR_TEMPERATURE, ambientColorTemperature, 1.0f - t), + 0.001); + } + + setEstimatedBrightnessAndUpdate(controller, upperBrightness + 1.0f); + assertEquals(controller.mPendingAmbientColorTemperature, + HIGH_LIGHT_AMBIENT_COLOR_TEMPERATURE, 0.001); + + setEstimatedBrightnessAndUpdate(controller, 0.0f); + assertEquals(controller.mPendingAmbientColorTemperature, ambientColorTemperature, 0.001); + } + + @Test + public void testSpline_TwoSegmentsHighLight() throws Exception { + final float brightness0 = 10.0f; + final float brightness1 = 50.0f; + final float brightness2 = 60.0f; + setHighLightBrightnesses(brightness0, brightness1, brightness2); + final float bias0 = 0.0f; + final float bias1 = 0.25f; + final float bias2 = 1.0f; + setHighLightBiases(bias0, bias1, bias2); + + DisplayWhiteBalanceController controller = + DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); + final float ambientColorTemperature = 6000.0f; + setEstimatedColorTemperature(controller, ambientColorTemperature); + controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + + for (float t = 0.0f; t <= 1.0f; t += 0.1f) { + float luxOverride = mix(brightness0, brightness1, t); + setEstimatedBrightnessAndUpdate(controller, luxOverride); + float bias = mix(bias0, bias1, t); + assertEquals(controller.mPendingAmbientColorTemperature, + mix(HIGH_LIGHT_AMBIENT_COLOR_TEMPERATURE, ambientColorTemperature, 1.0f - bias), + 0.01); + } + + for (float t = 0.0f; t <= 1.0f; t += 0.1f) { + float luxOverride = mix(brightness1, brightness2, t); + setEstimatedBrightnessAndUpdate(controller, luxOverride); + float bias = mix(bias1, bias2, t); + assertEquals(controller.mPendingAmbientColorTemperature, + mix(HIGH_LIGHT_AMBIENT_COLOR_TEMPERATURE, ambientColorTemperature, 1.0f - bias), + 0.01); + } + + setEstimatedBrightnessAndUpdate(controller, brightness2 + 1.0f); + assertEquals(controller.mPendingAmbientColorTemperature, + HIGH_LIGHT_AMBIENT_COLOR_TEMPERATURE, 0.001); + + setEstimatedBrightnessAndUpdate(controller, 0.0f); + assertEquals(controller.mPendingAmbientColorTemperature, ambientColorTemperature, 0.001); + } + + @Test + public void testSpline_InvalidCombinations() throws Exception { + setBrightnesses(100.0f, 200.0f); + setBiases(0.0f, 1.0f); + setHighLightBrightnesses(150.0f, 250.0f); + setHighLightBiases(0.0f, 1.0f); + + DisplayWhiteBalanceController controller = + DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); + final float ambientColorTemperature = 8000.0f; + setEstimatedColorTemperature(controller, ambientColorTemperature); + controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + + for (float luxOverride = 0.1f; luxOverride <= 10000; luxOverride *= 10) { + setEstimatedBrightnessAndUpdate(controller, luxOverride); + assertEquals(controller.mPendingAmbientColorTemperature, + ambientColorTemperature, 0.001); + } + } + + @Test + public void testLowLight_DefaultAmbient() throws Exception { + final float lowerBrightness = 10.0f; + final float upperBrightness = 50.0f; + setBrightnesses(lowerBrightness, upperBrightness); + setBiases(0.0f, 1.0f); + + DisplayWhiteBalanceController controller = + DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); + final float ambientColorTemperature = -1.0f; + setEstimatedColorTemperature(controller, ambientColorTemperature); + controller.mBrightnessFilter = spy(controller.mBrightnessFilter); + + for (float t = 0.0f; t <= 1.0f; t += 0.1f) { + setEstimatedBrightnessAndUpdate(controller, + mix(lowerBrightness, upperBrightness, t)); + assertEquals(controller.mPendingAmbientColorTemperature, ambientColorTemperature, + 0.001); + } + + setEstimatedBrightnessAndUpdate(controller, 0.0f); + assertEquals(controller.mPendingAmbientColorTemperature, ambientColorTemperature, 0.001); + + setEstimatedBrightnessAndUpdate(controller, upperBrightness + 1.0f); + assertEquals(controller.mPendingAmbientColorTemperature, ambientColorTemperature, 0.001); + } + + void mockThrottler() { + when(mResourcesSpy.getInteger( + R.integer.config_displayWhiteBalanceDecreaseDebounce)).thenReturn(0); + when(mResourcesSpy.getInteger( + R.integer.config_displayWhiteBalanceIncreaseDebounce)).thenReturn(0); + TypedArray base = mResourcesSpy.obtainTypedArray( + R.array.config_displayWhiteBalanceBaseThresholds); + TypedArray inc = mResourcesSpy.obtainTypedArray( + R.array.config_displayWhiteBalanceIncreaseThresholds); + TypedArray dec = mResourcesSpy.obtainTypedArray( + R.array.config_displayWhiteBalanceDecreaseThresholds); + base = spy(base); + inc = spy(inc); + dec = spy(dec); + when(mResourcesSpy.obtainTypedArray( + R.array.config_displayWhiteBalanceBaseThresholds)).thenReturn(base); + when(mResourcesSpy.obtainTypedArray( + R.array.config_displayWhiteBalanceIncreaseThresholds)).thenReturn(inc); + when(mResourcesSpy.obtainTypedArray( + R.array.config_displayWhiteBalanceDecreaseThresholds)).thenReturn(dec); + setFloatArrayResource(base, new float[]{0.0f}); + setFloatArrayResource(inc, new float[]{0.0f}); + setFloatArrayResource(dec, new float[]{0.0f}); + } + + private void mockResourcesFloat(int id, float floatValue) { + doAnswer(new Answer<Void>() { + public Void answer(InvocationOnMock invocation) { + TypedValue value = (TypedValue)invocation.getArgument(1); + value.type = TypedValue.TYPE_FLOAT; + value.data = Float.floatToIntBits(floatValue); + return null; + } + }).when(mResourcesSpy).getValue( + eq(id), + any(TypedValue.class), eq(true)); + } + + private void setEstimatedColorTemperature(DisplayWhiteBalanceController controller, + float ambientColorTemperature) { + AmbientFilter colorTemperatureFilter = spy(controller.mColorTemperatureFilter); + controller.mColorTemperatureFilter = colorTemperatureFilter; + when(colorTemperatureFilter.getEstimate(anyLong())).thenReturn(ambientColorTemperature); + } + + private void setEstimatedBrightnessAndUpdate(DisplayWhiteBalanceController controller, + float brightness) { + when(controller.mBrightnessFilter.getEstimate(anyLong())).thenReturn(brightness); + controller.updateAmbientColorTemperature(); + } + + private void setBrightnesses(float... vals) { + setFloatArrayResource(mBrightnesses, vals); + } + + private void setBiases(float... vals) { + setFloatArrayResource(mBiases, vals); + } + + private void setHighLightBrightnesses(float... vals) { + setFloatArrayResource(mHighLightBrightnesses, vals); + } + + private void setHighLightBiases(float... vals) { + setFloatArrayResource(mHighLightBiases, vals); + } + + private void setFloatArrayResource(TypedArray array, float[] vals) { + when(array.length()).thenReturn(vals.length); + for (int i = 0; i < vals.length; i++) { + when(array.getFloat(i, Float.NaN)).thenReturn(vals[i]); + } + } + + private void setSensorType(Sensor sensor, int type, String strType) throws Exception { + Method setter = Sensor.class.getDeclaredMethod("setType", Integer.TYPE); + setter.setAccessible(true); + setter.invoke(sensor, type); + if (strType != null) { + Field f = sensor.getClass().getDeclaredField("mStringType"); + f.setAccessible(true); + f.set(sensor, strType); + } + } + + private Sensor createSensor(int type, String strType) throws Exception { + Constructor<Sensor> constr = Sensor.class.getDeclaredConstructor(); + constr.setAccessible(true); + Sensor sensor = constr.newInstance(); + setSensorType(sensor, type, strType); + return sensor; + } + + private TypedArray createTypedArray() throws Exception { + TypedArray mockArray = mock(TypedArray.class); + return mockArray; + } + + private static float mix(float a, float b, float t) { + return (1.0f - t) * a + t * b; + } +} diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java index f85e2cc10800..5c67d0422aca 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsServiceTestable.java @@ -110,7 +110,7 @@ public class LockSettingsServiceTestable extends LockSettingsService { } @Override - public boolean hasEnrolledBiometrics() { + public boolean hasEnrolledBiometrics(int userId) { return false; } diff --git a/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java b/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java index a63f49b1fe3d..44769180824e 100644 --- a/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java +++ b/services/tests/servicestests/src/com/android/server/power/AttentionDetectorTest.java @@ -42,6 +42,8 @@ import android.service.attention.AttentionService; import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.SmallTest; +import com.android.server.wm.WindowManagerInternal; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -57,6 +59,8 @@ public class AttentionDetectorTest extends AndroidTestCase { @Mock private AttentionManagerInternal mAttentionManagerInternal; @Mock + private WindowManagerInternal mWindowManagerInternal; + @Mock private Runnable mOnUserAttention; private TestableAttentionDetector mAttentionDetector; private long mAttentionTimeout; @@ -71,6 +75,7 @@ public class AttentionDetectorTest extends AndroidTestCase { PackageManager.PERMISSION_GRANTED); when(mAttentionManagerInternal.checkAttention(anyLong(), any())) .thenReturn(true); + when(mWindowManagerInternal.isKeyguardShowingAndNotOccluded()).thenReturn(false); mAttentionDetector = new TestableAttentionDetector(); mAttentionDetector.onWakefulnessChangeStarted(PowerManagerInternal.WAKEFULNESS_AWAKE); mAttentionDetector.setAttentionServiceSupported(true); @@ -117,6 +122,15 @@ public class AttentionDetectorTest extends AndroidTestCase { } @Test + public void testOnUserActivity_doesntCheckIfInLockscreen() { + when(mWindowManagerInternal.isKeyguardShowingAndNotOccluded()).thenReturn(true); + + long when = registerAttention(); + verify(mAttentionManagerInternal, never()).checkAttention(anyLong(), any()); + assertThat(mNextDimming).isEqualTo(when); + } + + @Test public void testOnUserActivity_doesntCheckIfNotSufficientPermissions() { when(mPackageManager.checkPermission(any(), any())).thenReturn( PackageManager.PERMISSION_DENIED); @@ -299,6 +313,7 @@ public class AttentionDetectorTest extends AndroidTestCase { TestableAttentionDetector() { super(AttentionDetectorTest.this.mOnUserAttention, new Object()); mAttentionManager = mAttentionManagerInternal; + mWindowManager = mWindowManagerInternal; mPackageManager = AttentionDetectorTest.this.mPackageManager; mContentResolver = getContext().getContentResolver(); mMaximumExtensionMillis = 10000L; diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java index 1bda412f2f89..88de250e4b0d 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -23,7 +23,10 @@ import static android.os.PowerManagerInternal.WAKEFULNESS_DREAMING; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.argThat; @@ -59,6 +62,7 @@ import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings; +import android.view.Display; import androidx.test.InstrumentationRegistry; @@ -157,6 +161,10 @@ public class PowerManagerServiceTest { mResourcesSpy = spy(mContextSpy.getResources()); when(mContextSpy.getResources()).thenReturn(mResourcesSpy); + when(mDisplayManagerInternalMock.requestPowerState(any(), anyBoolean())).thenReturn(true); + } + + private PowerManagerService createService() { mService = new PowerManagerService(mContextSpy, new Injector() { @Override Notifier createNotifier(Looper looper, Context context, IBatteryStats batteryStats, @@ -166,7 +174,7 @@ public class PowerManagerServiceTest { @Override SuspendBlocker createSuspendBlocker(PowerManagerService service, String name) { - return mock(SuspendBlocker.class); + return super.createSuspendBlocker(service, name); } @Override @@ -191,6 +199,7 @@ public class PowerManagerServiceTest { return mAmbientDisplayConfigurationMock; } }); + return mService; } @After @@ -262,6 +271,7 @@ public class PowerManagerServiceTest { @Test public void testUpdatePowerScreenPolicy_UpdateDisplayPowerRequest() { + createService(); mService.updatePowerRequestFromBatterySaverPolicy(mDisplayPowerRequest); assertThat(mDisplayPowerRequest.lowPowerMode).isEqualTo(BATTERY_SAVER_ENABLED); assertThat(mDisplayPowerRequest.screenLowPowerBrightnessFactor) @@ -270,6 +280,7 @@ public class PowerManagerServiceTest { @Test public void testGetLastShutdownReasonInternal() { + createService(); SystemProperties.set(TEST_LAST_REBOOT_PROPERTY, "shutdown,thermal"); int reason = mService.getLastShutdownReasonInternal(TEST_LAST_REBOOT_PROPERTY); SystemProperties.set(TEST_LAST_REBOOT_PROPERTY, ""); @@ -278,6 +289,7 @@ public class PowerManagerServiceTest { @Test public void testGetDesiredScreenPolicy_WithVR() throws Exception { + createService(); // Brighten up the screen mService.setWakefulnessLocked(WAKEFULNESS_AWAKE, PowerManager.WAKE_REASON_UNKNOWN, 0); assertThat(mService.getDesiredScreenPolicyLocked()).isEqualTo( @@ -307,11 +319,13 @@ public class PowerManagerServiceTest { @Test public void testWakefulnessAwake_InitialValue() throws Exception { + createService(); assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE); } @Test public void testWakefulnessSleep_NoDozeSleepFlag() throws Exception { + createService(); // Start with AWAKE state startSystem(); assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE); @@ -324,6 +338,7 @@ public class PowerManagerServiceTest { @Test public void testWakefulnessAwake_AcquireCausesWakeup() throws Exception { + createService(); startSystem(); forceSleep(); @@ -355,6 +370,7 @@ public class PowerManagerServiceTest { @Test public void testWakefulnessAwake_IPowerManagerWakeUp() throws Exception { + createService(); startSystem(); forceSleep(); mService.getBinderServiceInstance().wakeUp(SystemClock.uptimeMillis(), @@ -369,6 +385,8 @@ public class PowerManagerServiceTest { @Test public void testWakefulnessAwake_ShouldWakeUpWhenPluggedIn() throws Exception { boolean powerState; + + createService(); startSystem(); forceSleep(); @@ -444,6 +462,7 @@ public class PowerManagerServiceTest { @Test public void testWakefulnessDoze_goToSleep() throws Exception { + createService(); // Start with AWAKE state startSystem(); assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE); @@ -457,6 +476,7 @@ public class PowerManagerServiceTest { @Test public void testWasDeviceIdleFor_true() { int interval = 1000; + createService(); mService.onUserActivity(); SystemClock.sleep(interval + 1 /* just a little more */); assertThat(mService.wasDeviceIdleForInternal(interval)).isTrue(); @@ -465,12 +485,14 @@ public class PowerManagerServiceTest { @Test public void testWasDeviceIdleFor_false() { int interval = 1000; + createService(); mService.onUserActivity(); assertThat(mService.wasDeviceIdleForInternal(interval)).isFalse(); } @Test public void testForceSuspend_putsDeviceToSleep() { + createService(); mService.systemReady(null); mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED); @@ -497,6 +519,8 @@ public class PowerManagerServiceTest { final int flags = PowerManager.PARTIAL_WAKE_LOCK; final String pkg = mContextSpy.getOpPackageName(); + createService(); + // Set up the Notification mock to keep track of the wakelocks that are currently // active or disabled. We'll use this to verify that wakelocks are disabled when // they should be. @@ -541,7 +565,54 @@ public class PowerManagerServiceTest { @Test public void testForceSuspend_forceSuspendFailurePropogated() { + createService(); when(mNativeWrapperMock.nativeForceSuspend()).thenReturn(false); assertThat(mService.getBinderServiceInstance().forceSuspend()).isFalse(); } + + @Test + public void testSetDozeOverrideFromDreamManager_triggersSuspendBlocker() throws Exception { + final String suspendBlockerName = "PowerManagerService.Display"; + final String tag = "acq_causes_wakeup"; + final String packageName = "pkg.name"; + final IBinder token = new Binder(); + + final boolean[] isAcquired = new boolean[1]; + doAnswer(inv -> { + if (suspendBlockerName.equals(inv.getArguments()[0])) { + isAcquired[0] = false; + } + return null; + }).when(mNativeWrapperMock).nativeReleaseSuspendBlocker(any()); + + doAnswer(inv -> { + if (suspendBlockerName.equals(inv.getArguments()[0])) { + isAcquired[0] = true; + } + return null; + }).when(mNativeWrapperMock).nativeAcquireSuspendBlocker(any()); + + // Need to create the service after we stub the mocks for this test because some of the + // mocks are used during the constructor. + createService(); + + // Start with AWAKE state + startSystem(); + assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE); + assertTrue(isAcquired[0]); + + // Take a nap and verify we no longer hold the blocker + int flags = PowerManager.DOZE_WAKE_LOCK; + mService.getBinderServiceInstance().acquireWakeLock(token, flags, tag, packageName, + null /* workSource */, null /* historyTag */); + mService.getBinderServiceInstance().goToSleep(SystemClock.uptimeMillis(), + PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0); + assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_DOZING); + assertFalse(isAcquired[0]); + + // Override the display state by DreamManager and verify is reacquires the blocker. + mService.getLocalServiceInstance() + .setDozeOverrideFromDreamManager(Display.STATE_ON, PowerManager.BRIGHTNESS_DEFAULT); + assertTrue(isAcquired[0]); + } } 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 6061d51f3d79..8c3373faa0d4 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/BuzzBeepBlinkTest.java @@ -156,7 +156,7 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { mService.setUsageStats(mUsageStats); mService.setAccessibilityManager(accessibilityManager); mService.mScreenOn = false; - mService.mInCall = false; + mService.mInCallStateOffHook = false; mService.mNotificationPulseEnabled = true; } @@ -681,7 +681,7 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { mService.buzzBeepBlinkLocked(r); Mockito.reset(mRingtonePlayer); - mService.mInCall = true; + mService.mInCallStateOffHook = true; mService.buzzBeepBlinkLocked(r); verify(mService, times(1)).playInCallNotification(); @@ -1137,7 +1137,7 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase { @Test public void testLightsInCall() { - mService.mInCall = true; + mService.mInCallStateOffHook = true; NotificationRecord r = getLightsNotification(); mService.buzzBeepBlinkLocked(r); verifyNeverLights(); diff --git a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java index f5002ace6690..3b336eb7aec9 100644 --- a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java +++ b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java @@ -7,10 +7,12 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.argThat; 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; @@ -159,4 +161,25 @@ public class PinnedSliceStateTest extends UiServiceTestCase { verify(mSliceService).removePinnedSlice(eq(TEST_URI)); assertFalse(mPinnedSliceManager.hasPinOrListener()); } + + @Test + public void testPinFailed() throws Exception { + // Throw exception when trying to pin + doAnswer(invocation -> { + throw new Exception("Pin failed"); + }).when(mIContentProvider).call( + anyString(), anyString(), anyString(), eq(null), any()); + + TestableLooper.get(this).processAllMessages(); + + // When pinned for the first time, a pinned message should be sent. + mPinnedSliceManager.pin("pkg", FIRST_SPECS, mToken); + TestableLooper.get(this).processAllMessages(); + + verify(mIContentProvider).call(anyString(), anyString(), eq(SliceProvider.METHOD_PIN), + eq(null), argThat(b -> { + assertEquals(TEST_URI, b.getParcelable(SliceProvider.EXTRA_BIND_URI)); + return true; + })); + } } diff --git a/services/tests/wmtests/AndroidManifest.xml b/services/tests/wmtests/AndroidManifest.xml index 2ce33fcc62b4..8c4544249b5c 100644 --- a/services/tests/wmtests/AndroidManifest.xml +++ b/services/tests/wmtests/AndroidManifest.xml @@ -50,6 +50,9 @@ <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$ActivityRequestedOrientationChange" /> <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$ActivityTaskChangeCallbacks" /> <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$ActivityTaskDescriptionChange" /> + <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$ActivityViewTestActivity" /> + <activity android:name="com.android.server.wm.TaskStackChangedListenerTest$ActivityInActivityView" + android:resizeableActivity="true" /> <activity android:name="com.android.server.wm.ScreenDecorWindowTests$TestActivity" android:showWhenLocked="true" /> </application> 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 8fbb7f53e668..4608c3b1a823 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.os.Process.NOBODY_UID; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Surface.ROTATION_0; import static android.view.Surface.ROTATION_90; @@ -40,6 +41,8 @@ import static com.android.server.wm.ActivityStack.STACK_VISIBILITY_INVISIBLE; import static com.android.server.wm.ActivityStack.STACK_VISIBILITY_VISIBLE; import static com.android.server.wm.ActivityStack.STACK_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT; +import static com.google.common.truth.Truth.assertThat; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; @@ -54,8 +57,10 @@ import android.app.ActivityOptions; import android.app.servertransaction.ActivityConfigurationChangeItem; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.PauseActivityItem; +import android.content.ComponentName; import android.content.pm.ActivityInfo; import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.Rect; import android.platform.test.annotations.Presubmit; import android.util.MergedConfiguration; @@ -67,6 +72,7 @@ import android.view.RemoteAnimationTarget; import androidx.test.filters.MediumTest; +import com.android.internal.R; import com.android.server.wm.utils.WmDisplayCutout; import org.junit.Before; @@ -605,6 +611,15 @@ public class ActivityRecordTests extends ActivityTestsBase { assertNull(mActivity.pendingOptions); } + @Test + public void testCanLaunchHomeActivityFromChooser() { + ComponentName chooserComponent = ComponentName.unflattenFromString( + Resources.getSystem().getString(R.string.config_chooserActivity)); + ActivityRecord chooserActivity = new ActivityBuilder(mService).setComponent( + chooserComponent).build(); + assertThat(mActivity.canLaunchHomeActivity(NOBODY_UID, chooserActivity)).isTrue(); + } + /** Setup {@link #mActivity} as a size-compat-mode-able activity without fixed orientation. */ private void prepareFixedAspectRatioUnresizableActivity() { setupDisplayContentForCompatDisplayInsets(); diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java index a08923bafe28..3d944671ef25 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java @@ -842,4 +842,51 @@ public class ActivityStarterTests extends ActivityTestsBase { // Ensure the activity is moved to secondary display. assertEquals(secondaryDisplay, topActivity.getDisplay()); } + + /** + * This test ensures that starting an activity with the freeze-task-list activity option will + * actually freeze the task list + */ + @Test + public void testFreezeTaskListActivityOption() { + RecentTasks recentTasks = mock(RecentTasks.class); + mService.mStackSupervisor.setRecentTasks(recentTasks); + doReturn(true).when(recentTasks).isCallerRecents(anyInt()); + + final ActivityStarter starter = prepareStarter(0 /* flags */); + final ActivityOptions options = ActivityOptions.makeBasic(); + options.setFreezeRecentTasksReordering(); + + starter.setReason("testFreezeTaskListActivityOption") + .setActivityOptions(new SafeActivityOptions(options)) + .execute(); + + verify(recentTasks, times(1)).setFreezeTaskListReordering(); + verify(recentTasks, times(0)).resetFreezeTaskListReorderingOnTimeout(); + } + + /** + * This test ensures that if we froze the task list as a part of starting an activity that fails + * to start, that we also reset the task list. + */ + @Test + public void testFreezeTaskListActivityOptionFailedStart_expectResetFreezeTaskList() { + RecentTasks recentTasks = mock(RecentTasks.class); + mService.mStackSupervisor.setRecentTasks(recentTasks); + doReturn(true).when(recentTasks).isCallerRecents(anyInt()); + + final ActivityStarter starter = prepareStarter(0 /* flags */); + final ActivityOptions options = ActivityOptions.makeBasic(); + options.setFreezeRecentTasksReordering(); + + starter.setReason("testFreezeTaskListActivityOptionFailedStart") + .setActivityOptions(new SafeActivityOptions(options)) + .execute(); + + // Simulate a failed start + starter.postStartActivityProcessing(null, START_ABORTED, null); + + verify(recentTasks, times(1)).setFreezeTaskListReordering(); + verify(recentTasks, times(1)).resetFreezeTaskListReorderingOnTimeout(); + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java index 4986a6d5bd0d..ecf3acd32d4f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java @@ -85,6 +85,7 @@ import org.mockito.invocation.InvocationOnMock; import java.io.File; import java.util.List; +import java.util.function.Consumer; /** * A base class to handle common operations in activity related unit tests. @@ -169,8 +170,12 @@ class ActivityTestsBase { * Delegates task creation to {@link #TaskBuilder} to avoid the dependency of window hierarchy * when starting activity in unit tests. */ - void mockTaskRecordFactory() { - final TaskRecord task = new TaskBuilder(mSupervisor).setCreateStack(false).build(); + void mockTaskRecordFactory(Consumer<TaskBuilder> taskBuilderSetup) { + final TaskBuilder taskBuilder = new TaskBuilder(mSupervisor).setCreateStack(false); + if (taskBuilderSetup != null) { + taskBuilderSetup.accept(taskBuilder); + } + final TaskRecord task = taskBuilder.build(); final TaskRecordFactory factory = mock(TaskRecordFactory.class); TaskRecord.setTaskRecordFactory(factory); doReturn(task).when(factory).create(any() /* service */, anyInt() /* taskId */, @@ -178,6 +183,10 @@ class ActivityTestsBase { any() /* voiceInteractor */); } + void mockTaskRecordFactory() { + mockTaskRecordFactory(null /* taskBuilderSetup */); + } + /** * Builder for creating new activities. */ diff --git a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java index 7f35dac9611a..d9566a3c871d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java @@ -504,6 +504,21 @@ public class AppWindowTokenTests extends WindowTestsBase { assertEquals(stackBounds, mToken.getAnimationBounds(STACK_CLIP_BEFORE_ANIM)); } + @Test + public void testHasStartingWindow() { + final WindowManager.LayoutParams attrs = + new WindowManager.LayoutParams(TYPE_APPLICATION_STARTING); + final WindowTestUtils.TestWindowState startingWindow = createWindowState(attrs, mToken); + mToken.startingDisplayed = true; + mToken.addWindow(startingWindow); + assertTrue("Starting window should be present", mToken.hasStartingWindow()); + mToken.startingDisplayed = false; + assertTrue("Starting window should be present", mToken.hasStartingWindow()); + + mToken.removeChild(startingWindow); + assertFalse("Starting window should not be present", mToken.hasStartingWindow()); + } + private void assertHasStartingWindow(AppWindowToken atoken) { assertNotNull(atoken.startingSurface); assertNotNull(atoken.mStartingData); diff --git a/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java b/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java index 558672609304..e02b69c4b058 100644 --- a/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/HighRefreshRateBlacklistTest.java @@ -16,71 +16,153 @@ package com.android.server.wm; +import static android.provider.DeviceConfig.WindowManager.KEY_HIGH_REFRESH_RATE_BLACKLIST; + import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import android.content.res.Resources; import android.platform.test.annotations.Presubmit; +import android.provider.DeviceConfig; +import android.util.Pair; -import androidx.test.filters.FlakyTest; import androidx.test.filters.SmallTest; -import com.android.server.wm.HighRefreshRateBlacklist.SystemPropertyGetter; +import com.android.internal.R; +import com.android.server.wm.HighRefreshRateBlacklist.DeviceConfigInterface; import org.junit.Test; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; + /** * Build/Install/Run: - * atest WmTests:HighRefreshRateBlacklistTest + * atest WmTests:HighRefreshRateBlacklistTest */ @SmallTest @Presubmit -@FlakyTest public class HighRefreshRateBlacklistTest { @Test - public void testBlacklist() { - HighRefreshRateBlacklist blacklist = new HighRefreshRateBlacklist( - new SystemPropertyGetter() { - - @Override - public int getInt(String key, int def) { - if ("ro.window_manager.high_refresh_rate_blacklist_length".equals(key)) { - return 2; - } - return def; - } - - @Override - public String get(String key) { - if ("ro.window_manager.high_refresh_rate_blacklist_entry1".equals(key)) { - return "com.android.sample1"; - } - if ("ro.window_manager.high_refresh_rate_blacklist_entry2".equals(key)) { - return "com.android.sample2"; - } - return ""; - } - }); + public void testDefaultBlacklist() { + final Resources r = createResources("com.android.sample1", "com.android.sample2"); + HighRefreshRateBlacklist blacklist = + new HighRefreshRateBlacklist(r, new FakeDeviceConfigInterface()); assertTrue(blacklist.isBlacklisted("com.android.sample1")); assertTrue(blacklist.isBlacklisted("com.android.sample2")); assertFalse(blacklist.isBlacklisted("com.android.sample3")); } @Test - public void testNoBlacklist() { - HighRefreshRateBlacklist blacklist = new HighRefreshRateBlacklist( - new SystemPropertyGetter() { - - @Override - public int getInt(String key, int def) { - return def; - } - - @Override - public String get(String key) { - return ""; - } - }); + public void testNoDefaultBlacklist() { + final Resources r = createResources(); + HighRefreshRateBlacklist blacklist = + new HighRefreshRateBlacklist(r, new FakeDeviceConfigInterface()); + assertFalse(blacklist.isBlacklisted("com.android.sample1")); + } + + @Test + public void testDefaultBlacklistIsOverriddenByDeviceConfig() { + final Resources r = createResources("com.android.sample1"); + final FakeDeviceConfigInterface config = new FakeDeviceConfigInterface(); + config.setBlacklist("com.android.sample2,com.android.sample3"); + HighRefreshRateBlacklist blacklist = new HighRefreshRateBlacklist(r, config); + assertFalse(blacklist.isBlacklisted("com.android.sample1")); + assertTrue(blacklist.isBlacklisted("com.android.sample2")); + assertTrue(blacklist.isBlacklisted("com.android.sample3")); + } + + @Test + public void testDefaultBlacklistIsOverriddenByEmptyDeviceConfig() { + final Resources r = createResources("com.android.sample1"); + final FakeDeviceConfigInterface config = new FakeDeviceConfigInterface(); + config.setBlacklist(""); + HighRefreshRateBlacklist blacklist = new HighRefreshRateBlacklist(r, config); assertFalse(blacklist.isBlacklisted("com.android.sample1")); } + + @Test + public void testDefaultBlacklistIsOverriddenByDeviceConfigUpdate() { + final Resources r = createResources("com.android.sample1"); + final FakeDeviceConfigInterface config = new FakeDeviceConfigInterface(); + HighRefreshRateBlacklist blacklist = new HighRefreshRateBlacklist(r, config); + + // First check that the default blacklist is in effect + assertTrue(blacklist.isBlacklisted("com.android.sample1")); + assertFalse(blacklist.isBlacklisted("com.android.sample2")); + assertFalse(blacklist.isBlacklisted("com.android.sample3")); + + // Then confirm that the DeviceConfig list has propagated and taken effect. + config.setBlacklist("com.android.sample2,com.android.sample3"); + assertFalse(blacklist.isBlacklisted("com.android.sample1")); + assertTrue(blacklist.isBlacklisted("com.android.sample2")); + assertTrue(blacklist.isBlacklisted("com.android.sample3")); + + // Finally make sure we go back to the default list if the DeviceConfig gets deleted. + config.setBlacklist(null); + assertTrue(blacklist.isBlacklisted("com.android.sample1")); + assertFalse(blacklist.isBlacklisted("com.android.sample2")); + assertFalse(blacklist.isBlacklisted("com.android.sample3")); + } + + private Resources createResources(String... defaultBlacklist) { + Resources r = mock(Resources.class); + when(r.getStringArray(R.array.config_highRefreshRateBlacklist)) + .thenReturn(defaultBlacklist); + return r; + } + + + class FakeDeviceConfigInterface implements DeviceConfigInterface { + private List<Pair<DeviceConfig.OnPropertyChangedListener, Executor>> mListeners = + new ArrayList<>(); + private String mBlacklist; + + @Override + public String getProperty(String namespace, String name) { + if (!DeviceConfig.NAMESPACE_WINDOW_MANAGER.equals(namespace) + || !KEY_HIGH_REFRESH_RATE_BLACKLIST.equals(name)) { + throw new IllegalArgumentException("Only things in NAMESPACE_WINDOW_MANAGER " + + "supported."); + } + return mBlacklist; + } + + @Override + public void addOnPropertyChangedListener(String namespace, Executor executor, + DeviceConfig.OnPropertyChangedListener listener) { + + if (!DeviceConfig.NAMESPACE_WINDOW_MANAGER.equals(namespace)) { + throw new IllegalArgumentException("Only things in NAMESPACE_WINDOW_MANAGER " + + "supported."); + } + mListeners.add(new Pair<>(listener, executor)); + } + + void setBlacklist(String blacklist) { + mBlacklist = blacklist; + CountDownLatch latch = new CountDownLatch(mListeners.size()); + for (Pair<DeviceConfig.OnPropertyChangedListener, Executor> listenerInfo : + mListeners) { + final Executor executor = listenerInfo.second; + final DeviceConfig.OnPropertyChangedListener listener = listenerInfo.first; + executor.execute(() -> { + listener.onPropertyChanged(DeviceConfig.NAMESPACE_WINDOW_MANAGER, + KEY_HIGH_REFRESH_RATE_BLACKLIST, blacklist); + latch.countDown(); + }); + } + try { + latch.await(10, TimeUnit.SECONDS); + } catch (InterruptedException e) { + throw new RuntimeException("Failed to notify all blacklist listeners in time.", e); + } + } + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java index 26cd63c62cc1..cd292b2494ff 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java @@ -25,6 +25,7 @@ import static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE; import static com.android.dx.mockito.inline.extended.ExtendedMockito.atLeast; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verifyNoMoreInteractions; @@ -35,10 +36,12 @@ import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_O import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import android.os.Binder; @@ -79,6 +82,7 @@ public class RecentsAnimationControllerTest extends WindowTestsBase { // Hold the lock to protect the stubbing from being accessed by other threads. spyOn(mWm.mRoot); doNothing().when(mWm.mRoot).performSurfacePlacement(anyBoolean()); + doReturn(mDisplayContent).when(mWm.mRoot).getDisplayContent(anyInt()); } when(mMockRunner.asBinder()).thenReturn(new Binder()); mController = new RecentsAnimationController(mWm, mMockRunner, mAnimationCallbacks, @@ -135,7 +139,7 @@ public class RecentsAnimationControllerTest extends WindowTestsBase { hiddenAppWindow.setHidden(true); mDisplayContent.getConfiguration().windowConfiguration.setRotation( mDisplayContent.getRotation()); - mController.initialize(mDisplayContent, ACTIVITY_TYPE_HOME, new SparseBooleanArray()); + mController.initialize(ACTIVITY_TYPE_HOME, new SparseBooleanArray()); // Ensure that we are animating the target activity as well assertTrue(mController.isAnimatingTask(homeAppWindow.getTask())); @@ -144,7 +148,7 @@ public class RecentsAnimationControllerTest extends WindowTestsBase { } @Test - public void testCancelAnimationWithScreenShot() throws Exception { + public void testDeferCancelAnimation() throws Exception { mWm.setRecentsAnimationController(mController); final AppWindowToken appWindow = createAppWindowToken(mDisplayContent, WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD); @@ -156,8 +160,31 @@ public class RecentsAnimationControllerTest extends WindowTestsBase { mController.addAnimation(appWindow.getTask(), false /* isRecentTaskInvisible */); assertTrue(mController.isAnimatingTask(appWindow.getTask())); - mController.setCancelWithDeferredScreenshotLocked(true); - mController.cancelAnimationWithScreenShot(); + mController.setDeferredCancel(true /* deferred */, false /* screenshot */); + mController.cancelAnimationWithScreenshot(false /* screenshot */); + verify(mMockRunner).onAnimationCanceled(false /* deferredWithScreenshot */); + assertNull(mController.mRecentScreenshotAnimator); + + // Simulate the app transition finishing + mController.mAppTransitionListener.onAppTransitionStartingLocked(0, 0, 0, 0); + verify(mAnimationCallbacks).onAnimationFinished(REORDER_KEEP_IN_PLACE, true, false); + } + + @Test + public void testDeferCancelAnimationWithScreenShot() throws Exception { + mWm.setRecentsAnimationController(mController); + final AppWindowToken appWindow = createAppWindowToken(mDisplayContent, + WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD); + final WindowState win1 = createWindow(null, TYPE_BASE_APPLICATION, appWindow, "win1"); + appWindow.addWindow(win1); + assertEquals(appWindow.getTask().getTopVisibleAppToken(), appWindow); + assertEquals(appWindow.findMainWindow(), win1); + + mController.addAnimation(appWindow.getTask(), false /* isRecentTaskInvisible */); + assertTrue(mController.isAnimatingTask(appWindow.getTask())); + + mController.setDeferredCancel(true /* deferred */, true /* screenshot */); + mController.cancelAnimationWithScreenshot(true /* screenshot */); verify(mMockRunner).onAnimationCanceled(true /* deferredWithScreenshot */); assertNotNull(mController.mRecentScreenshotAnimator); assertTrue(mController.mRecentScreenshotAnimator.isAnimating()); @@ -185,7 +212,7 @@ public class RecentsAnimationControllerTest extends WindowTestsBase { // Assume appWindow transition should animate when no // IRecentsAnimationController#setCancelWithDeferredScreenshot called. - assertFalse(mController.shouldCancelWithDeferredScreenshot()); + assertFalse(mController.shouldDeferCancelWithScreenshot()); assertTrue(appWindow.shouldAnimate(TRANSIT_ACTIVITY_CLOSE)); } diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java index 1f8b33eb5bb4..0e119e3cc375 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java @@ -42,8 +42,11 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; +import android.app.IApplicationThread; import android.content.ComponentName; import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; import android.platform.test.annotations.Presubmit; import android.view.IRecentsAnimationRunner; @@ -111,6 +114,57 @@ public class RecentsAnimationTest extends ActivityTestsBase { } @Test + public void testPreloadRecentsActivity() { + // Ensure that the fake recent component can be resolved by the recents intent. + mockTaskRecordFactory(builder -> builder.setComponent(mRecentsComponent)); + ActivityInfo aInfo = new ActivityInfo(); + aInfo.applicationInfo = new ApplicationInfo(); + aInfo.applicationInfo.uid = 10001; + aInfo.applicationInfo.targetSdkVersion = mContext.getApplicationInfo().targetSdkVersion; + aInfo.packageName = aInfo.applicationInfo.packageName = mRecentsComponent.getPackageName(); + aInfo.processName = "recents"; + doReturn(aInfo).when(mSupervisor).resolveActivity(any() /* intent */, any() /* rInfo */, + anyInt() /* startFlags */, any() /* profilerInfo */); + + // Assume its process is alive because the caller should be the recents service. + WindowProcessController wpc = new WindowProcessController(mService, aInfo.applicationInfo, + aInfo.processName, aInfo.applicationInfo.uid, 0 /* userId */, + mock(Object.class) /* owner */, mock(WindowProcessListener.class)); + wpc.setThread(mock(IApplicationThread.class)); + doReturn(wpc).when(mService).getProcessController(eq(wpc.mName), eq(wpc.mUid)); + + Intent recentsIntent = new Intent().setComponent(mRecentsComponent); + // Null animation indicates to preload. + mService.startRecentsActivity(recentsIntent, null /* assistDataReceiver */, + null /* recentsAnimationRunner */); + + ActivityDisplay display = mRootActivityContainer.getDefaultDisplay(); + ActivityStack recentsStack = display.getStack(WINDOWING_MODE_FULLSCREEN, + ACTIVITY_TYPE_RECENTS); + assertThat(recentsStack).isNotNull(); + + ActivityRecord recentsActivity = recentsStack.getTopActivity(); + // The activity is started in background so it should be invisible and will be stopped. + assertThat(recentsActivity).isNotNull(); + assertThat(mSupervisor.mStoppingActivities).contains(recentsActivity); + assertFalse(recentsActivity.visible); + + // Assume it is stopped to test next use case. + recentsActivity.activityStoppedLocked(null /* newIcicle */, null /* newPersistentState */, + null /* description */); + mSupervisor.mStoppingActivities.remove(recentsActivity); + + spyOn(recentsActivity); + // Start when the recents activity exists. It should ensure the configuration. + mService.startRecentsActivity(recentsIntent, null /* assistDataReceiver */, + null /* recentsAnimationRunner */); + + verify(recentsActivity).ensureActivityConfiguration(anyInt() /* globalChanges */, + anyBoolean() /* preserveWindow */, eq(true) /* ignoreVisibility */); + assertThat(mSupervisor.mStoppingActivities).contains(recentsActivity); + } + + @Test public void testRestartRecentsActivity() throws Exception { // Have a recents activity that is not attached to its process (ActivityRecord.app = null). ActivityDisplay display = mRootActivityContainer.getDefaultDisplay(); @@ -220,12 +274,13 @@ public class RecentsAnimationTest extends ActivityTestsBase { // Assume recents animation already started, set a state that cancel recents animation // with screenshot. - doReturn(true).when(mRecentsAnimationController).shouldCancelWithDeferredScreenshot(); + doReturn(true).when(mRecentsAnimationController).shouldDeferCancelUntilNextTransition(); + doReturn(true).when(mRecentsAnimationController).shouldDeferCancelWithScreenshot(); // Start another fullscreen activity. fullscreenStack2.moveToFront("Activity start"); - // Ensure that the recents animation was canceled by cancelOnNextTransitionStart(). - verify(mRecentsAnimationController, times(1)).cancelOnNextTransitionStart(); + // Ensure that the recents animation was canceled by setCancelOnNextTransitionStart(). + verify(mRecentsAnimationController, times(1)).setCancelOnNextTransitionStart(); } @Test @@ -261,7 +316,7 @@ public class RecentsAnimationTest extends ActivityTestsBase { // Ensure that the recents animation was NOT canceled verify(mService.mWindowManager, times(0)).cancelRecentsAnimationSynchronously( eq(REORDER_KEEP_IN_PLACE), any()); - verify(mRecentsAnimationController, times(0)).cancelOnNextTransitionStart(); + verify(mRecentsAnimationController, times(0)).setCancelOnNextTransitionStart(); } @Test diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java index 62247d889485..19fd93fee5f0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskStackChangedListenerTest.java @@ -16,6 +16,8 @@ package com.android.server.wm; +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; + import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; import static org.junit.Assert.assertEquals; @@ -26,18 +28,22 @@ import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.TaskDescription; import android.app.ActivityTaskManager; +import android.app.ActivityView; import android.app.IActivityManager; import android.app.ITaskStackListener; +import android.app.Instrumentation; import android.app.Instrumentation.ActivityMonitor; import android.app.TaskStackListener; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; +import android.os.Bundle; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.support.test.uiautomator.UiDevice; import android.text.TextUtils; +import android.view.ViewGroup; import androidx.test.filters.FlakyTest; import androidx.test.filters.MediumTest; @@ -231,6 +237,40 @@ public class TaskStackChangedListenerTest { assertTrue(activity.mOnDetachedFromWindowCalled); } + @Test + public void testTaskOnSingleTaskDisplayDrawn() throws Exception { + final Instrumentation instrumentation = getInstrumentation(); + + final CountDownLatch activityViewReadyLatch = new CountDownLatch(1); + final CountDownLatch singleTaskDisplayDrawnLatch = new CountDownLatch(1); + registerTaskStackChangedListener(new TaskStackListener() { + @Override + public void onSingleTaskDisplayDrawn(int displayId) throws RemoteException { + singleTaskDisplayDrawnLatch.countDown(); + } + }); + final ActivityViewTestActivity activity = + (ActivityViewTestActivity) startTestActivity(ActivityViewTestActivity.class); + final ActivityView activityView = activity.getActivityView(); + activityView.setCallback(new ActivityView.StateCallback() { + @Override + public void onActivityViewReady(ActivityView view) { + activityViewReadyLatch.countDown(); + } + + @Override + public void onActivityViewDestroyed(ActivityView view) { + } + }); + waitForCallback(activityViewReadyLatch); + + final Context context = instrumentation.getContext(); + Intent intent = new Intent(context, ActivityInActivityView.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + activityView.startActivity(intent); + waitForCallback(singleTaskDisplayDrawnLatch); + } + /** * Starts the provided activity and returns the started instance. */ @@ -369,4 +409,29 @@ public class TaskStackChangedListenerTest { mOnDetachedFromWindowCountDownLatch = countDownLatch; } } + + public static class ActivityViewTestActivity extends TestActivity { + private ActivityView mActivityView; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + mActivityView = new ActivityView(this, null /* attrs */, 0 /* defStyle */, + true /* singleTaskInstance */); + setContentView(mActivityView); + + ViewGroup.LayoutParams layoutParams = mActivityView.getLayoutParams(); + layoutParams.width = MATCH_PARENT; + layoutParams.height = MATCH_PARENT; + mActivityView.requestLayout(); + } + + ActivityView getActivityView() { + return mActivityView; + } + } + + // Activity that has {@link android.R.attr#resizeableActivity} attribute set to {@code true} + public static class ActivityInActivityView extends TestActivity {} } diff --git a/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java b/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java index 83aa620b9573..a7586810a824 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestIWindow.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import android.graphics.Point; import android.graphics.Rect; import android.os.Bundle; import android.os.ParcelFileDescriptor; @@ -43,6 +44,10 @@ public class TestIWindow extends IWindow.Stub { } @Override + public void locationInParentDisplayChanged(Point offset) throws RemoteException { + } + + @Override public void insetsChanged(InsetsState insetsState) throws RemoteException { } diff --git a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java index d034f274f1e1..2e5ce69a8564 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java +++ b/services/tests/wmtests/src/com/android/server/wm/TestWindowManagerPolicy.java @@ -142,7 +142,7 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { @Override public Animation createHiddenByKeyguardExit(boolean onWallpaper, - boolean goingToNotificationShade) { + boolean goingToNotificationShade, boolean subtleAnimation) { return null; } diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java index 94352b21db87..99337565e128 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java @@ -104,8 +104,8 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { // This is an indirect indication of the microphone being open in some other application. private boolean mServiceDisabled = false; - // Whether we have ANY recognition (keyphrase or generic) running. - private boolean mRecognitionRunning = false; + // Whether ANY recognition (keyphrase or generic) has been requested. + private boolean mRecognitionRequested = false; private PowerSaveModeListener mPowerSaveModeListener; @@ -252,11 +252,6 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } } - // Initialize power save, call active state monitoring logic. - if (!mRecognitionRunning) { - initializeTelephonyAndPowerStateListeners(); - } - // If the existing SoundModel is different (for the same UUID for Generic and same // keyphrase ID for voice), ensure that it is unloaded and stopped before proceeding. // This works for both keyphrase and generic models. This logic also ensures that a @@ -326,8 +321,16 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { modelData.setRecognitionConfig(recognitionConfig); modelData.setSoundModel(soundModel); - return startRecognitionLocked(modelData, + int status = startRecognitionLocked(modelData, false /* Don't notify for synchronous calls */); + + // Initialize power save, call active state monitoring logic. + if (status == STATUS_OK && !mRecognitionRequested) { + initializeTelephonyAndPowerStateListeners(); + mRecognitionRequested = true; + } + + return status; } } @@ -450,7 +453,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { modelData.clearCallback(); modelData.setRecognitionConfig(null); - if (!computeRecognitionRunningLocked()) { + if (!computeRecognitionRequestedLocked()) { internalClearGlobalStateLocked(); } @@ -1196,20 +1199,20 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } // Computes whether we have any recognition running at all (voice or generic). Sets - // the mRecognitionRunning variable with the result. - private boolean computeRecognitionRunningLocked() { + // the mRecognitionRequested variable with the result. + private boolean computeRecognitionRequestedLocked() { if (mModuleProperties == null || mModule == null) { - mRecognitionRunning = false; - return mRecognitionRunning; + mRecognitionRequested = false; + return mRecognitionRequested; } for (ModelData modelData : mModelDataMap.values()) { - if (modelData.isModelStarted()) { - mRecognitionRunning = true; - return mRecognitionRunning; + if (modelData.isRequested()) { + mRecognitionRequested = true; + return mRecognitionRequested; } } - mRecognitionRunning = false; - return mRecognitionRunning; + mRecognitionRequested = false; + return mRecognitionRequested; } // This class encapsulates the callbacks, state, handles and any other information that diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java index 7a834696387c..a8cafb33790d 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java @@ -61,6 +61,7 @@ import android.os.Parcel; import android.os.ParcelUuid; import android.os.PowerManager; import android.os.RemoteException; +import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings; import android.util.ArrayMap; @@ -75,6 +76,7 @@ import com.android.server.SystemService; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Map; import java.util.TreeMap; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -102,6 +104,80 @@ public class SoundTriggerService extends SystemService { private Object mCallbacksLock; private final TreeMap<UUID, IRecognitionStatusCallback> mCallbacks; + class SoundModelStatTracker { + private class SoundModelStat { + SoundModelStat() { + mStartCount = 0; + mTotalTimeMsec = 0; + mLastStartTimestampMsec = 0; + mLastStopTimestampMsec = 0; + mIsStarted = false; + } + long mStartCount; // Number of times that given model started + long mTotalTimeMsec; // Total time (msec) that given model was running since boot + long mLastStartTimestampMsec; // SystemClock.elapsedRealtime model was last started + long mLastStopTimestampMsec; // SystemClock.elapsedRealtime model was last stopped + boolean mIsStarted; // true if model is currently running + } + private final TreeMap<UUID, SoundModelStat> mModelStats; + + SoundModelStatTracker() { + mModelStats = new TreeMap<UUID, SoundModelStat>(); + } + + public synchronized void onStart(UUID id) { + SoundModelStat stat = mModelStats.get(id); + if (stat == null) { + stat = new SoundModelStat(); + mModelStats.put(id, stat); + } + + if (stat.mIsStarted) { + Slog.e(TAG, "error onStart(): Model " + id + " already started"); + return; + } + + stat.mStartCount++; + stat.mLastStartTimestampMsec = SystemClock.elapsedRealtime(); + stat.mIsStarted = true; + } + + public synchronized void onStop(UUID id) { + SoundModelStat stat = mModelStats.get(id); + if (stat == null) { + Slog.e(TAG, "error onStop(): Model " + id + " has no stats available"); + return; + } + + if (!stat.mIsStarted) { + Slog.e(TAG, "error onStop(): Model " + id + " already stopped"); + return; + } + + stat.mLastStopTimestampMsec = SystemClock.elapsedRealtime(); + stat.mTotalTimeMsec += stat.mLastStopTimestampMsec - stat.mLastStartTimestampMsec; + stat.mIsStarted = false; + } + + public synchronized void dump(PrintWriter pw) { + long curTime = SystemClock.elapsedRealtime(); + pw.println("Model Stats:"); + for (Map.Entry<UUID, SoundModelStat> entry : mModelStats.entrySet()) { + UUID uuid = entry.getKey(); + SoundModelStat stat = entry.getValue(); + long totalTimeMsec = stat.mTotalTimeMsec; + if (stat.mIsStarted) { + totalTimeMsec += curTime - stat.mLastStartTimestampMsec; + } + pw.println(uuid + ", total_time(msec)=" + totalTimeMsec + + ", total_count=" + stat.mStartCount + + ", last_start=" + stat.mLastStartTimestampMsec + + ", last_stop=" + stat.mLastStopTimestampMsec); + } + } + } + + private final SoundModelStatTracker mSoundModelStatTracker; /** Number of ops run by the {@link RemoteSoundTriggerDetectionService} per package name */ @GuardedBy("mLock") private final ArrayMap<String, NumOps> mNumOpsPerPackage = new ArrayMap<>(); @@ -115,6 +191,7 @@ public class SoundTriggerService extends SystemService { mCallbacksLock = new Object(); mCallbacks = new TreeMap<>(); mLock = new Object(); + mSoundModelStatTracker = new SoundModelStatTracker(); } @Override @@ -193,8 +270,12 @@ public class SoundTriggerService extends SystemService { return STATUS_ERROR; } - return mSoundTriggerHelper.startGenericRecognition(parcelUuid.getUuid(), model, + int ret = mSoundTriggerHelper.startGenericRecognition(parcelUuid.getUuid(), model, callback, config); + if (ret == STATUS_OK) { + mSoundModelStatTracker.onStart(parcelUuid.getUuid()); + } + return ret; } @Override @@ -208,7 +289,12 @@ public class SoundTriggerService extends SystemService { + parcelUuid)); if (!isInitialized()) return STATUS_ERROR; - return mSoundTriggerHelper.stopGenericRecognition(parcelUuid.getUuid(), callback); + + int ret = mSoundTriggerHelper.stopGenericRecognition(parcelUuid.getUuid(), callback); + if (ret == STATUS_OK) { + mSoundModelStatTracker.onStop(parcelUuid.getUuid()); + } + return ret; } @Override @@ -252,6 +338,9 @@ public class SoundTriggerService extends SystemService { // Unload the model if it is loaded. mSoundTriggerHelper.unloadGenericSoundModel(soundModelId.getUuid()); mDbHelper.deleteGenericSoundModel(soundModelId.getUuid()); + + // Stop recognition if it is started. + mSoundModelStatTracker.onStop(soundModelId.getUuid()); } @Override @@ -403,6 +492,8 @@ public class SoundTriggerService extends SystemService { synchronized (mCallbacksLock) { mCallbacks.put(soundModelId.getUuid(), callback); } + + mSoundModelStatTracker.onStart(soundModelId.getUuid()); } return STATUS_OK; } @@ -467,6 +558,8 @@ public class SoundTriggerService extends SystemService { synchronized (mCallbacksLock) { mCallbacks.remove(soundModelId.getUuid()); } + + mSoundModelStatTracker.onStop(soundModelId.getUuid()); } return STATUS_OK; } @@ -1266,6 +1359,9 @@ public class SoundTriggerService extends SystemService { mSoundTriggerHelper.dump(fd, pw, args); // log sEventLogger.dump(pw); + + // stats + mSoundModelStatTracker.dump(pw); } private synchronized boolean isInitialized() { diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 19f8203f7502..cea4fafc7c18 100755 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -836,6 +836,19 @@ public class CarrierConfigManager { "carrier_metered_roaming_apn_types_strings"; /** + * APN types that are not allowed on cellular + * @hide + */ + public static final String KEY_CARRIER_WWAN_DISALLOWED_APN_TYPES_STRING_ARRAY = + "carrier_wwan_disallowed_apn_types_string_array"; + + /** + * APN types that are not allowed on IWLAN + * @hide + */ + public static final String KEY_CARRIER_WLAN_DISALLOWED_APN_TYPES_STRING_ARRAY = + "carrier_wlan_disallowed_apn_types_string_array"; + /** * CDMA carrier ERI (Enhanced Roaming Indicator) file name * @hide */ @@ -2122,6 +2135,15 @@ public class CarrierConfigManager { "data_warning_notification_bool"; /** + * Controls if the device should automatically warn the user that sim voice & data function + * might be limited due to dual sim scenario. When set to {@true} display the notification, + * {@code false} otherwise. + * @hide + */ + public static final String KEY_LIMITED_SIM_FUNCTION_NOTIFICATION_FOR_DSDS_BOOL = + "limited_sim_function_notification_for_dsds_bool"; + + /** * Controls the cellular data limit. * <p> * If the user uses more than this amount of data in their billing cycle, as defined by @@ -2290,6 +2312,13 @@ public class CarrierConfigManager { public static final String KEY_RTT_DOWNGRADE_SUPPORTED_BOOL = "rtt_downgrade_supported_bool"; /** + * Indicates if the TTY HCO and VCO options should be hidden in the accessibility menu + * if the device is capable of RTT. + * @hide + */ + public static final String KEY_HIDE_TTY_HCO_VCO_WITH_RTT_BOOL = "hide_tty_hco_vco_with_rtt"; + + /** * The flag to disable the popup dialog which warns the user of data charges. * @hide */ @@ -2369,6 +2398,14 @@ public class CarrierConfigManager { public static final String KEY_CHECK_PRICING_WITH_CARRIER_FOR_DATA_ROAMING_BOOL = "check_pricing_with_carrier_data_roaming_bool"; + /** + * Determines whether we should show a notification when the phone established a data + * connection in roaming network, to warn users about possible roaming charges. + * @hide + */ + public static final String KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL = + "show_data_connected_roaming_notification"; + /** * A list of 4 LTE RSRP thresholds above which a signal level is considered POOR, * MODERATE, GOOD, or EXCELLENT, to be used in SignalStrength reporting. @@ -3133,6 +3170,10 @@ public class CarrierConfigManager { new String[]{"default", "mms", "dun", "supl"}); sDefaults.putStringArray(KEY_CARRIER_METERED_ROAMING_APN_TYPES_STRINGS, new String[]{"default", "mms", "dun", "supl"}); + sDefaults.putStringArray(KEY_CARRIER_WWAN_DISALLOWED_APN_TYPES_STRING_ARRAY, + new String[]{""}); + sDefaults.putStringArray(KEY_CARRIER_WLAN_DISALLOWED_APN_TYPES_STRING_ARRAY, + new String[]{""}); sDefaults.putIntArray(KEY_ONLY_SINGLE_DC_ALLOWED_INT_ARRAY, new int[]{ 4, /* IS95A */ @@ -3270,6 +3311,7 @@ public class CarrierConfigManager { sDefaults.putInt(KEY_MONTHLY_DATA_CYCLE_DAY_INT, DATA_CYCLE_USE_PLATFORM_DEFAULT); sDefaults.putLong(KEY_DATA_WARNING_THRESHOLD_BYTES_LONG, DATA_CYCLE_USE_PLATFORM_DEFAULT); sDefaults.putBoolean(KEY_DATA_WARNING_NOTIFICATION_BOOL, true); + sDefaults.putBoolean(KEY_LIMITED_SIM_FUNCTION_NOTIFICATION_FOR_DSDS_BOOL, false); sDefaults.putLong(KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG, DATA_CYCLE_USE_PLATFORM_DEFAULT); sDefaults.putBoolean(KEY_DATA_LIMIT_NOTIFICATION_BOOL, true); sDefaults.putBoolean(KEY_DATA_RAPID_NOTIFICATION_BOOL, true); @@ -3323,6 +3365,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL, false); sDefaults.putBoolean(KEY_RTT_SUPPORTED_BOOL, false); sDefaults.putBoolean(KEY_TTY_SUPPORTED_BOOL, true); + sDefaults.putBoolean(KEY_HIDE_TTY_HCO_VCO_WITH_RTT_BOOL, false); sDefaults.putBoolean(KEY_DISABLE_CHARGE_INDICATION_BOOL, false); sDefaults.putBoolean(KEY_SUPPORT_NO_REPLY_TIMER_FOR_CFNRY_BOOL, true); sDefaults.putStringArray(KEY_FEATURE_ACCESS_CODES_STRING_ARRAY, null); @@ -3341,6 +3384,7 @@ public class CarrierConfigManager { sDefaults.putString(KEY_CARRIER_SETTINGS_ACTIVITY_COMPONENT_NAME_STRING, ""); sDefaults.putBoolean(KEY_CARRIER_CONFIG_APPLIED_BOOL, false); sDefaults.putBoolean(KEY_CHECK_PRICING_WITH_CARRIER_FOR_DATA_ROAMING_BOOL, false); + sDefaults.putBoolean(KEY_SHOW_DATA_CONNECTED_ROAMING_NOTIFICATION_BOOL, false); sDefaults.putIntArray(KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY, new int[] { -128, /* SIGNAL_STRENGTH_POOR */ diff --git a/telephony/java/android/telephony/DisconnectCause.java b/telephony/java/android/telephony/DisconnectCause.java index 6e839ab0ad6b..aa7e21a82500 100644 --- a/telephony/java/android/telephony/DisconnectCause.java +++ b/telephony/java/android/telephony/DisconnectCause.java @@ -333,6 +333,26 @@ public final class DisconnectCause { */ public static final int OTASP_PROVISIONING_IN_PROCESS = 76; + /** + * Indicates that the call is dropped due to RTCP inactivity, primarily due to media path + * disruption. + * @hide + */ + public static final int MEDIA_TIMEOUT = 77; + + /** + * Indicates that an emergency call cannot be placed over WFC because the service is not + * available in the current location. + * @hide + */ + public static final int EMERGENCY_CALL_OVER_WFC_NOT_AVAILABLE = 78; + + /** + * Indicates that WiFi calling service is not available in the current location. + * @hide + */ + public static final int WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION = 79; + //********************************************************************************************* // When adding a disconnect type: // 1) Update toString() with the newly added disconnect type. @@ -501,6 +521,12 @@ public final class DisconnectCause { return "TOO_MANY_ONGOING_CALLS"; case OTASP_PROVISIONING_IN_PROCESS: return "OTASP_PROVISIONING_IN_PROCESS"; + case MEDIA_TIMEOUT: + return "MEDIA_TIMEOUT"; + case EMERGENCY_CALL_OVER_WFC_NOT_AVAILABLE: + return "EMERGENCY_CALL_OVER_WFC_NOT_AVAILABLE"; + case WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION: + return "WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION"; default: return "INVALID: " + cause; } diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java index 5d39a2cc194a..2651346ad393 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -1997,4 +1997,18 @@ public class ServiceState implements Parcelable { public void setIwlanPreferred(boolean isIwlanPreferred) { mIsIwlanPreferred = isIwlanPreferred; } + + /** + * @return {@code true} if any data network is preferred on IWLAN. + * + * Note only when this value is true, {@link #getDataNetworkType()} will return + * {@link TelephonyManager#NETWORK_TYPE_IWLAN} when AP-assisted mode device camps on both + * cellular and IWLAN. This value does not affect legacy mode devices as the data network + * type is directly reported by the modem. + * + * @hide + */ + public boolean isIwlanPreferred() { + return mIsIwlanPreferred; + } } diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index a10454ed752a..2822fccdb398 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -2116,29 +2116,36 @@ public class SubscriptionManager { } /** + * TODO(b/137102918) Make this static, tests use this as an instance method currently. + * * @return the list of subId's that are active, * is never null but the length maybe 0. * @hide */ @UnsupportedAppUsage public @NonNull int[] getActiveSubscriptionIdList() { - int[] subId = null; + return getActiveSubscriptionIdList(/* visibleOnly */ true); + } + /** + * TODO(b/137102918) Make this static, tests use this as an instance method currently. + * + * @return a non-null list of subId's that are active. + * + * @hide + */ + public @NonNull int[] getActiveSubscriptionIdList(boolean visibleOnly) { try { ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); if (iSub != null) { - subId = iSub.getActiveSubIdList(/*visibleOnly*/true); + int[] subId = iSub.getActiveSubIdList(visibleOnly); + if (subId != null) return subId; } } catch (RemoteException ex) { // ignore it } - if (subId == null) { - subId = new int[0]; - } - - return subId; - + return new int[0]; } /** @@ -2984,10 +2991,10 @@ public class SubscriptionManager { * @param info the subscriptionInfo to check against. * @return true if this subscription should be visible to the API caller. * + * @hide */ - private boolean isSubscriptionVisible(SubscriptionInfo info) { + public boolean isSubscriptionVisible(SubscriptionInfo info) { if (info == null) return false; - // If subscription is NOT grouped opportunistic subscription, it's visible. if (info.getGroupUuid() == null || !info.isOpportunistic()) return true; @@ -3171,4 +3178,24 @@ public class SubscriptionManager { return result; } + + /** + * Get active data subscription id. + * See {@link PhoneStateListener#onActiveDataSubscriptionIdChanged(int)} for the details. + * + * @return Active data subscription id + * + * //TODO: Refactor this API in b/134702460 + * @hide + */ + public static int getActiveDataSubscriptionId() { + try { + ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); + if (iSub != null) { + return iSub.getActiveDataSubscriptionId(); + } + } catch (RemoteException ex) { + } + return SubscriptionManager.INVALID_SUBSCRIPTION_ID; + } } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 39ad0d0b85f4..7477c3e29448 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -2417,6 +2417,10 @@ public class TelephonyManager { * registered operator or the cell nearby, if available. * . * <p> + * Note: In multi-sim, this returns a shared emergency network country iso from other + * subscription if the subscription used to create the TelephonyManager doesn't camp on + * a network due to some reason (e.g. pin/puk locked), or sim is absent in the corresponding + * slot. * Note: Result may be unreliable on CDMA networks (use {@link #getPhoneType()} to determine * if on a CDMA network). */ @@ -2545,7 +2549,7 @@ public class TelephonyManager { * @return the NETWORK_TYPE_xxxx for current data connection. */ public @NetworkType int getNetworkType() { - return getNetworkType(getSubId(SubscriptionManager.getDefaultDataSubscriptionId())); + return getNetworkType(getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } /** @@ -2628,7 +2632,7 @@ public class TelephonyManager { @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public @NetworkType int getDataNetworkType() { - return getDataNetworkType(getSubId(SubscriptionManager.getDefaultDataSubscriptionId())); + return getDataNetworkType(getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } /** @@ -3972,9 +3976,14 @@ public class TelephonyManager { * The returned set of subscriber IDs will include the subscriber ID corresponding to this * TelephonyManager's subId. * + * This is deprecated and {@link #getMergedSubscriberIdsFromGroup()} should be used for data + * usage merging purpose. + * TODO: remove this API. + * * @hide */ @UnsupportedAppUsage + @Deprecated public @Nullable String[] getMergedSubscriberIds() { try { ITelephony telephony = getITelephony(); @@ -3987,6 +3996,28 @@ public class TelephonyManager { } /** + * Return the set of subscriber IDs that should be considered "merged together" for data usage + * purposes. Unlike {@link #getMergedSubscriberIds()} this API merge subscriberIds based on + * subscription grouping: subscriberId of those in the same group will all be returned. + * + * <p>Requires the calling app to have READ_PRIVILEGED_PHONE_STATE permission. + * + * @hide + */ + @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public @Nullable String[] getMergedSubscriberIdsFromGroup() { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + return telephony.getMergedSubscriberIdsFromGroup(getSubId(), getOpPackageName()); + } + } catch (RemoteException ex) { + } catch (NullPointerException ex) { + } + return null; + } + + /** * Returns the MSISDN string. * for a GSM phone. Return null if it is unavailable. * @@ -4890,7 +4921,8 @@ public class TelephonyManager { ITelephony telephony = getITelephony(); if (telephony == null) return DATA_ACTIVITY_NONE; - return telephony.getDataActivity(); + return telephony.getDataActivityForSubId( + getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } catch (RemoteException ex) { // the phone process is restarting. return DATA_ACTIVITY_NONE; @@ -4938,7 +4970,8 @@ public class TelephonyManager { ITelephony telephony = getITelephony(); if (telephony == null) return DATA_DISCONNECTED; - return telephony.getDataState(); + return telephony.getDataStateForSubId( + getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } catch (RemoteException ex) { // the phone process is restarting. return DATA_DISCONNECTED; @@ -7375,7 +7408,7 @@ public class TelephonyManager { * @hide */ public boolean getTetherApnRequired() { - return getTetherApnRequired(getSubId(SubscriptionManager.getDefaultDataSubscriptionId())); + return getTetherApnRequired(getSubId(SubscriptionManager.getActiveDataSubscriptionId())); } /** @@ -8158,7 +8191,7 @@ public class TelephonyManager { ITelephony telephony = getITelephony(); if (telephony != null) return telephony.isDataConnectivityPossible(getSubId(SubscriptionManager - .getDefaultDataSubscriptionId())); + .getActiveDataSubscriptionId())); } catch (RemoteException e) { Log.e(TAG, "Error calling ITelephony#isDataAllowed", e); } @@ -10788,7 +10821,6 @@ public class TelephonyManager { * @param callback Callback will be triggered once it succeeds or failed. * See {@link TelephonyManager.SetOpportunisticSubscriptionResult} * for more details. Pass null if don't care about the result. - * */ public void setPreferredOpportunisticDataSubscription(int subId, boolean needValidation, @Nullable @CallbackExecutor Executor executor, @Nullable Consumer<Integer> callback) { @@ -10796,6 +10828,12 @@ public class TelephonyManager { try { IOns iOpportunisticNetworkService = getIOns(); if (iOpportunisticNetworkService == null) { + if (executor == null || callback == null) { + return; + } + Binder.withCleanCallingIdentity(() -> executor.execute(() -> { + callback.accept(SET_OPPORTUNISTIC_SUB_INACTIVE_SUBSCRIPTION); + })); return; } ISetOpportunisticDataCallback callbackStub = new ISetOpportunisticDataCallback.Stub() { @@ -10874,9 +10912,19 @@ public class TelephonyManager { try { IOns iOpportunisticNetworkService = getIOns(); if (iOpportunisticNetworkService == null || availableNetworks == null) { - Binder.withCleanCallingIdentity(() -> executor.execute(() -> { - callback.accept(UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS); - })); + if (executor == null || callback == null) { + return; + } + if (iOpportunisticNetworkService == null) { + /* Todo<b/130595455> passing unknown due to lack of good error codes */ + Binder.withCleanCallingIdentity(() -> executor.execute(() -> { + callback.accept(UPDATE_AVAILABLE_NETWORKS_UNKNOWN_FAILURE); + })); + } else { + Binder.withCleanCallingIdentity(() -> executor.execute(() -> { + callback.accept(UPDATE_AVAILABLE_NETWORKS_INVALID_ARGUMENTS); + })); + } return; } IUpdateAvailableNetworksCallback callbackStub = diff --git a/telephony/java/android/telephony/ims/ImsReasonInfo.java b/telephony/java/android/telephony/ims/ImsReasonInfo.java index a478606da22a..20aba4d97849 100644 --- a/telephony/java/android/telephony/ims/ImsReasonInfo.java +++ b/telephony/java/android/telephony/ims/ImsReasonInfo.java @@ -871,6 +871,19 @@ public final class ImsReasonInfo implements Parcelable { */ public static final int CODE_REJECT_ONGOING_CS_CALL = 1621; + /** + * An attempt was made to place an emergency call over WFC when emergency services is not + * currently available in the current location. + * @hide + */ + public static final int CODE_EMERGENCY_CALL_OVER_WFC_NOT_AVAILABLE = 1622; + + /** + * Indicates that WiFi calling service is not available in the current location. + * @hide + */ + public static final int CODE_WFC_SERVICE_NOT_AVAILABLE_IN_THIS_LOCATION = 1623; + /* * OEM specific error codes. To be used by OEMs when they don't want to reveal error code which * would be replaced by ERROR_UNSPECIFIED. diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl index b081228d9616..7cc37d0d2b15 100755 --- a/telephony/java/com/android/internal/telephony/ISub.aidl +++ b/telephony/java/com/android/internal/telephony/ISub.aidl @@ -281,4 +281,6 @@ interface ISub { boolean isActiveSubId(int subId, String callingPackage); boolean setAlwaysAllowMmsData(int subId, boolean alwaysAllow); + + int getActiveDataSubscriptionId(); } diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 5a27a0fb42e4..dcfd193185cf 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -308,18 +308,46 @@ interface ITelephony { */ List<NeighboringCellInfo> getNeighboringCellInfo(String callingPkg); - @UnsupportedAppUsage - int getCallState(); + @UnsupportedAppUsage + int getCallState(); /** * Returns the call state for a slot. */ - int getCallStateForSlot(int slotIndex); + int getCallStateForSlot(int slotIndex); + + /** + * Replaced by getDataActivityForSubId. + */ + int getDataActivity(); + + /** + * Returns a constant indicating the type of activity on a data connection + * (cellular). + * + * @see #DATA_ACTIVITY_NONE + * @see #DATA_ACTIVITY_IN + * @see #DATA_ACTIVITY_OUT + * @see #DATA_ACTIVITY_INOUT + * @see #DATA_ACTIVITY_DORMANT + */ + int getDataActivityForSubId(int subId); + + /** + * Replaced by getDataStateForSubId. + */ + int getDataState(); - @UnsupportedAppUsage - int getDataActivity(); - @UnsupportedAppUsage - int getDataState(); + /** + * Returns a constant indicating the current data connection state + * (cellular). + * + * @see #DATA_DISCONNECTED + * @see #DATA_CONNECTING + * @see #DATA_CONNECTED + * @see #DATA_SUSPENDED + */ + int getDataStateForSubId(int subId); /** * Returns the current active phone type as integer. @@ -1059,6 +1087,11 @@ interface ITelephony { String[] getMergedSubscriberIds(int subId, String callingPackage); /** + * @hide + */ + String[] getMergedSubscriberIdsFromGroup(int subId, String callingPackage); + + /** * Override the operator branding for the current ICCID. * * Once set, whenever the SIM is present in the device, the service diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl index f2f3c2d85fd4..dc026d48c6cf 100644 --- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -68,8 +68,7 @@ interface ITelephonyRegistry { void notifyOtaspChanged(in int subId, in int otaspMode); @UnsupportedAppUsage void notifyCellInfo(in List<CellInfo> cellInfo); - void notifyPhysicalChannelConfiguration(in List<PhysicalChannelConfig> configs); - void notifyPhysicalChannelConfigurationForSubscriber(in int subId, + void notifyPhysicalChannelConfigurationForSubscriber(in int phoneId, in int subId, in List<PhysicalChannelConfig> configs); void notifyPreciseCallState(int phoneId, int subId, int ringingCallState, int foregroundCallState, int backgroundCallState); diff --git a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java index 7a0ab9ca6a28..51c5d12dfe15 100644 --- a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java +++ b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java @@ -600,26 +600,21 @@ public final class TelephonyPermissions { } } - /** - * Returns whether the provided uid has carrier privileges for any active subscription ID. - */ - private static boolean checkCarrierPrivilegeForAnySubId(Context context, - Supplier<ITelephony> telephonySupplier, int uid) { + /** Returns whether the provided uid has carrier privileges for any active subscription ID. */ + private static boolean checkCarrierPrivilegeForAnySubId( + Context context, Supplier<ITelephony> telephonySupplier, int uid) { SubscriptionManager sm = (SubscriptionManager) context.getSystemService( Context.TELEPHONY_SUBSCRIPTION_SERVICE); - int[] activeSubIds = sm.getActiveSubscriptionIdList(); - if (activeSubIds != null) { - for (int activeSubId : activeSubIds) { - if (getCarrierPrivilegeStatus(telephonySupplier, activeSubId, uid) - == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) { - return true; - } + int[] activeSubIds = sm.getActiveSubscriptionIdList(/* visibleOnly */ false); + for (int activeSubId : activeSubIds) { + if (getCarrierPrivilegeStatus(telephonySupplier, activeSubId, uid) + == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) { + return true; } } return false; } - private static int getCarrierPrivilegeStatus( Supplier<ITelephony> telephonySupplier, int subId, int uid) { ITelephony telephony = telephonySupplier.get(); diff --git a/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java b/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java index 45ddc3eed39c..f88a7c41c02b 100644 --- a/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java +++ b/tests/Internal/src/com/android/internal/colorextraction/ColorExtractorTest.java @@ -39,8 +39,6 @@ import com.android.internal.colorextraction.types.Tonal; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; /** * Tests color extraction generation. @@ -49,14 +47,13 @@ import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) public class ColorExtractorTest { - Context mContext; - @Mock - WallpaperManager mWallpaperManager; + private Context mContext; + private WallpaperManager mWallpaperManager; @Before public void setup() { - MockitoAnnotations.initMocks(this); mContext = InstrumentationRegistry.getContext(); + mWallpaperManager = mock(WallpaperManager.class); } @Test diff --git a/tests/net/java/android/net/NetworkStatsTest.java b/tests/net/java/android/net/NetworkStatsTest.java index b5b0384ca599..c16a0f446651 100644 --- a/tests/net/java/android/net/NetworkStatsTest.java +++ b/tests/net/java/android/net/NetworkStatsTest.java @@ -569,7 +569,7 @@ public class NetworkStatsTest { .addValues(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L); - assertTrue(delta.toString(), delta.migrateTun(tunUid, tunIface, underlyingIface)); + delta.migrateTun(tunUid, tunIface, new String[] {underlyingIface}); assertEquals(20, delta.size()); // tunIface and TEST_IFACE entries are not changed. @@ -650,7 +650,7 @@ public class NetworkStatsTest { .addValues(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 75500L, 37L, 130000L, 70L, 0L); - assertTrue(delta.migrateTun(tunUid, tunIface, underlyingIface)); + delta.migrateTun(tunUid, tunIface, new String[]{underlyingIface}); assertEquals(9, delta.size()); // tunIface entries should not be changed. @@ -813,6 +813,37 @@ public class NetworkStatsTest { } @Test + public void testFilterDebugEntries() { + NetworkStats.Entry entry1 = new NetworkStats.Entry( + "test1", 10100, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, + DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L); + + NetworkStats.Entry entry2 = new NetworkStats.Entry( + "test2", 10101, SET_DBG_VPN_IN, TAG_NONE, METERED_NO, ROAMING_NO, + DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L); + + NetworkStats.Entry entry3 = new NetworkStats.Entry( + "test2", 10101, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, + DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L); + + NetworkStats.Entry entry4 = new NetworkStats.Entry( + "test2", 10101, SET_DBG_VPN_OUT, TAG_NONE, METERED_NO, ROAMING_NO, + DEFAULT_NETWORK_NO, 50000L, 25L, 100000L, 50L, 0L); + + NetworkStats stats = new NetworkStats(TEST_START, 4) + .addValues(entry1) + .addValues(entry2) + .addValues(entry3) + .addValues(entry4); + + stats.filterDebugEntries(); + + assertEquals(2, stats.size()); + assertEquals(entry1, stats.getValues(0, null)); + assertEquals(entry3, stats.getValues(1, null)); + } + + @Test public void testApply464xlatAdjustments() { final String v4Iface = "v4-wlan0"; final String baseIface = "wlan0"; diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 73ee7f544b5f..37cc30445c6e 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -200,6 +200,7 @@ import com.android.server.connectivity.Tethering; import com.android.server.connectivity.Vpn; import com.android.server.net.NetworkPinner; import com.android.server.net.NetworkPolicyManagerInternal; +import com.android.server.net.NetworkStatsFactory; import org.junit.After; import org.junit.Before; @@ -4936,9 +4937,9 @@ public class ConnectivityServiceTest { verify(mStatsService, atLeastOnce()) .forceUpdateIfaces( eq(onlyCell), - eq(new VpnInfo[0]), any(NetworkState[].class), eq(MOBILE_IFNAME)); + assertEquals(new VpnInfo[0], NetworkStatsFactory.getVpnInfos()); reset(mStatsService); // Default network switch should update ifaces. @@ -4949,9 +4950,9 @@ public class ConnectivityServiceTest { verify(mStatsService, atLeastOnce()) .forceUpdateIfaces( eq(onlyWifi), - eq(new VpnInfo[0]), any(NetworkState[].class), eq(WIFI_IFNAME)); + assertEquals(new VpnInfo[0], NetworkStatsFactory.getVpnInfos()); reset(mStatsService); // Disconnect should update ifaces. @@ -4960,9 +4961,9 @@ public class ConnectivityServiceTest { verify(mStatsService, atLeastOnce()) .forceUpdateIfaces( eq(onlyCell), - eq(new VpnInfo[0]), any(NetworkState[].class), eq(MOBILE_IFNAME)); + assertEquals(new VpnInfo[0], NetworkStatsFactory.getVpnInfos()); reset(mStatsService); // Metered change should update ifaces @@ -4971,9 +4972,9 @@ public class ConnectivityServiceTest { verify(mStatsService, atLeastOnce()) .forceUpdateIfaces( eq(onlyCell), - eq(new VpnInfo[0]), any(NetworkState[].class), eq(MOBILE_IFNAME)); + assertEquals(new VpnInfo[0], NetworkStatsFactory.getVpnInfos()); reset(mStatsService); mCellNetworkAgent.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); @@ -4981,9 +4982,9 @@ public class ConnectivityServiceTest { verify(mStatsService, atLeastOnce()) .forceUpdateIfaces( eq(onlyCell), - eq(new VpnInfo[0]), any(NetworkState[].class), eq(MOBILE_IFNAME)); + assertEquals(new VpnInfo[0], NetworkStatsFactory.getVpnInfos()); reset(mStatsService); // Captive portal change shouldn't update ifaces @@ -4992,9 +4993,9 @@ public class ConnectivityServiceTest { verify(mStatsService, never()) .forceUpdateIfaces( eq(onlyCell), - eq(new VpnInfo[0]), any(NetworkState[].class), eq(MOBILE_IFNAME)); + assertEquals(new VpnInfo[0], NetworkStatsFactory.getVpnInfos()); reset(mStatsService); // Roaming change should update ifaces @@ -5003,9 +5004,9 @@ public class ConnectivityServiceTest { verify(mStatsService, atLeastOnce()) .forceUpdateIfaces( eq(onlyCell), - eq(new VpnInfo[0]), any(NetworkState[].class), eq(MOBILE_IFNAME)); + assertEquals(new VpnInfo[0], NetworkStatsFactory.getVpnInfos()); reset(mStatsService); } diff --git a/tests/net/java/com/android/server/connectivity/TetheringTest.java b/tests/net/java/com/android/server/connectivity/TetheringTest.java index 6c42ac398b47..8c522f48cfd2 100644 --- a/tests/net/java/com/android/server/connectivity/TetheringTest.java +++ b/tests/net/java/com/android/server/connectivity/TetheringTest.java @@ -100,6 +100,8 @@ import android.os.UserManager; import android.os.test.TestLooper; import android.provider.Settings; import android.telephony.CarrierConfigManager; +import android.telephony.PhoneStateListener; +import android.telephony.TelephonyManager; import android.test.mock.MockContentResolver; import androidx.test.filters.SmallTest; @@ -111,6 +113,7 @@ import com.android.internal.util.test.BroadcastInterceptingContext; import com.android.internal.util.test.FakeSettingsProvider; import com.android.server.connectivity.tethering.IPv6TetheringCoordinator; import com.android.server.connectivity.tethering.OffloadHardwareInterface; +import com.android.server.connectivity.tethering.TetheringConfiguration; import com.android.server.connectivity.tethering.TetheringDependencies; import com.android.server.connectivity.tethering.UpstreamNetworkMonitor; @@ -118,6 +121,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -147,6 +151,7 @@ public class TetheringTest { @Mock private MockableSystemProperties mSystemProperties; @Mock private OffloadHardwareInterface mOffloadHardwareInterface; @Mock private Resources mResources; + @Mock private TelephonyManager mTelephonyManager; @Mock private UsbManager mUsbManager; @Mock private WifiManager mWifiManager; @Mock private CarrierConfigManager mCarrierConfigManager; @@ -171,6 +176,7 @@ public class TetheringTest { private MockContentResolver mContentResolver; private BroadcastReceiver mBroadcastReceiver; private Tethering mTethering; + private PhoneStateListener mPhoneStateListener; private class MockContext extends BroadcastInterceptingContext { MockContext(Context base) { @@ -193,6 +199,7 @@ public class TetheringTest { public Object getSystemService(String name) { if (Context.WIFI_SERVICE.equals(name)) return mWifiManager; if (Context.USB_SERVICE.equals(name)) return mUsbManager; + if (Context.TELEPHONY_SERVICE.equals(name)) return mTelephonyManager; return super.getSystemService(name); } } @@ -234,6 +241,17 @@ public class TetheringTest { } } + private class MockTetheringConfiguration extends TetheringConfiguration { + MockTetheringConfiguration(Context ctx, SharedLog log, int id) { + super(ctx, log, id); + } + + @Override + protected Resources getResourcesForSubIdWrapper(Context ctx, int subId) { + return mResources; + } + } + public class MockTetheringDependencies extends TetheringDependencies { StateMachine upstreamNetworkMonitorMasterSM; ArrayList<IpServer> ipv6CoordinatorNotifyList; @@ -276,8 +294,9 @@ public class TetheringTest { } @Override - public int getDefaultDataSubscriptionId() { - return INVALID_SUBSCRIPTION_ID; + public TetheringConfiguration generateTetheringConfiguration(Context ctx, SharedLog log, + int subId) { + return new MockTetheringConfiguration(ctx, log, subId); } } @@ -372,6 +391,11 @@ public class TetheringTest { mTetheringDependencies.reset(); mTethering = makeTethering(); verify(mNMService).registerTetheringStatsProvider(any(), anyString()); + final ArgumentCaptor<PhoneStateListener> phoneListenerCaptor = + ArgumentCaptor.forClass(PhoneStateListener.class); + verify(mTelephonyManager).listen(phoneListenerCaptor.capture(), + eq(PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE)); + mPhoneStateListener = phoneListenerCaptor.getValue(); } private Tethering makeTethering() { @@ -982,6 +1006,17 @@ public class TetheringTest { callback2.expectUpstreamChanged(upstreamState.network); } + @Test + public void testMultiSimAware() throws Exception { + final TetheringConfiguration initailConfig = mTethering.getTetheringConfiguration(); + assertEquals(INVALID_SUBSCRIPTION_ID, initailConfig.subId); + + final int fakeSubId = 1234; + mPhoneStateListener.onActiveDataSubscriptionIdChanged(fakeSubId); + final TetheringConfiguration newConfig = mTethering.getTetheringConfiguration(); + assertEquals(fakeSubId, newConfig.subId); + } + // TODO: Test that a request for hotspot mode doesn't interfere with an // already operating tethering mode interface. } diff --git a/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java b/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java index 21403225c600..e28296354d2a 100644 --- a/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java +++ b/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java @@ -29,6 +29,7 @@ import static com.android.internal.R.array.config_tether_upstream_types; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.when; import android.content.ContentResolver; @@ -141,7 +142,7 @@ public class TetheringConfigurationTest { @Test public void testDunFromTelephonyManagerMeansDun() { - when(mTelephonyManager.getTetherApnRequired()).thenReturn(true); + when(mTelephonyManager.getTetherApnRequired(anyInt())).thenReturn(true); final TetheringConfiguration cfgWifi = getTetheringConfiguration(TYPE_WIFI); final TetheringConfiguration cfgMobileWifiHipri = getTetheringConfiguration( @@ -165,7 +166,7 @@ public class TetheringConfigurationTest { @Test public void testDunNotRequiredFromTelephonyManagerMeansNoDun() { - when(mTelephonyManager.getTetherApnRequired()).thenReturn(false); + when(mTelephonyManager.getTetherApnRequired(anyInt())).thenReturn(false); final TetheringConfiguration cfgWifi = getTetheringConfiguration(TYPE_WIFI); final TetheringConfiguration cfgMobileWifiHipri = getTetheringConfiguration( @@ -208,7 +209,7 @@ public class TetheringConfigurationTest { @Test public void testNoDefinedUpstreamTypesAddsEthernet() { when(mResources.getIntArray(config_tether_upstream_types)).thenReturn(new int[]{}); - when(mTelephonyManager.getTetherApnRequired()).thenReturn(false); + when(mTelephonyManager.getTetherApnRequired(anyInt())).thenReturn(false); final TetheringConfiguration cfg = new TetheringConfiguration( mMockContext, mLog, INVALID_SUBSCRIPTION_ID); @@ -231,7 +232,7 @@ public class TetheringConfigurationTest { public void testDefinedUpstreamTypesSansEthernetAddsEthernet() { when(mResources.getIntArray(config_tether_upstream_types)).thenReturn( new int[]{TYPE_WIFI, TYPE_MOBILE_HIPRI}); - when(mTelephonyManager.getTetherApnRequired()).thenReturn(false); + when(mTelephonyManager.getTetherApnRequired(anyInt())).thenReturn(false); final TetheringConfiguration cfg = new TetheringConfiguration( mMockContext, mLog, INVALID_SUBSCRIPTION_ID); @@ -249,7 +250,7 @@ public class TetheringConfigurationTest { public void testDefinedUpstreamTypesWithEthernetDoesNotAddEthernet() { when(mResources.getIntArray(config_tether_upstream_types)) .thenReturn(new int[]{TYPE_WIFI, TYPE_ETHERNET, TYPE_MOBILE_HIPRI}); - when(mTelephonyManager.getTetherApnRequired()).thenReturn(false); + when(mTelephonyManager.getTetherApnRequired(anyInt())).thenReturn(false); final TetheringConfiguration cfg = new TetheringConfiguration( mMockContext, mLog, INVALID_SUBSCRIPTION_ID); diff --git a/tests/net/java/com/android/server/net/NetworkStatsBaseTest.java b/tests/net/java/com/android/server/net/NetworkStatsBaseTest.java new file mode 100644 index 000000000000..28785f7c9726 --- /dev/null +++ b/tests/net/java/com/android/server/net/NetworkStatsBaseTest.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2011 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.net; + +import static android.net.NetworkStats.DEFAULT_NETWORK_ALL; +import static android.net.NetworkStats.DEFAULT_NETWORK_NO; +import static android.net.NetworkStats.DEFAULT_NETWORK_YES; +import static android.net.NetworkStats.METERED_ALL; +import static android.net.NetworkStats.METERED_NO; +import static android.net.NetworkStats.METERED_YES; +import static android.net.NetworkStats.ROAMING_ALL; +import static android.net.NetworkStats.ROAMING_NO; +import static android.net.NetworkStats.ROAMING_YES; +import static android.net.NetworkStats.SET_ALL; +import static android.net.NetworkStats.SET_DEFAULT; +import static android.net.NetworkStats.SET_FOREGROUND; +import static android.net.NetworkStats.TAG_NONE; + +import static org.junit.Assert.assertEquals; + +import android.net.NetworkStats; + +import com.android.internal.net.VpnInfo; + +/** Superclass with utilities for NetworkStats(Service|Factory)Test */ +abstract class NetworkStatsBaseTest { + static final String TEST_IFACE = "test0"; + static final String TEST_IFACE2 = "test1"; + static final String TUN_IFACE = "test_nss_tun0"; + + static final int UID_RED = 1001; + static final int UID_BLUE = 1002; + static final int UID_GREEN = 1003; + static final int UID_VPN = 1004; + + void assertValues(NetworkStats stats, String iface, int uid, long rxBytes, + long rxPackets, long txBytes, long txPackets) { + assertValues( + stats, iface, uid, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, + rxBytes, rxPackets, txBytes, txPackets, 0); + } + + void assertValues(NetworkStats stats, String iface, int uid, int set, int tag, + int metered, int roaming, int defaultNetwork, long rxBytes, long rxPackets, + long txBytes, long txPackets, long operations) { + final NetworkStats.Entry entry = new NetworkStats.Entry(); + final int[] sets; + if (set == SET_ALL) { + sets = new int[] {SET_ALL, SET_DEFAULT, SET_FOREGROUND}; + } else { + sets = new int[] {set}; + } + + final int[] roamings; + if (roaming == ROAMING_ALL) { + roamings = new int[] {ROAMING_ALL, ROAMING_YES, ROAMING_NO}; + } else { + roamings = new int[] {roaming}; + } + + final int[] meterings; + if (metered == METERED_ALL) { + meterings = new int[] {METERED_ALL, METERED_YES, METERED_NO}; + } else { + meterings = new int[] {metered}; + } + + final int[] defaultNetworks; + if (defaultNetwork == DEFAULT_NETWORK_ALL) { + defaultNetworks = + new int[] {DEFAULT_NETWORK_ALL, DEFAULT_NETWORK_YES, DEFAULT_NETWORK_NO}; + } else { + defaultNetworks = new int[] {defaultNetwork}; + } + + for (int s : sets) { + for (int r : roamings) { + for (int m : meterings) { + for (int d : defaultNetworks) { + final int i = stats.findIndex(iface, uid, s, tag, m, r, d); + if (i != -1) { + entry.add(stats.getValues(i, null)); + } + } + } + } + } + + assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes); + assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets); + assertEquals("unexpected txBytes", txBytes, entry.txBytes); + assertEquals("unexpected txPackets", txPackets, entry.txPackets); + assertEquals("unexpected operations", operations, entry.operations); + } + + VpnInfo createVpnInfo(String[] underlyingIfaces) { + VpnInfo info = new VpnInfo(); + info.ownerUid = UID_VPN; + info.vpnIface = TUN_IFACE; + info.underlyingIfaces = underlyingIfaces; + return info; + } +} diff --git a/tests/net/java/com/android/server/net/NetworkStatsFactoryTest.java b/tests/net/java/com/android/server/net/NetworkStatsFactoryTest.java index 95bc7d92d538..7329474db70f 100644 --- a/tests/net/java/com/android/server/net/NetworkStatsFactoryTest.java +++ b/tests/net/java/com/android/server/net/NetworkStatsFactoryTest.java @@ -16,8 +16,11 @@ package com.android.server.net; +import static android.net.NetworkStats.DEFAULT_NETWORK_ALL; import static android.net.NetworkStats.DEFAULT_NETWORK_NO; +import static android.net.NetworkStats.METERED_ALL; import static android.net.NetworkStats.METERED_NO; +import static android.net.NetworkStats.ROAMING_ALL; import static android.net.NetworkStats.ROAMING_NO; import static android.net.NetworkStats.SET_ALL; import static android.net.NetworkStats.SET_DEFAULT; @@ -39,6 +42,7 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.frameworks.tests.net.R; +import com.android.internal.net.VpnInfo; import libcore.io.IoUtils; import libcore.io.Streams; @@ -54,12 +58,12 @@ import java.io.FileWriter; import java.io.InputStream; import java.io.OutputStream; -/** - * Tests for {@link NetworkStatsFactory}. - */ +/** Tests for {@link NetworkStatsFactory}. */ @RunWith(AndroidJUnit4.class) @SmallTest -public class NetworkStatsFactoryTest { +public class NetworkStatsFactoryTest extends NetworkStatsBaseTest { + private static final String CLAT_PREFIX = "v4-"; + private File mTestProc; private NetworkStatsFactory mFactory; @@ -75,6 +79,8 @@ public class NetworkStatsFactoryTest { // related to networkStatsFactory is compiled to a minimal native library and loaded here. System.loadLibrary("networkstatsfactorytestjni"); mFactory = new NetworkStatsFactory(mTestProc, false); + NetworkStatsFactory.updateVpnInfos(new VpnInfo[0]); + NetworkStatsFactory.clearStackedIfaces(); } @After @@ -99,6 +105,236 @@ public class NetworkStatsFactoryTest { } @Test + public void vpnRewriteTrafficThroughItself() throws Exception { + VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE})}; + NetworkStatsFactory.updateVpnInfos(vpnInfos); + + // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption + // overhead per packet): + // + // 1000 bytes (100 packets) were sent, and 2000 bytes (200 packets) were received by UID_RED + // over VPN. + // 500 bytes (50 packets) were sent, and 1000 bytes (100 packets) were received by UID_BLUE + // over VPN. + // + // VPN UID rewrites packets read from TUN back to TUN, plus some of its own traffic + + final NetworkStats tunStats = parseDetailedStats(R.raw.xt_qtaguid_vpn_rewrite_through_self); + + assertValues(tunStats, TUN_IFACE, UID_RED, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, + DEFAULT_NETWORK_ALL, 2000L, 200L, 1000L, 100L, 0); + assertValues(tunStats, TUN_IFACE, UID_BLUE, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, + DEFAULT_NETWORK_ALL, 1000L, 100L, 500L, 50L, 0); + assertValues(tunStats, TUN_IFACE, UID_VPN, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL, + DEFAULT_NETWORK_ALL, 0L, 0L, 1600L, 160L, 0); + + assertValues(tunStats, TEST_IFACE, UID_RED, 2000L, 200L, 1000L, 100L); + assertValues(tunStats, TEST_IFACE, UID_BLUE, 1000L, 100L, 500L, 50L); + assertValues(tunStats, TEST_IFACE, UID_VPN, 300L, 0L, 260L, 26L); + } + + @Test + public void vpnWithClat() throws Exception { + VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {CLAT_PREFIX + TEST_IFACE})}; + NetworkStatsFactory.updateVpnInfos(vpnInfos); + NetworkStatsFactory.noteStackedIface(CLAT_PREFIX + TEST_IFACE, TEST_IFACE); + + // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption + // overhead per packet): + // 1000 bytes (100 packets) were sent, and 2000 bytes (200 packets) were received by UID_RED + // over VPN. + // 500 bytes (50 packets) were sent, and 1000 bytes (100 packets) were received by UID_BLUE + // over VPN. + // VPN sent 1650 bytes (150 packets), and received 3300 (300 packets) over v4-WiFi, and clat + // added 20 bytes per packet of extra overhead + // + // For 1650 bytes sent over v4-WiFi, 4650 bytes were actually sent over WiFi, which is + // expected to be split as follows: + // UID_RED: 1000 bytes, 100 packets + // UID_BLUE: 500 bytes, 50 packets + // UID_VPN: 3150 bytes, 0 packets + // + // For 3300 bytes received over v4-WiFi, 9300 bytes were actually sent over WiFi, which is + // expected to be split as follows: + // UID_RED: 2000 bytes, 200 packets + // UID_BLUE: 1000 bytes, 100 packets + // UID_VPN: 6300 bytes, 0 packets + final NetworkStats tunStats = parseDetailedStats(R.raw.xt_qtaguid_vpn_with_clat); + + assertValues(tunStats, CLAT_PREFIX + TEST_IFACE, UID_RED, 2000L, 200L, 1000, 100L); + assertValues(tunStats, CLAT_PREFIX + TEST_IFACE, UID_BLUE, 1000L, 100L, 500L, 50L); + assertValues(tunStats, CLAT_PREFIX + TEST_IFACE, UID_VPN, 6300L, 0L, 3150L, 0L); + } + + @Test + public void vpnWithOneUnderlyingIface() throws Exception { + VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE})}; + NetworkStatsFactory.updateVpnInfos(vpnInfos); + + // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption + // overhead per packet): + // 1000 bytes (100 packets) were sent, and 2000 bytes (200 packets) were received by UID_RED + // over VPN. + // 500 bytes (50 packets) were sent, and 1000 bytes (100 packets) were received by UID_BLUE + // over VPN. + // VPN sent 1650 bytes (150 packets), and received 3300 (300 packets) over WiFi. + // Of 1650 bytes sent over WiFi, expect 1000 bytes attributed to UID_RED, 500 bytes + // attributed to UID_BLUE, and 150 bytes attributed to UID_VPN. + // Of 3300 bytes received over WiFi, expect 2000 bytes attributed to UID_RED, 1000 bytes + // attributed to UID_BLUE, and 300 bytes attributed to UID_VPN. + final NetworkStats tunStats = parseDetailedStats(R.raw.xt_qtaguid_vpn_one_underlying); + + assertValues(tunStats, TEST_IFACE, UID_RED, 2000L, 200L, 1000L, 100L); + assertValues(tunStats, TEST_IFACE, UID_BLUE, 1000L, 100L, 500L, 50L); + assertValues(tunStats, TEST_IFACE, UID_VPN, 300L, 0L, 150L, 0L); + } + + @Test + public void vpnWithOneUnderlyingIfaceAndOwnTraffic() throws Exception { + // WiFi network is connected and VPN is using WiFi (which has TEST_IFACE). + VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE})}; + NetworkStatsFactory.updateVpnInfos(vpnInfos); + + // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption + // overhead per packet): + // 1000 bytes (100 packets) were sent, and 2000 bytes (200 packets) were received by UID_RED + // over VPN. + // 500 bytes (50 packets) were sent, and 1000 bytes (100 packets) were received by UID_BLUE + // over VPN. + // Additionally, the VPN sends 6000 bytes (600 packets) of its own traffic into the tun + // interface (passing that traffic to the VPN endpoint), and receives 5000 bytes (500 + // packets) from it. Including overhead that is 6600/5500 bytes. + // VPN sent 8250 bytes (750 packets), and received 8800 (800 packets) over WiFi. + // Of 8250 bytes sent over WiFi, expect 1000 bytes attributed to UID_RED, 500 bytes + // attributed to UID_BLUE, and 6750 bytes attributed to UID_VPN. + // Of 8800 bytes received over WiFi, expect 2000 bytes attributed to UID_RED, 1000 bytes + // attributed to UID_BLUE, and 5800 bytes attributed to UID_VPN. + final NetworkStats tunStats = + parseDetailedStats(R.raw.xt_qtaguid_vpn_one_underlying_own_traffic); + + assertValues(tunStats, TEST_IFACE, UID_RED, 2000L, 200L, 1000L, 100L); + assertValues(tunStats, TEST_IFACE, UID_BLUE, 1000L, 100L, 500L, 50L); + assertValues(tunStats, TEST_IFACE, UID_VPN, 5800L, 500L, 6750L, 600L); + } + + @Test + public void vpnWithOneUnderlyingIface_withCompression() throws Exception { + // WiFi network is connected and VPN is using WiFi (which has TEST_IFACE). + VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE})}; + NetworkStatsFactory.updateVpnInfos(vpnInfos); + + // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption + // overhead per packet): + // 1000 bytes (100 packets) were sent/received by UID_RED over VPN. + // 3000 bytes (300 packets) were sent/received by UID_BLUE over VPN. + // VPN sent/received 1000 bytes (100 packets) over WiFi. + // Of 1000 bytes over WiFi, expect 250 bytes attributed UID_RED and 750 bytes to UID_BLUE, + // with nothing attributed to UID_VPN for both rx/tx traffic. + final NetworkStats tunStats = + parseDetailedStats(R.raw.xt_qtaguid_vpn_one_underlying_compression); + + assertValues(tunStats, TEST_IFACE, UID_RED, 250L, 25L, 250L, 25L); + assertValues(tunStats, TEST_IFACE, UID_BLUE, 750L, 75L, 750L, 75L); + assertValues(tunStats, TEST_IFACE, UID_VPN, 0L, 0L, 0L, 0L); + } + + @Test + public void vpnWithTwoUnderlyingIfaces_packetDuplication() throws Exception { + // WiFi and Cell networks are connected and VPN is using WiFi (which has TEST_IFACE) and + // Cell (which has TEST_IFACE2) and has declared both of them in its underlying network set. + // Additionally, VPN is duplicating traffic across both WiFi and Cell. + VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE, TEST_IFACE2})}; + NetworkStatsFactory.updateVpnInfos(vpnInfos); + + // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption + // overhead per packet): + // 1000 bytes (100 packets) were sent/received by UID_RED and UID_BLUE over VPN. + // VPN sent/received 4400 bytes (400 packets) over both WiFi and Cell (8800 bytes in total). + // Of 8800 bytes over WiFi/Cell, expect: + // - 500 bytes rx/tx each over WiFi/Cell attributed to both UID_RED and UID_BLUE. + // - 1200 bytes rx/tx each over WiFi/Cell for VPN_UID. + final NetworkStats tunStats = + parseDetailedStats(R.raw.xt_qtaguid_vpn_two_underlying_duplication); + + assertValues(tunStats, TEST_IFACE, UID_RED, 500L, 50L, 500L, 50L); + assertValues(tunStats, TEST_IFACE, UID_BLUE, 500L, 50L, 500L, 50L); + assertValues(tunStats, TEST_IFACE, UID_VPN, 1200L, 100L, 1200L, 100L); + assertValues(tunStats, TEST_IFACE2, UID_RED, 500L, 50L, 500L, 50L); + assertValues(tunStats, TEST_IFACE2, UID_BLUE, 500L, 50L, 500L, 50L); + assertValues(tunStats, TEST_IFACE2, UID_VPN, 1200L, 100L, 1200L, 100L); + } + + @Test + public void vpnWithTwoUnderlyingIfaces_splitTraffic() throws Exception { + // WiFi and Cell networks are connected and VPN is using WiFi (which has TEST_IFACE) and + // Cell (which has TEST_IFACE2) and has declared both of them in its underlying network set. + // Additionally, VPN is arbitrarily splitting traffic across WiFi and Cell. + VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE, TEST_IFACE2})}; + NetworkStatsFactory.updateVpnInfos(vpnInfos); + + // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption + // overhead per packet): + // 1000 bytes (100 packets) were sent, and 500 bytes (50 packets) received by UID_RED over + // VPN. + // VPN sent 660 bytes (60 packets) over WiFi and 440 bytes (40 packets) over Cell. + // And, it received 330 bytes (30 packets) over WiFi and 220 bytes (20 packets) over Cell. + // For UID_RED, expect 600 bytes attributed over WiFi and 400 bytes over Cell for sent (tx) + // traffic. For received (rx) traffic, expect 300 bytes over WiFi and 200 bytes over Cell. + // + // For UID_VPN, expect 60 bytes attributed over WiFi and 40 bytes over Cell for tx traffic. + // And, 30 bytes over WiFi and 20 bytes over Cell for rx traffic. + final NetworkStats tunStats = parseDetailedStats(R.raw.xt_qtaguid_vpn_two_underlying_split); + + assertValues(tunStats, TEST_IFACE, UID_RED, 300L, 30L, 600L, 60L); + assertValues(tunStats, TEST_IFACE, UID_VPN, 30L, 0L, 60L, 0L); + assertValues(tunStats, TEST_IFACE2, UID_RED, 200L, 20L, 400L, 40L); + assertValues(tunStats, TEST_IFACE2, UID_VPN, 20L, 0L, 40L, 0L); + } + + @Test + public void vpnWithTwoUnderlyingIfaces_splitTrafficWithCompression() throws Exception { + // WiFi and Cell networks are connected and VPN is using WiFi (which has TEST_IFACE) and + // Cell (which has TEST_IFACE2) and has declared both of them in its underlying network set. + // Additionally, VPN is arbitrarily splitting compressed traffic across WiFi and Cell. + VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE, TEST_IFACE2})}; + NetworkStatsFactory.updateVpnInfos(vpnInfos); + + // create some traffic (assume 10 bytes of MTU for VPN interface: + // 1000 bytes (100 packets) were sent/received by UID_RED over VPN. + // VPN sent/received 600 bytes (60 packets) over WiFi and 200 bytes (20 packets) over Cell. + // For UID_RED, expect 600 bytes attributed over WiFi and 200 bytes over Cell for both + // rx/tx. + // UID_VPN gets nothing attributed to it (avoiding negative stats). + final NetworkStats tunStats = + parseDetailedStats(R.raw.xt_qtaguid_vpn_two_underlying_split_compression); + + assertValues(tunStats, TEST_IFACE, UID_RED, 600L, 60L, 600L, 60L); + assertValues(tunStats, TEST_IFACE, UID_VPN, 0L, 0L, 0L, 0L); + assertValues(tunStats, TEST_IFACE2, UID_RED, 200L, 20L, 200L, 20L); + assertValues(tunStats, TEST_IFACE2, UID_VPN, 0L, 0L, 0L, 0L); + } + + @Test + public void vpnWithIncorrectUnderlyingIface() throws Exception { + // WiFi and Cell networks are connected and VPN is using Cell (which has TEST_IFACE2), + // but has declared only WiFi (TEST_IFACE) in its underlying network set. + VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(new String[] {TEST_IFACE})}; + NetworkStatsFactory.updateVpnInfos(vpnInfos); + + // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption + // overhead per packet): + // 1000 bytes (100 packets) were sent/received by UID_RED over VPN. + // VPN sent/received 1100 bytes (100 packets) over Cell. + // Of 1100 bytes over Cell, expect all of it attributed to UID_VPN for both rx/tx traffic. + final NetworkStats tunStats = parseDetailedStats(R.raw.xt_qtaguid_vpn_incorrect_iface); + + assertValues(tunStats, TEST_IFACE, UID_RED, 0L, 0L, 0L, 0L); + assertValues(tunStats, TEST_IFACE, UID_VPN, 0L, 0L, 0L, 0L); + assertValues(tunStats, TEST_IFACE2, UID_RED, 0L, 0L, 0L, 0L); + assertValues(tunStats, TEST_IFACE2, UID_VPN, 1100L, 100L, 1100L, 100L); + } + + @Test public void testKernelTags() throws Exception { assertEquals(0, kernelToTag("0x0000000000000000")); assertEquals(0x32, kernelToTag("0x0000003200000000")); @@ -146,7 +382,7 @@ public class NetworkStatsFactoryTest { } @Test - public void testDoubleClatAccounting() throws Exception { + public void testDoubleClatAccountingSimple() throws Exception { NetworkStatsFactory.noteStackedIface("v4-wlan0", "wlan0"); // xt_qtaguid_with_clat_simple is a synthetic file that simulates @@ -154,12 +390,17 @@ public class NetworkStatsFactoryTest { // - 41 sent 464xlat packets of size 100 bytes // - no other traffic on base interface for root uid. NetworkStats stats = parseDetailedStats(R.raw.xt_qtaguid_with_clat_simple); - assertEquals(4, stats.size()); + assertEquals(3, stats.size()); assertStatsEntry(stats, "v4-wlan0", 10060, SET_DEFAULT, 0x0, 46860L, 4920L); assertStatsEntry(stats, "wlan0", 0, SET_DEFAULT, 0x0, 0L, 0L); + } + + @Test + public void testDoubleClatAccounting() throws Exception { + NetworkStatsFactory.noteStackedIface("v4-wlan0", "wlan0"); - stats = parseDetailedStats(R.raw.xt_qtaguid_with_clat); + NetworkStats stats = parseDetailedStats(R.raw.xt_qtaguid_with_clat); assertEquals(42, stats.size()); assertStatsEntry(stats, "v4-wlan0", 0, SET_DEFAULT, 0x0, 356L, 276L); @@ -272,11 +513,19 @@ public class NetworkStatsFactoryTest { private static void assertStatsEntry(NetworkStats stats, String iface, int uid, int set, int tag, long rxBytes, long rxPackets, long txBytes, long txPackets) { - final int i = stats.findIndex(iface, uid, set, tag, METERED_NO, ROAMING_NO, - DEFAULT_NETWORK_NO); + assertStatsEntry(stats, iface, uid, set, tag, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, + rxBytes, rxPackets, txBytes, txPackets); + } + + private static void assertStatsEntry(NetworkStats stats, String iface, int uid, int set, + int tag, int metered, int roaming, int defaultNetwork, long rxBytes, long rxPackets, + long txBytes, long txPackets) { + final int i = stats.findIndex(iface, uid, set, tag, metered, roaming, defaultNetwork); + if (i < 0) { - fail(String.format("no NetworkStats for (iface: %s, uid: %d, set: %d, tag: %d)", - iface, uid, set, tag)); + fail(String.format("no NetworkStats for (iface: %s, uid: %d, set: %d, tag: %d, metered:" + + " %d, roaming: %d, defaultNetwork: %d)", + iface, uid, set, tag, metered, roaming, defaultNetwork)); } final NetworkStats.Entry entry = stats.getValues(i, null); assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes); diff --git a/tests/net/java/com/android/server/net/NetworkStatsObserversTest.java b/tests/net/java/com/android/server/net/NetworkStatsObserversTest.java index 43a38039c0da..f21a7dd25946 100644 --- a/tests/net/java/com/android/server/net/NetworkStatsObserversTest.java +++ b/tests/net/java/com/android/server/net/NetworkStatsObserversTest.java @@ -54,7 +54,6 @@ import android.util.ArrayMap; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; -import com.android.internal.net.VpnInfo; import com.android.server.net.NetworkStatsServiceTest.LatchedHandler; import org.junit.Before; @@ -94,8 +93,6 @@ public class NetworkStatsObserversTest { private static final long BASE_BYTES = 7 * MB_IN_BYTES; private static final int INVALID_TYPE = -1; - private static final VpnInfo[] VPN_INFO = new VpnInfo[0]; - private long mElapsedRealtime; private HandlerThread mObserverHandlerThread; @@ -248,8 +245,7 @@ public class NetworkStatsObserversTest { NetworkStats uidSnapshot = null; mStatsObservers.updateStats( - xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, - VPN_INFO, TEST_START); + xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, TEST_START); waitForObserverToIdle(); } @@ -272,15 +268,13 @@ public class NetworkStatsObserversTest { .addIfaceValues(TEST_IFACE, BASE_BYTES, 8L, BASE_BYTES, 16L); NetworkStats uidSnapshot = null; mStatsObservers.updateStats( - xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, - VPN_INFO, TEST_START); + xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, TEST_START); // Delta xtSnapshot = new NetworkStats(TEST_START, 1 /* initialSize */) .addIfaceValues(TEST_IFACE, BASE_BYTES + 1024L, 10L, BASE_BYTES + 2048L, 20L); mStatsObservers.updateStats( - xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, - VPN_INFO, TEST_START); + xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, TEST_START); waitForObserverToIdle(); } @@ -304,16 +298,14 @@ public class NetworkStatsObserversTest { .addIfaceValues(TEST_IFACE, BASE_BYTES, 8L, BASE_BYTES, 16L); NetworkStats uidSnapshot = null; mStatsObservers.updateStats( - xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, - VPN_INFO, TEST_START); + xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, TEST_START); // Delta xtSnapshot = new NetworkStats(TEST_START + MINUTE_IN_MILLIS, 1 /* initialSize */) .addIfaceValues(TEST_IFACE, BASE_BYTES + THRESHOLD_BYTES, 12L, BASE_BYTES + THRESHOLD_BYTES, 22L); mStatsObservers.updateStats( - xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, - VPN_INFO, TEST_START); + xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, TEST_START); waitForObserverToIdle(); assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.lastMessageType); } @@ -338,8 +330,7 @@ public class NetworkStatsObserversTest { .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, BASE_BYTES, 2L, BASE_BYTES, 2L, 0L); mStatsObservers.updateStats( - xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, - VPN_INFO, TEST_START); + xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, TEST_START); // Delta uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */) @@ -347,8 +338,7 @@ public class NetworkStatsObserversTest { DEFAULT_NETWORK_NO, BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L); mStatsObservers.updateStats( - xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, - VPN_INFO, TEST_START); + xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, TEST_START); waitForObserverToIdle(); assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.lastMessageType); } @@ -373,8 +363,7 @@ public class NetworkStatsObserversTest { .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, BASE_BYTES, 2L, BASE_BYTES, 2L, 0L); mStatsObservers.updateStats( - xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, - VPN_INFO, TEST_START); + xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, TEST_START); // Delta uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */) @@ -382,8 +371,7 @@ public class NetworkStatsObserversTest { DEFAULT_NETWORK_NO, BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L); mStatsObservers.updateStats( - xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, - VPN_INFO, TEST_START); + xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, TEST_START); waitForObserverToIdle(); } @@ -407,8 +395,7 @@ public class NetworkStatsObserversTest { .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, BASE_BYTES, 2L, BASE_BYTES, 2L, 0L); mStatsObservers.updateStats( - xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, - VPN_INFO, TEST_START); + xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, TEST_START); // Delta uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */) @@ -416,8 +403,7 @@ public class NetworkStatsObserversTest { DEFAULT_NETWORK_YES, BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L); mStatsObservers.updateStats( - xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, - VPN_INFO, TEST_START); + xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, TEST_START); waitForObserverToIdle(); assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.lastMessageType); } @@ -442,8 +428,7 @@ public class NetworkStatsObserversTest { .addValues(TEST_IFACE, UID_ANOTHER_USER, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, BASE_BYTES, 2L, BASE_BYTES, 2L, 0L); mStatsObservers.updateStats( - xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, - VPN_INFO, TEST_START); + xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, TEST_START); // Delta uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */) @@ -451,8 +436,7 @@ public class NetworkStatsObserversTest { ROAMING_NO, DEFAULT_NETWORK_NO, BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L); mStatsObservers.updateStats( - xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, - VPN_INFO, TEST_START); + xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces, TEST_START); waitForObserverToIdle(); } diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java index bce526d3ae29..956b2a74329d 100644 --- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java +++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java @@ -23,7 +23,6 @@ import static android.net.ConnectivityManager.TYPE_VPN; import static android.net.ConnectivityManager.TYPE_WIFI; import static android.net.ConnectivityManager.TYPE_WIMAX; import static android.net.NetworkStats.DEFAULT_NETWORK_ALL; -import static android.net.NetworkStats.DEFAULT_NETWORK_NO; import static android.net.NetworkStats.DEFAULT_NETWORK_YES; import static android.net.NetworkStats.IFACE_ALL; import static android.net.NetworkStats.INTERFACES_ALL; @@ -42,7 +41,6 @@ import static android.net.NetworkStats.TAG_NONE; import static android.net.NetworkStats.UID_ALL; import static android.net.NetworkStatsHistory.FIELD_ALL; import static android.net.NetworkTemplate.buildTemplateMobileAll; -import static android.net.NetworkTemplate.buildTemplateMobileWildcard; import static android.net.NetworkTemplate.buildTemplateWifiWildcard; import static android.net.TrafficStats.MB_IN_BYTES; import static android.net.TrafficStats.UID_REMOVED; @@ -61,7 +59,6 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -99,7 +96,6 @@ import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; -import com.android.internal.net.VpnInfo; import com.android.internal.util.ArrayUtils; import com.android.internal.util.test.BroadcastInterceptingContext; import com.android.server.net.NetworkStatsService.NetworkStatsSettings; @@ -129,13 +125,9 @@ import java.util.Objects; */ @RunWith(AndroidJUnit4.class) @SmallTest -public class NetworkStatsServiceTest { +public class NetworkStatsServiceTest extends NetworkStatsBaseTest { private static final String TAG = "NetworkStatsServiceTest"; - private static final String TEST_IFACE = "test0"; - private static final String TEST_IFACE2 = "test1"; - private static final String TUN_IFACE = "test_nss_tun0"; - private static final long TEST_START = 1194220800000L; private static final String IMSI_1 = "310004"; @@ -146,11 +138,6 @@ public class NetworkStatsServiceTest { private static NetworkTemplate sTemplateImsi1 = buildTemplateMobileAll(IMSI_1); private static NetworkTemplate sTemplateImsi2 = buildTemplateMobileAll(IMSI_2); - private static final int UID_RED = 1001; - private static final int UID_BLUE = 1002; - private static final int UID_GREEN = 1003; - private static final int UID_VPN = 1004; - private static final Network WIFI_NETWORK = new Network(100); private static final Network MOBILE_NETWORK = new Network(101); private static final Network VPN_NETWORK = new Network(102); @@ -217,10 +204,12 @@ public class NetworkStatsServiceTest { expectSystemReady(); mService.systemReady(); + // Verify that system ready fetches realtime stats + verify(mNetManager).getNetworkStatsUidDetail(UID_ALL, INTERFACES_ALL); + mSession = mService.openSession(); assertNotNull("openSession() failed", mSession); - // catch INetworkManagementEventObserver during systemReady() ArgumentCaptor<INetworkManagementEventObserver> networkObserver = ArgumentCaptor.forClass(INetworkManagementEventObserver.class); @@ -252,7 +241,7 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); + mService.forceUpdateIfaces(NETWORKS_WIFI, states, getActiveIface(states)); // verify service has empty history for wifi assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); @@ -296,7 +285,7 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); + mService.forceUpdateIfaces(NETWORKS_WIFI, states, getActiveIface(states)); // verify service has empty history for wifi assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); @@ -370,8 +359,7 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); - + mService.forceUpdateIfaces(NETWORKS_WIFI, states, getActiveIface(states)); // modify some number on wifi, and trigger poll event incrementCurrentTime(2 * HOUR_IN_MILLIS); @@ -412,8 +400,7 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states)); - + mService.forceUpdateIfaces(NETWORKS_MOBILE, states, getActiveIface(states)); // create some traffic on first network incrementCurrentTime(HOUR_IN_MILLIS); @@ -448,7 +435,7 @@ public class NetworkStatsServiceTest { .addValues(TEST_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 512L, 4L, 0L, 0L, 0L)); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states)); + mService.forceUpdateIfaces(NETWORKS_MOBILE, states, getActiveIface(states)); forcePollAndWaitForIdle(); @@ -488,8 +475,7 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); - + mService.forceUpdateIfaces(NETWORKS_WIFI, states, getActiveIface(states)); // create some traffic incrementCurrentTime(HOUR_IN_MILLIS); @@ -547,8 +533,7 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states)); - + mService.forceUpdateIfaces(NETWORKS_MOBILE, states, getActiveIface(states)); // create some traffic incrementCurrentTime(HOUR_IN_MILLIS); @@ -575,7 +560,7 @@ public class NetworkStatsServiceTest { .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 512L, 4L, 512L, 4L, 0L)); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states)); + mService.forceUpdateIfaces(NETWORKS_MOBILE, states, getActiveIface(states)); forcePollAndWaitForIdle(); @@ -605,8 +590,7 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); - + mService.forceUpdateIfaces(NETWORKS_WIFI, states, getActiveIface(states)); // create some traffic for two apps incrementCurrentTime(HOUR_IN_MILLIS); @@ -664,7 +648,7 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); + mService.forceUpdateIfaces(NETWORKS_WIFI, states, getActiveIface(states)); NetworkStats.Entry entry1 = new NetworkStats.Entry( TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 50L, 5L, 50L, 5L, 0L); @@ -708,7 +692,7 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); + mService.forceUpdateIfaces(NETWORKS_WIFI, states, getActiveIface(states)); NetworkStats.Entry uidStats = new NetworkStats.Entry( TEST_IFACE, UID_BLUE, SET_DEFAULT, 0xF00D, 1024L, 8L, 512L, 4L, 0L); @@ -733,11 +717,17 @@ public class NetworkStatsServiceTest { NetworkStats stats = mService.getDetailedUidStats(ifaceFilter); - verify(mNetManager, times(1)).getNetworkStatsUidDetail(eq(UID_ALL), argThat(ifaces -> - ifaces != null && ifaces.length == 2 - && ArrayUtils.contains(ifaces, TEST_IFACE) - && ArrayUtils.contains(ifaces, stackedIface))); - + // mNetManager#getNetworkStatsUidDetail(UID_ALL, INTERFACES_ALL) has following invocations: + // 1) NetworkStatsService#systemReady from #setUp. + // 2) mService#forceUpdateIfaces in the test above. + // + // Additionally, we should have one call from the above call to mService#getDetailedUidStats + // with the augmented ifaceFilter + verify(mNetManager, times(2)).getNetworkStatsUidDetail(UID_ALL, INTERFACES_ALL); + verify(mNetManager, times(1)).getNetworkStatsUidDetail( + eq(UID_ALL), eq(NetworkStatsFactory.augmentWithStackedInterfaces(ifaceFilter))); + assertTrue(ArrayUtils.contains(stats.getUniqueIfaces(), TEST_IFACE)); + assertTrue(ArrayUtils.contains(stats.getUniqueIfaces(), stackedIface)); assertEquals(2, stats.size()); assertEquals(uidStats, stats.getValues(0, null)); assertEquals(tetheredStats1, stats.getValues(1, null)); @@ -752,8 +742,7 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); - + mService.forceUpdateIfaces(NETWORKS_WIFI, states, getActiveIface(states)); // create some initial traffic incrementCurrentTime(HOUR_IN_MILLIS); @@ -810,8 +799,7 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); - + mService.forceUpdateIfaces(NETWORKS_WIFI, states, getActiveIface(states)); // create some initial traffic incrementCurrentTime(HOUR_IN_MILLIS); @@ -851,8 +839,7 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states)); - + mService.forceUpdateIfaces(NETWORKS_MOBILE, states, getActiveIface(states)); // Create some traffic incrementCurrentTime(HOUR_IN_MILLIS); @@ -890,8 +877,7 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_MOBILE, new VpnInfo[0], states, getActiveIface(states)); - + mService.forceUpdateIfaces(NETWORKS_MOBILE, states, getActiveIface(states)); // create some tethering traffic incrementCurrentTime(HOUR_IN_MILLIS); @@ -923,113 +909,6 @@ public class NetworkStatsServiceTest { } @Test - public void vpnWithOneUnderlyingIface() throws Exception { - // WiFi network is connected and VPN is using WiFi (which has TEST_IFACE). - expectDefaultSettings(); - NetworkState[] networkStates = new NetworkState[] {buildWifiState(), buildVpnState()}; - VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(TEST_IFACE)}; - expectNetworkStatsUidDetail(buildEmptyStats()); - expectBandwidthControlCheck(); - - mService.forceUpdateIfaces( - new Network[] {WIFI_NETWORK, VPN_NETWORK}, - vpnInfos, - networkStates, - getActiveIface(networkStates)); - // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption - // overhead per packet): - // 1000 bytes (100 packets) were sent/received by UID_RED over VPN. - // 500 bytes (50 packets) were sent/received by UID_BLUE over VPN. - // VPN sent/received 1650 bytes (150 packets) over WiFi. - // Of 1650 bytes over WiFi, expect 1000 bytes attributed to UID_RED, 500 bytes attributed to - // UID_BLUE, and 150 bytes attributed to UID_VPN for both rx/tx traffic. - incrementCurrentTime(HOUR_IN_MILLIS); - expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3) - .addValues(TUN_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1000L, 100L, 1000L, 100L, 1L) - .addValues(TUN_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 500L, 50L, 500L, 50L, 1L) - .addValues( - TEST_IFACE, UID_VPN, SET_DEFAULT, TAG_NONE, 1650L, 150L, 1650L, 150L, 2L)); - - forcePollAndWaitForIdle(); - - assertUidTotal(sTemplateWifi, UID_RED, 1000L, 100L, 1000L, 100L, 1); - assertUidTotal(sTemplateWifi, UID_BLUE, 500L, 50L, 500L, 50L, 1); - assertUidTotal(sTemplateWifi, UID_VPN, 150L, 0L, 150L, 0L, 2); - } - - @Test - public void vpnWithOneUnderlyingIface_withCompression() throws Exception { - // WiFi network is connected and VPN is using WiFi (which has TEST_IFACE). - expectDefaultSettings(); - NetworkState[] networkStates = new NetworkState[] {buildWifiState(), buildVpnState()}; - VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(TEST_IFACE)}; - expectNetworkStatsUidDetail(buildEmptyStats()); - expectBandwidthControlCheck(); - - mService.forceUpdateIfaces( - new Network[] {WIFI_NETWORK, VPN_NETWORK}, - vpnInfos, - networkStates, - getActiveIface(networkStates)); - // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption - // overhead per packet): - // 1000 bytes (100 packets) were sent/received by UID_RED over VPN. - // 3000 bytes (300 packets) were sent/received by UID_BLUE over VPN. - // VPN sent/received 1000 bytes (100 packets) over WiFi. - // Of 1000 bytes over WiFi, expect 250 bytes attributed UID_RED and 750 bytes to UID_BLUE, - // with nothing attributed to UID_VPN for both rx/tx traffic. - incrementCurrentTime(HOUR_IN_MILLIS); - expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 3) - .addValues(TUN_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1000L, 100L, 1000L, 100L, 1L) - .addValues(TUN_IFACE, UID_BLUE, SET_DEFAULT, TAG_NONE, 3000L, 300L, 3000L, 300L, 1L) - .addValues( - TEST_IFACE, UID_VPN, SET_DEFAULT, TAG_NONE, 1000L, 100L, 1000L, 100L, 0L)); - - forcePollAndWaitForIdle(); - - assertUidTotal(sTemplateWifi, UID_RED, 250L, 25L, 250L, 25L, 0); - assertUidTotal(sTemplateWifi, UID_BLUE, 750L, 75L, 750L, 75L, 0); - assertUidTotal(sTemplateWifi, UID_VPN, 0L, 0L, 0L, 0L, 0); - } - - @Test - public void vpnWithIncorrectUnderlyingIface() throws Exception { - // WiFi and Cell networks are connected and VPN is using Cell (which has TEST_IFACE2), - // but has declared only WiFi (TEST_IFACE) in its underlying network set. - expectDefaultSettings(); - NetworkState[] networkStates = - new NetworkState[] { - buildWifiState(), buildMobile4gState(TEST_IFACE2), buildVpnState() - }; - VpnInfo[] vpnInfos = new VpnInfo[] {createVpnInfo(TEST_IFACE)}; - expectNetworkStatsUidDetail(buildEmptyStats()); - expectBandwidthControlCheck(); - - mService.forceUpdateIfaces( - new Network[] {WIFI_NETWORK, VPN_NETWORK}, - vpnInfos, - networkStates, - getActiveIface(networkStates)); - // create some traffic (assume 10 bytes of MTU for VPN interface and 1 byte encryption - // overhead per packet): - // 1000 bytes (100 packets) were sent/received by UID_RED over VPN. - // VPN sent/received 1100 bytes (100 packets) over Cell. - // Of 1100 bytes over Cell, expect all of it attributed to UID_VPN for both rx/tx traffic. - incrementCurrentTime(HOUR_IN_MILLIS); - expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 2) - .addValues(TUN_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, 1000L, 100L, 1000L, 100L, 1L) - .addValues( - TEST_IFACE2, UID_VPN, SET_DEFAULT, TAG_NONE, 1100L, 100L, 1100L, 100L, 1L)); - - forcePollAndWaitForIdle(); - - assertUidTotal(sTemplateWifi, UID_RED, 0L, 0L, 0L, 0L, 0); - assertUidTotal(sTemplateWifi, UID_VPN, 0L, 0L, 0L, 0L, 0); - assertUidTotal(buildTemplateMobileWildcard(), UID_RED, 0L, 0L, 0L, 0L, 0); - assertUidTotal(buildTemplateMobileWildcard(), UID_VPN, 1100L, 100L, 1100L, 100L, 1); - } - - @Test public void testRegisterUsageCallback() throws Exception { // pretend that wifi network comes online; service should ask about full // network state, and poll any existing interfaces before updating. @@ -1039,7 +918,7 @@ public class NetworkStatsServiceTest { expectNetworkStatsUidDetail(buildEmptyStats()); expectBandwidthControlCheck(); - mService.forceUpdateIfaces(NETWORKS_WIFI, new VpnInfo[0], states, getActiveIface(states)); + mService.forceUpdateIfaces(NETWORKS_WIFI, states, getActiveIface(states)); // verify service has empty history for wifi assertNetworkTotal(sTemplateWifi, 0L, 0L, 0L, 0L, 0); @@ -1264,59 +1143,6 @@ public class NetworkStatsServiceTest { } } - private static void assertValues(NetworkStats stats, String iface, int uid, int set, - int tag, int metered, int roaming, int defaultNetwork, long rxBytes, long rxPackets, - long txBytes, long txPackets, int operations) { - final NetworkStats.Entry entry = new NetworkStats.Entry(); - final int[] sets; - if (set == SET_ALL) { - sets = new int[] { SET_ALL, SET_DEFAULT, SET_FOREGROUND }; - } else { - sets = new int[] { set }; - } - - final int[] roamings; - if (roaming == ROAMING_ALL) { - roamings = new int[] { ROAMING_ALL, ROAMING_YES, ROAMING_NO }; - } else { - roamings = new int[] { roaming }; - } - - final int[] meterings; - if (metered == METERED_ALL) { - meterings = new int[] { METERED_ALL, METERED_YES, METERED_NO }; - } else { - meterings = new int[] { metered }; - } - - final int[] defaultNetworks; - if (defaultNetwork == DEFAULT_NETWORK_ALL) { - defaultNetworks = new int[] { DEFAULT_NETWORK_ALL, DEFAULT_NETWORK_YES, - DEFAULT_NETWORK_NO }; - } else { - defaultNetworks = new int[] { defaultNetwork }; - } - - for (int s : sets) { - for (int r : roamings) { - for (int m : meterings) { - for (int d : defaultNetworks) { - final int i = stats.findIndex(iface, uid, s, tag, m, r, d); - if (i != -1) { - entry.add(stats.getValues(i, null)); - } - } - } - } - } - - assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes); - assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets); - assertEquals("unexpected txBytes", txBytes, entry.txBytes); - assertEquals("unexpected txPackets", txPackets, entry.txPackets); - assertEquals("unexpected operations", operations, entry.operations); - } - private static void assertValues(NetworkStatsHistory stats, long start, long end, long rxBytes, long rxPackets, long txBytes, long txPackets, int operations) { final NetworkStatsHistory.Entry entry = stats.getValues(start, end, null); @@ -1382,14 +1208,6 @@ public class NetworkStatsServiceTest { return new NetworkState(info, prop, new NetworkCapabilities(), VPN_NETWORK, null, null); } - private static VpnInfo createVpnInfo(String underlyingIface) { - VpnInfo info = new VpnInfo(); - info.ownerUid = UID_VPN; - info.vpnIface = TUN_IFACE; - info.primaryUnderlyingIface = underlyingIface; - return info; - } - private long getElapsedRealtime() { return mElapsedRealtime; } diff --git a/tests/net/res/raw/xt_qtaguid_vpn_incorrect_iface b/tests/net/res/raw/xt_qtaguid_vpn_incorrect_iface new file mode 100644 index 000000000000..fc92715253ed --- /dev/null +++ b/tests/net/res/raw/xt_qtaguid_vpn_incorrect_iface @@ -0,0 +1,3 @@ +idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets rx_tcp_bytes rx_tcp_packets rx_udp_bytes rx_udp_packets rx_other_bytes rx_other_packets tx_tcp_bytes tx_tcp_packets tx_udp_bytes tx_udp_packets tx_other_bytes tx_other_packets +2 test_nss_tun0 0x0 1001 0 1000 100 1000 100 0 0 0 0 0 0 0 0 0 0 0 0 +3 test1 0x0 1004 0 1100 100 1100 100 0 0 0 0 0 0 0 0 0 0 0 0
\ No newline at end of file diff --git a/tests/net/res/raw/xt_qtaguid_vpn_one_underlying b/tests/net/res/raw/xt_qtaguid_vpn_one_underlying new file mode 100644 index 000000000000..1ef18894b669 --- /dev/null +++ b/tests/net/res/raw/xt_qtaguid_vpn_one_underlying @@ -0,0 +1,5 @@ +idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets rx_tcp_bytes rx_tcp_packets rx_udp_bytes rx_udp_packets rx_other_bytes rx_other_packets tx_tcp_bytes tx_tcp_packets tx_udp_bytes tx_udp_packets tx_other_bytes tx_other_packets +2 test_nss_tun0 0x0 1001 0 2000 200 1000 100 0 0 0 0 0 0 0 0 0 0 0 0 +3 test_nss_tun0 0x0 1002 0 1000 100 500 50 0 0 0 0 0 0 0 0 0 0 0 0 +4 test0 0x0 1004 0 3300 300 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +5 test0 0x0 1004 1 0 0 1650 150 0 0 0 0 0 0 0 0 0 0 0 0
\ No newline at end of file diff --git a/tests/net/res/raw/xt_qtaguid_vpn_one_underlying_compression b/tests/net/res/raw/xt_qtaguid_vpn_one_underlying_compression new file mode 100644 index 000000000000..6d6bf550bbfa --- /dev/null +++ b/tests/net/res/raw/xt_qtaguid_vpn_one_underlying_compression @@ -0,0 +1,4 @@ +idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets rx_tcp_bytes rx_tcp_packets rx_udp_bytes rx_udp_packets rx_other_bytes rx_other_packets tx_tcp_bytes tx_tcp_packets tx_udp_bytes tx_udp_packets tx_other_bytes tx_other_packets +2 test_nss_tun0 0x0 1001 0 1000 100 1000 100 0 0 0 0 0 0 0 0 0 0 0 0 +3 test_nss_tun0 0x0 1002 0 3000 300 3000 300 0 0 0 0 0 0 0 0 0 0 0 0 +4 test0 0x0 1004 0 1000 100 1000 100 0 0 0 0 0 0 0 0 0 0 0 0
\ No newline at end of file diff --git a/tests/net/res/raw/xt_qtaguid_vpn_one_underlying_own_traffic b/tests/net/res/raw/xt_qtaguid_vpn_one_underlying_own_traffic new file mode 100644 index 000000000000..2c2e5d2555f6 --- /dev/null +++ b/tests/net/res/raw/xt_qtaguid_vpn_one_underlying_own_traffic @@ -0,0 +1,6 @@ +idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets rx_tcp_bytes rx_tcp_packets rx_udp_bytes rx_udp_packets rx_other_bytes rx_other_packets tx_tcp_bytes tx_tcp_packets tx_udp_bytes tx_udp_packets tx_other_bytes tx_other_packets +2 test_nss_tun0 0x0 1001 0 2000 200 1000 100 0 0 0 0 0 0 0 0 0 0 0 0 +3 test_nss_tun0 0x0 1002 0 1000 100 500 50 0 0 0 0 0 0 0 0 0 0 0 0 +4 test_nss_tun0 0x0 1004 0 5000 500 6000 600 0 0 0 0 0 0 0 0 0 0 0 0 +5 test0 0x0 1004 0 8800 800 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +6 test0 0x0 1004 1 0 0 8250 750 0 0 0 0 0 0 0 0 0 0 0 0
\ No newline at end of file diff --git a/tests/net/res/raw/xt_qtaguid_vpn_rewrite_through_self b/tests/net/res/raw/xt_qtaguid_vpn_rewrite_through_self new file mode 100644 index 000000000000..afcdd7199026 --- /dev/null +++ b/tests/net/res/raw/xt_qtaguid_vpn_rewrite_through_self @@ -0,0 +1,6 @@ +idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets rx_tcp_bytes rx_tcp_packets rx_udp_bytes rx_udp_packets rx_other_bytes rx_other_packets tx_tcp_bytes tx_tcp_packets tx_udp_bytes tx_udp_packets tx_other_bytes tx_other_packets +2 test_nss_tun0 0x0 1001 0 2000 200 1000 100 0 0 0 0 0 0 0 0 0 0 0 0 +3 test_nss_tun0 0x0 1002 0 1000 100 500 50 0 0 0 0 0 0 0 0 0 0 0 0 +4 test_nss_tun0 0x0 1004 0 0 0 1600 160 0 0 0 0 0 0 0 0 0 0 0 0 +5 test0 0x0 1004 1 0 0 1760 176 0 0 0 0 0 0 0 0 0 0 0 0 +6 test0 0x0 1004 0 3300 300 0 0 0 0 0 0 0 0 0 0 0 0 0 0
\ No newline at end of file diff --git a/tests/net/res/raw/xt_qtaguid_vpn_two_underlying_duplication b/tests/net/res/raw/xt_qtaguid_vpn_two_underlying_duplication new file mode 100644 index 000000000000..d7c7eb9f4ae8 --- /dev/null +++ b/tests/net/res/raw/xt_qtaguid_vpn_two_underlying_duplication @@ -0,0 +1,5 @@ +idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets rx_tcp_bytes rx_tcp_packets rx_udp_bytes rx_udp_packets rx_other_bytes rx_other_packets tx_tcp_bytes tx_tcp_packets tx_udp_bytes tx_udp_packets tx_other_bytes tx_other_packets +2 test_nss_tun0 0x0 1001 0 1000 100 1000 100 0 0 0 0 0 0 0 0 0 0 0 0 +3 test_nss_tun0 0x0 1002 0 1000 100 1000 100 0 0 0 0 0 0 0 0 0 0 0 0 +4 test0 0x0 1004 0 2200 200 2200 200 0 0 0 0 0 0 0 0 0 0 0 0 +5 test1 0x0 1004 0 2200 200 2200 200 0 0 0 0 0 0 0 0 0 0 0 0
\ No newline at end of file diff --git a/tests/net/res/raw/xt_qtaguid_vpn_two_underlying_split b/tests/net/res/raw/xt_qtaguid_vpn_two_underlying_split new file mode 100644 index 000000000000..38a3dce4a834 --- /dev/null +++ b/tests/net/res/raw/xt_qtaguid_vpn_two_underlying_split @@ -0,0 +1,4 @@ +idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets rx_tcp_bytes rx_tcp_packets rx_udp_bytes rx_udp_packets rx_other_bytes rx_other_packets tx_tcp_bytes tx_tcp_packets tx_udp_bytes tx_udp_packets tx_other_bytes tx_other_packets +2 test_nss_tun0 0x0 1001 0 500 50 1000 100 0 0 0 0 0 0 0 0 0 0 0 0 +3 test0 0x0 1004 0 330 30 660 60 0 0 0 0 0 0 0 0 0 0 0 0 +4 test1 0x0 1004 0 220 20 440 40 0 0 0 0 0 0 0 0 0 0 0 0
\ No newline at end of file diff --git a/tests/net/res/raw/xt_qtaguid_vpn_two_underlying_split_compression b/tests/net/res/raw/xt_qtaguid_vpn_two_underlying_split_compression new file mode 100644 index 000000000000..d35244b3b4f2 --- /dev/null +++ b/tests/net/res/raw/xt_qtaguid_vpn_two_underlying_split_compression @@ -0,0 +1,4 @@ +idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets rx_tcp_bytes rx_tcp_packets rx_udp_bytes rx_udp_packets rx_other_bytes rx_other_packets tx_tcp_bytes tx_tcp_packets tx_udp_bytes tx_udp_packets tx_other_bytes tx_other_packets +2 test_nss_tun0 0x0 1001 0 1000 100 1000 100 0 0 0 0 0 0 0 0 0 0 0 0 +3 test0 0x0 1004 0 600 60 600 60 0 0 0 0 0 0 0 0 0 0 0 0 +4 test1 0x0 1004 0 200 20 200 20 0 0 0 0 0 0 0 0 0 0 0 0
\ No newline at end of file diff --git a/tests/net/res/raw/xt_qtaguid_vpn_with_clat b/tests/net/res/raw/xt_qtaguid_vpn_with_clat new file mode 100644 index 000000000000..0d893d515ca2 --- /dev/null +++ b/tests/net/res/raw/xt_qtaguid_vpn_with_clat @@ -0,0 +1,8 @@ +idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packets rx_tcp_bytes rx_tcp_packets rx_udp_bytes rx_udp_packets rx_other_bytes rx_other_packets tx_tcp_bytes tx_tcp_packets tx_udp_bytes tx_udp_packets tx_other_bytes tx_other_packets +2 test_nss_tun0 0x0 1001 0 2000 200 1000 100 0 0 0 0 0 0 0 0 0 0 0 0 +3 test_nss_tun0 0x0 1002 0 1000 100 500 50 0 0 0 0 0 0 0 0 0 0 0 0 +4 v4-test0 0x0 1004 0 3300 300 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +5 v4-test0 0x0 1004 1 0 0 1650 150 0 0 0 0 0 0 0 0 0 0 0 0 +6 test0 0x0 0 0 9300 300 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +7 test0 0x0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +8 test0 0x0 1029 0 0 0 4650 150 0 0 0 0 0 0 0 0 0 0 0 0
\ No newline at end of file diff --git a/tests/net/res/raw/xt_qtaguid_with_clat_simple b/tests/net/res/raw/xt_qtaguid_with_clat_simple index 8c132e7e0a0e..b37fae6d2a3d 100644 --- a/tests/net/res/raw/xt_qtaguid_with_clat_simple +++ b/tests/net/res/raw/xt_qtaguid_with_clat_simple @@ -2,5 +2,4 @@ idx iface acct_tag_hex uid_tag_int cnt_set rx_bytes rx_packets tx_bytes tx_packe 2 v4-wlan0 0x0 10060 0 42600 213 4100 41 42600 213 0 0 0 0 4100 41 0 0 0 0 3 v4-wlan0 0x0 10060 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 wlan0 0x0 0 0 46860 213 0 0 46860 213 0 0 0 0 0 0 0 0 0 0 -5 wlan0 0x0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -6 wlan0 0x0 1029 0 0 0 4920 41 0 0 0 0 0 0 4920 41 0 0 0 0 +5 wlan0 0x0 1029 0 0 0 4920 41 0 0 0 0 0 0 4920 41 0 0 0 0 diff --git a/tests/permission/src/com/android/framework/permission/tests/VibratorServicePermissionTest.java b/tests/permission/src/com/android/framework/permission/tests/VibratorServicePermissionTest.java index 388c7d03dff2..c50229ae30f4 100644 --- a/tests/permission/src/com/android/framework/permission/tests/VibratorServicePermissionTest.java +++ b/tests/permission/src/com/android/framework/permission/tests/VibratorServicePermissionTest.java @@ -16,9 +16,7 @@ package com.android.framework.permission.tests; -import junit.framework.TestCase; - -import android.media.AudioManager; +import android.media.AudioAttributes; import android.os.Binder; import android.os.IVibratorService; import android.os.Process; @@ -27,6 +25,9 @@ import android.os.ServiceManager; import android.os.VibrationEffect; import android.test.suitebuilder.annotation.SmallTest; +import junit.framework.TestCase; + + /** * Verify that Hardware apis cannot be called without required permissions. */ @@ -51,7 +52,10 @@ public class VibratorServicePermissionTest extends TestCase { try { final VibrationEffect effect = VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE); - mVibratorService.vibrate(Process.myUid(), null, effect, AudioManager.STREAM_ALARM, + final AudioAttributes attrs = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_ALARM) + .build(); + mVibratorService.vibrate(Process.myUid(), null, effect, attrs, "testVibrate", new Binder()); fail("vibrate did not throw SecurityException as expected"); } catch (SecurityException e) { diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 4115663b8bb8..f540492266c5 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -671,6 +671,14 @@ public class WifiManager { public static final int IFACE_IP_MODE_LOCAL_ONLY = 2; /** + * Broadcast intent action indicating that the wifi network settings + * had been reset. + * @hide + */ + public static final String WIFI_NETWORK_SETTINGS_RESET_ACTION = + "android.net.wifi.action.NETWORK_SETTINGS_RESET"; + + /** * Broadcast intent action indicating that a connection to the supplicant has * been established (and it is now possible * to perform Wi-Fi operations) or the connection to the supplicant has been |